react-restyle-components 0.4.63 → 0.4.65

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.
@@ -1,4 +1,4 @@
1
1
  import React from 'react';
2
2
  export type { ModalSize, ModalPosition, ModalClassNames, ModalStyles, ModalProps } from './types';
3
3
  import type { ModalProps } from './types';
4
- export declare const Modal: ({ visible, title, className, contentClassName, headerClassName, style, contentStyle, onClose, isAutoClose, autoCloseDelay, isAutoCloseOutside, size, position, showCloseButton, closeButton, overlayOpacity, overlayColor, zIndex, closeOnOverlayClick, closeOnEscape, showHeader, headerBgColor, headerTextColor, borderRadius, maxWidth, contentPadding, headerPadding, animationDuration, classNames, styles, children, }: ModalProps) => React.JSX.Element | null;
4
+ export declare const Modal: ({ visible, title, className, contentClassName, headerClassName, style, contentStyle, onClose, isAutoClose, autoCloseDelay, isAutoCloseOutside, size, position, showCloseButton, closeButton, isExpand, expandButton, onExpand, overlayOpacity, overlayColor, zIndex, closeOnOverlayClick, closeOnEscape, showHeader, headerBgColor, headerTextColor, borderRadius, maxWidth, contentPadding, headerPadding, animationDuration, classNames, styles, children, }: ModalProps) => React.JSX.Element | null;
@@ -2,11 +2,12 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
2
2
  import { useEffect, useState } from 'react';
3
3
  import s from '../../../tc.module.css';
4
4
  import { cn } from '../../../utils';
5
- export const Modal = ({ visible, title = '', className = '', contentClassName = '', headerClassName = '', style = {}, contentStyle = {}, onClose, isAutoClose = false, autoCloseDelay = 1000, isAutoCloseOutside, size = 'md', position = 'center', showCloseButton = true, closeButton, overlayOpacity = 0.5, overlayColor, zIndex = 11000, closeOnOverlayClick, closeOnEscape = true, showHeader = true, headerBgColor, headerTextColor, borderRadius = '0.5rem', maxWidth, contentPadding = '1rem', headerPadding = '1rem', animationDuration = 300, classNames = {}, styles = {}, children, }) => {
5
+ export const Modal = ({ visible, title = '', className = '', contentClassName = '', headerClassName = '', style = {}, contentStyle = {}, onClose, isAutoClose = false, autoCloseDelay = 1000, isAutoCloseOutside, size = 'md', position = 'center', showCloseButton = true, closeButton, isExpand = false, expandButton, onExpand, overlayOpacity = 0.5, overlayColor, zIndex = 11000, closeOnOverlayClick, closeOnEscape = true, showHeader = true, headerBgColor, headerTextColor, borderRadius = '0.5rem', maxWidth, contentPadding = '1rem', headerPadding = '1rem', animationDuration = 300, classNames = {}, styles = {}, children, }) => {
6
6
  // isAutoCloseOutside takes priority, then closeOnOverlayClick, default true
7
7
  const shouldCloseOnOutsideClick = isAutoCloseOutside ?? closeOnOverlayClick ?? true;
8
8
  const [showModal, setShowModal] = useState(visible);
9
9
  const [isAnimating, setIsAnimating] = useState(false);
10
+ const [isExpanded, setIsExpanded] = useState(false);
10
11
  useEffect(() => {
11
12
  if (visible) {
12
13
  setShowModal(true);
@@ -75,28 +76,46 @@ export const Modal = ({ visible, title = '', className = '', contentClassName =
75
76
  ...style,
76
77
  transition: `opacity ${animationDuration}ms ease-in-out`,
77
78
  opacity: isAnimating ? 1 : 0,
78
- zIndex: containerZIndex,
79
+ zIndex: isExpanded ? 2147483647 : containerZIndex,
80
+ overflow: isExpanded ? 'hidden' : undefined,
79
81
  ...styles.container,
80
- }, onClick: handleOverlayClick, children: _jsx("div", { className: cn(s['relative'], s['w-full'], s['my-5'], s['mx-auto'], classNames.wrapper), style: {
81
- maxWidth: modalMaxWidth,
82
- marginLeft: size === 'full' ? '1rem' : undefined,
83
- marginRight: size === 'full' ? '1rem' : undefined,
84
- transform: isAnimating
85
- ? position === 'center'
86
- ? 'scale(1)'
87
- : position === 'top'
88
- ? 'translateY(0)'
82
+ }, onClick: handleOverlayClick, children: _jsx("div", { className: cn(s['relative'], s['w-full'], !isExpanded && s['my-5'], !isExpanded && s['mx-auto'], classNames.wrapper), style: isExpanded
83
+ ? {
84
+ maxWidth: '100vw',
85
+ width: '100vw',
86
+ height: '100vh',
87
+ margin: 0,
88
+ position: 'fixed',
89
+ top: 0,
90
+ left: 0,
91
+ right: 0,
92
+ bottom: 0,
93
+ zIndex: 2147483647,
94
+ transform: 'none',
95
+ opacity: isAnimating ? 1 : 0,
96
+ transition: `opacity ${animationDuration}ms ease-out`,
97
+ ...styles.wrapper,
98
+ }
99
+ : {
100
+ maxWidth: modalMaxWidth,
101
+ marginLeft: size === 'full' ? '1rem' : undefined,
102
+ marginRight: size === 'full' ? '1rem' : undefined,
103
+ transform: isAnimating
104
+ ? position === 'center'
105
+ ? 'scale(1)'
89
106
  : 'translateY(0)'
90
- : position === 'center'
91
- ? 'scale(0.95)'
92
- : position === 'top'
93
- ? 'translateY(-20px)'
94
- : 'translateY(20px)',
95
- transition: `transform ${animationDuration}ms ease-out, opacity ${animationDuration}ms ease-out`,
96
- opacity: isAnimating ? 1 : 0,
97
- ...styles.wrapper,
98
- }, onClick: (e) => e.stopPropagation(), children: _jsxs("div", { className: cn(s['border-0'], s['shadow-xl'], s['relative'], s['flex'], s['flex-col'], s['bg-white'], s['outline-none'], s['focus:outline-none'], contentClassName, classNames.content), style: {
99
- borderRadius,
107
+ : position === 'center'
108
+ ? 'scale(0.95)'
109
+ : position === 'top'
110
+ ? 'translateY(-20px)'
111
+ : 'translateY(20px)',
112
+ transition: `transform ${animationDuration}ms ease-out, opacity ${animationDuration}ms ease-out`,
113
+ opacity: isAnimating ? 1 : 0,
114
+ ...styles.wrapper,
115
+ }, onClick: (e) => e.stopPropagation(), children: _jsxs("div", { className: cn(s['border-0'], s['shadow-xl'], s['relative'], s['flex'], s['flex-col'], s['bg-white'], s['outline-none'], s['focus:outline-none'], contentClassName, classNames.content), style: {
116
+ borderRadius: isExpanded ? 0 : borderRadius,
117
+ height: isExpanded ? '100%' : undefined,
118
+ overflow: isExpanded ? 'hidden' : undefined,
100
119
  ...contentStyle,
101
120
  ...styles.content,
102
121
  }, children: [showHeader && (_jsxs("div", { className: cn(s['flex'], s['items-center'], s['justify-between'], s['border-b'], s['border-solid'], s['border-gray-200'], headerClassName, classNames.header), style: {
@@ -106,7 +125,25 @@ export const Modal = ({ visible, title = '', className = '', contentClassName =
106
125
  borderTopRightRadius: borderRadius,
107
126
  borderBottom: title || showCloseButton ? undefined : 'none',
108
127
  ...styles.header,
109
- }, children: [title && (_jsx("h3", { className: cn(s['text-xl'], s['font-semibold'], s['m-0'], s['flex-1'], classNames.title), style: { color: headerTextColor, ...styles.title }, children: title })), showCloseButton && (_jsx("button", { type: "button", className: cn(s['p-1'], s['ml-4'], s['border-0'], s['bg-transparent'], s['cursor-pointer'], s['outline-none'], s['focus:outline-none'], s['transition-colors'], s['hover:bg-gray-100'], s['rounded'], classNames.closeButton), onClick: handleClose, "aria-label": "Close modal", style: {
128
+ }, children: [title && (_jsx("h3", { className: cn(s['text-xl'], s['font-semibold'], s['m-0'], s['flex-1'], classNames.title), style: { color: headerTextColor, ...styles.title }, children: title })), isExpand && (_jsx("button", { type: "button", className: cn(s['p-1'], s['ml-4'], s['border-0'], s['bg-transparent'], s['cursor-pointer'], s['outline-none'], s['focus:outline-none'], s['transition-colors'], s['hover:bg-gray-100'], s['rounded'], classNames.expandButton), onClick: () => {
129
+ const next = !isExpanded;
130
+ setIsExpanded(next);
131
+ onExpand && onExpand(next);
132
+ }, "aria-label": isExpanded ? 'Collapse modal' : 'Expand modal', style: {
133
+ marginLeft: title ? '1rem' : 0,
134
+ ...styles.expandButton,
135
+ }, children: expandButton || (_jsx("span", { style: {
136
+ color: headerTextColor || '#1f2937',
137
+ height: '1.5rem',
138
+ width: '1.5rem',
139
+ display: 'flex',
140
+ alignItems: 'center',
141
+ justifyContent: 'center',
142
+ }, children: isExpanded ? (
143
+ // Collapse icon
144
+ _jsxs("svg", { xmlns: "http://www.w3.org/2000/svg", width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [_jsx("polyline", { points: "4 14 10 14 10 20" }), _jsx("polyline", { points: "20 10 14 10 14 4" }), _jsx("line", { x1: "10", y1: "14", x2: "3", y2: "21" }), _jsx("line", { x1: "21", y1: "3", x2: "14", y2: "10" })] })) : (
145
+ // Expand icon
146
+ _jsxs("svg", { xmlns: "http://www.w3.org/2000/svg", width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [_jsx("polyline", { points: "15 3 21 3 21 9" }), _jsx("polyline", { points: "9 21 3 21 3 15" }), _jsx("line", { x1: "21", y1: "3", x2: "14", y2: "10" }), _jsx("line", { x1: "3", y1: "21", x2: "10", y2: "14" })] })) })) })), showCloseButton && (_jsx("button", { type: "button", className: cn(s['p-1'], s['ml-4'], s['border-0'], s['bg-transparent'], s['cursor-pointer'], s['outline-none'], s['focus:outline-none'], s['transition-colors'], s['hover:bg-gray-100'], s['rounded'], classNames.closeButton), onClick: handleClose, "aria-label": "Close modal", style: {
110
147
  marginLeft: title ? '1rem' : 0,
111
148
  marginRight: title ? 0 : 'auto',
112
149
  ...styles.closeButton,
@@ -118,8 +155,10 @@ export const Modal = ({ visible, title = '', className = '', contentClassName =
118
155
  alignItems: 'center',
119
156
  justifyContent: 'center',
120
157
  lineHeight: 1,
121
- }, children: "\u00D7" })) }))] })), _jsx("div", { className: cn(s['flex'], s['flex-col'], s['w-full'], s['h-auto'], s['overflow-y-auto'], classNames.body), style: {
158
+ }, children: "\u00D7" })) }))] })), _jsx("div", { className: cn(s['flex'], s['flex-col'], s['w-full'], !isExpanded && s['h-auto'], s['overflow-y-auto'], classNames.body), style: {
122
159
  padding: contentPadding,
160
+ flex: isExpanded ? '1 1 0' : undefined,
161
+ minHeight: isExpanded ? 0 : undefined,
123
162
  ...styles.body,
124
163
  }, children: children })] }) }) })] }));
125
164
  };
