torch-glare 2.5.6 → 2.6.0
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 +4 -3
- package/dist/bin/index.js +9 -24
- package/dist/bin/index.js.map +1 -1
- package/dist/src/commands/add.d.ts +2 -2
- package/dist/src/commands/add.d.ts.map +1 -1
- package/dist/src/commands/add.js +4 -70
- package/dist/src/commands/add.js.map +1 -1
- package/dist/src/commands/hook.d.ts +5 -4
- package/dist/src/commands/hook.d.ts.map +1 -1
- package/dist/src/commands/hook.js +7 -75
- package/dist/src/commands/hook.js.map +1 -1
- package/dist/src/commands/init.js +1 -1
- package/dist/src/commands/init.js.map +1 -1
- package/dist/src/commands/layout.d.ts +5 -4
- package/dist/src/commands/layout.d.ts.map +1 -1
- package/dist/src/commands/layout.js +7 -75
- package/dist/src/commands/layout.js.map +1 -1
- package/dist/src/commands/provider.d.ts +5 -4
- package/dist/src/commands/provider.d.ts.map +1 -1
- package/dist/src/commands/provider.js +7 -75
- package/dist/src/commands/provider.js.map +1 -1
- package/dist/src/commands/update.d.ts.map +1 -1
- package/dist/src/commands/update.js +78 -43
- package/dist/src/commands/update.js.map +1 -1
- package/dist/src/commands/utils.d.ts +5 -4
- package/dist/src/commands/utils.d.ts.map +1 -1
- package/dist/src/commands/utils.js +7 -80
- package/dist/src/commands/utils.js.map +1 -1
- package/dist/src/shared/addFromRegistry.d.ts +16 -0
- package/dist/src/shared/addFromRegistry.d.ts.map +1 -0
- package/dist/src/shared/addFromRegistry.js +88 -0
- package/dist/src/shared/addFromRegistry.js.map +1 -0
- package/dist/src/shared/getInstallCommand.d.ts.map +1 -1
- package/dist/src/shared/getInstallCommand.js +5 -0
- package/dist/src/shared/getInstallCommand.js.map +1 -1
- package/dist/src/shared/installDependencies.d.ts +0 -10
- package/dist/src/shared/installDependencies.d.ts.map +1 -1
- package/dist/src/shared/installDependencies.js +0 -17
- package/dist/src/shared/installDependencies.js.map +1 -1
- package/dist/src/shared/installFromPlan.d.ts +7 -5
- package/dist/src/shared/installFromPlan.d.ts.map +1 -1
- package/dist/src/shared/installFromPlan.js +103 -36
- package/dist/src/shared/installFromPlan.js.map +1 -1
- package/dist/src/shared/loadRegistry.d.ts +12 -3
- package/dist/src/shared/loadRegistry.d.ts.map +1 -1
- package/dist/src/shared/loadRegistry.js +19 -20
- package/dist/src/shared/loadRegistry.js.map +1 -1
- package/dist/src/shared/registryClient.d.ts +19 -0
- package/dist/src/shared/registryClient.d.ts.map +1 -0
- package/dist/src/shared/registryClient.js +128 -0
- package/dist/src/shared/registryClient.js.map +1 -0
- package/dist/src/shared/resolveEntry.d.ts +10 -7
- package/dist/src/shared/resolveEntry.d.ts.map +1 -1
- package/dist/src/shared/resolveEntry.js +18 -13
- package/dist/src/shared/resolveEntry.js.map +1 -1
- package/dist/src/shared/suggestOtherCommand.d.ts +7 -1
- package/dist/src/shared/suggestOtherCommand.d.ts.map +1 -1
- package/dist/src/shared/suggestOtherCommand.js +29 -23
- package/dist/src/shared/suggestOtherCommand.js.map +1 -1
- package/dist/src/types/main.d.ts +31 -2
- package/dist/src/types/main.d.ts.map +1 -1
- package/package.json +6 -11
- package/apps/lib/components/ActionButton.tsx +0 -93
- package/apps/lib/components/ActionsGroup.tsx +0 -27
- package/apps/lib/components/AlertDialog.tsx +0 -204
- package/apps/lib/components/Avatar.tsx +0 -46
- package/apps/lib/components/Badge.tsx +0 -250
- package/apps/lib/components/BadgeField.tsx +0 -403
- package/apps/lib/components/Breadcrumb.tsx +0 -280
- package/apps/lib/components/Button.tsx +0 -325
- package/apps/lib/components/ButtonGroup.tsx +0 -190
- package/apps/lib/components/Calendar.tsx +0 -115
- package/apps/lib/components/Card.tsx +0 -95
- package/apps/lib/components/Checkbox.tsx +0 -42
- package/apps/lib/components/ColorPicker.tsx +0 -441
- package/apps/lib/components/ConclusionHeader.tsx +0 -148
- package/apps/lib/components/ContextMenu.tsx +0 -571
- package/apps/lib/components/CountBadge.tsx +0 -52
- package/apps/lib/components/DataTable.tsx +0 -213
- package/apps/lib/components/DataViews/badge.ts +0 -49
- package/apps/lib/components/DataViews/cell.tsx +0 -324
- package/apps/lib/components/DataViews/context.ts +0 -144
- package/apps/lib/components/DataViews/data-views.tsx +0 -395
- package/apps/lib/components/DataViews/filters/children.tsx +0 -98
- package/apps/lib/components/DataViews/filters/custom.tsx +0 -34
- package/apps/lib/components/DataViews/filters/filters.tsx +0 -157
- package/apps/lib/components/DataViews/filters/index.ts +0 -4
- package/apps/lib/components/DataViews/filters/labelled.tsx +0 -20
- package/apps/lib/components/DataViews/filters/presets.tsx +0 -65
- package/apps/lib/components/DataViews/filters/sync.tsx +0 -35
- package/apps/lib/components/DataViews/filters/values.ts +0 -173
- package/apps/lib/components/DataViews/header.tsx +0 -220
- package/apps/lib/components/DataViews/hooks/index.ts +0 -5
- package/apps/lib/components/DataViews/hooks/useActiveRow.ts +0 -22
- package/apps/lib/components/DataViews/hooks/useControllable.ts +0 -52
- package/apps/lib/components/DataViews/index.ts +0 -88
- package/apps/lib/components/DataViews/panel/columns.tsx +0 -153
- package/apps/lib/components/DataViews/panel/controls.tsx +0 -106
- package/apps/lib/components/DataViews/panel/index.ts +0 -3
- package/apps/lib/components/DataViews/panel/panel.tsx +0 -164
- package/apps/lib/components/DataViews/panel/saved-views.tsx +0 -67
- package/apps/lib/components/DataViews/panel/section.tsx +0 -81
- package/apps/lib/components/DataViews/panel/sort.tsx +0 -42
- package/apps/lib/components/DataViews/panel/tab.tsx +0 -31
- package/apps/lib/components/DataViews/slots.ts +0 -72
- package/apps/lib/components/DataViews/states.tsx +0 -73
- package/apps/lib/components/DataViews/types.ts +0 -510
- package/apps/lib/components/DataViews/views/board-view.tsx +0 -381
- package/apps/lib/components/DataViews/views/card-rows.tsx +0 -36
- package/apps/lib/components/DataViews/views/inbox-view.tsx +0 -260
- package/apps/lib/components/DataViews/views/pane-views.tsx +0 -196
- package/apps/lib/components/DataViews/views/table-view.tsx +0 -493
- package/apps/lib/components/DataViews/views/tree-view.tsx +0 -367
- package/apps/lib/components/DatePicker.tsx +0 -232
- package/apps/lib/components/Dialog.tsx +0 -116
- package/apps/lib/components/Divider.tsx +0 -28
- package/apps/lib/components/Drawer.tsx +0 -451
- package/apps/lib/components/DropdownMenu.tsx +0 -554
- package/apps/lib/components/FieldHint.tsx +0 -69
- package/apps/lib/components/Form.tsx +0 -182
- package/apps/lib/components/FormBuilder/context.ts +0 -85
- package/apps/lib/components/FormBuilder/field-kind.ts +0 -28
- package/apps/lib/components/FormBuilder/fields/ChoiceFields.tsx +0 -60
- package/apps/lib/components/FormBuilder/fields/ColorField.tsx +0 -59
- package/apps/lib/components/FormBuilder/fields/CustomField.tsx +0 -11
- package/apps/lib/components/FormBuilder/fields/DateField.tsx +0 -32
- package/apps/lib/components/FormBuilder/fields/FieldArray.tsx +0 -74
- package/apps/lib/components/FormBuilder/fields/FieldShell.tsx +0 -168
- package/apps/lib/components/FormBuilder/fields/FileField.tsx +0 -39
- package/apps/lib/components/FormBuilder/fields/OptionListFields.tsx +0 -132
- package/apps/lib/components/FormBuilder/fields/OtpField.tsx +0 -31
- package/apps/lib/components/FormBuilder/fields/PhoneField.tsx +0 -109
- package/apps/lib/components/FormBuilder/fields/RichTextEditorField.tsx +0 -31
- package/apps/lib/components/FormBuilder/fields/SelectField.tsx +0 -114
- package/apps/lib/components/FormBuilder/fields/SignatureField.tsx +0 -157
- package/apps/lib/components/FormBuilder/fields/SliderField.tsx +0 -67
- package/apps/lib/components/FormBuilder/fields/SwitchBoxField.tsx +0 -41
- package/apps/lib/components/FormBuilder/fields/TableField.tsx +0 -336
- package/apps/lib/components/FormBuilder/fields/TextField.tsx +0 -213
- package/apps/lib/components/FormBuilder/fields/TreeSelectField.tsx +0 -43
- package/apps/lib/components/FormBuilder/fields/countries.ts +0 -303
- package/apps/lib/components/FormBuilder/fields/index.ts +0 -25
- package/apps/lib/components/FormBuilder/form-builder.tsx +0 -198
- package/apps/lib/components/FormBuilder/index.ts +0 -31
- package/apps/lib/components/FormBuilder/numberFormat.ts +0 -16
- package/apps/lib/components/FormBuilder/submit.tsx +0 -67
- package/apps/lib/components/FormBuilder/types.ts +0 -316
- package/apps/lib/components/FormRenderer/FormDrawer.tsx +0 -250
- package/apps/lib/components/FormRenderer/detail.tsx +0 -256
- package/apps/lib/components/FormRenderer/form-renderer.tsx +0 -358
- package/apps/lib/components/FormRenderer/header.tsx +0 -88
- package/apps/lib/components/FormRenderer/index.ts +0 -17
- package/apps/lib/components/FormRenderer/notch-action.tsx +0 -64
- package/apps/lib/components/FormRenderer/section.tsx +0 -39
- package/apps/lib/components/FormRenderer/stepper.tsx +0 -393
- package/apps/lib/components/FormRenderer/types.ts +0 -115
- package/apps/lib/components/FormSummary.tsx +0 -282
- package/apps/lib/components/HeaderBar.tsx +0 -117
- package/apps/lib/components/ImageAttachment.tsx +0 -209
- package/apps/lib/components/InnerLabelField.tsx +0 -154
- package/apps/lib/components/Input.tsx +0 -224
- package/apps/lib/components/InputField.tsx +0 -147
- package/apps/lib/components/InputOTP.tsx +0 -84
- package/apps/lib/components/Label.tsx +0 -129
- package/apps/lib/components/LabelField.tsx +0 -76
- package/apps/lib/components/LabeledCheckBox.tsx +0 -51
- package/apps/lib/components/LabeledRadio.tsx +0 -51
- package/apps/lib/components/LinkButton.tsx +0 -94
- package/apps/lib/components/LoginButton.tsx +0 -51
- package/apps/lib/components/PasswordLevel.tsx +0 -58
- package/apps/lib/components/Popover.tsx +0 -312
- package/apps/lib/components/ProfileMenu.tsx +0 -85
- package/apps/lib/components/Radio.tsx +0 -59
- package/apps/lib/components/RadioCard.tsx +0 -50
- package/apps/lib/components/ScrollArea.tsx +0 -54
- package/apps/lib/components/SearchField.tsx +0 -62
- package/apps/lib/components/SearchableSelect.tsx +0 -318
- package/apps/lib/components/SearchableTable.tsx +0 -344
- package/apps/lib/components/SearchableTree.tsx +0 -485
- package/apps/lib/components/SearchableTreeDialog.tsx +0 -502
- package/apps/lib/components/SectionBlock.tsx +0 -168
- package/apps/lib/components/Select.tsx +0 -347
- package/apps/lib/components/SimpleSelect.tsx +0 -225
- package/apps/lib/components/Skeleton.tsx +0 -12
- package/apps/lib/components/SlideDatePicker.tsx +0 -255
- package/apps/lib/components/SpinLoading.tsx +0 -174
- package/apps/lib/components/Stepper.tsx +0 -480
- package/apps/lib/components/Switch.tsx +0 -82
- package/apps/lib/components/TabFormItem.tsx +0 -153
- package/apps/lib/components/TabSwitch.tsx +0 -172
- package/apps/lib/components/Table.tsx +0 -597
- package/apps/lib/components/TextEditor/ChartBlockTool.ts +0 -676
- package/apps/lib/components/TextEditor/RichTextField.tsx +0 -46
- package/apps/lib/components/TextEditor/TableDnDWrapper.ts +0 -462
- package/apps/lib/components/TextEditor/TextEditor.tsx +0 -1164
- package/apps/lib/components/TextEditor/TextEditorToolbar.tsx +0 -429
- package/apps/lib/components/TextEditor/editor-tools/AlignmentTune.ts +0 -70
- package/apps/lib/components/TextEditor/editor-tools/ColorInlineTool.ts +0 -50
- package/apps/lib/components/TextEditor/editor-tools/StrikethroughInlineTool.ts +0 -48
- package/apps/lib/components/TextEditor/editor-tools/inlineFormat.ts +0 -98
- package/apps/lib/components/TextEditor/editorjs.d.ts +0 -60
- package/apps/lib/components/TextEditor/index.ts +0 -7
- package/apps/lib/components/TextEditor/markdownParser.ts +0 -346
- package/apps/lib/components/Textarea.tsx +0 -117
- package/apps/lib/components/Timeline.tsx +0 -263
- package/apps/lib/components/Toast.tsx +0 -87
- package/apps/lib/components/Toggle.tsx +0 -125
- package/apps/lib/components/ToggleButton.tsx +0 -140
- package/apps/lib/components/Tooltip.tsx +0 -116
- package/apps/lib/components/TransparentLabel.tsx +0 -71
- package/apps/lib/components/TreeDropDown.tsx +0 -115
- package/apps/lib/components/TreeFolder/TreeFolder.tsx +0 -380
- package/apps/lib/components/TreeFolder/TreeFolderBreadcrumb.tsx +0 -75
- package/apps/lib/components/TreeFolder/TreeFolderRow.tsx +0 -354
- package/apps/lib/components/TreeFolder/TreeFolderStyles.tsx +0 -60
- package/apps/lib/components/TreeFolder/icons.tsx +0 -60
- package/apps/lib/components/TreeFolder/index.ts +0 -24
- package/apps/lib/components/TreeFolder/treeFolderUtils.ts +0 -109
- package/apps/lib/components/TreeFolder/types.ts +0 -77
- package/apps/lib/components/TreeFolder/useTreeFolderDnD.ts +0 -118
- package/apps/lib/hooks/useActiveTreeItem.ts +0 -61
- package/apps/lib/hooks/useClickOutside.ts +0 -27
- package/apps/lib/hooks/useDragDrop.tsx +0 -365
- package/apps/lib/hooks/useHtmlDir.ts +0 -31
- package/apps/lib/hooks/useInfiniteScroll.ts +0 -108
- package/apps/lib/hooks/useIsMobile.ts +0 -21
- package/apps/lib/hooks/useResize.ts +0 -67
- package/apps/lib/hooks/useTagSelection.ts +0 -300
- package/apps/lib/layouts/CNLayout.tsx +0 -372
- package/apps/lib/layouts/DataViewCard.tsx +0 -62
- package/apps/lib/layouts/FieldSection.tsx +0 -91
- package/apps/lib/layouts/TreeSubLayout.tsx +0 -173
- package/apps/lib/providers/ThemeProvider.tsx +0 -84
- package/apps/lib/registry.json +0 -1217
- package/apps/lib/tsconfig.json +0 -9
- package/apps/lib/tsconfig.tsbuildinfo +0 -1
- package/apps/lib/utils/cn.ts +0 -6
- package/apps/lib/utils/color.ts +0 -175
- package/apps/lib/utils/dataViews/path.ts +0 -67
- package/apps/lib/utils/dataViews/query.ts +0 -73
- package/apps/lib/utils/dataViews/types.ts +0 -187
- package/apps/lib/utils/dateFormat.ts +0 -108
- package/apps/lib/utils/resize.ts +0 -31
- package/apps/lib/utils/scroller.ts +0 -26
- package/apps/lib/utils/types.ts +0 -16
- package/docs/BLOCKS.md +0 -129
- package/docs/CHANGELOG-1.1.16.md +0 -108
- package/docs/Cover.png +0 -0
- package/docs/README.md +0 -215
- package/docs/components/action-button.md +0 -638
- package/docs/components/actions-group.md +0 -708
- package/docs/components/alert-dialog.md +0 -920
- package/docs/components/avatar.md +0 -709
- package/docs/components/badge-field.md +0 -738
- package/docs/components/badge.md +0 -301
- package/docs/components/breadcrumb.md +0 -930
- package/docs/components/button-group.md +0 -650
- package/docs/components/button.md +0 -639
- package/docs/components/calendar.md +0 -555
- package/docs/components/card.md +0 -622
- package/docs/components/chart-block-tool.md +0 -129
- package/docs/components/checkbox.md +0 -699
- package/docs/components/cn-layout.md +0 -854
- package/docs/components/color-picker.md +0 -101
- package/docs/components/conclusion-header.md +0 -80
- package/docs/components/context-menu.md +0 -483
- package/docs/components/count-badge.md +0 -560
- package/docs/components/data-table.md +0 -854
- package/docs/components/data-views/backend-response.md +0 -324
- package/docs/components/data-views/examples/a11y-rtl.md +0 -250
- package/docs/components/data-views/examples/api-orders-route.md +0 -130
- package/docs/components/data-views/examples/fields.md +0 -362
- package/docs/components/data-views/examples/filters.md +0 -307
- package/docs/components/data-views/examples/inbox-routing.md +0 -218
- package/docs/components/data-views/examples/index.md +0 -29
- package/docs/components/data-views/examples/overview.md +0 -244
- package/docs/components/data-views/examples/panel.md +0 -212
- package/docs/components/data-views/examples/scale.md +0 -231
- package/docs/components/data-views/examples/server-side.md +0 -210
- package/docs/components/data-views/examples/state.md +0 -250
- package/docs/components/data-views/examples/tree-custom.md +0 -388
- package/docs/components/data-views/examples/view-registry.md +0 -313
- package/docs/components/data-views/examples/views.md +0 -534
- package/docs/components/data-views/guide.md +0 -405
- package/docs/components/data-views/index.md +0 -1521
- package/docs/components/data-views/migration.md +0 -81
- package/docs/components/date-picker.md +0 -857
- package/docs/components/dialog.md +0 -929
- package/docs/components/divider.md +0 -766
- package/docs/components/drawer.md +0 -654
- package/docs/components/dropdown-menu.md +0 -668
- package/docs/components/field-hint.md +0 -898
- package/docs/components/field-section.md +0 -781
- package/docs/components/form-builder.md +0 -284
- package/docs/components/form-renderer.md +0 -396
- package/docs/components/form-summary.md +0 -138
- package/docs/components/form.md +0 -785
- package/docs/components/header-bar.md +0 -188
- package/docs/components/image-attachment.md +0 -906
- package/docs/components/inner-label-field.md +0 -819
- package/docs/components/input-field.md +0 -623
- package/docs/components/input-otp.md +0 -756
- package/docs/components/input.md +0 -634
- package/docs/components/label-field.md +0 -770
- package/docs/components/label.md +0 -761
- package/docs/components/labeled-check-box.md +0 -642
- package/docs/components/labeled-radio.md +0 -796
- package/docs/components/link-button.md +0 -685
- package/docs/components/login-button.md +0 -872
- package/docs/components/password-level.md +0 -803
- package/docs/components/popover.md +0 -649
- package/docs/components/profile-menu.md +0 -656
- package/docs/components/radio-card.md +0 -801
- package/docs/components/radio.md +0 -735
- package/docs/components/scroll-area.md +0 -691
- package/docs/components/search-field.md +0 -702
- package/docs/components/searchable-select.md +0 -368
- package/docs/components/searchable-table.md +0 -438
- package/docs/components/searchable-tree-dialog.md +0 -190
- package/docs/components/searchable-tree.md +0 -200
- package/docs/components/section-block.md +0 -483
- package/docs/components/select.md +0 -709
- package/docs/components/simple-select.md +0 -741
- package/docs/components/skeleton.md +0 -706
- package/docs/components/slide-date-picker.md +0 -837
- package/docs/components/spin-loading.md +0 -696
- package/docs/components/stepper.md +0 -316
- package/docs/components/switch.md +0 -770
- package/docs/components/tab-form-item.md +0 -773
- package/docs/components/tab-switch.md +0 -170
- package/docs/components/table-dnd-wrapper.md +0 -107
- package/docs/components/table.md +0 -1088
- package/docs/components/text-editor.md +0 -735
- package/docs/components/textarea.md +0 -681
- package/docs/components/timeline.md +0 -254
- package/docs/components/toast.md +0 -773
- package/docs/components/toggle-button.md +0 -643
- package/docs/components/toggle.md +0 -882
- package/docs/components/tooltip.md +0 -513
- package/docs/components/transparent-label.md +0 -721
- package/docs/components/tree-drop-down.md +0 -740
- package/docs/components/tree-folder.md +0 -110
- package/docs/components/tree-sub-layout.md +0 -707
- package/docs/explanation/architecture.md +0 -54
- package/docs/explanation/design-system.md +0 -52
- package/docs/how-to/form-and-list-recipes.md +0 -386
- package/docs/how-to/forms-with-form-builder.md +0 -472
- package/docs/how-to/guides.md +0 -1027
- package/docs/migration/changelog.md +0 -60
- package/docs/migration/form-builder-2.5.2.md +0 -113
- package/docs/reference/cli.md +0 -112
- package/docs/reference/components.md +0 -572
- package/docs/reference/hooks.md +0 -1523
- package/docs/reference/providers.md +0 -866
- package/docs/reference/tailwind-plugins.md +0 -942
- package/docs/reference/theme.md +0 -85
- package/docs/reference/types.md +0 -1016
- package/docs/reference/utilities.md +0 -726
- package/docs/tutorials/building-first-form.md +0 -846
- package/docs/tutorials/component-composition.md +0 -882
- package/docs/tutorials/getting-started.md +0 -302
- package/docs/tutorials/theming-basics.md +0 -785
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
|
|
3
|
-
import { useId, useState } from "react";
|
|
4
|
-
import { cn } from "../../../utils/cn";
|
|
5
|
-
import { ConclusionHeader } from "../../ConclusionHeader";
|
|
6
|
-
import type { PanelSectionProps } from "../types";
|
|
7
|
-
|
|
8
|
-
/**
|
|
9
|
-
* A titled block in the rail — and, when it has a title, a **collapsible** one.
|
|
10
|
-
*
|
|
11
|
-
* The header is `ConclusionHeader`, the same clickable section header `FormSummary` uses for its
|
|
12
|
-
* groups and the one Figma draws in this rail (`Conclusion-Header-1.0`). `Columns`, `Sort` and
|
|
13
|
-
* `SavedViews` all render through here, so they all fold from one implementation.
|
|
14
|
-
*
|
|
15
|
-
* It colours itself from `content-presentation-global-*` tokens rather than a `text-white`
|
|
16
|
-
* literal, which is what lets the same section sit in this dark rail and in the light content
|
|
17
|
-
* area without a second variant.
|
|
18
|
-
*/
|
|
19
|
-
export function Section({
|
|
20
|
-
title,
|
|
21
|
-
description,
|
|
22
|
-
collapsible = true,
|
|
23
|
-
defaultOpen = true,
|
|
24
|
-
children,
|
|
25
|
-
className,
|
|
26
|
-
}: PanelSectionProps) {
|
|
27
|
-
const [open, setOpen] = useState(defaultOpen);
|
|
28
|
-
const bodyId = useId();
|
|
29
|
-
const isCollapsible = collapsible && title != null;
|
|
30
|
-
const shown = !isCollapsible || open;
|
|
31
|
-
|
|
32
|
-
return (
|
|
33
|
-
<section className={cn("flex flex-col", className)}>
|
|
34
|
-
{title != null &&
|
|
35
|
-
(isCollapsible ? (
|
|
36
|
-
<ConclusionHeader
|
|
37
|
-
label={title}
|
|
38
|
-
open={open}
|
|
39
|
-
onOpenChange={setOpen}
|
|
40
|
-
aria-controls={bodyId}
|
|
41
|
-
/>
|
|
42
|
-
) : (
|
|
43
|
-
// No `min-w-0` needed here, unlike the other headings: the parent is `flex flex-col`,
|
|
44
|
-
// so this already stretches to the column's width rather than sizing to its text.
|
|
45
|
-
<h3 className="text-content-presentation-global-primary truncate text-[18px] font-[510] leading-[1.32] tracking-[-0.01em]">
|
|
46
|
-
{title}
|
|
47
|
-
</h3>
|
|
48
|
-
))}
|
|
49
|
-
|
|
50
|
-
{/* Figma groups the description with the header (a 47px block: 28px header + 18px line),
|
|
51
|
-
not with the rows — so it sits outside the fold and still reads when the group is shut. */}
|
|
52
|
-
{description != null && (
|
|
53
|
-
<p className="typography-body-small-regular text-content-presentation-global-primary">
|
|
54
|
-
{description}
|
|
55
|
-
</p>
|
|
56
|
-
)}
|
|
57
|
-
|
|
58
|
-
{/* Fold/unfold: `grid-rows-[0fr → 1fr]` animates to the body's natural height without
|
|
59
|
-
measuring it, so this stays a pure-CSS transition. The inner `overflow-hidden` is what
|
|
60
|
-
the 0fr track actually clips — it has to stay a bare wrapper. There is no flex `gap`
|
|
61
|
-
here either: a gap survives a collapsed body as dead space, so the spacing below the
|
|
62
|
-
title lives on the body instead, inside what collapses. */}
|
|
63
|
-
<div
|
|
64
|
-
id={bodyId}
|
|
65
|
-
// A collapsed body keeps its controls in the DOM, so `inert` is what takes them out of
|
|
66
|
-
// the tab order and the a11y tree — `overflow-hidden` alone would still let focus in.
|
|
67
|
-
inert={!shown}
|
|
68
|
-
aria-hidden={!shown}
|
|
69
|
-
className={cn(
|
|
70
|
-
"grid transition-[grid-template-rows,opacity] duration-200 ease-in-out",
|
|
71
|
-
"motion-reduce:transition-none",
|
|
72
|
-
shown ? "grid-rows-[1fr] opacity-100" : "grid-rows-[0fr] opacity-0",
|
|
73
|
-
)}
|
|
74
|
-
>
|
|
75
|
-
<div className="overflow-hidden">
|
|
76
|
-
<div className={cn("space-y-3", title != null && "pt-3")}>{children}</div>
|
|
77
|
-
</div>
|
|
78
|
-
</div>
|
|
79
|
-
</section>
|
|
80
|
-
);
|
|
81
|
-
}
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
|
|
3
|
-
import { formatPathLabel } from "../../../utils/dataViews/path";
|
|
4
|
-
import { useDataViewsData, useDataViewsView } from "../context";
|
|
5
|
-
import { RadioGroup } from "./controls";
|
|
6
|
-
import { Section } from "./section";
|
|
7
|
-
import type { PanelSortProps } from "../types";
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* `DataViews.Panel.Sort` — the same intent the table headers emit, reachable from views that have
|
|
11
|
-
* no headers. Picking an option writes the sort into the root's query, which leaves through
|
|
12
|
-
* `onQueryChange`; nothing is reordered here, and this part takes no callback of its own.
|
|
13
|
-
*/
|
|
14
|
-
export function Sort({ title = "Default Sort", className }: PanelSortProps) {
|
|
15
|
-
const { fields } = useDataViewsData();
|
|
16
|
-
const { sort, setSort } = useDataViewsView();
|
|
17
|
-
const sortable = fields.filter((f) => f.type !== "hidden");
|
|
18
|
-
|
|
19
|
-
return (
|
|
20
|
-
<Section title={title} className={className}>
|
|
21
|
-
{sortable.length === 0 ? (
|
|
22
|
-
<p className="text-content-presentation-global-tertiary text-xs">No sortable columns.</p>
|
|
23
|
-
) : (
|
|
24
|
-
<RadioGroup
|
|
25
|
-
value={sort?.path ?? ""}
|
|
26
|
-
onValueChange={(path) =>
|
|
27
|
-
// Re-picking the active field flips the direction, as clicking a header twice does.
|
|
28
|
-
setSort(
|
|
29
|
-
sort?.path === path && sort.direction === "asc"
|
|
30
|
-
? { path, direction: "desc" }
|
|
31
|
-
: { path, direction: "asc" },
|
|
32
|
-
)
|
|
33
|
-
}
|
|
34
|
-
items={sortable.map((field) => ({
|
|
35
|
-
value: field.path,
|
|
36
|
-
label: field.label ?? formatPathLabel(field.path),
|
|
37
|
-
}))}
|
|
38
|
-
/>
|
|
39
|
-
)}
|
|
40
|
-
</Section>
|
|
41
|
-
);
|
|
42
|
-
}
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
|
|
3
|
-
import React from "react";
|
|
4
|
-
import { useDataViewsPanelTabs } from "../context";
|
|
5
|
-
import type { PanelTabProps } from "../types";
|
|
6
|
-
|
|
7
|
-
const TAB_MARKER = "__dvPanelTab";
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* One tab in the panel. It renders its own children when it is the open tab and nothing when it
|
|
11
|
-
* is not, so a tab is declared and filled in one place:
|
|
12
|
-
*
|
|
13
|
-
* ```tsx
|
|
14
|
-
* <DataViews.Panel.Tab value="columns" label="Columns">
|
|
15
|
-
* <DataViews.Panel.Columns />
|
|
16
|
-
* </DataViews.Panel.Tab>
|
|
17
|
-
* ```
|
|
18
|
-
*/
|
|
19
|
-
export function Tab({ value, children }: PanelTabProps) {
|
|
20
|
-
const { tab } = useDataViewsPanelTabs();
|
|
21
|
-
if (tab !== value) return null;
|
|
22
|
-
return <>{children}</>;
|
|
23
|
-
}
|
|
24
|
-
(Tab as unknown as Record<string, boolean>)[TAB_MARKER] = true;
|
|
25
|
-
|
|
26
|
-
export function isTabElement(node: React.ReactNode): node is React.ReactElement<PanelTabProps> {
|
|
27
|
-
return (
|
|
28
|
-
React.isValidElement(node) &&
|
|
29
|
-
(node.type as unknown as Record<string, unknown>)?.[TAB_MARKER] === true
|
|
30
|
-
);
|
|
31
|
-
}
|
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
import React from "react";
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* How the root recognises its children.
|
|
5
|
-
*
|
|
6
|
-
* Children are the API: rendering `<DataViews.Table/>` is what makes a table view exist, and
|
|
7
|
-
* rendering `<DataViews.Panel/>` is what puts a sidebar beside it. To lay those out the root has
|
|
8
|
-
* to tell them apart, so each part is stamped with a marker here and found with the matching
|
|
9
|
-
* guard — never `child.type === Panel`, which breaks across duplicated module instances and
|
|
10
|
-
* silently stops matching after a hot reload.
|
|
11
|
-
*
|
|
12
|
-
* Markers and guards live in this one file rather than beside their components so that the root
|
|
13
|
-
* can import all of them without importing the components themselves — otherwise `header.tsx`
|
|
14
|
-
* would have to import from `data-views.tsx`, which already imports `header.tsx`.
|
|
15
|
-
*/
|
|
16
|
-
|
|
17
|
-
function mark<P extends object>(component: React.ComponentType<P>, key: string) {
|
|
18
|
-
(component as unknown as Record<string, boolean>)[key] = true;
|
|
19
|
-
return component;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
function isMarked(node: React.ReactNode, key: string) {
|
|
23
|
-
return React.isValidElement(node) && (node.type as unknown as Record<string, unknown>)?.[key] === true;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
// ─── Views ────────────────────────────────────────────────────────────────────
|
|
27
|
-
|
|
28
|
-
/** What a view is called in the switcher when the caller does not say. */
|
|
29
|
-
export interface ViewMeta {
|
|
30
|
-
defaultId: string;
|
|
31
|
-
defaultLabel: string;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
export function markView<P extends object>(component: React.ComponentType<P>, meta: ViewMeta) {
|
|
35
|
-
(component as unknown as { __dataView: ViewMeta }).__dataView = meta;
|
|
36
|
-
return component;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
export function viewMetaOf(node: React.ReactNode): ViewMeta | undefined {
|
|
40
|
-
if (!React.isValidElement(node)) return undefined;
|
|
41
|
-
return (node.type as { __dataView?: ViewMeta })?.__dataView;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
export type ViewElement = React.ReactElement<{
|
|
45
|
-
id?: string;
|
|
46
|
-
label?: string;
|
|
47
|
-
icon?: React.ReactNode;
|
|
48
|
-
}>;
|
|
49
|
-
|
|
50
|
-
export function isViewElement(node: React.ReactNode): node is ViewElement {
|
|
51
|
-
return viewMetaOf(node) !== undefined;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
// ─── Everything else the root positions ───────────────────────────────────────
|
|
55
|
-
|
|
56
|
-
export const markHeader = <P extends object>(c: React.ComponentType<P>) => mark(c, "__dvHeader");
|
|
57
|
-
export const isHeaderElement = (n: React.ReactNode) => isMarked(n, "__dvHeader");
|
|
58
|
-
|
|
59
|
-
export const markPanel = <P extends object>(c: React.ComponentType<P>) => mark(c, "__dvPanel");
|
|
60
|
-
export const isPanelElement = (n: React.ReactNode) => isMarked(n, "__dvPanel");
|
|
61
|
-
|
|
62
|
-
/**
|
|
63
|
-
* LOCAL PATCH (Contact Center): the empty slot — what renders *in place of* the view when a
|
|
64
|
-
* settled query returns no rows. Without a marker the caller's empty state is just an "extra"
|
|
65
|
-
* and stacks ABOVE the view, so an empty list shows the message on top of an empty table.
|
|
66
|
-
* See `states.tsx` for why this does not reintroduce the bug upstream avoided.
|
|
67
|
-
*/
|
|
68
|
-
export const markEmpty = <P extends object>(c: React.ComponentType<P>) => mark(c, "__dvEmpty");
|
|
69
|
-
export const isEmptyElement = (n: React.ReactNode) => isMarked(n, "__dvEmpty");
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
|
|
3
|
-
import type { ReactNode } from "react";
|
|
4
|
-
|
|
5
|
-
import { cn } from "../../utils/cn";
|
|
6
|
-
import { Skeleton } from "../Skeleton";
|
|
7
|
-
import { markEmpty } from "./slots";
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* The shared parts of a loading state, and the empty slot.
|
|
11
|
-
*
|
|
12
|
-
* Upstream ships no `Empty`, for reasons that are mostly still right: a centred sentence in place
|
|
13
|
-
* of the view throws the chrome away and makes the layout jump twice on every query, and — the
|
|
14
|
-
* real bug — it could not tell "no results" apart from "not fetched yet", so the first load of
|
|
15
|
-
* every page announced that nothing matched before anything had been asked for.
|
|
16
|
-
*
|
|
17
|
-
* `Empty` below (LOCAL PATCH, Contact Center) keeps that objection answered rather than ignoring
|
|
18
|
-
* it. It is a SLOT, not a design: the caller supplies the whole UI, and the root fills it only
|
|
19
|
-
* when the query has settled (`!loading`) and still returned nothing. "Not fetched yet" is still
|
|
20
|
-
* the view's own skeleton, so the two states stay distinguishable. What it fixes is the shape the
|
|
21
|
-
* app was forced into without it — an unrecognised child renders as an "extra" ABOVE the view, so
|
|
22
|
-
* an empty list showed the message stacked on top of an empty table, headers and all.
|
|
23
|
-
*
|
|
24
|
-
* Loading is still answered per view, because a skeleton is only useful if it is the shape of
|
|
25
|
-
* the thing that is coming. These are the pieces the four views share so they cannot drift; the
|
|
26
|
-
* shapes themselves live with the view that owns them.
|
|
27
|
-
*/
|
|
28
|
-
|
|
29
|
-
/**
|
|
30
|
-
* One shimmer bar.
|
|
31
|
-
*
|
|
32
|
-
* Vary the width at the call site — a column of identical bars reads as a grid rather than as
|
|
33
|
-
* text that has not arrived.
|
|
34
|
-
*/
|
|
35
|
-
export function SkeletonBar({ className }: { className?: string }) {
|
|
36
|
-
return <Skeleton className={cn("h-[14px] w-full rounded-[4px]", className)} />;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
/**
|
|
40
|
-
* `n` keys to map over.
|
|
41
|
-
*
|
|
42
|
-
* Counts are the view's own constant, not `pageSize`: they exist to fill the fold, and a skeleton
|
|
43
|
-
* that promises exactly as many rows as are coming is a promise it cannot keep — the server
|
|
44
|
-
* decides that, and it has not answered yet.
|
|
45
|
-
*/
|
|
46
|
-
export const skeletonKeys = (n: number) => Array.from({ length: n }, (_, i) => i);
|
|
47
|
-
|
|
48
|
-
/**
|
|
49
|
-
* `DataViews.Empty` — what renders **in place of** the view when a settled query returns no rows.
|
|
50
|
-
*
|
|
51
|
-
* LOCAL PATCH (Contact Center). A passthrough with a marker: it holds no opinion about what an
|
|
52
|
-
* empty state looks like, it only tells the root "put this where the view goes". The root fills
|
|
53
|
-
* it on `!loading && rows.length === 0`; write it anywhere among the children.
|
|
54
|
-
*
|
|
55
|
-
* Note the caller's content is what gets the body slot's height, so give it `flex-1` if it should
|
|
56
|
-
* centre rather than sit at the top of a tall surface — the app's shared `EmptyState` sizes
|
|
57
|
-
* itself intrinsically.
|
|
58
|
-
*
|
|
59
|
-
* ```tsx
|
|
60
|
-
* <DataViews rows={rows} fields={fields}>
|
|
61
|
-
* <DataViews.Header title="Fields">…</DataViews.Header>
|
|
62
|
-
* <DataViews.Empty>
|
|
63
|
-
* <EmptyState className="flex-1" title={search ? "No matches" : "No fields yet"} />
|
|
64
|
-
* </DataViews.Empty>
|
|
65
|
-
* <DataViews.Table />
|
|
66
|
-
* </DataViews>
|
|
67
|
-
* ```
|
|
68
|
-
*/
|
|
69
|
-
export function Empty({ children, className }: { children?: ReactNode; className?: string }) {
|
|
70
|
-
return <div className={cn("flex min-h-0 flex-1 flex-col", className)}>{children}</div>;
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
markEmpty(Empty);
|