torch-glare 2.4.0 → 2.4.2
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 +8 -0
- package/apps/lib/components/ActionButton.tsx +7 -12
- package/apps/lib/components/ActionsGroup.tsx +4 -15
- package/apps/lib/components/AlertDialog.tsx +173 -191
- package/apps/lib/components/Avatar.tsx +13 -16
- package/apps/lib/components/Badge.tsx +1 -3
- package/apps/lib/components/BadgeField.tsx +76 -71
- package/apps/lib/components/Breadcrumb.tsx +49 -85
- package/apps/lib/components/Button.tsx +21 -20
- package/apps/lib/components/ButtonGroup.tsx +31 -41
- package/apps/lib/components/Calendar.tsx +51 -29
- package/apps/lib/components/Card.tsx +40 -24
- package/apps/lib/components/Checkbox.tsx +9 -16
- package/apps/lib/components/ColorPicker.tsx +441 -0
- package/apps/lib/components/ConclusionHeader.tsx +148 -0
- package/apps/lib/components/ContextMenu.tsx +97 -96
- package/apps/lib/components/CountBadge.tsx +4 -6
- package/apps/lib/components/DataTable.tsx +196 -216
- package/apps/lib/components/DataViews/DataViewRadio.tsx +1 -6
- package/apps/lib/components/DataViews/DataViewsConfigPanel.tsx +13 -47
- package/apps/lib/components/DataViews/DataViewsHeader.tsx +1 -3
- package/apps/lib/components/DataViews/DataViewsLayout.tsx +5 -12
- package/apps/lib/components/DataViews/FilterPanel.tsx +155 -149
- package/apps/lib/components/DataViews/HeaderSearch.tsx +1 -5
- package/apps/lib/components/DataViews/InboxView.tsx +22 -68
- package/apps/lib/components/DataViews/InboxViewCard.tsx +68 -77
- package/apps/lib/components/DataViews/KanbanView.tsx +8 -25
- package/apps/lib/components/DataViews/PanelControls.tsx +3 -13
- package/apps/lib/components/DataViews/SettingsPanel.tsx +83 -89
- package/apps/lib/components/DataViews/TableView.tsx +8 -28
- package/apps/lib/components/DataViews/TreeView.tsx +12 -40
- package/apps/lib/components/DataViews/badgeAdapter.ts +32 -28
- package/apps/lib/components/DataViews/fieldRenderers.tsx +106 -141
- package/apps/lib/components/DataViews/filters/DatePickerRangeFilter.tsx +30 -23
- package/apps/lib/components/DataViews/filters/DateRangePopover.tsx +39 -32
- package/apps/lib/components/DataViews/filters/PresetChips.tsx +15 -15
- package/apps/lib/components/DataViews/filters/RangeSliderWithInputs.tsx +69 -58
- package/apps/lib/components/DataViews/index.ts +26 -26
- package/apps/lib/components/DataViews/tree/TreeDrawer.tsx +12 -16
- package/apps/lib/components/DataViews/tree/TreeSidebar.tsx +28 -31
- package/apps/lib/components/DataViews/types.ts +104 -115
- package/apps/lib/components/DatePicker.tsx +200 -196
- package/apps/lib/components/Dialog.tsx +92 -105
- package/apps/lib/components/Divider.tsx +21 -24
- package/apps/lib/components/Drawer.tsx +124 -142
- package/apps/lib/components/DropdownMenu.tsx +131 -171
- package/apps/lib/components/FieldHint.tsx +4 -11
- package/apps/lib/components/Form.tsx +146 -155
- package/apps/lib/components/FormBuilder/DisplayField.tsx +40 -0
- package/apps/lib/components/FormBuilder/context.ts +71 -0
- package/apps/lib/components/FormBuilder/fields/ChoiceFields.tsx +65 -0
- package/apps/lib/components/FormBuilder/fields/ColorField.tsx +76 -0
- package/apps/lib/components/FormBuilder/fields/CustomField.tsx +16 -0
- package/apps/lib/components/FormBuilder/fields/DateField.tsx +34 -0
- package/apps/lib/components/FormBuilder/fields/FieldArray.tsx +79 -0
- package/apps/lib/components/FormBuilder/fields/FieldShell.tsx +174 -0
- package/apps/lib/components/FormBuilder/fields/FileField.tsx +40 -0
- package/apps/lib/components/FormBuilder/fields/OptionListFields.tsx +139 -0
- package/apps/lib/components/FormBuilder/fields/OtpField.tsx +32 -0
- package/apps/lib/components/FormBuilder/fields/PhoneField.tsx +82 -0
- package/apps/lib/components/FormBuilder/fields/RichTextEditorField.tsx +37 -0
- package/apps/lib/components/FormBuilder/fields/SelectField.tsx +101 -0
- package/apps/lib/components/FormBuilder/fields/SignatureField.tsx +175 -0
- package/apps/lib/components/FormBuilder/fields/SliderField.tsx +72 -0
- package/apps/lib/components/FormBuilder/fields/SwitchBoxField.tsx +42 -0
- package/apps/lib/components/FormBuilder/fields/TableField.tsx +312 -0
- package/apps/lib/components/FormBuilder/fields/TextField.tsx +222 -0
- package/apps/lib/components/FormBuilder/fields/TreeSelectField.tsx +49 -0
- package/apps/lib/components/FormBuilder/fields/countries.ts +303 -0
- package/apps/lib/components/FormBuilder/fields/index.ts +25 -0
- package/apps/lib/components/FormBuilder/form-builder.tsx +292 -0
- package/apps/lib/components/FormBuilder/header.tsx +105 -0
- package/apps/lib/components/FormBuilder/index.ts +37 -0
- package/apps/lib/components/FormBuilder/numberFormat.ts +16 -0
- package/apps/lib/components/FormBuilder/stepper.tsx +217 -0
- package/apps/lib/components/FormBuilder/submit.tsx +41 -0
- package/apps/lib/components/FormBuilder/types.ts +264 -0
- package/apps/lib/components/FormBuilder/viewFormat.tsx +137 -0
- package/apps/lib/components/FormRenderer/FormDrawer.tsx +121 -0
- package/apps/lib/components/FormRenderer/form-renderer.tsx +113 -0
- package/apps/lib/components/FormRenderer/index.ts +9 -0
- package/apps/lib/components/FormRenderer/types.ts +79 -0
- package/apps/lib/components/FormStepper.tsx +9 -39
- package/apps/lib/components/FormSummary.tsx +282 -0
- package/apps/lib/components/HeaderBar.tsx +1 -9
- package/apps/lib/components/ImageAttachment.tsx +106 -93
- package/apps/lib/components/InnerLabelField.tsx +20 -16
- package/apps/lib/components/Input.tsx +171 -172
- package/apps/lib/components/InputField.tsx +44 -45
- package/apps/lib/components/InputOTP.tsx +68 -69
- package/apps/lib/components/Label.tsx +61 -58
- package/apps/lib/components/LabelField.tsx +4 -5
- package/apps/lib/components/LabeledCheckBox.tsx +8 -12
- package/apps/lib/components/LabeledRadio.tsx +7 -5
- package/apps/lib/components/LinkButton.tsx +2 -9
- package/apps/lib/components/LoginButton.tsx +4 -9
- package/apps/lib/components/PasswordLevel.tsx +5 -5
- package/apps/lib/components/Popover.tsx +15 -33
- package/apps/lib/components/ProfileMenu.tsx +67 -72
- package/apps/lib/components/Radio.tsx +1 -5
- package/apps/lib/components/RadioCard.tsx +11 -28
- package/apps/lib/components/ScrollArea.tsx +45 -43
- package/apps/lib/components/SearchField.tsx +49 -39
- package/apps/lib/components/SearchableSelect.tsx +16 -16
- package/apps/lib/components/SearchableTable.tsx +108 -118
- package/apps/lib/components/SearchableTree.tsx +469 -0
- package/apps/lib/components/SearchableTreeDialog.tsx +493 -0
- package/apps/lib/components/SectionBlock.tsx +19 -23
- package/apps/lib/components/Select.tsx +80 -186
- package/apps/lib/components/SimpleSelect.tsx +196 -187
- package/apps/lib/components/Skeleton.tsx +9 -12
- package/apps/lib/components/SlideDatePicker.tsx +215 -166
- package/apps/lib/components/SpinLoading.tsx +33 -49
- package/apps/lib/components/Stepper.tsx +13 -56
- package/apps/lib/components/Switch.tsx +8 -10
- package/apps/lib/components/TabFormItem.tsx +3 -12
- package/apps/lib/components/TabSwitch.tsx +7 -34
- package/apps/lib/components/Table.tsx +60 -75
- package/apps/lib/components/{ChartBlockTool.ts → TextEditor/ChartBlockTool.ts} +17 -52
- package/apps/lib/components/TextEditor/RichTextField.tsx +46 -0
- package/apps/lib/components/{TableDnDWrapper.ts → TextEditor/TableDnDWrapper.ts} +15 -48
- package/apps/lib/components/{TextEditor.tsx → TextEditor/TextEditor.tsx} +156 -113
- package/apps/lib/components/TextEditor/TextEditorToolbar.tsx +429 -0
- package/apps/lib/components/TextEditor/editor-tools/AlignmentTune.ts +70 -0
- package/apps/lib/components/TextEditor/editor-tools/ColorInlineTool.ts +50 -0
- package/apps/lib/components/TextEditor/editor-tools/StrikethroughInlineTool.ts +48 -0
- package/apps/lib/components/TextEditor/editor-tools/inlineFormat.ts +98 -0
- package/apps/lib/{types → components/TextEditor}/editorjs.d.ts +19 -0
- package/apps/lib/components/TextEditor/index.ts +7 -0
- package/apps/lib/{utils → components/TextEditor}/markdownParser.ts +2 -7
- package/apps/lib/components/Textarea.tsx +9 -13
- package/apps/lib/components/Timeline.tsx +21 -41
- package/apps/lib/components/Toast.tsx +83 -83
- package/apps/lib/components/Toggle.tsx +112 -114
- package/apps/lib/components/ToggleButton.tsx +1 -1
- package/apps/lib/components/Tooltip.tsx +24 -19
- package/apps/lib/components/TransparentLabel.tsx +61 -62
- package/apps/lib/components/TreeDropDown.tsx +86 -52
- package/apps/lib/components/TreeFolder/TreeFolder.tsx +15 -48
- package/apps/lib/components/TreeFolder/TreeFolderBreadcrumb.tsx +16 -21
- package/apps/lib/components/TreeFolder/TreeFolderRow.tsx +9 -20
- package/apps/lib/components/TreeFolder/TreeFolderStyles.tsx +3 -3
- package/apps/lib/components/TreeFolder/icons.tsx +14 -17
- package/apps/lib/components/TreeFolder/index.ts +15 -8
- package/apps/lib/components/TreeFolder/treeFolderUtils.ts +47 -52
- package/apps/lib/components/TreeFolder/types.ts +32 -32
- package/apps/lib/components/TreeFolder/useTreeFolderDnD.ts +117 -123
- package/apps/lib/hooks/useActiveTreeItem.ts +52 -55
- package/apps/lib/hooks/useClickOutside.ts +21 -20
- package/apps/lib/hooks/useDataViewsState.ts +86 -80
- package/apps/lib/hooks/useIsMobile.ts +12 -12
- package/apps/lib/hooks/useResize.ts +54 -65
- package/apps/lib/hooks/useTagSelection.ts +201 -201
- package/apps/lib/layouts/CNLayout.tsx +181 -140
- package/apps/lib/layouts/DataViewCard.tsx +4 -18
- package/apps/lib/layouts/FieldSection.tsx +2 -6
- package/apps/lib/layouts/TreeSubLayout.tsx +24 -38
- package/apps/lib/providers/ThemeProvider.tsx +8 -23
- package/apps/lib/registry.json +997 -0
- package/apps/lib/tsconfig.json +9 -0
- package/apps/lib/tsconfig.tsbuildinfo +1 -0
- package/apps/lib/utils/cn.ts +1 -1
- package/apps/lib/utils/color.ts +175 -0
- package/apps/lib/utils/dataViews/columnUtils.ts +46 -44
- package/apps/lib/utils/dataViews/fieldUtils.ts +70 -71
- package/apps/lib/utils/dataViews/nestedDataUtils.tsx +129 -122
- package/apps/lib/utils/dataViews/pathUtils.ts +74 -67
- package/apps/lib/utils/dataViews/rangeUtils.ts +121 -112
- package/apps/lib/utils/dataViews/treeUtils.ts +204 -211
- package/apps/lib/utils/dateFormat.ts +64 -54
- package/apps/lib/utils/resize.ts +21 -25
- package/apps/lib/utils/types.ts +13 -13
- package/dist/bin/index.js +8 -2
- package/dist/bin/index.js.map +1 -1
- package/dist/src/shared/getAvailableFiles.d.ts.map +1 -1
- package/dist/src/shared/getAvailableFiles.js +6 -1
- package/dist/src/shared/getAvailableFiles.js.map +1 -1
- package/dist/src/shared/loadRegistry.d.ts +7 -0
- package/dist/src/shared/loadRegistry.d.ts.map +1 -0
- package/dist/src/shared/loadRegistry.js +31 -0
- package/dist/src/shared/loadRegistry.js.map +1 -0
- package/dist/src/shared/resolveInstallPlan.d.ts +12 -0
- package/dist/src/shared/resolveInstallPlan.d.ts.map +1 -0
- package/dist/src/shared/resolveInstallPlan.js +39 -0
- package/dist/src/shared/resolveInstallPlan.js.map +1 -0
- package/dist/src/types/main.d.ts +24 -0
- package/dist/src/types/main.d.ts.map +1 -1
- package/docs/README.md +10 -2
- package/docs/components/action-button.md +30 -24
- package/docs/components/actions-group.md +26 -20
- package/docs/components/alert-dialog.md +45 -45
- package/docs/components/avatar.md +6 -2
- package/docs/components/badge-field.md +6 -2
- package/docs/components/badge.md +7 -1
- package/docs/components/breadcrumb.md +15 -40
- package/docs/components/button-group.md +13 -10
- package/docs/components/button.md +58 -33
- package/docs/components/calendar.md +26 -19
- package/docs/components/card.md +23 -18
- package/docs/components/chart-block-tool.md +129 -0
- package/docs/components/checkbox.md +16 -8
- package/docs/components/cn-layout.md +7 -1
- package/docs/components/color-picker.md +101 -0
- package/docs/components/conclusion-header.md +80 -0
- package/docs/components/context-menu.md +18 -25
- package/docs/components/count-badge.md +7 -1
- package/docs/components/data-table.md +45 -33
- package/docs/components/data-views-config-panel.md +15 -11
- package/docs/components/data-views-layout.md +13 -16
- package/docs/components/date-picker.md +30 -23
- package/docs/components/dialog.md +43 -42
- package/docs/components/divider.md +10 -4
- package/docs/components/drawer.md +161 -135
- package/docs/components/dropdown-menu.md +25 -34
- package/docs/components/field-hint.md +37 -25
- package/docs/components/field-section.md +9 -3
- package/docs/components/form-builder.md +270 -0
- package/docs/components/form-renderer.md +228 -0
- package/docs/components/form-stepper.md +6 -0
- package/docs/components/form-summary.md +123 -0
- package/docs/components/form.md +17 -20
- package/docs/components/header-bar.md +6 -0
- package/docs/components/image-attachment.md +43 -45
- package/docs/components/inbox-view.md +16 -5
- package/docs/components/inner-label-field.md +34 -24
- package/docs/components/input-field.md +18 -10
- package/docs/components/input-otp.md +14 -11
- package/docs/components/input.md +22 -16
- package/docs/components/kanban-view.md +15 -5
- package/docs/components/label-field.md +32 -22
- package/docs/components/label.md +43 -32
- package/docs/components/labeled-check-box.md +16 -8
- package/docs/components/labeled-radio.md +18 -11
- package/docs/components/link-button.md +7 -1
- package/docs/components/login-button.md +8 -2
- package/docs/components/password-level.md +37 -24
- package/docs/components/popover.md +26 -23
- package/docs/components/profile-menu.md +38 -27
- package/docs/components/radio-card.md +16 -9
- package/docs/components/radio.md +16 -8
- package/docs/components/scroll-area.md +6 -2
- package/docs/components/search-field.md +14 -6
- package/docs/components/searchable-select.md +19 -14
- package/docs/components/searchable-table.md +18 -13
- package/docs/components/searchable-tree-dialog.md +190 -0
- package/docs/components/searchable-tree.md +200 -0
- package/docs/components/section-block.md +12 -4
- package/docs/components/select.md +23 -18
- package/docs/components/simple-select.md +14 -10
- package/docs/components/skeleton.md +43 -33
- package/docs/components/slide-date-picker.md +37 -29
- package/docs/components/spin-loading.md +32 -23
- package/docs/components/stepper.md +6 -0
- package/docs/components/switch.md +14 -6
- package/docs/components/tab-form-item.md +7 -1
- package/docs/components/tab-switch.md +13 -6
- package/docs/components/table-dnd-wrapper.md +107 -0
- package/docs/components/table-view.md +15 -5
- package/docs/components/table.md +28 -28
- package/docs/components/text-editor.md +37 -13
- package/docs/components/textarea.md +15 -7
- package/docs/components/timeline.md +6 -0
- package/docs/components/toast.md +35 -26
- package/docs/components/toggle-button.md +24 -21
- package/docs/components/toggle.md +23 -15
- package/docs/components/tooltip.md +42 -30
- package/docs/components/transparent-label.md +29 -20
- package/docs/components/tree-drop-down.md +31 -23
- package/docs/components/tree-sub-layout.md +6 -2
- package/docs/components/tree-view.md +16 -5
- package/docs/explanation/architecture.md +54 -0
- package/docs/explanation/design-system.md +52 -0
- package/docs/how-to/data-views-from-backend-response.md +6 -4
- package/docs/how-to/form-and-list-recipes.md +26 -19
- package/docs/how-to/forms-with-form-builder.md +408 -0
- package/docs/how-to/guides.md +177 -197
- package/docs/migration/changelog.md +38 -0
- package/docs/reference/cli.md +87 -0
- package/docs/reference/components.md +11 -12
- package/docs/reference/hooks.md +8 -8
- package/docs/reference/providers.md +22 -22
- package/docs/reference/tailwind-plugins.md +2 -2
- package/docs/reference/theme.md +85 -0
- package/docs/reference/types.md +4 -4
- package/docs/reference/utilities.md +19 -26
- package/docs/tutorials/building-first-form.md +170 -172
- package/docs/tutorials/component-composition.md +34 -50
- package/docs/tutorials/getting-started.md +2 -2
- package/docs/tutorials/theming-basics.md +13 -10
- package/package.json +31 -3
- package/dist/src/commands/block.d.ts +0 -5
- package/dist/src/commands/block.d.ts.map +0 -1
- package/dist/src/commands/block.js +0 -255
- package/dist/src/commands/block.js.map +0 -1
- package/dist/src/shared/configureFonts.d.ts +0 -6
- package/dist/src/shared/configureFonts.d.ts.map +0 -1
- package/dist/src/shared/configureFonts.js +0 -106
- package/dist/src/shared/configureFonts.js.map +0 -1
- package/dist/src/shared/configureGlobalCss.d.ts +0 -6
- package/dist/src/shared/configureGlobalCss.d.ts.map +0 -1
- package/dist/src/shared/configureGlobalCss.js +0 -154
- package/dist/src/shared/configureGlobalCss.js.map +0 -1
- package/dist/src/shared/configureTailwind.d.ts +0 -7
- package/dist/src/shared/configureTailwind.d.ts.map +0 -1
- package/dist/src/shared/configureTailwind.js +0 -163
- package/dist/src/shared/configureTailwind.js.map +0 -1
- package/dist/src/shared/detectFramework.d.ts +0 -23
- package/dist/src/shared/detectFramework.d.ts.map +0 -1
- package/dist/src/shared/detectFramework.js +0 -119
- package/dist/src/shared/detectFramework.js.map +0 -1
- package/dist/src/shared/installBaseUtils.d.ts +0 -5
- package/dist/src/shared/installBaseUtils.d.ts.map +0 -1
- package/dist/src/shared/installBaseUtils.js +0 -79
- package/dist/src/shared/installBaseUtils.js.map +0 -1
- package/dist/src/shared/resolveAliases.d.ts +0 -24
- package/dist/src/shared/resolveAliases.d.ts.map +0 -1
- package/dist/src/shared/resolveAliases.js +0 -98
- package/dist/src/shared/resolveAliases.js.map +0 -1
|
@@ -38,6 +38,8 @@ interface Props {
|
|
|
38
38
|
theme?: Themes;
|
|
39
39
|
dir?: string;
|
|
40
40
|
className?: string;
|
|
41
|
+
/** Transparent border/background so the trigger blends into a table cell. */
|
|
42
|
+
onTable?: boolean;
|
|
41
43
|
|
|
42
44
|
// --- Async / backend pagination (all optional; static `options` still works) ---
|
|
43
45
|
/**
|
|
@@ -91,7 +93,7 @@ const menuContentStyles = cva(
|
|
|
91
93
|
},
|
|
92
94
|
},
|
|
93
95
|
defaultVariants: { variant: "PresentationStyle" },
|
|
94
|
-
}
|
|
96
|
+
},
|
|
95
97
|
);
|
|
96
98
|
|
|
97
99
|
export function SearchableSelect({
|
|
@@ -105,6 +107,7 @@ export function SearchableSelect({
|
|
|
105
107
|
theme,
|
|
106
108
|
dir,
|
|
107
109
|
className,
|
|
110
|
+
onTable,
|
|
108
111
|
filterClientSide = true,
|
|
109
112
|
onSearchChange,
|
|
110
113
|
searchDebounceMs = 300,
|
|
@@ -123,10 +126,7 @@ export function SearchableSelect({
|
|
|
123
126
|
|
|
124
127
|
const groupRef = useClickOutside<HTMLDivElement>((e) => {
|
|
125
128
|
const target = e?.target as Node;
|
|
126
|
-
if (
|
|
127
|
-
!groupRef.current?.contains(target) &&
|
|
128
|
-
!popoverContentRef.current?.contains(target)
|
|
129
|
-
) {
|
|
129
|
+
if (!groupRef.current?.contains(target) && !popoverContentRef.current?.contains(target)) {
|
|
130
130
|
setOpen(false);
|
|
131
131
|
}
|
|
132
132
|
});
|
|
@@ -168,7 +168,7 @@ export function SearchableSelect({
|
|
|
168
168
|
};
|
|
169
169
|
|
|
170
170
|
// Solid value: search text while typing, otherwise the selected label.
|
|
171
|
-
const displayValue = searching ? search : selectedOption?.label ?? "";
|
|
171
|
+
const displayValue = searching ? search : (selectedOption?.label ?? "");
|
|
172
172
|
|
|
173
173
|
return (
|
|
174
174
|
<Popover open={open}>
|
|
@@ -178,11 +178,13 @@ export function SearchableSelect({
|
|
|
178
178
|
data-theme={theme}
|
|
179
179
|
variant={variant}
|
|
180
180
|
size={size === "XS" ? "S" : size}
|
|
181
|
+
onTable={onTable}
|
|
181
182
|
ref={groupRef as never}
|
|
182
183
|
onFocus={(e: React.FocusEvent<HTMLDivElement>) =>
|
|
183
184
|
setDropdownWidth(e.currentTarget.offsetWidth)
|
|
184
185
|
}
|
|
185
|
-
|
|
186
|
+
// Trigger styling mirrors the `Select` component's trigger so the two read identically.
|
|
187
|
+
className={cn("flex w-full items-center gap-1 rounded-[6px] p-[4px]", className)}
|
|
186
188
|
>
|
|
187
189
|
{icon && <Icon>{icon}</Icon>}
|
|
188
190
|
<Input
|
|
@@ -221,14 +223,15 @@ export function SearchableSelect({
|
|
|
221
223
|
}
|
|
222
224
|
}}
|
|
223
225
|
className={cn(
|
|
224
|
-
|
|
225
|
-
|
|
226
|
+
// Same box + open-state fill as the Select trigger's chevron.
|
|
227
|
+
"h-[32px] w-[32px] shrink-0",
|
|
228
|
+
open && "bg-background-presentation-action-hover text-white",
|
|
226
229
|
)}
|
|
227
230
|
>
|
|
228
231
|
<i
|
|
229
232
|
className={cn(
|
|
230
|
-
"ri-arrow-down-s-line text-[
|
|
231
|
-
open && "rotate-180"
|
|
233
|
+
"ri-arrow-down-s-line !text-[26px] transition-all duration-100 ease-in-out",
|
|
234
|
+
open && "rotate-180",
|
|
232
235
|
)}
|
|
233
236
|
/>
|
|
234
237
|
</Button>
|
|
@@ -269,15 +272,13 @@ export function SearchableSelect({
|
|
|
269
272
|
data-highlighted={isSelected ? "" : undefined}
|
|
270
273
|
className={cn(
|
|
271
274
|
MenuItemStyles({ variant: "Default", size: "M" }),
|
|
272
|
-
"shrink-0" // keep full row height; the list scrolls instead of squishing
|
|
275
|
+
"shrink-0", // keep full row height; the list scrolls instead of squishing
|
|
273
276
|
)}
|
|
274
277
|
>
|
|
275
278
|
<div>
|
|
276
279
|
{option.icon}
|
|
277
280
|
<span className="flex-1 text-start">{option.label}</span>
|
|
278
|
-
{isSelected &&
|
|
279
|
-
<i className="ri-check-line text-[16px] shrink-0" />
|
|
280
|
-
)}
|
|
281
|
+
{isSelected && <i className="ri-check-line text-[16px] shrink-0" />}
|
|
281
282
|
</div>
|
|
282
283
|
</button>
|
|
283
284
|
);
|
|
@@ -298,7 +299,6 @@ export function SearchableSelect({
|
|
|
298
299
|
<LoadingIcon size="M" />
|
|
299
300
|
</div>
|
|
300
301
|
)}
|
|
301
|
-
|
|
302
302
|
</div>
|
|
303
303
|
</PopoverContent>
|
|
304
304
|
</Popover>
|
|
@@ -11,22 +11,10 @@ import {
|
|
|
11
11
|
} from "react";
|
|
12
12
|
import { cn } from "../utils/cn";
|
|
13
13
|
import { Themes } from "../utils/types";
|
|
14
|
-
import {
|
|
15
|
-
Dialog,
|
|
16
|
-
DialogTrigger,
|
|
17
|
-
DialogContent,
|
|
18
|
-
DialogTitle,
|
|
19
|
-
} from "./Dialog";
|
|
14
|
+
import { Dialog, DialogTrigger, DialogContent, DialogTitle } from "./Dialog";
|
|
20
15
|
import { Icon, Input, Group } from "./Input";
|
|
21
16
|
import { LoadingIcon } from "./Button";
|
|
22
|
-
import {
|
|
23
|
-
Table,
|
|
24
|
-
TableHeader,
|
|
25
|
-
TableBody,
|
|
26
|
-
TableHead,
|
|
27
|
-
TableRow,
|
|
28
|
-
TableCell,
|
|
29
|
-
} from "./Table";
|
|
17
|
+
import { Table, TableHeader, TableBody, TableHead, TableRow, TableCell } from "./Table";
|
|
30
18
|
|
|
31
19
|
/**
|
|
32
20
|
* SearchableTable — a field that opens a modal Dialog to pick a row from a Table.
|
|
@@ -119,8 +107,7 @@ export function SearchableTable<T extends Record<string, unknown>>({
|
|
|
119
107
|
const inputRef = useRef<HTMLInputElement | null>(null);
|
|
120
108
|
|
|
121
109
|
const rowId = (row: T) => getRowId?.(row) ?? JSON.stringify(row);
|
|
122
|
-
const label = (row: T) =>
|
|
123
|
-
getLabel?.(row) ?? String(row[columns[0]?.key] ?? "");
|
|
110
|
+
const label = (row: T) => getLabel?.(row) ?? String(row[columns[0]?.key] ?? "");
|
|
124
111
|
|
|
125
112
|
const keysToSearch = searchKeys ?? columns.map((c) => c.key);
|
|
126
113
|
|
|
@@ -154,8 +141,10 @@ export function SearchableTable<T extends Record<string, unknown>>({
|
|
|
154
141
|
if (!q) return rows;
|
|
155
142
|
return rows.filter((row) =>
|
|
156
143
|
keysToSearch.some((k) =>
|
|
157
|
-
String(row[k] ?? "")
|
|
158
|
-
|
|
144
|
+
String(row[k] ?? "")
|
|
145
|
+
.toLowerCase()
|
|
146
|
+
.includes(q),
|
|
147
|
+
),
|
|
159
148
|
);
|
|
160
149
|
}, [rows, search, keysToSearch, filterClientSide]);
|
|
161
150
|
|
|
@@ -177,10 +166,7 @@ export function SearchableTable<T extends Record<string, unknown>>({
|
|
|
177
166
|
size={size === "XS" ? "S" : size}
|
|
178
167
|
role="button"
|
|
179
168
|
tabIndex={0}
|
|
180
|
-
className={cn(
|
|
181
|
-
"flex w-full items-center gap-1 p-1 cursor-pointer",
|
|
182
|
-
className
|
|
183
|
-
)}
|
|
169
|
+
className={cn("flex w-full items-center gap-1 p-1 cursor-pointer", className)}
|
|
184
170
|
>
|
|
185
171
|
{icon && <Icon>{icon}</Icon>}
|
|
186
172
|
<span
|
|
@@ -188,12 +174,12 @@ export function SearchableTable<T extends Record<string, unknown>>({
|
|
|
188
174
|
"flex-1 px-1 truncate typography-body-medium-regular",
|
|
189
175
|
value
|
|
190
176
|
? "text-content-presentation-action-light-primary"
|
|
191
|
-
: "text-content-presentation-action-light-secondary"
|
|
177
|
+
: "text-content-presentation-action-light-secondary",
|
|
192
178
|
)}
|
|
193
179
|
>
|
|
194
180
|
{value ? label(value) : placeholder}
|
|
195
181
|
</span>
|
|
196
|
-
<i className="ri-arrow-down-s-line text-[
|
|
182
|
+
<i className="ri-arrow-down-s-line text-[20px] shrink-0 text-content-presentation-action-light-primary" />
|
|
197
183
|
</Group>
|
|
198
184
|
</DialogTrigger>
|
|
199
185
|
|
|
@@ -206,7 +192,7 @@ export function SearchableTable<T extends Record<string, unknown>>({
|
|
|
206
192
|
inputRef.current?.focus();
|
|
207
193
|
}}
|
|
208
194
|
className={cn(
|
|
209
|
-
"w-[min(640px,90vw)] bg-transparent !items-stretch rounded-[14px]
|
|
195
|
+
"w-[min(640px,90vw)] bg-transparent !items-stretch rounded-[14px] shadow-none",
|
|
210
196
|
)}
|
|
211
197
|
>
|
|
212
198
|
{/* Visually-hidden title for accessibility (Radix requires a DialogTitle). */}
|
|
@@ -225,72 +211,74 @@ export function SearchableTable<T extends Record<string, unknown>>({
|
|
|
225
211
|
/>
|
|
226
212
|
|
|
227
213
|
{/* Scrollable table area */}
|
|
228
|
-
<div
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
<Table
|
|
235
|
-
theme={theme as never}
|
|
236
|
-
data-theme="dark"
|
|
237
|
-
className="w-full rounded-[10px] overflow-hidden"
|
|
214
|
+
<div className=" w-full flex justify-center">
|
|
215
|
+
<div className="bg-[#696a6f] pt-[8px] rounded-b-[14px] pr-[4px] pb-[4px] pl-[4px] w-[95%] shadow-[0_0_32px_2px_rgba(0,0,0,0.20),0_0_48px_2px_rgba(0,0,0,0.05)]">
|
|
216
|
+
<div
|
|
217
|
+
ref={scrollRef}
|
|
218
|
+
onScroll={handleScroll}
|
|
219
|
+
className="max-h-[55vh] overflow-auto scrollbar-hide rounded-[10px] border border-white-alpha-40 bg-[rgba(184,192,204,0.5)]"
|
|
238
220
|
>
|
|
239
|
-
|
|
240
|
-
<
|
|
241
|
-
{
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
</TableHead>
|
|
248
|
-
))}
|
|
249
|
-
</TableRow>
|
|
250
|
-
</TableHeader>
|
|
251
|
-
<TableBody>
|
|
252
|
-
{filteredRows.map((row) => {
|
|
253
|
-
const id = rowId(row);
|
|
254
|
-
return (
|
|
255
|
-
<TableRow
|
|
256
|
-
key={id}
|
|
257
|
-
state={selectedId === id ? "selected" : undefined}
|
|
258
|
-
onClick={() => handleSelect(row)}
|
|
259
|
-
className={cn(
|
|
260
|
-
"cursor-pointer h-[40px]",
|
|
261
|
-
selectedId === id && "bg-white-alpha-50"
|
|
262
|
-
)}
|
|
263
|
-
>
|
|
221
|
+
{filteredRows.length > 0 && (
|
|
222
|
+
<Table
|
|
223
|
+
theme={theme as never}
|
|
224
|
+
data-theme="dark"
|
|
225
|
+
className="w-full rounded-[10px] overflow-hidden"
|
|
226
|
+
>
|
|
227
|
+
<TableHeader className="bg-black-alpha-20 shadow-[0px_4px_8px_0px_rgba(0,0,0,0.15)]">
|
|
228
|
+
<TableRow className="h-[44px] [&_button]:bg-white-alpha-40 [&>th]:border-white-alpha-20">
|
|
264
229
|
{columns.map((col) => (
|
|
265
|
-
<
|
|
230
|
+
<TableHead
|
|
266
231
|
key={col.key}
|
|
267
|
-
className="
|
|
232
|
+
className="cursor-default typography-body-medium-medium text-white"
|
|
268
233
|
>
|
|
269
|
-
{col.
|
|
270
|
-
|
|
271
|
-
: String(row[col.key] ?? "")}
|
|
272
|
-
</TableCell>
|
|
234
|
+
{col.header}
|
|
235
|
+
</TableHead>
|
|
273
236
|
))}
|
|
274
237
|
</TableRow>
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
238
|
+
</TableHeader>
|
|
239
|
+
<TableBody>
|
|
240
|
+
{filteredRows.map((row) => {
|
|
241
|
+
const id = rowId(row);
|
|
242
|
+
return (
|
|
243
|
+
<TableRow
|
|
244
|
+
key={id}
|
|
245
|
+
state={selectedId === id ? "selected" : undefined}
|
|
246
|
+
onClick={() => handleSelect(row)}
|
|
247
|
+
className={cn(
|
|
248
|
+
"cursor-pointer h-[40px]",
|
|
249
|
+
selectedId === id && "bg-white-alpha-50",
|
|
250
|
+
)}
|
|
251
|
+
>
|
|
252
|
+
{columns.map((col) => (
|
|
253
|
+
<TableCell
|
|
254
|
+
key={col.key}
|
|
255
|
+
className="border-b border-white-alpha-20 text-white px-[8px] !whitespace-nowrap !break-normal"
|
|
256
|
+
>
|
|
257
|
+
{col.render ? col.render(row) : String(row[col.key] ?? "")}
|
|
258
|
+
</TableCell>
|
|
259
|
+
))}
|
|
260
|
+
</TableRow>
|
|
261
|
+
);
|
|
262
|
+
})}
|
|
263
|
+
</TableBody>
|
|
264
|
+
</Table>
|
|
265
|
+
)}
|
|
280
266
|
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
267
|
+
{/* Empty state — only when nothing is loading. */}
|
|
268
|
+
{filteredRows.length === 0 && !loading && (
|
|
269
|
+
<div className="px-3 py-6 text-center typography-body-small-regular text-white-alpha-75">
|
|
270
|
+
No results found
|
|
271
|
+
</div>
|
|
272
|
+
)}
|
|
287
273
|
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
274
|
+
{/* Loading row (initial load or fetching the next page). */}
|
|
275
|
+
{loading && (
|
|
276
|
+
<div className="flex items-center justify-center py-3">
|
|
277
|
+
<LoadingIcon size="M" />
|
|
278
|
+
</div>
|
|
279
|
+
)}
|
|
292
280
|
</div>
|
|
293
|
-
|
|
281
|
+
</div>
|
|
294
282
|
</div>
|
|
295
283
|
</DialogContent>
|
|
296
284
|
</Dialog>
|
|
@@ -304,8 +292,7 @@ SearchableTable.displayName = "SearchableTable";
|
|
|
304
292
|
/* The whole field + its text turn white on hover/focus, fully controlled here. */
|
|
305
293
|
/* -------------------------------------------------------------------------- */
|
|
306
294
|
|
|
307
|
-
interface SearchInputProps
|
|
308
|
-
extends Omit<InputHTMLAttributes<HTMLInputElement>, "size"> {
|
|
295
|
+
interface SearchInputProps extends Omit<InputHTMLAttributes<HTMLInputElement>, "size"> {
|
|
309
296
|
variant?: "SystemStyle" | "PresentationStyle";
|
|
310
297
|
theme?: Themes;
|
|
311
298
|
label?: string;
|
|
@@ -313,41 +300,44 @@ interface SearchInputProps
|
|
|
313
300
|
|
|
314
301
|
const SearchInput = forwardRef<HTMLInputElement, SearchInputProps>(
|
|
315
302
|
({ variant = "PresentationStyle", theme, label, className, ...props }, ref) => (
|
|
316
|
-
<
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
"group flex w-full items-center gap-2 p-1 rounded-[10px] transition-colors",
|
|
322
|
-
"border border-white-alpha-40 bg-[rgba(184,192,204,0.5)]",
|
|
323
|
-
"hover:bg-background-presentation-table-row-hover",
|
|
324
|
-
"focus-within:bg-background-presentation-table-row-hover",
|
|
325
|
-
className
|
|
326
|
-
)}
|
|
327
|
-
>
|
|
328
|
-
<Icon className="shrink-0">
|
|
329
|
-
<i className="ri-search-line text-content-presentation-global-secondary transition-colors group-hover:text-white group-focus-within:text-white" />
|
|
330
|
-
</Icon>
|
|
331
|
-
|
|
332
|
-
{label && (
|
|
333
|
-
<>
|
|
334
|
-
<span className="shrink-0 px-1 typography-labels-small-regular text-content-presentation-global-secondary text-[14px] text-white transition-colors group-hover:text-white group-focus-within:text-white">
|
|
335
|
-
{label}
|
|
336
|
-
</span>
|
|
337
|
-
<span className="h-[14px] w-px shrink-0 rounded-full bg-border-presentation-action-labelless-divider transition-colors group-hover:bg-white-alpha-40" />
|
|
338
|
-
</>
|
|
339
|
-
)}
|
|
340
|
-
|
|
341
|
-
<Input
|
|
342
|
-
ref={ref}
|
|
343
|
-
{...props}
|
|
303
|
+
<div className="flex p-[3px] flex-col gap-[10px] rounded-[14px] bg-[rgba(61,64,69,0.65)] shadow-[0_0_18px_0_rgba(0,0,0,0.40)] backdrop-blur-[21px]">
|
|
304
|
+
<Group
|
|
305
|
+
data-theme={theme}
|
|
306
|
+
variant={variant}
|
|
307
|
+
size="M"
|
|
344
308
|
className={cn(
|
|
345
|
-
"
|
|
346
|
-
"
|
|
347
|
-
"
|
|
309
|
+
"group flex w-full items-center gap-2 p-1 rounded-[10px] transition-colors",
|
|
310
|
+
"border border-white-alpha-40 bg-[rgba(184,192,204,0.5)]",
|
|
311
|
+
"hover:bg-background-presentation-table-row-hover",
|
|
312
|
+
"focus-within:bg-background-presentation-table-row-hover rounded-[11px] border border-white-alpha-40 bg-[rgba(37,44,57,0.30)]",
|
|
313
|
+
className,
|
|
314
|
+
)}
|
|
315
|
+
>
|
|
316
|
+
<Icon className="shrink-0">
|
|
317
|
+
<i className="ri-search-line text-content-presentation-global-secondary transition-colors group-hover:text-white group-focus-within:text-white" />
|
|
318
|
+
</Icon>
|
|
319
|
+
|
|
320
|
+
{label && (
|
|
321
|
+
<>
|
|
322
|
+
<span className="shrink-0 px-1 typography-labels-small-regular text-content-presentation-global-secondary text-[14px] text-white transition-colors group-hover:text-white group-focus-within:text-white">
|
|
323
|
+
{label}
|
|
324
|
+
</span>
|
|
325
|
+
<span className="h-[14px] w-px shrink-0 rounded-full bg-border-presentation-action-labelless-divider transition-colors group-hover:bg-white-alpha-40" />
|
|
326
|
+
</>
|
|
348
327
|
)}
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
328
|
+
|
|
329
|
+
<Input
|
|
330
|
+
ref={ref}
|
|
331
|
+
{...props}
|
|
332
|
+
className={cn(
|
|
333
|
+
"min-w-[100px] flex-1 !h-[24px] bg-transparent",
|
|
334
|
+
"text-content-presentation-action-light-primary",
|
|
335
|
+
"placeholder:hover:text-white-alpha-75",
|
|
336
|
+
"transition-colors group-hover:!text-white group-focus-within:!text-white",
|
|
337
|
+
)}
|
|
338
|
+
/>
|
|
339
|
+
</Group>
|
|
340
|
+
</div>
|
|
341
|
+
),
|
|
352
342
|
);
|
|
353
343
|
SearchInput.displayName = "SearchInput";
|