@@ -14,6 +14,8 @@ export interface ModalClassNames {
14
14
  header?: string;
15
15
  /** Custom className for the title */
16
16
  title?: string;
17
+ /** Custom className for the expand button */
18
+ expandButton?: string;
17
19
  /** Custom className for the close button */
18
20
  closeButton?: string;
19
21
  /** Custom className for the body/children container */
@@ -32,6 +34,8 @@ export interface ModalStyles {
32
34
  header?: CSSProperties;
33
35
  /** Custom style for the title */
34
36
  title?: CSSProperties;
37
+ /** Custom style for the expand button */
38
+ expandButton?: CSSProperties;
35
39
  /** Custom style for the close button */
36
40
  closeButton?: CSSProperties;
37
41
  /** Custom style for the body/children container */
@@ -68,6 +72,12 @@ export interface ModalProps {
68
72
  showCloseButton?: boolean;
69
73
  /** Custom close button element */
70
74
  closeButton?: React.ReactNode;
75
+ /** Enable expand/collapse fullscreen button (shown before close button) */
76
+ isExpand?: boolean;
77
+ /** Custom expand button element */
78
+ expandButton?: React.ReactNode;
79
+ /** Callback fired when expand/collapse button is clicked; receives the new expanded state */
80
+ onExpand?: (isExpanded: boolean) => void;
71
81
  /** Overlay background opacity (0-1) */
72
82
  overlayOpacity?: number;
73
83
  /** Overlay background color */
@@ -55,7 +55,7 @@ const PrintIcon = () => (_jsxs("svg", { viewBox: "0 0 24 24", fill: "none", stro
55
55
  const ErrorIcon = () => (_jsxs("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", children: [_jsx("circle", { cx: "12", cy: "12", r: "10" }), _jsx("path", { d: "M12 8v4M12 16h.01", strokeLinecap: "round", strokeLinejoin: "round" })] }));
56
56
  const tableFilterCache = new Map();
57
57
  export const Table = forwardRef(function TableComponent(props, ref) {
58
- const { id, data, columns, keyField = '_id', loading = false, loadingIndicator, isLoading = false, pagination = true, paginationConfig, totalSize, remote = true, defaultSort, sort: controlledSort, filterable = false, defaultFilters, filters: controlledFilters, defaultShowFilters = true, showFilters: controlledShowFilters, onShowFiltersChange, showFilterToggle = true, searchable = true, searchPlaceholder = 'Search...', defaultSearchValue = '', searchValue: controlledSearchValue, searchDebounce = 300, rowSelection, expandable, editMode = 'dblclick', showEditIcon = false, onCellEdit, exportable = true, exportFileName = 'table_export', exportFormat = 'csv', columnToggle = false, isFieldSelector = true, bordered = true, striped = false, hover = true, compact = false, cellPadding, stickyHeader = false, maxHeight, rowClassName, rowStyle, classNames = {}, styles = {}, className, style, emptyText = 'No data available', onChange, onPageChange, onSortChange, onFilterChange, onSearch, onRowClick, onRowDoubleClick, onClearFilters, toolbar, hideToolbar = false, showFooter = false, caption,
58
+ const { id, data, columns, keyField = '_id', loading = false, loadingIndicator, isLoading = false, pagination = true, paginationConfig, totalSize, remote = true, defaultSort, sort: controlledSort, filterable = false, defaultFilters, filters: controlledFilters, defaultShowFilters = true, showFilters: controlledShowFilters, onShowFiltersChange, showFilterToggle = true, searchable = true, searchPlaceholder = 'Search...', defaultSearchValue = '', searchValue: controlledSearchValue, searchDebounce = 300, rowSelection, expandable, editMode = 'dblclick', showEditIcon = false, onCellEdit, exportable = true, exportFileName = 'table_export', exportFormat = 'excel', exportSheetName, exportHeaderStyle, exportExtraSheets, exportSummaryRows, exportCharts, columnToggle = false, isFieldSelector = true, bordered = true, striped = false, hover = true, compact = false, cellPadding, stickyHeader = false, maxHeight, rowClassName, rowStyle, classNames = {}, styles = {}, className, style, emptyText = 'No data available', onChange, onPageChange, onSortChange, onFilterChange, onSearch, onRowClick, onRowDoubleClick, onClearFilters, toolbar, hideToolbar = false, showFooter = false, caption,
59
59
  // Quick configuration props
60
60
  isDelete = false, isEditModify, isUpdate, isExport, isSelectRow, isSelectSort = false, onSelectSort, selectionActions, selectionHeaderActions, getNonSelectableRows, nonSelectableStyle, isView = false, fileName, hideExcelSheet = false,
61
61
  // Quick callbacks
@@ -184,8 +184,35 @@ export const Table = forwardRef(function TableComponent(props, ref) {
184
184
  const [toggleDragOverColumn, setToggleDragOverColumn] = useState(null);
185
185
  // Internal state for reordered columns (used in popup and for rendering)
186
186
  const [reorderedColumns, setReorderedColumns] = useState(columns);
187
- // Sync reorderedColumns when columns prop structure changes (columns added/removed)
188
- // We only reset when the actual column dataFields change, not on every reference change
187
+ // A stable string fingerprint built from every serialisable column property.
188
+ // Using a primitive (string) as the useEffect dependency means the effect only
189
+ // re-runs when the column *content* meaningfully changes — not merely because
190
+ // the caller re-created the columns array inline on every render.
191
+ // When the fingerprint does change we re-run the effect and update reorderedColumns
192
+ // with the full column objects (picking up formatters, filters, and all functions).
193
+ const columnsFingerprint = useMemo(() => columns
194
+ .map((c) => [
195
+ c.dataField,
196
+ c.text ?? '',
197
+ c.headerText ?? '',
198
+ c.hidden ? '1' : '0',
199
+ c.sort ? '1' : '0',
200
+ String(c.width ?? ''),
201
+ String(c.minWidth ?? ''),
202
+ String(c.maxWidth ?? ''),
203
+ c.align ?? '',
204
+ c.headerAlign ?? '',
205
+ // editable can be boolean or function; stringify the boolean branch only
206
+ typeof c.editable === 'boolean' ? (c.editable ? '1' : '0') : 'fn',
207
+ c.pinned ?? '',
208
+ c.csvExport !== false ? '1' : '0',
209
+ c.editorType ?? '',
210
+ ].join('|'))
211
+ .join('~'), [columns]);
212
+ // Sync reorderedColumns when columns prop changes.
213
+ // Depends on columnsFingerprint (a string primitive) rather than the columns
214
+ // array reference so that inline column arrays that get re-created on every
215
+ // render do not trigger an infinite setState → re-render → setState loop.
189
216
  useEffect(() => {
190
217
  const currentDataFields = reorderedColumns
191
218
  .map((c) => c.dataField)
@@ -196,14 +223,12 @@ export const Table = forwardRef(function TableComponent(props, ref) {
196
223
  .sort()
197
224
  .join(',');
198
225
  if (currentDataFields !== newDataFields) {
199
- // Columns structure changed - merge new columns while preserving order where possible
226
+ // Columns structure changed merge while preserving user-defined order
200
227
  const newColumnMap = new Map(columns.map((c) => [c.dataField, c]));
201
228
  const existingDataFields = new Set(reorderedColumns.map((c) => c.dataField));
202
- // Keep existing order for columns that still exist, update their data
203
229
  const preserved = reorderedColumns
204
230
  .filter((c) => newColumnMap.has(c.dataField))
205
231
  .map((c) => newColumnMap.get(c.dataField));
206
- // Add new columns at the end
207
232
  const added = columns.filter((c) => !existingDataFields.has(c.dataField));
208
233
  setReorderedColumns([...preserved, ...added]);
209
234
  // Clean up filter component cache for removed columns
@@ -215,11 +240,16 @@ export const Table = forwardRef(function TableComponent(props, ref) {
215
240
  }
216
241
  }
217
242
  else {
218
- // Same columns but maybe different data - update column data while preserving order
243
+ // Same column structure update all column data (including formatter,
244
+ // filter, csvFormatter, etc.) so that reorderable-table rendering always
245
+ // uses the latest column definitions.
246
+ // This branch is only reached when columnsFingerprint actually changed,
247
+ // so there is no risk of an infinite loop here.
219
248
  const columnMap = new Map(columns.map((c) => [c.dataField, c]));
220
- setReorderedColumns(reorderedColumns.map((c) => columnMap.get(c.dataField) || c));
249
+ setReorderedColumns(reorderedColumns.map((c) => columnMap.get(c.dataField) ?? c));
221
250
  }
222
- }, [columns]);
251
+ // eslint-disable-next-line react-hooks/exhaustive-deps
252
+ }, [columnsFingerprint]);
223
253
  // Close column toggle panel on outside click
224
254
  useEffect(() => {
225
255
  if (!columnToggleOpen)
@@ -943,7 +973,20 @@ export const Table = forwardRef(function TableComponent(props, ref) {
943
973
  });
944
974
  // Export based on format
945
975
  if (exportFormat === 'excel') {
946
- await exportToExcel(exportData, enhancedColumns, resolvedExportFileName);
976
+ await exportToExcel(exportData, enhancedColumns, resolvedExportFileName, {
977
+ sheetName: exportSheetName,
978
+ headerStyle: {
979
+ fill: { color: exportHeaderStyle?.backgroundColor },
980
+ font: {
981
+ color: exportHeaderStyle?.color,
982
+ bold: exportHeaderStyle?.bold,
983
+ size: exportHeaderStyle?.fontSize,
984
+ },
985
+ },
986
+ summaryRows: exportSummaryRows,
987
+ charts: exportCharts,
988
+ extraSheets: exportExtraSheets,
989
+ });
947
990
  }
948
991
  else {
949
992
  exportToCSV(exportData, enhancedColumns, resolvedExportFileName);
@@ -960,6 +1003,11 @@ export const Table = forwardRef(function TableComponent(props, ref) {
960
1003
  resolvedExportFileName,
961
1004
  resolvedRemote,
962
1005
  exportFormat,
1006
+ exportSheetName,
1007
+ exportHeaderStyle,
1008
+ exportSummaryRows,
1009
+ exportExtraSheets,
1010
+ exportCharts,
963
1011
  ]);
964
1012
  // Handle checkbox change
965
1013
  const handleCheckboxChange = useCallback((row, e) => {
@@ -1046,7 +1094,7 @@ export const Table = forwardRef(function TableComponent(props, ref) {
1046
1094
  ? JSON.stringify(value)
1047
1095
  : String(value)
1048
1096
  : '';
1049
- return (_jsxs(_Fragment, { children: [formatterContent, editorRendererCacheRef.current.get(cacheKey)] }));
1097
+ return (_jsx(_Fragment, { children: editorRendererCacheRef.current.get(cacheKey) }));
1050
1098
  }
1051
1099
  // Default editor
1052
1100
  return (_jsx(CellEditor, { type: column.editorType === 'number' ? 'number' : 'text', value: editValue ?? '', onChange: (e) => setEditValue(e.target.value), onBlur: () => handleCellEditComplete(row, rowIndex, column), onKeyDown: (e) => {
@@ -175,26 +175,31 @@ export const ResizeLine = styled.div `
175
175
  // ============================================================================
176
176
  // Hook: useColumnResize
177
177
  // ============================================================================
178
- export function useColumnResize({ columns, config = {}, enabled = true, tableId, }) {
179
- const { minWidth = 50, maxWidth = 800, autoFit = true, onResize, onResizeStart, onResizeEnd, defaultWidths = {}, handleColor, handleHoverColor, handleWidth = 4, } = config;
178
+ // Module-level stable defaults so that destructuring in the hook never creates
179
+ // new object references on every render (which would re-trigger useEffect deps).
180
+ const EMPTY_RESIZE_CONFIG = {};
181
+ const EMPTY_WIDTHS = {};
182
+ export function useColumnResize({ columns, config = EMPTY_RESIZE_CONFIG, enabled = true, tableId, }) {
183
+ const { minWidth = 50, maxWidth = 800, autoFit = true, onResize, onResizeStart, onResizeEnd, defaultWidths, handleColor, handleHoverColor, handleWidth = 4, } = config;
184
+ // Stable reference — when the caller doesn't provide defaultWidths, always
185
+ // use the same empty object so that useEffect dependencies remain unchanged.
186
+ const stableDefaultWidths = defaultWidths || EMPTY_WIDTHS;
180
187
  // Initialize column widths - Column-level width takes FIRST priority
181
188
  const initialWidths = useMemo(() => {
182
189
  const widths = {};
183
190
  columns.forEach((col) => {
184
- // Priority 1: Column-level width (user-defined in column)
185
191
  if (typeof col.width === 'number') {
186
192
  widths[col.dataField] = col.width;
187
193
  }
188
194
  else if (typeof col.width === 'string' && col.width.endsWith('px')) {
189
195
  widths[col.dataField] = parseInt(col.width, 10);
190
196
  }
191
- // Priority 2: defaultWidths from resizeConfig (only if column width not set)
192
- else if (defaultWidths[col.dataField]) {
193
- widths[col.dataField] = defaultWidths[col.dataField];
197
+ else if (stableDefaultWidths[col.dataField]) {
198
+ widths[col.dataField] = stableDefaultWidths[col.dataField];
194
199
  }
195
200
  });
196
201
  return widths;
197
- }, [columns, defaultWidths]);
202
+ }, [columns, stableDefaultWidths]);
198
203
  const [columnWidths, setColumnWidths] = useState(initialWidths);
199
204
  const [isResizing, setIsResizing] = useState(false);
200
205
  const [resizingColumn, setResizingColumn] = useState(null);
@@ -203,29 +208,32 @@ export function useColumnResize({ columns, config = {}, enabled = true, tableId,
203
208
  const startWidthRef = useRef(0);
204
209
  const currentColumnRef = useRef(null);
205
210
  const headerRefMap = useRef(new Map());
206
- // Update widths when columns change - Column-level width takes FIRST priority
211
+ // Update widths when columns change - Column-level width takes FIRST priority.
212
+ // Returns `prev` (same reference) when nothing was added so React skips the
213
+ // re-render and avoids an infinite setState → render → setState loop.
207
214
  useEffect(() => {
208
215
  setColumnWidths((prev) => {
216
+ let changed = false;
209
217
  const newWidths = { ...prev };
210
218
  columns.forEach((col) => {
211
- // Only add if not already set (user hasn't resized it)
212
219
  if (!(col.dataField in newWidths)) {
213
- // Priority 1: Column-level width
214
220
  if (typeof col.width === 'number') {
215
221
  newWidths[col.dataField] = col.width;
222
+ changed = true;
216
223
  }
217
224
  else if (typeof col.width === 'string' && col.width.endsWith('px')) {
218
225
  newWidths[col.dataField] = parseInt(col.width, 10);
226
+ changed = true;
219
227
  }
220
- // Priority 2: defaultWidths from resizeConfig
221
- else if (defaultWidths[col.dataField]) {
222
- newWidths[col.dataField] = defaultWidths[col.dataField];
228
+ else if (stableDefaultWidths[col.dataField]) {
229
+ newWidths[col.dataField] = stableDefaultWidths[col.dataField];
230
+ changed = true;
223
231
  }
224
232
  }
225
233
  });
226
- return newWidths;
234
+ return changed ? newWidths : prev;
227
235
  });
228
- }, [columns, defaultWidths]);
236
+ }, [columns, stableDefaultWidths]);
229
237
  // Handle mouse move during resize
230
238
  const handleMouseMove = useCallback((e) => {
231
239
  if (!currentColumnRef.current)
@@ -1,5 +1,5 @@
1
1
  /// <reference types="react" />
2
- import { TableColumn, TableSortState, SortDirection, TableFilterState } from './types';
2
+ import { TableColumn, TableSortState, SortDirection, TableFilterState, ExportExtraSheet, ExportSummaryRow, ExportChart } from './types';
3
3
  /**
4
4
  * Debounce function for table
5
5
  */
@@ -105,7 +105,13 @@ export declare function getNestedValue(obj: any, path: string): any;
105
105
  */
106
106
  export declare function exportToCSV<T>(data: T[], columns: TableColumn<T>[], fileName: string): void;
107
107
  /**
108
- * Export data to Excel (.xlsx) - loads ExcelJS dynamically from CDN
108
+ * Export data to Excel (.xlsx) - loads ExcelJS dynamically from CDN.
109
+ *
110
+ * Supports:
111
+ * - Custom header styles
112
+ * - Summary rows at the bottom of the main sheet
113
+ * - Extra sheets (Sheet2, Sheet3 …) each with their own data / columns /
114
+ * header styles / summary rows
109
115
  */
110
116
  export declare function exportToExcel<T>(data: T[], columns: TableColumn<T>[], fileName: string, options?: {
111
117
  sheetName?: string;
@@ -119,4 +125,10 @@ export declare function exportToExcel<T>(data: T[], columns: TableColumn<T>[], f
119
125
  color?: string;
120
126
  };
121
127
  };
128
+ /** Summary rows appended at the bottom of the main sheet */
129
+ summaryRows?: ExportSummaryRow[];
130
+ /** Charts embedded after data + summary rows on the main sheet */
131
+ charts?: ExportChart[];
132
+ /** Extra worksheets to add after the main sheet */
133
+ extraSheets?: ExportExtraSheet[];
122
134
  }): Promise<void>;
@@ -467,55 +467,450 @@ async function loadExcelJS() {
467
467
  document.head.appendChild(script);
468
468
  });
469
469
  }
470
+ // ---------------------------------------------------------------------------
471
+ // Internal helpers for ExcelJS styling
472
+ // ---------------------------------------------------------------------------
473
+ // ─── Canvas chart renderer (no external dependencies) ───────────────────────
474
+ const CHART_PALETTE = [
475
+ '#3b82f6', '#10b981', '#f59e0b', '#ef4444', '#8b5cf6',
476
+ '#06b6d4', '#f97316', '#84cc16', '#ec4899', '#6366f1',
477
+ ];
478
+ function resolveChartColor(colorProp, index) {
479
+ if (Array.isArray(colorProp)) {
480
+ return colorProp[index % colorProp.length] ?? CHART_PALETTE[index % CHART_PALETTE.length];
481
+ }
482
+ return colorProp ?? CHART_PALETTE[index % CHART_PALETTE.length];
483
+ }
484
+ /** Draw a horizontal legend row at the bottom of the canvas */
485
+ function drawChartLegend(ctx, labels, colors, canvasW, canvasH, legendAreaH) {
486
+ const boxSize = 10;
487
+ const colCount = Math.max(1, Math.floor(canvasW / 130));
488
+ const startX = 16;
489
+ const startY = canvasH - legendAreaH + 8;
490
+ ctx.font = '10px Arial, sans-serif';
491
+ labels.forEach((label, i) => {
492
+ const col = i % colCount;
493
+ const row = Math.floor(i / colCount);
494
+ const x = startX + col * Math.floor(canvasW / colCount);
495
+ const y = startY + row * 16;
496
+ ctx.fillStyle = colors[i] ?? CHART_PALETTE[i % CHART_PALETTE.length];
497
+ ctx.fillRect(x, y, boxSize, boxSize);
498
+ ctx.fillStyle = '#374151';
499
+ ctx.textAlign = 'left';
500
+ const txt = label.length > 15 ? label.slice(0, 14) + '…' : label;
501
+ ctx.fillText(txt, x + boxSize + 4, y + 9);
502
+ });
503
+ }
504
+ /** Y-axis grid lines + labels shared by bar and line charts */
505
+ function drawYGrid(ctx, ax, ay, aw, ah, maxV) {
506
+ ctx.font = '10px Arial, sans-serif';
507
+ for (let gi = 0; gi <= 5; gi++) {
508
+ const val = (maxV * gi) / 5;
509
+ const y = ay + ah - (val / maxV) * ah;
510
+ ctx.strokeStyle = '#e5e7eb';
511
+ ctx.lineWidth = 1;
512
+ ctx.setLineDash([3, 3]);
513
+ ctx.beginPath();
514
+ ctx.moveTo(ax, y);
515
+ ctx.lineTo(ax + aw, y);
516
+ ctx.stroke();
517
+ ctx.setLineDash([]);
518
+ ctx.fillStyle = '#6b7280';
519
+ ctx.textAlign = 'right';
520
+ const lbl = val >= 1000 ? `${(val / 1000).toFixed(1)}k` : val.toFixed(0);
521
+ ctx.fillText(lbl, ax - 6, y + 4);
522
+ }
523
+ }
524
+ /** Draw the L-shaped axis lines */
525
+ function drawAxes(ctx, ax, ay, aw, ah) {
526
+ ctx.strokeStyle = '#9ca3af';
527
+ ctx.lineWidth = 1.5;
528
+ ctx.setLineDash([]);
529
+ ctx.beginPath();
530
+ ctx.moveTo(ax, ay);
531
+ ctx.lineTo(ax, ay + ah);
532
+ ctx.lineTo(ax + aw, ay + ah);
533
+ ctx.stroke();
534
+ }
535
+ function drawBarChart(ctx, W, H, chart, titleH) {
536
+ const legendH = 28;
537
+ const pd = { top: titleH + 10, right: 24, bottom: legendH + 42, left: 64 };
538
+ const ax = pd.left, ay = pd.top;
539
+ const aw = W - pd.left - pd.right;
540
+ const ah = H - pd.top - pd.bottom;
541
+ const { labels, datasets } = chart;
542
+ if (!labels.length || !datasets.length)
543
+ return;
544
+ const allVals = datasets.flatMap(d => d.values ?? []).filter(isFinite);
545
+ const maxV = Math.max(...allVals, 0) || 1;
546
+ const N = labels.length;
547
+ const D = datasets.length;
548
+ const gW = aw / N;
549
+ const bPad = gW * 0.12;
550
+ const bW = Math.max(4, (gW - bPad * 2) / D);
551
+ drawYGrid(ctx, ax, ay, aw, ah, maxV);
552
+ datasets.forEach((ds, di) => {
553
+ const color = resolveChartColor(ds.backgroundColor ?? ds.color, di);
554
+ (ds.values ?? []).forEach((val, li) => {
555
+ if (li >= N)
556
+ return;
557
+ const bH = Math.max(0, (val / maxV) * ah);
558
+ const x = ax + li * gW + bPad + di * bW;
559
+ const y = ay + ah - bH;
560
+ ctx.fillStyle = color;
561
+ ctx.fillRect(x, y, bW - 2, bH);
562
+ });
563
+ });
564
+ drawAxes(ctx, ax, ay, aw, ah);
565
+ ctx.fillStyle = '#374151';
566
+ ctx.font = '10px Arial, sans-serif';
567
+ ctx.textAlign = 'center';
568
+ labels.forEach((label, li) => {
569
+ const x = ax + li * gW + gW / 2;
570
+ const maxCh = Math.max(3, Math.floor(gW / 7));
571
+ const txt = label.length > maxCh ? label.slice(0, maxCh - 1) + '…' : label;
572
+ ctx.fillText(txt, x, ay + ah + 16);
573
+ });
574
+ drawChartLegend(ctx, datasets.map(d => d.label), datasets.map((ds, i) => resolveChartColor(ds.backgroundColor ?? ds.color, i)), W, H, legendH);
575
+ }
576
+ function drawLineChart(ctx, W, H, chart, titleH) {
577
+ const legendH = 28;
578
+ const pd = { top: titleH + 10, right: 24, bottom: legendH + 42, left: 64 };
579
+ const ax = pd.left, ay = pd.top;
580
+ const aw = W - pd.left - pd.right;
581
+ const ah = H - pd.top - pd.bottom;
582
+ const { labels, datasets } = chart;
583
+ if (!labels.length || !datasets.length)
584
+ return;
585
+ const allVals = datasets.flatMap(d => d.values ?? []).filter(isFinite);
586
+ const maxV = Math.max(...allVals, 0) || 1;
587
+ const N = labels.length;
588
+ const stepX = N > 1 ? aw / (N - 1) : aw;
589
+ drawYGrid(ctx, ax, ay, aw, ah, maxV);
590
+ datasets.forEach((ds, di) => {
591
+ const color = resolveChartColor(ds.color, di);
592
+ const pts = (ds.values ?? []).slice(0, N).map((val, li) => ({
593
+ x: ax + li * stepX,
594
+ y: ay + ah - (Math.max(0, val) / maxV) * ah,
595
+ }));
596
+ if (!pts.length)
597
+ return;
598
+ ctx.strokeStyle = color;
599
+ ctx.lineWidth = 2.5;
600
+ ctx.setLineDash([]);
601
+ ctx.beginPath();
602
+ pts.forEach((pt, i) => (i === 0 ? ctx.moveTo(pt.x, pt.y) : ctx.lineTo(pt.x, pt.y)));
603
+ ctx.stroke();
604
+ pts.forEach(pt => {
605
+ ctx.fillStyle = '#ffffff';
606
+ ctx.beginPath();
607
+ ctx.arc(pt.x, pt.y, 4.5, 0, Math.PI * 2);
608
+ ctx.fill();
609
+ ctx.fillStyle = color;
610
+ ctx.beginPath();
611
+ ctx.arc(pt.x, pt.y, 3, 0, Math.PI * 2);
612
+ ctx.fill();
613
+ });
614
+ });
615
+ drawAxes(ctx, ax, ay, aw, ah);
616
+ ctx.fillStyle = '#374151';
617
+ ctx.font = '10px Arial, sans-serif';
618
+ ctx.textAlign = 'center';
619
+ labels.forEach((label, li) => {
620
+ const x = ax + li * stepX;
621
+ const maxCh = Math.max(3, Math.floor(stepX / 7));
622
+ const txt = label.length > maxCh ? label.slice(0, maxCh - 1) + '…' : label;
623
+ ctx.fillText(txt, x, ay + ah + 16);
624
+ });
625
+ drawChartLegend(ctx, datasets.map(d => d.label), datasets.map((ds, i) => resolveChartColor(ds.color, i)), W, H, legendH);
626
+ }
627
+ function drawPieChart(ctx, W, H, chart, isDoughnut, titleH) {
628
+ const ds = chart.datasets[0];
629
+ const values = ds?.values ?? [];
630
+ const total = values.reduce((s, v) => s + v, 0);
631
+ if (!total)
632
+ return;
633
+ const cols = Math.min(values.length, 3);
634
+ const legendRows = Math.ceil(values.length / cols);
635
+ const legendAreaH = legendRows * 16 + 14;
636
+ const chartAreaH = H - titleH - legendAreaH;
637
+ const cx = W / 2;
638
+ const cy = titleH + chartAreaH / 2;
639
+ const R = Math.min(W * 0.38, chartAreaH * 0.46);
640
+ const innerR = isDoughnut ? R * 0.55 : 0;
641
+ const sliceColors = values.map((_, i) => CHART_PALETTE[i % CHART_PALETTE.length]);
642
+ let startAngle = -Math.PI / 2;
643
+ values.forEach((val, i) => {
644
+ const sweep = (val / total) * 2 * Math.PI;
645
+ ctx.fillStyle = sliceColors[i];
646
+ ctx.beginPath();
647
+ ctx.moveTo(cx, cy);
648
+ ctx.arc(cx, cy, R, startAngle, startAngle + sweep);
649
+ ctx.closePath();
650
+ ctx.fill();
651
+ ctx.strokeStyle = '#ffffff';
652
+ ctx.lineWidth = 2;
653
+ ctx.stroke();
654
+ startAngle += sweep;
655
+ });
656
+ if (isDoughnut) {
657
+ ctx.fillStyle = '#ffffff';
658
+ ctx.beginPath();
659
+ ctx.arc(cx, cy, innerR, 0, 2 * Math.PI);
660
+ ctx.fill();
661
+ ctx.fillStyle = '#374151';
662
+ ctx.textAlign = 'center';
663
+ ctx.font = 'bold 11px Arial, sans-serif';
664
+ ctx.fillText('Total', cx, cy - 5);
665
+ ctx.font = '11px Arial, sans-serif';
666
+ const totLabel = total >= 1000 ? `${(total / 1000).toFixed(1)}k` : String(total);
667
+ ctx.fillText(totLabel, cx, cy + 11);
668
+ }
669
+ // Legend
670
+ const startY = H - legendAreaH + 6;
671
+ const itemW = W / cols;
672
+ values.forEach((val, i) => {
673
+ const col = i % cols;
674
+ const row = Math.floor(i / cols);
675
+ const lx = col * itemW + 16;
676
+ const ly = startY + row * 16;
677
+ const pct = ((val / total) * 100).toFixed(1);
678
+ const rawLabel = chart.labels[i] ?? `Item ${i + 1}`;
679
+ const label = rawLabel.length > 16 ? rawLabel.slice(0, 15) + '…' : rawLabel;
680
+ ctx.fillStyle = sliceColors[i];
681
+ ctx.fillRect(lx, ly, 10, 10);
682
+ ctx.fillStyle = '#374151';
683
+ ctx.textAlign = 'left';
684
+ ctx.font = '10px Arial, sans-serif';
685
+ ctx.fillText(`${label}: ${pct}%`, lx + 14, ly + 9);
686
+ });
687
+ }
688
+ /**
689
+ * Render an ExportChart to a PNG base64 string using the browser Canvas API.
690
+ * Returns an empty string if called outside a browser (e.g. SSR).
691
+ */
692
+ async function generateChartBase64(chart) {
693
+ if (typeof document === 'undefined')
694
+ return '';
695
+ const W = chart.width ?? 600;
696
+ const H = chart.height ?? 350;
697
+ const canvas = document.createElement('canvas');
698
+ canvas.width = W;
699
+ canvas.height = H;
700
+ const ctx = canvas.getContext('2d');
701
+ if (!ctx)
702
+ return '';
703
+ ctx.fillStyle = '#ffffff';
704
+ ctx.fillRect(0, 0, W, H);
705
+ ctx.strokeStyle = '#e5e7eb';
706
+ ctx.lineWidth = 1;
707
+ ctx.strokeRect(0.5, 0.5, W - 1, H - 1);
708
+ let titleH = 10;
709
+ if (chart.title) {
710
+ titleH = 34;
711
+ ctx.fillStyle = '#111827';
712
+ ctx.font = 'bold 14px Arial, sans-serif';
713
+ ctx.textAlign = 'center';
714
+ ctx.fillText(chart.title, W / 2, 22);
715
+ }
716
+ switch (chart.type) {
717
+ case 'bar':
718
+ drawBarChart(ctx, W, H, chart, titleH);
719
+ break;
720
+ case 'line':
721
+ drawLineChart(ctx, W, H, chart, titleH);
722
+ break;
723
+ case 'pie':
724
+ drawPieChart(ctx, W, H, chart, false, titleH);
725
+ break;
726
+ case 'doughnut':
727
+ drawPieChart(ctx, W, H, chart, true, titleH);
728
+ break;
729
+ }
730
+ return canvas.toDataURL('image/png').replace('data:image/png;base64,', '');
731
+ }
470
732
  /**
471
- * Export data to Excel (.xlsx) - loads ExcelJS dynamically from CDN
733
+ * Embed ExportChart images into an ExcelJS worksheet below afterRowIndex.
734
+ * Charts are stacked vertically when multiple are provided.
735
+ */
736
+ async function addChartsToWorksheet(workbook, worksheet, charts, afterRowIndex) {
737
+ let nextRow = afterRowIndex;
738
+ for (const chart of charts) {
739
+ const base64 = await generateChartBase64(chart);
740
+ if (!base64)
741
+ continue;
742
+ const imageId = workbook.addImage({ base64, extension: 'png' });
743
+ const startRow = nextRow + (chart.rowOffset ?? 2);
744
+ const startCol = chart.colOffset ?? 0;
745
+ const rowSpan = chart.rowSpan ?? 20;
746
+ const colSpan = chart.colSpan ?? 8;
747
+ worksheet.addImage(imageId, {
748
+ tl: { col: startCol, row: startRow },
749
+ br: { col: startCol + colSpan, row: startRow + rowSpan },
750
+ editAs: 'oneCell',
751
+ });
752
+ nextRow = startRow + rowSpan;
753
+ }
754
+ }
755
+ function toArgb(hex, fallback) {
756
+ return `FF${(hex ?? fallback).replace('#', '').toUpperCase().padStart(6, '0')}`;
757
+ }
758
+ /**
759
+ * Write a block of rows (data + column definitions) into an ExcelJS worksheet.
760
+ * Returns the 1-based index of the last written row.
761
+ */
762
+ function writeSheetData(worksheet, exportColumns, data, headerStyle) {
763
+ const cols = exportColumns.filter((c) => c.csvExport !== false);
764
+ worksheet.columns = cols.map((col) => ({
765
+ header: col.text,
766
+ key: col.dataField,
767
+ width: Math.max(col.text.length + 5, 15),
768
+ }));
769
+ // Style the header row
770
+ const headerRow = worksheet.getRow(1);
771
+ headerRow.font = {
772
+ bold: headerStyle?.font?.bold ?? true,
773
+ size: headerStyle?.font?.size ?? 12,
774
+ color: { argb: toArgb(headerStyle?.font?.color, '#FFFFFF') },
775
+ };
776
+ headerRow.fill = {
777
+ type: 'pattern',
778
+ pattern: 'solid',
779
+ fgColor: { argb: toArgb(headerStyle?.fill?.color, '#6b7280') },
780
+ };
781
+ headerRow.commit();
782
+ // Write data rows
783
+ data.forEach((row, rowIndex) => {
784
+ const rowData = {};
785
+ cols.forEach((col) => {
786
+ const raw = getNestedValue(row, col.dataField);
787
+ const value = col.csvFormatter ? col.csvFormatter(raw, row, rowIndex) : raw;
788
+ if (value === null || value === undefined) {
789
+ rowData[col.dataField] = '';
790
+ }
791
+ else if (typeof value === 'object') {
792
+ rowData[col.dataField] = JSON.stringify(value);
793
+ }
794
+ else {
795
+ rowData[col.dataField] = value;
796
+ }
797
+ });
798
+ worksheet.addRow(rowData);
799
+ });
800
+ // Return index of last data row (1-indexed header + data rows)
801
+ return 1 + data.length;
802
+ }
803
+ /**
804
+ * Append ExportSummaryRow entries after the last data row of a worksheet.
805
+ */
806
+ function writeSummaryRows(worksheet, exportColumns, summaryRows, lastDataRowIndex) {
807
+ const cols = exportColumns.filter((c) => c.csvExport !== false);
808
+ summaryRows.forEach((summaryRow, si) => {
809
+ const rowData = {};
810
+ cols.forEach((col) => {
811
+ rowData[col.dataField] = summaryRow.values[col.dataField] ?? '';
812
+ });
813
+ const excelRow = worksheet.addRow(rowData);
814
+ const excelRowIndex = lastDataRowIndex + si + 1;
815
+ // Row-level styling defaults
816
+ const rowBg = summaryRow.backgroundColor;
817
+ const rowColor = summaryRow.color;
818
+ const rowBold = summaryRow.bold;
819
+ const rowFontSize = summaryRow.fontSize;
820
+ cols.forEach((col) => {
821
+ const cell = excelRow.getCell(col.dataField);
822
+ const cellOverride = summaryRow.cellStyles?.[col.dataField];
823
+ // Fill (background)
824
+ const bg = cellOverride?.backgroundColor ?? rowBg;
825
+ if (bg) {
826
+ cell.fill = {
827
+ type: 'pattern',
828
+ pattern: 'solid',
829
+ fgColor: { argb: toArgb(bg, bg) },
830
+ };
831
+ }
832
+ // Font
833
+ const fontColor = cellOverride?.color ?? rowColor;
834
+ const isBold = cellOverride?.bold ?? rowBold;
835
+ const fontSize = cellOverride?.fontSize ?? rowFontSize;
836
+ if (fontColor !== undefined || isBold !== undefined || fontSize !== undefined) {
837
+ cell.font = {
838
+ ...(isBold !== undefined ? { bold: isBold } : {}),
839
+ ...(fontSize !== undefined ? { size: fontSize } : {}),
840
+ ...(fontColor ? { color: { argb: toArgb(fontColor, fontColor) } } : {}),
841
+ };
842
+ }
843
+ // Number format
844
+ if (cellOverride?.numFmt) {
845
+ cell.numFmt = cellOverride.numFmt;
846
+ }
847
+ // Alignment
848
+ const align = cellOverride?.align;
849
+ if (align) {
850
+ cell.alignment = { horizontal: align };
851
+ }
852
+ });
853
+ excelRow.commit();
854
+ void excelRowIndex; // suppress unused-var warning
855
+ });
856
+ }
857
+ /**
858
+ * Export data to Excel (.xlsx) - loads ExcelJS dynamically from CDN.
859
+ *
860
+ * Supports:
861
+ * - Custom header styles
862
+ * - Summary rows at the bottom of the main sheet
863
+ * - Extra sheets (Sheet2, Sheet3 …) each with their own data / columns /
864
+ * header styles / summary rows
472
865
  */
473
866
  export async function exportToExcel(data, columns, fileName, options) {
474
867
  try {
475
868
  const ExcelJS = await loadExcelJS();
476
869
  const workbook = new ExcelJS.Workbook();
870
+ // -----------------------------------------------------------------------
871
+ // Main sheet
872
+ // -----------------------------------------------------------------------
477
873
  const worksheet = workbook.addWorksheet(options?.sheetName || 'Sheet1');
478
- const exportColumns = columns.filter((c) => c.csvExport !== false);
479
- // Set up columns with headers
480
- worksheet.columns = exportColumns.map((col) => ({
481
- header: col.text,
482
- key: col.dataField,
483
- width: Math.max(col.text.length + 5, 15),
484
- }));
485
- // Style header row
486
- const headerRow = worksheet.getRow(1);
487
- headerRow.font = {
488
- bold: options?.headerStyle?.font?.bold ?? true,
489
- size: options?.headerStyle?.font?.size ?? 12,
490
- };
491
- if (options?.headerStyle?.fill?.color) {
492
- headerRow.fill = {
493
- type: 'pattern',
494
- pattern: 'solid',
495
- fgColor: { argb: options.headerStyle.fill.color.replace('#', '') },
496
- };
874
+ const lastDataRow = writeSheetData(worksheet, columns, data, options?.headerStyle);
875
+ let afterMainRow = lastDataRow;
876
+ if (options?.summaryRows?.length) {
877
+ writeSummaryRows(worksheet, columns, options.summaryRows, lastDataRow);
878
+ afterMainRow = lastDataRow + options.summaryRows.length;
497
879
  }
498
- headerRow.commit();
499
- // Add data rows
500
- data.forEach((row, rowIndex) => {
501
- const rowData = {};
502
- exportColumns.forEach((col) => {
503
- const value = col.csvFormatter
504
- ? col.csvFormatter(getNestedValue(row, col.dataField), row, rowIndex)
505
- : getNestedValue(row, col.dataField);
506
- if (value === null || value === undefined) {
507
- rowData[col.dataField] = '';
508
- }
509
- else if (typeof value === 'object') {
510
- rowData[col.dataField] = JSON.stringify(value);
880
+ if (options?.charts?.length) {
881
+ await addChartsToWorksheet(workbook, worksheet, options.charts, afterMainRow);
882
+ }
883
+ // -----------------------------------------------------------------------
884
+ // Extra sheets (for...of so each async chart render is awaited in order)
885
+ // -----------------------------------------------------------------------
886
+ if (options?.extraSheets?.length) {
887
+ for (const [idx, sheet] of options.extraSheets.entries()) {
888
+ const sheetName = sheet.name || `Sheet${idx + 2}`;
889
+ const extraWs = workbook.addWorksheet(sheetName);
890
+ const extraHeaderStyle = sheet.headerStyle
891
+ ? {
892
+ font: {
893
+ bold: sheet.headerStyle.bold,
894
+ color: sheet.headerStyle.color,
895
+ size: sheet.headerStyle.fontSize,
896
+ },
897
+ fill: { color: sheet.headerStyle.backgroundColor },
898
+ }
899
+ : undefined;
900
+ const lastExtra = writeSheetData(extraWs, sheet.columns, sheet.data, extraHeaderStyle);
901
+ let afterExtra = lastExtra;
902
+ if (sheet.summaryRows?.length) {
903
+ writeSummaryRows(extraWs, sheet.columns, sheet.summaryRows, lastExtra);
904
+ afterExtra = lastExtra + sheet.summaryRows.length;
511
905
  }
512
- else {
513
- rowData[col.dataField] = value;
906
+ if (sheet.charts?.length) {
907
+ await addChartsToWorksheet(workbook, extraWs, sheet.charts, afterExtra);
514
908
  }
515
- });
516
- worksheet.addRow(rowData);
517
- });
909
+ }
910
+ }
911
+ // -----------------------------------------------------------------------
518
912
  // Generate and download
913
+ // -----------------------------------------------------------------------
519
914
  const buffer = await workbook.xlsx.writeBuffer();
520
915
  const blob = new Blob([buffer], {
521
916
  type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
@@ -529,7 +924,6 @@ export async function exportToExcel(data, columns, fileName, options) {
529
924
  }
530
925
  catch (error) {
531
926
  console.error('Excel export failed:', error);
532
- // Fallback to CSV if Excel export fails
533
927
  console.warn('Falling back to CSV export');
534
928
  exportToCSV(data, columns, fileName);
535
929
  }
@@ -1,6 +1,111 @@
1
1
  import React, { CSSProperties } from 'react';
2
2
  /** Sort direction */
3
3
  export type SortDirection = 'asc' | 'desc' | null;
4
+ /**
5
+ * A summary row appended at the bottom of the main exported sheet.
6
+ * Values are keyed by column dataField. Optional per-cell and row-level
7
+ * style overrides are passed straight to ExcelJS.
8
+ */
9
+ export interface ExportSummaryRow {
10
+ /** Cell values keyed by column dataField */
11
+ values: Record<string, any>;
12
+ /** Row-level fill color (hex, e.g. '#1e40af') */
13
+ backgroundColor?: string;
14
+ /** Row-level text color (hex) */
15
+ color?: string;
16
+ /** Row-level bold override */
17
+ bold?: boolean;
18
+ /** Row-level font size override */
19
+ fontSize?: number;
20
+ /** Per-cell style overrides, keyed by dataField */
21
+ cellStyles?: Record<string, {
22
+ backgroundColor?: string;
23
+ color?: string;
24
+ bold?: boolean;
25
+ fontSize?: number;
26
+ /** ExcelJS numFmt string, e.g. '#,##0.00' */
27
+ numFmt?: string;
28
+ /** Horizontal alignment */
29
+ align?: 'left' | 'center' | 'right';
30
+ }>;
31
+ }
32
+ /** A single data series inside an ExportChart */
33
+ export interface ExportChartDataset {
34
+ /** Legend label for this series */
35
+ label: string;
36
+ /** Numeric values — one per label */
37
+ values: number[];
38
+ /**
39
+ * Line / bar fill colour.
40
+ * Pass a single hex string for a uniform colour, or an array for per-bar /
41
+ * per-slice colours (most useful for pie / doughnut charts).
42
+ */
43
+ color?: string | string[];
44
+ /** Alias for color — mirrors Chart.js naming */
45
+ backgroundColor?: string | string[];
46
+ }
47
+ export type ExportChartType = 'bar' | 'line' | 'pie' | 'doughnut';
48
+ /**
49
+ * A chart to embed in an exported Excel sheet.
50
+ * Rendered at export time via the browser Canvas 2D API — no extra
51
+ * dependencies are required.
52
+ */
53
+ export interface ExportChart {
54
+ /** Chart variety */
55
+ type: ExportChartType;
56
+ /** Optional title drawn above the plot area */
57
+ title?: string;
58
+ /** X-axis tick labels (or pie / doughnut slice labels) */
59
+ labels: string[];
60
+ /** One or more data series */
61
+ datasets: ExportChartDataset[];
62
+ /** Canvas render width in pixels (default: 600) */
63
+ width?: number;
64
+ /** Canvas render height in pixels (default: 350) */
65
+ height?: number;
66
+ /**
67
+ * Gap rows between the last data / summary row and the chart top-left.
68
+ * Default: 2
69
+ */
70
+ rowOffset?: number;
71
+ /** 0-indexed column where the chart's left edge is anchored. Default: 0 */
72
+ colOffset?: number;
73
+ /** Number of Excel columns the chart spans. Default: 8 */
74
+ colSpan?: number;
75
+ /** Number of Excel rows the chart spans. Default: 20 */
76
+ rowSpan?: number;
77
+ }
78
+ /**
79
+ * An additional worksheet to append to the exported Excel file at runtime.
80
+ * Sheet2, Sheet3, etc.
81
+ */
82
+ export interface ExportExtraSheet<T = any> {
83
+ /** Sheet tab name */
84
+ name: string;
85
+ /** Rows of data to write */
86
+ data: T[];
87
+ /** Column definitions (subset of TableColumn) */
88
+ columns: Array<{
89
+ dataField: string;
90
+ text: string;
91
+ csvFormatter?: (cell: any, row: T, rowIndex: number) => string;
92
+ csvExport?: boolean;
93
+ }>;
94
+ /** Optional header style for this sheet */
95
+ headerStyle?: {
96
+ backgroundColor?: string;
97
+ color?: string;
98
+ bold?: boolean;
99
+ fontSize?: number;
100
+ };
101
+ /** Optional summary rows appended at the bottom of this extra sheet */
102
+ summaryRows?: ExportSummaryRow[];
103
+ /**
104
+ * Charts to embed in this sheet after the data table and summary rows.
105
+ * Rendered via the browser Canvas 2D API — bar, line, pie, or doughnut.
106
+ */
107
+ charts?: ExportChart[];
108
+ }
4
109
  /** Filter type */
5
110
  export type FilterType = 'text' | 'number' | 'date' | 'dateRange' | 'select' | 'custom';
6
111
  /** Row selection mode */
@@ -390,8 +495,41 @@ export interface TableProps<T = any> {
390
495
  exportable?: boolean;
391
496
  /** Export file name */
392
497
  exportFileName?: string;
393
- /** Export format: 'csv' (default) or 'excel' */
498
+ /** Export format: 'excel' (default) or 'csv' */
394
499
  exportFormat?: 'csv' | 'excel';
500
+ /** Sheet name used when exporting to Excel */
501
+ exportSheetName?: string;
502
+ /**
503
+ * Style applied to the header row of the exported Excel file.
504
+ * Defaults: gray background (#6b7280), white text, bold, size 12.
505
+ */
506
+ exportHeaderStyle?: {
507
+ /** Header cell background color (hex, e.g. '#1e40af') */
508
+ backgroundColor?: string;
509
+ /** Header cell text color (hex, e.g. '#ffffff') */
510
+ color?: string;
511
+ /** Bold header text (default: true) */
512
+ bold?: boolean;
513
+ /** Header font size (default: 12) */
514
+ fontSize?: number;
515
+ };
516
+ /**
517
+ * Extra worksheets to include in the exported Excel file (Sheet2, Sheet3 …).
518
+ * Each sheet can have its own data, columns, header style, and summary rows.
519
+ * Evaluated at export time so the caller can supply fresh data reactively.
520
+ */
521
+ exportExtraSheets?: ExportExtraSheet[];
522
+ /**
523
+ * Summary rows appended at the bottom of the main data sheet.
524
+ * Useful for totals, averages, or any other aggregated values.
525
+ * Each row can carry per-cell and row-level style overrides.
526
+ */
527
+ exportSummaryRows?: ExportSummaryRow[];
528
+ /**
529
+ * Charts to embed in the main exported sheet after data and summary rows.
530
+ * Rendered via the browser Canvas 2D API — bar, line, pie, or doughnut.
531
+ */
532
+ exportCharts?: ExportChart[];
395
533
  /** Enable column toggle */
396
534
  columnToggle?: boolean;
397
535
  /** Enable Show/Hide Columns (field selector) - controls column visibility panel (default: true) */
@@ -65,4 +65,14 @@
65
65
  /*! tailwindcss v3.4.19 | MIT License | https://tailwindcss.com*/
66
66
  /*! tailwindcss v3.4.19 | MIT License | https://tailwindcss.com*/
67
67
  /*! tailwindcss v3.4.19 | MIT License | https://tailwindcss.com*/
68
+ /*! tailwindcss v3.4.19 | MIT License | https://tailwindcss.com*/
69
+ /*! tailwindcss v3.4.19 | MIT License | https://tailwindcss.com*/
70
+ /*! tailwindcss v3.4.19 | MIT License | https://tailwindcss.com*/
71
+ /*! tailwindcss v3.4.19 | MIT License | https://tailwindcss.com*/
72
+ /*! tailwindcss v3.4.19 | MIT License | https://tailwindcss.com*/
73
+ /*! tailwindcss v3.4.19 | MIT License | https://tailwindcss.com*/
74
+ /*! tailwindcss v3.4.19 | MIT License | https://tailwindcss.com*/
75
+ /*! tailwindcss v3.4.19 | MIT License | https://tailwindcss.com*/
76
+ /*! tailwindcss v3.4.19 | MIT License | https://tailwindcss.com*/
77
+ /*! tailwindcss v3.4.19 | MIT License | https://tailwindcss.com*/
68
78
  /*! tailwindcss v3.4.19 | MIT License | https://tailwindcss.com*/.\!filter,.backdrop-blur-sm,.blur,.ring,.ring-2,.shadow,.shadow-inner,body{font-family:Arima Regular;font-size:14px}.dark\:bg-black:is(.dark *),.dark\:border-gray-600:is(.dark *){--tw-bg-opacity:1;background-color:rgb(0 0 0/var(--tw-bg-opacity,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:#3b82f680;--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:#3b82f680;--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*/fieldset,legend{padding:0}.container{width:100%}@media (min-width:0px){.container{max-width:0}}@media (min-width:20rem){.container{max-width:20rem}}@media (min-width:23.4375rem){.container{max-width:23.4375rem}}@media (min-width:48rem){.container{max-width:48rem}}@media (min-width:64rem){.container{max-width:64rem}}@media (min-width:80rem){.container{max-width:80rem}}@media (min-width:90rem){.container{max-width:90rem}}@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}}.form-input,.form-input::-webkit-datetime-edit,.form-input::-webkit-datetime-edit-day-field,.form-input::-webkit-datetime-edit-hour-field,.form-input::-webkit-datetime-edit-meridiem-field,.form-input::-webkit-datetime-edit-millisecond-field,.form-input::-webkit-datetime-edit-minute-field,.form-input::-webkit-datetime-edit-month-field,.form-input::-webkit-datetime-edit-second-field,.form-input::placeholder,.form-input:focus,.form-multiselect,.form-multiselect:focus,.form-select,.form-select:focus,table{--tw-text-opacity:1;color:rgb(0 0 0/var(--tw-text-opacity,1))}table:is(.dark *){--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}table tr:hover:is(.dark *){--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}select:is(.dark *){--tw-text-opacity:1;color:rgb(0 0 0/var(--tw-text-opacity,1))}.\!visible{visibility:visible!important}.top-1\/2{top:50%}.-translate-x-1\/2,.-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%}.space-x-1>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(.25rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(.25rem*var(--tw-space-x-reverse))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-bottom-width:calc(1px*var(--tw-divide-y-reverse));border-top-width:calc(1px*(1 - var(--tw-divide-y-reverse)))}.divide-gray-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgb(243 244 246/var(--tw-divide-opacity,1))}.divide-teal-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgb(240 253 250/var(--tw-divide-opacity,1))}.bg-purple-900\/50{background-color:#581c8780}.p-0\.5{padding:.125rem}.py-1\.5{padding-bottom:.375rem;padding-top:.375rem}.\!filter,.blur,.ring,.ring-2,.shadow,.shadow-inner,.backdrop-blur-sm,body{font-family:Arima Regular;font-size:14px}.hover\:bg-white\/20:hover{background-color:#fff3}.dark\:border-gray-600:is(.dark *),.dark\:bg-black:is(.dark *){--tw-bg-opacity:1;background-color:rgb(0 0 0/var(--tw-bg-opacity,1))}.dark\:bg-boxdark:is(.dark *){--tw-bg-opacity:1;background-color:rgb(36 48 63/var(--tw-bg-opacity,1))}.dark\:bg-gray-700:is(.dark *){--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}.dark\:bg-gray-800:is(.dark *){--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity,1))}.dark\:text-black:is(.dark *){--tw-text-opacity:1;color:rgb(0 0 0/var(--tw-text-opacity,1))}.dark\:text-gray-100:is(.dark *){--tw-text-opacity:1;color:rgb(243 244 246/var(--tw-text-opacity,1))}.dark\:text-gray-200:is(.dark *){--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity,1))}.dark\:text-gray-300:is(.dark *){--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity,1))}.dark\:text-gray-400:is(.dark *){--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.dark\:text-gray-500:is(.dark *){--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.dark\:text-red-400:is(.dark *){--tw-text-opacity:1;color:rgb(248 113 113/var(--tw-text-opacity,1))}.dark\:text-white:is(.dark *){--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.dark\:placeholder-gray-400:is(.dark *)::placeholder{--tw-placeholder-opacity:1;color:rgb(156 163 175/var(--tw-placeholder-opacity,1))}.dark\:ring-offset-gray-800:is(.dark *){--tw-ring-offset-color:#1f2937}.dark\:hover\:bg-blue-900:hover:is(.dark *){--tw-bg-opacity:1;background-color:rgb(30 58 138/var(--tw-bg-opacity,1))}.dark\:hover\:bg-gray-600:hover:is(.dark *){--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity,1))}.dark\:hover\:bg-gray-700:hover:is(.dark *){--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}.dark\:focus\:ring-blue-600:focus:is(.dark *){--tw-ring-opacity:1;--tw-ring-color:rgb(37 99 235/var(--tw-ring-opacity,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:#3b82f680;--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:#3b82f680;--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{border:0 solid #e5e7eb;box-sizing:border-box}:after,:before{--tw-content:""}:host,html{-webkit-text-size-adjust:100%;font-feature-settings:normal;-webkit-tap-highlight-color:transparent;font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-variation-settings:normal;line-height:1.5;tab-size:4}body{line-height:inherit;margin:0}hr{border-top-width:1px;color:inherit;height:0}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-feature-settings:normal;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em;font-variation-settings:normal}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:initial}sub{bottom:-.25em}sup{top:-.5em}table{border-collapse:collapse;border-color:inherit;text-indent:0}button,input,optgroup,select,textarea{font-feature-settings:inherit;color:inherit;font-family:inherit;font-size:100%;font-variation-settings:inherit;font-weight:inherit;letter-spacing:inherit;line-height: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:initial;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:initial}::-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::placeholder,textarea::placeholder{color:#9ca3af;opacity:1}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{height:auto;max-width:100%}[hidden]:where(:not([hidden=until-found])){display:none}@font-face{font-family:ArimaRegular;src:url(library/assets/fonts/arima/arima-regular.ttf)}.container{width:100%}@media (min-width:0px){.container{max-width:0}}@media (min-width:20rem){.container{max-width:20rem}}@media (min-width:23.4375rem){.container{max-width:23.4375rem}}@media (min-width:48rem){.container{max-width:48rem}}@media (min-width:64rem){.container{max-width:64rem}}@media (min-width:80rem){.container{max-width:80rem}}@media (min-width:90rem){.container{max-width:90rem}}@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}}.form-input,.form-multiselect,.form-select,.form-input:focus,.form-multiselect:focus,.form-select:focus,.form-input::placeholder,.form-input::-webkit-datetime-edit,.form-input::-webkit-datetime-edit-day-field,.form-input::-webkit-datetime-edit-hour-field,.form-input::-webkit-datetime-edit-meridiem-field,.form-input::-webkit-datetime-edit-millisecond-field,.form-input::-webkit-datetime-edit-minute-field,.form-input::-webkit-datetime-edit-month-field,.form-input::-webkit-datetime-edit-second-field,table{--tw-text-opacity:1;color:rgb(0 0 0/var(--tw-text-opacity,1))}table:is(.dark *){--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}table tr:hover:is(.dark *){--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}select:is(.dark *){--tw-text-opacity:1;color:rgb(0 0 0/var(--tw-text-opacity,1))}.\!visible{visibility:visible!important}.top-1\/2{top:50%}.flex-grow,.-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%}@keyframes pulse{50%{opacity:.5}}@keyframes spin{to{transform:rotate(1turn)}}.space-x-1>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(.25rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(.25rem*var(--tw-space-x-reverse))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-bottom-width:calc(1px*var(--tw-divide-y-reverse));border-top-width:calc(1px*(1 - var(--tw-divide-y-reverse)))}.divide-gray-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgb(243 244 246/var(--tw-divide-opacity,1))}.divide-teal-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgb(240 253 250/var(--tw-divide-opacity,1))}.bg-purple-900\/50{background-color:#581c8780}.p-0\.5{padding:.125rem}.py-1\.5{padding-bottom:.375rem;padding-top:.375rem}.shadow,.shadow-inner,.shadow-md,.ring,.ring-2,.blur,.\!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)!important}.backdrop-blur-sm,body{font-family:Arima Regular;font-size:14px}.menu ul{list-style:none;margin:0;padding:0}.menu li{border-bottom:1px solid #ddd;padding:10px}.menu li:last-child{border-bottom:none}.hover\:bg-white\/20:hover{background-color:#fff3}.focus\:ring-0:focus,.dark\:border-gray-600:is(.dark *){--tw-border-opacity:1;border-color:rgb(75 85 99/var(--tw-border-opacity,1))}.dark\:bg-black:is(.dark *){--tw-bg-opacity:1;background-color:rgb(0 0 0/var(--tw-bg-opacity,1))}.dark\:bg-boxdark:is(.dark *){--tw-bg-opacity:1;background-color:rgb(36 48 63/var(--tw-bg-opacity,1))}.dark\:bg-gray-700:is(.dark *){--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}.dark\:bg-gray-800:is(.dark *){--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity,1))}.dark\:text-black:is(.dark *){--tw-text-opacity:1;color:rgb(0 0 0/var(--tw-text-opacity,1))}.dark\:text-gray-100:is(.dark *){--tw-text-opacity:1;color:rgb(243 244 246/var(--tw-text-opacity,1))}.dark\:text-gray-200:is(.dark *){--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity,1))}.dark\:text-gray-300:is(.dark *){--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity,1))}.dark\:text-gray-400:is(.dark *){--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.dark\:text-gray-500:is(.dark *){--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.dark\:text-red-400:is(.dark *){--tw-text-opacity:1;color:rgb(248 113 113/var(--tw-text-opacity,1))}.dark\:text-white:is(.dark *){--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.dark\:placeholder-gray-400:is(.dark *)::placeholder{--tw-placeholder-opacity:1;color:rgb(156 163 175/var(--tw-placeholder-opacity,1))}.dark\:ring-offset-gray-800:is(.dark *){--tw-ring-offset-color:#1f2937}.dark\:hover\:bg-blue-900:hover:is(.dark *){--tw-bg-opacity:1;background-color:rgb(30 58 138/var(--tw-bg-opacity,1))}.dark\:hover\:bg-gray-600:hover:is(.dark *){--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity,1))}.dark\:hover\:bg-gray-700:hover:is(.dark *){--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}.dark\:focus\:ring-blue-600:focus:is(.dark *){--tw-ring-opacity:1;--tw-ring-color:rgb(37 99 235/var(--tw-ring-opacity,1))}@media (min-width:0px) and (max-width:767px){}
@@ -5,4 +5,4 @@
5
5
  * var(--primary), var(--brand-theme-purple), var(--surface), etc.
6
6
  */
7
7
  .flex-grow{--tw-translate-x:-50%}.shadow-md{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)!important}.focus\:ring-0:focus{--tw-border-opacity:1;border-color:rgb(75 85 99/var(--tw-border-opacity,1))}
8
- .form-textarea{--tw-shadow:0 0 #0000;-webkit-appearance:none;appearance:none;background-color:#fff;border-color:#6b7280;border-radius:0;border-width:1px;font-size:1rem;line-height:1.5rem;padding:.5rem .75rem}.form-textarea:focus{--tw-ring-inset:var(--tw-empty,/*!*/ /*!*/);--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#2563eb;--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(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);border-color:#2563eb;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);outline:2px solid #0000;outline-offset:2px}.form-textarea::placeholder{color:#6b7280;opacity:1}.form-input::-webkit-datetime-edit-fields-wrapper{padding:0}.form-input::-webkit-date-and-time-value{min-height:1.5em;text-align:inherit}.form-input::-webkit-datetime-edit{display:inline-flex}.form-input::-webkit-datetime-edit-year-field{padding-bottom:0;padding-top:0}.main{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}.sr-only{clip:rect(0,0,0,0);border-width:0;height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;white-space:nowrap;width:1px}.visible{visibility:visible}.invisible{visibility:hidden}.collapse{visibility:collapse}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:-webkit-sticky;position:sticky}.inset-0{inset:0}.left-0{left:0}.right-2{right:.5rem}.right-3{right:.75rem}.top-full{top:100%}.isolate{isolation:isolate}.z-10{z-index:10}.z-20{z-index:20}.z-40{z-index:40}.z-50{z-index:50}.z-99{z-index:99}.m-0{margin:0}.mx-2{margin-left:.5rem;margin-right:.5rem}.mx-8{margin-left:2rem;margin-right:2rem}.mx-auto{margin-left:auto;margin-right:auto}.my-5{margin-bottom:1.25rem;margin-top:1.25rem}.my-auto{margin-bottom:auto;margin-top:auto}.mb-1{margin-bottom:.25rem}.mb-2{margin-bottom:.5rem}.mb-4{margin-bottom:1rem}.ml-1{margin-left:.25rem}.ml-2{margin-left:.5rem}.ml-3{margin-left:.75rem}.ml-4{margin-left:1rem}.ml-auto{margin-left:auto}.mr-1{margin-right:.25rem}.mr-2{margin-right:.5rem}.mt-0{margin-top:0}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.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}.contents{display:contents}.hidden{display:none}.h-1{height:.25rem}.h-10{height:2.5rem}.h-16{height:4rem}.h-2{height:.5rem}.h-3{height:.75rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-8{height:2rem}.h-auto{height:auto}.max-h-48{max-height:12rem}.max-h-60{max-height:15rem}.max-h-80{max-height:20rem}.max-h-96{max-height:24rem}.min-h-10{min-height:2.5rem}.w-1{width:.25rem}.w-10{width:2.5rem}.w-12{width:3rem}.w-16{width:4rem}.w-2{width:.5rem}.w-3{width:.75rem}.w-4{width:1rem}.w-5{width:1.25rem}.w-64{width:16rem}.w-8{width:2rem}.w-80{width:20rem}.w-auto{width:auto}.w-fit{width:-webkit-fit-content;width:fit-content}.w-full{width:100%}.min-w-32{min-width:8rem}.max-w-32{max-width:8rem}.max-w-full{max-width:100%}.max-w-md{max-width:28rem}.flex-1{flex:1 1 0%}.flex-shrink{flex-shrink:1}.flex-shrink-0{flex-shrink:0}.grow{flex-grow:1}.border-collapse{border-collapse:collapse}.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-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}.animate-spin{animation:spin 1s linear infinite}.cursor-move{cursor:move}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.cursor-text{cursor:text}.select-none{-webkit-user-select:none;user-select:none}.resize{resize:both}.list-none{list-style-type:none}.appearance-none{-webkit-appearance:none;appearance:none}.grid-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))}.flex-row{flex-direction:row}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.items-stretch{align-items:stretch}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-1{gap:.25rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-y-scroll{overflow-y:scroll}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-nowrap{white-space:nowrap}.rounded{border-radius:.25rem}.rounded-100px{border-radius:100px}.rounded-2xl{border-radius:1rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-none{border-radius:0}.rounded-sm{border-radius:.125rem}.rounded-xl{border-radius:.75rem}.rounded-b-md{border-bottom-left-radius:.375rem;border-bottom-right-radius:.375rem}.rounded-b-xl{border-bottom-left-radius:.75rem;border-bottom-right-radius:.75rem}.rounded-t-md{border-top-left-radius:.375rem;border-top-right-radius:.375rem}.rounded-t-xl{border-top-left-radius:.75rem;border-top-right-radius:.75rem}.border{border-width:1px}.border-b{border-bottom-width:1px}.border-t{border-top-width:1px}.border-solid{border-style:solid}.border-none{border-style:none}.border-blue-100{--tw-border-opacity:1;border-color:rgb(219 234 254/var(--tw-border-opacity,1))}.border-blue-200{--tw-border-opacity:1;border-color:rgb(191 219 254/var(--tw-border-opacity,1))}.border-blue-500{--tw-border-opacity:1;border-color:rgb(59 130 246/var(--tw-border-opacity,1))}.border-emerald-100{--tw-border-opacity:1;border-color:rgb(209 250 229/var(--tw-border-opacity,1))}.border-gray-200{--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity,1))}.border-gray-300{--tw-border-opacity:1;border-color:rgb(209 213 219/var(--tw-border-opacity,1))}.border-gray-400{--tw-border-opacity:1;border-color:rgb(156 163 175/var(--tw-border-opacity,1))}.border-green-200{--tw-border-opacity:1;border-color:rgb(187 247 208/var(--tw-border-opacity,1))}.border-indigo-100{--tw-border-opacity:1;border-color:rgb(224 231 255/var(--tw-border-opacity,1))}.border-indigo-200{--tw-border-opacity:1;border-color:rgb(199 210 254/var(--tw-border-opacity,1))}.border-purple-200{--tw-border-opacity:1;border-color:rgb(233 213 255/var(--tw-border-opacity,1))}.border-purple-300{--tw-border-opacity:1;border-color:rgb(216 180 254/var(--tw-border-opacity,1))}.border-purple-500{--tw-border-opacity:1;border-color:rgb(168 85 247/var(--tw-border-opacity,1))}.border-red{--tw-border-opacity:1;border-color:rgb(255 0 0/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(239 68 68/var(--tw-border-opacity,1))}.border-slate-600{--tw-border-opacity:1;border-color:rgb(71 85 105/var(--tw-border-opacity,1))}.border-teal-100{--tw-border-opacity:1;border-color:rgb(204 251 241/var(--tw-border-opacity,1))}.border-transparent{border-color:#0000}.border-yellow-200{--tw-border-opacity:1;border-color:rgb(254 240 138/var(--tw-border-opacity,1))}.bg-\[\#007BFF\]{--tw-bg-opacity:1;background-color:rgb(0 123 255/var(--tw-bg-opacity,1))}.bg-amber-100{--tw-bg-opacity:1;background-color:rgb(254 243 199/var(--tw-bg-opacity,1))}.bg-black{--tw-bg-opacity:1;background-color:rgb(0 0 0/var(--tw-bg-opacity,1))}.bg-blue-100{--tw-bg-opacity:1;background-color:rgb(219 234 254/var(--tw-bg-opacity,1))}.bg-blue-50{--tw-bg-opacity:1;background-color:rgb(239 246 255/var(--tw-bg-opacity,1))}.bg-blue-500{--tw-bg-opacity:1;background-color:rgb(59 130 246/var(--tw-bg-opacity,1))}.bg-blue-600{--tw-bg-opacity:1;background-color:rgb(37 99 235/var(--tw-bg-opacity,1))}.bg-emerald-500{--tw-bg-opacity:1;background-color:rgb(16 185 129/var(--tw-bg-opacity,1))}.bg-emerald-600{--tw-bg-opacity:1;background-color:rgb(5 150 105/var(--tw-bg-opacity,1))}.bg-gray-100{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity,1))}.bg-gray-200{--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity,1))}.bg-gray-300{--tw-bg-opacity:1;background-color:rgb(209 213 219/var(--tw-bg-opacity,1))}.bg-gray-400{--tw-bg-opacity:1;background-color:rgb(156 163 175/var(--tw-bg-opacity,1))}.bg-gray-50{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity,1))}.bg-gray-500{--tw-bg-opacity:1;background-color:rgb(107 114 128/var(--tw-bg-opacity,1))}.bg-green-100{--tw-bg-opacity:1;background-color:rgb(220 252 231/var(--tw-bg-opacity,1))}.bg-green-50{--tw-bg-opacity:1;background-color:rgb(240 253 244/var(--tw-bg-opacity,1))}.bg-green-500{--tw-bg-opacity:1;background-color:rgb(34 197 94/var(--tw-bg-opacity,1))}.bg-green-700{--tw-bg-opacity:1;background-color:rgb(21 128 61/var(--tw-bg-opacity,1))}.bg-indigo-100{--tw-bg-opacity:1;background-color:rgb(224 231 255/var(--tw-bg-opacity,1))}.bg-indigo-50{--tw-bg-opacity:1;background-color:rgb(238 242 255/var(--tw-bg-opacity,1))}.bg-purple-100{--tw-bg-opacity:1;background-color:rgb(243 232 255/var(--tw-bg-opacity,1))}.bg-purple-50{--tw-bg-opacity:1;background-color:rgb(250 245 255/var(--tw-bg-opacity,1))}.bg-purple-600{--tw-bg-opacity:1;background-color:rgb(147 51 234/var(--tw-bg-opacity,1))}.bg-red-100{--tw-bg-opacity:1;background-color:rgb(254 226 226/var(--tw-bg-opacity,1))}.bg-red-50{--tw-bg-opacity:1;background-color:rgb(254 242 242/var(--tw-bg-opacity,1))}.bg-slate-500{--tw-bg-opacity:1;background-color:rgb(100 116 139/var(--tw-bg-opacity,1))}.bg-slate-800{--tw-bg-opacity:1;background-color:rgb(30 41 59/var(--tw-bg-opacity,1))}.bg-transparent{background-color:initial}.bg-violet-600{--tw-bg-opacity:1;background-color:rgb(124 58 237/var(--tw-bg-opacity,1))}.bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}.bg-yellow-100{--tw-bg-opacity:1;background-color:rgb(254 249 195/var(--tw-bg-opacity,1))}.bg-gradient-to-br{background-image:linear-gradient(to bottom right,var(--tw-gradient-stops))}.bg-gradient-to-r{background-image:linear-gradient(to right,var(--tw-gradient-stops))}.bg-none{background-image:none}.from-blue-50{--tw-gradient-from:#eff6ff var(--tw-gradient-from-position);--tw-gradient-to:#eff6ff00 var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-cyan-500{--tw-gradient-from:#06b6d4 var(--tw-gradient-from-position);--tw-gradient-to:#06b6d400 var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-green-400{--tw-gradient-from:#4ade80 var(--tw-gradient-from-position);--tw-gradient-to:#4ade8000 var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-indigo-500{--tw-gradient-from:#6366f1 var(--tw-gradient-from-position);--tw-gradient-to:#6366f100 var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-purple-50{--tw-gradient-from:#faf5ff var(--tw-gradient-from-position);--tw-gradient-to:#faf5ff00 var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-purple-500{--tw-gradient-from:#a855f7 var(--tw-gradient-from-position);--tw-gradient-to:#a855f700 var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-purple-600{--tw-gradient-from:#9333ea var(--tw-gradient-from-position);--tw-gradient-to:#9333ea00 var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-teal-500{--tw-gradient-from:#14b8a6 var(--tw-gradient-from-position);--tw-gradient-to:#14b8a600 var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-violet-50{--tw-gradient-from:#f5f3ff var(--tw-gradient-from-position);--tw-gradient-to:#f5f3ff00 var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.to-blue-500{--tw-gradient-to:#3b82f6 var(--tw-gradient-to-position)}.to-emerald-500{--tw-gradient-to:#10b981 var(--tw-gradient-to-position)}.to-indigo-50{--tw-gradient-to:#eef2ff var(--tw-gradient-to-position)}.to-pink-50{--tw-gradient-to:#fdf2f8 var(--tw-gradient-to-position)}.to-pink-500{--tw-gradient-to:#ec4899 var(--tw-gradient-to-position)}.to-pink-600{--tw-gradient-to:#db2777 var(--tw-gradient-to-position)}.to-purple-50{--tw-gradient-to:#faf5ff var(--tw-gradient-to-position)}.to-purple-500{--tw-gradient-to:#a855f7 var(--tw-gradient-to-position)}.p-0{padding:0}.p-1{padding:.25rem}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-6{padding:1.5rem}.p-8{padding:2rem}.px-0{padding-left:0;padding-right:0}.px-2{padding-left:.5rem;padding-right:.5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-1{padding-bottom:.25rem;padding-top:.25rem}.py-2{padding-bottom:.5rem;padding-top:.5rem}.py-3{padding-bottom:.75rem;padding-top:.75rem}.py-6{padding-bottom:1.5rem;padding-top:1.5rem}.pb-2{padding-bottom:.5rem}.pr-12{padding-right:3rem}.pt-2{padding-top:.5rem}.pt-3{padding-top:.75rem}.text-center{text-align:center}.font-arimaRegular{font-family:ArimaRegular}.font-serif{font-family:ui-serif,Georgia,Cambria,Times New Roman,Times,serif}.text-2xl{font-size:1.5rem;line-height:2rem}.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-extrabold{font-weight:800}.font-light{font-weight:300}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.lowercase{text-transform:lowercase}.capitalize{text-transform:capitalize}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.leading-4{line-height:1rem}.leading-none{line-height:1}.tracking-wide{letter-spacing:.025em}.tracking-wider{letter-spacing:.05em}.text-amber-800{--tw-text-opacity:1;color:rgb(146 64 14/var(--tw-text-opacity,1))}.text-black{--tw-text-opacity:1;color:rgb(0 0 0/var(--tw-text-opacity,1))}.text-blue-500{--tw-text-opacity:1;color:rgb(59 130 246/var(--tw-text-opacity,1))}.text-blue-600{--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity,1))}.text-blue-700{--tw-text-opacity:1;color:rgb(29 78 216/var(--tw-text-opacity,1))}.text-blue-800{--tw-text-opacity:1;color:rgb(30 64 175/var(--tw-text-opacity,1))}.text-gray-400{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.text-gray-500{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.text-gray-600{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity,1))}.text-gray-700{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity,1))}.text-gray-800{--tw-text-opacity:1;color:rgb(31 41 55/var(--tw-text-opacity,1))}.text-gray-900{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity,1))}.text-green-700{--tw-text-opacity:1;color:rgb(21 128 61/var(--tw-text-opacity,1))}.text-green-800{--tw-text-opacity:1;color:rgb(22 101 52/var(--tw-text-opacity,1))}.text-indigo-600{--tw-text-opacity:1;color:rgb(79 70 229/var(--tw-text-opacity,1))}.text-indigo-700{--tw-text-opacity:1;color:rgb(67 56 202/var(--tw-text-opacity,1))}.text-indigo-800{--tw-text-opacity:1;color:rgb(55 48 163/var(--tw-text-opacity,1))}.text-purple-700{--tw-text-opacity:1;color:rgb(126 34 206/var(--tw-text-opacity,1))}.text-purple-800{--tw-text-opacity:1;color:rgb(107 33 168/var(--tw-text-opacity,1))}.text-red{--tw-text-opacity:1;color:rgb(255 0 0/var(--tw-text-opacity,1))}.text-red-400{--tw-text-opacity:1;color:rgb(248 113 113/var(--tw-text-opacity,1))}.text-red-500{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity,1))}.text-red-600{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity,1))}.text-red-800{--tw-text-opacity:1;color:rgb(153 27 27/var(--tw-text-opacity,1))}.text-teal-500{--tw-text-opacity:1;color:rgb(20 184 166/var(--tw-text-opacity,1))}.text-teal-600{--tw-text-opacity:1;color:rgb(13 148 136/var(--tw-text-opacity,1))}.text-violet-600{--tw-text-opacity:1;color:rgb(124 58 237/var(--tw-text-opacity,1))}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.text-yellow-800{--tw-text-opacity:1;color:rgb(133 77 14/var(--tw-text-opacity,1))}.underline{-webkit-text-decoration-line:underline;text-decoration-line:underline}.line-through{-webkit-text-decoration-line:line-through;text-decoration-line:line-through}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.placeholder-gray-400::placeholder{--tw-placeholder-opacity:1;color:rgb(156 163 175/var(--tw-placeholder-opacity,1))}.placeholder-gray-500::placeholder{--tw-placeholder-opacity:1;color:rgb(107 114 128/var(--tw-placeholder-opacity,1))}.placeholder-purple-400::placeholder{--tw-placeholder-opacity:1;color:rgb(192 132 252/var(--tw-placeholder-opacity,1))}.accent-indigo-600{accent-color:#4f46e5}.opacity-100{opacity:1}.opacity-25{opacity:.25}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.shadow{--tw-shadow:0 1px 3px 0 #0000001a,0 1px 2px -1px #0000001a;--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color)}.shadow-2xl{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-2xl{--tw-shadow:0 25px 50px -12px #00000040;--tw-shadow-colored:0 25px 50px -12px var(--tw-shadow-color)}.shadow-inner{--tw-shadow:inset 0 2px 4px 0 #0000000d;--tw-shadow-colored:inset 0 2px 4px 0 var(--tw-shadow-color)}.shadow-lg{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px #0000001a,0 4px 6px -4px #0000001a;--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color)}.shadow-md{--tw-shadow:0 4px 6px -1px #0000001a,0 2px 4px -2px #0000001a;--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color)}.shadow-sm{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color)}.shadow-xl{--tw-shadow:0 20px 25px -5px #0000001a,0 8px 10px -6px #0000001a;--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color),0 8px 10px -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)}.outline-none{outline:2px solid #0000;outline-offset:2px}.outline{outline-style:solid}.ring{--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(3px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.ring-1{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.ring-1{--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(1px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.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)}.ring-4{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.ring-4{--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(4px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.ring-blue-200{--tw-ring-opacity:1;--tw-ring-color:rgb(191 219 254/var(--tw-ring-opacity,1))}.ring-blue-500{--tw-ring-opacity:1;--tw-ring-color:rgb(59 130 246/var(--tw-ring-opacity,1))}.ring-purple-500{--tw-ring-opacity:1;--tw-ring-color:rgb(168 85 247/var(--tw-ring-opacity,1))}.ring-white{--tw-ring-opacity:1;--tw-ring-color:rgb(255 255 255/var(--tw-ring-opacity,1))}.blur{--tw-blur:blur(8px)}.drop-shadow{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)}.drop-shadow{--tw-drop-shadow:drop-shadow(0 1px 2px #0000001a) drop-shadow(0 1px 1px #0000000f)}.grayscale{--tw-grayscale:grayscale(100%);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)}.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)}.backdrop-blur-sm{--tw-backdrop-blur:blur(4px)}.backdrop-filter{-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition{transition-duration:.15s;transition-property:color,background-color,border-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-text-decoration-color,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-text-decoration-color,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-all{transition-duration:.15s;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-colors{transition-duration:.15s;transition-property:color,background-color,border-color,fill,stroke,-webkit-text-decoration-color;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,-webkit-text-decoration-color;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-transform{transition-duration:.15s;transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-width{transition-duration:.15s;transition-property:width;transition-timing-function:cubic-bezier(.4,0,.2,1)}.duration-150{transition-duration:.15s}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}.duration-500{transition-duration:.5s}.ease-in{transition-timing-function:cubic-bezier(.4,0,1,1)}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}.ps__rail-y{background:none!important}.scrollbar-container{width:97%!important}.dropdown-menu{min-width:3rem}.w-md-editor-show-live{height:800!important}.bg-orange1{background-color:"#EF4444"}.react-pdf__Page__canvas{max-width:100vw!important;min-height:100vh!important}.outer-box{border:2px solid #333;height:400px;overflow:hidden;position:relative;width:300px}.parent-container{background:#f0f0f0;padding:20px;position:relative}.menu{background:#fff;border:1px solid #ccc;box-shadow:0 4px 6px #0000001a;left:0;max-height:200px;overflow-y:auto;position:absolute;top:100%;width:100%}.border-t-2{border-top-width:2px}.border-b-2{border-bottom-width:2px}.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-gray-400:hover{--tw-border-opacity:1;border-color:rgb(156 163 175/var(--tw-border-opacity,1))}.hover\:bg-\[\#007BFF\]:hover{--tw-bg-opacity:1;background-color:rgb(0 123 255/var(--tw-bg-opacity,1))}.hover\:bg-black:hover{--tw-bg-opacity:1;background-color:rgb(0 0 0/var(--tw-bg-opacity,1))}.hover\:bg-blue-100:hover{--tw-bg-opacity:1;background-color:rgb(219 234 254/var(--tw-bg-opacity,1))}.hover\:bg-blue-50:hover{--tw-bg-opacity:1;background-color:rgb(239 246 255/var(--tw-bg-opacity,1))}.hover\:bg-blue-600:hover{--tw-bg-opacity:1;background-color:rgb(37 99 235/var(--tw-bg-opacity,1))}.hover\:bg-blue-700:hover{--tw-bg-opacity:1;background-color:rgb(29 78 216/var(--tw-bg-opacity,1))}.hover\:bg-blue-800:hover{--tw-bg-opacity:1;background-color:rgb(30 64 175/var(--tw-bg-opacity,1))}.hover\:bg-emerald-50:hover{--tw-bg-opacity:1;background-color:rgb(236 253 245/var(--tw-bg-opacity,1))}.hover\:bg-emerald-600:hover{--tw-bg-opacity:1;background-color:rgb(5 150 105/var(--tw-bg-opacity,1))}.hover\:bg-emerald-700:hover{--tw-bg-opacity:1;background-color:rgb(4 120 87/var(--tw-bg-opacity,1))}.hover\:bg-gray-100:hover{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity,1))}.hover\:bg-gray-200:hover{--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity,1))}.hover\:bg-gray-300:hover{--tw-bg-opacity:1;background-color:rgb(209 213 219/var(--tw-bg-opacity,1))}.hover\:bg-gray-50:hover{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity,1))}.hover\:bg-gray-600:hover{--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity,1))}.hover\:bg-green-600:hover{--tw-bg-opacity:1;background-color:rgb(22 163 74/var(--tw-bg-opacity,1))}.hover\:bg-indigo-50:hover{--tw-bg-opacity:1;background-color:rgb(238 242 255/var(--tw-bg-opacity,1))}.hover\:bg-purple-700:hover{--tw-bg-opacity:1;background-color:rgb(126 34 206/var(--tw-bg-opacity,1))}.hover\:bg-red-100:hover{--tw-bg-opacity:1;background-color:rgb(254 226 226/var(--tw-bg-opacity,1))}.hover\:bg-slate-600:hover{--tw-bg-opacity:1;background-color:rgb(71 85 105/var(--tw-bg-opacity,1))}.hover\:bg-teal-50:hover{--tw-bg-opacity:1;background-color:rgb(240 253 250/var(--tw-bg-opacity,1))}.hover\:bg-violet-100:hover{--tw-bg-opacity:1;background-color:rgb(237 233 254/var(--tw-bg-opacity,1))}.hover\:bg-violet-700:hover{--tw-bg-opacity:1;background-color:rgb(109 40 217/var(--tw-bg-opacity,1))}.hover\:bg-opacity-10:hover{--tw-bg-opacity:0.1}.hover\:from-indigo-600:hover{--tw-gradient-from:#4f46e5 var(--tw-gradient-from-position);--tw-gradient-to:#4f46e500 var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.hover\:to-purple-600:hover{--tw-gradient-to:#9333ea var(--tw-gradient-to-position)}.hover\:text-gray-600:hover{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity,1))}.hover\:text-red-500:hover{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity,1))}.hover\:shadow-lg:hover{--tw-shadow:0 10px 15px -3px #0000001a,0 4px 6px -4px #0000001a;--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -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)}.hover\:ring-pink-500:hover{--tw-ring-opacity:1;--tw-ring-color:rgb(236 72 153/var(--tw-ring-opacity,1))}.focus\:border-indigo-400:focus{--tw-border-opacity:1;border-color:rgb(129 140 248/var(--tw-border-opacity,1))}.focus\:outline-none:focus{outline:2px solid #0000;outline-offset:2px}.focus\:ring:focus{--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(3px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.focus\:ring:focus{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus\:ring-0:focus{--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(var(--tw-ring-offset-width)) var(--tw-ring-color)}.focus\:ring-2:focus{--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\:ring-blue-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(59 130 246/var(--tw-ring-opacity,1))}.focus\:ring-gray-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(107 114 128/var(--tw-ring-opacity,1))}.focus\:ring-indigo-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(165 180 252/var(--tw-ring-opacity,1))}.focus\:ring-primary:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(69 76 191/var(--tw-ring-opacity,1))}.focus\:ring-red-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(239 68 68/var(--tw-ring-opacity,1))}.focus\:ring-offset-1:focus{--tw-ring-offset-width:1px}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}.sm\:block{display:block}.sm\:px-8{padding-left:2rem;padding-right:2rem}.sm\:text-base{font-size:1rem;line-height:1.5rem}
8
+ .form-textarea{--tw-shadow:0 0 #0000;-webkit-appearance:none;appearance:none;background-color:#fff;border-color:#6b7280;border-radius:0;border-width:1px;font-size:1rem;line-height:1.5rem;padding:.5rem .75rem}.form-textarea:focus{--tw-ring-inset:var(--tw-empty,/*!*/ /*!*/);--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#2563eb;--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(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);border-color:#2563eb;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);outline:2px solid #0000;outline-offset:2px}.form-textarea::placeholder{color:#6b7280;opacity:1}.form-input::-webkit-datetime-edit-fields-wrapper{padding:0}.form-input::-webkit-date-and-time-value{min-height:1.5em;text-align:inherit}.form-input::-webkit-datetime-edit{display:inline-flex}.form-input::-webkit-datetime-edit-year-field{padding-bottom:0;padding-top:0}.main{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}.sr-only{clip:rect(0,0,0,0);border-width:0;height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;white-space:nowrap;width:1px}.visible{visibility:visible}.invisible{visibility:hidden}.collapse{visibility:collapse}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:-webkit-sticky;position:sticky}.inset-0{inset:0}.left-0{left:0}.right-2{right:.5rem}.right-3{right:.75rem}.top-full{top:100%}.isolate{isolation:isolate}.z-10{z-index:10}.z-20{z-index:20}.z-40{z-index:40}.z-50{z-index:50}.z-99{z-index:99}.m-0{margin:0}.mx-2{margin-left:.5rem;margin-right:.5rem}.mx-8{margin-left:2rem;margin-right:2rem}.mx-auto{margin-left:auto;margin-right:auto}.my-5{margin-bottom:1.25rem;margin-top:1.25rem}.my-auto{margin-bottom:auto;margin-top:auto}.mb-1{margin-bottom:.25rem}.mb-2{margin-bottom:.5rem}.mb-4{margin-bottom:1rem}.ml-1{margin-left:.25rem}.ml-2{margin-left:.5rem}.ml-3{margin-left:.75rem}.ml-4{margin-left:1rem}.ml-auto{margin-left:auto}.mr-1{margin-right:.25rem}.mr-2{margin-right:.5rem}.mt-0{margin-top:0}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.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}.contents{display:contents}.hidden{display:none}.h-1{height:.25rem}.h-10{height:2.5rem}.h-16{height:4rem}.h-2{height:.5rem}.h-3{height:.75rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-8{height:2rem}.h-auto{height:auto}.max-h-48{max-height:12rem}.max-h-60{max-height:15rem}.max-h-80{max-height:20rem}.max-h-96{max-height:24rem}.min-h-10{min-height:2.5rem}.w-1{width:.25rem}.w-10{width:2.5rem}.w-12{width:3rem}.w-16{width:4rem}.w-2{width:.5rem}.w-3{width:.75rem}.w-4{width:1rem}.w-5{width:1.25rem}.w-64{width:16rem}.w-8{width:2rem}.w-80{width:20rem}.w-auto{width:auto}.w-fit{width:-webkit-fit-content;width:fit-content}.w-full{width:100%}.min-w-32{min-width:8rem}.max-w-32{max-width:8rem}.max-w-full{max-width:100%}.max-w-md{max-width:28rem}.flex-1{flex:1 1 0%}.flex-shrink{flex-shrink:1}.flex-shrink-0{flex-shrink:0}.grow{flex-grow:1}.border-collapse{border-collapse:collapse}.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-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}.animate-spin{animation:spin 1s linear infinite}.cursor-move{cursor:move}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.cursor-text{cursor:text}.select-none{-webkit-user-select:none;user-select:none}.resize{resize:both}.list-none{list-style-type:none}.appearance-none{-webkit-appearance:none;appearance:none}.grid-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))}.flex-row{flex-direction:row}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.items-stretch{align-items:stretch}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-1{gap:.25rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-y-scroll{overflow-y:scroll}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-nowrap{white-space:nowrap}.rounded{border-radius:.25rem}.rounded-100px{border-radius:100px}.rounded-2xl{border-radius:1rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-none{border-radius:0}.rounded-sm{border-radius:.125rem}.rounded-xl{border-radius:.75rem}.rounded-b-md{border-bottom-left-radius:.375rem;border-bottom-right-radius:.375rem}.rounded-b-xl{border-bottom-left-radius:.75rem;border-bottom-right-radius:.75rem}.rounded-t-md{border-top-left-radius:.375rem;border-top-right-radius:.375rem}.rounded-t-xl{border-top-left-radius:.75rem;border-top-right-radius:.75rem}.border{border-width:1px}.border-b{border-bottom-width:1px}.border-t{border-top-width:1px}.border-solid{border-style:solid}.border-none{border-style:none}.border-blue-100{--tw-border-opacity:1;border-color:rgb(219 234 254/var(--tw-border-opacity,1))}.border-blue-200{--tw-border-opacity:1;border-color:rgb(191 219 254/var(--tw-border-opacity,1))}.border-blue-500{--tw-border-opacity:1;border-color:rgb(59 130 246/var(--tw-border-opacity,1))}.border-emerald-100{--tw-border-opacity:1;border-color:rgb(209 250 229/var(--tw-border-opacity,1))}.border-gray-200{--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity,1))}.border-gray-300{--tw-border-opacity:1;border-color:rgb(209 213 219/var(--tw-border-opacity,1))}.border-gray-400{--tw-border-opacity:1;border-color:rgb(156 163 175/var(--tw-border-opacity,1))}.border-green-200{--tw-border-opacity:1;border-color:rgb(187 247 208/var(--tw-border-opacity,1))}.border-indigo-100{--tw-border-opacity:1;border-color:rgb(224 231 255/var(--tw-border-opacity,1))}.border-indigo-200{--tw-border-opacity:1;border-color:rgb(199 210 254/var(--tw-border-opacity,1))}.border-purple-200{--tw-border-opacity:1;border-color:rgb(233 213 255/var(--tw-border-opacity,1))}.border-purple-300{--tw-border-opacity:1;border-color:rgb(216 180 254/var(--tw-border-opacity,1))}.border-purple-500{--tw-border-opacity:1;border-color:rgb(168 85 247/var(--tw-border-opacity,1))}.border-red{--tw-border-opacity:1;border-color:rgb(255 0 0/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(239 68 68/var(--tw-border-opacity,1))}.border-slate-600{--tw-border-opacity:1;border-color:rgb(71 85 105/var(--tw-border-opacity,1))}.border-teal-100{--tw-border-opacity:1;border-color:rgb(204 251 241/var(--tw-border-opacity,1))}.border-transparent{border-color:#0000}.border-yellow-200{--tw-border-opacity:1;border-color:rgb(254 240 138/var(--tw-border-opacity,1))}.bg-\[\#007BFF\]{--tw-bg-opacity:1;background-color:rgb(0 123 255/var(--tw-bg-opacity,1))}.bg-amber-100{--tw-bg-opacity:1;background-color:rgb(254 243 199/var(--tw-bg-opacity,1))}.bg-black{--tw-bg-opacity:1;background-color:rgb(0 0 0/var(--tw-bg-opacity,1))}.bg-blue-100{--tw-bg-opacity:1;background-color:rgb(219 234 254/var(--tw-bg-opacity,1))}.bg-blue-50{--tw-bg-opacity:1;background-color:rgb(239 246 255/var(--tw-bg-opacity,1))}.bg-blue-500{--tw-bg-opacity:1;background-color:rgb(59 130 246/var(--tw-bg-opacity,1))}.bg-blue-600{--tw-bg-opacity:1;background-color:rgb(37 99 235/var(--tw-bg-opacity,1))}.bg-emerald-500{--tw-bg-opacity:1;background-color:rgb(16 185 129/var(--tw-bg-opacity,1))}.bg-emerald-600{--tw-bg-opacity:1;background-color:rgb(5 150 105/var(--tw-bg-opacity,1))}.bg-gray-100{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity,1))}.bg-gray-200{--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity,1))}.bg-gray-300{--tw-bg-opacity:1;background-color:rgb(209 213 219/var(--tw-bg-opacity,1))}.bg-gray-400{--tw-bg-opacity:1;background-color:rgb(156 163 175/var(--tw-bg-opacity,1))}.bg-gray-50{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity,1))}.bg-gray-500{--tw-bg-opacity:1;background-color:rgb(107 114 128/var(--tw-bg-opacity,1))}.bg-green-100{--tw-bg-opacity:1;background-color:rgb(220 252 231/var(--tw-bg-opacity,1))}.bg-green-50{--tw-bg-opacity:1;background-color:rgb(240 253 244/var(--tw-bg-opacity,1))}.bg-green-500{--tw-bg-opacity:1;background-color:rgb(34 197 94/var(--tw-bg-opacity,1))}.bg-green-700{--tw-bg-opacity:1;background-color:rgb(21 128 61/var(--tw-bg-opacity,1))}.bg-indigo-100{--tw-bg-opacity:1;background-color:rgb(224 231 255/var(--tw-bg-opacity,1))}.bg-indigo-50{--tw-bg-opacity:1;background-color:rgb(238 242 255/var(--tw-bg-opacity,1))}.bg-purple-100{--tw-bg-opacity:1;background-color:rgb(243 232 255/var(--tw-bg-opacity,1))}.bg-purple-50{--tw-bg-opacity:1;background-color:rgb(250 245 255/var(--tw-bg-opacity,1))}.bg-purple-600{--tw-bg-opacity:1;background-color:rgb(147 51 234/var(--tw-bg-opacity,1))}.bg-red-100{--tw-bg-opacity:1;background-color:rgb(254 226 226/var(--tw-bg-opacity,1))}.bg-red-50{--tw-bg-opacity:1;background-color:rgb(254 242 242/var(--tw-bg-opacity,1))}.bg-slate-500{--tw-bg-opacity:1;background-color:rgb(100 116 139/var(--tw-bg-opacity,1))}.bg-slate-800{--tw-bg-opacity:1;background-color:rgb(30 41 59/var(--tw-bg-opacity,1))}.bg-transparent{background-color:initial}.bg-violet-600{--tw-bg-opacity:1;background-color:rgb(124 58 237/var(--tw-bg-opacity,1))}.bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}.bg-yellow-100{--tw-bg-opacity:1;background-color:rgb(254 249 195/var(--tw-bg-opacity,1))}.bg-gradient-to-br{background-image:linear-gradient(to bottom right,var(--tw-gradient-stops))}.bg-gradient-to-r{background-image:linear-gradient(to right,var(--tw-gradient-stops))}.bg-none{background-image:none}.from-blue-50{--tw-gradient-from:#eff6ff var(--tw-gradient-from-position);--tw-gradient-to:#eff6ff00 var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-cyan-500{--tw-gradient-from:#06b6d4 var(--tw-gradient-from-position);--tw-gradient-to:#06b6d400 var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-green-400{--tw-gradient-from:#4ade80 var(--tw-gradient-from-position);--tw-gradient-to:#4ade8000 var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-indigo-500{--tw-gradient-from:#6366f1 var(--tw-gradient-from-position);--tw-gradient-to:#6366f100 var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-purple-50{--tw-gradient-from:#faf5ff var(--tw-gradient-from-position);--tw-gradient-to:#faf5ff00 var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-purple-500{--tw-gradient-from:#a855f7 var(--tw-gradient-from-position);--tw-gradient-to:#a855f700 var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-purple-600{--tw-gradient-from:#9333ea var(--tw-gradient-from-position);--tw-gradient-to:#9333ea00 var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-teal-500{--tw-gradient-from:#14b8a6 var(--tw-gradient-from-position);--tw-gradient-to:#14b8a600 var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-violet-50{--tw-gradient-from:#f5f3ff var(--tw-gradient-from-position);--tw-gradient-to:#f5f3ff00 var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.to-blue-500{--tw-gradient-to:#3b82f6 var(--tw-gradient-to-position)}.to-emerald-500{--tw-gradient-to:#10b981 var(--tw-gradient-to-position)}.to-indigo-50{--tw-gradient-to:#eef2ff var(--tw-gradient-to-position)}.to-pink-50{--tw-gradient-to:#fdf2f8 var(--tw-gradient-to-position)}.to-pink-500{--tw-gradient-to:#ec4899 var(--tw-gradient-to-position)}.to-pink-600{--tw-gradient-to:#db2777 var(--tw-gradient-to-position)}.to-purple-50{--tw-gradient-to:#faf5ff var(--tw-gradient-to-position)}.to-purple-500{--tw-gradient-to:#a855f7 var(--tw-gradient-to-position)}.p-0{padding:0}.p-1{padding:.25rem}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-6{padding:1.5rem}.p-8{padding:2rem}.px-0{padding-left:0;padding-right:0}.px-2{padding-left:.5rem;padding-right:.5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-1{padding-bottom:.25rem;padding-top:.25rem}.py-2{padding-bottom:.5rem;padding-top:.5rem}.py-3{padding-bottom:.75rem;padding-top:.75rem}.py-6{padding-bottom:1.5rem;padding-top:1.5rem}.pb-2{padding-bottom:.5rem}.pr-12{padding-right:3rem}.pt-2{padding-top:.5rem}.pt-3{padding-top:.75rem}.text-center{text-align:center}.font-arimaRegular{font-family:ArimaRegular}.font-serif{font-family:ui-serif,Georgia,Cambria,Times New Roman,Times,serif}.text-2xl{font-size:1.5rem;line-height:2rem}.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-extrabold{font-weight:800}.font-light{font-weight:300}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.lowercase{text-transform:lowercase}.capitalize{text-transform:capitalize}.italic{font-style:italic}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.leading-4{line-height:1rem}.leading-none{line-height:1}.tracking-wide{letter-spacing:.025em}.tracking-wider{letter-spacing:.05em}.text-amber-800{--tw-text-opacity:1;color:rgb(146 64 14/var(--tw-text-opacity,1))}.text-black{--tw-text-opacity:1;color:rgb(0 0 0/var(--tw-text-opacity,1))}.text-blue-500{--tw-text-opacity:1;color:rgb(59 130 246/var(--tw-text-opacity,1))}.text-blue-600{--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity,1))}.text-blue-700{--tw-text-opacity:1;color:rgb(29 78 216/var(--tw-text-opacity,1))}.text-blue-800{--tw-text-opacity:1;color:rgb(30 64 175/var(--tw-text-opacity,1))}.text-gray-400{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.text-gray-500{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.text-gray-600{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity,1))}.text-gray-700{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity,1))}.text-gray-800{--tw-text-opacity:1;color:rgb(31 41 55/var(--tw-text-opacity,1))}.text-gray-900{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity,1))}.text-green-700{--tw-text-opacity:1;color:rgb(21 128 61/var(--tw-text-opacity,1))}.text-green-800{--tw-text-opacity:1;color:rgb(22 101 52/var(--tw-text-opacity,1))}.text-indigo-600{--tw-text-opacity:1;color:rgb(79 70 229/var(--tw-text-opacity,1))}.text-indigo-700{--tw-text-opacity:1;color:rgb(67 56 202/var(--tw-text-opacity,1))}.text-indigo-800{--tw-text-opacity:1;color:rgb(55 48 163/var(--tw-text-opacity,1))}.text-purple-700{--tw-text-opacity:1;color:rgb(126 34 206/var(--tw-text-opacity,1))}.text-purple-800{--tw-text-opacity:1;color:rgb(107 33 168/var(--tw-text-opacity,1))}.text-red{--tw-text-opacity:1;color:rgb(255 0 0/var(--tw-text-opacity,1))}.text-red-400{--tw-text-opacity:1;color:rgb(248 113 113/var(--tw-text-opacity,1))}.text-red-500{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity,1))}.text-red-600{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity,1))}.text-red-800{--tw-text-opacity:1;color:rgb(153 27 27/var(--tw-text-opacity,1))}.text-teal-500{--tw-text-opacity:1;color:rgb(20 184 166/var(--tw-text-opacity,1))}.text-teal-600{--tw-text-opacity:1;color:rgb(13 148 136/var(--tw-text-opacity,1))}.text-violet-600{--tw-text-opacity:1;color:rgb(124 58 237/var(--tw-text-opacity,1))}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.text-yellow-800{--tw-text-opacity:1;color:rgb(133 77 14/var(--tw-text-opacity,1))}.underline{-webkit-text-decoration-line:underline;text-decoration-line:underline}.line-through{-webkit-text-decoration-line:line-through;text-decoration-line:line-through}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.placeholder-gray-400::placeholder{--tw-placeholder-opacity:1;color:rgb(156 163 175/var(--tw-placeholder-opacity,1))}.placeholder-gray-500::placeholder{--tw-placeholder-opacity:1;color:rgb(107 114 128/var(--tw-placeholder-opacity,1))}.placeholder-purple-400::placeholder{--tw-placeholder-opacity:1;color:rgb(192 132 252/var(--tw-placeholder-opacity,1))}.accent-indigo-600{accent-color:#4f46e5}.opacity-100{opacity:1}.opacity-25{opacity:.25}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.shadow{--tw-shadow:0 1px 3px 0 #0000001a,0 1px 2px -1px #0000001a;--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color)}.shadow-2xl{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-2xl{--tw-shadow:0 25px 50px -12px #00000040;--tw-shadow-colored:0 25px 50px -12px var(--tw-shadow-color)}.shadow-inner{--tw-shadow:inset 0 2px 4px 0 #0000000d;--tw-shadow-colored:inset 0 2px 4px 0 var(--tw-shadow-color)}.shadow-lg{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px #0000001a,0 4px 6px -4px #0000001a;--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color)}.shadow-md{--tw-shadow:0 4px 6px -1px #0000001a,0 2px 4px -2px #0000001a;--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color)}.shadow-sm{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color)}.shadow-xl{--tw-shadow:0 20px 25px -5px #0000001a,0 8px 10px -6px #0000001a;--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color),0 8px 10px -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)}.outline-none{outline:2px solid #0000;outline-offset:2px}.outline{outline-style:solid}.ring{--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(3px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.ring-1{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.ring-1{--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(1px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.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)}.ring-4{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.ring-4{--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(4px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.ring-blue-200{--tw-ring-opacity:1;--tw-ring-color:rgb(191 219 254/var(--tw-ring-opacity,1))}.ring-blue-500{--tw-ring-opacity:1;--tw-ring-color:rgb(59 130 246/var(--tw-ring-opacity,1))}.ring-purple-500{--tw-ring-opacity:1;--tw-ring-color:rgb(168 85 247/var(--tw-ring-opacity,1))}.ring-white{--tw-ring-opacity:1;--tw-ring-color:rgb(255 255 255/var(--tw-ring-opacity,1))}.blur{--tw-blur:blur(8px)}.drop-shadow{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)}.drop-shadow{--tw-drop-shadow:drop-shadow(0 1px 2px #0000001a) drop-shadow(0 1px 1px #0000000f)}.grayscale{--tw-grayscale:grayscale(100%);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)}.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)}.backdrop-blur-sm{--tw-backdrop-blur:blur(4px)}.backdrop-filter{-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition{transition-duration:.15s;transition-property:color,background-color,border-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-text-decoration-color,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-text-decoration-color,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-all{transition-duration:.15s;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-colors{transition-duration:.15s;transition-property:color,background-color,border-color,fill,stroke,-webkit-text-decoration-color;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,-webkit-text-decoration-color;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-transform{transition-duration:.15s;transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-width{transition-duration:.15s;transition-property:width;transition-timing-function:cubic-bezier(.4,0,.2,1)}.duration-150{transition-duration:.15s}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}.duration-500{transition-duration:.5s}.ease-in{transition-timing-function:cubic-bezier(.4,0,1,1)}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}.ps__rail-y{background:none!important}.scrollbar-container{width:97%!important}.dropdown-menu{min-width:3rem}.w-md-editor-show-live{height:800!important}.bg-orange1{background-color:"#EF4444"}.react-pdf__Page__canvas{max-width:100vw!important;min-height:100vh!important}.outer-box{border:2px solid #333;height:400px;overflow:hidden;position:relative;width:300px}.parent-container{background:#f0f0f0;padding:20px;position:relative}.menu{background:#fff;border:1px solid #ccc;box-shadow:0 4px 6px #0000001a;left:0;max-height:200px;overflow-y:auto;position:absolute;top:100%;width:100%}.border-t-2{border-top-width:2px}.border-b-2{border-bottom-width:2px}.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-gray-400:hover{--tw-border-opacity:1;border-color:rgb(156 163 175/var(--tw-border-opacity,1))}.hover\:bg-\[\#007BFF\]:hover{--tw-bg-opacity:1;background-color:rgb(0 123 255/var(--tw-bg-opacity,1))}.hover\:bg-black:hover{--tw-bg-opacity:1;background-color:rgb(0 0 0/var(--tw-bg-opacity,1))}.hover\:bg-blue-100:hover{--tw-bg-opacity:1;background-color:rgb(219 234 254/var(--tw-bg-opacity,1))}.hover\:bg-blue-50:hover{--tw-bg-opacity:1;background-color:rgb(239 246 255/var(--tw-bg-opacity,1))}.hover\:bg-blue-600:hover{--tw-bg-opacity:1;background-color:rgb(37 99 235/var(--tw-bg-opacity,1))}.hover\:bg-blue-700:hover{--tw-bg-opacity:1;background-color:rgb(29 78 216/var(--tw-bg-opacity,1))}.hover\:bg-blue-800:hover{--tw-bg-opacity:1;background-color:rgb(30 64 175/var(--tw-bg-opacity,1))}.hover\:bg-emerald-50:hover{--tw-bg-opacity:1;background-color:rgb(236 253 245/var(--tw-bg-opacity,1))}.hover\:bg-emerald-600:hover{--tw-bg-opacity:1;background-color:rgb(5 150 105/var(--tw-bg-opacity,1))}.hover\:bg-emerald-700:hover{--tw-bg-opacity:1;background-color:rgb(4 120 87/var(--tw-bg-opacity,1))}.hover\:bg-gray-100:hover{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity,1))}.hover\:bg-gray-200:hover{--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity,1))}.hover\:bg-gray-300:hover{--tw-bg-opacity:1;background-color:rgb(209 213 219/var(--tw-bg-opacity,1))}.hover\:bg-gray-50:hover{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity,1))}.hover\:bg-gray-600:hover{--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity,1))}.hover\:bg-green-600:hover{--tw-bg-opacity:1;background-color:rgb(22 163 74/var(--tw-bg-opacity,1))}.hover\:bg-indigo-50:hover{--tw-bg-opacity:1;background-color:rgb(238 242 255/var(--tw-bg-opacity,1))}.hover\:bg-purple-700:hover{--tw-bg-opacity:1;background-color:rgb(126 34 206/var(--tw-bg-opacity,1))}.hover\:bg-red-100:hover{--tw-bg-opacity:1;background-color:rgb(254 226 226/var(--tw-bg-opacity,1))}.hover\:bg-slate-600:hover{--tw-bg-opacity:1;background-color:rgb(71 85 105/var(--tw-bg-opacity,1))}.hover\:bg-teal-50:hover{--tw-bg-opacity:1;background-color:rgb(240 253 250/var(--tw-bg-opacity,1))}.hover\:bg-violet-100:hover{--tw-bg-opacity:1;background-color:rgb(237 233 254/var(--tw-bg-opacity,1))}.hover\:bg-violet-700:hover{--tw-bg-opacity:1;background-color:rgb(109 40 217/var(--tw-bg-opacity,1))}.hover\:bg-opacity-10:hover{--tw-bg-opacity:0.1}.hover\:from-indigo-600:hover{--tw-gradient-from:#4f46e5 var(--tw-gradient-from-position);--tw-gradient-to:#4f46e500 var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.hover\:to-purple-600:hover{--tw-gradient-to:#9333ea var(--tw-gradient-to-position)}.hover\:text-gray-600:hover{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity,1))}.hover\:text-red-500:hover{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity,1))}.hover\:shadow-lg:hover{--tw-shadow:0 10px 15px -3px #0000001a,0 4px 6px -4px #0000001a;--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -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)}.hover\:ring-pink-500:hover{--tw-ring-opacity:1;--tw-ring-color:rgb(236 72 153/var(--tw-ring-opacity,1))}.focus\:border-indigo-400:focus{--tw-border-opacity:1;border-color:rgb(129 140 248/var(--tw-border-opacity,1))}.focus\:outline-none:focus{outline:2px solid #0000;outline-offset:2px}.focus\:ring:focus{--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(3px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.focus\:ring:focus{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus\:ring-0:focus{--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(var(--tw-ring-offset-width)) var(--tw-ring-color)}.focus\:ring-2:focus{--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\:ring-blue-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(59 130 246/var(--tw-ring-opacity,1))}.focus\:ring-gray-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(107 114 128/var(--tw-ring-opacity,1))}.focus\:ring-indigo-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(165 180 252/var(--tw-ring-opacity,1))}.focus\:ring-primary:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(69 76 191/var(--tw-ring-opacity,1))}.focus\:ring-red-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(239 68 68/var(--tw-ring-opacity,1))}.focus\:ring-offset-1:focus{--tw-ring-offset-width:1px}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}.sm\:block{display:block}.sm\:px-8{padding-left:2rem;padding-right:2rem}.sm\:text-base{font-size:1rem;line-height:1.5rem}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-restyle-components",
3
- "version": "0.4.63",
3
+ "version": "0.4.65",
4
4
  "private": false,
5
5
  "description": "Easy use restyle components",
6
6
  "author": {