design-zystem 1.0.327 → 1.0.329
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/index.d.mts +2 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.js +5 -2
- package/dist/index.mjs +5 -2
- package/dist/ui/index.d.mts +27 -5
- package/dist/ui/index.d.ts +27 -5
- package/dist/ui/index.js +228 -30
- package/dist/ui/index.mjs +237 -37
- package/dist/ui/style.css +1 -1
- package/package.json +1 -1
package/dist/index.d.mts
CHANGED
|
@@ -1059,8 +1059,9 @@ interface TooltipProps {
|
|
|
1059
1059
|
width?: string;
|
|
1060
1060
|
height?: string;
|
|
1061
1061
|
direction?: 'top' | 'bottom' | 'left' | 'right';
|
|
1062
|
+
fullWidth?: boolean;
|
|
1062
1063
|
}
|
|
1063
|
-
declare const Tooltip: ({ backgroundColor, data, width, height, direction, children, }: TooltipProps) => react.JSX.Element;
|
|
1064
|
+
declare const Tooltip: ({ backgroundColor, data, width, height, direction, fullWidth, children, }: TooltipProps) => react.JSX.Element;
|
|
1064
1065
|
|
|
1065
1066
|
interface PaginationProps {
|
|
1066
1067
|
currentPage: number;
|
package/dist/index.d.ts
CHANGED
|
@@ -1059,8 +1059,9 @@ interface TooltipProps {
|
|
|
1059
1059
|
width?: string;
|
|
1060
1060
|
height?: string;
|
|
1061
1061
|
direction?: 'top' | 'bottom' | 'left' | 'right';
|
|
1062
|
+
fullWidth?: boolean;
|
|
1062
1063
|
}
|
|
1063
|
-
declare const Tooltip: ({ backgroundColor, data, width, height, direction, children, }: TooltipProps) => react.JSX.Element;
|
|
1064
|
+
declare const Tooltip: ({ backgroundColor, data, width, height, direction, fullWidth, children, }: TooltipProps) => react.JSX.Element;
|
|
1064
1065
|
|
|
1065
1066
|
interface PaginationProps {
|
|
1066
1067
|
currentPage: number;
|
package/dist/index.js
CHANGED
|
@@ -1387,7 +1387,8 @@ var import_styled_components12 = __toESM(require("styled-components"));
|
|
|
1387
1387
|
var import_jsx_runtime15 = require("react/jsx-runtime");
|
|
1388
1388
|
var StyledTooltipWrapper = import_styled_components12.default.div`
|
|
1389
1389
|
position: relative;
|
|
1390
|
-
display: inline-block;
|
|
1390
|
+
display: ${(props) => props.$fullWidth ? "block" : "inline-block"};
|
|
1391
|
+
width: ${(props) => props.$fullWidth ? "100%" : "auto"};
|
|
1391
1392
|
cursor: pointer;
|
|
1392
1393
|
`;
|
|
1393
1394
|
var StyledTooltipContent = import_styled_components12.default.div`
|
|
@@ -1484,6 +1485,7 @@ var Tooltip = ({
|
|
|
1484
1485
|
width,
|
|
1485
1486
|
height,
|
|
1486
1487
|
direction = "top",
|
|
1488
|
+
fullWidth = false,
|
|
1487
1489
|
children
|
|
1488
1490
|
}) => {
|
|
1489
1491
|
const [isVisible, setIsVisible] = (0, import_react6.useState)(false);
|
|
@@ -1492,6 +1494,7 @@ var Tooltip = ({
|
|
|
1492
1494
|
return /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(
|
|
1493
1495
|
StyledTooltipWrapper,
|
|
1494
1496
|
{
|
|
1497
|
+
$fullWidth: fullWidth,
|
|
1495
1498
|
onMouseEnter: handleMouseEnter,
|
|
1496
1499
|
onMouseLeave: handleMouseLeave,
|
|
1497
1500
|
children: [
|
|
@@ -1739,7 +1742,7 @@ var NewModal = ({
|
|
|
1739
1742
|
children: leftButtonLabel
|
|
1740
1743
|
}
|
|
1741
1744
|
) }),
|
|
1742
|
-
rightButtonLabel && /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(Row, { flex: "1", children: confirmDisabled && rightButtonDisabledTooltip ? /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(Tooltip, { data: [rightButtonDisabledTooltip], children: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
|
|
1745
|
+
rightButtonLabel && /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(Row, { flex: "1", children: confirmDisabled && rightButtonDisabledTooltip ? /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(Tooltip, { data: [rightButtonDisabledTooltip], fullWidth: true, children: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
|
|
1743
1746
|
Button,
|
|
1744
1747
|
{
|
|
1745
1748
|
outline: isOutline,
|
package/dist/index.mjs
CHANGED
|
@@ -1244,7 +1244,8 @@ import styled12 from "styled-components";
|
|
|
1244
1244
|
import { jsx as jsx15, jsxs as jsxs5 } from "react/jsx-runtime";
|
|
1245
1245
|
var StyledTooltipWrapper = styled12.div`
|
|
1246
1246
|
position: relative;
|
|
1247
|
-
display: inline-block;
|
|
1247
|
+
display: ${(props) => props.$fullWidth ? "block" : "inline-block"};
|
|
1248
|
+
width: ${(props) => props.$fullWidth ? "100%" : "auto"};
|
|
1248
1249
|
cursor: pointer;
|
|
1249
1250
|
`;
|
|
1250
1251
|
var StyledTooltipContent = styled12.div`
|
|
@@ -1341,6 +1342,7 @@ var Tooltip = ({
|
|
|
1341
1342
|
width,
|
|
1342
1343
|
height,
|
|
1343
1344
|
direction = "top",
|
|
1345
|
+
fullWidth = false,
|
|
1344
1346
|
children
|
|
1345
1347
|
}) => {
|
|
1346
1348
|
const [isVisible, setIsVisible] = useState2(false);
|
|
@@ -1349,6 +1351,7 @@ var Tooltip = ({
|
|
|
1349
1351
|
return /* @__PURE__ */ jsxs5(
|
|
1350
1352
|
StyledTooltipWrapper,
|
|
1351
1353
|
{
|
|
1354
|
+
$fullWidth: fullWidth,
|
|
1352
1355
|
onMouseEnter: handleMouseEnter,
|
|
1353
1356
|
onMouseLeave: handleMouseLeave,
|
|
1354
1357
|
children: [
|
|
@@ -1596,7 +1599,7 @@ var NewModal = ({
|
|
|
1596
1599
|
children: leftButtonLabel
|
|
1597
1600
|
}
|
|
1598
1601
|
) }),
|
|
1599
|
-
rightButtonLabel && /* @__PURE__ */ jsx16(Row, { flex: "1", children: confirmDisabled && rightButtonDisabledTooltip ? /* @__PURE__ */ jsx16(Tooltip, { data: [rightButtonDisabledTooltip], children: /* @__PURE__ */ jsx16(
|
|
1602
|
+
rightButtonLabel && /* @__PURE__ */ jsx16(Row, { flex: "1", children: confirmDisabled && rightButtonDisabledTooltip ? /* @__PURE__ */ jsx16(Tooltip, { data: [rightButtonDisabledTooltip], fullWidth: true, children: /* @__PURE__ */ jsx16(
|
|
1600
1603
|
Button,
|
|
1601
1604
|
{
|
|
1602
1605
|
outline: isOutline,
|
package/dist/ui/index.d.mts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as react from 'react';
|
|
2
|
-
import { HTMLAttributes, AnchorHTMLAttributes, ElementType, ImgHTMLAttributes, ReactNode, ButtonHTMLAttributes, InputHTMLAttributes, TextareaHTMLAttributes, MouseEvent, ComponentPropsWithoutRef, Ref } from 'react';
|
|
2
|
+
import { HTMLAttributes, AnchorHTMLAttributes, ElementType, ImgHTMLAttributes, ReactNode, ButtonHTMLAttributes, InputHTMLAttributes, TextareaHTMLAttributes, MouseEvent, ComponentPropsWithoutRef, Ref, RefObject } from 'react';
|
|
3
3
|
import * as class_variance_authority_types from 'class-variance-authority/types';
|
|
4
4
|
import { VariantProps } from 'class-variance-authority';
|
|
5
5
|
import * as RadixLabel from '@radix-ui/react-label';
|
|
@@ -812,6 +812,17 @@ interface FloatingAction {
|
|
|
812
812
|
badge?: number;
|
|
813
813
|
onClick: () => void;
|
|
814
814
|
}
|
|
815
|
+
/**
|
|
816
|
+
* Marges à retrancher des bords de la fenêtre pour décider du sens de l'arc :
|
|
817
|
+
* une barre latérale ou un bandeau fixe recouvre le bouton sans réduire le
|
|
818
|
+
* viewport. Les valeurs sont en pixels, absentes = 0.
|
|
819
|
+
*/
|
|
820
|
+
interface FloatingSafeArea {
|
|
821
|
+
top?: number;
|
|
822
|
+
right?: number;
|
|
823
|
+
bottom?: number;
|
|
824
|
+
left?: number;
|
|
825
|
+
}
|
|
815
826
|
interface FloatingButtonProps {
|
|
816
827
|
isOpen: boolean;
|
|
817
828
|
onToggle: () => void;
|
|
@@ -824,8 +835,10 @@ interface FloatingButtonProps {
|
|
|
824
835
|
draggable?: boolean;
|
|
825
836
|
/** Sauvegarde la position glissée dans localStorage sous cette clé et la restaure au montage — sans clé, la position ne survit pas à un refresh/changement de page. */
|
|
826
837
|
persistKey?: string;
|
|
838
|
+
/** Zones des bords déjà occupées par des éléments fixes (barre latérale…), dont l'arc doit se tenir à l'écart. */
|
|
839
|
+
safeArea?: FloatingSafeArea;
|
|
827
840
|
}
|
|
828
|
-
declare const FloatingButton: ({ isOpen, onToggle, actions, mainBadge, icon, label, color, draggable, persistKey, }: FloatingButtonProps) => react.JSX.Element;
|
|
841
|
+
declare const FloatingButton: ({ isOpen, onToggle, actions, mainBadge, icon, label, color, draggable, persistKey, safeArea, }: FloatingButtonProps) => react.JSX.Element;
|
|
829
842
|
|
|
830
843
|
interface MetricCardProps {
|
|
831
844
|
/** Nom de l'icône FontAwesome, sans le préfixe `fa-` (ex. "truck"). */
|
|
@@ -1128,7 +1141,9 @@ interface MessageDateSeparatorProps {
|
|
|
1128
1141
|
}
|
|
1129
1142
|
/** Ligne de séparation légendée entre deux blocs de messages : changement de journée, ou reprise des non-lus. */
|
|
1130
1143
|
declare const MessageDateSeparator: ({ label, tone, className, }: MessageDateSeparatorProps) => react.JSX.Element;
|
|
1131
|
-
|
|
1144
|
+
/** Retraits du contenu — mêmes noms et même échelle que `Layout`. */
|
|
1145
|
+
type MessageScrollerPadding = Pick<LayoutProps, 'padding' | 'paddingX' | 'paddingY' | 'paddingTop' | 'paddingRight' | 'paddingBottom' | 'paddingLeft'>;
|
|
1146
|
+
interface MessageScrollerProps extends MessageScrollerPadding {
|
|
1132
1147
|
/** Les `Message` (et les `MessageDateSeparator` intercalés) à afficher. */
|
|
1133
1148
|
children?: ReactNode;
|
|
1134
1149
|
/**
|
|
@@ -1155,10 +1170,17 @@ interface MessageScrollerProps {
|
|
|
1155
1170
|
* l'id du dernier. Sans valeur, seul le montage descend en bas.
|
|
1156
1171
|
*/
|
|
1157
1172
|
scrollKey?: string | number;
|
|
1173
|
+
/**
|
|
1174
|
+
* Ref sur le noeud qui scrolle réellement, pour les fils que `autoScroll` ne
|
|
1175
|
+
* suffit pas à piloter : liste paginée dont il faut garder la position quand
|
|
1176
|
+
* on préfixe des messages plus anciens, bouton « revenir au dernier
|
|
1177
|
+
* message », chargement déclenché par la proximité du haut.
|
|
1178
|
+
*/
|
|
1179
|
+
viewportRef?: RefObject<HTMLDivElement>;
|
|
1158
1180
|
className?: string;
|
|
1159
1181
|
}
|
|
1160
1182
|
/** Zone scrollable d'une liste de messages : hauteur fixe, espacement, slots haut/bas, états vide/chargement, et scroll automatique en bas à l'arrivée d'un message. */
|
|
1161
|
-
declare const MessageScroller: ({ children, height, gap, header, footer, emptyState, isEmpty, loadingState, isLoading, autoScroll, scrollKey, className, }: MessageScrollerProps) => react.JSX.Element;
|
|
1183
|
+
declare const MessageScroller: ({ children, height, gap, padding, paddingX, paddingY, paddingTop, paddingRight, paddingBottom, paddingLeft, header, footer, emptyState, isEmpty, loadingState, isLoading, autoScroll, scrollKey, viewportRef, className, }: MessageScrollerProps) => react.JSX.Element;
|
|
1162
1184
|
|
|
1163
1185
|
interface StepperProps {
|
|
1164
1186
|
numberOfSteps: number;
|
|
@@ -1402,4 +1424,4 @@ declare const allowAutofill: (autoComplete: string) => {
|
|
|
1402
1424
|
"data-form-type": undefined;
|
|
1403
1425
|
};
|
|
1404
1426
|
|
|
1405
|
-
export { Attachment, type AttachmentProps, type AttachmentStatus, Avatar, AvatarBadge, type AvatarBadgeConfig, type AvatarBadgeProps, AvatarFallback, type AvatarFallbackProps, AvatarGroup, type AvatarGroupProps, AvatarImage, type AvatarImageProps, type AvatarProps, Badge, type BadgeProps, Banner, type BannerAction, type BannerProps, type BannerToggle, Box, type BoxProps, Bulk, type BulkProps, type BulkSection, Button, type ButtonColor, type ButtonProps, COLOR_TOKENS, Checkbox, type CheckboxProps, Collapsible, CollapsibleContent, CollapsibleTrigger, type ColorKey, ColorPicker, type ColorPickerProps, type ColorToken, DatePicker, type DatePickerMode, type DatePickerProps, type DatePreset, Divider, type DividerProps, Drawer, DrawerBody, DrawerClose, DrawerDescription, type DrawerDirection, DrawerFooter, DrawerHeader, type DrawerProps, DrawerTitle, EmailInput, type EmailInputProps, EmptyState, type EmptyStateProps, FilePicker, type FilePickerProps, FileUploadZone, type FileUploadZoneProps, type FloatingAction, FloatingButton, type FloatingButtonProps, Gantt, type GanttBand, type GanttBar, type GanttDay, GanttDot, type GanttProps, type GanttRow, GanttSwatch, Icon, IconBadge, type IconBadgeProps, type IconColor, type IconFamily, type IconProps, type IconSize, type IconTabItem, IconTabs, type IconTabsProps, IconTooltip, type IconTooltipProps, Image, type ImageProps, Input, InputGroup, InputGroupAddon, type InputGroupAddonProps, InputGroupButton, type InputGroupButtonProps, type InputGroupProps, type InputProps, Item, ItemActions, ItemContent, ItemDescription, ItemMedia, type ItemMediaProps, type ItemProps, ItemTitle, Label, type LabelProps, Layout, type LayoutProps, Link, type LinkProps, Message, MessageDateSeparator, type MessageDateSeparatorProps, type MessageProps, MessageScroller, type MessageScrollerProps, type MessageSeparatorTone, type MessageTone, type MessageVariant, MetricCard, type MetricCardProps, Modal, ModalBody, ModalClose, ModalDescription, ModalFooter, ModalHeader, type ModalProps, ModalTitle, type MultiSelectProps, type OptimizeImageOptions, type OptimizeImageResult, PageContainer, type PageContainerProps, Pagination, type PaginationProps, PasswordInput, type PasswordInputProps, PdfPreview, type PdfPreviewProps, PhoneInput, type PhoneInputMeta, type PhoneInputProps, Popover, type PopoverMenuItem, type PopoverProps, ProgressBar, type ProgressBarProps, Radio, type RadioOption, type RadioProps, ScrollArea, type ScrollAreaProps, SearchInput, type SearchInputProps, Select, type SelectOption, type SelectProps, type SingleSelectProps, Skeleton, type SkeletonProps, Spinner, type SpinnerProps, type SpinnerSize, Stepper, type StepperProps, Switch, type SwitchProps, type TabItem, Table, TableCell, type TableCellProps, type TableEmptyState, TableFooter, TableFooterCell, type TableFooterCellProps, type TableFooterProps, TableFooterRow, type TableFooterRowProps, TableHeader, TableHeaderCell, type TableHeaderCellProps, type TableHeaderProps, TableHeaderRow, type TableHeaderRowProps, type TablePagination, type TableProps, TableRow, type TableRowProps, Tabs, type TabsProps, type TabsVariant, TagBubble, type TagBubbleProps, type TagOption, TagSelect, type TagSelectProps, Text, type TextProps, Textarea, type TextareaProps, Timeline, type TimelineItem, type TimelineProps, type ToastOptions, type ToastType, Toaster, Tooltip, type TooltipProps, addBusinessDays, allowAutofill, appendCacheBuster, appendQueryParam, buttonVariants, capitalizeFirstLetter, colors, easterDate, formatAddress, formatCityFromFormattedAddress, formatCityWithPostalCode, formatDate, formatDateWithTime, formatDistance, formatDuration, formatEuro, formatKM, formatLocality, formatName, formatNameWithInitial, formatPhoneNumber, formatPlate, formatPlateWithoutDashes, formatPostalCodeFromFormattedAddress, formatRegionCode, formatTime, formatVin, generateHexColor, getAvatarColor, getCleanFileName, getFileIconByMimeType, getFileKind, getFileNameFromUrl, getInitials, getMimeCategory, getRelativeTime, isHoliday, isSameDay, isolateCity, noAutofillProps, optimizeImage, parseAmount, parseIsoDate, toast, truncateFileName, truncateText, useAvatarSize };
|
|
1427
|
+
export { Attachment, type AttachmentProps, type AttachmentStatus, Avatar, AvatarBadge, type AvatarBadgeConfig, type AvatarBadgeProps, AvatarFallback, type AvatarFallbackProps, AvatarGroup, type AvatarGroupProps, AvatarImage, type AvatarImageProps, type AvatarProps, Badge, type BadgeProps, Banner, type BannerAction, type BannerProps, type BannerToggle, Box, type BoxProps, Bulk, type BulkProps, type BulkSection, Button, type ButtonColor, type ButtonProps, COLOR_TOKENS, Checkbox, type CheckboxProps, Collapsible, CollapsibleContent, CollapsibleTrigger, type ColorKey, ColorPicker, type ColorPickerProps, type ColorToken, DatePicker, type DatePickerMode, type DatePickerProps, type DatePreset, Divider, type DividerProps, Drawer, DrawerBody, DrawerClose, DrawerDescription, type DrawerDirection, DrawerFooter, DrawerHeader, type DrawerProps, DrawerTitle, EmailInput, type EmailInputProps, EmptyState, type EmptyStateProps, FilePicker, type FilePickerProps, FileUploadZone, type FileUploadZoneProps, type FloatingAction, FloatingButton, type FloatingButtonProps, type FloatingSafeArea, Gantt, type GanttBand, type GanttBar, type GanttDay, GanttDot, type GanttProps, type GanttRow, GanttSwatch, Icon, IconBadge, type IconBadgeProps, type IconColor, type IconFamily, type IconProps, type IconSize, type IconTabItem, IconTabs, type IconTabsProps, IconTooltip, type IconTooltipProps, Image, type ImageProps, Input, InputGroup, InputGroupAddon, type InputGroupAddonProps, InputGroupButton, type InputGroupButtonProps, type InputGroupProps, type InputProps, Item, ItemActions, ItemContent, ItemDescription, ItemMedia, type ItemMediaProps, type ItemProps, ItemTitle, Label, type LabelProps, Layout, type LayoutProps, Link, type LinkProps, Message, MessageDateSeparator, type MessageDateSeparatorProps, type MessageProps, MessageScroller, type MessageScrollerProps, type MessageSeparatorTone, type MessageTone, type MessageVariant, MetricCard, type MetricCardProps, Modal, ModalBody, ModalClose, ModalDescription, ModalFooter, ModalHeader, type ModalProps, ModalTitle, type MultiSelectProps, type OptimizeImageOptions, type OptimizeImageResult, PageContainer, type PageContainerProps, Pagination, type PaginationProps, PasswordInput, type PasswordInputProps, PdfPreview, type PdfPreviewProps, PhoneInput, type PhoneInputMeta, type PhoneInputProps, Popover, type PopoverMenuItem, type PopoverProps, ProgressBar, type ProgressBarProps, Radio, type RadioOption, type RadioProps, ScrollArea, type ScrollAreaProps, SearchInput, type SearchInputProps, Select, type SelectOption, type SelectProps, type SingleSelectProps, Skeleton, type SkeletonProps, Spinner, type SpinnerProps, type SpinnerSize, Stepper, type StepperProps, Switch, type SwitchProps, type TabItem, Table, TableCell, type TableCellProps, type TableEmptyState, TableFooter, TableFooterCell, type TableFooterCellProps, type TableFooterProps, TableFooterRow, type TableFooterRowProps, TableHeader, TableHeaderCell, type TableHeaderCellProps, type TableHeaderProps, TableHeaderRow, type TableHeaderRowProps, type TablePagination, type TableProps, TableRow, type TableRowProps, Tabs, type TabsProps, type TabsVariant, TagBubble, type TagBubbleProps, type TagOption, TagSelect, type TagSelectProps, Text, type TextProps, Textarea, type TextareaProps, Timeline, type TimelineItem, type TimelineProps, type ToastOptions, type ToastType, Toaster, Tooltip, type TooltipProps, addBusinessDays, allowAutofill, appendCacheBuster, appendQueryParam, buttonVariants, capitalizeFirstLetter, colors, easterDate, formatAddress, formatCityFromFormattedAddress, formatCityWithPostalCode, formatDate, formatDateWithTime, formatDistance, formatDuration, formatEuro, formatKM, formatLocality, formatName, formatNameWithInitial, formatPhoneNumber, formatPlate, formatPlateWithoutDashes, formatPostalCodeFromFormattedAddress, formatRegionCode, formatTime, formatVin, generateHexColor, getAvatarColor, getCleanFileName, getFileIconByMimeType, getFileKind, getFileNameFromUrl, getInitials, getMimeCategory, getRelativeTime, isHoliday, isSameDay, isolateCity, noAutofillProps, optimizeImage, parseAmount, parseIsoDate, toast, truncateFileName, truncateText, useAvatarSize };
|
package/dist/ui/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as react from 'react';
|
|
2
|
-
import { HTMLAttributes, AnchorHTMLAttributes, ElementType, ImgHTMLAttributes, ReactNode, ButtonHTMLAttributes, InputHTMLAttributes, TextareaHTMLAttributes, MouseEvent, ComponentPropsWithoutRef, Ref } from 'react';
|
|
2
|
+
import { HTMLAttributes, AnchorHTMLAttributes, ElementType, ImgHTMLAttributes, ReactNode, ButtonHTMLAttributes, InputHTMLAttributes, TextareaHTMLAttributes, MouseEvent, ComponentPropsWithoutRef, Ref, RefObject } from 'react';
|
|
3
3
|
import * as class_variance_authority_types from 'class-variance-authority/types';
|
|
4
4
|
import { VariantProps } from 'class-variance-authority';
|
|
5
5
|
import * as RadixLabel from '@radix-ui/react-label';
|
|
@@ -812,6 +812,17 @@ interface FloatingAction {
|
|
|
812
812
|
badge?: number;
|
|
813
813
|
onClick: () => void;
|
|
814
814
|
}
|
|
815
|
+
/**
|
|
816
|
+
* Marges à retrancher des bords de la fenêtre pour décider du sens de l'arc :
|
|
817
|
+
* une barre latérale ou un bandeau fixe recouvre le bouton sans réduire le
|
|
818
|
+
* viewport. Les valeurs sont en pixels, absentes = 0.
|
|
819
|
+
*/
|
|
820
|
+
interface FloatingSafeArea {
|
|
821
|
+
top?: number;
|
|
822
|
+
right?: number;
|
|
823
|
+
bottom?: number;
|
|
824
|
+
left?: number;
|
|
825
|
+
}
|
|
815
826
|
interface FloatingButtonProps {
|
|
816
827
|
isOpen: boolean;
|
|
817
828
|
onToggle: () => void;
|
|
@@ -824,8 +835,10 @@ interface FloatingButtonProps {
|
|
|
824
835
|
draggable?: boolean;
|
|
825
836
|
/** Sauvegarde la position glissée dans localStorage sous cette clé et la restaure au montage — sans clé, la position ne survit pas à un refresh/changement de page. */
|
|
826
837
|
persistKey?: string;
|
|
838
|
+
/** Zones des bords déjà occupées par des éléments fixes (barre latérale…), dont l'arc doit se tenir à l'écart. */
|
|
839
|
+
safeArea?: FloatingSafeArea;
|
|
827
840
|
}
|
|
828
|
-
declare const FloatingButton: ({ isOpen, onToggle, actions, mainBadge, icon, label, color, draggable, persistKey, }: FloatingButtonProps) => react.JSX.Element;
|
|
841
|
+
declare const FloatingButton: ({ isOpen, onToggle, actions, mainBadge, icon, label, color, draggable, persistKey, safeArea, }: FloatingButtonProps) => react.JSX.Element;
|
|
829
842
|
|
|
830
843
|
interface MetricCardProps {
|
|
831
844
|
/** Nom de l'icône FontAwesome, sans le préfixe `fa-` (ex. "truck"). */
|
|
@@ -1128,7 +1141,9 @@ interface MessageDateSeparatorProps {
|
|
|
1128
1141
|
}
|
|
1129
1142
|
/** Ligne de séparation légendée entre deux blocs de messages : changement de journée, ou reprise des non-lus. */
|
|
1130
1143
|
declare const MessageDateSeparator: ({ label, tone, className, }: MessageDateSeparatorProps) => react.JSX.Element;
|
|
1131
|
-
|
|
1144
|
+
/** Retraits du contenu — mêmes noms et même échelle que `Layout`. */
|
|
1145
|
+
type MessageScrollerPadding = Pick<LayoutProps, 'padding' | 'paddingX' | 'paddingY' | 'paddingTop' | 'paddingRight' | 'paddingBottom' | 'paddingLeft'>;
|
|
1146
|
+
interface MessageScrollerProps extends MessageScrollerPadding {
|
|
1132
1147
|
/** Les `Message` (et les `MessageDateSeparator` intercalés) à afficher. */
|
|
1133
1148
|
children?: ReactNode;
|
|
1134
1149
|
/**
|
|
@@ -1155,10 +1170,17 @@ interface MessageScrollerProps {
|
|
|
1155
1170
|
* l'id du dernier. Sans valeur, seul le montage descend en bas.
|
|
1156
1171
|
*/
|
|
1157
1172
|
scrollKey?: string | number;
|
|
1173
|
+
/**
|
|
1174
|
+
* Ref sur le noeud qui scrolle réellement, pour les fils que `autoScroll` ne
|
|
1175
|
+
* suffit pas à piloter : liste paginée dont il faut garder la position quand
|
|
1176
|
+
* on préfixe des messages plus anciens, bouton « revenir au dernier
|
|
1177
|
+
* message », chargement déclenché par la proximité du haut.
|
|
1178
|
+
*/
|
|
1179
|
+
viewportRef?: RefObject<HTMLDivElement>;
|
|
1158
1180
|
className?: string;
|
|
1159
1181
|
}
|
|
1160
1182
|
/** Zone scrollable d'une liste de messages : hauteur fixe, espacement, slots haut/bas, états vide/chargement, et scroll automatique en bas à l'arrivée d'un message. */
|
|
1161
|
-
declare const MessageScroller: ({ children, height, gap, header, footer, emptyState, isEmpty, loadingState, isLoading, autoScroll, scrollKey, className, }: MessageScrollerProps) => react.JSX.Element;
|
|
1183
|
+
declare const MessageScroller: ({ children, height, gap, padding, paddingX, paddingY, paddingTop, paddingRight, paddingBottom, paddingLeft, header, footer, emptyState, isEmpty, loadingState, isLoading, autoScroll, scrollKey, viewportRef, className, }: MessageScrollerProps) => react.JSX.Element;
|
|
1162
1184
|
|
|
1163
1185
|
interface StepperProps {
|
|
1164
1186
|
numberOfSteps: number;
|
|
@@ -1402,4 +1424,4 @@ declare const allowAutofill: (autoComplete: string) => {
|
|
|
1402
1424
|
"data-form-type": undefined;
|
|
1403
1425
|
};
|
|
1404
1426
|
|
|
1405
|
-
export { Attachment, type AttachmentProps, type AttachmentStatus, Avatar, AvatarBadge, type AvatarBadgeConfig, type AvatarBadgeProps, AvatarFallback, type AvatarFallbackProps, AvatarGroup, type AvatarGroupProps, AvatarImage, type AvatarImageProps, type AvatarProps, Badge, type BadgeProps, Banner, type BannerAction, type BannerProps, type BannerToggle, Box, type BoxProps, Bulk, type BulkProps, type BulkSection, Button, type ButtonColor, type ButtonProps, COLOR_TOKENS, Checkbox, type CheckboxProps, Collapsible, CollapsibleContent, CollapsibleTrigger, type ColorKey, ColorPicker, type ColorPickerProps, type ColorToken, DatePicker, type DatePickerMode, type DatePickerProps, type DatePreset, Divider, type DividerProps, Drawer, DrawerBody, DrawerClose, DrawerDescription, type DrawerDirection, DrawerFooter, DrawerHeader, type DrawerProps, DrawerTitle, EmailInput, type EmailInputProps, EmptyState, type EmptyStateProps, FilePicker, type FilePickerProps, FileUploadZone, type FileUploadZoneProps, type FloatingAction, FloatingButton, type FloatingButtonProps, Gantt, type GanttBand, type GanttBar, type GanttDay, GanttDot, type GanttProps, type GanttRow, GanttSwatch, Icon, IconBadge, type IconBadgeProps, type IconColor, type IconFamily, type IconProps, type IconSize, type IconTabItem, IconTabs, type IconTabsProps, IconTooltip, type IconTooltipProps, Image, type ImageProps, Input, InputGroup, InputGroupAddon, type InputGroupAddonProps, InputGroupButton, type InputGroupButtonProps, type InputGroupProps, type InputProps, Item, ItemActions, ItemContent, ItemDescription, ItemMedia, type ItemMediaProps, type ItemProps, ItemTitle, Label, type LabelProps, Layout, type LayoutProps, Link, type LinkProps, Message, MessageDateSeparator, type MessageDateSeparatorProps, type MessageProps, MessageScroller, type MessageScrollerProps, type MessageSeparatorTone, type MessageTone, type MessageVariant, MetricCard, type MetricCardProps, Modal, ModalBody, ModalClose, ModalDescription, ModalFooter, ModalHeader, type ModalProps, ModalTitle, type MultiSelectProps, type OptimizeImageOptions, type OptimizeImageResult, PageContainer, type PageContainerProps, Pagination, type PaginationProps, PasswordInput, type PasswordInputProps, PdfPreview, type PdfPreviewProps, PhoneInput, type PhoneInputMeta, type PhoneInputProps, Popover, type PopoverMenuItem, type PopoverProps, ProgressBar, type ProgressBarProps, Radio, type RadioOption, type RadioProps, ScrollArea, type ScrollAreaProps, SearchInput, type SearchInputProps, Select, type SelectOption, type SelectProps, type SingleSelectProps, Skeleton, type SkeletonProps, Spinner, type SpinnerProps, type SpinnerSize, Stepper, type StepperProps, Switch, type SwitchProps, type TabItem, Table, TableCell, type TableCellProps, type TableEmptyState, TableFooter, TableFooterCell, type TableFooterCellProps, type TableFooterProps, TableFooterRow, type TableFooterRowProps, TableHeader, TableHeaderCell, type TableHeaderCellProps, type TableHeaderProps, TableHeaderRow, type TableHeaderRowProps, type TablePagination, type TableProps, TableRow, type TableRowProps, Tabs, type TabsProps, type TabsVariant, TagBubble, type TagBubbleProps, type TagOption, TagSelect, type TagSelectProps, Text, type TextProps, Textarea, type TextareaProps, Timeline, type TimelineItem, type TimelineProps, type ToastOptions, type ToastType, Toaster, Tooltip, type TooltipProps, addBusinessDays, allowAutofill, appendCacheBuster, appendQueryParam, buttonVariants, capitalizeFirstLetter, colors, easterDate, formatAddress, formatCityFromFormattedAddress, formatCityWithPostalCode, formatDate, formatDateWithTime, formatDistance, formatDuration, formatEuro, formatKM, formatLocality, formatName, formatNameWithInitial, formatPhoneNumber, formatPlate, formatPlateWithoutDashes, formatPostalCodeFromFormattedAddress, formatRegionCode, formatTime, formatVin, generateHexColor, getAvatarColor, getCleanFileName, getFileIconByMimeType, getFileKind, getFileNameFromUrl, getInitials, getMimeCategory, getRelativeTime, isHoliday, isSameDay, isolateCity, noAutofillProps, optimizeImage, parseAmount, parseIsoDate, toast, truncateFileName, truncateText, useAvatarSize };
|
|
1427
|
+
export { Attachment, type AttachmentProps, type AttachmentStatus, Avatar, AvatarBadge, type AvatarBadgeConfig, type AvatarBadgeProps, AvatarFallback, type AvatarFallbackProps, AvatarGroup, type AvatarGroupProps, AvatarImage, type AvatarImageProps, type AvatarProps, Badge, type BadgeProps, Banner, type BannerAction, type BannerProps, type BannerToggle, Box, type BoxProps, Bulk, type BulkProps, type BulkSection, Button, type ButtonColor, type ButtonProps, COLOR_TOKENS, Checkbox, type CheckboxProps, Collapsible, CollapsibleContent, CollapsibleTrigger, type ColorKey, ColorPicker, type ColorPickerProps, type ColorToken, DatePicker, type DatePickerMode, type DatePickerProps, type DatePreset, Divider, type DividerProps, Drawer, DrawerBody, DrawerClose, DrawerDescription, type DrawerDirection, DrawerFooter, DrawerHeader, type DrawerProps, DrawerTitle, EmailInput, type EmailInputProps, EmptyState, type EmptyStateProps, FilePicker, type FilePickerProps, FileUploadZone, type FileUploadZoneProps, type FloatingAction, FloatingButton, type FloatingButtonProps, type FloatingSafeArea, Gantt, type GanttBand, type GanttBar, type GanttDay, GanttDot, type GanttProps, type GanttRow, GanttSwatch, Icon, IconBadge, type IconBadgeProps, type IconColor, type IconFamily, type IconProps, type IconSize, type IconTabItem, IconTabs, type IconTabsProps, IconTooltip, type IconTooltipProps, Image, type ImageProps, Input, InputGroup, InputGroupAddon, type InputGroupAddonProps, InputGroupButton, type InputGroupButtonProps, type InputGroupProps, type InputProps, Item, ItemActions, ItemContent, ItemDescription, ItemMedia, type ItemMediaProps, type ItemProps, ItemTitle, Label, type LabelProps, Layout, type LayoutProps, Link, type LinkProps, Message, MessageDateSeparator, type MessageDateSeparatorProps, type MessageProps, MessageScroller, type MessageScrollerProps, type MessageSeparatorTone, type MessageTone, type MessageVariant, MetricCard, type MetricCardProps, Modal, ModalBody, ModalClose, ModalDescription, ModalFooter, ModalHeader, type ModalProps, ModalTitle, type MultiSelectProps, type OptimizeImageOptions, type OptimizeImageResult, PageContainer, type PageContainerProps, Pagination, type PaginationProps, PasswordInput, type PasswordInputProps, PdfPreview, type PdfPreviewProps, PhoneInput, type PhoneInputMeta, type PhoneInputProps, Popover, type PopoverMenuItem, type PopoverProps, ProgressBar, type ProgressBarProps, Radio, type RadioOption, type RadioProps, ScrollArea, type ScrollAreaProps, SearchInput, type SearchInputProps, Select, type SelectOption, type SelectProps, type SingleSelectProps, Skeleton, type SkeletonProps, Spinner, type SpinnerProps, type SpinnerSize, Stepper, type StepperProps, Switch, type SwitchProps, type TabItem, Table, TableCell, type TableCellProps, type TableEmptyState, TableFooter, TableFooterCell, type TableFooterCellProps, type TableFooterProps, TableFooterRow, type TableFooterRowProps, TableHeader, TableHeaderCell, type TableHeaderCellProps, type TableHeaderProps, TableHeaderRow, type TableHeaderRowProps, type TablePagination, type TableProps, TableRow, type TableRowProps, Tabs, type TabsProps, type TabsVariant, TagBubble, type TagBubbleProps, type TagOption, TagSelect, type TagSelectProps, Text, type TextProps, Textarea, type TextareaProps, Timeline, type TimelineItem, type TimelineProps, type ToastOptions, type ToastType, Toaster, Tooltip, type TooltipProps, addBusinessDays, allowAutofill, appendCacheBuster, appendQueryParam, buttonVariants, capitalizeFirstLetter, colors, easterDate, formatAddress, formatCityFromFormattedAddress, formatCityWithPostalCode, formatDate, formatDateWithTime, formatDistance, formatDuration, formatEuro, formatKM, formatLocality, formatName, formatNameWithInitial, formatPhoneNumber, formatPlate, formatPlateWithoutDashes, formatPostalCodeFromFormattedAddress, formatRegionCode, formatTime, formatVin, generateHexColor, getAvatarColor, getCleanFileName, getFileIconByMimeType, getFileKind, getFileNameFromUrl, getInitials, getMimeCategory, getRelativeTime, isHoliday, isSameDay, isolateCity, noAutofillProps, optimizeImage, parseAmount, parseIsoDate, toast, truncateFileName, truncateText, useAvatarSize };
|
package/dist/ui/index.js
CHANGED
|
@@ -3863,6 +3863,97 @@ var Banner = ({
|
|
|
3863
3863
|
|
|
3864
3864
|
// src/ui/components/ui/FloatingButton.tsx
|
|
3865
3865
|
var import_react26 = require("react");
|
|
3866
|
+
|
|
3867
|
+
// src/ui/lib/floatingArc.ts
|
|
3868
|
+
var MAX_STEP = 65;
|
|
3869
|
+
var COMFORT_SPAN = 90;
|
|
3870
|
+
var FULL_TURN = 360;
|
|
3871
|
+
var MIN_ITEM_SIZE = 28;
|
|
3872
|
+
var SEARCH_STEP = 10;
|
|
3873
|
+
var SEARCH_LIMIT = 180;
|
|
3874
|
+
var CENTER_DEAD_ZONE = 24;
|
|
3875
|
+
var DEFAULT_ANGLE = 90;
|
|
3876
|
+
var toRadians = (degrees) => degrees * Math.PI / 180;
|
|
3877
|
+
var toDegrees = (radians) => radians * 180 / Math.PI;
|
|
3878
|
+
var chord = (radius, step) => 2 * radius * Math.sin(toRadians(step / 2));
|
|
3879
|
+
var minStepAt = (radius, itemSize) => 2 * toDegrees(Math.asin(Math.min(1, itemSize / (2 * radius))));
|
|
3880
|
+
var arcLayout = (count, baseRadius, baseItemSize) => {
|
|
3881
|
+
if (count <= 1) return { span: 0, radius: baseRadius, itemSize: baseItemSize };
|
|
3882
|
+
const comfortStep = Math.min(MAX_STEP, COMFORT_SPAN / (count - 1));
|
|
3883
|
+
if (comfortStep >= minStepAt(baseRadius, baseItemSize))
|
|
3884
|
+
return {
|
|
3885
|
+
span: comfortStep * (count - 1),
|
|
3886
|
+
radius: baseRadius,
|
|
3887
|
+
itemSize: baseItemSize
|
|
3888
|
+
};
|
|
3889
|
+
const step = Math.min(MAX_STEP, FULL_TURN / count);
|
|
3890
|
+
const available = chord(baseRadius, step);
|
|
3891
|
+
const itemSize = Math.min(baseItemSize, Math.max(MIN_ITEM_SIZE, available));
|
|
3892
|
+
const radius = available >= itemSize ? baseRadius : itemSize / (2 * Math.sin(toRadians(step / 2)));
|
|
3893
|
+
return { span: step * (count - 1), radius, itemSize };
|
|
3894
|
+
};
|
|
3895
|
+
var arcAngle = (index, count, { base, span }) => {
|
|
3896
|
+
if (count <= 1) return base;
|
|
3897
|
+
return base - span / 2 + index * span / (count - 1);
|
|
3898
|
+
};
|
|
3899
|
+
var arcOffset = (index, count, geometry) => {
|
|
3900
|
+
const angle = toRadians(arcAngle(index, count, geometry));
|
|
3901
|
+
return {
|
|
3902
|
+
x: Math.round(Math.cos(angle) * geometry.radius),
|
|
3903
|
+
// L'axe des ordonnées descend à l'écran, l'angle monte en trigonométrie.
|
|
3904
|
+
y: Math.round(-Math.sin(angle) * geometry.radius)
|
|
3905
|
+
};
|
|
3906
|
+
};
|
|
3907
|
+
var angleTowardsFreeSpace = (center, bounds) => {
|
|
3908
|
+
const middleX = (bounds.left + bounds.right) / 2;
|
|
3909
|
+
const middleY = (bounds.top + bounds.bottom) / 2;
|
|
3910
|
+
const dx = middleX - center.x;
|
|
3911
|
+
const dy = middleY - center.y;
|
|
3912
|
+
if (Math.hypot(dx, dy) < CENTER_DEAD_ZONE) return DEFAULT_ANGLE;
|
|
3913
|
+
return toDegrees(Math.atan2(-dy, dx));
|
|
3914
|
+
};
|
|
3915
|
+
var itemsBox = (geometry, { center, count }) => {
|
|
3916
|
+
const half = geometry.itemSize / 2;
|
|
3917
|
+
const xs = [];
|
|
3918
|
+
const ys = [];
|
|
3919
|
+
for (let index = 0; index < count; index += 1) {
|
|
3920
|
+
const { x, y } = arcOffset(index, count, geometry);
|
|
3921
|
+
xs.push(center.x + x);
|
|
3922
|
+
ys.push(center.y + y);
|
|
3923
|
+
}
|
|
3924
|
+
return {
|
|
3925
|
+
left: Math.min(...xs) - half,
|
|
3926
|
+
right: Math.max(...xs) + half,
|
|
3927
|
+
top: Math.min(...ys) - half,
|
|
3928
|
+
bottom: Math.max(...ys) + half
|
|
3929
|
+
};
|
|
3930
|
+
};
|
|
3931
|
+
var fitsInBounds = (geometry, request) => {
|
|
3932
|
+
const box = itemsBox(geometry, request);
|
|
3933
|
+
return box.left >= request.bounds.left && box.right <= request.bounds.right && box.top >= request.bounds.top && box.bottom <= request.bounds.bottom;
|
|
3934
|
+
};
|
|
3935
|
+
var shiftIntoBounds = (geometry, request) => {
|
|
3936
|
+
const box = itemsBox(geometry, request);
|
|
3937
|
+
const { bounds } = request;
|
|
3938
|
+
const pushX = box.left < bounds.left ? bounds.left - box.left : box.right > bounds.right ? bounds.right - box.right : 0;
|
|
3939
|
+
const pushY = box.top < bounds.top ? bounds.top - box.top : box.bottom > bounds.bottom ? bounds.bottom - box.bottom : 0;
|
|
3940
|
+
return { x: Math.round(pushX), y: Math.round(pushY) };
|
|
3941
|
+
};
|
|
3942
|
+
var resolveArcPlacement = (request) => {
|
|
3943
|
+
const layout = arcLayout(request.count, request.radius, request.itemSize);
|
|
3944
|
+
const base = angleTowardsFreeSpace(request.center, request.bounds);
|
|
3945
|
+
for (let offset = 0; offset <= SEARCH_LIMIT; offset += SEARCH_STEP) {
|
|
3946
|
+
for (const direction of offset === 0 ? [1] : [1, -1]) {
|
|
3947
|
+
const geometry2 = __spreadValues({ base: base + offset * direction }, layout);
|
|
3948
|
+
if (fitsInBounds(geometry2, request))
|
|
3949
|
+
return { geometry: geometry2, shift: { x: 0, y: 0 } };
|
|
3950
|
+
}
|
|
3951
|
+
}
|
|
3952
|
+
const geometry = __spreadValues({ base }, layout);
|
|
3953
|
+
return { geometry, shift: shiftIntoBounds(geometry, request) };
|
|
3954
|
+
};
|
|
3955
|
+
|
|
3956
|
+
// src/ui/components/ui/FloatingButton.tsx
|
|
3866
3957
|
var import_jsx_runtime53 = require("react/jsx-runtime");
|
|
3867
3958
|
var readStoredOffset = (key) => {
|
|
3868
3959
|
if (!key || typeof window === "undefined") return { x: 0, y: 0 };
|
|
@@ -3879,17 +3970,8 @@ var readStoredOffset = (key) => {
|
|
|
3879
3970
|
var FAB_SIZE = 56;
|
|
3880
3971
|
var SUB_SIZE = 48;
|
|
3881
3972
|
var ARC_RADIUS = 64;
|
|
3882
|
-
var
|
|
3883
|
-
var ARC_MAX_STEP = 65;
|
|
3884
|
-
var ARC_MAX_SPAN = 90;
|
|
3973
|
+
var EDGE_MARGIN = 16;
|
|
3885
3974
|
var DRAG_THRESHOLD = 4;
|
|
3886
|
-
var arcTransform = (index, total) => {
|
|
3887
|
-
const step = total > 1 ? Math.min(ARC_MAX_STEP, ARC_MAX_SPAN / (total - 1)) : 0;
|
|
3888
|
-
const angle = (ARC_START_ANGLE + index * step) * Math.PI / 180;
|
|
3889
|
-
const x = Math.round(Math.cos(angle) * ARC_RADIUS);
|
|
3890
|
-
const y = Math.round(-Math.sin(angle) * ARC_RADIUS);
|
|
3891
|
-
return `translate(${x}px, ${y}px)`;
|
|
3892
|
-
};
|
|
3893
3975
|
var MAIN_BG = {
|
|
3894
3976
|
"blue-700": "bg-blue-700",
|
|
3895
3977
|
"blue-900": "bg-blue-900",
|
|
@@ -3923,13 +4005,46 @@ var FloatingButton = ({
|
|
|
3923
4005
|
label = "Menu",
|
|
3924
4006
|
color = "blue-700",
|
|
3925
4007
|
draggable = false,
|
|
3926
|
-
persistKey
|
|
4008
|
+
persistKey,
|
|
4009
|
+
safeArea
|
|
3927
4010
|
}) => {
|
|
4011
|
+
const containerRef = (0, import_react26.useRef)(null);
|
|
4012
|
+
const [placement, setPlacement] = (0, import_react26.useState)(() => ({
|
|
4013
|
+
geometry: __spreadValues({ base: 90 }, arcLayout(actions.length, ARC_RADIUS, SUB_SIZE)),
|
|
4014
|
+
shift: { x: 0, y: 0 }
|
|
4015
|
+
}));
|
|
3928
4016
|
const [isDragging, setIsDragging] = (0, import_react26.useState)(false);
|
|
3929
4017
|
const [offset, setOffset] = (0, import_react26.useState)(() => readStoredOffset(persistKey));
|
|
3930
4018
|
const offsetRef = (0, import_react26.useRef)(offset);
|
|
3931
4019
|
const lastPointRef = (0, import_react26.useRef)({ x: 0, y: 0 });
|
|
3932
4020
|
const dragDistanceRef = (0, import_react26.useRef)(0);
|
|
4021
|
+
const clampOffset = (0, import_react26.useCallback)(
|
|
4022
|
+
(next) => {
|
|
4023
|
+
var _a, _b, _c, _d;
|
|
4024
|
+
const el = containerRef.current;
|
|
4025
|
+
if (!el || typeof window === "undefined") return next;
|
|
4026
|
+
const rect = el.getBoundingClientRect();
|
|
4027
|
+
if (rect.width === 0 || rect.height === 0) return next;
|
|
4028
|
+
const baseLeft = rect.left - offsetRef.current.x;
|
|
4029
|
+
const baseTop = rect.top - offsetRef.current.y;
|
|
4030
|
+
const minX = ((_a = safeArea == null ? void 0 : safeArea.left) != null ? _a : 0) + EDGE_MARGIN - baseLeft;
|
|
4031
|
+
const maxX = window.innerWidth - ((_b = safeArea == null ? void 0 : safeArea.right) != null ? _b : 0) - EDGE_MARGIN - rect.width - baseLeft;
|
|
4032
|
+
const minY = ((_c = safeArea == null ? void 0 : safeArea.top) != null ? _c : 0) + EDGE_MARGIN - baseTop;
|
|
4033
|
+
const maxY = window.innerHeight - ((_d = safeArea == null ? void 0 : safeArea.bottom) != null ? _d : 0) - EDGE_MARGIN - rect.height - baseTop;
|
|
4034
|
+
return {
|
|
4035
|
+
x: Math.min(Math.max(next.x, minX), Math.max(minX, maxX)),
|
|
4036
|
+
y: Math.min(Math.max(next.y, minY), Math.max(minY, maxY))
|
|
4037
|
+
};
|
|
4038
|
+
},
|
|
4039
|
+
[safeArea == null ? void 0 : safeArea.left, safeArea == null ? void 0 : safeArea.top, safeArea == null ? void 0 : safeArea.right, safeArea == null ? void 0 : safeArea.bottom]
|
|
4040
|
+
);
|
|
4041
|
+
(0, import_react26.useLayoutEffect)(() => {
|
|
4042
|
+
const corrected = clampOffset(offsetRef.current);
|
|
4043
|
+
if (corrected.x === offsetRef.current.x && corrected.y === offsetRef.current.y)
|
|
4044
|
+
return;
|
|
4045
|
+
offsetRef.current = corrected;
|
|
4046
|
+
setOffset(corrected);
|
|
4047
|
+
}, [clampOffset]);
|
|
3933
4048
|
(0, import_react26.useEffect)(() => {
|
|
3934
4049
|
if (!draggable || !isDragging) return;
|
|
3935
4050
|
const onPointerMove = (e) => {
|
|
@@ -3937,7 +4052,10 @@ var FloatingButton = ({
|
|
|
3937
4052
|
const dy = e.clientY - lastPointRef.current.y;
|
|
3938
4053
|
lastPointRef.current = { x: e.clientX, y: e.clientY };
|
|
3939
4054
|
dragDistanceRef.current += Math.hypot(dx, dy);
|
|
3940
|
-
const next = {
|
|
4055
|
+
const next = clampOffset({
|
|
4056
|
+
x: offsetRef.current.x + dx,
|
|
4057
|
+
y: offsetRef.current.y + dy
|
|
4058
|
+
});
|
|
3941
4059
|
offsetRef.current = next;
|
|
3942
4060
|
setOffset(next);
|
|
3943
4061
|
};
|
|
@@ -3962,7 +4080,53 @@ var FloatingButton = ({
|
|
|
3962
4080
|
window.removeEventListener("pointerup", endDrag);
|
|
3963
4081
|
window.removeEventListener("pointercancel", endDrag);
|
|
3964
4082
|
};
|
|
3965
|
-
}, [draggable, isDragging, persistKey]);
|
|
4083
|
+
}, [draggable, isDragging, persistKey, clampOffset]);
|
|
4084
|
+
const resolvePlacement = (0, import_react26.useCallback)(() => {
|
|
4085
|
+
var _a, _b, _c, _d;
|
|
4086
|
+
const el = containerRef.current;
|
|
4087
|
+
if (!el || typeof window === "undefined") return;
|
|
4088
|
+
const rect = el.getBoundingClientRect();
|
|
4089
|
+
setPlacement(
|
|
4090
|
+
resolveArcPlacement({
|
|
4091
|
+
center: {
|
|
4092
|
+
x: rect.left + rect.width / 2,
|
|
4093
|
+
y: rect.top + rect.height / 2
|
|
4094
|
+
},
|
|
4095
|
+
bounds: {
|
|
4096
|
+
left: (_a = safeArea == null ? void 0 : safeArea.left) != null ? _a : 0,
|
|
4097
|
+
top: (_b = safeArea == null ? void 0 : safeArea.top) != null ? _b : 0,
|
|
4098
|
+
right: window.innerWidth - ((_c = safeArea == null ? void 0 : safeArea.right) != null ? _c : 0),
|
|
4099
|
+
bottom: window.innerHeight - ((_d = safeArea == null ? void 0 : safeArea.bottom) != null ? _d : 0)
|
|
4100
|
+
},
|
|
4101
|
+
count: actions.length,
|
|
4102
|
+
radius: ARC_RADIUS,
|
|
4103
|
+
itemSize: SUB_SIZE
|
|
4104
|
+
})
|
|
4105
|
+
);
|
|
4106
|
+
}, [
|
|
4107
|
+
actions.length,
|
|
4108
|
+
safeArea == null ? void 0 : safeArea.left,
|
|
4109
|
+
safeArea == null ? void 0 : safeArea.top,
|
|
4110
|
+
safeArea == null ? void 0 : safeArea.right,
|
|
4111
|
+
safeArea == null ? void 0 : safeArea.bottom
|
|
4112
|
+
]);
|
|
4113
|
+
(0, import_react26.useLayoutEffect)(() => {
|
|
4114
|
+
if (isOpen) resolvePlacement();
|
|
4115
|
+
}, [isOpen, offset, resolvePlacement]);
|
|
4116
|
+
(0, import_react26.useLayoutEffect)(() => {
|
|
4117
|
+
resolvePlacement();
|
|
4118
|
+
}, [resolvePlacement]);
|
|
4119
|
+
(0, import_react26.useEffect)(() => {
|
|
4120
|
+
if (typeof window === "undefined") return;
|
|
4121
|
+
const onResize = () => {
|
|
4122
|
+
resolvePlacement();
|
|
4123
|
+
const corrected = clampOffset(offsetRef.current);
|
|
4124
|
+
offsetRef.current = corrected;
|
|
4125
|
+
setOffset(corrected);
|
|
4126
|
+
};
|
|
4127
|
+
window.addEventListener("resize", onResize);
|
|
4128
|
+
return () => window.removeEventListener("resize", onResize);
|
|
4129
|
+
}, [resolvePlacement, clampOffset]);
|
|
3966
4130
|
const startDrag = (e) => {
|
|
3967
4131
|
if (!draggable) return;
|
|
3968
4132
|
dragDistanceRef.current = 0;
|
|
@@ -3974,19 +4138,27 @@ var FloatingButton = ({
|
|
|
3974
4138
|
if (draggable && dragDistanceRef.current > DRAG_THRESHOLD) return;
|
|
3975
4139
|
onToggle();
|
|
3976
4140
|
};
|
|
4141
|
+
const { itemSize } = placement.geometry;
|
|
4142
|
+
const translateX = offset.x + (isOpen ? placement.shift.x : 0);
|
|
4143
|
+
const translateY = offset.y + (isOpen ? placement.shift.y : 0);
|
|
3977
4144
|
return /* @__PURE__ */ (0, import_jsx_runtime53.jsxs)(
|
|
3978
4145
|
"div",
|
|
3979
4146
|
{
|
|
4147
|
+
ref: containerRef,
|
|
3980
4148
|
className: "fixed bottom-8 right-8 z-[1000]",
|
|
3981
4149
|
style: {
|
|
3982
4150
|
width: FAB_SIZE,
|
|
3983
4151
|
height: FAB_SIZE,
|
|
3984
|
-
|
|
4152
|
+
// Le décalage d'ouverture s'ajoute au déplacement choisi par l'opérateur :
|
|
4153
|
+
// il écarte le bouton du bord juste ce qu'il faut pour montrer ses actions,
|
|
4154
|
+
// et disparaît à la fermeture. Au repos, pas de transform du tout.
|
|
4155
|
+
transform: translateX || translateY ? `translate(${translateX}px, ${translateY}px)` : void 0,
|
|
3985
4156
|
transition: isDragging ? "none" : "transform 80ms ease-out"
|
|
3986
4157
|
},
|
|
3987
4158
|
children: [
|
|
3988
4159
|
actions.map((action, index) => {
|
|
3989
4160
|
var _a;
|
|
4161
|
+
const itemOffset = arcOffset(index, actions.length, placement.geometry);
|
|
3990
4162
|
return /* @__PURE__ */ (0, import_jsx_runtime53.jsxs)(
|
|
3991
4163
|
"button",
|
|
3992
4164
|
{
|
|
@@ -3998,15 +4170,15 @@ var FloatingButton = ({
|
|
|
3998
4170
|
isOpen ? "pointer-events-auto opacity-100" : "pointer-events-none opacity-0"
|
|
3999
4171
|
),
|
|
4000
4172
|
style: {
|
|
4001
|
-
width:
|
|
4002
|
-
height:
|
|
4003
|
-
left: (FAB_SIZE -
|
|
4004
|
-
top: (FAB_SIZE -
|
|
4005
|
-
transform: isOpen ?
|
|
4173
|
+
width: itemSize,
|
|
4174
|
+
height: itemSize,
|
|
4175
|
+
left: (FAB_SIZE - itemSize) / 2,
|
|
4176
|
+
top: (FAB_SIZE - itemSize) / 2,
|
|
4177
|
+
transform: isOpen ? `translate(${itemOffset.x}px, ${itemOffset.y}px)` : "scale(0.4)"
|
|
4006
4178
|
},
|
|
4007
4179
|
children: [
|
|
4008
4180
|
/* @__PURE__ */ (0, import_jsx_runtime53.jsx)("span", { className: SUB_ICON[color], children: action.icon }),
|
|
4009
|
-
((_a = action.badge) != null ? _a : 0) > 0 && /* @__PURE__ */ (0, import_jsx_runtime53.jsx)("span", { className: "absolute -right-1 -top-1 flex h-[18px] min-w-[18px] items-center justify-center rounded-full bg-red-
|
|
4181
|
+
((_a = action.badge) != null ? _a : 0) > 0 && /* @__PURE__ */ (0, import_jsx_runtime53.jsx)("span", { className: "absolute -right-1 -top-1 flex h-[18px] min-w-[18px] items-center justify-center rounded-full bg-red-500 px-1 text-[11px] font-bold text-white", children: action.badge })
|
|
4010
4182
|
]
|
|
4011
4183
|
},
|
|
4012
4184
|
action.id
|
|
@@ -4030,7 +4202,7 @@ var FloatingButton = ({
|
|
|
4030
4202
|
},
|
|
4031
4203
|
children: [
|
|
4032
4204
|
isOpen ? /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(FaIcon, { name: "xmark", size: 20 }) : icon,
|
|
4033
|
-
!isOpen && mainBadge > 0 && /* @__PURE__ */ (0, import_jsx_runtime53.jsx)("span", { className: "absolute -right-1 -top-1 flex h-[18px] min-w-[18px] items-center justify-center rounded-full bg-red-
|
|
4205
|
+
!isOpen && mainBadge > 0 && /* @__PURE__ */ (0, import_jsx_runtime53.jsx)("span", { className: "absolute -right-1 -top-1 flex h-[18px] min-w-[18px] items-center justify-center rounded-full bg-red-500 px-1 text-[11px] font-bold text-white", children: mainBadge })
|
|
4034
4206
|
]
|
|
4035
4207
|
}
|
|
4036
4208
|
)
|
|
@@ -5302,6 +5474,15 @@ var MessageScroller = ({
|
|
|
5302
5474
|
children,
|
|
5303
5475
|
height,
|
|
5304
5476
|
gap = 3,
|
|
5477
|
+
padding,
|
|
5478
|
+
paddingX,
|
|
5479
|
+
paddingY,
|
|
5480
|
+
paddingTop,
|
|
5481
|
+
// La scrollbar Radix se superpose au contenu : sans ce retrait elle passerait
|
|
5482
|
+
// sur les avatars. Reste surchargeable, comme les autres côtés.
|
|
5483
|
+
paddingRight = 3,
|
|
5484
|
+
paddingBottom,
|
|
5485
|
+
paddingLeft,
|
|
5305
5486
|
header,
|
|
5306
5487
|
footer,
|
|
5307
5488
|
emptyState,
|
|
@@ -5310,15 +5491,17 @@ var MessageScroller = ({
|
|
|
5310
5491
|
isLoading = false,
|
|
5311
5492
|
autoScroll = false,
|
|
5312
5493
|
scrollKey,
|
|
5494
|
+
viewportRef,
|
|
5313
5495
|
className
|
|
5314
5496
|
}) => {
|
|
5315
|
-
const
|
|
5497
|
+
const fallbackRef = (0, import_react33.useRef)(null);
|
|
5498
|
+
const scrollerRef = viewportRef != null ? viewportRef : fallbackRef;
|
|
5316
5499
|
(0, import_react33.useLayoutEffect)(() => {
|
|
5317
5500
|
if (!autoScroll) return;
|
|
5318
|
-
const viewport =
|
|
5501
|
+
const viewport = scrollerRef.current;
|
|
5319
5502
|
if (!viewport) return;
|
|
5320
5503
|
viewport.scrollTop = viewport.scrollHeight;
|
|
5321
|
-
}, [autoScroll, scrollKey, isLoading]);
|
|
5504
|
+
}, [autoScroll, scrollKey, isLoading, scrollerRef]);
|
|
5322
5505
|
const body = () => {
|
|
5323
5506
|
if (isLoading && loadingState) return loadingState;
|
|
5324
5507
|
if (isEmpty && emptyState) return emptyState;
|
|
@@ -5327,14 +5510,29 @@ var MessageScroller = ({
|
|
|
5327
5510
|
return /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(
|
|
5328
5511
|
ScrollArea,
|
|
5329
5512
|
{
|
|
5330
|
-
viewportRef,
|
|
5513
|
+
viewportRef: scrollerRef,
|
|
5331
5514
|
className: cn("w-full", className),
|
|
5332
5515
|
style: typeof height === "number" ? { height: `${height}px` } : { height },
|
|
5333
|
-
children: /* @__PURE__ */ (0, import_jsx_runtime68.jsxs)(
|
|
5334
|
-
|
|
5335
|
-
|
|
5336
|
-
|
|
5337
|
-
|
|
5516
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime68.jsxs)(
|
|
5517
|
+
Layout,
|
|
5518
|
+
{
|
|
5519
|
+
column: true,
|
|
5520
|
+
gap,
|
|
5521
|
+
fullWidth: true,
|
|
5522
|
+
padding,
|
|
5523
|
+
paddingX,
|
|
5524
|
+
paddingY,
|
|
5525
|
+
paddingTop,
|
|
5526
|
+
paddingRight,
|
|
5527
|
+
paddingBottom,
|
|
5528
|
+
paddingLeft,
|
|
5529
|
+
children: [
|
|
5530
|
+
header,
|
|
5531
|
+
body(),
|
|
5532
|
+
footer
|
|
5533
|
+
]
|
|
5534
|
+
}
|
|
5535
|
+
)
|
|
5338
5536
|
}
|
|
5339
5537
|
);
|
|
5340
5538
|
};
|
package/dist/ui/index.mjs
CHANGED
|
@@ -3706,10 +3706,103 @@ var Banner = ({
|
|
|
3706
3706
|
|
|
3707
3707
|
// src/ui/components/ui/FloatingButton.tsx
|
|
3708
3708
|
import {
|
|
3709
|
+
useCallback as useCallback3,
|
|
3709
3710
|
useEffect as useEffect6,
|
|
3711
|
+
useLayoutEffect,
|
|
3710
3712
|
useRef as useRef7,
|
|
3711
3713
|
useState as useState7
|
|
3712
3714
|
} from "react";
|
|
3715
|
+
|
|
3716
|
+
// src/ui/lib/floatingArc.ts
|
|
3717
|
+
var MAX_STEP = 65;
|
|
3718
|
+
var COMFORT_SPAN = 90;
|
|
3719
|
+
var FULL_TURN = 360;
|
|
3720
|
+
var MIN_ITEM_SIZE = 28;
|
|
3721
|
+
var SEARCH_STEP = 10;
|
|
3722
|
+
var SEARCH_LIMIT = 180;
|
|
3723
|
+
var CENTER_DEAD_ZONE = 24;
|
|
3724
|
+
var DEFAULT_ANGLE = 90;
|
|
3725
|
+
var toRadians = (degrees) => degrees * Math.PI / 180;
|
|
3726
|
+
var toDegrees = (radians) => radians * 180 / Math.PI;
|
|
3727
|
+
var chord = (radius, step) => 2 * radius * Math.sin(toRadians(step / 2));
|
|
3728
|
+
var minStepAt = (radius, itemSize) => 2 * toDegrees(Math.asin(Math.min(1, itemSize / (2 * radius))));
|
|
3729
|
+
var arcLayout = (count, baseRadius, baseItemSize) => {
|
|
3730
|
+
if (count <= 1) return { span: 0, radius: baseRadius, itemSize: baseItemSize };
|
|
3731
|
+
const comfortStep = Math.min(MAX_STEP, COMFORT_SPAN / (count - 1));
|
|
3732
|
+
if (comfortStep >= minStepAt(baseRadius, baseItemSize))
|
|
3733
|
+
return {
|
|
3734
|
+
span: comfortStep * (count - 1),
|
|
3735
|
+
radius: baseRadius,
|
|
3736
|
+
itemSize: baseItemSize
|
|
3737
|
+
};
|
|
3738
|
+
const step = Math.min(MAX_STEP, FULL_TURN / count);
|
|
3739
|
+
const available = chord(baseRadius, step);
|
|
3740
|
+
const itemSize = Math.min(baseItemSize, Math.max(MIN_ITEM_SIZE, available));
|
|
3741
|
+
const radius = available >= itemSize ? baseRadius : itemSize / (2 * Math.sin(toRadians(step / 2)));
|
|
3742
|
+
return { span: step * (count - 1), radius, itemSize };
|
|
3743
|
+
};
|
|
3744
|
+
var arcAngle = (index, count, { base, span }) => {
|
|
3745
|
+
if (count <= 1) return base;
|
|
3746
|
+
return base - span / 2 + index * span / (count - 1);
|
|
3747
|
+
};
|
|
3748
|
+
var arcOffset = (index, count, geometry) => {
|
|
3749
|
+
const angle = toRadians(arcAngle(index, count, geometry));
|
|
3750
|
+
return {
|
|
3751
|
+
x: Math.round(Math.cos(angle) * geometry.radius),
|
|
3752
|
+
// L'axe des ordonnées descend à l'écran, l'angle monte en trigonométrie.
|
|
3753
|
+
y: Math.round(-Math.sin(angle) * geometry.radius)
|
|
3754
|
+
};
|
|
3755
|
+
};
|
|
3756
|
+
var angleTowardsFreeSpace = (center, bounds) => {
|
|
3757
|
+
const middleX = (bounds.left + bounds.right) / 2;
|
|
3758
|
+
const middleY = (bounds.top + bounds.bottom) / 2;
|
|
3759
|
+
const dx = middleX - center.x;
|
|
3760
|
+
const dy = middleY - center.y;
|
|
3761
|
+
if (Math.hypot(dx, dy) < CENTER_DEAD_ZONE) return DEFAULT_ANGLE;
|
|
3762
|
+
return toDegrees(Math.atan2(-dy, dx));
|
|
3763
|
+
};
|
|
3764
|
+
var itemsBox = (geometry, { center, count }) => {
|
|
3765
|
+
const half = geometry.itemSize / 2;
|
|
3766
|
+
const xs = [];
|
|
3767
|
+
const ys = [];
|
|
3768
|
+
for (let index = 0; index < count; index += 1) {
|
|
3769
|
+
const { x, y } = arcOffset(index, count, geometry);
|
|
3770
|
+
xs.push(center.x + x);
|
|
3771
|
+
ys.push(center.y + y);
|
|
3772
|
+
}
|
|
3773
|
+
return {
|
|
3774
|
+
left: Math.min(...xs) - half,
|
|
3775
|
+
right: Math.max(...xs) + half,
|
|
3776
|
+
top: Math.min(...ys) - half,
|
|
3777
|
+
bottom: Math.max(...ys) + half
|
|
3778
|
+
};
|
|
3779
|
+
};
|
|
3780
|
+
var fitsInBounds = (geometry, request) => {
|
|
3781
|
+
const box = itemsBox(geometry, request);
|
|
3782
|
+
return box.left >= request.bounds.left && box.right <= request.bounds.right && box.top >= request.bounds.top && box.bottom <= request.bounds.bottom;
|
|
3783
|
+
};
|
|
3784
|
+
var shiftIntoBounds = (geometry, request) => {
|
|
3785
|
+
const box = itemsBox(geometry, request);
|
|
3786
|
+
const { bounds } = request;
|
|
3787
|
+
const pushX = box.left < bounds.left ? bounds.left - box.left : box.right > bounds.right ? bounds.right - box.right : 0;
|
|
3788
|
+
const pushY = box.top < bounds.top ? bounds.top - box.top : box.bottom > bounds.bottom ? bounds.bottom - box.bottom : 0;
|
|
3789
|
+
return { x: Math.round(pushX), y: Math.round(pushY) };
|
|
3790
|
+
};
|
|
3791
|
+
var resolveArcPlacement = (request) => {
|
|
3792
|
+
const layout = arcLayout(request.count, request.radius, request.itemSize);
|
|
3793
|
+
const base = angleTowardsFreeSpace(request.center, request.bounds);
|
|
3794
|
+
for (let offset = 0; offset <= SEARCH_LIMIT; offset += SEARCH_STEP) {
|
|
3795
|
+
for (const direction of offset === 0 ? [1] : [1, -1]) {
|
|
3796
|
+
const geometry2 = __spreadValues({ base: base + offset * direction }, layout);
|
|
3797
|
+
if (fitsInBounds(geometry2, request))
|
|
3798
|
+
return { geometry: geometry2, shift: { x: 0, y: 0 } };
|
|
3799
|
+
}
|
|
3800
|
+
}
|
|
3801
|
+
const geometry = __spreadValues({ base }, layout);
|
|
3802
|
+
return { geometry, shift: shiftIntoBounds(geometry, request) };
|
|
3803
|
+
};
|
|
3804
|
+
|
|
3805
|
+
// src/ui/components/ui/FloatingButton.tsx
|
|
3713
3806
|
import { jsx as jsx53, jsxs as jsxs27 } from "react/jsx-runtime";
|
|
3714
3807
|
var readStoredOffset = (key) => {
|
|
3715
3808
|
if (!key || typeof window === "undefined") return { x: 0, y: 0 };
|
|
@@ -3726,17 +3819,8 @@ var readStoredOffset = (key) => {
|
|
|
3726
3819
|
var FAB_SIZE = 56;
|
|
3727
3820
|
var SUB_SIZE = 48;
|
|
3728
3821
|
var ARC_RADIUS = 64;
|
|
3729
|
-
var
|
|
3730
|
-
var ARC_MAX_STEP = 65;
|
|
3731
|
-
var ARC_MAX_SPAN = 90;
|
|
3822
|
+
var EDGE_MARGIN = 16;
|
|
3732
3823
|
var DRAG_THRESHOLD = 4;
|
|
3733
|
-
var arcTransform = (index, total) => {
|
|
3734
|
-
const step = total > 1 ? Math.min(ARC_MAX_STEP, ARC_MAX_SPAN / (total - 1)) : 0;
|
|
3735
|
-
const angle = (ARC_START_ANGLE + index * step) * Math.PI / 180;
|
|
3736
|
-
const x = Math.round(Math.cos(angle) * ARC_RADIUS);
|
|
3737
|
-
const y = Math.round(-Math.sin(angle) * ARC_RADIUS);
|
|
3738
|
-
return `translate(${x}px, ${y}px)`;
|
|
3739
|
-
};
|
|
3740
3824
|
var MAIN_BG = {
|
|
3741
3825
|
"blue-700": "bg-blue-700",
|
|
3742
3826
|
"blue-900": "bg-blue-900",
|
|
@@ -3770,13 +3854,46 @@ var FloatingButton = ({
|
|
|
3770
3854
|
label = "Menu",
|
|
3771
3855
|
color = "blue-700",
|
|
3772
3856
|
draggable = false,
|
|
3773
|
-
persistKey
|
|
3857
|
+
persistKey,
|
|
3858
|
+
safeArea
|
|
3774
3859
|
}) => {
|
|
3860
|
+
const containerRef = useRef7(null);
|
|
3861
|
+
const [placement, setPlacement] = useState7(() => ({
|
|
3862
|
+
geometry: __spreadValues({ base: 90 }, arcLayout(actions.length, ARC_RADIUS, SUB_SIZE)),
|
|
3863
|
+
shift: { x: 0, y: 0 }
|
|
3864
|
+
}));
|
|
3775
3865
|
const [isDragging, setIsDragging] = useState7(false);
|
|
3776
3866
|
const [offset, setOffset] = useState7(() => readStoredOffset(persistKey));
|
|
3777
3867
|
const offsetRef = useRef7(offset);
|
|
3778
3868
|
const lastPointRef = useRef7({ x: 0, y: 0 });
|
|
3779
3869
|
const dragDistanceRef = useRef7(0);
|
|
3870
|
+
const clampOffset = useCallback3(
|
|
3871
|
+
(next) => {
|
|
3872
|
+
var _a, _b, _c, _d;
|
|
3873
|
+
const el = containerRef.current;
|
|
3874
|
+
if (!el || typeof window === "undefined") return next;
|
|
3875
|
+
const rect = el.getBoundingClientRect();
|
|
3876
|
+
if (rect.width === 0 || rect.height === 0) return next;
|
|
3877
|
+
const baseLeft = rect.left - offsetRef.current.x;
|
|
3878
|
+
const baseTop = rect.top - offsetRef.current.y;
|
|
3879
|
+
const minX = ((_a = safeArea == null ? void 0 : safeArea.left) != null ? _a : 0) + EDGE_MARGIN - baseLeft;
|
|
3880
|
+
const maxX = window.innerWidth - ((_b = safeArea == null ? void 0 : safeArea.right) != null ? _b : 0) - EDGE_MARGIN - rect.width - baseLeft;
|
|
3881
|
+
const minY = ((_c = safeArea == null ? void 0 : safeArea.top) != null ? _c : 0) + EDGE_MARGIN - baseTop;
|
|
3882
|
+
const maxY = window.innerHeight - ((_d = safeArea == null ? void 0 : safeArea.bottom) != null ? _d : 0) - EDGE_MARGIN - rect.height - baseTop;
|
|
3883
|
+
return {
|
|
3884
|
+
x: Math.min(Math.max(next.x, minX), Math.max(minX, maxX)),
|
|
3885
|
+
y: Math.min(Math.max(next.y, minY), Math.max(minY, maxY))
|
|
3886
|
+
};
|
|
3887
|
+
},
|
|
3888
|
+
[safeArea == null ? void 0 : safeArea.left, safeArea == null ? void 0 : safeArea.top, safeArea == null ? void 0 : safeArea.right, safeArea == null ? void 0 : safeArea.bottom]
|
|
3889
|
+
);
|
|
3890
|
+
useLayoutEffect(() => {
|
|
3891
|
+
const corrected = clampOffset(offsetRef.current);
|
|
3892
|
+
if (corrected.x === offsetRef.current.x && corrected.y === offsetRef.current.y)
|
|
3893
|
+
return;
|
|
3894
|
+
offsetRef.current = corrected;
|
|
3895
|
+
setOffset(corrected);
|
|
3896
|
+
}, [clampOffset]);
|
|
3780
3897
|
useEffect6(() => {
|
|
3781
3898
|
if (!draggable || !isDragging) return;
|
|
3782
3899
|
const onPointerMove = (e) => {
|
|
@@ -3784,7 +3901,10 @@ var FloatingButton = ({
|
|
|
3784
3901
|
const dy = e.clientY - lastPointRef.current.y;
|
|
3785
3902
|
lastPointRef.current = { x: e.clientX, y: e.clientY };
|
|
3786
3903
|
dragDistanceRef.current += Math.hypot(dx, dy);
|
|
3787
|
-
const next = {
|
|
3904
|
+
const next = clampOffset({
|
|
3905
|
+
x: offsetRef.current.x + dx,
|
|
3906
|
+
y: offsetRef.current.y + dy
|
|
3907
|
+
});
|
|
3788
3908
|
offsetRef.current = next;
|
|
3789
3909
|
setOffset(next);
|
|
3790
3910
|
};
|
|
@@ -3809,7 +3929,53 @@ var FloatingButton = ({
|
|
|
3809
3929
|
window.removeEventListener("pointerup", endDrag);
|
|
3810
3930
|
window.removeEventListener("pointercancel", endDrag);
|
|
3811
3931
|
};
|
|
3812
|
-
}, [draggable, isDragging, persistKey]);
|
|
3932
|
+
}, [draggable, isDragging, persistKey, clampOffset]);
|
|
3933
|
+
const resolvePlacement = useCallback3(() => {
|
|
3934
|
+
var _a, _b, _c, _d;
|
|
3935
|
+
const el = containerRef.current;
|
|
3936
|
+
if (!el || typeof window === "undefined") return;
|
|
3937
|
+
const rect = el.getBoundingClientRect();
|
|
3938
|
+
setPlacement(
|
|
3939
|
+
resolveArcPlacement({
|
|
3940
|
+
center: {
|
|
3941
|
+
x: rect.left + rect.width / 2,
|
|
3942
|
+
y: rect.top + rect.height / 2
|
|
3943
|
+
},
|
|
3944
|
+
bounds: {
|
|
3945
|
+
left: (_a = safeArea == null ? void 0 : safeArea.left) != null ? _a : 0,
|
|
3946
|
+
top: (_b = safeArea == null ? void 0 : safeArea.top) != null ? _b : 0,
|
|
3947
|
+
right: window.innerWidth - ((_c = safeArea == null ? void 0 : safeArea.right) != null ? _c : 0),
|
|
3948
|
+
bottom: window.innerHeight - ((_d = safeArea == null ? void 0 : safeArea.bottom) != null ? _d : 0)
|
|
3949
|
+
},
|
|
3950
|
+
count: actions.length,
|
|
3951
|
+
radius: ARC_RADIUS,
|
|
3952
|
+
itemSize: SUB_SIZE
|
|
3953
|
+
})
|
|
3954
|
+
);
|
|
3955
|
+
}, [
|
|
3956
|
+
actions.length,
|
|
3957
|
+
safeArea == null ? void 0 : safeArea.left,
|
|
3958
|
+
safeArea == null ? void 0 : safeArea.top,
|
|
3959
|
+
safeArea == null ? void 0 : safeArea.right,
|
|
3960
|
+
safeArea == null ? void 0 : safeArea.bottom
|
|
3961
|
+
]);
|
|
3962
|
+
useLayoutEffect(() => {
|
|
3963
|
+
if (isOpen) resolvePlacement();
|
|
3964
|
+
}, [isOpen, offset, resolvePlacement]);
|
|
3965
|
+
useLayoutEffect(() => {
|
|
3966
|
+
resolvePlacement();
|
|
3967
|
+
}, [resolvePlacement]);
|
|
3968
|
+
useEffect6(() => {
|
|
3969
|
+
if (typeof window === "undefined") return;
|
|
3970
|
+
const onResize = () => {
|
|
3971
|
+
resolvePlacement();
|
|
3972
|
+
const corrected = clampOffset(offsetRef.current);
|
|
3973
|
+
offsetRef.current = corrected;
|
|
3974
|
+
setOffset(corrected);
|
|
3975
|
+
};
|
|
3976
|
+
window.addEventListener("resize", onResize);
|
|
3977
|
+
return () => window.removeEventListener("resize", onResize);
|
|
3978
|
+
}, [resolvePlacement, clampOffset]);
|
|
3813
3979
|
const startDrag = (e) => {
|
|
3814
3980
|
if (!draggable) return;
|
|
3815
3981
|
dragDistanceRef.current = 0;
|
|
@@ -3821,19 +3987,27 @@ var FloatingButton = ({
|
|
|
3821
3987
|
if (draggable && dragDistanceRef.current > DRAG_THRESHOLD) return;
|
|
3822
3988
|
onToggle();
|
|
3823
3989
|
};
|
|
3990
|
+
const { itemSize } = placement.geometry;
|
|
3991
|
+
const translateX = offset.x + (isOpen ? placement.shift.x : 0);
|
|
3992
|
+
const translateY = offset.y + (isOpen ? placement.shift.y : 0);
|
|
3824
3993
|
return /* @__PURE__ */ jsxs27(
|
|
3825
3994
|
"div",
|
|
3826
3995
|
{
|
|
3996
|
+
ref: containerRef,
|
|
3827
3997
|
className: "fixed bottom-8 right-8 z-[1000]",
|
|
3828
3998
|
style: {
|
|
3829
3999
|
width: FAB_SIZE,
|
|
3830
4000
|
height: FAB_SIZE,
|
|
3831
|
-
|
|
4001
|
+
// Le décalage d'ouverture s'ajoute au déplacement choisi par l'opérateur :
|
|
4002
|
+
// il écarte le bouton du bord juste ce qu'il faut pour montrer ses actions,
|
|
4003
|
+
// et disparaît à la fermeture. Au repos, pas de transform du tout.
|
|
4004
|
+
transform: translateX || translateY ? `translate(${translateX}px, ${translateY}px)` : void 0,
|
|
3832
4005
|
transition: isDragging ? "none" : "transform 80ms ease-out"
|
|
3833
4006
|
},
|
|
3834
4007
|
children: [
|
|
3835
4008
|
actions.map((action, index) => {
|
|
3836
4009
|
var _a;
|
|
4010
|
+
const itemOffset = arcOffset(index, actions.length, placement.geometry);
|
|
3837
4011
|
return /* @__PURE__ */ jsxs27(
|
|
3838
4012
|
"button",
|
|
3839
4013
|
{
|
|
@@ -3845,15 +4019,15 @@ var FloatingButton = ({
|
|
|
3845
4019
|
isOpen ? "pointer-events-auto opacity-100" : "pointer-events-none opacity-0"
|
|
3846
4020
|
),
|
|
3847
4021
|
style: {
|
|
3848
|
-
width:
|
|
3849
|
-
height:
|
|
3850
|
-
left: (FAB_SIZE -
|
|
3851
|
-
top: (FAB_SIZE -
|
|
3852
|
-
transform: isOpen ?
|
|
4022
|
+
width: itemSize,
|
|
4023
|
+
height: itemSize,
|
|
4024
|
+
left: (FAB_SIZE - itemSize) / 2,
|
|
4025
|
+
top: (FAB_SIZE - itemSize) / 2,
|
|
4026
|
+
transform: isOpen ? `translate(${itemOffset.x}px, ${itemOffset.y}px)` : "scale(0.4)"
|
|
3853
4027
|
},
|
|
3854
4028
|
children: [
|
|
3855
4029
|
/* @__PURE__ */ jsx53("span", { className: SUB_ICON[color], children: action.icon }),
|
|
3856
|
-
((_a = action.badge) != null ? _a : 0) > 0 && /* @__PURE__ */ jsx53("span", { className: "absolute -right-1 -top-1 flex h-[18px] min-w-[18px] items-center justify-center rounded-full bg-red-
|
|
4030
|
+
((_a = action.badge) != null ? _a : 0) > 0 && /* @__PURE__ */ jsx53("span", { className: "absolute -right-1 -top-1 flex h-[18px] min-w-[18px] items-center justify-center rounded-full bg-red-500 px-1 text-[11px] font-bold text-white", children: action.badge })
|
|
3857
4031
|
]
|
|
3858
4032
|
},
|
|
3859
4033
|
action.id
|
|
@@ -3877,7 +4051,7 @@ var FloatingButton = ({
|
|
|
3877
4051
|
},
|
|
3878
4052
|
children: [
|
|
3879
4053
|
isOpen ? /* @__PURE__ */ jsx53(FaIcon, { name: "xmark", size: 20 }) : icon,
|
|
3880
|
-
!isOpen && mainBadge > 0 && /* @__PURE__ */ jsx53("span", { className: "absolute -right-1 -top-1 flex h-[18px] min-w-[18px] items-center justify-center rounded-full bg-red-
|
|
4054
|
+
!isOpen && mainBadge > 0 && /* @__PURE__ */ jsx53("span", { className: "absolute -right-1 -top-1 flex h-[18px] min-w-[18px] items-center justify-center rounded-full bg-red-500 px-1 text-[11px] font-bold text-white", children: mainBadge })
|
|
3881
4055
|
]
|
|
3882
4056
|
}
|
|
3883
4057
|
)
|
|
@@ -4413,7 +4587,7 @@ var ColorPicker = forwardRef18(
|
|
|
4413
4587
|
ColorPicker.displayName = "ColorPicker";
|
|
4414
4588
|
|
|
4415
4589
|
// src/ui/components/ui/FileUploadZone.tsx
|
|
4416
|
-
import { useCallback as
|
|
4590
|
+
import { useCallback as useCallback4, useRef as useRef8, useState as useState9 } from "react";
|
|
4417
4591
|
import { Fragment as Fragment3, jsx as jsx61, jsxs as jsxs34 } from "react/jsx-runtime";
|
|
4418
4592
|
var ACCEPT_MAP = {
|
|
4419
4593
|
png: "image/png",
|
|
@@ -4458,11 +4632,11 @@ var FileUploadZone = ({
|
|
|
4458
4632
|
const mimeTypes = getMimeTypes(resolvedAccept);
|
|
4459
4633
|
const acceptString = mimeTypes.join(",");
|
|
4460
4634
|
const previewUrl = multiple ? null : controlledPreviewUrl || (showPreview ? internalPreviewUrl : null);
|
|
4461
|
-
const emitError =
|
|
4635
|
+
const emitError = useCallback4(
|
|
4462
4636
|
(message) => onError ? onError(message) : setInlineError(message),
|
|
4463
4637
|
[onError]
|
|
4464
4638
|
);
|
|
4465
|
-
const validateFile =
|
|
4639
|
+
const validateFile = useCallback4(
|
|
4466
4640
|
(file) => {
|
|
4467
4641
|
if (!mimeTypes.includes(file.type))
|
|
4468
4642
|
return { ok: false, error: "Format de fichier non accept\xE9." };
|
|
@@ -4476,7 +4650,7 @@ var FileUploadZone = ({
|
|
|
4476
4650
|
},
|
|
4477
4651
|
[mimeTypes, maxSizeMB]
|
|
4478
4652
|
);
|
|
4479
|
-
const processFile =
|
|
4653
|
+
const processFile = useCallback4(
|
|
4480
4654
|
(file) => {
|
|
4481
4655
|
setInlineError(null);
|
|
4482
4656
|
const result = validateFile(file);
|
|
@@ -4491,7 +4665,7 @@ var FileUploadZone = ({
|
|
|
4491
4665
|
},
|
|
4492
4666
|
[validateFile, onSave, showPreview, emitError]
|
|
4493
4667
|
);
|
|
4494
|
-
const processFiles =
|
|
4668
|
+
const processFiles = useCallback4(
|
|
4495
4669
|
(files) => {
|
|
4496
4670
|
setInlineError(null);
|
|
4497
4671
|
for (const file of files) {
|
|
@@ -5118,7 +5292,7 @@ var Message = forwardRef20(
|
|
|
5118
5292
|
Message.displayName = "Message";
|
|
5119
5293
|
|
|
5120
5294
|
// src/ui/components/ui/MessageScroller.tsx
|
|
5121
|
-
import { useLayoutEffect, useRef as useRef10 } from "react";
|
|
5295
|
+
import { useLayoutEffect as useLayoutEffect2, useRef as useRef10 } from "react";
|
|
5122
5296
|
import { jsx as jsx68, jsxs as jsxs40 } from "react/jsx-runtime";
|
|
5123
5297
|
var SEPARATOR_LINE = {
|
|
5124
5298
|
neutral: "",
|
|
@@ -5149,6 +5323,15 @@ var MessageScroller = ({
|
|
|
5149
5323
|
children,
|
|
5150
5324
|
height,
|
|
5151
5325
|
gap = 3,
|
|
5326
|
+
padding,
|
|
5327
|
+
paddingX,
|
|
5328
|
+
paddingY,
|
|
5329
|
+
paddingTop,
|
|
5330
|
+
// La scrollbar Radix se superpose au contenu : sans ce retrait elle passerait
|
|
5331
|
+
// sur les avatars. Reste surchargeable, comme les autres côtés.
|
|
5332
|
+
paddingRight = 3,
|
|
5333
|
+
paddingBottom,
|
|
5334
|
+
paddingLeft,
|
|
5152
5335
|
header,
|
|
5153
5336
|
footer,
|
|
5154
5337
|
emptyState,
|
|
@@ -5157,15 +5340,17 @@ var MessageScroller = ({
|
|
|
5157
5340
|
isLoading = false,
|
|
5158
5341
|
autoScroll = false,
|
|
5159
5342
|
scrollKey,
|
|
5343
|
+
viewportRef,
|
|
5160
5344
|
className
|
|
5161
5345
|
}) => {
|
|
5162
|
-
const
|
|
5163
|
-
|
|
5346
|
+
const fallbackRef = useRef10(null);
|
|
5347
|
+
const scrollerRef = viewportRef != null ? viewportRef : fallbackRef;
|
|
5348
|
+
useLayoutEffect2(() => {
|
|
5164
5349
|
if (!autoScroll) return;
|
|
5165
|
-
const viewport =
|
|
5350
|
+
const viewport = scrollerRef.current;
|
|
5166
5351
|
if (!viewport) return;
|
|
5167
5352
|
viewport.scrollTop = viewport.scrollHeight;
|
|
5168
|
-
}, [autoScroll, scrollKey, isLoading]);
|
|
5353
|
+
}, [autoScroll, scrollKey, isLoading, scrollerRef]);
|
|
5169
5354
|
const body = () => {
|
|
5170
5355
|
if (isLoading && loadingState) return loadingState;
|
|
5171
5356
|
if (isEmpty && emptyState) return emptyState;
|
|
@@ -5174,14 +5359,29 @@ var MessageScroller = ({
|
|
|
5174
5359
|
return /* @__PURE__ */ jsx68(
|
|
5175
5360
|
ScrollArea,
|
|
5176
5361
|
{
|
|
5177
|
-
viewportRef,
|
|
5362
|
+
viewportRef: scrollerRef,
|
|
5178
5363
|
className: cn("w-full", className),
|
|
5179
5364
|
style: typeof height === "number" ? { height: `${height}px` } : { height },
|
|
5180
|
-
children: /* @__PURE__ */ jsxs40(
|
|
5181
|
-
|
|
5182
|
-
|
|
5183
|
-
|
|
5184
|
-
|
|
5365
|
+
children: /* @__PURE__ */ jsxs40(
|
|
5366
|
+
Layout,
|
|
5367
|
+
{
|
|
5368
|
+
column: true,
|
|
5369
|
+
gap,
|
|
5370
|
+
fullWidth: true,
|
|
5371
|
+
padding,
|
|
5372
|
+
paddingX,
|
|
5373
|
+
paddingY,
|
|
5374
|
+
paddingTop,
|
|
5375
|
+
paddingRight,
|
|
5376
|
+
paddingBottom,
|
|
5377
|
+
paddingLeft,
|
|
5378
|
+
children: [
|
|
5379
|
+
header,
|
|
5380
|
+
body(),
|
|
5381
|
+
footer
|
|
5382
|
+
]
|
|
5383
|
+
}
|
|
5384
|
+
)
|
|
5185
5385
|
}
|
|
5186
5386
|
);
|
|
5187
5387
|
};
|
package/dist/ui/style.css
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
*,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(130,180,204,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(130,180,204,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }/*! tailwindcss v3.4.19 | MIT License | https://tailwindcss.com*/*,:after,:before{box-sizing:border-box;border:0 solid #e5e7eb}:after,:before{--tw-content:""}:host,html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:Open Sans,system-ui,sans-serif;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.container{width:100%}@media (min-width:640px){.container{max-width:640px}}@media (min-width:768px){.container{max-width:768px}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}@media (min-width:1536px){.container{max-width:1536px}}.pointer-events-none{pointer-events:none}.pointer-events-auto{pointer-events:auto}.visible{visibility:visible}.invisible{visibility:hidden}.\!static{position:static!important}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{inset:0}.inset-x-0{left:0;right:0}.inset-x-4{left:1rem;right:1rem}.inset-y-0{top:0;bottom:0}.inset-y-4{top:1rem;bottom:1rem}.-right-1{right:-.25rem}.-top-1{top:-.25rem}.bottom-0{bottom:0}.bottom-4{bottom:1rem}.bottom-8{bottom:2rem}.bottom-\[-1px\]{bottom:-1px}.bottom-\[50px\]{bottom:50px}.left-0{left:0}.left-1\/2{left:50%}.left-2\.5{left:.625rem}.left-4{left:1rem}.right-0{right:0}.right-2\.5{right:.625rem}.right-4{right:1rem}.right-8{right:2rem}.top-0{top:0}.top-1\/2{top:50%}.top-2\.5{top:.625rem}.top-4{top:1rem}.z-10{z-index:10}.z-40{z-index:40}.z-50{z-index:50}.z-\[1000\]{z-index:1000}.z-\[1\]{z-index:1}.z-\[2\]{z-index:2}.z-\[500\]{z-index:500}.z-\[9999\]{z-index:9999}.m-\[5px\]{margin:5px}.mb-2{margin-bottom:.5rem}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.box-border{box-sizing:border-box}.line-clamp-1{-webkit-line-clamp:1}.line-clamp-1,.line-clamp-2{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical}.line-clamp-2{-webkit-line-clamp:2}.line-clamp-3{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:3}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.hidden{display:none}.aspect-square{aspect-ratio:1/1}.h-0\.5{height:.125rem}.h-1\.5{height:.375rem}.h-10{height:2.5rem}.h-11{height:2.75rem}.h-16{height:4rem}.h-2{height:.5rem}.h-2\.5{height:.625rem}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-4{height:1rem}.h-48{height:12rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-7{height:1.75rem}.h-8{height:2rem}.h-9{height:2.25rem}.h-\[18px\]{height:18px}.h-\[22px\]{height:22px}.h-\[30px\]{height:30px}.h-\[3px\]{height:3px}.h-\[500px\]{height:500px}.h-\[52px\]{height:52px}.h-\[9px\]{height:9px}.h-full{height:100%}.h-px{height:1px}.max-h-\[260px\]{max-height:260px}.max-h-\[300px\]{max-height:300px}.max-h-\[400px\]{max-height:400px}.max-h-\[90vh\]{max-height:90vh}.min-h-0{min-height:0}.min-h-\[16px\]{min-height:16px}.min-h-\[200px\]{min-height:200px}.min-h-\[214px\]{min-height:214px}.min-h-\[46px\]{min-height:46px}.min-h-\[48px\]{min-height:48px}.min-h-\[72px\]{min-height:72px}.min-h-\[80px\]{min-height:80px}.min-h-screen{min-height:100vh}.w-0\.5{width:.125rem}.w-10{width:2.5rem}.w-11{width:2.75rem}.w-12{width:3rem}.w-2{width:.5rem}.w-2\.5{width:.625rem}.w-24{width:6rem}.w-28{width:7rem}.w-3\.5{width:.875rem}.w-32{width:8rem}.w-4{width:1rem}.w-40{width:10rem}.w-44{width:11rem}.w-48{width:12rem}.w-5{width:1.25rem}.w-56{width:14rem}.w-6{width:1.5rem}.w-64{width:16rem}.w-7{width:1.75rem}.w-72{width:18rem}.w-8{width:2rem}.w-80{width:20rem}.w-9{width:2.25rem}.w-96{width:24rem}.w-\[18px\]{width:18px}.w-\[22px\]{width:22px}.w-\[360px\]{width:360px}.w-\[480px\]{width:480px}.w-\[900px\]{width:900px}.w-\[9px\]{width:9px}.w-auto{width:auto}.w-fit{width:-moz-fit-content;width:fit-content}.w-full{width:100%}.w-px{width:1px}.min-w-0{min-width:0}.min-w-\[140px\]{min-width:140px}.min-w-\[18px\]{min-width:18px}.min-w-\[20px\]{min-width:20px}.min-w-\[80px\]{min-width:80px}.min-w-\[8px\]{min-width:8px}.max-w-2xl{max-width:42rem}.max-w-\[200px\]{max-width:200px}.max-w-\[423px\]{max-width:423px}.max-w-full{max-width:100%}.max-w-sm{max-width:24rem}.flex-1{flex:1 1 0%}.shrink-0{flex-shrink:0}.grow{flex-grow:1}.table-fixed{table-layout:fixed}.caption-bottom{caption-side:bottom}.origin-left{transform-origin:left}.-translate-x-1\/2{--tw-translate-x:-50%}.-translate-x-1\/2,.-translate-y-1\/2{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-1\/2{--tw-translate-y:-50%}.rotate-180{--tw-rotate:180deg}.rotate-180,.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.animate-\[badge-pulse_2s_ease-in-out_infinite\]{animation:badge-pulse 2s ease-in-out infinite}.animate-\[toast-shrink_linear_forwards\]{animation:toast-shrink linear forwards}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}.cursor-default{cursor:default}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.touch-none{touch-action:none}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-row{flex-direction:row}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.flex-nowrap{flex-wrap:nowrap}.place-items-center{place-items:center}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.items-baseline{align-items:baseline}.items-stretch{align-items:stretch}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.justify-around{justify-content:space-around}.justify-evenly{justify-content:space-evenly}.gap-0{gap:0}.gap-0\.5{gap:.125rem}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-10{gap:2.5rem}.gap-12{gap:3rem}.gap-16{gap:4rem}.gap-2{gap:.5rem}.gap-2\.5{gap:.625rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-5{gap:1.25rem}.gap-6{gap:1.5rem}.gap-8{gap:2rem}.gap-\[5px\]{gap:5px}.-space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-.5rem*var(--tw-space-x-reverse));margin-left:calc(-.5rem*(1 - var(--tw-space-x-reverse)))}.self-stretch{align-self:stretch}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.overflow-x-hidden{overflow-x:hidden}.truncate{overflow:hidden;white-space:nowrap}.text-ellipsis,.truncate{text-overflow:ellipsis}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-line{white-space:pre-line}.whitespace-pre-wrap{white-space:pre-wrap}.break-words{overflow-wrap:break-word}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:1rem}.rounded-\[10px\]{border-radius:10px}.rounded-\[20px\]{border-radius:20px}.rounded-\[3px\]{border-radius:3px}.rounded-\[4px\]{border-radius:4px}.rounded-\[5px\]{border-radius:5px}.rounded-\[6px\]{border-radius:6px}.rounded-\[8px\]{border-radius:8px}.rounded-\[inherit\]{border-radius:inherit}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-none{border-radius:0}.rounded-xl{border-radius:.75rem}.rounded-r-xl{border-top-right-radius:.75rem;border-bottom-right-radius:.75rem}.rounded-bl-none{border-bottom-left-radius:0}.rounded-br-none{border-bottom-right-radius:0}.border{border-width:1px}.border-0{border-width:0}.border-2{border-width:2px}.border-\[1\.5px\]{border-width:1.5px}.border-b{border-bottom-width:1px}.border-l{border-left-width:1px}.border-l-4{border-left-width:4px}.border-l-\[1\.5px\]{border-left-width:1.5px}.border-r{border-right-width:1px}.border-r-\[1\.5px\]{border-right-width:1.5px}.border-t{border-top-width:1px}.border-t-0{border-top-width:0}.border-solid{border-style:solid}.border-dashed{border-style:dashed}.border-blue-100{--tw-border-opacity:1;border-color:rgb(204 234 248/var(--tw-border-opacity,1))}.border-blue-200{--tw-border-opacity:1;border-color:rgb(185 220 237/var(--tw-border-opacity,1))}.border-blue-50{--tw-border-opacity:1;border-color:rgb(219 233 254/var(--tw-border-opacity,1))}.border-blue-700{--tw-border-opacity:1;border-color:rgb(55 126 161/var(--tw-border-opacity,1))}.border-blue-800{--tw-border-opacity:1;border-color:rgb(18 99 139/var(--tw-border-opacity,1))}.border-blue-900{--tw-border-opacity:1;border-color:rgb(14 79 111/var(--tw-border-opacity,1))}.border-blue-950{--tw-border-opacity:1;border-color:rgb(28 78 216/var(--tw-border-opacity,1))}.border-green-100{--tw-border-opacity:1;border-color:rgb(18 183 106/var(--tw-border-opacity,1))}.border-green-500{--tw-border-opacity:1;border-color:rgb(34 197 94/var(--tw-border-opacity,1))}.border-green-700{--tw-border-opacity:1;border-color:rgb(23 128 61/var(--tw-border-opacity,1))}.border-grey-200{--tw-border-opacity:1;border-color:rgb(241 245 249/var(--tw-border-opacity,1))}.border-grey-300{--tw-border-opacity:1;border-color:rgb(226 232 240/var(--tw-border-opacity,1))}.border-grey-400{--tw-border-opacity:1;border-color:rgb(203 213 225/var(--tw-border-opacity,1))}.border-grey-500{--tw-border-opacity:1;border-color:rgb(148 163 184/var(--tw-border-opacity,1))}.border-grey-600{--tw-border-opacity:1;border-color:rgb(100 107 115/var(--tw-border-opacity,1))}.border-purple-700{--tw-border-opacity:1;border-color:rgb(114 48 219/var(--tw-border-opacity,1))}.border-red-200{--tw-border-opacity:1;border-color:rgb(254 202 202/var(--tw-border-opacity,1))}.border-red-500{--tw-border-opacity:1;border-color:rgb(244 70 73/var(--tw-border-opacity,1))}.border-red-900{--tw-border-opacity:1;border-color:rgb(127 29 29/var(--tw-border-opacity,1))}.border-transparent{border-color:transparent}.border-yellow-200{--tw-border-opacity:1;border-color:rgb(255 215 0/var(--tw-border-opacity,1))}.border-yellow-500{--tw-border-opacity:1;border-color:rgb(161 98 7/var(--tw-border-opacity,1))}.border-l-blue-700{--tw-border-opacity:1;border-left-color:rgb(55 126 161/var(--tw-border-opacity,1))}.border-l-blue-900{--tw-border-opacity:1;border-left-color:rgb(14 79 111/var(--tw-border-opacity,1))}.border-l-blue-950{--tw-border-opacity:1;border-left-color:rgb(28 78 216/var(--tw-border-opacity,1))}.border-l-green-700{--tw-border-opacity:1;border-left-color:rgb(23 128 61/var(--tw-border-opacity,1))}.border-l-grey-600{--tw-border-opacity:1;border-left-color:rgb(100 107 115/var(--tw-border-opacity,1))}.border-l-orange-500{--tw-border-opacity:1;border-left-color:rgb(255 100 28/var(--tw-border-opacity,1))}.border-l-purple-700{--tw-border-opacity:1;border-left-color:rgb(114 48 219/var(--tw-border-opacity,1))}.border-l-red-500{--tw-border-opacity:1;border-left-color:rgb(244 70 73/var(--tw-border-opacity,1))}.border-l-red-900{--tw-border-opacity:1;border-left-color:rgb(127 29 29/var(--tw-border-opacity,1))}.border-l-transparent{border-left-color:transparent}.border-l-yellow-200{--tw-border-opacity:1;border-left-color:rgb(255 215 0/var(--tw-border-opacity,1))}.border-l-yellow-500{--tw-border-opacity:1;border-left-color:rgb(161 98 7/var(--tw-border-opacity,1))}.border-t-transparent{border-top-color:transparent}.bg-\[\#1e1e1e\]{--tw-bg-opacity:1;background-color:rgb(30 30 30/var(--tw-bg-opacity,1))}.bg-black\/35{background-color:rgba(0,0,0,.35)}.bg-black\/50{background-color:rgba(0,0,0,.5)}.bg-blue-50{--tw-bg-opacity:1;background-color:rgb(219 233 254/var(--tw-bg-opacity,1))}.bg-blue-700{--tw-bg-opacity:1;background-color:rgb(55 126 161/var(--tw-bg-opacity,1))}.bg-blue-800{--tw-bg-opacity:1;background-color:rgb(18 99 139/var(--tw-bg-opacity,1))}.bg-blue-900{--tw-bg-opacity:1;background-color:rgb(14 79 111/var(--tw-bg-opacity,1))}.bg-blue-950{--tw-bg-opacity:1;background-color:rgb(28 78 216/var(--tw-bg-opacity,1))}.bg-green-50{--tw-bg-opacity:1;background-color:rgb(220 252 231/var(--tw-bg-opacity,1))}.bg-green-700{--tw-bg-opacity:1;background-color:rgb(23 128 61/var(--tw-bg-opacity,1))}.bg-grey-100{--tw-bg-opacity:1;background-color:rgb(248 250 252/var(--tw-bg-opacity,1))}.bg-grey-200{--tw-bg-opacity:1;background-color:rgb(241 245 249/var(--tw-bg-opacity,1))}.bg-grey-300{--tw-bg-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity,1))}.bg-grey-400{--tw-bg-opacity:1;background-color:rgb(203 213 225/var(--tw-bg-opacity,1))}.bg-grey-500{--tw-bg-opacity:1;background-color:rgb(148 163 184/var(--tw-bg-opacity,1))}.bg-grey-600{--tw-bg-opacity:1;background-color:rgb(100 107 115/var(--tw-bg-opacity,1))}.bg-neutral-800{--tw-bg-opacity:1;background-color:rgb(52 58 64/var(--tw-bg-opacity,1))}.bg-orange-50{--tw-bg-opacity:1;background-color:rgb(255 238 230/var(--tw-bg-opacity,1))}.bg-orange-500{--tw-bg-opacity:1;background-color:rgb(255 100 28/var(--tw-bg-opacity,1))}.bg-purple-50{--tw-bg-opacity:1;background-color:rgb(237 233 254/var(--tw-bg-opacity,1))}.bg-purple-700{--tw-bg-opacity:1;background-color:rgb(114 48 219/var(--tw-bg-opacity,1))}.bg-red-50{--tw-bg-opacity:1;background-color:rgb(254 233 233/var(--tw-bg-opacity,1))}.bg-red-500{--tw-bg-opacity:1;background-color:rgb(244 70 73/var(--tw-bg-opacity,1))}.bg-red-900{--tw-bg-opacity:1;background-color:rgb(127 29 29/var(--tw-bg-opacity,1))}.bg-transparent{background-color:transparent}.bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}.bg-white\/40{background-color:hsla(0,0%,100%,.4)}.bg-yellow-200{--tw-bg-opacity:1;background-color:rgb(255 215 0/var(--tw-bg-opacity,1))}.bg-yellow-50{--tw-bg-opacity:1;background-color:rgb(254 247 234/var(--tw-bg-opacity,1))}.bg-yellow-500{--tw-bg-opacity:1;background-color:rgb(161 98 7/var(--tw-bg-opacity,1))}.fill-neutral-800{fill:#343a40}.object-contain{-o-object-fit:contain;object-fit:contain}.object-cover{-o-object-fit:cover;object-fit:cover}.object-fill{-o-object-fit:fill;object-fit:fill}.p-0{padding:0}.p-0\.5{padding:.125rem}.p-1{padding:.25rem}.p-1\.5{padding:.375rem}.p-10{padding:2.5rem}.p-12{padding:3rem}.p-16{padding:4rem}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.p-6{padding:1.5rem}.p-8{padding:2rem}.p-\[1px\]{padding:1px}.px-0{padding-left:0;padding-right:0}.px-0\.5{padding-left:.125rem;padding-right:.125rem}.px-1{padding-left:.25rem;padding-right:.25rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-10{padding-left:2.5rem;padding-right:2.5rem}.px-12{padding-left:3rem;padding-right:3rem}.px-16{padding-left:4rem;padding-right:4rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-3\.5{padding-left:.875rem;padding-right:.875rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.px-8{padding-left:2rem;padding-right:2rem}.py-0{padding-top:0;padding-bottom:0}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-10{padding-top:2.5rem;padding-bottom:2.5rem}.py-12{padding-top:3rem;padding-bottom:3rem}.py-16{padding-top:4rem;padding-bottom:4rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-5{padding-top:1.25rem;padding-bottom:1.25rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.py-8{padding-top:2rem;padding-bottom:2rem}.pb-0{padding-bottom:0}.pb-0\.5{padding-bottom:.125rem}.pb-1{padding-bottom:.25rem}.pb-1\.5{padding-bottom:.375rem}.pb-10{padding-bottom:2.5rem}.pb-12{padding-bottom:3rem}.pb-16{padding-bottom:4rem}.pb-2{padding-bottom:.5rem}.pb-3{padding-bottom:.75rem}.pb-4{padding-bottom:1rem}.pb-5{padding-bottom:1.25rem}.pb-6{padding-bottom:1.5rem}.pb-8{padding-bottom:2rem}.pl-0{padding-left:0}.pl-0\.5{padding-left:.125rem}.pl-1{padding-left:.25rem}.pl-1\.5{padding-left:.375rem}.pl-10{padding-left:2.5rem}.pl-12{padding-left:3rem}.pl-16{padding-left:4rem}.pl-2{padding-left:.5rem}.pl-3{padding-left:.75rem}.pl-4{padding-left:1rem}.pl-5{padding-left:1.25rem}.pl-6{padding-left:1.5rem}.pl-8{padding-left:2rem}.pr-0{padding-right:0}.pr-0\.5{padding-right:.125rem}.pr-1{padding-right:.25rem}.pr-1\.5{padding-right:.375rem}.pr-10{padding-right:2.5rem}.pr-12{padding-right:3rem}.pr-16{padding-right:4rem}.pr-2{padding-right:.5rem}.pr-3{padding-right:.75rem}.pr-4{padding-right:1rem}.pr-5{padding-right:1.25rem}.pr-6{padding-right:1.5rem}.pr-8{padding-right:2rem}.pr-9{padding-right:2.25rem}.pt-0{padding-top:0}.pt-0\.5{padding-top:.125rem}.pt-1{padding-top:.25rem}.pt-1\.5{padding-top:.375rem}.pt-10{padding-top:2.5rem}.pt-12{padding-top:3rem}.pt-16{padding-top:4rem}.pt-2{padding-top:.5rem}.pt-3{padding-top:.75rem}.pt-4{padding-top:1rem}.pt-5{padding-top:1.25rem}.pt-6{padding-top:1.5rem}.pt-8{padding-top:2rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.align-middle{vertical-align:middle}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.font-sans{font-family:Open Sans,system-ui,sans-serif}.text-2xl{font-size:1.5rem;line-height:2rem}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[13px\]{font-size:13px}.text-\[15px\]{font-size:15px}.text-\[17px\]{font-size:17px}.text-\[19px\]{font-size:19px}.text-\[21px\]{font-size:21px}.text-\[22px\]{font-size:22px}.text-\[9px\]{font-size:9px}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.italic{font-style:italic}.leading-none{line-height:1}.tracking-wide{letter-spacing:.025em}.text-blue-700{--tw-text-opacity:1;color:rgb(55 126 161/var(--tw-text-opacity,1))}.text-blue-800{--tw-text-opacity:1;color:rgb(18 99 139/var(--tw-text-opacity,1))}.text-blue-900{--tw-text-opacity:1;color:rgb(14 79 111/var(--tw-text-opacity,1))}.text-blue-950{--tw-text-opacity:1;color:rgb(28 78 216/var(--tw-text-opacity,1))}.text-green-700{--tw-text-opacity:1;color:rgb(23 128 61/var(--tw-text-opacity,1))}.text-grey-400{--tw-text-opacity:1;color:rgb(203 213 225/var(--tw-text-opacity,1))}.text-grey-500{--tw-text-opacity:1;color:rgb(148 163 184/var(--tw-text-opacity,1))}.text-grey-600{--tw-text-opacity:1;color:rgb(100 107 115/var(--tw-text-opacity,1))}.text-neutral-800{--tw-text-opacity:1;color:rgb(52 58 64/var(--tw-text-opacity,1))}.text-orange-500{--tw-text-opacity:1;color:rgb(255 100 28/var(--tw-text-opacity,1))}.text-purple-700{--tw-text-opacity:1;color:rgb(114 48 219/var(--tw-text-opacity,1))}.text-red-500{--tw-text-opacity:1;color:rgb(244 70 73/var(--tw-text-opacity,1))}.text-red-900{--tw-text-opacity:1;color:rgb(127 29 29/var(--tw-text-opacity,1))}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.text-yellow-200{--tw-text-opacity:1;color:rgb(255 215 0/var(--tw-text-opacity,1))}.text-yellow-500{--tw-text-opacity:1;color:rgb(161 98 7/var(--tw-text-opacity,1))}.no-underline{text-decoration-line:none}.opacity-0{opacity:0}.opacity-100{opacity:1}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-90{opacity:.9}.shadow-\[0_10px_15px_-3px_rgba\(0\2c 0\2c 0\2c 0\.1\)\2c 0_4px_6px_-2px_rgba\(0\2c 0\2c 0\2c 0\.05\)\]{--tw-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -2px rgba(0,0,0,.05);--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-\[0_1px_2px_rgba\(15\2c 23\2c 42\2c 0\.12\)\]{--tw-shadow:0 1px 2px rgba(15,23,42,.12);--tw-shadow-colored:0 1px 2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-\[0_1px_4px_rgba\(0\2c 0\2c 0\2c 0\.16\)\]{--tw-shadow:0 1px 4px rgba(0,0,0,.16);--tw-shadow-colored:0 1px 4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-\[0_2px_15px_0_rgba\(198\2c 198\2c 198\2c 0\.25\)\]{--tw-shadow:0 2px 15px 0 hsla(0,0%,78%,.25);--tw-shadow-colored:0 2px 15px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-\[0_2px_6px_rgba\(15\2c 23\2c 42\2c 0\.2\)\]{--tw-shadow:0 2px 6px rgba(15,23,42,.2);--tw-shadow-colored:0 2px 6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-\[0_2px_8px_rgba\(0\2c 0\2c 0\2c 0\.08\)\]{--tw-shadow:0 2px 8px rgba(0,0,0,.08);--tw-shadow-colored:0 2px 8px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-\[0_4px_16px_rgba\(0\2c 0\2c 0\2c 0\.12\)\]{--tw-shadow:0 4px 16px rgba(0,0,0,.12);--tw-shadow-colored:0 4px 16px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-\[0_4px_3px_rgba\(0\2c 0\2c 0\2c 0\.1\)\2c 0_10px_7\.5px_rgba\(0\2c 0\2c 0\2c 0\.1\)\]{--tw-shadow:0 4px 3px rgba(0,0,0,.1),0 10px 7.5px rgba(0,0,0,.1);--tw-shadow-colored:0 4px 3px var(--tw-shadow-color),0 10px 7.5px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-\[0_4px_6px_rgba\(0\2c 0\2c 0\2c 0\.1\)\]{--tw-shadow:0 4px 6px rgba(0,0,0,.1);--tw-shadow-colored:0 4px 6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-\[0_8px_24px_rgba\(0\2c 0\2c 0\2c 0\.16\)\]{--tw-shadow:0 8px 24px rgba(0,0,0,.16);--tw-shadow-colored:0 8px 24px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-\[0_8px_5px_rgba\(0\2c 0\2c 0\2c 0\.1\)\2c 0_20px_12\.5px_rgba\(0\2c 0\2c 0\2c 0\.1\)\]{--tw-shadow:0 8px 5px rgba(0,0,0,.1),0 20px 12.5px rgba(0,0,0,.1);--tw-shadow-colored:0 8px 5px var(--tw-shadow-color),0 20px 12.5px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-\[inset_0_0_0_1px_rgba\(0\2c 0\2c 0\2c 0\.06\)\]{--tw-shadow:inset 0 0 0 1px rgba(0,0,0,.06);--tw-shadow-colored:inset 0 0 0 1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.outline-none{outline:2px solid transparent;outline-offset:2px}.outline{outline-style:solid}.ring-2{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.ring-white{--tw-ring-opacity:1;--tw-ring-color:rgb(255 255 255/var(--tw-ring-opacity,1))}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\[filter\2c transform\]{transition-property:filter,transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\[filter\]{transition-property:filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\[transform\2c opacity\]{transition-property:transform,opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\[width\]{transition-property:width;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1)}.duration-150,.transition-transform{transition-duration:.15s}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}.duration-\[180ms\]{transition-duration:.18s}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}body{font-family:Open Sans,system-ui,sans-serif}@keyframes badge-pulse{0%{transform:scale(1);box-shadow:0 0 0 0 color-mix(in srgb,currentColor 60%,transparent)}70%{transform:scale(1.06);box-shadow:0 0 0 6px transparent}to{transform:scale(1);box-shadow:0 0 0 0 transparent}}@media (prefers-reduced-motion:reduce){.animate-badge-pulse{animation:none!important}}@keyframes accordion-down{0%{height:0}to{height:var(--radix-accordion-content-height)}}@keyframes accordion-up{0%{height:var(--radix-accordion-content-height)}to{height:0}}@keyframes collapsible-down{0%{height:0}to{height:var(--radix-collapsible-content-height)}}@keyframes collapsible-up{0%{height:var(--radix-collapsible-content-height)}to{height:0}}@keyframes fade-in{0%{opacity:0}to{opacity:1}}@keyframes toast-shrink{0%{transform:scaleX(1)}to{transform:scaleX(0)}}.rdp-root.rdp-root{--rdp-accent-color:#0e4f6f;--rdp-accent-background-color:#cceaf8;--rdp-today-color:#0e4f6f;--rdp-day_button-border-radius:6px;--rdp-day-width:26px;--rdp-day-height:26px;--rdp-day_button-width:26px;--rdp-day_button-height:26px;font-family:Open Sans,system-ui,sans-serif;font-size:12px}.rdp-root.rdp-root .rdp-selected{font-size:inherit}.rdp-root.rdp-root .rdp-range_middle .rdp-day_button{border-radius:0}.react-international-phone-input-container{--react-international-phone-border-color:#e2e8f0;--react-international-phone-background-color:#fff;--react-international-phone-text-color:#343a40;--react-international-phone-height:36px;--react-international-phone-border-radius:5px;--react-international-phone-font-size:13px;--react-international-phone-country-selector-background-color-hover:#f1f5f9;--react-international-phone-disabled-background-color:#f1f5f9;--react-international-phone-disabled-text-color:#94a3b8;--react-international-phone-selected-dropdown-item-background-color:#f8fafc;--react-international-phone-dropdown-shadow:0 4px 6px rgba(0,0,0,.1);width:100%;font-family:Open Sans,system-ui,sans-serif}.react-international-phone-input-container .react-international-phone-input:focus{border-color:#1c4ed8}.dz-tagify .tagify{width:100%;border:1px solid #e2e8f0;border-radius:6px;min-height:36px;font-size:13px;font-family:Open Sans,system-ui,sans-serif;--tag-hover:#377ea1;--tag-bg:#377ea1;--tag-text-color:#fff;--tag-remove-btn-color:#fff;--tag-remove-btn-bg--hover:#f44649;--tag-invalid-color:#f44649;--tag-remove-bg:#f44649}.dz-tagify .tagify--focus{border-color:#1c4ed8}.dz-tagify .tagify,.dz-tagify .tagify__input{cursor:text}.dz-tagify--disabled{opacity:.6;pointer-events:none}.placeholder\:font-sans::-moz-placeholder{font-family:Open Sans,system-ui,sans-serif}.placeholder\:font-sans::placeholder{font-family:Open Sans,system-ui,sans-serif}.placeholder\:text-xs::-moz-placeholder{font-size:.75rem;line-height:1rem}.placeholder\:text-xs::placeholder{font-size:.75rem;line-height:1rem}.placeholder\:text-grey-500::-moz-placeholder{--tw-text-opacity:1;color:rgb(148 163 184/var(--tw-text-opacity,1))}.placeholder\:text-grey-500::placeholder{--tw-text-opacity:1;color:rgb(148 163 184/var(--tw-text-opacity,1))}.placeholder\:text-grey-600::-moz-placeholder{--tw-text-opacity:1;color:rgb(100 107 115/var(--tw-text-opacity,1))}.placeholder\:text-grey-600::placeholder{--tw-text-opacity:1;color:rgb(100 107 115/var(--tw-text-opacity,1))}.after\:block:after{content:var(--tw-content);display:block}.after\:\!hidden:after{content:var(--tw-content);display:none!important}.after\:h-\[13px\]:after{content:var(--tw-content);height:13px}.after\:w-\[13px\]:after{content:var(--tw-content);width:13px}.after\:rounded-full:after{content:var(--tw-content);border-radius:9999px}.after\:bg-blue-700:after{content:var(--tw-content);--tw-bg-opacity:1;background-color:rgb(55 126 161/var(--tw-bg-opacity,1))}.after\:bg-blue-900:after{content:var(--tw-content);--tw-bg-opacity:1;background-color:rgb(14 79 111/var(--tw-bg-opacity,1))}.after\:bg-blue-950:after{content:var(--tw-content);--tw-bg-opacity:1;background-color:rgb(28 78 216/var(--tw-bg-opacity,1))}.after\:bg-green-700:after{content:var(--tw-content);--tw-bg-opacity:1;background-color:rgb(23 128 61/var(--tw-bg-opacity,1))}.after\:bg-grey-600:after{content:var(--tw-content);--tw-bg-opacity:1;background-color:rgb(100 107 115/var(--tw-bg-opacity,1))}.after\:bg-purple-700:after{content:var(--tw-content);--tw-bg-opacity:1;background-color:rgb(114 48 219/var(--tw-bg-opacity,1))}.after\:bg-red-500:after{content:var(--tw-content);--tw-bg-opacity:1;background-color:rgb(244 70 73/var(--tw-bg-opacity,1))}.after\:bg-red-900:after{content:var(--tw-content);--tw-bg-opacity:1;background-color:rgb(127 29 29/var(--tw-bg-opacity,1))}.after\:bg-yellow-200:after{content:var(--tw-content);--tw-bg-opacity:1;background-color:rgb(255 215 0/var(--tw-bg-opacity,1))}.after\:bg-yellow-500:after{content:var(--tw-content);--tw-bg-opacity:1;background-color:rgb(161 98 7/var(--tw-bg-opacity,1))}.focus-within\:border-blue-700:focus-within{--tw-border-opacity:1;border-color:rgb(55 126 161/var(--tw-border-opacity,1))}.hover\:scale-110:hover{--tw-scale-x:1.1;--tw-scale-y:1.1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\:border-blue-100:hover{--tw-border-opacity:1;border-color:rgb(204 234 248/var(--tw-border-opacity,1))}.hover\:border-blue-700:hover{--tw-border-opacity:1;border-color:rgb(55 126 161/var(--tw-border-opacity,1))}.hover\:border-grey-300:hover{--tw-border-opacity:1;border-color:rgb(226 232 240/var(--tw-border-opacity,1))}.hover\:bg-black\/\[0\.025\]:hover{background-color:rgba(0,0,0,.025)}.hover\:bg-grey-100:hover{--tw-bg-opacity:1;background-color:rgb(248 250 252/var(--tw-bg-opacity,1))}.hover\:bg-grey-200:hover{--tw-bg-opacity:1;background-color:rgb(241 245 249/var(--tw-bg-opacity,1))}.hover\:text-grey-600:hover{--tw-text-opacity:1;color:rgb(100 107 115/var(--tw-text-opacity,1))}.hover\:text-neutral-800:hover{--tw-text-opacity:1;color:rgb(52 58 64/var(--tw-text-opacity,1))}.hover\:opacity-80:hover{opacity:.8}.hover\:brightness-90:hover{--tw-brightness:brightness(.9)}.hover\:brightness-90:hover,.hover\:brightness-95:hover{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.hover\:brightness-95:hover{--tw-brightness:brightness(.95)}.focus-within\:hover\:border-blue-700:hover:focus-within{--tw-border-opacity:1;border-color:rgb(55 126 161/var(--tw-border-opacity,1))}.focus\:border-blue-700:focus{--tw-border-opacity:1;border-color:rgb(55 126 161/var(--tw-border-opacity,1))}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus-visible\:ring-2:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus-visible\:ring-blue-200:focus-visible{--tw-ring-opacity:1;--tw-ring-color:rgb(185 220 237/var(--tw-ring-opacity,1))}.focus-visible\:ring-offset-2:focus-visible{--tw-ring-offset-width:2px}.active\:scale-\[0\.98\]:active{--tw-scale-x:0.98;--tw-scale-y:0.98;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.active\:brightness-75:active{--tw-brightness:brightness(.75);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:bg-grey-100:disabled{--tw-bg-opacity:1;background-color:rgb(248 250 252/var(--tw-bg-opacity,1))}.disabled\:bg-grey-200:disabled{--tw-bg-opacity:1;background-color:rgb(241 245 249/var(--tw-bg-opacity,1))}.disabled\:opacity-60:disabled{opacity:.6}.disabled\:hover\:brightness-100:hover:disabled{--tw-brightness:brightness(1);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.disabled\:active\:scale-100:active:disabled{--tw-scale-x:1;--tw-scale-y:1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.aria-invalid\:border-red-900[aria-invalid=true],.aria-invalid\:focus\:border-red-900:focus[aria-invalid=true]{--tw-border-opacity:1;border-color:rgb(127 29 29/var(--tw-border-opacity,1))}.data-\[state\=checked\]\:translate-x-4[data-state=checked]{--tw-translate-x:1rem}.data-\[state\=checked\]\:translate-x-4[data-state=checked],.data-\[state\=checked\]\:translate-x-5[data-state=checked]{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[state\=checked\]\:translate-x-5[data-state=checked]{--tw-translate-x:1.25rem}.data-\[state\=open\]\:rotate-180[data-state=open]{--tw-rotate:180deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[state\=closed\]\:animate-\[collapsible-up_200ms_ease-out\][data-state=closed]{animation:collapsible-up .2s ease-out}.data-\[state\=delayed-open\]\:animate-\[fade-in_150ms_ease-out\][data-state=delayed-open]{animation:fade-in .15s ease-out}.data-\[state\=open\]\:animate-\[collapsible-down_200ms_ease-out\][data-state=open]{animation:collapsible-down .2s ease-out}.data-\[state\=open\]\:animate-\[fade-in_150ms_ease-out\][data-state=open]{animation:fade-in .15s ease-out}.data-\[state\=checked\]\:border-blue-700[data-state=checked]{--tw-border-opacity:1;border-color:rgb(55 126 161/var(--tw-border-opacity,1))}.data-\[state\=checked\]\:border-blue-900[data-state=checked]{--tw-border-opacity:1;border-color:rgb(14 79 111/var(--tw-border-opacity,1))}.data-\[state\=checked\]\:border-blue-950[data-state=checked]{--tw-border-opacity:1;border-color:rgb(28 78 216/var(--tw-border-opacity,1))}.data-\[state\=checked\]\:border-green-700[data-state=checked]{--tw-border-opacity:1;border-color:rgb(23 128 61/var(--tw-border-opacity,1))}.data-\[state\=checked\]\:border-grey-600[data-state=checked]{--tw-border-opacity:1;border-color:rgb(100 107 115/var(--tw-border-opacity,1))}.data-\[state\=checked\]\:border-purple-700[data-state=checked]{--tw-border-opacity:1;border-color:rgb(114 48 219/var(--tw-border-opacity,1))}.data-\[state\=checked\]\:border-red-500[data-state=checked]{--tw-border-opacity:1;border-color:rgb(244 70 73/var(--tw-border-opacity,1))}.data-\[state\=checked\]\:border-red-900[data-state=checked]{--tw-border-opacity:1;border-color:rgb(127 29 29/var(--tw-border-opacity,1))}.data-\[state\=checked\]\:border-yellow-200[data-state=checked]{--tw-border-opacity:1;border-color:rgb(255 215 0/var(--tw-border-opacity,1))}.data-\[state\=checked\]\:border-yellow-500[data-state=checked]{--tw-border-opacity:1;border-color:rgb(161 98 7/var(--tw-border-opacity,1))}.data-\[state\=open\]\:border-blue-700[data-state=open]{--tw-border-opacity:1;border-color:rgb(55 126 161/var(--tw-border-opacity,1))}.data-\[highlighted\]\:bg-grey-100[data-highlighted]{--tw-bg-opacity:1;background-color:rgb(248 250 252/var(--tw-bg-opacity,1))}.data-\[state\=checked\]\:bg-blue-700[data-state=checked]{--tw-bg-opacity:1;background-color:rgb(55 126 161/var(--tw-bg-opacity,1))}.data-\[state\=checked\]\:bg-blue-900[data-state=checked]{--tw-bg-opacity:1;background-color:rgb(14 79 111/var(--tw-bg-opacity,1))}.data-\[state\=checked\]\:bg-blue-950[data-state=checked]{--tw-bg-opacity:1;background-color:rgb(28 78 216/var(--tw-bg-opacity,1))}.data-\[state\=checked\]\:bg-green-700[data-state=checked]{--tw-bg-opacity:1;background-color:rgb(23 128 61/var(--tw-bg-opacity,1))}.data-\[state\=checked\]\:bg-grey-600[data-state=checked]{--tw-bg-opacity:1;background-color:rgb(100 107 115/var(--tw-bg-opacity,1))}.data-\[state\=checked\]\:bg-purple-700[data-state=checked]{--tw-bg-opacity:1;background-color:rgb(114 48 219/var(--tw-bg-opacity,1))}.data-\[state\=checked\]\:bg-red-500[data-state=checked]{--tw-bg-opacity:1;background-color:rgb(244 70 73/var(--tw-bg-opacity,1))}.data-\[state\=checked\]\:bg-red-900[data-state=checked]{--tw-bg-opacity:1;background-color:rgb(127 29 29/var(--tw-bg-opacity,1))}.data-\[state\=checked\]\:bg-yellow-200[data-state=checked]{--tw-bg-opacity:1;background-color:rgb(255 215 0/var(--tw-bg-opacity,1))}.data-\[state\=checked\]\:bg-yellow-500[data-state=checked]{--tw-bg-opacity:1;background-color:rgb(161 98 7/var(--tw-bg-opacity,1))}.data-\[placeholder\]\:text-grey-500[data-placeholder]{--tw-text-opacity:1;color:rgb(148 163 184/var(--tw-text-opacity,1))}@media (prefers-reduced-motion:reduce){.motion-reduce\:animate-none{animation:none}}@media (min-width:768px){.md\:p-12{padding:3rem}}.\[\&\>button\:not\(\:last-child\)\]\:rounded-r-none>button:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.\[\&\>tr\:nth-child\(even\)\]\:bg-grey-100>tr:nth-child(2n){--tw-bg-opacity:1;background-color:rgb(248 250 252/var(--tw-bg-opacity,1))}.\[\&_img\]\:h-full img{height:100%}.\[\&_img\]\:w-full img{width:100%}.\[\&_img\]\:object-cover img{-o-object-fit:cover;object-fit:cover}.\[\&_td\:not\(\:first-child\)\]\:border-l td:not(:first-child){border-left-width:1px}.\[\&_td\:not\(\:first-child\)\]\:border-grey-200 td:not(:first-child){--tw-border-opacity:1;border-color:rgb(241 245 249/var(--tw-border-opacity,1))}.\[\&_th\:not\(\:first-child\)\]\:border-l th:not(:first-child){border-left-width:1px}.\[\&_th\:not\(\:first-child\)\]\:border-grey-200 th:not(:first-child){--tw-border-opacity:1;border-color:rgb(241 245 249/var(--tw-border-opacity,1))}
|
|
1
|
+
*,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(130,180,204,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(130,180,204,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }/*! tailwindcss v3.4.19 | MIT License | https://tailwindcss.com*/*,:after,:before{box-sizing:border-box;border:0 solid #e5e7eb}:after,:before{--tw-content:""}:host,html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:Open Sans,system-ui,sans-serif;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.container{width:100%}@media (min-width:640px){.container{max-width:640px}}@media (min-width:768px){.container{max-width:768px}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}@media (min-width:1536px){.container{max-width:1536px}}.pointer-events-none{pointer-events:none}.pointer-events-auto{pointer-events:auto}.visible{visibility:visible}.invisible{visibility:hidden}.\!static{position:static!important}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{inset:0}.inset-x-0{left:0;right:0}.inset-x-4{left:1rem;right:1rem}.inset-y-0{top:0;bottom:0}.inset-y-4{top:1rem;bottom:1rem}.-right-1{right:-.25rem}.-top-1{top:-.25rem}.bottom-0{bottom:0}.bottom-4{bottom:1rem}.bottom-8{bottom:2rem}.bottom-\[-1px\]{bottom:-1px}.bottom-\[50px\]{bottom:50px}.left-0{left:0}.left-1\/2{left:50%}.left-2\.5{left:.625rem}.left-4{left:1rem}.right-0{right:0}.right-2\.5{right:.625rem}.right-4{right:1rem}.right-8{right:2rem}.top-0{top:0}.top-1\/2{top:50%}.top-2\.5{top:.625rem}.top-4{top:1rem}.z-10{z-index:10}.z-40{z-index:40}.z-50{z-index:50}.z-\[1000\]{z-index:1000}.z-\[1\]{z-index:1}.z-\[2\]{z-index:2}.z-\[500\]{z-index:500}.z-\[9999\]{z-index:9999}.m-\[5px\]{margin:5px}.mb-2{margin-bottom:.5rem}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.box-border{box-sizing:border-box}.line-clamp-1{-webkit-line-clamp:1}.line-clamp-1,.line-clamp-2{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical}.line-clamp-2{-webkit-line-clamp:2}.line-clamp-3{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:3}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.hidden{display:none}.aspect-square{aspect-ratio:1/1}.h-0\.5{height:.125rem}.h-1\.5{height:.375rem}.h-10{height:2.5rem}.h-11{height:2.75rem}.h-16{height:4rem}.h-2{height:.5rem}.h-2\.5{height:.625rem}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-4{height:1rem}.h-48{height:12rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-7{height:1.75rem}.h-8{height:2rem}.h-9{height:2.25rem}.h-\[18px\]{height:18px}.h-\[22px\]{height:22px}.h-\[30px\]{height:30px}.h-\[3px\]{height:3px}.h-\[500px\]{height:500px}.h-\[52px\]{height:52px}.h-\[9px\]{height:9px}.h-full{height:100%}.h-px{height:1px}.max-h-\[260px\]{max-height:260px}.max-h-\[300px\]{max-height:300px}.max-h-\[400px\]{max-height:400px}.max-h-\[90vh\]{max-height:90vh}.min-h-0{min-height:0}.min-h-\[16px\]{min-height:16px}.min-h-\[200px\]{min-height:200px}.min-h-\[214px\]{min-height:214px}.min-h-\[46px\]{min-height:46px}.min-h-\[48px\]{min-height:48px}.min-h-\[72px\]{min-height:72px}.min-h-\[80px\]{min-height:80px}.min-h-screen{min-height:100vh}.w-0\.5{width:.125rem}.w-10{width:2.5rem}.w-11{width:2.75rem}.w-12{width:3rem}.w-2{width:.5rem}.w-2\.5{width:.625rem}.w-24{width:6rem}.w-28{width:7rem}.w-3\.5{width:.875rem}.w-32{width:8rem}.w-4{width:1rem}.w-40{width:10rem}.w-44{width:11rem}.w-48{width:12rem}.w-5{width:1.25rem}.w-56{width:14rem}.w-6{width:1.5rem}.w-64{width:16rem}.w-7{width:1.75rem}.w-72{width:18rem}.w-8{width:2rem}.w-80{width:20rem}.w-9{width:2.25rem}.w-96{width:24rem}.w-\[18px\]{width:18px}.w-\[22px\]{width:22px}.w-\[360px\]{width:360px}.w-\[480px\]{width:480px}.w-\[900px\]{width:900px}.w-\[9px\]{width:9px}.w-auto{width:auto}.w-fit{width:-moz-fit-content;width:fit-content}.w-full{width:100%}.w-px{width:1px}.min-w-0{min-width:0}.min-w-\[140px\]{min-width:140px}.min-w-\[18px\]{min-width:18px}.min-w-\[20px\]{min-width:20px}.min-w-\[80px\]{min-width:80px}.min-w-\[8px\]{min-width:8px}.max-w-2xl{max-width:42rem}.max-w-\[200px\]{max-width:200px}.max-w-\[423px\]{max-width:423px}.max-w-full{max-width:100%}.max-w-sm{max-width:24rem}.flex-1{flex:1 1 0%}.shrink-0{flex-shrink:0}.grow{flex-grow:1}.table-fixed{table-layout:fixed}.caption-bottom{caption-side:bottom}.origin-left{transform-origin:left}.-translate-x-1\/2{--tw-translate-x:-50%}.-translate-x-1\/2,.-translate-y-1\/2{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-1\/2{--tw-translate-y:-50%}.rotate-180{--tw-rotate:180deg}.rotate-180,.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.animate-\[badge-pulse_2s_ease-in-out_infinite\]{animation:badge-pulse 2s ease-in-out infinite}.animate-\[toast-shrink_linear_forwards\]{animation:toast-shrink linear forwards}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}.cursor-default{cursor:default}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.touch-none{touch-action:none}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.resize{resize:both}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-row{flex-direction:row}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.flex-nowrap{flex-wrap:nowrap}.place-items-center{place-items:center}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.items-baseline{align-items:baseline}.items-stretch{align-items:stretch}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.justify-around{justify-content:space-around}.justify-evenly{justify-content:space-evenly}.gap-0{gap:0}.gap-0\.5{gap:.125rem}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-10{gap:2.5rem}.gap-12{gap:3rem}.gap-16{gap:4rem}.gap-2{gap:.5rem}.gap-2\.5{gap:.625rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-5{gap:1.25rem}.gap-6{gap:1.5rem}.gap-8{gap:2rem}.gap-\[5px\]{gap:5px}.-space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-.5rem*var(--tw-space-x-reverse));margin-left:calc(-.5rem*(1 - var(--tw-space-x-reverse)))}.self-stretch{align-self:stretch}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.overflow-x-hidden{overflow-x:hidden}.truncate{overflow:hidden;white-space:nowrap}.text-ellipsis,.truncate{text-overflow:ellipsis}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-line{white-space:pre-line}.whitespace-pre-wrap{white-space:pre-wrap}.break-words{overflow-wrap:break-word}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:1rem}.rounded-\[10px\]{border-radius:10px}.rounded-\[20px\]{border-radius:20px}.rounded-\[3px\]{border-radius:3px}.rounded-\[4px\]{border-radius:4px}.rounded-\[5px\]{border-radius:5px}.rounded-\[6px\]{border-radius:6px}.rounded-\[8px\]{border-radius:8px}.rounded-\[inherit\]{border-radius:inherit}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-none{border-radius:0}.rounded-xl{border-radius:.75rem}.rounded-r-xl{border-top-right-radius:.75rem;border-bottom-right-radius:.75rem}.rounded-bl-none{border-bottom-left-radius:0}.rounded-br-none{border-bottom-right-radius:0}.border{border-width:1px}.border-0{border-width:0}.border-2{border-width:2px}.border-\[1\.5px\]{border-width:1.5px}.border-b{border-bottom-width:1px}.border-l{border-left-width:1px}.border-l-4{border-left-width:4px}.border-l-\[1\.5px\]{border-left-width:1.5px}.border-r{border-right-width:1px}.border-r-\[1\.5px\]{border-right-width:1.5px}.border-t{border-top-width:1px}.border-t-0{border-top-width:0}.border-solid{border-style:solid}.border-dashed{border-style:dashed}.border-blue-100{--tw-border-opacity:1;border-color:rgb(204 234 248/var(--tw-border-opacity,1))}.border-blue-200{--tw-border-opacity:1;border-color:rgb(185 220 237/var(--tw-border-opacity,1))}.border-blue-50{--tw-border-opacity:1;border-color:rgb(219 233 254/var(--tw-border-opacity,1))}.border-blue-700{--tw-border-opacity:1;border-color:rgb(55 126 161/var(--tw-border-opacity,1))}.border-blue-800{--tw-border-opacity:1;border-color:rgb(18 99 139/var(--tw-border-opacity,1))}.border-blue-900{--tw-border-opacity:1;border-color:rgb(14 79 111/var(--tw-border-opacity,1))}.border-blue-950{--tw-border-opacity:1;border-color:rgb(28 78 216/var(--tw-border-opacity,1))}.border-green-100{--tw-border-opacity:1;border-color:rgb(18 183 106/var(--tw-border-opacity,1))}.border-green-500{--tw-border-opacity:1;border-color:rgb(34 197 94/var(--tw-border-opacity,1))}.border-green-700{--tw-border-opacity:1;border-color:rgb(23 128 61/var(--tw-border-opacity,1))}.border-grey-200{--tw-border-opacity:1;border-color:rgb(241 245 249/var(--tw-border-opacity,1))}.border-grey-300{--tw-border-opacity:1;border-color:rgb(226 232 240/var(--tw-border-opacity,1))}.border-grey-400{--tw-border-opacity:1;border-color:rgb(203 213 225/var(--tw-border-opacity,1))}.border-grey-500{--tw-border-opacity:1;border-color:rgb(148 163 184/var(--tw-border-opacity,1))}.border-grey-600{--tw-border-opacity:1;border-color:rgb(100 107 115/var(--tw-border-opacity,1))}.border-purple-700{--tw-border-opacity:1;border-color:rgb(114 48 219/var(--tw-border-opacity,1))}.border-red-200{--tw-border-opacity:1;border-color:rgb(254 202 202/var(--tw-border-opacity,1))}.border-red-500{--tw-border-opacity:1;border-color:rgb(244 70 73/var(--tw-border-opacity,1))}.border-red-900{--tw-border-opacity:1;border-color:rgb(127 29 29/var(--tw-border-opacity,1))}.border-transparent{border-color:transparent}.border-yellow-200{--tw-border-opacity:1;border-color:rgb(255 215 0/var(--tw-border-opacity,1))}.border-yellow-500{--tw-border-opacity:1;border-color:rgb(161 98 7/var(--tw-border-opacity,1))}.border-l-blue-700{--tw-border-opacity:1;border-left-color:rgb(55 126 161/var(--tw-border-opacity,1))}.border-l-blue-900{--tw-border-opacity:1;border-left-color:rgb(14 79 111/var(--tw-border-opacity,1))}.border-l-blue-950{--tw-border-opacity:1;border-left-color:rgb(28 78 216/var(--tw-border-opacity,1))}.border-l-green-700{--tw-border-opacity:1;border-left-color:rgb(23 128 61/var(--tw-border-opacity,1))}.border-l-grey-600{--tw-border-opacity:1;border-left-color:rgb(100 107 115/var(--tw-border-opacity,1))}.border-l-orange-500{--tw-border-opacity:1;border-left-color:rgb(255 100 28/var(--tw-border-opacity,1))}.border-l-purple-700{--tw-border-opacity:1;border-left-color:rgb(114 48 219/var(--tw-border-opacity,1))}.border-l-red-500{--tw-border-opacity:1;border-left-color:rgb(244 70 73/var(--tw-border-opacity,1))}.border-l-red-900{--tw-border-opacity:1;border-left-color:rgb(127 29 29/var(--tw-border-opacity,1))}.border-l-transparent{border-left-color:transparent}.border-l-yellow-200{--tw-border-opacity:1;border-left-color:rgb(255 215 0/var(--tw-border-opacity,1))}.border-l-yellow-500{--tw-border-opacity:1;border-left-color:rgb(161 98 7/var(--tw-border-opacity,1))}.border-t-transparent{border-top-color:transparent}.bg-\[\#1e1e1e\]{--tw-bg-opacity:1;background-color:rgb(30 30 30/var(--tw-bg-opacity,1))}.bg-black\/35{background-color:rgba(0,0,0,.35)}.bg-black\/50{background-color:rgba(0,0,0,.5)}.bg-blue-50{--tw-bg-opacity:1;background-color:rgb(219 233 254/var(--tw-bg-opacity,1))}.bg-blue-700{--tw-bg-opacity:1;background-color:rgb(55 126 161/var(--tw-bg-opacity,1))}.bg-blue-800{--tw-bg-opacity:1;background-color:rgb(18 99 139/var(--tw-bg-opacity,1))}.bg-blue-900{--tw-bg-opacity:1;background-color:rgb(14 79 111/var(--tw-bg-opacity,1))}.bg-blue-950{--tw-bg-opacity:1;background-color:rgb(28 78 216/var(--tw-bg-opacity,1))}.bg-green-50{--tw-bg-opacity:1;background-color:rgb(220 252 231/var(--tw-bg-opacity,1))}.bg-green-700{--tw-bg-opacity:1;background-color:rgb(23 128 61/var(--tw-bg-opacity,1))}.bg-grey-100{--tw-bg-opacity:1;background-color:rgb(248 250 252/var(--tw-bg-opacity,1))}.bg-grey-200{--tw-bg-opacity:1;background-color:rgb(241 245 249/var(--tw-bg-opacity,1))}.bg-grey-300{--tw-bg-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity,1))}.bg-grey-400{--tw-bg-opacity:1;background-color:rgb(203 213 225/var(--tw-bg-opacity,1))}.bg-grey-500{--tw-bg-opacity:1;background-color:rgb(148 163 184/var(--tw-bg-opacity,1))}.bg-grey-600{--tw-bg-opacity:1;background-color:rgb(100 107 115/var(--tw-bg-opacity,1))}.bg-neutral-800{--tw-bg-opacity:1;background-color:rgb(52 58 64/var(--tw-bg-opacity,1))}.bg-orange-50{--tw-bg-opacity:1;background-color:rgb(255 238 230/var(--tw-bg-opacity,1))}.bg-orange-500{--tw-bg-opacity:1;background-color:rgb(255 100 28/var(--tw-bg-opacity,1))}.bg-purple-50{--tw-bg-opacity:1;background-color:rgb(237 233 254/var(--tw-bg-opacity,1))}.bg-purple-700{--tw-bg-opacity:1;background-color:rgb(114 48 219/var(--tw-bg-opacity,1))}.bg-red-50{--tw-bg-opacity:1;background-color:rgb(254 233 233/var(--tw-bg-opacity,1))}.bg-red-500{--tw-bg-opacity:1;background-color:rgb(244 70 73/var(--tw-bg-opacity,1))}.bg-red-900{--tw-bg-opacity:1;background-color:rgb(127 29 29/var(--tw-bg-opacity,1))}.bg-transparent{background-color:transparent}.bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}.bg-white\/40{background-color:hsla(0,0%,100%,.4)}.bg-yellow-200{--tw-bg-opacity:1;background-color:rgb(255 215 0/var(--tw-bg-opacity,1))}.bg-yellow-50{--tw-bg-opacity:1;background-color:rgb(254 247 234/var(--tw-bg-opacity,1))}.bg-yellow-500{--tw-bg-opacity:1;background-color:rgb(161 98 7/var(--tw-bg-opacity,1))}.fill-neutral-800{fill:#343a40}.object-contain{-o-object-fit:contain;object-fit:contain}.object-cover{-o-object-fit:cover;object-fit:cover}.object-fill{-o-object-fit:fill;object-fit:fill}.p-0{padding:0}.p-0\.5{padding:.125rem}.p-1{padding:.25rem}.p-1\.5{padding:.375rem}.p-10{padding:2.5rem}.p-12{padding:3rem}.p-16{padding:4rem}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.p-6{padding:1.5rem}.p-8{padding:2rem}.p-\[1px\]{padding:1px}.px-0{padding-left:0;padding-right:0}.px-0\.5{padding-left:.125rem;padding-right:.125rem}.px-1{padding-left:.25rem;padding-right:.25rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-10{padding-left:2.5rem;padding-right:2.5rem}.px-12{padding-left:3rem;padding-right:3rem}.px-16{padding-left:4rem;padding-right:4rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-3\.5{padding-left:.875rem;padding-right:.875rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.px-8{padding-left:2rem;padding-right:2rem}.py-0{padding-top:0;padding-bottom:0}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-10{padding-top:2.5rem;padding-bottom:2.5rem}.py-12{padding-top:3rem;padding-bottom:3rem}.py-16{padding-top:4rem;padding-bottom:4rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-5{padding-top:1.25rem;padding-bottom:1.25rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.py-8{padding-top:2rem;padding-bottom:2rem}.pb-0{padding-bottom:0}.pb-0\.5{padding-bottom:.125rem}.pb-1{padding-bottom:.25rem}.pb-1\.5{padding-bottom:.375rem}.pb-10{padding-bottom:2.5rem}.pb-12{padding-bottom:3rem}.pb-16{padding-bottom:4rem}.pb-2{padding-bottom:.5rem}.pb-3{padding-bottom:.75rem}.pb-4{padding-bottom:1rem}.pb-5{padding-bottom:1.25rem}.pb-6{padding-bottom:1.5rem}.pb-8{padding-bottom:2rem}.pl-0{padding-left:0}.pl-0\.5{padding-left:.125rem}.pl-1{padding-left:.25rem}.pl-1\.5{padding-left:.375rem}.pl-10{padding-left:2.5rem}.pl-12{padding-left:3rem}.pl-16{padding-left:4rem}.pl-2{padding-left:.5rem}.pl-3{padding-left:.75rem}.pl-4{padding-left:1rem}.pl-5{padding-left:1.25rem}.pl-6{padding-left:1.5rem}.pl-8{padding-left:2rem}.pr-0{padding-right:0}.pr-0\.5{padding-right:.125rem}.pr-1{padding-right:.25rem}.pr-1\.5{padding-right:.375rem}.pr-10{padding-right:2.5rem}.pr-12{padding-right:3rem}.pr-16{padding-right:4rem}.pr-2{padding-right:.5rem}.pr-3{padding-right:.75rem}.pr-4{padding-right:1rem}.pr-5{padding-right:1.25rem}.pr-6{padding-right:1.5rem}.pr-8{padding-right:2rem}.pr-9{padding-right:2.25rem}.pt-0{padding-top:0}.pt-0\.5{padding-top:.125rem}.pt-1{padding-top:.25rem}.pt-1\.5{padding-top:.375rem}.pt-10{padding-top:2.5rem}.pt-12{padding-top:3rem}.pt-16{padding-top:4rem}.pt-2{padding-top:.5rem}.pt-3{padding-top:.75rem}.pt-4{padding-top:1rem}.pt-5{padding-top:1.25rem}.pt-6{padding-top:1.5rem}.pt-8{padding-top:2rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.align-middle{vertical-align:middle}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.font-sans{font-family:Open Sans,system-ui,sans-serif}.text-2xl{font-size:1.5rem;line-height:2rem}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[13px\]{font-size:13px}.text-\[15px\]{font-size:15px}.text-\[17px\]{font-size:17px}.text-\[19px\]{font-size:19px}.text-\[21px\]{font-size:21px}.text-\[22px\]{font-size:22px}.text-\[9px\]{font-size:9px}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.italic{font-style:italic}.leading-none{line-height:1}.tracking-wide{letter-spacing:.025em}.text-blue-700{--tw-text-opacity:1;color:rgb(55 126 161/var(--tw-text-opacity,1))}.text-blue-800{--tw-text-opacity:1;color:rgb(18 99 139/var(--tw-text-opacity,1))}.text-blue-900{--tw-text-opacity:1;color:rgb(14 79 111/var(--tw-text-opacity,1))}.text-blue-950{--tw-text-opacity:1;color:rgb(28 78 216/var(--tw-text-opacity,1))}.text-green-700{--tw-text-opacity:1;color:rgb(23 128 61/var(--tw-text-opacity,1))}.text-grey-400{--tw-text-opacity:1;color:rgb(203 213 225/var(--tw-text-opacity,1))}.text-grey-500{--tw-text-opacity:1;color:rgb(148 163 184/var(--tw-text-opacity,1))}.text-grey-600{--tw-text-opacity:1;color:rgb(100 107 115/var(--tw-text-opacity,1))}.text-neutral-800{--tw-text-opacity:1;color:rgb(52 58 64/var(--tw-text-opacity,1))}.text-orange-500{--tw-text-opacity:1;color:rgb(255 100 28/var(--tw-text-opacity,1))}.text-purple-700{--tw-text-opacity:1;color:rgb(114 48 219/var(--tw-text-opacity,1))}.text-red-500{--tw-text-opacity:1;color:rgb(244 70 73/var(--tw-text-opacity,1))}.text-red-900{--tw-text-opacity:1;color:rgb(127 29 29/var(--tw-text-opacity,1))}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.text-yellow-200{--tw-text-opacity:1;color:rgb(255 215 0/var(--tw-text-opacity,1))}.text-yellow-500{--tw-text-opacity:1;color:rgb(161 98 7/var(--tw-text-opacity,1))}.no-underline{text-decoration-line:none}.opacity-0{opacity:0}.opacity-100{opacity:1}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-90{opacity:.9}.shadow-\[0_10px_15px_-3px_rgba\(0\2c 0\2c 0\2c 0\.1\)\2c 0_4px_6px_-2px_rgba\(0\2c 0\2c 0\2c 0\.05\)\]{--tw-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -2px rgba(0,0,0,.05);--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-\[0_1px_2px_rgba\(15\2c 23\2c 42\2c 0\.12\)\]{--tw-shadow:0 1px 2px rgba(15,23,42,.12);--tw-shadow-colored:0 1px 2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-\[0_1px_4px_rgba\(0\2c 0\2c 0\2c 0\.16\)\]{--tw-shadow:0 1px 4px rgba(0,0,0,.16);--tw-shadow-colored:0 1px 4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-\[0_2px_15px_0_rgba\(198\2c 198\2c 198\2c 0\.25\)\]{--tw-shadow:0 2px 15px 0 hsla(0,0%,78%,.25);--tw-shadow-colored:0 2px 15px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-\[0_2px_6px_rgba\(15\2c 23\2c 42\2c 0\.2\)\]{--tw-shadow:0 2px 6px rgba(15,23,42,.2);--tw-shadow-colored:0 2px 6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-\[0_2px_8px_rgba\(0\2c 0\2c 0\2c 0\.08\)\]{--tw-shadow:0 2px 8px rgba(0,0,0,.08);--tw-shadow-colored:0 2px 8px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-\[0_4px_16px_rgba\(0\2c 0\2c 0\2c 0\.12\)\]{--tw-shadow:0 4px 16px rgba(0,0,0,.12);--tw-shadow-colored:0 4px 16px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-\[0_4px_3px_rgba\(0\2c 0\2c 0\2c 0\.1\)\2c 0_10px_7\.5px_rgba\(0\2c 0\2c 0\2c 0\.1\)\]{--tw-shadow:0 4px 3px rgba(0,0,0,.1),0 10px 7.5px rgba(0,0,0,.1);--tw-shadow-colored:0 4px 3px var(--tw-shadow-color),0 10px 7.5px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-\[0_4px_6px_rgba\(0\2c 0\2c 0\2c 0\.1\)\]{--tw-shadow:0 4px 6px rgba(0,0,0,.1);--tw-shadow-colored:0 4px 6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-\[0_8px_24px_rgba\(0\2c 0\2c 0\2c 0\.16\)\]{--tw-shadow:0 8px 24px rgba(0,0,0,.16);--tw-shadow-colored:0 8px 24px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-\[0_8px_5px_rgba\(0\2c 0\2c 0\2c 0\.1\)\2c 0_20px_12\.5px_rgba\(0\2c 0\2c 0\2c 0\.1\)\]{--tw-shadow:0 8px 5px rgba(0,0,0,.1),0 20px 12.5px rgba(0,0,0,.1);--tw-shadow-colored:0 8px 5px var(--tw-shadow-color),0 20px 12.5px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-\[inset_0_0_0_1px_rgba\(0\2c 0\2c 0\2c 0\.06\)\]{--tw-shadow:inset 0 0 0 1px rgba(0,0,0,.06);--tw-shadow-colored:inset 0 0 0 1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.outline-none{outline:2px solid transparent;outline-offset:2px}.outline{outline-style:solid}.ring-2{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.ring-white{--tw-ring-opacity:1;--tw-ring-color:rgb(255 255 255/var(--tw-ring-opacity,1))}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\[filter\2c transform\]{transition-property:filter,transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\[filter\]{transition-property:filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\[transform\2c opacity\]{transition-property:transform,opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\[width\]{transition-property:width;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1)}.duration-150,.transition-transform{transition-duration:.15s}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}.duration-\[180ms\]{transition-duration:.18s}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}body{font-family:Open Sans,system-ui,sans-serif}@keyframes badge-pulse{0%{transform:scale(1);box-shadow:0 0 0 0 color-mix(in srgb,currentColor 60%,transparent)}70%{transform:scale(1.06);box-shadow:0 0 0 6px transparent}to{transform:scale(1);box-shadow:0 0 0 0 transparent}}@media (prefers-reduced-motion:reduce){.animate-badge-pulse{animation:none!important}}@keyframes accordion-down{0%{height:0}to{height:var(--radix-accordion-content-height)}}@keyframes accordion-up{0%{height:var(--radix-accordion-content-height)}to{height:0}}@keyframes collapsible-down{0%{height:0}to{height:var(--radix-collapsible-content-height)}}@keyframes collapsible-up{0%{height:var(--radix-collapsible-content-height)}to{height:0}}@keyframes fade-in{0%{opacity:0}to{opacity:1}}@keyframes toast-shrink{0%{transform:scaleX(1)}to{transform:scaleX(0)}}.rdp-root.rdp-root{--rdp-accent-color:#0e4f6f;--rdp-accent-background-color:#cceaf8;--rdp-today-color:#0e4f6f;--rdp-day_button-border-radius:6px;--rdp-day-width:26px;--rdp-day-height:26px;--rdp-day_button-width:26px;--rdp-day_button-height:26px;font-family:Open Sans,system-ui,sans-serif;font-size:12px}.rdp-root.rdp-root .rdp-selected{font-size:inherit}.rdp-root.rdp-root .rdp-range_middle .rdp-day_button{border-radius:0}.react-international-phone-input-container{--react-international-phone-border-color:#e2e8f0;--react-international-phone-background-color:#fff;--react-international-phone-text-color:#343a40;--react-international-phone-height:36px;--react-international-phone-border-radius:5px;--react-international-phone-font-size:13px;--react-international-phone-country-selector-background-color-hover:#f1f5f9;--react-international-phone-disabled-background-color:#f1f5f9;--react-international-phone-disabled-text-color:#94a3b8;--react-international-phone-selected-dropdown-item-background-color:#f8fafc;--react-international-phone-dropdown-shadow:0 4px 6px rgba(0,0,0,.1);width:100%;font-family:Open Sans,system-ui,sans-serif}.react-international-phone-input-container .react-international-phone-input:focus{border-color:#1c4ed8}.dz-tagify .tagify{width:100%;border:1px solid #e2e8f0;border-radius:6px;min-height:36px;font-size:13px;font-family:Open Sans,system-ui,sans-serif;--tag-hover:#377ea1;--tag-bg:#377ea1;--tag-text-color:#fff;--tag-remove-btn-color:#fff;--tag-remove-btn-bg--hover:#f44649;--tag-invalid-color:#f44649;--tag-remove-bg:#f44649}.dz-tagify .tagify--focus{border-color:#1c4ed8}.dz-tagify .tagify,.dz-tagify .tagify__input{cursor:text}.dz-tagify--disabled{opacity:.6;pointer-events:none}.placeholder\:font-sans::-moz-placeholder{font-family:Open Sans,system-ui,sans-serif}.placeholder\:font-sans::placeholder{font-family:Open Sans,system-ui,sans-serif}.placeholder\:text-xs::-moz-placeholder{font-size:.75rem;line-height:1rem}.placeholder\:text-xs::placeholder{font-size:.75rem;line-height:1rem}.placeholder\:text-grey-500::-moz-placeholder{--tw-text-opacity:1;color:rgb(148 163 184/var(--tw-text-opacity,1))}.placeholder\:text-grey-500::placeholder{--tw-text-opacity:1;color:rgb(148 163 184/var(--tw-text-opacity,1))}.placeholder\:text-grey-600::-moz-placeholder{--tw-text-opacity:1;color:rgb(100 107 115/var(--tw-text-opacity,1))}.placeholder\:text-grey-600::placeholder{--tw-text-opacity:1;color:rgb(100 107 115/var(--tw-text-opacity,1))}.after\:block:after{content:var(--tw-content);display:block}.after\:\!hidden:after{content:var(--tw-content);display:none!important}.after\:h-\[13px\]:after{content:var(--tw-content);height:13px}.after\:w-\[13px\]:after{content:var(--tw-content);width:13px}.after\:rounded-full:after{content:var(--tw-content);border-radius:9999px}.after\:bg-blue-700:after{content:var(--tw-content);--tw-bg-opacity:1;background-color:rgb(55 126 161/var(--tw-bg-opacity,1))}.after\:bg-blue-900:after{content:var(--tw-content);--tw-bg-opacity:1;background-color:rgb(14 79 111/var(--tw-bg-opacity,1))}.after\:bg-blue-950:after{content:var(--tw-content);--tw-bg-opacity:1;background-color:rgb(28 78 216/var(--tw-bg-opacity,1))}.after\:bg-green-700:after{content:var(--tw-content);--tw-bg-opacity:1;background-color:rgb(23 128 61/var(--tw-bg-opacity,1))}.after\:bg-grey-600:after{content:var(--tw-content);--tw-bg-opacity:1;background-color:rgb(100 107 115/var(--tw-bg-opacity,1))}.after\:bg-purple-700:after{content:var(--tw-content);--tw-bg-opacity:1;background-color:rgb(114 48 219/var(--tw-bg-opacity,1))}.after\:bg-red-500:after{content:var(--tw-content);--tw-bg-opacity:1;background-color:rgb(244 70 73/var(--tw-bg-opacity,1))}.after\:bg-red-900:after{content:var(--tw-content);--tw-bg-opacity:1;background-color:rgb(127 29 29/var(--tw-bg-opacity,1))}.after\:bg-yellow-200:after{content:var(--tw-content);--tw-bg-opacity:1;background-color:rgb(255 215 0/var(--tw-bg-opacity,1))}.after\:bg-yellow-500:after{content:var(--tw-content);--tw-bg-opacity:1;background-color:rgb(161 98 7/var(--tw-bg-opacity,1))}.focus-within\:border-blue-700:focus-within{--tw-border-opacity:1;border-color:rgb(55 126 161/var(--tw-border-opacity,1))}.hover\:scale-110:hover{--tw-scale-x:1.1;--tw-scale-y:1.1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\:border-blue-100:hover{--tw-border-opacity:1;border-color:rgb(204 234 248/var(--tw-border-opacity,1))}.hover\:border-blue-700:hover{--tw-border-opacity:1;border-color:rgb(55 126 161/var(--tw-border-opacity,1))}.hover\:border-grey-300:hover{--tw-border-opacity:1;border-color:rgb(226 232 240/var(--tw-border-opacity,1))}.hover\:bg-black\/\[0\.025\]:hover{background-color:rgba(0,0,0,.025)}.hover\:bg-grey-100:hover{--tw-bg-opacity:1;background-color:rgb(248 250 252/var(--tw-bg-opacity,1))}.hover\:bg-grey-200:hover{--tw-bg-opacity:1;background-color:rgb(241 245 249/var(--tw-bg-opacity,1))}.hover\:text-grey-600:hover{--tw-text-opacity:1;color:rgb(100 107 115/var(--tw-text-opacity,1))}.hover\:text-neutral-800:hover{--tw-text-opacity:1;color:rgb(52 58 64/var(--tw-text-opacity,1))}.hover\:opacity-80:hover{opacity:.8}.hover\:brightness-90:hover{--tw-brightness:brightness(.9)}.hover\:brightness-90:hover,.hover\:brightness-95:hover{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.hover\:brightness-95:hover{--tw-brightness:brightness(.95)}.focus-within\:hover\:border-blue-700:hover:focus-within{--tw-border-opacity:1;border-color:rgb(55 126 161/var(--tw-border-opacity,1))}.focus\:border-blue-700:focus{--tw-border-opacity:1;border-color:rgb(55 126 161/var(--tw-border-opacity,1))}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus-visible\:ring-2:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus-visible\:ring-blue-200:focus-visible{--tw-ring-opacity:1;--tw-ring-color:rgb(185 220 237/var(--tw-ring-opacity,1))}.focus-visible\:ring-offset-2:focus-visible{--tw-ring-offset-width:2px}.active\:scale-\[0\.98\]:active{--tw-scale-x:0.98;--tw-scale-y:0.98;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.active\:brightness-75:active{--tw-brightness:brightness(.75);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:bg-grey-100:disabled{--tw-bg-opacity:1;background-color:rgb(248 250 252/var(--tw-bg-opacity,1))}.disabled\:bg-grey-200:disabled{--tw-bg-opacity:1;background-color:rgb(241 245 249/var(--tw-bg-opacity,1))}.disabled\:opacity-60:disabled{opacity:.6}.disabled\:hover\:brightness-100:hover:disabled{--tw-brightness:brightness(1);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.disabled\:active\:scale-100:active:disabled{--tw-scale-x:1;--tw-scale-y:1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.aria-invalid\:border-red-900[aria-invalid=true],.aria-invalid\:focus\:border-red-900:focus[aria-invalid=true]{--tw-border-opacity:1;border-color:rgb(127 29 29/var(--tw-border-opacity,1))}.data-\[state\=checked\]\:translate-x-4[data-state=checked]{--tw-translate-x:1rem}.data-\[state\=checked\]\:translate-x-4[data-state=checked],.data-\[state\=checked\]\:translate-x-5[data-state=checked]{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[state\=checked\]\:translate-x-5[data-state=checked]{--tw-translate-x:1.25rem}.data-\[state\=open\]\:rotate-180[data-state=open]{--tw-rotate:180deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[state\=closed\]\:animate-\[collapsible-up_200ms_ease-out\][data-state=closed]{animation:collapsible-up .2s ease-out}.data-\[state\=delayed-open\]\:animate-\[fade-in_150ms_ease-out\][data-state=delayed-open]{animation:fade-in .15s ease-out}.data-\[state\=open\]\:animate-\[collapsible-down_200ms_ease-out\][data-state=open]{animation:collapsible-down .2s ease-out}.data-\[state\=open\]\:animate-\[fade-in_150ms_ease-out\][data-state=open]{animation:fade-in .15s ease-out}.data-\[state\=checked\]\:border-blue-700[data-state=checked]{--tw-border-opacity:1;border-color:rgb(55 126 161/var(--tw-border-opacity,1))}.data-\[state\=checked\]\:border-blue-900[data-state=checked]{--tw-border-opacity:1;border-color:rgb(14 79 111/var(--tw-border-opacity,1))}.data-\[state\=checked\]\:border-blue-950[data-state=checked]{--tw-border-opacity:1;border-color:rgb(28 78 216/var(--tw-border-opacity,1))}.data-\[state\=checked\]\:border-green-700[data-state=checked]{--tw-border-opacity:1;border-color:rgb(23 128 61/var(--tw-border-opacity,1))}.data-\[state\=checked\]\:border-grey-600[data-state=checked]{--tw-border-opacity:1;border-color:rgb(100 107 115/var(--tw-border-opacity,1))}.data-\[state\=checked\]\:border-purple-700[data-state=checked]{--tw-border-opacity:1;border-color:rgb(114 48 219/var(--tw-border-opacity,1))}.data-\[state\=checked\]\:border-red-500[data-state=checked]{--tw-border-opacity:1;border-color:rgb(244 70 73/var(--tw-border-opacity,1))}.data-\[state\=checked\]\:border-red-900[data-state=checked]{--tw-border-opacity:1;border-color:rgb(127 29 29/var(--tw-border-opacity,1))}.data-\[state\=checked\]\:border-yellow-200[data-state=checked]{--tw-border-opacity:1;border-color:rgb(255 215 0/var(--tw-border-opacity,1))}.data-\[state\=checked\]\:border-yellow-500[data-state=checked]{--tw-border-opacity:1;border-color:rgb(161 98 7/var(--tw-border-opacity,1))}.data-\[state\=open\]\:border-blue-700[data-state=open]{--tw-border-opacity:1;border-color:rgb(55 126 161/var(--tw-border-opacity,1))}.data-\[highlighted\]\:bg-grey-100[data-highlighted]{--tw-bg-opacity:1;background-color:rgb(248 250 252/var(--tw-bg-opacity,1))}.data-\[state\=checked\]\:bg-blue-700[data-state=checked]{--tw-bg-opacity:1;background-color:rgb(55 126 161/var(--tw-bg-opacity,1))}.data-\[state\=checked\]\:bg-blue-900[data-state=checked]{--tw-bg-opacity:1;background-color:rgb(14 79 111/var(--tw-bg-opacity,1))}.data-\[state\=checked\]\:bg-blue-950[data-state=checked]{--tw-bg-opacity:1;background-color:rgb(28 78 216/var(--tw-bg-opacity,1))}.data-\[state\=checked\]\:bg-green-700[data-state=checked]{--tw-bg-opacity:1;background-color:rgb(23 128 61/var(--tw-bg-opacity,1))}.data-\[state\=checked\]\:bg-grey-600[data-state=checked]{--tw-bg-opacity:1;background-color:rgb(100 107 115/var(--tw-bg-opacity,1))}.data-\[state\=checked\]\:bg-purple-700[data-state=checked]{--tw-bg-opacity:1;background-color:rgb(114 48 219/var(--tw-bg-opacity,1))}.data-\[state\=checked\]\:bg-red-500[data-state=checked]{--tw-bg-opacity:1;background-color:rgb(244 70 73/var(--tw-bg-opacity,1))}.data-\[state\=checked\]\:bg-red-900[data-state=checked]{--tw-bg-opacity:1;background-color:rgb(127 29 29/var(--tw-bg-opacity,1))}.data-\[state\=checked\]\:bg-yellow-200[data-state=checked]{--tw-bg-opacity:1;background-color:rgb(255 215 0/var(--tw-bg-opacity,1))}.data-\[state\=checked\]\:bg-yellow-500[data-state=checked]{--tw-bg-opacity:1;background-color:rgb(161 98 7/var(--tw-bg-opacity,1))}.data-\[placeholder\]\:text-grey-500[data-placeholder]{--tw-text-opacity:1;color:rgb(148 163 184/var(--tw-text-opacity,1))}@media (prefers-reduced-motion:reduce){.motion-reduce\:animate-none{animation:none}}@media (min-width:768px){.md\:p-12{padding:3rem}}.\[\&\>button\:not\(\:last-child\)\]\:rounded-r-none>button:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.\[\&\>tr\:nth-child\(even\)\]\:bg-grey-100>tr:nth-child(2n){--tw-bg-opacity:1;background-color:rgb(248 250 252/var(--tw-bg-opacity,1))}.\[\&_img\]\:h-full img{height:100%}.\[\&_img\]\:w-full img{width:100%}.\[\&_img\]\:object-cover img{-o-object-fit:cover;object-fit:cover}.\[\&_td\:not\(\:first-child\)\]\:border-l td:not(:first-child){border-left-width:1px}.\[\&_td\:not\(\:first-child\)\]\:border-grey-200 td:not(:first-child){--tw-border-opacity:1;border-color:rgb(241 245 249/var(--tw-border-opacity,1))}.\[\&_th\:not\(\:first-child\)\]\:border-l th:not(:first-child){border-left-width:1px}.\[\&_th\:not\(\:first-child\)\]\:border-grey-200 th:not(:first-child){--tw-border-opacity:1;border-color:rgb(241 245 249/var(--tw-border-opacity,1))}
|