torch-glare 2.3.0 → 2.4.1
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 +7 -3
- package/apps/lib/components/BadgeField.tsx +76 -71
- package/apps/lib/components/Breadcrumb.tsx +49 -85
- package/apps/lib/components/Button.tsx +20 -19
- package/apps/lib/components/ButtonGroup.tsx +31 -41
- package/apps/lib/components/Calendar.tsx +51 -29
- package/apps/lib/components/Card.tsx +2 -13
- package/apps/lib/components/ChartBlockTool.ts +17 -52
- package/apps/lib/components/Checkbox.tsx +9 -16
- package/apps/lib/components/ContextMenu.tsx +110 -106
- package/apps/lib/components/CountBadge.tsx +4 -6
- package/apps/lib/components/DataTable.tsx +196 -216
- package/apps/lib/components/DataViews/DataViewRadio.tsx +10 -8
- package/apps/lib/components/DataViews/DataViewsConfigPanel.tsx +21 -55
- 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 +173 -150
- 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 +87 -0
- 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 +111 -114
- package/apps/lib/components/DatePicker.tsx +198 -191
- package/apps/lib/components/Dialog.tsx +92 -105
- package/apps/lib/components/Divider.tsx +21 -24
- package/apps/lib/components/Drawer.tsx +79 -139
- package/apps/lib/components/DropdownMenu.tsx +144 -181
- package/apps/lib/components/FieldHint.tsx +4 -11
- package/apps/lib/components/Form.tsx +146 -155
- package/apps/lib/components/FormStepper.tsx +9 -39
- package/apps/lib/components/HeaderBar.tsx +119 -0
- package/apps/lib/components/ImageAttachment.tsx +111 -73
- 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 +31 -35
- 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 +9 -28
- package/apps/lib/components/ScrollArea.tsx +45 -43
- package/apps/lib/components/SearchField.tsx +49 -39
- package/apps/lib/components/SearchableSelect.tsx +46 -52
- package/apps/lib/components/SearchableTable.tsx +199 -219
- package/apps/lib/components/SearchableTree.tsx +469 -0
- package/apps/lib/components/SearchableTreeDialog.tsx +493 -0
- package/apps/lib/components/SectionBlock.tsx +4 -16
- package/apps/lib/components/Select.tsx +53 -80
- 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/TableDnDWrapper.ts +15 -48
- package/apps/lib/components/TextEditor.tsx +93 -104
- package/apps/lib/components/Textarea.tsx +8 -12
- 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 +1004 -0
- package/apps/lib/tsconfig.json +9 -0
- package/apps/lib/utils/cn.ts +1 -1
- 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/markdownParser.ts +2 -7
- 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 +19 -16
- package/docs/components/chart-block-tool.md +128 -0
- package/docs/components/checkbox.md +16 -8
- package/docs/components/cn-layout.md +7 -1
- package/docs/components/context-menu.md +47 -24
- package/docs/components/count-badge.md +7 -1
- package/docs/components/data-table.md +45 -33
- package/docs/components/data-views-config-panel.md +18 -14
- package/docs/components/data-views-layout.md +20 -17
- 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 +8 -33
- package/docs/components/dropdown-menu.md +51 -32
- package/docs/components/field-hint.md +37 -25
- package/docs/components/field-section.md +9 -3
- package/docs/components/form-stepper.md +6 -0
- package/docs/components/form.md +17 -20
- package/docs/components/header-bar.md +187 -0
- package/docs/components/image-attachment.md +33 -41
- 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 +60 -41
- package/docs/components/searchable-tree-dialog.md +190 -0
- package/docs/components/searchable-tree.md +200 -0
- package/docs/components/section-block.md +130 -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 +105 -0
- package/docs/components/table-view.md +15 -5
- package/docs/components/table.md +28 -28
- package/docs/components/text-editor.md +19 -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 +7 -4
- package/docs/how-to/guides.md +24 -18
- 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 +20 -13
- 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
|
@@ -1,32 +1,32 @@
|
|
|
1
|
-
"use client"
|
|
1
|
+
"use client";
|
|
2
2
|
|
|
3
|
-
import { cn } from "../../../utils/cn"
|
|
4
|
-
import type { FieldPreset, FilterValue } from "../types"
|
|
5
|
-
import { isPresetActive, presetToFilterValue } from "../../../utils/dataViews/rangeUtils"
|
|
3
|
+
import { cn } from "../../../utils/cn";
|
|
4
|
+
import type { FieldPreset, FilterValue } from "../types";
|
|
5
|
+
import { isPresetActive, presetToFilterValue } from "../../../utils/dataViews/rangeUtils";
|
|
6
6
|
|
|
7
7
|
type PresetChipsProps = {
|
|
8
|
-
presets: FieldPreset[]
|
|
9
|
-
current: FilterValue | undefined
|
|
10
|
-
onSelect: (value: FilterValue) => void
|
|
11
|
-
}
|
|
8
|
+
presets: FieldPreset[];
|
|
9
|
+
current: FilterValue | undefined;
|
|
10
|
+
onSelect: (value: FilterValue) => void;
|
|
11
|
+
};
|
|
12
12
|
|
|
13
13
|
export function PresetChips({ presets, current, onSelect }: PresetChipsProps) {
|
|
14
|
-
if (!presets || presets.length === 0) return null
|
|
14
|
+
if (!presets || presets.length === 0) return null;
|
|
15
15
|
|
|
16
16
|
return (
|
|
17
17
|
<div className="flex flex-wrap gap-1.5">
|
|
18
18
|
{presets.map((p) => {
|
|
19
|
-
const active = isPresetActive(p, current)
|
|
19
|
+
const active = isPresetActive(p, current);
|
|
20
20
|
return (
|
|
21
21
|
<button
|
|
22
22
|
key={p.label}
|
|
23
23
|
type="button"
|
|
24
24
|
onClick={() => {
|
|
25
25
|
if (active) {
|
|
26
|
-
const v = presetToFilterValue(p)
|
|
27
|
-
onSelect(v.kind === "number" ? { kind: "number" } : { kind: "date" })
|
|
26
|
+
const v = presetToFilterValue(p);
|
|
27
|
+
onSelect(v.kind === "number" ? { kind: "number" } : { kind: "date" });
|
|
28
28
|
} else {
|
|
29
|
-
onSelect(presetToFilterValue(p))
|
|
29
|
+
onSelect(presetToFilterValue(p));
|
|
30
30
|
}
|
|
31
31
|
}}
|
|
32
32
|
className={cn(
|
|
@@ -38,8 +38,8 @@ export function PresetChips({ presets, current, onSelect }: PresetChipsProps) {
|
|
|
38
38
|
>
|
|
39
39
|
{p.label}
|
|
40
40
|
</button>
|
|
41
|
-
)
|
|
41
|
+
);
|
|
42
42
|
})}
|
|
43
43
|
</div>
|
|
44
|
-
)
|
|
44
|
+
);
|
|
45
45
|
}
|
|
@@ -1,58 +1,62 @@
|
|
|
1
|
-
"use client"
|
|
1
|
+
"use client";
|
|
2
2
|
|
|
3
|
-
import { useEffect, useMemo, useState } from "react"
|
|
4
|
-
import * as Slider from "@radix-ui/react-slider"
|
|
5
|
-
import { cn } from "../../../utils/cn"
|
|
6
|
-
import type { FieldConfig, NumericRangeFilter } from "../types"
|
|
7
|
-
import type { NumericExtremes } from "../../../utils/dataViews/rangeUtils"
|
|
3
|
+
import { useEffect, useMemo, useState } from "react";
|
|
4
|
+
import * as Slider from "@radix-ui/react-slider";
|
|
5
|
+
import { cn } from "../../../utils/cn";
|
|
6
|
+
import type { FieldConfig, NumericRangeFilter } from "../types";
|
|
7
|
+
import type { NumericExtremes } from "../../../utils/dataViews/rangeUtils";
|
|
8
8
|
|
|
9
9
|
type Props = {
|
|
10
|
-
field: FieldConfig
|
|
11
|
-
extremes: NumericExtremes
|
|
12
|
-
step: number
|
|
13
|
-
value: NumericRangeFilter | undefined
|
|
14
|
-
onChange: (next: NumericRangeFilter) => void
|
|
15
|
-
}
|
|
10
|
+
field: FieldConfig;
|
|
11
|
+
extremes: NumericExtremes;
|
|
12
|
+
step: number;
|
|
13
|
+
value: NumericRangeFilter | undefined;
|
|
14
|
+
onChange: (next: NumericRangeFilter) => void;
|
|
15
|
+
};
|
|
16
16
|
|
|
17
17
|
export function RangeSliderWithInputs({ field, extremes, step, value, onChange }: Props) {
|
|
18
|
-
const min = field.rangeMin ?? extremes.min
|
|
19
|
-
const max = field.rangeMax ?? extremes.max
|
|
18
|
+
const min = field.rangeMin ?? extremes.min;
|
|
19
|
+
const max = field.rangeMax ?? extremes.max;
|
|
20
20
|
|
|
21
|
-
const lo = value?.min ?? min
|
|
22
|
-
const hi = value?.max ?? max
|
|
21
|
+
const lo = value?.min ?? min;
|
|
22
|
+
const hi = value?.max ?? max;
|
|
23
23
|
|
|
24
|
-
const [loInput, setLoInput] = useState(formatForInput(lo, field))
|
|
25
|
-
const [hiInput, setHiInput] = useState(formatForInput(hi, field))
|
|
24
|
+
const [loInput, setLoInput] = useState(formatForInput(lo, field));
|
|
25
|
+
const [hiInput, setHiInput] = useState(formatForInput(hi, field));
|
|
26
26
|
|
|
27
|
-
useEffect(() => {
|
|
28
|
-
|
|
27
|
+
useEffect(() => {
|
|
28
|
+
setLoInput(formatForInput(lo, field));
|
|
29
|
+
}, [lo, field]);
|
|
30
|
+
useEffect(() => {
|
|
31
|
+
setHiInput(formatForInput(hi, field));
|
|
32
|
+
}, [hi, field]);
|
|
29
33
|
|
|
30
34
|
const commit = (rawLo: number, rawHi: number) => {
|
|
31
|
-
let nlo = clamp(rawLo, min, max)
|
|
32
|
-
let nhi = clamp(rawHi, min, max)
|
|
33
|
-
if (nlo > nhi) [nlo, nhi] = [nhi, nlo]
|
|
34
|
-
const atFloor = nlo === min
|
|
35
|
-
const atCeil
|
|
35
|
+
let nlo = clamp(rawLo, min, max);
|
|
36
|
+
let nhi = clamp(rawHi, min, max);
|
|
37
|
+
if (nlo > nhi) [nlo, nhi] = [nhi, nlo];
|
|
38
|
+
const atFloor = nlo === min;
|
|
39
|
+
const atCeil = nhi === max;
|
|
36
40
|
onChange({
|
|
37
41
|
kind: "number",
|
|
38
42
|
min: atFloor ? undefined : nlo,
|
|
39
|
-
max: atCeil
|
|
40
|
-
})
|
|
41
|
-
}
|
|
43
|
+
max: atCeil ? undefined : nhi,
|
|
44
|
+
});
|
|
45
|
+
};
|
|
42
46
|
|
|
43
47
|
const handleSliderChange = (vals: number[]) => {
|
|
44
|
-
if (vals.length !== 2) return
|
|
45
|
-
commit(vals[0], vals[1])
|
|
46
|
-
}
|
|
48
|
+
if (vals.length !== 2) return;
|
|
49
|
+
commit(vals[0], vals[1]);
|
|
50
|
+
};
|
|
47
51
|
|
|
48
52
|
const commitFromInputs = () => {
|
|
49
|
-
const nlo = parseFloat(loInput)
|
|
50
|
-
const nhi = parseFloat(hiInput)
|
|
51
|
-
commit(Number.isFinite(nlo) ? nlo : lo, Number.isFinite(nhi) ? nhi : hi)
|
|
52
|
-
}
|
|
53
|
+
const nlo = parseFloat(loInput);
|
|
54
|
+
const nhi = parseFloat(hiInput);
|
|
55
|
+
commit(Number.isFinite(nlo) ? nlo : lo, Number.isFinite(nhi) ? nhi : hi);
|
|
56
|
+
};
|
|
53
57
|
|
|
54
|
-
const prefix = useMemo(() => prefixFor(field), [field])
|
|
55
|
-
const suffix = useMemo(() => suffixFor(field), [field])
|
|
58
|
+
const prefix = useMemo(() => prefixFor(field), [field]);
|
|
59
|
+
const suffix = useMemo(() => suffixFor(field), [field]);
|
|
56
60
|
|
|
57
61
|
return (
|
|
58
62
|
<div className="space-y-3">
|
|
@@ -98,18 +102,23 @@ export function RangeSliderWithInputs({ field, extremes, step, value, onChange }
|
|
|
98
102
|
/>
|
|
99
103
|
</div>
|
|
100
104
|
</div>
|
|
101
|
-
)
|
|
105
|
+
);
|
|
102
106
|
}
|
|
103
107
|
|
|
104
108
|
function NumberCell({
|
|
105
|
-
label,
|
|
109
|
+
label,
|
|
110
|
+
value,
|
|
111
|
+
onChange,
|
|
112
|
+
onCommit,
|
|
113
|
+
prefix,
|
|
114
|
+
suffix,
|
|
106
115
|
}: {
|
|
107
|
-
label: string
|
|
108
|
-
value: string
|
|
109
|
-
onChange: (v: string) => void
|
|
110
|
-
onCommit: () => void
|
|
111
|
-
prefix?: string
|
|
112
|
-
suffix?: string
|
|
116
|
+
label: string;
|
|
117
|
+
value: string;
|
|
118
|
+
onChange: (v: string) => void;
|
|
119
|
+
onCommit: () => void;
|
|
120
|
+
prefix?: string;
|
|
121
|
+
suffix?: string;
|
|
113
122
|
}) {
|
|
114
123
|
return (
|
|
115
124
|
<label className="flex-1 flex items-center gap-1 text-xs bg-background-presentation-body-primary border border-border-presentation-global-primary rounded-md px-2 py-1.5 focus-within:border-content-presentation-action-primary">
|
|
@@ -120,35 +129,37 @@ function NumberCell({
|
|
|
120
129
|
value={value}
|
|
121
130
|
onChange={(e) => onChange(e.target.value)}
|
|
122
131
|
onBlur={onCommit}
|
|
123
|
-
onKeyDown={(e) => {
|
|
132
|
+
onKeyDown={(e) => {
|
|
133
|
+
if (e.key === "Enter") (e.currentTarget as HTMLInputElement).blur();
|
|
134
|
+
}}
|
|
124
135
|
className={cn(
|
|
125
136
|
"w-full bg-transparent outline-none tabular-nums text-content-presentation-global-primary",
|
|
126
137
|
)}
|
|
127
138
|
/>
|
|
128
139
|
{suffix && <span className="text-content-presentation-global-tertiary">{suffix}</span>}
|
|
129
140
|
</label>
|
|
130
|
-
)
|
|
141
|
+
);
|
|
131
142
|
}
|
|
132
143
|
|
|
133
144
|
function clamp(n: number, min: number, max: number): number {
|
|
134
|
-
return Math.min(max, Math.max(min, n))
|
|
145
|
+
return Math.min(max, Math.max(min, n));
|
|
135
146
|
}
|
|
136
147
|
|
|
137
148
|
function formatForInput(n: number, field: FieldConfig): string {
|
|
138
|
-
if (!Number.isFinite(n)) return ""
|
|
139
|
-
if (field.type === "star-rating") return n.toFixed(1)
|
|
140
|
-
if (Number.isInteger(n)) return String(n)
|
|
141
|
-
return String(n)
|
|
149
|
+
if (!Number.isFinite(n)) return "";
|
|
150
|
+
if (field.type === "star-rating") return n.toFixed(1);
|
|
151
|
+
if (Number.isInteger(n)) return String(n);
|
|
152
|
+
return String(n);
|
|
142
153
|
}
|
|
143
154
|
|
|
144
155
|
function prefixFor(field: FieldConfig): string | undefined {
|
|
145
|
-
if (field.type !== "currency") return undefined
|
|
146
|
-
if (typeof field.currency === "string") return "$"
|
|
147
|
-
return field.currency?.symbol ?? "$"
|
|
156
|
+
if (field.type !== "currency") return undefined;
|
|
157
|
+
if (typeof field.currency === "string") return "$";
|
|
158
|
+
return field.currency?.symbol ?? "$";
|
|
148
159
|
}
|
|
149
160
|
|
|
150
161
|
function suffixFor(field: FieldConfig): string | undefined {
|
|
151
|
-
if (field.type === "progress-bar") return "%"
|
|
152
|
-
if (field.type === "star-rating") return "★"
|
|
153
|
-
return undefined
|
|
162
|
+
if (field.type === "progress-bar") return "%";
|
|
163
|
+
if (field.type === "star-rating") return "★";
|
|
164
|
+
return undefined;
|
|
154
165
|
}
|
|
@@ -1,36 +1,36 @@
|
|
|
1
|
-
export { DataViewsLayout } from "./DataViewsLayout"
|
|
2
|
-
export type { DataViewsLayoutProps } from "./DataViewsLayout"
|
|
1
|
+
export { DataViewsLayout } from "./DataViewsLayout";
|
|
2
|
+
export type { DataViewsLayoutProps } from "./DataViewsLayout";
|
|
3
3
|
|
|
4
|
-
export { TableView } from "./TableView"
|
|
5
|
-
export type { TableViewProps } from "./TableView"
|
|
4
|
+
export { TableView } from "./TableView";
|
|
5
|
+
export type { TableViewProps } from "./TableView";
|
|
6
6
|
|
|
7
|
-
export { KanbanView } from "./KanbanView"
|
|
8
|
-
export type { KanbanViewProps } from "./KanbanView"
|
|
7
|
+
export { KanbanView } from "./KanbanView";
|
|
8
|
+
export type { KanbanViewProps } from "./KanbanView";
|
|
9
9
|
|
|
10
|
-
export { InboxView } from "./InboxView"
|
|
11
|
-
export type { InboxViewProps } from "./InboxView"
|
|
10
|
+
export { InboxView } from "./InboxView";
|
|
11
|
+
export type { InboxViewProps } from "./InboxView";
|
|
12
12
|
|
|
13
|
-
export { InboxViewCard } from "./InboxViewCard"
|
|
14
|
-
export type { InboxViewCardProps } from "./InboxViewCard"
|
|
13
|
+
export { InboxViewCard } from "./InboxViewCard";
|
|
14
|
+
export type { InboxViewCardProps } from "./InboxViewCard";
|
|
15
15
|
|
|
16
|
-
export { TreeView } from "./TreeView"
|
|
17
|
-
export type { TreeViewProps } from "./TreeView"
|
|
16
|
+
export { TreeView } from "./TreeView";
|
|
17
|
+
export type { TreeViewProps } from "./TreeView";
|
|
18
18
|
|
|
19
|
-
export { DataViewRadio } from "./DataViewRadio"
|
|
20
|
-
export type { DataViewRadioProps } from "./DataViewRadio"
|
|
19
|
+
export { DataViewRadio } from "./DataViewRadio";
|
|
20
|
+
export type { DataViewRadioProps } from "./DataViewRadio";
|
|
21
21
|
|
|
22
|
-
export { FilterPanel } from "./FilterPanel"
|
|
23
|
-
export { SettingsPanel } from "./SettingsPanel"
|
|
24
|
-
export { DataViewsHeader } from "./DataViewsHeader"
|
|
25
|
-
export type { DataViewsHeaderView } from "./DataViewsHeader"
|
|
26
|
-
export { DataViewsConfigPanel } from "./DataViewsConfigPanel"
|
|
27
|
-
export type { DataViewsConfigPanelProps } from "./DataViewsConfigPanel"
|
|
22
|
+
export { FilterPanel } from "./FilterPanel";
|
|
23
|
+
export { SettingsPanel } from "./SettingsPanel";
|
|
24
|
+
export { DataViewsHeader } from "./DataViewsHeader";
|
|
25
|
+
export type { DataViewsHeaderView } from "./DataViewsHeader";
|
|
26
|
+
export { DataViewsConfigPanel } from "./DataViewsConfigPanel";
|
|
27
|
+
export type { DataViewsConfigPanelProps } from "./DataViewsConfigPanel";
|
|
28
28
|
|
|
29
|
-
export { renderField } from "./fieldRenderers"
|
|
30
|
-
export { resolveBadgeVariant } from "./badgeAdapter"
|
|
31
|
-
export type { ResolvedBadgeProps } from "./badgeAdapter"
|
|
29
|
+
export { renderField } from "./fieldRenderers";
|
|
30
|
+
export { resolveBadgeVariant } from "./badgeAdapter";
|
|
31
|
+
export type { ResolvedBadgeProps } from "./badgeAdapter";
|
|
32
32
|
|
|
33
|
-
export * from "./types"
|
|
33
|
+
export * from "./types";
|
|
34
34
|
|
|
35
|
-
export { useDataViewsState } from "../../hooks/useDataViewsState"
|
|
36
|
-
export type { UseDataViewsStateOptions } from "../../hooks/useDataViewsState"
|
|
35
|
+
export { useDataViewsState } from "../../hooks/useDataViewsState";
|
|
36
|
+
export type { UseDataViewsStateOptions } from "../../hooks/useDataViewsState";
|
|
@@ -1,23 +1,21 @@
|
|
|
1
|
-
"use client"
|
|
1
|
+
"use client";
|
|
2
2
|
|
|
3
|
-
import { Drawer } from "vaul"
|
|
4
|
-
import { Menu, X } from "lucide-react"
|
|
5
|
-
import type { ReactNode } from "react"
|
|
3
|
+
import { Drawer } from "vaul";
|
|
4
|
+
import { Menu, X } from "lucide-react";
|
|
5
|
+
import type { ReactNode } from "react";
|
|
6
6
|
|
|
7
7
|
type Props = {
|
|
8
|
-
open: boolean
|
|
9
|
-
onOpenChange: (open: boolean) => void
|
|
10
|
-
children: ReactNode
|
|
11
|
-
}
|
|
8
|
+
open: boolean;
|
|
9
|
+
onOpenChange: (open: boolean) => void;
|
|
10
|
+
children: ReactNode;
|
|
11
|
+
};
|
|
12
12
|
|
|
13
13
|
export function TreeDrawer({ open, onOpenChange, children }: Props) {
|
|
14
14
|
return (
|
|
15
15
|
<Drawer.Root open={open} onOpenChange={onOpenChange} direction="left">
|
|
16
16
|
<Drawer.Portal>
|
|
17
17
|
<Drawer.Overlay className="fixed inset-0 bg-black/40 z-40" />
|
|
18
|
-
<Drawer.Content
|
|
19
|
-
className="fixed inset-y-0 left-0 z-50 w-72 bg-background-presentation-body-overlay-primary border-r border-border-presentation-global-primary outline-none flex flex-col"
|
|
20
|
-
>
|
|
18
|
+
<Drawer.Content className="fixed inset-y-0 left-0 z-50 w-72 bg-background-presentation-body-overlay-primary border-r border-border-presentation-global-primary outline-none flex flex-col">
|
|
21
19
|
<div className="flex items-center justify-between p-3 border-b border-border-presentation-global-primary">
|
|
22
20
|
<Drawer.Title className="text-sm font-semibold text-content-presentation-global-primary">
|
|
23
21
|
Tree
|
|
@@ -31,13 +29,11 @@ export function TreeDrawer({ open, onOpenChange, children }: Props) {
|
|
|
31
29
|
<X className="w-4 h-4" />
|
|
32
30
|
</button>
|
|
33
31
|
</div>
|
|
34
|
-
<div className="flex-1 overflow-y-auto p-2">
|
|
35
|
-
{children}
|
|
36
|
-
</div>
|
|
32
|
+
<div className="flex-1 overflow-y-auto p-2">{children}</div>
|
|
37
33
|
</Drawer.Content>
|
|
38
34
|
</Drawer.Portal>
|
|
39
35
|
</Drawer.Root>
|
|
40
|
-
)
|
|
36
|
+
);
|
|
41
37
|
}
|
|
42
38
|
|
|
43
39
|
export function TreeDrawerTrigger({ onClick }: { onClick: () => void }) {
|
|
@@ -50,5 +46,5 @@ export function TreeDrawerTrigger({ onClick }: { onClick: () => void }) {
|
|
|
50
46
|
>
|
|
51
47
|
<Menu className="w-4 h-4" />
|
|
52
48
|
</button>
|
|
53
|
-
)
|
|
49
|
+
);
|
|
54
50
|
}
|
|
@@ -1,39 +1,36 @@
|
|
|
1
|
-
"use client"
|
|
1
|
+
"use client";
|
|
2
2
|
|
|
3
|
-
import { useMemo } from "react"
|
|
4
|
-
import type { FieldConfig } from "../types"
|
|
5
|
-
import type { TreeNode } from "../../../utils/dataViews/treeUtils"
|
|
6
|
-
import { getByPath } from "../../../utils/dataViews/pathUtils"
|
|
7
|
-
import { TreeFolder } from "../../TreeFolder"
|
|
8
|
-
import type {
|
|
9
|
-
TreeFolderMoveArgs,
|
|
10
|
-
TreeFolderNode,
|
|
11
|
-
} from "../../TreeFolder"
|
|
3
|
+
import { useMemo } from "react";
|
|
4
|
+
import type { FieldConfig } from "../types";
|
|
5
|
+
import type { TreeNode } from "../../../utils/dataViews/treeUtils";
|
|
6
|
+
import { getByPath } from "../../../utils/dataViews/pathUtils";
|
|
7
|
+
import { TreeFolder } from "../../TreeFolder";
|
|
8
|
+
import type { TreeFolderMoveArgs, TreeFolderNode } from "../../TreeFolder";
|
|
12
9
|
|
|
13
10
|
type Props = {
|
|
14
|
-
roots: TreeNode[]
|
|
15
|
-
expanded: Set<string
|
|
16
|
-
selectedId: string | null
|
|
17
|
-
labelField: FieldConfig
|
|
18
|
-
dndEnabled: boolean
|
|
19
|
-
onToggle: (id: string) => void
|
|
20
|
-
onSelect: (id: string) => void
|
|
21
|
-
onMove?: (args: TreeFolderMoveArgs) => void
|
|
22
|
-
}
|
|
11
|
+
roots: TreeNode[];
|
|
12
|
+
expanded: Set<string>;
|
|
13
|
+
selectedId: string | null;
|
|
14
|
+
labelField: FieldConfig;
|
|
15
|
+
dndEnabled: boolean;
|
|
16
|
+
onToggle: (id: string) => void;
|
|
17
|
+
onSelect: (id: string) => void;
|
|
18
|
+
onMove?: (args: TreeFolderMoveArgs) => void;
|
|
19
|
+
};
|
|
23
20
|
|
|
24
21
|
function toFolderNode(node: TreeNode, labelField: FieldConfig): TreeFolderNode {
|
|
25
|
-
const labelValue = getByPath(node.record, labelField.path)
|
|
26
|
-
const name = labelValue == null ? node.id : String(labelValue)
|
|
22
|
+
const labelValue = getByPath(node.record, labelField.path);
|
|
23
|
+
const name = labelValue == null ? node.id : String(labelValue);
|
|
27
24
|
const children = node.children.length
|
|
28
25
|
? node.children.map((c) => toFolderNode(c, labelField))
|
|
29
|
-
: undefined
|
|
26
|
+
: undefined;
|
|
30
27
|
return {
|
|
31
28
|
id: node.id,
|
|
32
29
|
name,
|
|
33
30
|
type: children ? "folder" : "file",
|
|
34
31
|
data: node.record,
|
|
35
32
|
children,
|
|
36
|
-
}
|
|
33
|
+
};
|
|
37
34
|
}
|
|
38
35
|
|
|
39
36
|
export function TreeSidebar({
|
|
@@ -49,23 +46,23 @@ export function TreeSidebar({
|
|
|
49
46
|
const folderData = useMemo(
|
|
50
47
|
() => roots.map((r) => toFolderNode(r, labelField)),
|
|
51
48
|
[roots, labelField],
|
|
52
|
-
)
|
|
49
|
+
);
|
|
53
50
|
|
|
54
|
-
const expandedIds = useMemo(() => Array.from(expanded), [expanded])
|
|
51
|
+
const expandedIds = useMemo(() => Array.from(expanded), [expanded]);
|
|
55
52
|
|
|
56
53
|
return (
|
|
57
54
|
<TreeFolder
|
|
58
55
|
data={folderData}
|
|
59
56
|
selectedId={selectedId}
|
|
60
57
|
onSelectionChange={(id) => {
|
|
61
|
-
if (id) onSelect(id)
|
|
58
|
+
if (id) onSelect(id);
|
|
62
59
|
}}
|
|
63
60
|
expandedIds={expandedIds}
|
|
64
61
|
onExpandedChange={(next) => {
|
|
65
|
-
const before = new Set(expandedIds)
|
|
66
|
-
const after = new Set(next)
|
|
67
|
-
for (const id of after) if (!before.has(id)) onToggle(id)
|
|
68
|
-
for (const id of before) if (!after.has(id)) onToggle(id)
|
|
62
|
+
const before = new Set(expandedIds);
|
|
63
|
+
const after = new Set(next);
|
|
64
|
+
for (const id of after) if (!before.has(id)) onToggle(id);
|
|
65
|
+
for (const id of before) if (!after.has(id)) onToggle(id);
|
|
69
66
|
}}
|
|
70
67
|
dndEnabled={dndEnabled}
|
|
71
68
|
onMove={onMove}
|
|
@@ -73,5 +70,5 @@ export function TreeSidebar({
|
|
|
73
70
|
showBreadcrumb={true}
|
|
74
71
|
highlightAncestors={true}
|
|
75
72
|
/>
|
|
76
|
-
)
|
|
73
|
+
);
|
|
77
74
|
}
|