react-restyle-components 0.4.45 → 0.4.46
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/src/core-components/src/components/Table/Table.js +53 -61
- package/lib/src/core-components/src/components/Table/elements.d.ts +6 -1
- package/lib/src/core-components/src/components/Table/elements.js +38 -6
- package/lib/src/core-components/src/components/Table/types.d.ts +1 -1
- package/lib/src/core-components/src/tc.global.css +2 -0
- package/package.json +1 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
3
|
import React, { forwardRef, useState, useCallback, useMemo, useEffect, useRef, } from 'react';
|
|
4
|
-
import { TableRoot, Toolbar, ToolbarGroup, SearchInput, ToolbarButton, TableWrapper, StyledTable, TableHeader, HeaderRow, HeaderCell, TableBody, TableRow, TableCell, Checkbox, ExpandButton, ExpandedRow, ExpandedCell, TableFooter, FooterRow, FooterCell, PaginationWrapper, PaginationInfo, PaginationControls, PageButton, PageSizeSelect, QuickJumper, EmptyState, LoadingOverlay, LoadingSpinner, EditableCell, CellEditor, ColumnTogglePanel, ColumnToggleHeader, ColumnToggleSearch, ColumnToggleList, ColumnToggleItem, ColumnToggleDragHandle, SelectionIndicator, SelectionCount, } from './elements';
|
|
4
|
+
import { TableRoot, Toolbar, ToolbarGroup, SearchInput, ToolbarButton, TableWrapper, StyledTable, TableHeader, HeaderRow, HeaderCell, TableBody, TableRow, TableCell, TableCellContent, Checkbox, ExpandButton, ExpandedRow, ExpandedCell, TableFooter, FooterRow, FooterCell, PaginationWrapper, PaginationInfo, PaginationControls, PageButton, PageSizeSelect, QuickJumper, EmptyState, LoadingOverlay, LoadingSpinner, EditableCell, CellEditor, ColumnTogglePanel, ColumnToggleHeader, ColumnToggleSearch, ColumnToggleList, ColumnToggleItem, ColumnToggleDragHandle, SelectionIndicator, SelectionCount, } from './elements';
|
|
5
5
|
import { useSortState, useFilterState, usePaginationState, useRowSelection, useRowExpansion, useColumnVisibility, useTableDebounce, sortData, filterData, paginateData, getNestedValue, exportToCSV, exportToExcel, } from './hooks';
|
|
6
6
|
import { getFilterComponent } from './filters';
|
|
7
7
|
import { Tooltip } from '../Tooltip';
|
|
@@ -118,6 +118,12 @@ export const Table = forwardRef(function TableComponent(props, ref) {
|
|
|
118
118
|
},
|
|
119
119
|
}
|
|
120
120
|
: rowSelection;
|
|
121
|
+
// Normalize allowed editable cells for disabled rows
|
|
122
|
+
const allowedEditingFields = useMemo(() => resolvedRowSelection
|
|
123
|
+
? resolvedRowSelection.allowEditingCells || []
|
|
124
|
+
: [], [resolvedRowSelection]);
|
|
125
|
+
const hasAllowedEditingFields = allowedEditingFields.length > 0;
|
|
126
|
+
const isFieldAllowedForDisabledRow = useCallback((field) => hasAllowedEditingFields ? allowedEditingFields.includes(field) : false, [hasAllowedEditingFields, allowedEditingFields]);
|
|
121
127
|
// Default pagination config - users don't need to pass these
|
|
122
128
|
const resolvedPaginationConfig = pagination
|
|
123
129
|
? {
|
|
@@ -511,22 +517,19 @@ export const Table = forwardRef(function TableComponent(props, ref) {
|
|
|
511
517
|
}, []);
|
|
512
518
|
// Handle cell edit
|
|
513
519
|
const handleCellDoubleClick = useCallback((row, rowIndex, column, colIndex, e) => {
|
|
514
|
-
// Only apply
|
|
520
|
+
// Only apply allowed-cells logic if rowSelection is configured
|
|
515
521
|
if (resolvedRowSelection) {
|
|
516
522
|
// Check if row is disabled
|
|
517
523
|
const checkboxProps = resolvedRowSelection.getCheckboxProps?.(row);
|
|
518
524
|
const isRowDisabled = !!checkboxProps?.disabled;
|
|
519
|
-
// Only apply
|
|
525
|
+
// Only apply allowed-cells logic when row is disabled
|
|
520
526
|
if (isRowDisabled) {
|
|
521
|
-
//
|
|
522
|
-
|
|
523
|
-
// If allowRows is NOT provided, block all clicks
|
|
524
|
-
if (!hasAllowRows) {
|
|
527
|
+
// If no allowed cells provided, block all clicks
|
|
528
|
+
if (!hasAllowedEditingFields) {
|
|
525
529
|
return;
|
|
526
530
|
}
|
|
527
|
-
//
|
|
528
|
-
|
|
529
|
-
if (!isInAllowRows) {
|
|
531
|
+
// Only allow clicks on columns in allowed list
|
|
532
|
+
if (!isFieldAllowedForDisabledRow(column.dataField)) {
|
|
530
533
|
return;
|
|
531
534
|
}
|
|
532
535
|
}
|
|
@@ -537,20 +540,18 @@ export const Table = forwardRef(function TableComponent(props, ref) {
|
|
|
537
540
|
column.events?.onDoubleClick?.(e, row, rowIndex, column, colIndex);
|
|
538
541
|
// Handle cell editing
|
|
539
542
|
if (editMode !== 'none') {
|
|
540
|
-
// Only apply
|
|
543
|
+
// Only apply allowed-cells logic if rowSelection is configured and row is disabled
|
|
541
544
|
if (resolvedRowSelection) {
|
|
542
545
|
const checkboxProps = resolvedRowSelection.getCheckboxProps?.(row);
|
|
543
546
|
const isRowDisabled = !!checkboxProps?.disabled;
|
|
544
547
|
if (isRowDisabled) {
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
const isInAllowRows = resolvedRowSelection.allowRows.includes(column.dataField);
|
|
548
|
-
if (isInAllowRows && editMode === 'dblclick') {
|
|
548
|
+
if (isFieldAllowedForDisabledRow(column.dataField)) {
|
|
549
|
+
if (editMode === 'dblclick') {
|
|
549
550
|
setEditingCell({ row: rowIndex, field: column.dataField });
|
|
550
551
|
setEditValue(getNestedValue(row, column.dataField));
|
|
551
552
|
}
|
|
552
553
|
}
|
|
553
|
-
// If row is disabled and no
|
|
554
|
+
// If row is disabled and no allowed cells, don't allow editing (already returned above)
|
|
554
555
|
}
|
|
555
556
|
else if (isEditable && editMode === 'dblclick') {
|
|
556
557
|
// Row is not disabled, allow normal editing
|
|
@@ -568,22 +569,19 @@ export const Table = forwardRef(function TableComponent(props, ref) {
|
|
|
568
569
|
onRowDoubleClick?.(row, rowIndex, e);
|
|
569
570
|
}, [editMode, onRowDoubleClick, getCellEditableInfo, resolvedRowSelection]);
|
|
570
571
|
const handleCellClick = useCallback((row, rowIndex, column, colIndex, e) => {
|
|
571
|
-
// Only apply
|
|
572
|
+
// Only apply allowed-cells logic if rowSelection is configured
|
|
572
573
|
if (resolvedRowSelection) {
|
|
573
574
|
// Check if row is disabled
|
|
574
575
|
const checkboxProps = resolvedRowSelection.getCheckboxProps?.(row);
|
|
575
576
|
const isRowDisabled = !!checkboxProps?.disabled;
|
|
576
|
-
// Only apply
|
|
577
|
+
// Only apply allowed-cells logic when row is disabled
|
|
577
578
|
if (isRowDisabled) {
|
|
578
|
-
//
|
|
579
|
-
|
|
580
|
-
// If allowRows is NOT provided, block all clicks
|
|
581
|
-
if (!hasAllowRows) {
|
|
579
|
+
// If no allowed cells provided, block all clicks
|
|
580
|
+
if (!hasAllowedEditingFields) {
|
|
582
581
|
return;
|
|
583
582
|
}
|
|
584
|
-
//
|
|
585
|
-
|
|
586
|
-
if (!isInAllowRows) {
|
|
583
|
+
// Only allow clicks on columns in allowed list
|
|
584
|
+
if (!isFieldAllowedForDisabledRow(column.dataField)) {
|
|
587
585
|
return;
|
|
588
586
|
}
|
|
589
587
|
}
|
|
@@ -596,20 +594,16 @@ export const Table = forwardRef(function TableComponent(props, ref) {
|
|
|
596
594
|
}
|
|
597
595
|
// Handle cell editing on click
|
|
598
596
|
if (editMode === 'click') {
|
|
599
|
-
// Only apply
|
|
597
|
+
// Only apply allowed-cells logic if rowSelection is configured and row is disabled
|
|
600
598
|
if (resolvedRowSelection) {
|
|
601
599
|
const checkboxProps = resolvedRowSelection.getCheckboxProps?.(row);
|
|
602
600
|
const isRowDisabled = !!checkboxProps?.disabled;
|
|
603
601
|
if (isRowDisabled) {
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
if (isInAllowRows) {
|
|
608
|
-
setEditingCell({ row: rowIndex, field: column.dataField });
|
|
609
|
-
setEditValue(getNestedValue(row, column.dataField));
|
|
610
|
-
}
|
|
602
|
+
if (isFieldAllowedForDisabledRow(column.dataField)) {
|
|
603
|
+
setEditingCell({ row: rowIndex, field: column.dataField });
|
|
604
|
+
setEditValue(getNestedValue(row, column.dataField));
|
|
611
605
|
}
|
|
612
|
-
// If row is disabled and no
|
|
606
|
+
// If row is disabled and no allowed cells, don't allow editing (already returned above)
|
|
613
607
|
}
|
|
614
608
|
else if (isEditable) {
|
|
615
609
|
// Row is not disabled, allow normal editing
|
|
@@ -1438,49 +1432,47 @@ export const Table = forwardRef(function TableComponent(props, ref) {
|
|
|
1438
1432
|
// Check if column is editable (needed for disabled row handling)
|
|
1439
1433
|
const editInfo = getCellEditableInfo(column, row, rowIndex, colIndex);
|
|
1440
1434
|
// Determine if column is effectively editable:
|
|
1441
|
-
// - If rowSelection is configured AND row is disabled AND
|
|
1442
|
-
// - If rowSelection is configured AND row is disabled AND
|
|
1435
|
+
// - If rowSelection is configured AND row is disabled AND no allowed cells are provided: NOT editable (even if marked as editable)
|
|
1436
|
+
// - If rowSelection is configured AND row is disabled AND allowed cells are provided: editable only if in allowed list
|
|
1443
1437
|
// - Otherwise: editable if marked as editable
|
|
1444
1438
|
const isRowDisabled = !!checkboxProps?.disabled;
|
|
1445
1439
|
let isEffectivelyEditable = editInfo.isEditable;
|
|
1446
|
-
// Only apply
|
|
1440
|
+
// Only apply allow list logic if rowSelection is configured and row is disabled
|
|
1447
1441
|
if (resolvedRowSelection && isRowDisabled) {
|
|
1448
|
-
|
|
1449
|
-
|
|
1450
|
-
// No allowRows provided: disable all columns
|
|
1442
|
+
if (!hasAllowedEditingFields) {
|
|
1443
|
+
// No allowed cells provided: disable all columns
|
|
1451
1444
|
isEffectivelyEditable = false;
|
|
1452
1445
|
}
|
|
1453
1446
|
else {
|
|
1454
|
-
//
|
|
1455
|
-
const
|
|
1456
|
-
isEffectivelyEditable =
|
|
1447
|
+
// Allowed cells provided: only those columns are editable
|
|
1448
|
+
const isAllowed = isFieldAllowedForDisabledRow(column.dataField);
|
|
1449
|
+
isEffectivelyEditable = isAllowed;
|
|
1457
1450
|
}
|
|
1458
1451
|
}
|
|
1459
|
-
// Check if column is in
|
|
1460
|
-
const
|
|
1452
|
+
// Check if column is in allowed list (for styling purposes)
|
|
1453
|
+
const isInAllowedCells = !!(resolvedRowSelection &&
|
|
1461
1454
|
isRowDisabled &&
|
|
1462
|
-
|
|
1463
|
-
|
|
1464
|
-
|
|
1465
|
-
|
|
1455
|
+
hasAllowedEditingFields &&
|
|
1456
|
+
isFieldAllowedForDisabledRow(column.dataField));
|
|
1457
|
+
const cellContent = (() => {
|
|
1458
|
+
if (isEffectivelyEditable && editMode !== 'none') {
|
|
1459
|
+
// Check for custom editor
|
|
1460
|
+
if (editInfo.customEditor) {
|
|
1461
|
+
return editInfo.customEditor;
|
|
1462
|
+
}
|
|
1463
|
+
return (_jsx(EditableCell, { "$editing": editingCell?.row === rowIndex &&
|
|
1464
|
+
editingCell?.field === column.dataField, "$showEditIcon": showEditIcon, children: renderCellContent(row, column, rowIndex, colIndex) }));
|
|
1465
|
+
}
|
|
1466
|
+
return renderCellContent(row, column, rowIndex, colIndex);
|
|
1467
|
+
})();
|
|
1468
|
+
return (_jsx(TableCell, { "$align": column.align || 'left', "$compact": compact, "$padding": cellPadding, "$pinned": column.pinned, "$hasCustomClass": !!cellClass, "$disabled": isRowDisabled, "$isEditable": isEffectivelyEditable, "$isInAllowedCells": isInAllowedCells, className: cellClass || classNames.cell, style: {
|
|
1466
1469
|
...styles.cell,
|
|
1467
1470
|
...cellStyle,
|
|
1468
1471
|
...cellResizeStyle,
|
|
1469
1472
|
}, "data-column": column.dataField, onClick: (e) => handleCellClick(row, rowIndex, column, colIndex, e), onDoubleClick: (e) => {
|
|
1470
1473
|
e.stopPropagation(); // Prevent row-level double-click from interfering
|
|
1471
1474
|
handleCellDoubleClick(row, rowIndex, column, colIndex, e);
|
|
1472
|
-
}, role: "gridcell", children: (
|
|
1473
|
-
if (isEffectivelyEditable &&
|
|
1474
|
-
editMode !== 'none') {
|
|
1475
|
-
// Check for custom editor
|
|
1476
|
-
if (editInfo.customEditor) {
|
|
1477
|
-
return editInfo.customEditor;
|
|
1478
|
-
}
|
|
1479
|
-
return (_jsx(EditableCell, { "$editing": editingCell?.row === rowIndex &&
|
|
1480
|
-
editingCell?.field === column.dataField, "$showEditIcon": showEditIcon, children: renderCellContent(row, column, rowIndex, colIndex) }));
|
|
1481
|
-
}
|
|
1482
|
-
return renderCellContent(row, column, rowIndex, colIndex);
|
|
1483
|
-
})() }, column.dataField));
|
|
1475
|
+
}, role: "gridcell", children: _jsx(TableCellContent, { "$hasFormatter": !!column.formatter, children: cellContent }) }, column.dataField));
|
|
1484
1476
|
})] }), expandable && rowExpanded && isExpandable && (_jsx(ExpandedRow, { children: _jsx(ExpandedCell, { colSpan: visibleColumns.length +
|
|
1485
1477
|
(resolvedRowSelection?.mode === 'checkbox'
|
|
1486
1478
|
? 1
|
|
@@ -56,6 +56,11 @@ export declare const TableRow: import("styled-components/dist/types").IStyledCom
|
|
|
56
56
|
$disabled: boolean;
|
|
57
57
|
$hasCustomSelectedStyle?: boolean | undefined;
|
|
58
58
|
}>> & string;
|
|
59
|
+
export declare const TableCellContent: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components/dist/types").Substitute<import("styled-components").FastOmit<import("styled-components/dist/types").Substitute<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref"> & {
|
|
60
|
+
ref?: import("react").RefObject<HTMLDivElement> | ((instance: HTMLDivElement | null) => void) | null | undefined;
|
|
61
|
+
}>, never>, {
|
|
62
|
+
$hasFormatter?: boolean | undefined;
|
|
63
|
+
}>> & string;
|
|
59
64
|
export declare const TableCell: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components/dist/types").Substitute<import("react").DetailedHTMLProps<import("react").TdHTMLAttributes<HTMLTableDataCellElement>, HTMLTableDataCellElement>, {
|
|
60
65
|
$align: string;
|
|
61
66
|
$compact: boolean;
|
|
@@ -64,7 +69,7 @@ export declare const TableCell: import("styled-components/dist/types").IStyledCo
|
|
|
64
69
|
$hasCustomClass?: boolean | undefined;
|
|
65
70
|
$disabled?: boolean | undefined;
|
|
66
71
|
$isEditable?: boolean | undefined;
|
|
67
|
-
$
|
|
72
|
+
$isInAllowedCells?: boolean | undefined;
|
|
68
73
|
}>> & string;
|
|
69
74
|
export declare const Checkbox: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components").FastOmit<import("styled-components").FastOmit<import("styled-components/dist/types").Substitute<import("react").DetailedHTMLProps<import("react").InputHTMLAttributes<HTMLInputElement>, HTMLInputElement>, Omit<import("react").DetailedHTMLProps<import("react").InputHTMLAttributes<HTMLInputElement>, HTMLInputElement>, "ref"> & {
|
|
70
75
|
ref?: ((instance: HTMLInputElement | null) => void) | import("react").RefObject<HTMLInputElement> | null | undefined;
|
|
@@ -419,6 +419,25 @@ export const TableRow = styled.tr `
|
|
|
419
419
|
}
|
|
420
420
|
`}
|
|
421
421
|
`;
|
|
422
|
+
export const TableCellContent = styled.div.attrs({
|
|
423
|
+
className: 'tc-table-cell-content',
|
|
424
|
+
}) `
|
|
425
|
+
display: flex;
|
|
426
|
+
width: 100%;
|
|
427
|
+
min-width: 0;
|
|
428
|
+
align-items: stretch;
|
|
429
|
+
gap: 0;
|
|
430
|
+
|
|
431
|
+
${({ $hasFormatter }) => !$hasFormatter &&
|
|
432
|
+
css `
|
|
433
|
+
display: block;
|
|
434
|
+
`}
|
|
435
|
+
|
|
436
|
+
> * {
|
|
437
|
+
width: 100%;
|
|
438
|
+
min-width: 0;
|
|
439
|
+
}
|
|
440
|
+
`;
|
|
422
441
|
export const TableCell = styled.td `
|
|
423
442
|
padding: ${({ $padding, $compact }) => $padding || ($compact ? '2px' : '2px')};
|
|
424
443
|
text-align: ${({ $align }) => $align};
|
|
@@ -449,9 +468,22 @@ export const TableCell = styled.td `
|
|
|
449
468
|
`}
|
|
450
469
|
|
|
451
470
|
/* Ensure formatter content displays properly */
|
|
452
|
-
/*
|
|
453
|
-
|
|
454
|
-
|
|
471
|
+
/* Use a dedicated wrapper to allow formatter content to stretch full width */
|
|
472
|
+
> .tc-table-cell-content {
|
|
473
|
+
display: flex;
|
|
474
|
+
align-items: stretch;
|
|
475
|
+
width: 100%;
|
|
476
|
+
min-width: 0;
|
|
477
|
+
gap: 0;
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
> .tc-table-cell-content > * {
|
|
481
|
+
width: 100%;
|
|
482
|
+
min-width: 0;
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
/* Default inline layout for legacy direct children */
|
|
486
|
+
> :not(.tc-table-cell-content) {
|
|
455
487
|
display: inline-block;
|
|
456
488
|
vertical-align: middle;
|
|
457
489
|
}
|
|
@@ -502,9 +534,9 @@ export const TableCell = styled.td `
|
|
|
502
534
|
box-sizing: border-box;
|
|
503
535
|
`}
|
|
504
536
|
|
|
505
|
-
/* Remove opacity for columns
|
|
506
|
-
${({ $disabled, $
|
|
507
|
-
$
|
|
537
|
+
/* Remove opacity for allowed columns when row is disabled and ensure proper width */
|
|
538
|
+
${({ $disabled, $isInAllowedCells }) => $disabled &&
|
|
539
|
+
$isInAllowedCells &&
|
|
508
540
|
css `
|
|
509
541
|
opacity: 1 !important;
|
|
510
542
|
pointer-events: auto !important;
|
|
@@ -230,7 +230,7 @@ export interface TableSelectionConfig<T = any> {
|
|
|
230
230
|
/** Column title */
|
|
231
231
|
columnTitle?: React.ReactNode;
|
|
232
232
|
/** Array of column dataField values that should remain editable and without opacity when row is disabled */
|
|
233
|
-
|
|
233
|
+
allowEditingCells?: string[];
|
|
234
234
|
}
|
|
235
235
|
/** Row expand config */
|
|
236
236
|
export interface TableExpandConfig<T = any> {
|
|
@@ -259,5 +259,7 @@
|
|
|
259
259
|
/*! tailwindcss v3.4.19 | MIT License | https://tailwindcss.com*/
|
|
260
260
|
/*! tailwindcss v3.4.19 | MIT License | https://tailwindcss.com*/
|
|
261
261
|
/*! tailwindcss v3.4.19 | MIT License | https://tailwindcss.com*/
|
|
262
|
+
/*! tailwindcss v3.4.19 | MIT License | https://tailwindcss.com*/
|
|
263
|
+
/*! tailwindcss v3.4.19 | MIT License | https://tailwindcss.com*/
|
|
262
264
|
/*! tailwindcss v3.4.19 | MIT License | https://tailwindcss.com*/*,.dark\:bg-black:is(.dark *),.dark\:border-gray-600:is(.dark *),: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: }
|
|
263
265
|
/*! 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 *),*,: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 *),.focus\:ring-0:focus,.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,.focus\:ring-1: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){}
|