flikkui 0.2.0-beta.2 → 0.2.0-beta.5
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/README.md +92 -0
- package/dist/components/ai/PromptInput/PromptInput.js +23 -15
- package/dist/components/ai/PromptSuggestions/PromptSuggestion.d.ts +27 -0
- package/dist/components/ai/PromptSuggestions/PromptSuggestion.js +62 -0
- package/dist/components/ai/PromptSuggestions/PromptSuggestion.theme.d.ts +10 -0
- package/dist/components/ai/PromptSuggestions/PromptSuggestion.theme.js +12 -0
- package/dist/components/ai/PromptSuggestions/PromptSuggestion.types.d.ts +53 -0
- package/dist/components/ai/PromptSuggestions/index.d.ts +4 -2
- package/dist/components/ai/index.d.ts +2 -12
- package/dist/components/charts/ActivityRings/ActivityRings.js +70 -58
- package/dist/components/charts/ActivityRings/ActivityRings.theme.js +0 -1
- package/dist/components/charts/ActivityRings/ActivityRings.types.d.ts +17 -0
- package/dist/components/charts/BarChart/BarChart.js +8 -4
- package/dist/components/charts/BarChart/BarChart.types.d.ts +14 -0
- package/dist/components/charts/DonutChart/DonutChart.js +11 -8
- package/dist/components/charts/DonutChart/DonutChart.theme.d.ts +3 -0
- package/dist/components/charts/DonutChart/DonutChart.theme.js +5 -4
- package/dist/components/charts/DonutChart/donut-utils.d.ts +5 -0
- package/dist/components/charts/DonutChart/donut-utils.js +26 -1
- package/dist/components/charts/Heatmap/Heatmap.theme.js +2 -2
- package/dist/components/charts/shared/ChartAxis/XAxis.d.ts +2 -2
- package/dist/components/charts/shared/ChartAxis/XAxis.js +4 -4
- package/dist/components/charts/shared/ChartAxis/YAxis.d.ts +2 -2
- package/dist/components/charts/shared/ChartAxis/YAxis.js +8 -7
- package/dist/components/charts/shared/ChartGrid/HorizontalGrid.d.ts +1 -1
- package/dist/components/charts/shared/ChartGrid/HorizontalGrid.js +2 -2
- package/dist/components/charts/theme/chart.theme.d.ts +1 -1
- package/dist/components/charts/theme/chart.theme.js +39 -39
- package/dist/components/core/Accordion/Accordion.d.ts +1 -1
- package/dist/components/core/Accordion/Accordion.js +2 -2
- package/dist/components/core/Accordion/Accordion.types.d.ts +8 -0
- package/dist/components/core/Badge/Badge.js +11 -15
- package/dist/components/core/Badge/Badge.theme.js +7 -21
- package/dist/components/core/Badge/Badge.types.d.ts +9 -1
- package/dist/components/core/Button/Button.js +2 -2
- package/dist/components/core/Button/Button.theme.js +1 -1
- package/dist/components/core/Button/Button.types.d.ts +8 -0
- package/dist/components/core/Card/Card.js +8 -2
- package/dist/components/core/Card/Card.theme.js +1 -1
- package/dist/components/core/Card/Card.types.d.ts +24 -1
- package/dist/components/core/Drawer/Drawer.d.ts +1 -1
- package/dist/components/core/Drawer/Drawer.js +10 -40
- package/dist/components/core/Drawer/Drawer.theme.js +2 -1
- package/dist/components/core/Drawer/Drawer.types.d.ts +8 -0
- package/dist/components/core/Dropdown/Dropdown.d.ts +1 -1
- package/dist/components/core/Dropdown/Dropdown.js +2 -2
- package/dist/components/core/Dropdown/Dropdown.types.d.ts +8 -0
- package/dist/components/core/Metric/Metric.d.ts +1 -1
- package/dist/components/core/Metric/Metric.js +9 -5
- package/dist/components/core/Metric/Metric.theme.d.ts +1 -1
- package/dist/components/core/Metric/Metric.theme.js +38 -28
- package/dist/components/core/Metric/Metric.types.d.ts +27 -8
- package/dist/components/core/Modal/Modal.d.ts +1 -1
- package/dist/components/core/Modal/Modal.js +17 -40
- package/dist/components/core/Modal/Modal.theme.js +8 -3
- package/dist/components/core/Modal/Modal.types.d.ts +18 -0
- package/dist/components/core/Modal/index.d.ts +1 -1
- package/dist/components/core/Notification/Notification.js +2 -0
- package/dist/components/core/Pill/Pill.d.ts +6 -11
- package/dist/components/core/Pill/Pill.theme.d.ts +2 -2
- package/dist/components/core/Pill/Pill.types.d.ts +9 -22
- package/dist/components/core/Pill/index.d.ts +1 -1
- package/dist/components/core/Popover/Popover.d.ts +1 -1
- package/dist/components/core/Popover/Popover.js +2 -2
- package/dist/components/core/Popover/Popover.types.d.ts +8 -0
- package/dist/components/core/Progress/Progress.d.ts +28 -0
- package/dist/components/core/Progress/Progress.js +114 -0
- package/dist/components/core/Progress/Progress.theme.d.ts +5 -0
- package/dist/components/core/Progress/Progress.theme.js +33 -0
- package/dist/components/core/Progress/Progress.types.d.ts +92 -0
- package/dist/components/core/Progress/index.d.ts +2 -0
- package/dist/components/core/Table/Table.animations.d.ts +5 -16
- package/dist/components/core/Table/Table.animations.js +46 -0
- package/dist/components/core/Table/Table.d.ts +0 -27
- package/dist/components/core/Table/Table.js +58 -156
- package/dist/components/core/Table/Table.theme.js +28 -19
- package/dist/components/core/Table/Table.types.d.ts +95 -8
- package/dist/components/core/Table/Table.utils.d.ts +7 -0
- package/dist/components/core/Table/Table.utils.js +11 -1
- package/dist/components/core/Table/{components/TableActions/TableActions.d.ts → TableActions.d.ts} +3 -3
- package/dist/components/core/Table/{components/TableActions/TableActions.js → TableActions.js} +14 -24
- package/dist/components/core/Table/{components/TableActions/TableActionsMenu.d.ts → TableActionsMenu.d.ts} +1 -1
- package/dist/components/core/Table/{components/TableActions/TableActionsMenu.js → TableActionsMenu.js} +4 -4
- package/dist/components/core/Table/{components/core/TableBody.d.ts → TableBody.d.ts} +1 -1
- package/dist/components/core/Table/{components/core/TableBody.js → TableBody.js} +14 -20
- package/dist/components/core/Table/{components/core/TableCell.d.ts → TableCell.d.ts} +1 -9
- package/dist/components/core/Table/{components/core/TableCell.js → TableCell.js} +5 -13
- package/dist/components/core/Table/TableColumnManager.d.ts +3 -0
- package/dist/components/core/Table/TableColumnManager.js +34 -0
- package/dist/components/core/Table/{components/DeclarativeComponents.d.ts → TableDeclarative.d.ts} +1 -1
- package/dist/components/core/Table/{components/DeclarativeComponents.js → TableDeclarative.js} +6 -56
- package/dist/components/core/Table/TableFilter.d.ts +3 -0
- package/dist/components/core/Table/TableFilter.js +122 -0
- package/dist/components/core/Table/{components/core/TableHeader.d.ts → TableHeader.d.ts} +1 -1
- package/dist/components/core/Table/{components/core/TableHeader.js → TableHeader.js} +15 -29
- package/dist/components/core/Table/TablePagination.d.ts +7 -0
- package/dist/components/core/Table/{components/TablePagination/TablePagination.js → TablePagination.js} +5 -16
- package/dist/components/core/Table/TableRow.d.ts +8 -0
- package/dist/components/core/Table/TableRow.js +45 -0
- package/dist/components/core/Table/TableSelectionHeader.d.ts +7 -0
- package/dist/components/core/Table/{components/TableSelectionHeader/TableSelectionHeader.js → TableSelectionHeader.js} +4 -5
- package/dist/components/core/Table/hooks/index.d.ts +10 -0
- package/dist/components/core/Table/hooks/useTableColumns.d.ts +16 -0
- package/dist/components/core/Table/hooks/useTableColumns.js +67 -0
- package/dist/components/core/Table/hooks/useTableExpansion.d.ts +8 -0
- package/dist/components/core/Table/hooks/useTableExpansion.js +15 -0
- package/dist/components/core/Table/hooks/useTableFilter.d.ts +12 -0
- package/dist/components/core/Table/hooks/useTableFilter.js +37 -0
- package/dist/components/core/Table/hooks/useTablePagination.d.ts +12 -0
- package/dist/components/core/Table/hooks/useTablePagination.js +13 -0
- package/dist/components/core/Table/hooks/useTableSelection.d.ts +17 -0
- package/dist/components/core/Table/hooks/useTableSelection.js +40 -0
- package/dist/components/core/Table/index.d.ts +9 -8
- package/dist/components/core/Table/index.js +7 -5
- package/dist/components/core/Tabs/Tabs.js +2 -2
- package/dist/components/core/Tabs/Tabs.types.d.ts +8 -0
- package/dist/components/core/Tag/Tag.animations.d.ts +3 -0
- package/dist/components/core/Tag/Tag.animations.js +31 -0
- package/dist/components/core/Tag/Tag.d.ts +14 -0
- package/dist/components/core/Tag/Tag.js +45 -0
- package/dist/components/core/Tag/Tag.theme.d.ts +2 -0
- package/dist/components/core/Tag/Tag.theme.js +21 -0
- package/dist/components/core/Tag/Tag.types.d.ts +40 -0
- package/dist/components/core/Tag/index.d.ts +3 -0
- package/dist/components/core/Tooltip/Tooltip.d.ts +1 -1
- package/dist/components/core/Tooltip/Tooltip.js +3 -3
- package/dist/components/core/Tooltip/Tooltip.theme.js +1 -1
- package/dist/components/core/Tooltip/Tooltip.types.d.ts +17 -0
- package/dist/components/core/index.d.ts +2 -1
- package/dist/components/core/index.js +12 -5
- package/dist/components/effects/CustomCursor/CustomCursor.d.ts +0 -13
- package/dist/components/effects/CustomCursor/CustomCursor.js +26 -2
- package/dist/components/effects/CustomCursor/CustomCursor.theme.js +12 -1
- package/dist/components/effects/CustomCursor/CustomCursor.types.d.ts +14 -1
- package/dist/components/forms/Combobox/Combobox.d.ts +25 -0
- package/dist/components/forms/Combobox/Combobox.js +412 -0
- package/dist/components/forms/Combobox/Combobox.theme.d.ts +6 -0
- package/dist/components/forms/Combobox/Combobox.theme.js +60 -0
- package/dist/components/forms/Combobox/Combobox.types.d.ts +111 -0
- package/dist/components/forms/Combobox/index.d.ts +3 -0
- package/dist/components/forms/FileUpload/FileUpload.js +2 -0
- package/dist/components/forms/Input/Input.js +25 -28
- package/dist/components/forms/Input/inputMasks.d.ts +15 -0
- package/dist/components/forms/Input/inputMasks.js +72 -1
- package/dist/components/forms/InputTag/InputTag.d.ts +40 -0
- package/dist/components/forms/InputTag/InputTag.js +491 -0
- package/dist/components/forms/InputTag/InputTag.theme.d.ts +2 -0
- package/dist/components/forms/InputTag/InputTag.theme.js +16 -0
- package/dist/components/forms/InputTag/InputTag.types.d.ts +107 -0
- package/dist/components/forms/InputTag/index.d.ts +3 -0
- package/dist/components/forms/Select/Select.d.ts +101 -2
- package/dist/components/forms/Select/Select.js +128 -132
- package/dist/components/forms/Select/Select.theme.js +10 -14
- package/dist/components/forms/Select/Select.types.d.ts +6 -2
- package/dist/components/forms/Select/index.d.ts +7 -4
- package/dist/components/forms/Select/useSelectState.d.ts +66 -0
- package/dist/components/forms/Select/useSelectState.js +134 -0
- package/dist/components/forms/SelectExpand/SelectExpand.animations.d.ts +20 -0
- package/dist/components/forms/SelectExpand/SelectExpand.animations.js +74 -0
- package/dist/components/forms/SelectExpand/SelectExpand.d.ts +9 -0
- package/dist/components/forms/SelectExpand/SelectExpand.js +223 -0
- package/dist/components/forms/SelectExpand/SelectExpand.theme.d.ts +5 -0
- package/dist/components/forms/SelectExpand/SelectExpand.theme.js +74 -0
- package/dist/components/forms/SelectExpand/SelectExpand.types.d.ts +126 -0
- package/dist/components/forms/SelectExpand/index.d.ts +4 -0
- package/dist/components/forms/Switch/Switch.js +3 -3
- package/dist/components/forms/Switch/Switch.theme.d.ts +1 -1
- package/dist/components/forms/Switch/Switch.theme.js +2 -2
- package/dist/components/forms/TimePicker/TimePicker.animations.d.ts +0 -46
- package/dist/components/forms/TimePicker/TimePicker.d.ts +15 -6
- package/dist/components/forms/TimePicker/TimePicker.js +285 -124
- package/dist/components/forms/TimePicker/TimePicker.theme.d.ts +1 -1
- package/dist/components/forms/TimePicker/TimePicker.theme.js +39 -22
- package/dist/components/forms/TimePicker/TimePicker.types.d.ts +88 -34
- package/dist/components/forms/TimePicker/TimePickerContent.d.ts +7 -10
- package/dist/components/forms/TimePicker/TimePickerContent.js +149 -16
- package/dist/components/forms/TimePicker/TimePickerTrigger.d.ts +3 -3
- package/dist/components/forms/TimePicker/TimePickerTrigger.js +22 -19
- package/dist/components/forms/TimePicker/WheelColumn.d.ts +14 -0
- package/dist/components/forms/TimePicker/WheelColumn.js +90 -0
- package/dist/components/forms/TimePicker/index.d.ts +4 -1
- package/dist/components/forms/TimePicker/useWheelPicker.d.ts +37 -0
- package/dist/components/forms/TimePicker/useWheelPicker.js +138 -0
- package/dist/components/forms/forms.theme.d.ts +14 -0
- package/dist/components/forms/forms.theme.js +31 -0
- package/dist/components/forms/index.d.ts +9 -3
- package/dist/components/forms/index.js +73 -2
- package/dist/hooks/index.d.ts +0 -4
- package/dist/icons/Icon.d.ts +7 -0
- package/dist/icons/Icon.js +6 -2
- package/dist/index.js +21 -19
- package/dist/styles.css +1 -1
- package/dist/utils/index.d.ts +0 -1
- package/dist/utils/optimisticErrors.js +1 -70
- package/package.json +1 -1
- package/dist/components/ai/EditingIndicator/EditingIndicator.animations.d.ts +0 -31
- package/dist/components/ai/EditingIndicator/EditingIndicator.animations.js +0 -115
- package/dist/components/ai/EditingIndicator/EditingIndicator.d.ts +0 -35
- package/dist/components/ai/EditingIndicator/EditingIndicator.js +0 -94
- package/dist/components/ai/EditingIndicator/EditingIndicator.theme.d.ts +0 -2
- package/dist/components/ai/EditingIndicator/EditingIndicator.theme.js +0 -13
- package/dist/components/ai/EditingIndicator/EditingIndicator.types.d.ts +0 -54
- package/dist/components/ai/EditingIndicator/index.d.ts +0 -9
- package/dist/components/ai/GenerativeRenderer/GenerativeRenderer.d.ts +0 -3
- package/dist/components/ai/GenerativeRenderer/GenerativeRenderer.js +0 -126
- package/dist/components/ai/GenerativeRenderer/GenerativeRenderer.theme.d.ts +0 -2
- package/dist/components/ai/GenerativeRenderer/GenerativeRenderer.theme.js +0 -8
- package/dist/components/ai/GenerativeRenderer/GenerativeRenderer.types.d.ts +0 -45
- package/dist/components/ai/GenerativeRenderer/index.d.ts +0 -3
- package/dist/components/ai/PresenceIndicator/PresenceIndicator.animations.d.ts +0 -17
- package/dist/components/ai/PresenceIndicator/PresenceIndicator.animations.js +0 -56
- package/dist/components/ai/PresenceIndicator/PresenceIndicator.d.ts +0 -38
- package/dist/components/ai/PresenceIndicator/PresenceIndicator.js +0 -110
- package/dist/components/ai/PresenceIndicator/PresenceIndicator.theme.d.ts +0 -2
- package/dist/components/ai/PresenceIndicator/PresenceIndicator.theme.js +0 -13
- package/dist/components/ai/PresenceIndicator/PresenceIndicator.types.d.ts +0 -53
- package/dist/components/ai/PresenceIndicator/index.d.ts +0 -8
- package/dist/components/ai/PresenceProvider/PresenceContext.d.ts +0 -24
- package/dist/components/ai/PresenceProvider/PresenceContext.js +0 -34
- package/dist/components/ai/PresenceProvider/PresenceProvider.d.ts +0 -32
- package/dist/components/ai/PresenceProvider/PresenceProvider.js +0 -321
- package/dist/components/ai/PresenceProvider/PresenceProvider.types.d.ts +0 -140
- package/dist/components/ai/PresenceProvider/adapters/MockAdapter.d.ts +0 -102
- package/dist/components/ai/PresenceProvider/adapters/MockAdapter.js +0 -331
- package/dist/components/ai/PresenceProvider/adapters/PresenceAdapter.d.ts +0 -93
- package/dist/components/ai/PresenceProvider/adapters/SupabaseAdapter.d.ts +0 -134
- package/dist/components/ai/PresenceProvider/adapters/WebSocketAdapter.d.ts +0 -149
- package/dist/components/ai/PresenceProvider/adapters/index.d.ts +0 -11
- package/dist/components/ai/PresenceProvider/index.d.ts +0 -10
- package/dist/components/ai/PromptSuggestions/PromptSuggestions.d.ts +0 -27
- package/dist/components/ai/PromptSuggestions/PromptSuggestions.js +0 -61
- package/dist/components/ai/PromptSuggestions/PromptSuggestions.types.d.ts +0 -65
- package/dist/components/ai/VersionSlider/VersionSlider.d.ts +0 -3
- package/dist/components/ai/VersionSlider/VersionSlider.js +0 -97
- package/dist/components/ai/VersionSlider/VersionSlider.theme.d.ts +0 -2
- package/dist/components/ai/VersionSlider/VersionSlider.theme.js +0 -18
- package/dist/components/ai/VersionSlider/VersionSlider.types.d.ts +0 -77
- package/dist/components/ai/VersionSlider/index.d.ts +0 -3
- package/dist/components/core/Pill/Pill.animations.js +0 -25
- package/dist/components/core/Pill/Pill.js +0 -145
- package/dist/components/core/Pill/Pill.theme.js +0 -65
- package/dist/components/core/RetryBoundary/RetryBoundary.d.ts +0 -35
- package/dist/components/core/RetryBoundary/RetryBoundary.js +0 -154
- package/dist/components/core/RetryBoundary/RetryBoundary.theme.d.ts +0 -2
- package/dist/components/core/RetryBoundary/RetryBoundary.theme.js +0 -7
- package/dist/components/core/RetryBoundary/RetryBoundary.types.d.ts +0 -51
- package/dist/components/core/RetryBoundary/index.d.ts +0 -3
- package/dist/components/core/Table/components/TableActions/TableActions.types.d.ts +0 -40
- package/dist/components/core/Table/components/TableActions/index.d.ts +0 -3
- package/dist/components/core/Table/components/TableActionsMenu.d.ts +0 -6
- package/dist/components/core/Table/components/TablePagination/TablePagination.d.ts +0 -17
- package/dist/components/core/Table/components/TablePagination/TablePagination.types.d.ts +0 -21
- package/dist/components/core/Table/components/TablePagination/index.d.ts +0 -2
- package/dist/components/core/Table/components/TableSelectionHeader/TableSelectionHeader.d.ts +0 -15
- package/dist/components/core/Table/components/TableSelectionHeader/index.d.ts +0 -3
- package/dist/components/core/Table/components/core/TableRow.d.ts +0 -3
- package/dist/components/core/Table/components/core/TableRow.js +0 -44
- package/dist/components/core/Table/components/core/index.d.ts +0 -4
- package/dist/components/forms/OptimisticForm/OptimisticForm.d.ts +0 -33
- package/dist/components/forms/OptimisticForm/OptimisticForm.js +0 -87
- package/dist/components/forms/OptimisticForm/OptimisticForm.theme.d.ts +0 -2
- package/dist/components/forms/OptimisticForm/OptimisticForm.theme.js +0 -8
- package/dist/components/forms/OptimisticForm/OptimisticForm.types.d.ts +0 -74
- package/dist/components/forms/OptimisticForm/index.d.ts +0 -3
- package/dist/hooks/useOptimisticMutation.d.ts +0 -109
- package/dist/hooks/useOptimisticMutation.js +0 -171
- package/dist/hooks/usePresence.d.ts +0 -88
- package/dist/utils/presenceUtils.d.ts +0 -66
- package/dist/utils/presenceUtils.js +0 -107
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { TableSelectionHeaderProps } from "./Table.types";
|
|
3
|
+
/**
|
|
4
|
+
* Selection header that appears when rows are selected
|
|
5
|
+
* Shows selection count and bulk action buttons
|
|
6
|
+
*/
|
|
7
|
+
export declare const TableSelectionHeader: React.FC<TableSelectionHeaderProps>;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import React__default from 'react';
|
|
2
2
|
import { XMarkIcon } from '@heroicons/react/24/outline';
|
|
3
|
-
import { Button } from '
|
|
4
|
-
import { cn } from '
|
|
3
|
+
import { Button } from '../Button/Button.js';
|
|
4
|
+
import { cn } from '../../../utils/cn.js';
|
|
5
5
|
|
|
6
6
|
/**
|
|
7
7
|
* Selection header that appears when rows are selected
|
|
@@ -10,13 +10,12 @@ import { cn } from '../../../../../utils/cn.js';
|
|
|
10
10
|
const TableSelectionHeader = ({ selectedCount, totalCount, selectedRows, bulkActions = [], onClearSelection, className, }) => {
|
|
11
11
|
if (selectedCount === 0)
|
|
12
12
|
return null;
|
|
13
|
-
return (React__default.createElement("div", { className: cn("flex items-center justify-between px-3 py-1 rounded-lg shadow-xl bg-
|
|
13
|
+
return (React__default.createElement("div", { className: cn("flex items-center justify-between px-3 py-1 rounded-lg shadow-xl bg-[var(--color-background-secondary)] z-10", className) },
|
|
14
14
|
React__default.createElement("div", { className: "flex items-center gap-3" },
|
|
15
|
-
React__default.createElement("span", { className: "text-[var(--color-text-muted)] text-sm border-r border-border pr-3" }, selectedCount === totalCount
|
|
15
|
+
React__default.createElement("span", { className: "text-[var(--color-text-muted)] text-sm border-r border-[var(--color-border)] pr-3" }, selectedCount === totalCount
|
|
16
16
|
? `All ${selectedCount} selected`
|
|
17
17
|
: `${selectedCount} selected`),
|
|
18
18
|
bulkActions.length > 0 && (React__default.createElement("div", { className: "flex items-center gap-2" }, bulkActions.map((action) => {
|
|
19
|
-
action.icon;
|
|
20
19
|
return (React__default.createElement(Button, { key: action.id, color: "neutral", variant: "filled", onClick: () => action.onClick(selectedRows), className: "text-[var(--color-text-secondary)] hover:text-[var(--color-text-primary)]", size: "sm" }, action.label));
|
|
21
20
|
})))),
|
|
22
21
|
React__default.createElement(Button, { color: "primary", variant: "link", onClick: onClearSelection, "aria-label": "Clear selection" },
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export { useTableColumns } from './useTableColumns';
|
|
2
|
+
export { useTableSelection } from './useTableSelection';
|
|
3
|
+
export { useTableExpansion } from './useTableExpansion';
|
|
4
|
+
export { useTablePagination } from './useTablePagination';
|
|
5
|
+
export { useTableFilter } from './useTableFilter';
|
|
6
|
+
export type { UseTableColumnsReturn } from './useTableColumns';
|
|
7
|
+
export type { UseTableSelectionReturn } from './useTableSelection';
|
|
8
|
+
export type { UseTableExpansionReturn } from './useTableExpansion';
|
|
9
|
+
export type { UseTablePaginationReturn } from './useTablePagination';
|
|
10
|
+
export type { UseTableFilterReturn } from './useTableFilter';
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Column } from '../Table.types';
|
|
2
|
+
export interface UseTableColumnsOptions<T> {
|
|
3
|
+
columns?: Column<T>[];
|
|
4
|
+
initialVisibleColumns?: string[];
|
|
5
|
+
onVisibleColumnsChange?: (visibleColumns: string[]) => void;
|
|
6
|
+
onColumnReorder?: (fromIndex: number, toIndex: number) => void;
|
|
7
|
+
}
|
|
8
|
+
export interface UseTableColumnsReturn<T> {
|
|
9
|
+
visibleColumns: string[];
|
|
10
|
+
columnOrder: string[];
|
|
11
|
+
visibleColumnsList: Column<T>[];
|
|
12
|
+
handleToggleColumn: (columnId: string) => void;
|
|
13
|
+
handleColumnReorder: (fromIndex: number, toIndex: number) => void;
|
|
14
|
+
handleResetToDefault: () => void;
|
|
15
|
+
}
|
|
16
|
+
export declare function useTableColumns<T>({ columns, initialVisibleColumns, onVisibleColumnsChange, onColumnReorder, }: UseTableColumnsOptions<T>): UseTableColumnsReturn<T>;
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { useState, useEffect, useCallback, useMemo } from 'react';
|
|
2
|
+
|
|
3
|
+
function useTableColumns({ columns, initialVisibleColumns, onVisibleColumnsChange, onColumnReorder, }) {
|
|
4
|
+
const defaultVisibleColumns = initialVisibleColumns || (columns ? columns.map((col) => col.id) : []);
|
|
5
|
+
const defaultColumnOrder = columns ? columns.map((col) => col.id) : [];
|
|
6
|
+
const [visibleColumns, setVisibleColumns] = useState(defaultVisibleColumns);
|
|
7
|
+
const [columnOrder, setColumnOrder] = useState(defaultColumnOrder);
|
|
8
|
+
// Sync column order when columns prop changes
|
|
9
|
+
useEffect(() => {
|
|
10
|
+
if (columns) {
|
|
11
|
+
setColumnOrder(columns.map((col) => col.id));
|
|
12
|
+
}
|
|
13
|
+
}, [columns]);
|
|
14
|
+
const handleVisibleColumnsChange = useCallback((newVisibleColumns) => {
|
|
15
|
+
setVisibleColumns(newVisibleColumns);
|
|
16
|
+
onVisibleColumnsChange === null || onVisibleColumnsChange === void 0 ? void 0 : onVisibleColumnsChange(newVisibleColumns);
|
|
17
|
+
}, [onVisibleColumnsChange]);
|
|
18
|
+
const handleToggleColumn = useCallback((columnId) => {
|
|
19
|
+
const column = columns === null || columns === void 0 ? void 0 : columns.find(col => col.id === columnId);
|
|
20
|
+
if (column === null || column === void 0 ? void 0 : column.locked)
|
|
21
|
+
return;
|
|
22
|
+
setVisibleColumns(prev => {
|
|
23
|
+
const newVisibleColumns = prev.includes(columnId)
|
|
24
|
+
? prev.filter((id) => id !== columnId)
|
|
25
|
+
: [...prev, columnId];
|
|
26
|
+
onVisibleColumnsChange === null || onVisibleColumnsChange === void 0 ? void 0 : onVisibleColumnsChange(newVisibleColumns);
|
|
27
|
+
return newVisibleColumns;
|
|
28
|
+
});
|
|
29
|
+
}, [columns, onVisibleColumnsChange]);
|
|
30
|
+
const handleColumnReorder = useCallback((fromIndex, toIndex) => {
|
|
31
|
+
setColumnOrder(prev => {
|
|
32
|
+
const newColumnOrder = [...prev];
|
|
33
|
+
const [movedColumn] = newColumnOrder.splice(fromIndex, 1);
|
|
34
|
+
newColumnOrder.splice(toIndex, 0, movedColumn);
|
|
35
|
+
return newColumnOrder;
|
|
36
|
+
});
|
|
37
|
+
onColumnReorder === null || onColumnReorder === void 0 ? void 0 : onColumnReorder(fromIndex, toIndex);
|
|
38
|
+
}, [onColumnReorder]);
|
|
39
|
+
const handleResetToDefault = useCallback(() => {
|
|
40
|
+
const lockedColumnIds = (columns === null || columns === void 0 ? void 0 : columns.filter(col => col.locked).map(col => col.id)) || [];
|
|
41
|
+
const resetVisibleColumns = Array.from(new Set([...defaultVisibleColumns, ...lockedColumnIds]));
|
|
42
|
+
handleVisibleColumnsChange(resetVisibleColumns);
|
|
43
|
+
if (columns) {
|
|
44
|
+
setColumnOrder(columns.map((col) => col.id));
|
|
45
|
+
}
|
|
46
|
+
}, [columns, defaultVisibleColumns, handleVisibleColumnsChange]);
|
|
47
|
+
const visibleColumnsList = useMemo(() => {
|
|
48
|
+
if (!columns)
|
|
49
|
+
return [];
|
|
50
|
+
if (columnOrder.length > 0) {
|
|
51
|
+
return columnOrder
|
|
52
|
+
.map(colId => columns.find(col => col.id === colId))
|
|
53
|
+
.filter((col) => col !== undefined && visibleColumns.includes(col.id));
|
|
54
|
+
}
|
|
55
|
+
return columns.filter((col) => visibleColumns.includes(col.id));
|
|
56
|
+
}, [columns, columnOrder, visibleColumns]);
|
|
57
|
+
return {
|
|
58
|
+
visibleColumns,
|
|
59
|
+
columnOrder,
|
|
60
|
+
visibleColumnsList,
|
|
61
|
+
handleToggleColumn,
|
|
62
|
+
handleColumnReorder,
|
|
63
|
+
handleResetToDefault,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
export { useTableColumns };
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export interface UseTableExpansionOptions {
|
|
2
|
+
expandedRows?: string[];
|
|
3
|
+
onExpandedRowsChange?: (expandedRows: string[]) => void;
|
|
4
|
+
}
|
|
5
|
+
export interface UseTableExpansionReturn {
|
|
6
|
+
handleExpandChange: (rowId: string, expanded: boolean) => void;
|
|
7
|
+
}
|
|
8
|
+
export declare function useTableExpansion({ expandedRows, onExpandedRowsChange, }: UseTableExpansionOptions): UseTableExpansionReturn;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { useCallback } from 'react';
|
|
2
|
+
|
|
3
|
+
function useTableExpansion({ expandedRows = [], onExpandedRowsChange, }) {
|
|
4
|
+
const handleExpandChange = useCallback((rowId, expanded) => {
|
|
5
|
+
if (!onExpandedRowsChange)
|
|
6
|
+
return;
|
|
7
|
+
const newExpandedRows = expanded
|
|
8
|
+
? [...expandedRows, rowId]
|
|
9
|
+
: expandedRows.filter(id => id !== rowId);
|
|
10
|
+
onExpandedRowsChange(newExpandedRows);
|
|
11
|
+
}, [expandedRows, onExpandedRowsChange]);
|
|
12
|
+
return { handleExpandChange };
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export { useTableExpansion };
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { FilterConfig, FilterOperator } from '../Table.types';
|
|
2
|
+
export interface UseTableFilterOptions {
|
|
3
|
+
filterConfig?: FilterConfig[];
|
|
4
|
+
onFilterChange?: (filterConfig: FilterConfig[]) => void;
|
|
5
|
+
}
|
|
6
|
+
export interface UseTableFilterReturn {
|
|
7
|
+
handleAddFilter: (columnId: string, value: any, operator?: FilterOperator) => void;
|
|
8
|
+
handleRemoveFilter: (columnId: string) => void;
|
|
9
|
+
handleUpdateFilter: (columnId: string, value: any, operator?: FilterOperator) => void;
|
|
10
|
+
handleClearFilters: () => void;
|
|
11
|
+
}
|
|
12
|
+
export declare function useTableFilter({ filterConfig, onFilterChange, }: UseTableFilterOptions): UseTableFilterReturn;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { useCallback } from 'react';
|
|
2
|
+
|
|
3
|
+
function useTableFilter({ filterConfig = [], onFilterChange, }) {
|
|
4
|
+
const handleAddFilter = useCallback((columnId, value, operator) => {
|
|
5
|
+
if (!onFilterChange)
|
|
6
|
+
return;
|
|
7
|
+
const existing = filterConfig.find(f => f.columnId === columnId);
|
|
8
|
+
if (existing) {
|
|
9
|
+
const updated = filterConfig.map(f => f.columnId === columnId ? { ...f, value, operator } : f);
|
|
10
|
+
onFilterChange(updated);
|
|
11
|
+
}
|
|
12
|
+
else {
|
|
13
|
+
onFilterChange([...filterConfig, { columnId, value, operator }]);
|
|
14
|
+
}
|
|
15
|
+
}, [filterConfig, onFilterChange]);
|
|
16
|
+
const handleRemoveFilter = useCallback((columnId) => {
|
|
17
|
+
if (!onFilterChange)
|
|
18
|
+
return;
|
|
19
|
+
onFilterChange(filterConfig.filter(f => f.columnId !== columnId));
|
|
20
|
+
}, [filterConfig, onFilterChange]);
|
|
21
|
+
const handleUpdateFilter = useCallback((columnId, value, operator) => {
|
|
22
|
+
if (!onFilterChange)
|
|
23
|
+
return;
|
|
24
|
+
onFilterChange(filterConfig.map(f => f.columnId === columnId ? { ...f, value, operator } : f));
|
|
25
|
+
}, [filterConfig, onFilterChange]);
|
|
26
|
+
const handleClearFilters = useCallback(() => {
|
|
27
|
+
onFilterChange === null || onFilterChange === void 0 ? void 0 : onFilterChange([]);
|
|
28
|
+
}, [onFilterChange]);
|
|
29
|
+
return {
|
|
30
|
+
handleAddFilter,
|
|
31
|
+
handleRemoveFilter,
|
|
32
|
+
handleUpdateFilter,
|
|
33
|
+
handleClearFilters,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export { useTableFilter };
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface UseTablePaginationOptions<T> {
|
|
2
|
+
data?: T[];
|
|
3
|
+
pagination?: {
|
|
4
|
+
pageSize: number;
|
|
5
|
+
currentPage: number;
|
|
6
|
+
totalItems: number;
|
|
7
|
+
};
|
|
8
|
+
}
|
|
9
|
+
export interface UseTablePaginationReturn<T> {
|
|
10
|
+
paginatedData: T[];
|
|
11
|
+
}
|
|
12
|
+
export declare function useTablePagination<T>({ data, pagination, }: UseTablePaginationOptions<T>): UseTablePaginationReturn<T>;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { useMemo } from 'react';
|
|
2
|
+
|
|
3
|
+
function useTablePagination({ data, pagination, }) {
|
|
4
|
+
const paginatedData = useMemo(() => {
|
|
5
|
+
if (pagination && data) {
|
|
6
|
+
return data.slice((pagination.currentPage - 1) * pagination.pageSize, pagination.currentPage * pagination.pageSize);
|
|
7
|
+
}
|
|
8
|
+
return data || [];
|
|
9
|
+
}, [data, pagination]);
|
|
10
|
+
return { paginatedData };
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export { useTablePagination };
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { SelectionType } from '../Table.types';
|
|
2
|
+
export interface UseTableSelectionOptions<T> {
|
|
3
|
+
data: T[];
|
|
4
|
+
rowKey?: keyof T | ((row: T, index: number) => string | number);
|
|
5
|
+
selectable?: boolean;
|
|
6
|
+
selectionType?: SelectionType;
|
|
7
|
+
selectedRows?: string[];
|
|
8
|
+
onSelectionChange?: (selectedRows: string[]) => void;
|
|
9
|
+
}
|
|
10
|
+
export interface UseTableSelectionReturn {
|
|
11
|
+
isAllSelected: boolean;
|
|
12
|
+
isIndeterminate: boolean;
|
|
13
|
+
handleSelectAll: (checked: boolean) => void;
|
|
14
|
+
handleSelectionChange: (rowId: string, selected: boolean) => void;
|
|
15
|
+
handleClearSelection: () => void;
|
|
16
|
+
}
|
|
17
|
+
export declare function useTableSelection<T extends Record<string, any>>({ data, rowKey, selectionType, selectedRows, onSelectionChange, }: UseTableSelectionOptions<T>): UseTableSelectionReturn;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { useMemo, useCallback } from 'react';
|
|
2
|
+
import { getRowId } from '../Table.utils.js';
|
|
3
|
+
|
|
4
|
+
function useTableSelection({ data, rowKey, selectionType = 'checkbox', selectedRows = [], onSelectionChange, }) {
|
|
5
|
+
const isAllSelected = useMemo(() => selectedRows.length === data.length && data.length > 0, [selectedRows.length, data.length]);
|
|
6
|
+
const isIndeterminate = useMemo(() => selectedRows.length > 0 && selectedRows.length < data.length, [selectedRows.length, data.length]);
|
|
7
|
+
const handleSelectAll = useCallback((checked) => {
|
|
8
|
+
if (!onSelectionChange || selectionType !== 'checkbox')
|
|
9
|
+
return;
|
|
10
|
+
if (checked) {
|
|
11
|
+
const allRowIds = data.map((row, index) => getRowId(row, index, rowKey));
|
|
12
|
+
onSelectionChange(allRowIds);
|
|
13
|
+
}
|
|
14
|
+
else {
|
|
15
|
+
onSelectionChange([]);
|
|
16
|
+
}
|
|
17
|
+
}, [data, rowKey, selectionType, onSelectionChange]);
|
|
18
|
+
const handleSelectionChange = useCallback((rowId, selected) => {
|
|
19
|
+
if (!onSelectionChange)
|
|
20
|
+
return;
|
|
21
|
+
const newSelectedRows = selectionType === 'checkbox'
|
|
22
|
+
? selected
|
|
23
|
+
? [...selectedRows, rowId]
|
|
24
|
+
: selectedRows.filter(id => id !== rowId)
|
|
25
|
+
: selected ? [rowId] : [];
|
|
26
|
+
onSelectionChange(newSelectedRows);
|
|
27
|
+
}, [selectionType, selectedRows, onSelectionChange]);
|
|
28
|
+
const handleClearSelection = useCallback(() => {
|
|
29
|
+
onSelectionChange === null || onSelectionChange === void 0 ? void 0 : onSelectionChange([]);
|
|
30
|
+
}, [onSelectionChange]);
|
|
31
|
+
return {
|
|
32
|
+
isAllSelected,
|
|
33
|
+
isIndeterminate,
|
|
34
|
+
handleSelectAll,
|
|
35
|
+
handleSelectionChange,
|
|
36
|
+
handleClearSelection,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export { useTableSelection };
|
|
@@ -1,9 +1,8 @@
|
|
|
1
|
-
import { TableProps, Column, SortConfig, FilterConfig, TableThemeOverrides, TableVariant, TableAlignment, SelectionType, TableHeaderProps, TableBodyProps, TableRowProps, TableCellProps, TableHeaderCellProps, BulkAction } from './Table.types';
|
|
2
|
-
import { TableActions } from './
|
|
3
|
-
import { TableActionsMenu } from './
|
|
4
|
-
import { TablePagination } from './
|
|
5
|
-
import {
|
|
6
|
-
import { TablePaginationProps } from './components/TablePagination/TablePagination.types';
|
|
1
|
+
import { TableProps, Column, SortConfig, FilterConfig, FilterOperator, FilterType, FilterOption, TableThemeOverrides, TableVariant, TableAlignment, SelectionType, TableHeaderProps, TableBodyProps, TableRowProps, TableCellProps, TableHeaderCellProps, BulkAction, ActionItem, ActionVariant, ActionPriority, TableActionsProps, TableActionsMenuProps, TablePaginationProps, TableSelectionHeaderProps, TableColumnManagerProps, TableFilterProps } from './Table.types';
|
|
2
|
+
import { TableActions } from './TableActions';
|
|
3
|
+
import { TableActionsMenu } from './TableActionsMenu';
|
|
4
|
+
import { TablePagination } from './TablePagination';
|
|
5
|
+
import { TableFilter } from './TableFilter';
|
|
7
6
|
interface TableCompound {
|
|
8
7
|
<T extends Record<string, any>>(props: TableProps<T>): React.ReactElement;
|
|
9
8
|
Header: React.FC<TableHeaderProps>;
|
|
@@ -13,8 +12,10 @@ interface TableCompound {
|
|
|
13
12
|
HeaderCell: React.FC<TableHeaderCellProps>;
|
|
14
13
|
Actions: typeof TableActions;
|
|
15
14
|
Pagination: React.FC<TablePaginationProps>;
|
|
15
|
+
Filter: typeof TableFilter;
|
|
16
16
|
}
|
|
17
17
|
declare const Table: TableCompound;
|
|
18
18
|
export { Table };
|
|
19
|
-
export type { TableProps, Column, SortConfig, FilterConfig, TableThemeOverrides, TableVariant, TableAlignment, SelectionType, TableHeaderProps, TableBodyProps, TableRowProps, TableCellProps, TableHeaderCellProps, BulkAction, ActionItem, ActionVariant, ActionPriority, TableActionsProps, TableActionsMenuProps, TablePaginationProps, };
|
|
20
|
-
export { TableActions, TableActionsMenu, TablePagination };
|
|
19
|
+
export type { TableProps, Column, SortConfig, FilterConfig, FilterOperator, FilterType, FilterOption, TableThemeOverrides, TableVariant, TableAlignment, SelectionType, TableHeaderProps, TableBodyProps, TableRowProps, TableCellProps, TableHeaderCellProps, BulkAction, ActionItem, ActionVariant, ActionPriority, TableActionsProps, TableActionsMenuProps, TablePaginationProps, TableSelectionHeaderProps, TableColumnManagerProps, TableFilterProps, };
|
|
20
|
+
export { TableActions, TableActionsMenu, TablePagination, TableFilter };
|
|
21
|
+
export { useTableColumns, useTableSelection, useTableExpansion, useTablePagination, useTableFilter, } from './hooks';
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { Table as Table$1 } from './Table.js';
|
|
2
|
-
import { HeaderCell, Cell, Row, Body, Header } from './
|
|
3
|
-
import { TableActions } from './
|
|
2
|
+
import { HeaderCell, Cell, Row, Body, Header } from './TableDeclarative.js';
|
|
3
|
+
import { TableActions } from './TableActions.js';
|
|
4
4
|
import 'react';
|
|
5
5
|
import 'clsx';
|
|
6
6
|
import 'tailwind-merge';
|
|
7
|
-
import { TablePagination } from './
|
|
7
|
+
import { TablePagination } from './TablePagination.js';
|
|
8
|
+
import { TableFilter } from './TableFilter.js';
|
|
8
9
|
|
|
9
10
|
// First import the Table component itself
|
|
10
11
|
// Create a compound component by attaching the subcomponents
|
|
@@ -15,7 +16,8 @@ const Table = Object.assign(Table$1, {
|
|
|
15
16
|
Cell: Cell,
|
|
16
17
|
HeaderCell: HeaderCell,
|
|
17
18
|
Actions: TableActions,
|
|
18
|
-
Pagination: TablePagination
|
|
19
|
+
Pagination: TablePagination,
|
|
20
|
+
Filter: TableFilter,
|
|
19
21
|
});
|
|
20
22
|
|
|
21
|
-
export { Table, TableActions, TablePagination };
|
|
23
|
+
export { Table, TableActions, TableFilter, TablePagination };
|
|
@@ -11,7 +11,7 @@ import { TabsContent } from './TabsContent.js';
|
|
|
11
11
|
* Uses compound component pattern with Tabs.List, Tabs.Trigger, and Tabs.Content
|
|
12
12
|
* Supports optional Framer Motion animations and comprehensive accessibility
|
|
13
13
|
*/
|
|
14
|
-
const TabsComponent = React__default.forwardRef(({ value, defaultValue, onValueChange, orientation = "horizontal", size = "md", disabled = false, children, className, ...props }, ref) => {
|
|
14
|
+
const TabsComponent = React__default.forwardRef(({ value, defaultValue, onValueChange, orientation = "horizontal", size = "md", disabled = false, children, className, darkMode = false, ...props }, ref) => {
|
|
15
15
|
const [currentValue, setCurrentValue] = useState(value || defaultValue || "");
|
|
16
16
|
// Track trigger elements for underline positioning
|
|
17
17
|
const triggerRefs = useRef(new Map());
|
|
@@ -74,7 +74,7 @@ const TabsComponent = React__default.forwardRef(({ value, defaultValue, onValueC
|
|
|
74
74
|
disabledStyle: disabled ? "opacity-50 cursor-not-allowed pointer-events-none" : "",
|
|
75
75
|
}), [disabled]);
|
|
76
76
|
return (React__default.createElement(TabsContext.Provider, { value: contextValue },
|
|
77
|
-
React__default.createElement("div", { ref: ref, className: cn(themeClasses.baseStyle, themeClasses.disabledStyle, className // User overrides take precedence
|
|
77
|
+
React__default.createElement("div", { ref: ref, className: cn(themeClasses.baseStyle, themeClasses.disabledStyle, darkMode && "dark", className // User overrides take precedence
|
|
78
78
|
), "data-orientation": orientation, "data-size": size, "data-disabled": disabled, role: "tablist" // Add semantic role for screen readers
|
|
79
79
|
, "aria-orientation": orientation, ...props }, children)));
|
|
80
80
|
});
|
|
@@ -48,6 +48,14 @@ export interface TabsProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'o
|
|
|
48
48
|
disabled?: boolean;
|
|
49
49
|
/** Children components - typically Tabs.List and Tabs.Content components */
|
|
50
50
|
children?: React.ReactNode;
|
|
51
|
+
/**
|
|
52
|
+
* Force dark mode styling for the component. Use when placing the component
|
|
53
|
+
* on a dark background while the page is in light mode. This applies the
|
|
54
|
+
* 'dark' class to the container, making text, borders, and other elements
|
|
55
|
+
* use light colors for visibility.
|
|
56
|
+
* @default false
|
|
57
|
+
*/
|
|
58
|
+
darkMode?: boolean;
|
|
51
59
|
}
|
|
52
60
|
/**
|
|
53
61
|
* TabsList component props - container for tab trigger buttons
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
const tagVariants = {
|
|
2
|
+
initial: {
|
|
3
|
+
scale: 0,
|
|
4
|
+
opacity: 0,
|
|
5
|
+
},
|
|
6
|
+
animate: {
|
|
7
|
+
scale: 1,
|
|
8
|
+
opacity: 1,
|
|
9
|
+
transition: {
|
|
10
|
+
type: "spring",
|
|
11
|
+
stiffness: 500,
|
|
12
|
+
damping: 25,
|
|
13
|
+
},
|
|
14
|
+
},
|
|
15
|
+
exit: {
|
|
16
|
+
scale: 0,
|
|
17
|
+
opacity: 0,
|
|
18
|
+
transition: {
|
|
19
|
+
type: "spring",
|
|
20
|
+
stiffness: 500,
|
|
21
|
+
damping: 30,
|
|
22
|
+
},
|
|
23
|
+
},
|
|
24
|
+
};
|
|
25
|
+
const tagLayoutTransition = {
|
|
26
|
+
type: "spring",
|
|
27
|
+
stiffness: 500,
|
|
28
|
+
damping: 30,
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
export { tagLayoutTransition, tagVariants };
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { TagProps } from "./Tag.types";
|
|
3
|
+
/**
|
|
4
|
+
* Tag component for displaying removable labels or keywords.
|
|
5
|
+
*
|
|
6
|
+
* @component
|
|
7
|
+
* @example
|
|
8
|
+
* ```tsx
|
|
9
|
+
* <Tag onRemove={() => handleRemove('tag1')}>JavaScript</Tag>
|
|
10
|
+
* <Tag size="sm" removable={false}>Read Only</Tag>
|
|
11
|
+
* <Tag disabled>Disabled Tag</Tag>
|
|
12
|
+
* ```
|
|
13
|
+
*/
|
|
14
|
+
export declare const Tag: React.ForwardRefExoticComponent<TagProps & React.RefAttributes<HTMLSpanElement>>;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import React__default from 'react';
|
|
2
|
+
import { motion } from 'motion/react';
|
|
3
|
+
import { XMarkIcon } from '@heroicons/react/24/outline';
|
|
4
|
+
import { cn } from '../../../utils/cn.js';
|
|
5
|
+
import { tagTheme } from './Tag.theme.js';
|
|
6
|
+
import { tagVariants, tagLayoutTransition } from './Tag.animations.js';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Tag component for displaying removable labels or keywords.
|
|
10
|
+
*
|
|
11
|
+
* @component
|
|
12
|
+
* @example
|
|
13
|
+
* ```tsx
|
|
14
|
+
* <Tag onRemove={() => handleRemove('tag1')}>JavaScript</Tag>
|
|
15
|
+
* <Tag size="sm" removable={false}>Read Only</Tag>
|
|
16
|
+
* <Tag disabled>Disabled Tag</Tag>
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
const Tag = React__default.forwardRef(({ children, size = "md", removable = true, onRemove, disabled = false, className, theme: customTheme, ...props }, ref) => {
|
|
20
|
+
var _a, _b, _c;
|
|
21
|
+
// Merge default theme with custom theme overrides
|
|
22
|
+
const theme = {
|
|
23
|
+
baseStyle: (_a = customTheme === null || customTheme === void 0 ? void 0 : customTheme.baseStyle) !== null && _a !== void 0 ? _a : tagTheme.baseStyle,
|
|
24
|
+
sizes: { ...tagTheme.sizes, ...customTheme === null || customTheme === void 0 ? void 0 : customTheme.sizes },
|
|
25
|
+
disabledStyle: (_b = customTheme === null || customTheme === void 0 ? void 0 : customTheme.disabledStyle) !== null && _b !== void 0 ? _b : tagTheme.disabledStyle,
|
|
26
|
+
removeButtonStyle: (_c = customTheme === null || customTheme === void 0 ? void 0 : customTheme.removeButtonStyle) !== null && _c !== void 0 ? _c : tagTheme.removeButtonStyle,
|
|
27
|
+
removeIconSizes: {
|
|
28
|
+
...tagTheme.removeIconSizes,
|
|
29
|
+
...customTheme === null || customTheme === void 0 ? void 0 : customTheme.removeIconSizes,
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
const handleRemove = (e) => {
|
|
33
|
+
e.stopPropagation();
|
|
34
|
+
if (!disabled && onRemove) {
|
|
35
|
+
onRemove();
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
return (React__default.createElement(motion.span, { ref: ref, className: cn(theme.baseStyle, theme.sizes[size], disabled && theme.disabledStyle, className), layout: true, transition: tagLayoutTransition, variants: tagVariants, initial: "initial", animate: "animate", exit: "exit", "data-size": size, "data-disabled": disabled ? "true" : "false", "data-removable": removable ? "true" : "false", ...props },
|
|
39
|
+
children,
|
|
40
|
+
removable && onRemove && !disabled && (React__default.createElement("button", { type: "button", onClick: handleRemove, className: theme.removeButtonStyle, "aria-label": `Remove ${typeof children === "string" ? children : "tag"}` },
|
|
41
|
+
React__default.createElement(XMarkIcon, { className: theme.removeIconSizes[size] })))));
|
|
42
|
+
});
|
|
43
|
+
Tag.displayName = "Tag";
|
|
44
|
+
|
|
45
|
+
export { Tag };
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
const tagTheme = {
|
|
2
|
+
baseStyle: "inline-flex items-center gap-1 font-medium rounded-full " +
|
|
3
|
+
"bg-[var(--color-background-secondary)] border border-[var(--color-border)] " +
|
|
4
|
+
"text-[var(--color-text-primary)]",
|
|
5
|
+
sizes: {
|
|
6
|
+
sm: "text-xs px-2 py-0.5 pr-0.5",
|
|
7
|
+
md: "text-sm px-2.5 py-0.5 pr-0.5",
|
|
8
|
+
},
|
|
9
|
+
disabledStyle: "opacity-50 cursor-not-allowed",
|
|
10
|
+
removeButtonStyle: "inline-flex items-center justify-center rounded-full p-1 " +
|
|
11
|
+
"hover:bg-[var(--color-background-quaternary)] " +
|
|
12
|
+
"text-[var(--color-text-muted)] hover:text-[var(--color-text-primary)] " +
|
|
13
|
+
"transition-all duration-300 cursor-pointer focus:outline-none " +
|
|
14
|
+
"focus-visible:ring-2 focus-visible:ring-[var(--color-primary)]",
|
|
15
|
+
removeIconSizes: {
|
|
16
|
+
sm: "size-3",
|
|
17
|
+
md: "size-3.5",
|
|
18
|
+
},
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
export { tagTheme };
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
/**
|
|
3
|
+
* Tag component props
|
|
4
|
+
*/
|
|
5
|
+
export interface TagProps extends Omit<React.HTMLAttributes<HTMLSpanElement>, "onRemove" | "onDrag" | "onDragEnd" | "onDragStart" | "onAnimationStart"> {
|
|
6
|
+
/** The content of the tag */
|
|
7
|
+
children: React.ReactNode;
|
|
8
|
+
/** The size of the tag */
|
|
9
|
+
size?: TagSize;
|
|
10
|
+
/** Whether to show the remove button (default: true) */
|
|
11
|
+
removable?: boolean;
|
|
12
|
+
/** Callback when the remove button is clicked */
|
|
13
|
+
onRemove?: () => void;
|
|
14
|
+
/** Whether the tag is disabled */
|
|
15
|
+
disabled?: boolean;
|
|
16
|
+
/** Additional class name for the tag */
|
|
17
|
+
className?: string;
|
|
18
|
+
/** Theme overrides */
|
|
19
|
+
theme?: TagThemeOverrides;
|
|
20
|
+
}
|
|
21
|
+
export type TagSize = "sm" | "md";
|
|
22
|
+
export interface TagTheme {
|
|
23
|
+
/** Base styles for the tag container */
|
|
24
|
+
baseStyle: string;
|
|
25
|
+
/** Size-specific styles */
|
|
26
|
+
sizes: Record<TagSize, string>;
|
|
27
|
+
/** Disabled state style */
|
|
28
|
+
disabledStyle: string;
|
|
29
|
+
/** Remove button style */
|
|
30
|
+
removeButtonStyle: string;
|
|
31
|
+
/** Remove icon sizes for each tag size */
|
|
32
|
+
removeIconSizes: Record<TagSize, string>;
|
|
33
|
+
}
|
|
34
|
+
export interface TagThemeOverrides {
|
|
35
|
+
baseStyle?: string;
|
|
36
|
+
sizes?: Partial<Record<TagSize, string>>;
|
|
37
|
+
disabledStyle?: string;
|
|
38
|
+
removeButtonStyle?: string;
|
|
39
|
+
removeIconSizes?: Partial<Record<TagSize, string>>;
|
|
40
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import React from "react";
|
|
2
2
|
import { TooltipProps } from "./Tooltip.types";
|
|
3
3
|
declare const Tooltip: {
|
|
4
|
-
({ content, children, placement, delay, disabled, className, maxWidth, minWidth, showOnFocus, wrapText, id, theme: themeOverrides, "aria-label": ariaLabel, role, }: TooltipProps): React.JSX.Element;
|
|
4
|
+
({ content, children, placement, delay, disabled, className, maxWidth, minWidth, showOnFocus, wrapText, id, theme: themeOverrides, "aria-label": ariaLabel, role, offset, darkMode, }: TooltipProps): React.JSX.Element;
|
|
5
5
|
displayName: string;
|
|
6
6
|
};
|
|
7
7
|
export { Tooltip };
|
|
@@ -35,7 +35,7 @@ const useDarkMode = () => {
|
|
|
35
35
|
}, []);
|
|
36
36
|
return isDark;
|
|
37
37
|
};
|
|
38
|
-
const Tooltip = ({ content, children, placement = "top", delay = 300, disabled = false, className, maxWidth = "360px", minWidth = "fit-content", showOnFocus = true, wrapText = false, id, theme: themeOverrides, "aria-label": ariaLabel, role = "tooltip", }) => {
|
|
38
|
+
const Tooltip = ({ content, children, placement = "top", delay = 300, disabled = false, className, maxWidth = "360px", minWidth = "fit-content", showOnFocus = true, wrapText = false, id, theme: themeOverrides, "aria-label": ariaLabel, role = "tooltip", offset = 8, darkMode = false, }) => {
|
|
39
39
|
const [isVisible, setIsVisible] = useState(false);
|
|
40
40
|
const tooltipRef = useRef(null);
|
|
41
41
|
const triggerRef = useRef(null);
|
|
@@ -53,7 +53,7 @@ const Tooltip = ({ content, children, placement = "top", delay = 300, disabled =
|
|
|
53
53
|
triggerRef,
|
|
54
54
|
isOpen: isVisible,
|
|
55
55
|
placement: placement, // TooltipPlacement matches SelectPlacement subset
|
|
56
|
-
offset
|
|
56
|
+
offset,
|
|
57
57
|
autoWidth: true,
|
|
58
58
|
});
|
|
59
59
|
// Event handlers - simplified timer management
|
|
@@ -123,7 +123,7 @@ const Tooltip = ({ content, children, placement = "top", delay = 300, disabled =
|
|
|
123
123
|
return (React__default.createElement("div", { className: "relative inline-block", ref: triggerRef, ...triggerHandlers, tabIndex: showOnFocus ? 0 : undefined, "aria-describedby": isVisible && id ? id : undefined },
|
|
124
124
|
children,
|
|
125
125
|
typeof document !== "undefined" &&
|
|
126
|
-
createPortal(React__default.createElement("div", { className: isDarkMode ? "dark" : undefined }, tooltipContent), document.body)));
|
|
126
|
+
createPortal(React__default.createElement("div", { className: darkMode || isDarkMode ? "dark" : undefined }, tooltipContent), document.body)));
|
|
127
127
|
};
|
|
128
128
|
// Set display name for dev tools and Storybook
|
|
129
129
|
Tooltip.displayName = "Tooltip";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
const tooltipTheme = {
|
|
2
2
|
// Base style for the tooltip - using fixed positioning for portal rendering
|
|
3
|
-
baseStyle: "fixed z-
|
|
3
|
+
baseStyle: "fixed z-[99] rounded-lg py-1 px-2 text-xs text-[var(--color-text-primary)] focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-primary)] focus-visible:ring-offset-2 pointer-events-none bg-white/60 backdrop-blur-md outline outline-[var(--color-border)] shadow-lg border-t-[1px] border-white " +
|
|
4
4
|
"dark:bg-neutral-800/80 dark:outline-[var(--color-border)]/80 dark:border-[var(--color-border)]",
|
|
5
5
|
};
|
|
6
6
|
|
|
@@ -78,4 +78,21 @@ export interface TooltipProps {
|
|
|
78
78
|
* @default "tooltip"
|
|
79
79
|
*/
|
|
80
80
|
role?: 'tooltip' | 'dialog' | 'region';
|
|
81
|
+
/**
|
|
82
|
+
* Distance offset between the tooltip and trigger element (in pixels)
|
|
83
|
+
* Positive values increase the gap, negative values decrease it (can overlap)
|
|
84
|
+
* The offset is applied based on placement direction:
|
|
85
|
+
* - top/bottom: affects Y axis
|
|
86
|
+
* - left/right: affects X axis
|
|
87
|
+
* @default 8
|
|
88
|
+
*/
|
|
89
|
+
offset?: number;
|
|
90
|
+
/**
|
|
91
|
+
* Force dark mode styling for the component. Use when placing the component
|
|
92
|
+
* on a dark background while the page is in light mode. This applies the
|
|
93
|
+
* 'dark' class to the container, making text, borders, and other elements
|
|
94
|
+
* use light colors for visibility.
|
|
95
|
+
* @default false
|
|
96
|
+
*/
|
|
97
|
+
darkMode?: boolean;
|
|
81
98
|
}
|