cursedbelt 5.87.0 → 5.89.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/dist/looks.css +4 -4
- package/dist/react/Toast.js +2 -2
- package/dist/react/Toast.js.map +1 -1
- package/dist/react/VirtualCardGrid.d.ts +1 -1
- package/dist/react/VirtualCardGrid.js +1 -1
- package/dist/react/activity-bar/ActivityBar.d.ts +2 -2
- package/dist/react/activity-bar/ActivityBar.js +1 -1
- package/dist/react/activity-bar/activityBar.css +4 -4
- package/dist/react/analytics/AnalyticsPanel.d.ts +1 -1
- package/dist/react/analytics/AnalyticsPanel.js +1 -1
- package/dist/react/canvas-hud/CanvasMinimap.d.ts +1 -1
- package/dist/react/canvas-hud/HudControls.d.ts +2 -2
- package/dist/react/canvas-hud/alignment.d.ts +2 -2
- package/dist/react/canvas-hud/alignment.js +3 -3
- package/dist/react/canvas-hud/alignment.js.map +1 -1
- package/dist/react/canvas-hud/viewport.d.ts +1 -1
- package/dist/react/canvas-hud/viewport.js +1 -1
- package/dist/react/charts/BarChart.d.ts +2 -2
- package/dist/react/charts/HeatmapChart.d.ts +1 -1
- package/dist/react/charts/HeatmapChart.js +1 -1
- package/dist/react/charts/IntervalTimeline.d.ts +2 -2
- package/dist/react/charts/IntervalTimeline.d.ts.map +1 -1
- package/dist/react/charts/categorical.d.ts +11 -11
- package/dist/react/charts/categorical.js +9 -9
- package/dist/react/charts/categorical.js.map +1 -1
- package/dist/react/charts/ink.d.ts +5 -5
- package/dist/react/charts/ink.js +5 -5
- package/dist/react/charts/tokens.d.ts +1 -1
- package/dist/react/charts/tokens.js +1 -1
- package/dist/react/chat/Bubble.js +1 -1
- package/dist/react/chat/Bubble.js.map +1 -1
- package/dist/react/chat/DateMarker.js +1 -1
- package/dist/react/chat/MessageComposer.d.ts +1 -1
- package/dist/react/chat/types.d.ts +1 -1
- package/dist/react/chat/usePresence.d.ts +2 -2
- package/dist/react/chat/usePresence.js +1 -1
- package/dist/react/code-editor/markdownRules.js +1 -1
- package/dist/react/code-editor/markdownRules.js.map +1 -1
- package/dist/react/components/Badge.js +1 -1
- package/dist/react/components/Badge.js.map +1 -1
- package/dist/react/components/Button.js +5 -5
- package/dist/react/components/Button.js.map +1 -1
- package/dist/react/components/ChartTablePanel.js +1 -1
- package/dist/react/components/ChartTablePanel.js.map +1 -1
- package/dist/react/components/Checkbox.js +2 -2
- package/dist/react/components/Checkbox.js.map +1 -1
- package/dist/react/components/ChoiceGroup.d.ts +1 -1
- package/dist/react/components/ChoiceGroup.js +1 -1
- package/dist/react/components/CodeChip.d.ts +1 -1
- package/dist/react/components/CodeChip.js +1 -1
- package/dist/react/components/ColorSwatches.d.ts +10 -10
- package/dist/react/components/ColorSwatches.d.ts.map +1 -1
- package/dist/react/components/ColorSwatches.js +10 -10
- package/dist/react/components/ColorSwatches.js.map +1 -1
- package/dist/react/components/DataTable/DataTable.d.ts +2 -2
- package/dist/react/components/DataTable/DataTable.js +8 -8
- package/dist/react/components/DataTable/DataTable.js.map +1 -1
- package/dist/react/components/DataTable/SearchBox.js +2 -2
- package/dist/react/components/DataTable/SortHeader.js +1 -1
- package/dist/react/components/DataTable/SortHeader.js.map +1 -1
- package/dist/react/components/DataTable/TableFilterBuilder.d.ts +1 -1
- package/dist/react/components/DataTable/TableFilterBuilder.js +1 -1
- package/dist/react/components/DropdownMenu.js +1 -1
- package/dist/react/components/Field.d.ts +1 -1
- package/dist/react/components/FormPreviewLayout.d.ts +1 -1
- package/dist/react/components/FormPreviewLayout.js +1 -1
- package/dist/react/components/Heat.d.ts +6 -6
- package/dist/react/components/Heat.js +1 -1
- package/dist/react/components/IconPicker.d.ts +8 -8
- package/dist/react/components/IconPicker.d.ts.map +1 -1
- package/dist/react/components/IconPicker.js +6 -6
- package/dist/react/components/IconPicker.js.map +1 -1
- package/dist/react/components/InfoHint.d.ts +1 -1
- package/dist/react/components/InfoHint.js +1 -1
- package/dist/react/components/InheritBadge.js +2 -2
- package/dist/react/components/ListToolbar.d.ts +1 -1
- package/dist/react/components/ListToolbar.js +1 -1
- package/dist/react/components/Menu.d.ts +1 -1
- package/dist/react/components/Menu.d.ts.map +1 -1
- package/dist/react/components/Modal.js +5 -5
- package/dist/react/components/Modal.js.map +1 -1
- package/dist/react/components/Page.d.ts +1 -1
- package/dist/react/components/Page.js +1 -1
- package/dist/react/components/PaneSplit.d.ts +1 -1
- package/dist/react/components/PathText.d.ts +1 -1
- package/dist/react/components/PathText.js +1 -1
- package/dist/react/components/Popover.d.ts +1 -1
- package/dist/react/components/PropertyList.d.ts +1 -1
- package/dist/react/components/PropertyList.js +1 -1
- package/dist/react/components/PropertyPicker.d.ts +2 -2
- package/dist/react/components/PropertyPicker.js +2 -2
- package/dist/react/components/RatingField.js +1 -1
- package/dist/react/components/RatingField.js.map +1 -1
- package/dist/react/components/SaveIndicator.d.ts +2 -2
- package/dist/react/components/SaveIndicator.js +2 -2
- package/dist/react/components/SearchInput.d.ts +1 -1
- package/dist/react/components/SearchInput.d.ts.map +1 -1
- package/dist/react/components/SecretInput.d.ts +1 -1
- package/dist/react/components/Section.d.ts +1 -1
- package/dist/react/components/SectionNav.d.ts +3 -3
- package/dist/react/components/SectionNav.d.ts.map +1 -1
- package/dist/react/components/SectionNav.js +2 -2
- package/dist/react/components/Slider.js +1 -1
- package/dist/react/components/StarRating.js +1 -1
- package/dist/react/components/SwatchPicker.d.ts +6 -6
- package/dist/react/components/SwatchPicker.d.ts.map +1 -1
- package/dist/react/components/SwatchPicker.js +3 -3
- package/dist/react/components/SwatchPicker.js.map +1 -1
- package/dist/react/components/Tooltip.js +1 -1
- package/dist/react/components/TreeView.js +1 -1
- package/dist/react/components/TreeView.js.map +1 -1
- package/dist/react/components/TruncatedText.d.ts +1 -1
- package/dist/react/components/TruncatedText.js +1 -1
- package/dist/react/components/UnstyledButton.d.ts +2 -2
- package/dist/react/components/UnstyledButton.js +2 -2
- package/dist/react/components/auth/AuthCard.js +1 -1
- package/dist/react/components/auth/AuthCard.js.map +1 -1
- package/dist/react/components/buildFreshness.css +2 -2
- package/dist/react/components/calendar/MonthGrid.js +2 -2
- package/dist/react/components/calendar/MonthGrid.js.map +1 -1
- package/dist/react/components/calendar/colorUtils.js +2 -2
- package/dist/react/components/dialog.js +1 -1
- package/dist/react/components/fieldErrorText.d.ts +1 -1
- package/dist/react/components/fieldErrorText.js +1 -1
- package/dist/react/components/paneSplit.css +1 -1
- package/dist/react/components/sharing/ShareEditor.d.ts +5 -1
- package/dist/react/components/sharing/ShareEditor.d.ts.map +1 -1
- package/dist/react/components/sharing/ShareEditor.js +2 -2
- package/dist/react/components/sharing/ShareEditor.js.map +1 -1
- package/dist/react/deep-link/links.d.ts +1 -1
- package/dist/react/deep-link/resume.js +1 -1
- package/dist/react/diff-viewer/DiffViewer.css +1 -1
- package/dist/react/file-tree/FileTree.d.ts +9 -9
- package/dist/react/file-tree/FileTree.js +13 -13
- package/dist/react/file-tree/FileTree.js.map +1 -1
- package/dist/react/file-tree/FolderViewMenus.d.ts +3 -3
- package/dist/react/file-tree/FolderViewMenus.d.ts.map +1 -1
- package/dist/react/file-tree/FolderViewMenus.js +1 -1
- package/dist/react/file-tree/FolderViewMenus.js.map +1 -1
- package/dist/react/file-tree/fileTree.css +14 -14
- package/dist/react/file-tree/fileTreeSelection.d.ts +3 -3
- package/dist/react/file-tree/fileTreeSelection.js +4 -4
- package/dist/react/file-tree/folderView.d.ts +3 -3
- package/dist/react/file-tree/folderView.d.ts.map +1 -1
- package/dist/react/file-tree/folderView.js +3 -3
- package/dist/react/file-tree/folderView.js.map +1 -1
- package/dist/react/filter-rail/FilterRail.d.ts +3 -3
- package/dist/react/filter-rail/FilterRail.d.ts.map +1 -1
- package/dist/react/filter-rail/FilterRail.js +1 -1
- package/dist/react/filter-rail/RailSection.d.ts +1 -1
- package/dist/react/filter-rail/railResize.d.ts +1 -1
- package/dist/react/filter-rail/railResize.js +1 -1
- package/dist/react/folder-tree/FolderBreadcrumb.d.ts +1 -1
- package/dist/react/folder-tree/NewFolderControl.js +1 -1
- package/dist/react/hooks/keyboardDnd.d.ts +1 -1
- package/dist/react/hooks/keyboardDnd.d.ts.map +1 -1
- package/dist/react/hooks/keyboardDnd.js +2 -2
- package/dist/react/hooks/keyboardDnd.js.map +1 -1
- package/dist/react/hooks/pointerDnd.d.ts +2 -2
- package/dist/react/hooks/pointerDnd.d.ts.map +1 -1
- package/dist/react/hooks/pointerDnd.js +1 -1
- package/dist/react/hooks/usePointerDrag.d.ts +2 -2
- package/dist/react/icons.d.ts +16 -9
- package/dist/react/icons.d.ts.map +1 -1
- package/dist/react/icons.js +17 -10
- package/dist/react/icons.js.map +1 -1
- package/dist/react/layoutEngine/LayoutRenderer.js +1 -1
- package/dist/react/layoutEngine/LayoutRenderer.js.map +1 -1
- package/dist/react/lib/cn.d.ts +3 -3
- package/dist/react/lib/cn.js +4 -4
- package/dist/react/lib/field.d.ts +1 -1
- package/dist/react/lib/floatingContainer.d.ts +1 -1
- package/dist/react/lib/floatingContainer.js +1 -1
- package/dist/react/lib/floatingStyles.d.ts +1 -1
- package/dist/react/lib/floatingStyles.js +2 -2
- package/dist/react/lib/floatingStyles.js.map +1 -1
- package/dist/react/lib/hoverIntent.d.ts +6 -6
- package/dist/react/lib/hoverIntent.js +6 -6
- package/dist/react/lib/infoHint.d.ts +1 -1
- package/dist/react/lib/infoHint.js +1 -1
- package/dist/react/lib/overlayMotion.d.ts +1 -1
- package/dist/react/lib/overlayMotion.d.ts.map +1 -1
- package/dist/react/lib/overlayMotion.js +1 -1
- package/dist/react/lib/overlayMotion.js.map +1 -1
- package/dist/react/lib/press.d.ts +1 -1
- package/dist/react/lib/press.js +1 -1
- package/dist/react/lib/selectField.d.ts +2 -2
- package/dist/react/lib/selectField.d.ts.map +1 -1
- package/dist/react/lib/selectField.js +2 -2
- package/dist/react/lib/selectField.js.map +1 -1
- package/dist/react/look/AppearanceMenu.d.ts +1 -1
- package/dist/react/look/AppearanceMenu.js +1 -1
- package/dist/react/look/LookPicker.d.ts +3 -3
- package/dist/react/look/LookPicker.js +3 -3
- package/dist/react/look/lookStore.d.ts +1 -1
- package/dist/react/look/lookStore.js +4 -4
- package/dist/react/look/lookStore.js.map +1 -1
- package/dist/react/master-lock/MasterLockDialog.js +2 -2
- package/dist/react/master-lock/MasterLockDialog.js.map +1 -1
- package/dist/react/master-lock/MasterLockProvider.d.ts +1 -1
- package/dist/react/media/DenseGalleryShell.d.ts +3 -3
- package/dist/react/media/FocusViewer.js +3 -3
- package/dist/react/media/FocusViewer.js.map +1 -1
- package/dist/react/media/FrameGrabber.js +3 -3
- package/dist/react/media/FrameGrabber.js.map +1 -1
- package/dist/react/media/HoverScrubVideoThumb.d.ts +1 -1
- package/dist/react/media/HoverScrubVideoThumb.js +1 -1
- package/dist/react/media/HoverScrubVideoThumb.js.map +1 -1
- package/dist/react/media/MediaCell.d.ts +1 -1
- package/dist/react/media/MediaCell.js +1 -1
- package/dist/react/media/MediaResize.d.ts +1 -1
- package/dist/react/media/MediaThumb.d.ts +1 -1
- package/dist/react/media/PictureControls.d.ts +1 -1
- package/dist/react/media/PictureControls.js +2 -2
- package/dist/react/media/PictureControls.js.map +1 -1
- package/dist/react/media/PictureEditor.js +2 -2
- package/dist/react/media/PictureEditor.js.map +1 -1
- package/dist/react/media/PlayerStrip.d.ts +4 -4
- package/dist/react/media/PlayerStrip.d.ts.map +1 -1
- package/dist/react/media/PlayerStrip.js +2 -2
- package/dist/react/media/VideoPlayer.d.ts +3 -3
- package/dist/react/media/VideoPlayer.js +5 -5
- package/dist/react/media/VideoTurner.js +1 -1
- package/dist/react/media/VideoTurner.js.map +1 -1
- package/dist/react/media/VirtualizedRows.d.ts +1 -1
- package/dist/react/media/denseGallery.css +7 -7
- package/dist/react/media/focusViewer.css +2 -2
- package/dist/react/media/gifEncode.d.ts +4 -4
- package/dist/react/media/gifEncode.d.ts.map +1 -1
- package/dist/react/media/gifEncode.js +8 -8
- package/dist/react/media/gifEncode.js.map +1 -1
- package/dist/react/media/gifRecord.js +1 -1
- package/dist/react/media/gifRecord.js.map +1 -1
- package/dist/react/media/hlsSource.js +2 -2
- package/dist/react/media/hlsSource.js.map +1 -1
- package/dist/react/media/mediaResize.css +3 -3
- package/dist/react/media/pictureEdit.d.ts +1 -1
- package/dist/react/media/pictureEdit.js +4 -4
- package/dist/react/media/pictureEdit.js.map +1 -1
- package/dist/react/media/pictureEditor.css +6 -6
- package/dist/react/media/playerSpaceKey.js +3 -3
- package/dist/react/media/playerStrip.css +11 -11
- package/dist/react/media/posterFraming.d.ts +2 -2
- package/dist/react/media/posterFraming.d.ts.map +1 -1
- package/dist/react/media/posterFraming.js +4 -4
- package/dist/react/media/posterFraming.js.map +1 -1
- package/dist/react/media/sourceFault.d.ts +2 -2
- package/dist/react/media/sourceFault.js +1 -1
- package/dist/react/media/stageResize.d.ts +1 -1
- package/dist/react/media/stageResize.js +1 -1
- package/dist/react/media/surfaceGesture.d.ts +1 -1
- package/dist/react/media/surfaceGesture.js +1 -1
- package/dist/react/media/types.d.ts +1 -1
- package/dist/react/media/videoChapterEditor.css +1 -1
- package/dist/react/media/videoChapters.d.ts +1 -1
- package/dist/react/media/videoChapters.js +1 -1
- package/dist/react/media/videoCutEditor.css +2 -2
- package/dist/react/media/videoEnhance.d.ts +2 -2
- package/dist/react/media/videoEnhance.js +2 -2
- package/dist/react/media/videoPoster.d.ts +3 -3
- package/dist/react/media/videoPoster.d.ts.map +1 -1
- package/dist/react/media/videoPoster.js +4 -4
- package/dist/react/media/videoPoster.js.map +1 -1
- package/dist/react/media/videoRegion.d.ts +8 -8
- package/dist/react/media/videoRegion.js +8 -8
- package/dist/react/media-gallery/MediaGallery.d.ts +2 -2
- package/dist/react/media-gallery/MediaGallery.d.ts.map +1 -1
- package/dist/react/media-gallery/MediaGallery.js +17 -17
- package/dist/react/media-gallery/MediaGallery.js.map +1 -1
- package/dist/react/media-gallery/MediaMetaEditor.js +1 -1
- package/dist/react/media-gallery/galleryDeepLink.d.ts +1 -1
- package/dist/react/media-gallery/galleryDeepLink.js +2 -2
- package/dist/react/media-gallery/galleryItemMedia.d.ts +1 -1
- package/dist/react/media-gallery/galleryItemMedia.js +1 -1
- package/dist/react/media-gallery/galleryReturn.d.ts +1 -1
- package/dist/react/media-gallery/galleryReturn.js +2 -2
- package/dist/react/media-gallery/mediaGallery.css +10 -10
- package/dist/react/media-gallery/mediaGalleryModel.d.ts +1 -1
- package/dist/react/media-gallery/mediaGalleryModel.js +1 -1
- package/dist/react/media-gallery/playbackPreferences.d.ts +3 -3
- package/dist/react/media-gallery/playbackPreferences.js +2 -2
- package/dist/react/media-gallery/playbackRun.d.ts +1 -1
- package/dist/react/media-gallery/playbackRun.js +1 -1
- package/dist/react/media-gallery/preferenceSync.js +1 -1
- package/dist/react/namespace/NamespaceTargetCapsule.d.ts +1 -1
- package/dist/react/nav/BreadcrumbTrail.d.ts +1 -1
- package/dist/react/nav/BreadcrumbTrail.js +1 -1
- package/dist/react/nav/Breadcrumbs.d.ts +1 -1
- package/dist/react/nav/Breadcrumbs.js +1 -1
- package/dist/react/nav/HeaderSearch.d.ts +3 -3
- package/dist/react/nav/HeaderSearch.d.ts.map +1 -1
- package/dist/react/nav/HeaderSearch.js +2 -2
- package/dist/react/nav/PlaceBar.d.ts +1 -1
- package/dist/react/nav/PlaceBar.js +2 -2
- package/dist/react/nav/SearchResults.d.ts +2 -2
- package/dist/react/nav/SearchResults.d.ts.map +1 -1
- package/dist/react/nav/SearchResults.js +1 -1
- package/dist/react/nav/TopBar.js +1 -1
- package/dist/react/nav/breadcrumbStore.js +1 -1
- package/dist/react/nav/navShared.d.ts +1 -1
- package/dist/react/palette/CommandPalette.js +1 -1
- package/dist/react/palette/CommandPalette.js.map +1 -1
- package/dist/react/pdf-viewer/PdfPage.js +1 -1
- package/dist/react/pdf-viewer/PdfPage.js.map +1 -1
- package/dist/react/spreadsheet/SpreadsheetGrid.d.ts +1 -1
- package/dist/react/spreadsheet/useGlideTheme.js +2 -2
- package/dist/react/workbook-viewer/WorkbookViewer.js +1 -1
- package/dist/react/workbook-viewer/WorkbookViewer.js.map +1 -1
- package/dist/styles-areas/notifications.css +1 -1
- package/dist/styles-static.css +1 -1
- package/dist/styles.css +1 -1
- package/dist/testing/designAudit.d.ts +2 -2
- package/dist/testing/designAudit.js +3 -3
- package/dist/testing/designAudit.js.map +1 -1
- package/dist/testing/phoneRules.d.ts +4 -4
- package/dist/testing/phoneRules.js +4 -4
- package/dist/testing/phoneRules.js.map +1 -1
- package/dist/theme.css +10 -10
- package/package.json +1 -1
- package/scripts/attributesForwarded.ts +1 -1
- package/scripts/checkAreaStyles.ts +2 -2
- package/scripts/cssRules.ts +2 -2
- package/scripts/demoCoverage.ts +1 -1
- package/scripts/demoServer.ts +1 -1
- package/scripts/generateStaticStyles.ts +1 -1
- package/scripts/guardrailsEnforce.spec.ts +14 -14
- package/scripts/guardrailsEnforce.ts +25 -25
- package/scripts/paths.ts +1 -1
- package/scripts/styleAreas.ts +2 -2
- package/scripts/testTmpRoot.ts +1 -1
- package/src/buildIsStaged.spec.ts +1 -1
- package/src/iframesMakeNoRealRequest.spec.ts +1 -1
- package/src/looks.css +4 -4
- package/src/looks.spec.ts +3 -3
- package/src/namedSubpathsResolve.spec.ts +2 -2
- package/src/publishShape.spec.ts +1 -1
- package/src/react/Toast.spec.tsx +1 -1
- package/src/react/Toast.tsx +2 -2
- package/src/react/VirtualCardGrid.spec.tsx +1 -1
- package/src/react/VirtualCardGrid.tsx +3 -3
- package/src/react/activity-bar/ActivityBar.spec.tsx +2 -2
- package/src/react/activity-bar/ActivityBar.tsx +4 -4
- package/src/react/activity-bar/activityBar.css +4 -4
- package/src/react/analytics/AnalyticsPanel.tsx +1 -1
- package/src/react/canvas-hud/CanvasMinimap.tsx +1 -1
- package/src/react/canvas-hud/HudControls.spec.tsx +1 -1
- package/src/react/canvas-hud/HudControls.tsx +2 -2
- package/src/react/canvas-hud/alignment.spec.tsx +4 -4
- package/src/react/canvas-hud/alignment.ts +3 -3
- package/src/react/canvas-hud/viewport.spec.ts +1 -1
- package/src/react/canvas-hud/viewport.ts +1 -1
- package/src/react/charts/BarChart.tsx +2 -2
- package/src/react/charts/HeatmapChart.spec.ts +1 -1
- package/src/react/charts/HeatmapChart.tsx +1 -1
- package/src/react/charts/IntervalTimeline.color.spec.tsx +6 -6
- package/src/react/charts/IntervalTimeline.tsx +2 -2
- package/src/react/charts/Treemap.tsx +1 -1
- package/src/react/charts/accentCollision.spec.ts +1 -1
- package/src/react/charts/categorical.spec.ts +3 -3
- package/src/react/charts/categorical.ts +12 -12
- package/src/react/charts/ink.spec.ts +1 -1
- package/src/react/charts/ink.ts +5 -5
- package/src/react/charts/tokens.ts +1 -1
- package/src/react/chat/Bubble.tsx +1 -1
- package/src/react/chat/DateMarker.tsx +2 -2
- package/src/react/chat/MessageComposer.tsx +1 -1
- package/src/react/chat/PresenceRoster.tsx +2 -2
- package/src/react/chat/types.ts +1 -1
- package/src/react/chat/usePresence.ts +2 -2
- package/src/react/code-editor/markdownRules.ts +1 -1
- package/src/react/components/AvatarStack.spec.tsx +2 -2
- package/src/react/components/AvatarStack.tsx +2 -2
- package/src/react/components/Badge.capsule.spec.ts +6 -6
- package/src/react/components/Badge.tsx +1 -1
- package/src/react/components/Button.spec.tsx +1 -1
- package/src/react/components/Button.tsx +5 -5
- package/src/react/components/ChartTablePanel.tsx +1 -1
- package/src/react/components/Checkbox.spec.tsx +2 -2
- package/src/react/components/Checkbox.tsx +2 -2
- package/src/react/components/ChoiceGroup.tsx +1 -1
- package/src/react/components/CodeChip.spec.tsx +1 -1
- package/src/react/components/CodeChip.tsx +1 -1
- package/src/react/components/ColorSwatches.spec.tsx +9 -9
- package/src/react/components/ColorSwatches.tsx +16 -16
- package/src/react/components/CommentThread.tsx +1 -1
- package/src/react/components/ConnectionHealer.tsx +1 -1
- package/src/react/components/DataTable/DataTable.spec.tsx +2 -2
- package/src/react/components/DataTable/DataTable.tsx +10 -10
- package/src/react/components/DataTable/SearchBox.tsx +2 -2
- package/src/react/components/DataTable/SortHeader.tsx +1 -1
- package/src/react/components/DataTable/TableFilterBuilder.tsx +1 -1
- package/src/react/components/DataTable/selection.spec.tsx +1 -1
- package/src/react/components/DataTable/virtualize.spec.tsx +1 -1
- package/src/react/components/DropdownMenu.tsx +1 -1
- package/src/react/components/Field.tsx +1 -1
- package/src/react/components/FormPreviewLayout.tsx +1 -1
- package/src/react/components/Heat.spec.tsx +1 -1
- package/src/react/components/Heat.tsx +6 -6
- package/src/react/components/IconPicker.spec.tsx +1 -1
- package/src/react/components/IconPicker.tsx +9 -9
- package/src/react/components/InfoHint.spec.tsx +2 -2
- package/src/react/components/InfoHint.tsx +1 -1
- package/src/react/components/InheritBadge.tsx +2 -2
- package/src/react/components/IsolatedFrame.tsx +1 -1
- package/src/react/components/ListToolbar.tsx +1 -1
- package/src/react/components/Menu.tsx +1 -1
- package/src/react/components/Modal.tsx +5 -5
- package/src/react/components/Page.spec.tsx +1 -1
- package/src/react/components/Page.tsx +2 -2
- package/src/react/components/PaneSplit.tsx +1 -1
- package/src/react/components/PathText.tsx +1 -1
- package/src/react/components/PointerDrag.spec.tsx +1 -1
- package/src/react/components/Popover.spec.tsx +2 -2
- package/src/react/components/Popover.tsx +1 -1
- package/src/react/components/PropertyList.tsx +1 -1
- package/src/react/components/PropertyPicker.tsx +2 -2
- package/src/react/components/RatingField.tsx +1 -1
- package/src/react/components/SaveIndicator.tsx +2 -2
- package/src/react/components/SearchInput.tsx +1 -1
- package/src/react/components/SecretInput.tsx +1 -1
- package/src/react/components/Section.tsx +1 -1
- package/src/react/components/SectionNav.spec.tsx +3 -3
- package/src/react/components/SectionNav.tsx +3 -3
- package/src/react/components/SelectField.spec.tsx +1 -1
- package/src/react/components/Slider.tsx +1 -1
- package/src/react/components/StarRating.spec.tsx +4 -4
- package/src/react/components/StarRating.tsx +3 -3
- package/src/react/components/SwatchPicker.spec.tsx +4 -4
- package/src/react/components/SwatchPicker.tsx +9 -9
- package/src/react/components/Tooltip.spec.tsx +3 -3
- package/src/react/components/Tooltip.tsx +1 -1
- package/src/react/components/TreeView.tsx +1 -1
- package/src/react/components/TruncatedText.tsx +1 -1
- package/src/react/components/UnstyledButton.tsx +2 -2
- package/src/react/components/auth/AuthCard.tsx +1 -1
- package/src/react/components/buildFreshness.css +2 -2
- package/src/react/components/calendar/EventChip.spec.tsx +2 -2
- package/src/react/components/calendar/MonthGrid.tsx +2 -2
- package/src/react/components/calendar/colorUtils.ts +2 -2
- package/src/react/components/dialog.tsx +1 -1
- package/src/react/components/fieldErrorText.tsx +1 -1
- package/src/react/components/paneSplit.css +1 -1
- package/src/react/components/sharing/ShareEditor.spec.tsx +15 -0
- package/src/react/components/sharing/ShareEditor.tsx +14 -3
- package/src/react/deep-link/links.spec.ts +1 -1
- package/src/react/deep-link/links.ts +1 -1
- package/src/react/deep-link/resume.spec.tsx +1 -1
- package/src/react/deep-link/resume.ts +1 -1
- package/src/react/diff-viewer/DiffViewer.css +1 -1
- package/src/react/file-tree/FileTree.spec.tsx +13 -13
- package/src/react/file-tree/FileTree.tsx +22 -22
- package/src/react/file-tree/FolderViewMenus.tsx +3 -3
- package/src/react/file-tree/FolderViewPanels.tsx +1 -1
- package/src/react/file-tree/fileTree.css +14 -14
- package/src/react/file-tree/fileTreeGeometry.spec.ts +5 -5
- package/src/react/file-tree/fileTreeSelection.ts +4 -4
- package/src/react/file-tree/folderView.spec.ts +1 -1
- package/src/react/file-tree/folderView.ts +3 -3
- package/src/react/filter-rail/FilterRail.spec.tsx +1 -1
- package/src/react/filter-rail/FilterRail.tsx +4 -4
- package/src/react/filter-rail/RailSection.spec.tsx +2 -2
- package/src/react/filter-rail/RailSection.tsx +1 -1
- package/src/react/filter-rail/railResize.tsx +1 -1
- package/src/react/folder-tree/FolderBreadcrumb.tsx +1 -1
- package/src/react/folder-tree/NewFolderControl.tsx +1 -1
- package/src/react/hooks/keyboardDnd.spec.tsx +1 -1
- package/src/react/hooks/keyboardDnd.tsx +2 -2
- package/src/react/hooks/pointerDnd.spec.ts +3 -3
- package/src/react/hooks/pointerDnd.ts +2 -2
- package/src/react/hooks/useOutsidePress.spec.tsx +1 -1
- package/src/react/hooks/usePointerDrag.ts +2 -2
- package/src/react/icons.tsx +18 -11
- package/src/react/keep-awake/keepAwakeEngine.spec.ts +1 -1
- package/src/react/layoutEngine/LayoutConfigDialog.tsx +1 -1
- package/src/react/layoutEngine/LayoutRenderer.tsx +1 -1
- package/src/react/layoutEngine/gridClasses.spec.ts +3 -3
- package/src/react/lib/cn.spec.ts +1 -1
- package/src/react/lib/cn.ts +4 -4
- package/src/react/lib/directUpload.spec.ts +1 -1
- package/src/react/lib/field.ts +1 -1
- package/src/react/lib/floatingContainer.ts +1 -1
- package/src/react/lib/floatingStyles.spec.ts +1 -1
- package/src/react/lib/floatingStyles.ts +2 -2
- package/src/react/lib/hoverIntent.ts +6 -6
- package/src/react/lib/infoHint.ts +1 -1
- package/src/react/lib/overlayMotion.ts +1 -1
- package/src/react/lib/press.ts +1 -1
- package/src/react/lib/selectField.ts +2 -2
- package/src/react/lib/zodResolver.ts +1 -1
- package/src/react/look/AppearanceMenu.tsx +1 -1
- package/src/react/look/LookPicker.tsx +3 -3
- package/src/react/look/lookStore.ts +4 -4
- package/src/react/markdown/MarkdownDoc.spec.tsx +1 -1
- package/src/react/master-detail/MasterDetail.tsx +1 -1
- package/src/react/master-lock/MasterLockDialog.tsx +2 -2
- package/src/react/master-lock/MasterLockProvider.spec.tsx +1 -1
- package/src/react/master-lock/MasterLockProvider.tsx +1 -1
- package/src/react/media/DenseGalleryShell.tsx +3 -3
- package/src/react/media/FocusViewer.tsx +3 -3
- package/src/react/media/FrameGrabber.spec.tsx +2 -2
- package/src/react/media/FrameGrabber.tsx +3 -3
- package/src/react/media/HoverScrubVideoThumb.tsx +3 -3
- package/src/react/media/MediaCell.tsx +1 -1
- package/src/react/media/MediaResize.spec.tsx +4 -4
- package/src/react/media/MediaResize.tsx +1 -1
- package/src/react/media/MediaThumb.tsx +1 -1
- package/src/react/media/PictureControls.tsx +2 -2
- package/src/react/media/PictureEditor.tsx +2 -2
- package/src/react/media/PlayerStrip.tsx +9 -9
- package/src/react/media/VideoChapterEditor.tsx +1 -1
- package/src/react/media/VideoCutEditor.spec.tsx +1 -1
- package/src/react/media/VideoCutEditor.tsx +1 -1
- package/src/react/media/VideoPlayer.spec.tsx +7 -7
- package/src/react/media/VideoPlayer.tsx +6 -6
- package/src/react/media/VideoTurner.tsx +1 -1
- package/src/react/media/VirtualizedRows.tsx +1 -1
- package/src/react/media/denseGallery.css +7 -7
- package/src/react/media/focusViewer.css +2 -2
- package/src/react/media/focusViewer.css.spec.ts +1 -1
- package/src/react/media/gifEncode.spec.ts +2 -2
- package/src/react/media/gifEncode.ts +9 -9
- package/src/react/media/gifRecord.ts +1 -1
- package/src/react/media/hlsSource.recovery.spec.ts +2 -2
- package/src/react/media/hlsSource.spec.ts +1 -1
- package/src/react/media/hlsSource.ts +2 -2
- package/src/react/media/mediaResize.css +3 -3
- package/src/react/media/pictureEdit.spec.ts +5 -5
- package/src/react/media/pictureEdit.ts +4 -4
- package/src/react/media/pictureEditor.css +6 -6
- package/src/react/media/playerSpaceKey.ts +3 -3
- package/src/react/media/playerStrip.css +11 -11
- package/src/react/media/playerStrip.spec.tsx +17 -13
- package/src/react/media/posterFraming.spec.ts +4 -4
- package/src/react/media/posterFraming.ts +5 -5
- package/src/react/media/sourceFault.tsx +2 -2
- package/src/react/media/stageResize.ts +1 -1
- package/src/react/media/surfaceGesture.ts +1 -1
- package/src/react/media/types.ts +1 -1
- package/src/react/media/videoChapterEditor.css +1 -1
- package/src/react/media/videoChapters.spec.ts +1 -1
- package/src/react/media/videoChapters.ts +1 -1
- package/src/react/media/videoCutEditor.css +2 -2
- package/src/react/media/videoEnhance.spec.ts +1 -1
- package/src/react/media/videoEnhance.ts +2 -2
- package/src/react/media/videoPoster.spec.ts +3 -3
- package/src/react/media/videoPoster.ts +5 -5
- package/src/react/media/videoRegion.spec.ts +7 -7
- package/src/react/media/videoRegion.ts +8 -8
- package/src/react/media-gallery/GalleryTable.tsx +1 -1
- package/src/react/media-gallery/MediaGallery.spec.tsx +11 -11
- package/src/react/media-gallery/MediaGallery.tsx +23 -23
- package/src/react/media-gallery/MediaMetaEditor.tsx +1 -1
- package/src/react/media-gallery/galleryDeepLink.ts +2 -2
- package/src/react/media-gallery/galleryItemMedia.spec.tsx +1 -1
- package/src/react/media-gallery/galleryItemMedia.tsx +1 -1
- package/src/react/media-gallery/galleryReturn.ts +2 -2
- package/src/react/media-gallery/mediaGallery.css +10 -10
- package/src/react/media-gallery/mediaGalleryModel.ts +1 -1
- package/src/react/media-gallery/playbackPreferences.ts +3 -3
- package/src/react/media-gallery/playbackRun.spec.ts +1 -1
- package/src/react/media-gallery/playbackRun.ts +1 -1
- package/src/react/media-gallery/preferenceSync.ts +1 -1
- package/src/react/namespace/NamespaceTargetCapsule.tsx +1 -1
- package/src/react/nav/BreadcrumbTrail.tsx +1 -1
- package/src/react/nav/Breadcrumbs.tsx +1 -1
- package/src/react/nav/HeaderSearch.tsx +3 -3
- package/src/react/nav/PlaceBar.spec.tsx +4 -4
- package/src/react/nav/PlaceBar.tsx +4 -4
- package/src/react/nav/SearchResults.tsx +2 -2
- package/src/react/nav/TopBar.spec.tsx +1 -1
- package/src/react/nav/TopBar.tsx +1 -1
- package/src/react/nav/breadcrumbStore.ts +1 -1
- package/src/react/nav/breadcrumbSystem.spec.tsx +1 -1
- package/src/react/nav/navShared.tsx +1 -1
- package/src/react/palette/CommandPalette.spec.tsx +1 -1
- package/src/react/palette/CommandPalette.tsx +1 -1
- package/src/react/pdf-viewer/PdfPage.tsx +1 -1
- package/src/react/spreadsheet/SpreadsheetGrid.tsx +1 -1
- package/src/react/spreadsheet/useGlideTheme.ts +2 -2
- package/src/react/workbook-viewer/WorkbookViewer.tsx +1 -1
- package/src/shippedFilesAreTracked.spec.ts +2 -2
- package/src/styles-areas/notifications.css +1 -1
- package/src/styles-static.css +1 -1
- package/src/styles.css +1 -1
- package/src/stylesAreas.spec.ts +1 -1
- package/src/stylesStaticMatches.spec.ts +2 -2
- package/src/stylesUtilitiesMatches.spec.ts +4 -4
- package/src/testing/designAudit.ts +4 -4
- package/src/testing/phoneRules.spec.ts +1 -1
- package/src/testing/phoneRules.ts +7 -7
- package/src/theme.css +10 -10
- package/src/themeColorsResolve.spec.ts +5 -5
- package/src/themeDarkScopeAliases.spec.ts +1 -1
- package/src/verifyGraph.spec.ts +1 -1
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
* ── Where it came from ──────────────────────────────────────────────────────────────────
|
|
10
10
|
* Owner, 2026-09-08: *"the spreadsheet app has a much better file tree sidebar than
|
|
11
11
|
* collections has. Add the file tree viewer from it into cb so apps like collections can
|
|
12
|
-
* use it."* This is `cursed-embeddable-spreadsheet`'s `FileTree`,
|
|
12
|
+
* use it."* This is `cursed-embeddable-spreadsheet`'s `FileTree`, generalized: its workbook
|
|
13
13
|
* /sheet/note vocabulary is gone, its manual sibling order became the opt-in
|
|
14
14
|
* {@link FileTreeProps.allowReorder}, and everything that made it good — the gesture, the
|
|
15
15
|
* spring-open, the typeahead, the in-place rename — is here unchanged.
|
|
@@ -17,11 +17,11 @@
|
|
|
17
17
|
* ── 🔴 The graduation verdict, 2026-09-13: this one stays, and it grew ──────────────────
|
|
18
18
|
* `cursedesk` has a `FileTree.tsx` of its own — the same ancestor, kept in step by hand ever
|
|
19
19
|
* since. The pair was compared to decide which should be the shared one, and this is: it is
|
|
20
|
-
* the app's tree with the workbook/sheet/note/merge vocabulary
|
|
20
|
+
* the app's tree with the workbook/sheet/note/merge vocabulary generalized away, and it has
|
|
21
21
|
* external drags, `canDrop`, `acceptsDrop`, reordering, filtering, access marks, counts and
|
|
22
22
|
* the three render slots, none of which the app's has.
|
|
23
23
|
*
|
|
24
|
-
* But the app's carried SIX
|
|
24
|
+
* But the app's carried SIX behaviors this did not, every one of them general, and adopting
|
|
25
25
|
* this tree without them would have been a regression on a 200-row library rather than a
|
|
26
26
|
* graduation. They are here now and each says so where it lives:
|
|
27
27
|
*
|
|
@@ -309,7 +309,7 @@ export interface FileTreeProps {
|
|
|
309
309
|
* folder the library is filtered by. Those are singular questions with singular answers,
|
|
310
310
|
* and a tree that silently became multi-select would break "what am I looking at" in two
|
|
311
311
|
* shipped apps on the day it published. So a consumer that passes neither this nor
|
|
312
|
-
* {@link onSelectionChange} gets EXACTLY today's
|
|
312
|
+
* {@link onSelectionChange} gets EXACTLY today's behavior, byte for byte.
|
|
313
313
|
*
|
|
314
314
|
* Omit it and the selection is `[selectedId]`, which is what makes ⌘-click work for a
|
|
315
315
|
* consumer that stores only the one id and grows into the array afterwards.
|
|
@@ -348,7 +348,7 @@ export interface FileTreeProps {
|
|
|
348
348
|
* persisted is still the collapse it persisted — on the next mount the tree reads it back
|
|
349
349
|
* unchanged. Shutting one of them by hand drops it from the overlay and the persisted value
|
|
350
350
|
* decides again; nothing about it is ever written out. That is the whole of the objection
|
|
351
|
-
* limit 1 records, answered without giving up the
|
|
351
|
+
* limit 1 records, answered without giving up the behavior he asked for.
|
|
352
352
|
*
|
|
353
353
|
* Off unless it is wired, like every other verb here: a consumer that passes nothing gets
|
|
354
354
|
* byte for byte today's reveal.
|
|
@@ -407,7 +407,7 @@ export interface FileTreeProps {
|
|
|
407
407
|
/**
|
|
408
408
|
* What the pinned section is called — its heading, and its `aria-label`. Default `Pinned`.
|
|
409
409
|
*
|
|
410
|
-
* An app whose vocabulary differs ("
|
|
410
|
+
* An app whose vocabulary differs ("Favorites", "Starred") passes its own, for the same
|
|
411
411
|
* reason {@link accessCopy} exists: the mechanism is general and the words are not.
|
|
412
412
|
*/
|
|
413
413
|
pinnedLabel?: string;
|
|
@@ -497,7 +497,7 @@ export interface FileTreeProps {
|
|
|
497
497
|
* delete all the selected files"*.
|
|
498
498
|
*
|
|
499
499
|
* Without it, ⌫ on a multi-selection deletes the focused row alone, which is today's
|
|
500
|
-
*
|
|
500
|
+
* behavior and a consumer that never asked for the plural keeps it. The nodes are handed
|
|
501
501
|
* over rather than the ids, because a confirmation dialog needs their names.
|
|
502
502
|
*/
|
|
503
503
|
onDeleteMany?: (nodes: readonly FileTreeNode[]) => void;
|
|
@@ -526,7 +526,7 @@ export interface FileTreeProps {
|
|
|
526
526
|
*
|
|
527
527
|
* 🔴 Nothing is created until the name is committed. A folder made first and renamed
|
|
528
528
|
* afterwards is a row that spent a moment called "untitled", and a row in the way if the
|
|
529
|
-
* field is
|
|
529
|
+
* field is canceled.
|
|
530
530
|
*
|
|
531
531
|
* `wrap` is the same draft asked to close AROUND rows that already exist — *"allow make
|
|
532
532
|
* dir from file where dir wraps file location and gets name of file"*, which is Finder's
|
|
@@ -582,7 +582,7 @@ export interface FileTreeProps {
|
|
|
582
582
|
*
|
|
583
583
|
* 🔴 A tree whose folders are DERIVED has nothing to wrap with. `apps/music` builds a
|
|
584
584
|
* folder out of the `folder` column of the tracks inside it, so there is no folder for this
|
|
585
|
-
* gesture to make — and offering a name field that cannot be
|
|
585
|
+
* gesture to make — and offering a name field that cannot be honored is the "control that
|
|
586
586
|
* fails on commit" this component refuses everywhere else. See `refuseWrap`.
|
|
587
587
|
*
|
|
588
588
|
* A row the consumer marked `draggable: false` is refused without asking, because wrapping
|
|
@@ -760,7 +760,7 @@ function DefaultIcon({ node, open }: { node: FileTreeNode; open: boolean }): Rea
|
|
|
760
760
|
/**
|
|
761
761
|
* A row's name, with {@link FileTreeProps.subtitle}'s muted second line under it when it has one.
|
|
762
762
|
* The two stack in one column so every mark after the name (lock, count, tools) stays on the
|
|
763
|
-
* row's
|
|
763
|
+
* row's center line, and each line truncates on its own.
|
|
764
764
|
*/
|
|
765
765
|
function withSubtitle(name: ReactNode, subtitle: string | undefined): ReactNode {
|
|
766
766
|
if (!subtitle) return name;
|
|
@@ -918,7 +918,7 @@ export function FileTree({
|
|
|
918
918
|
* Swallow the `click` a finished drag leaves behind.
|
|
919
919
|
*
|
|
920
920
|
* 🔴 A pointerdown and a pointerup on the same row still produce a click even when the
|
|
921
|
-
* pointer
|
|
921
|
+
* pointer traveled the length of the list in between — and with `setPointerCapture` the
|
|
922
922
|
* click is delivered to the row the gesture STARTED on whatever it ended over. So without
|
|
923
923
|
* this, dropping a row into a folder also selects the row that was dropped, which in a
|
|
924
924
|
* consumer that navigates on select means the drag takes you somewhere. The drag is the
|
|
@@ -930,7 +930,7 @@ export function FileTree({
|
|
|
930
930
|
*
|
|
931
931
|
* 🔴 A shift-click deliberately does not move it. That is what lets a second shift-click
|
|
932
932
|
* re-cover the range from the same start instead of growing it one row at a time, which is
|
|
933
|
-
* the
|
|
933
|
+
* the behavior every file explorer has and the reason the anchor is not just "the last
|
|
934
934
|
* thing selected".
|
|
935
935
|
*/
|
|
936
936
|
const anchor = useRef<string | null>(null);
|
|
@@ -1162,7 +1162,7 @@ export function FileTree({
|
|
|
1162
1162
|
* one and the consumer wired the plural verb, and `node` alone otherwise.
|
|
1163
1163
|
*
|
|
1164
1164
|
* 🔴 `batched` is the whole compatibility story in one argument. Every plural callback is
|
|
1165
|
-
* optional, so a consumer that wired only the singular one keeps the singular
|
|
1165
|
+
* optional, so a consumer that wired only the singular one keeps the singular behavior on
|
|
1166
1166
|
* every gesture — the tree never invents a batch nobody can receive.
|
|
1167
1167
|
*/
|
|
1168
1168
|
const actOn = useCallback(
|
|
@@ -1367,7 +1367,7 @@ export function FileTree({
|
|
|
1367
1367
|
}, [revealShut, onRevealExpand]);
|
|
1368
1368
|
/** The selection an expanding reveal has already fired for — see limit 1 below. */
|
|
1369
1369
|
const revealedFor = useRef<string | null | undefined>(null);
|
|
1370
|
-
/** The {@link FileTreeProps.revealKey} last
|
|
1370
|
+
/** The {@link FileTreeProps.revealKey} last honored — a change re-arms `revealedFor`. */
|
|
1371
1371
|
const revealedKey = useRef(revealKey);
|
|
1372
1372
|
|
|
1373
1373
|
/**
|
|
@@ -1388,12 +1388,12 @@ export function FileTree({
|
|
|
1388
1388
|
*
|
|
1389
1389
|
* 🔴 **The argument, and what changed about it, 2026-09-16.** This limit was written as
|
|
1390
1390
|
* a flat refusal: auto-expanding is what `explorer.autoReveal` does and it is the
|
|
1391
|
-
*
|
|
1391
|
+
* behavior people turn off, because it silently undoes a collapse they chose — and
|
|
1392
1392
|
* `collapsed` here is often a CONTROLLED value the consumer persists, so expanding would
|
|
1393
1393
|
* write it open for good. Then the owner asked for it BY NAME — *"show that file in the
|
|
1394
1394
|
* file tree by like vscode does when you select a tab with a file in it"* — and named the
|
|
1395
1395
|
* application whose default is `true`. His ask wins over the default this file chose for
|
|
1396
|
-
* him, so the
|
|
1396
|
+
* him, so the behavior is here.
|
|
1397
1397
|
*
|
|
1398
1398
|
* What survives is the half of the objection that was never taste: **the persisted value
|
|
1399
1399
|
* is not rewritten.** The expansion goes into `revealOpened`, an overlay of this tree's
|
|
@@ -1522,8 +1522,8 @@ export function FileTree({
|
|
|
1522
1522
|
(commit: boolean, state: DragState | null) => {
|
|
1523
1523
|
stopAutoScroll();
|
|
1524
1524
|
stopSpring();
|
|
1525
|
-
// Whatever happens next, a gesture that actually
|
|
1526
|
-
// click — see `draggedJustNow`. Set for a
|
|
1525
|
+
// Whatever happens next, a gesture that actually traveled owes the row a swallowed
|
|
1526
|
+
// click — see `draggedJustNow`. Set for a canceled drag too: the click arrives either
|
|
1527
1527
|
// way, and Escape landing you on a different row would be its own surprise.
|
|
1528
1528
|
if (state?.active) draggedJustNow.current = true;
|
|
1529
1529
|
if (commit && state?.active && state.outside) {
|
|
@@ -1948,7 +1948,7 @@ export function FileTree({
|
|
|
1948
1948
|
event: React.KeyboardEvent<HTMLElement>,
|
|
1949
1949
|
row: FileTreeRow,
|
|
1950
1950
|
/*
|
|
1951
|
-
* The rows the ARROWS walk, and which section drew this one. A pinned copy's
|
|
1951
|
+
* The rows the ARROWS walk, and which section drew this one. A pinned copy's neighbors
|
|
1952
1952
|
* are the other pins, not the tree rows around where it lives — ↓ from the last pin
|
|
1953
1953
|
* jumping into the middle of a folder would be a cursor that teleports. Every verb below
|
|
1954
1954
|
* still acts on `row.node`, which is the one identity both copies share.
|
|
@@ -2355,7 +2355,7 @@ export function FileTree({
|
|
|
2355
2355
|
* Files on the clipboard, or text that is not the rows' names, mean something was copied
|
|
2356
2356
|
* after the rows: the rows are put down and the event goes on untouched, to whatever the
|
|
2357
2357
|
* consumer does with a paste (desk files a screenshot into the folder). The names still
|
|
2358
|
-
* there mean the rows ARE the newest copy, and they are pasted — the event
|
|
2358
|
+
* there mean the rows ARE the newest copy, and they are pasted — the event canceled and
|
|
2359
2359
|
* stopped, so nothing above pastes the same keypress a second time.
|
|
2360
2360
|
*/
|
|
2361
2361
|
const onPaste = useCallback(
|
|
@@ -2539,7 +2539,7 @@ export function FileTree({
|
|
|
2539
2539
|
wrapping?.name ?? '',
|
|
2540
2540
|
(value) => commitDraft(value),
|
|
2541
2541
|
() => onDraftCancel?.(),
|
|
2542
|
-
// A suggested name that comes back unchanged is the person AGREEING with it.
|
|
2542
|
+
// A suggested name that comes back unchanged is the person AGREEING with it. Canceling
|
|
2543
2543
|
// there would make Enter mean "no" on the one field where it obviously means "yes".
|
|
2544
2544
|
wrapping ? 'commit' : 'cancel',
|
|
2545
2545
|
wrapping ? undefined : draftPlaceholder,
|
|
@@ -3288,7 +3288,7 @@ export function FileTree({
|
|
|
3288
3288
|
* 🔴 Asked on the ROW rather than answered by handlers on the shelf. A container with an
|
|
3289
3289
|
* `onClick` that only calls `stopPropagation` is a static element the a11y rules correctly
|
|
3290
3290
|
* refuse — it looks interactive, announces nothing, and has no keyboard equivalent. The row
|
|
3291
|
-
* bailing is the same
|
|
3291
|
+
* bailing is the same behavior said once, in the place that actually has the rule: a press
|
|
3292
3292
|
* on a tool must not select the row or start a drag.
|
|
3293
3293
|
*/
|
|
3294
3294
|
function inTools(event: { target: EventTarget | null; currentTarget: EventTarget | null }): boolean {
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
*
|
|
8
8
|
* The arithmetic is `folderView.ts`, the storage is `useFolderView.ts`, and `FileTree.tsx`
|
|
9
9
|
* decides when each of these opens. Kept out of that file because it is already the largest
|
|
10
|
-
* in the package, and because none of this is part of the drag gesture it is
|
|
10
|
+
* in the package, and because none of this is part of the drag gesture it is organized around.
|
|
11
11
|
*
|
|
12
12
|
* ── What was copied, and from whom ──────────────────────────────────────────────────────
|
|
13
13
|
*
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
* using it, never in a separate "manage tags" screen, and stops existing when no folder
|
|
22
22
|
* carries it — so there is nothing to tidy.
|
|
23
23
|
* · **Filter by tag** → Linear's and Gmail's *is* / *is not*, as two quiet toggles per tag
|
|
24
|
-
* ("Only", "Hide"),
|
|
24
|
+
* ("Only", "Hide"), labeled **This device** because that is the one thing about it a
|
|
25
25
|
* person could not guess.
|
|
26
26
|
* · **The strip** → Linear's filter bar: when the tree is narrowed, the tree SAYS so, with
|
|
27
27
|
* a one-click way back. A folder missing on one machine and present on another is
|
|
@@ -204,7 +204,7 @@ export function withFolderItems(
|
|
|
204
204
|
];
|
|
205
205
|
}
|
|
206
206
|
|
|
207
|
-
/** The
|
|
207
|
+
/** The color mark for one tag. */
|
|
208
208
|
export function TagDot({ tag, ...rest }: { tag: string }): ReactNode {
|
|
209
209
|
return <span {...rest} className='cbft-tagdot' data-hue={tagHue(tag)} aria-hidden='true' />;
|
|
210
210
|
}
|
|
@@ -246,7 +246,7 @@ function TagFilter({ view }: { view: FolderView }): ReactNode {
|
|
|
246
246
|
<span className='cbft-fv-count'>{count}</span>
|
|
247
247
|
{/* A 2-segment toggle in a 28px menu row, styled by `.cbft-fv-seg` — the tree
|
|
248
248
|
ships plain CSS (see fileTree.css's header), so the button is the belt's
|
|
249
|
-
UNSTYLED one: its
|
|
249
|
+
UNSTYLED one: its behavior and hint, none of a 36px control's look. */}
|
|
250
250
|
<fieldset className='cbft-fv-seg' aria-label={`Filter by ${tag}`}>
|
|
251
251
|
<UnstyledButton
|
|
252
252
|
tooltip={`Show only folders tagged ${tag} (and those with any other “Only” tag)`}
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
* copied rather than approximated, because "densely packed" is a measurement and an
|
|
24
24
|
* approximation of it is just a different tree.
|
|
25
25
|
*
|
|
26
|
-
* 22px is also VS Code's explorer row, which is what the whole sidebar is
|
|
26
|
+
* 22px is also VS Code's explorer row, which is what the whole sidebar is modeled on.
|
|
27
27
|
* It was 30 here, and 8px per row over forty rows is a third of a screenful.
|
|
28
28
|
*
|
|
29
29
|
* 🔴 `--cbft-indent` and `--cbft-guide-offset` MOVE TOGETHER: the guide is drawn down the
|
|
@@ -78,7 +78,7 @@
|
|
|
78
78
|
* Owner, 2026-09-10: *"use thinner fonts and less bright font in dark mode. It looks too
|
|
79
79
|
* glaring."* `--foreground` is `#f9fafb` in dark — near-white, correct for a heading and
|
|
80
80
|
* far too loud for forty rows of it down a sidebar. VS Code's dark themes all land near
|
|
81
|
-
* `#cccccc` for exactly this surface, and the mix below is that
|
|
81
|
+
* `#cccccc` for exactly this surface, and the mix below is that color derived from the
|
|
82
82
|
* theme rather than pinned to a literal, so a re-themed app keeps its own hue.
|
|
83
83
|
*/
|
|
84
84
|
--cbft-fg: var(--foreground);
|
|
@@ -99,7 +99,7 @@
|
|
|
99
99
|
/*
|
|
100
100
|
* The other half of "thinner". On a dark ground macOS's default stem-darkening renders
|
|
101
101
|
* 13px type visibly heavier than the same weight on white, which is the *glare* he is
|
|
102
|
-
* reading as brightness — dimming the
|
|
102
|
+
* reading as brightness — dimming the color alone leaves the letterforms fat. This is
|
|
103
103
|
* the one lever that thins them, and it is scoped to dark because on a light ground it
|
|
104
104
|
* would make the same text too faint.
|
|
105
105
|
*/
|
|
@@ -401,7 +401,7 @@
|
|
|
401
401
|
* It should look like vscode looks instead."*
|
|
402
402
|
*
|
|
403
403
|
* It was a 16% accent wash plus a 2px accent bar down the leading edge: two cues, both
|
|
404
|
-
*
|
|
404
|
+
* colored, on a row that is already the only one carrying them. In a sidebar that is mostly
|
|
405
405
|
* rows, the eye reads that as an alert rather than as a cursor.
|
|
406
406
|
*
|
|
407
407
|
* VS Code's reading, which is what he asked for and what `cursed-embeddable-spreadsheet` does:
|
|
@@ -427,7 +427,7 @@
|
|
|
427
427
|
* BETWEEN the root and the selection are weighted a step, and the shut folder actually
|
|
428
428
|
* holding it takes a mark of its own.
|
|
429
429
|
*
|
|
430
|
-
* Weight rather than
|
|
430
|
+
* Weight rather than color for the ancestors: they are context, and three tinted rows down a
|
|
431
431
|
* sidebar would compete with the one neutral fill that says *this is where you are*. 550 is
|
|
432
432
|
* `file-tree-geometry`'s `maxWeight` — the ceiling the "use thinner fonts" note put on this
|
|
433
433
|
* tree, and the reason this is not 600.
|
|
@@ -586,7 +586,7 @@
|
|
|
586
586
|
|
|
587
587
|
The row's height is NOT a function of this — it is pinned to `--cbft-glyph` by
|
|
588
588
|
fleet/standards/file-tree-geometry.json's `row === glyph + pad * 2`, so a thumbnail can
|
|
589
|
-
never make one row taller than its
|
|
589
|
+
never make one row taller than its neighbors. */
|
|
590
590
|
.cbft-thumb {
|
|
591
591
|
flex: 0 0 var(--cbft-glyph);
|
|
592
592
|
inline-size: var(--cbft-glyph);
|
|
@@ -757,7 +757,7 @@
|
|
|
757
757
|
*
|
|
758
758
|
* It is the only thing on the row in the folder that says *"this is also at the top"*, and a
|
|
759
759
|
* state mark that is invisible until hovered is a state nobody can scan for — the same
|
|
760
|
-
* failure the shelf's 40% floor exists to prevent, one step further. The
|
|
760
|
+
* failure the shelf's 40% floor exists to prevent, one step further. The color is the
|
|
761
761
|
* accent, which is this tree's one strong mark and correct here for the same reason it is
|
|
762
762
|
* correct on the focus ring: it answers a different question from "where am I".
|
|
763
763
|
*/
|
|
@@ -771,7 +771,7 @@
|
|
|
771
771
|
|
|
772
772
|
/*
|
|
773
773
|
* Filled, not outlined — the one-glance difference between pinned and pinnable, and the half
|
|
774
|
-
* of it that survives for anyone who cannot see the
|
|
774
|
+
* of it that survives for anyone who cannot see the color change at all.
|
|
775
775
|
*
|
|
776
776
|
* 🔴 On the `<svg>` itself, not inherited from the button. The element carries `fill="none"`
|
|
777
777
|
* as a presentation attribute, and a presentation attribute on an element beats a value
|
|
@@ -919,7 +919,7 @@
|
|
|
919
919
|
*
|
|
920
920
|
* Quiet rather than loud, and it has to be both: loud enough to find on one row in thirty,
|
|
921
921
|
* quiet enough that three of them down a sidebar are not what the eye lands on first. 11px of
|
|
922
|
-
* emoji at 75% opacity is about where the
|
|
922
|
+
* emoji at 75% opacity is about where the gray row text sits.
|
|
923
923
|
*
|
|
924
924
|
* 🔴 `margin-inline-start: auto` pushes it to the row's END, so it does not move with the name's
|
|
925
925
|
* length and does not displace the count or the tool shelf beside it. `flex: none` so a long
|
|
@@ -954,7 +954,7 @@
|
|
|
954
954
|
/*
|
|
955
955
|
* Two parts, not one string: what is held, and where it is going. The destination is drawn a
|
|
956
956
|
* step quieter because the name is what identifies the chip and the destination is what you
|
|
957
|
-
* are checking — and because a refusal takes the same slot, where the
|
|
957
|
+
* are checking — and because a refusal takes the same slot, where the color below is what
|
|
958
958
|
* carries the "no".
|
|
959
959
|
*/
|
|
960
960
|
.cbft-chip-name {
|
|
@@ -988,7 +988,7 @@
|
|
|
988
988
|
background: var(--surface-raised, var(--card));
|
|
989
989
|
color: var(--foreground);
|
|
990
990
|
font-size: 0.75rem;
|
|
991
|
-
/* A cast shadow, not a surface
|
|
991
|
+
/* A cast shadow, not a surface color: it has to darken whatever is behind the chip, and
|
|
992
992
|
the chip is over arbitrary app chrome in both themes. A token here would tint a shadow.
|
|
993
993
|
guardrails-ignore no-hardcoded-colors: see above. */
|
|
994
994
|
box-shadow: 0 8px 24px -12px rgb(0 0 0 / 0.45);
|
|
@@ -1056,9 +1056,9 @@
|
|
|
1056
1056
|
}
|
|
1057
1057
|
|
|
1058
1058
|
/*
|
|
1059
|
-
* Tag dots — Finder's: a few
|
|
1060
|
-
* hover. The
|
|
1061
|
-
* same tag is the same
|
|
1059
|
+
* Tag dots — Finder's: a few colored dots after the name, one per tag, the rest in the
|
|
1060
|
+
* hover. The color is the tag's NAME hashed onto the theme's chart palette (`tagHue`), so the
|
|
1061
|
+
* same tag is the same color everywhere without anyone choosing or storing a color.
|
|
1062
1062
|
*/
|
|
1063
1063
|
.cbft-tagdots {
|
|
1064
1064
|
flex: none;
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* Owner, 2026-09-10: *"We have two sidenav components now. I need updates and we need them
|
|
6
6
|
* in two places because of the copying."* The two are this one and
|
|
7
7
|
* `cursed-embeddable-spreadsheet`'s, and they cannot be merged into one — the two ship as
|
|
8
|
-
* separate published packages, and cb's tree is a deliberate
|
|
8
|
+
* separate published packages, and cb's tree is a deliberate generalization that has fewer
|
|
9
9
|
* features than ces's, not the same ones. The full reasoning is in the spec file this reads.
|
|
10
10
|
*
|
|
11
11
|
* So the design is shared and the code is not, and this is the seam that keeps the design
|
|
@@ -154,15 +154,15 @@ describe('the file tree geometry', () => {
|
|
|
154
154
|
});
|
|
155
155
|
|
|
156
156
|
/*
|
|
157
|
-
* ── The shared
|
|
157
|
+
* ── The shared BEHAVIOR, not just the numbers ────────────────────────────────────────
|
|
158
158
|
*
|
|
159
159
|
* 🔴 Each of these asserts the shared file's claim against THIS tree's implementation,
|
|
160
160
|
* never against itself. A test that read `true` out of the JSON and then asserted `true`
|
|
161
161
|
* would pass on a tree that does neither thing — it would gate nothing while looking
|
|
162
|
-
* exactly like a gate. So the flag is the CONDITION and the
|
|
162
|
+
* exactly like a gate. So the flag is the CONDITION and the behavior is the assertion:
|
|
163
163
|
* flip the flag in the design file and this suite reds until the code here follows it.
|
|
164
164
|
*/
|
|
165
|
-
it('declares every
|
|
165
|
+
it('declares every behavior flag this suite asserts against', () => {
|
|
166
166
|
// The fixture is the CONDITION for the two tests below, so a missing key would turn
|
|
167
167
|
// each of them into a silent pass — the exact failure mode that vendoring it fixed.
|
|
168
168
|
expect(Object.keys(DESIGN.behaviour).sort()).toEqual(
|
|
@@ -182,7 +182,7 @@ describe('the file tree geometry', () => {
|
|
|
182
182
|
// · one glyph box, never a second track — the box is `--cbft-glyph` wide either way;
|
|
183
183
|
// · the row height does not move — `.cbft-thumb` declares no height of its own beyond it;
|
|
184
184
|
// · it crops rather than letterboxes, which is what makes 16px legible at all.
|
|
185
|
-
// The fallback-once rule is DOM
|
|
185
|
+
// The fallback-once rule is DOM behavior and is pinned in `FileTree.spec.tsx`.
|
|
186
186
|
expect(CSS.includes('.cbft-thumb')).toBe(declared.value);
|
|
187
187
|
const thumb = CSS.slice(CSS.indexOf('.cbft-thumb {'));
|
|
188
188
|
expect(thumb).toContain('inline-size: var(--cbft-glyph);');
|
|
@@ -28,8 +28,8 @@
|
|
|
28
28
|
* `src/noPathDeps.spec.ts`, so the model's other half would have to be published there first
|
|
29
29
|
* and picked up here by a version bump — two packages, two publishes, for one feature.
|
|
30
30
|
*
|
|
31
|
-
* So the SPLIT the model half exists for is
|
|
32
|
-
* rules reachable without a renderer) and the package boundary is
|
|
31
|
+
* So the SPLIT the model half exists for is honored exactly (no DOM, unit-tested, the drop
|
|
32
|
+
* rules reachable without a renderer) and the package boundary is honored too. Everything
|
|
33
33
|
* here is built out of `fileTreeModel`'s own primitives rather than re-deriving them, so
|
|
34
34
|
* there is one definition of "legal drop" and this composes it N times.
|
|
35
35
|
*/
|
|
@@ -133,7 +133,7 @@ export interface ResolveMultiDropOptions extends Omit<ResolveDropOptions, 'dragI
|
|
|
133
133
|
* The first refusal's WORDS are what comes back, so the chip says which rule was broken
|
|
134
134
|
* rather than "some of these cannot go there".
|
|
135
135
|
*
|
|
136
|
-
* Every per-row rule is therefore
|
|
136
|
+
* Every per-row rule is therefore honored N times over, out of one definition: the
|
|
137
137
|
* descendant rule (a folder cannot go inside itself, and now also cannot go inside a folder
|
|
138
138
|
* being dragged beside it), `acceptsDrop`, and the consumer's `canDrop` — which is called
|
|
139
139
|
* once per dragged id, so a veto that depends on WHICH row is moving still gets asked about
|
|
@@ -301,7 +301,7 @@ export function nodesByIds(
|
|
|
301
301
|
return out;
|
|
302
302
|
}
|
|
303
303
|
|
|
304
|
-
/** `findFileTreeNode` without the full depth-first
|
|
304
|
+
/** `findFileTreeNode` without the full depth-first materialization it does per call. */
|
|
305
305
|
function nodeById(nodes: readonly FileTreeNode[], id: string): FileTreeNode | null {
|
|
306
306
|
for (const node of nodes) {
|
|
307
307
|
if (node.id === id) return node;
|
|
@@ -189,7 +189,7 @@ describe('tags', () => {
|
|
|
189
189
|
expect(tagCounts(marks).some((t) => t.tag === 'code')).toBe(false);
|
|
190
190
|
});
|
|
191
191
|
|
|
192
|
-
test('a tag is always the same
|
|
192
|
+
test('a tag is always the same color, and always one of the palette', () => {
|
|
193
193
|
expect(tagHue('home')).toBe(tagHue('home'));
|
|
194
194
|
for (const tag of ['home', 'work', 'code', 'dynatrace', 'x'])
|
|
195
195
|
expect(tagHue(tag)).toBeLessThan(TAG_HUES);
|
|
@@ -229,12 +229,12 @@ export function tagCounts(marks: FolderMarks): TagCount[] {
|
|
|
229
229
|
.sort((a, b) => b.count - a.count || a.tag.localeCompare(b.tag));
|
|
230
230
|
}
|
|
231
231
|
|
|
232
|
-
/** How many
|
|
232
|
+
/** How many colors a tag dot can be — `--cbft-tag-0` … `--cbft-tag-7` in fileTree.css. */
|
|
233
233
|
export const TAG_HUES = 8;
|
|
234
234
|
|
|
235
235
|
/**
|
|
236
|
-
* A tag's
|
|
237
|
-
* device, without a
|
|
236
|
+
* A tag's color slot, from its name — the same tag is the same color in every app, on every
|
|
237
|
+
* device, without a color having to be chosen or stored. FNV-1a, because it is four lines and
|
|
238
238
|
* spreads short words well.
|
|
239
239
|
*/
|
|
240
240
|
export function tagHue(tag: string): number {
|
|
@@ -67,7 +67,7 @@ describe('FilterRail — the three-state affordance', () => {
|
|
|
67
67
|
const { container } = renderRail();
|
|
68
68
|
const active = container.querySelector('[data-cb-rail-row="active"]') as HTMLElement;
|
|
69
69
|
expect(active.className).toContain('bg-card-overlay');
|
|
70
|
-
// The second, non-
|
|
70
|
+
// The second, non-color channel. `inset` box-shadow rather than a border so the row's
|
|
71
71
|
// box does not change size between states and the list cannot twitch under the pointer.
|
|
72
72
|
expect(active.className).toContain('inset_3px_0_0_0');
|
|
73
73
|
});
|
|
@@ -46,7 +46,7 @@ export interface FilterRailItem {
|
|
|
46
46
|
* Omit on a row that simply selects.
|
|
47
47
|
*/
|
|
48
48
|
pressed?: boolean;
|
|
49
|
-
/** The host's own tone for this row — a tag's
|
|
49
|
+
/** The host's own tone for this row — a tag's color. Painted over the row's resting state. */
|
|
50
50
|
style?: CSSProperties;
|
|
51
51
|
/**
|
|
52
52
|
* Per-row controls — a rename pencil, a privacy padlock, a delete.
|
|
@@ -72,7 +72,7 @@ export interface FilterRailItem {
|
|
|
72
72
|
*
|
|
73
73
|
* Put real buttons in here — an {@link IconButton} is the right one, and the shelf gives
|
|
74
74
|
* every button inside it the 44px coarse-pointer floor (DESIGN.md §5) whatever it is.
|
|
75
|
-
* The rail gives them their visibility, not their
|
|
75
|
+
* The rail gives them their visibility, not their behavior.
|
|
76
76
|
*/
|
|
77
77
|
tools?: ReactNode;
|
|
78
78
|
/**
|
|
@@ -240,7 +240,7 @@ export interface FilterRailProps {
|
|
|
240
240
|
* *"The sidebar looks especially poor as it's hard to tell what is hovered and clickable
|
|
241
241
|
* as I move over it."* A single background step is not enough — `raised` and `overlay`
|
|
242
242
|
* are deliberately one step apart, which is right for a card on a page and far too quiet
|
|
243
|
-
* for a list you are sweeping a pointer down. So SELECTED gets a **second, non-
|
|
243
|
+
* for a list you are sweeping a pointer down. So SELECTED gets a **second, non-color
|
|
244
244
|
* channel**: an accent rail down its inside edge, painted with `box-shadow: inset` rather
|
|
245
245
|
* than a border so the row's box does not change size between states (a 3px border on
|
|
246
246
|
* selection shifts every label 3px and the list appears to twitch under the pointer).
|
|
@@ -454,7 +454,7 @@ function FilterRailRow({
|
|
|
454
454
|
const title = item.title ?? (typeof item.label === 'string' ? item.label : undefined);
|
|
455
455
|
|
|
456
456
|
return (
|
|
457
|
-
// biome-ignore lint/a11y/noStaticElementInteractions: a drop target is a POINTER gesture with no keyboard equivalent, and everything a drop does here is also reachable from the row's own `tools` — so there is no
|
|
457
|
+
// biome-ignore lint/a11y/noStaticElementInteractions: a drop target is a POINTER gesture with no keyboard equivalent, and everything a drop does here is also reachable from the row's own `tools` — so there is no behavior to mirror onto a key handler, and giving this wrapper a role would announce a second control a keyboard user can never operate.
|
|
458
458
|
<div
|
|
459
459
|
// `group/rail-row` is what the tools hang their reveal off; see `FilterRailItem.tools`.
|
|
460
460
|
// A drag is a POINTER gesture with no keyboard equivalent, and everything a drop does
|
|
@@ -13,7 +13,7 @@ const COLOURS = (
|
|
|
13
13
|
// guardrails-ignore no-raw-action-button: spec fixture, not a real control
|
|
14
14
|
type='button'
|
|
15
15
|
>
|
|
16
|
-
|
|
16
|
+
Colors
|
|
17
17
|
</button>
|
|
18
18
|
);
|
|
19
19
|
|
|
@@ -40,7 +40,7 @@ describe('RailSection', () => {
|
|
|
40
40
|
</RailSection>,
|
|
41
41
|
);
|
|
42
42
|
expect(toggle('Tags').textContent).toBe('Tags');
|
|
43
|
-
fireEvent.click(screen.getByRole('button', { name: '
|
|
43
|
+
fireEvent.click(screen.getByRole('button', { name: 'Colors' }));
|
|
44
44
|
expect(toggle('Tags').getAttribute('aria-expanded')).toBe('true');
|
|
45
45
|
});
|
|
46
46
|
|
|
@@ -17,7 +17,7 @@ import { RAW_BUTTON } from '../lib/cn.js';
|
|
|
17
17
|
* So a sidebar section is one shape everywhere, and this is it: a small-caps heading that is
|
|
18
18
|
* ITSELF the toggle (a chevron in front, `aria-expanded` on the button), an `action` slot beside
|
|
19
19
|
* it for the section's own controls — an ⓘ, a 🎨, a "+" — and the body. `FilterRail` draws its
|
|
20
|
-
*
|
|
20
|
+
* labeled sections with it (`FilterRailSection.collapsible`), and a hand-built rail that cannot
|
|
21
21
|
* be a `FilterRail` (music's, whose rows are drop targets and toggles) mounts it directly.
|
|
22
22
|
*
|
|
23
23
|
* ── Remembered, and remembered on the SERVER when the app wants it ──────────────────────────
|
|
@@ -121,7 +121,7 @@ export function useRailResize<E extends HTMLElement = HTMLElement>({
|
|
|
121
121
|
}
|
|
122
122
|
|
|
123
123
|
/**
|
|
124
|
-
* The handle itself — a 12px hotspot
|
|
124
|
+
* The handle itself — a 12px hotspot centered on the rail's right border. The RAIL must be
|
|
125
125
|
* `position: relative` (the handle is absolutely positioned against it). Renders nothing while
|
|
126
126
|
* the resize is inactive.
|
|
127
127
|
*
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
* the theme classes, no `<ol>`/`<li>` semantics, no `aria-current`, and a
|
|
10
10
|
* `truncate` with nothing behind it. That was the fleet's THIRD breadcrumb
|
|
11
11
|
* implementation, and the reason "fix the breadcrumb" had to be done three
|
|
12
|
-
* times. It now
|
|
12
|
+
* times. It now normalizes its path into {@link BreadcrumbTrailNode}s and hands
|
|
13
13
|
* them to {@link BreadcrumbTrail}, so notes, vault and `FolderPicker` inherit
|
|
14
14
|
* the overflow engine, the truncation tooltips and the 12px gap for free.
|
|
15
15
|
*
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
* would otherwise re-type: the affordance, the inline field, the name rules
|
|
22
22
|
* (`isValidFolderName`, so an illegal name is refused BEFORE a round trip and
|
|
23
23
|
* says why), the duplicate check against the siblings that already exist, and
|
|
24
|
-
* the Enter/Escape
|
|
24
|
+
* the Enter/Escape behavior.
|
|
25
25
|
*
|
|
26
26
|
* ── Name collisions are refused HERE, not by the server ────────────────────
|
|
27
27
|
* Folder identity is case-insensitive in this model ("Work" and "work" are one
|
|
@@ -93,7 +93,7 @@ describe('announcements', () => {
|
|
|
93
93
|
'Dropped Card A, position 3 of 3.',
|
|
94
94
|
);
|
|
95
95
|
expect(cancelAnnouncement({ label: 'Card A' })).toBe(
|
|
96
|
-
'Movement
|
|
96
|
+
'Movement canceled. Card A returned to its starting position.',
|
|
97
97
|
);
|
|
98
98
|
});
|
|
99
99
|
|
|
@@ -121,9 +121,9 @@ export function dropAnnouncement(c: DragAnnouncementContext): string {
|
|
|
121
121
|
return `Dropped ${c.label}${positionSuffix(c)}.`;
|
|
122
122
|
}
|
|
123
123
|
|
|
124
|
-
/** "Movement
|
|
124
|
+
/** "Movement canceled. X returned to its starting position." */
|
|
125
125
|
export function cancelAnnouncement(c: DragAnnouncementContext): string {
|
|
126
|
-
return `Movement
|
|
126
|
+
return `Movement canceled. ${c.label} returned to its starting position.`;
|
|
127
127
|
}
|
|
128
128
|
|
|
129
129
|
// --- Hooks -------------------------------------------------------------------------
|
|
@@ -182,8 +182,8 @@ describe('createTouchDragSession', () => {
|
|
|
182
182
|
const h = harness();
|
|
183
183
|
h.session.pointerDown({ x: 0, y: 0 });
|
|
184
184
|
h.session.pointerMove({ x: 0, y: 40 });
|
|
185
|
-
expect(h.isScheduled()).toBe(false); // pending activation was
|
|
186
|
-
h.fireLongPress(); // firing a
|
|
185
|
+
expect(h.isScheduled()).toBe(false); // pending activation was canceled
|
|
186
|
+
h.fireLongPress(); // firing a canceled timer is a no-op
|
|
187
187
|
expect(h.session.isActive()).toBe(false);
|
|
188
188
|
expect(h.events).toHaveLength(0);
|
|
189
189
|
});
|
|
@@ -273,7 +273,7 @@ describe('wireTouchDragSource (DOM glue)', () => {
|
|
|
273
273
|
expect(touchMove()).toBe(false); // still waiting: the browser may scroll
|
|
274
274
|
expect(menu()).toBe(true); // the long press is ours, not Android's menu
|
|
275
275
|
await Bun.sleep(20);
|
|
276
|
-
expect(touchMove()).toBe(true); // the drag is live: the pan is
|
|
276
|
+
expect(touchMove()).toBe(true); // the drag is live: the pan is canceled
|
|
277
277
|
cleanup();
|
|
278
278
|
expect(touchMove()).toBe(false);
|
|
279
279
|
element.remove();
|
|
@@ -171,7 +171,7 @@ export interface TouchDragSessionConfig {
|
|
|
171
171
|
onEnd: () => void;
|
|
172
172
|
delayMs: number;
|
|
173
173
|
tolerancePx: number;
|
|
174
|
-
/** Schedule activation after `delayMs`; returns a
|
|
174
|
+
/** Schedule activation after `delayMs`; returns a canceler. Injected for tests. */
|
|
175
175
|
schedule: (callback: () => void, ms: number) => () => void;
|
|
176
176
|
}
|
|
177
177
|
|
|
@@ -332,7 +332,7 @@ function elementsFromPointSafe(x: number, y: number): Element[] {
|
|
|
332
332
|
* `@dnd-kit`'s TouchSensor does it. This used to set `touch-action: none` on the element, and
|
|
333
333
|
* on a phone a board whose columns are full of cards could not be swiped or scrolled from any
|
|
334
334
|
* card (forge task 3033, seen on vault-stage at 390). While a press is in flight the
|
|
335
|
-
* long-press `contextmenu` (Android's menu) is
|
|
335
|
+
* long-press `contextmenu` (Android's menu) is canceled too.
|
|
336
336
|
*
|
|
337
337
|
* The `pointerdown` listener lives on the element; the `pointermove`/`up`/`cancel`/
|
|
338
338
|
* `keydown` listeners are only attached on the `window` for the life of one interaction
|
|
@@ -21,7 +21,7 @@ function B(props: ButtonHTMLAttributes<HTMLButtonElement> & { ref?: Ref<HTMLButt
|
|
|
21
21
|
/**
|
|
22
22
|
* The shape music's folder tree has (2026-09-27): a panel that is always rendered and only
|
|
23
23
|
* becomes an overlay when a toggle says so — so it cannot be a Popover, and needs the same
|
|
24
|
-
* tap-away
|
|
24
|
+
* tap-away behavior anyway.
|
|
25
25
|
*/
|
|
26
26
|
function Panel({ modal = false, onRow = () => {} }: { modal?: boolean; onRow?: () => void }) {
|
|
27
27
|
const [open, setOpen] = useState(false);
|
|
@@ -9,13 +9,13 @@ import { useCallback, useEffect, useRef } from 'react';
|
|
|
9
9
|
* leaks (capture releases on up/cancel, and unmount cleans up mid-drag).
|
|
10
10
|
* - `onMove` receives the cumulative delta from the drag origin plus the raw
|
|
11
11
|
* event (for modifier keys); `onEnd` fires exactly once with the final delta
|
|
12
|
-
* and whether the drag was
|
|
12
|
+
* and whether the drag was canceled (Escape).
|
|
13
13
|
* - Returns the props to spread on the handle element.
|
|
14
14
|
*
|
|
15
15
|
* ```tsx
|
|
16
16
|
* const trim = usePointerDrag({
|
|
17
17
|
* onMove: ({ dx }) => preview(pxToSeconds(dx, zoom)),
|
|
18
|
-
* onEnd: ({ dx,
|
|
18
|
+
* onEnd: ({ dx, canceled }) => (canceled ? preview(0) : commit(pxToSeconds(dx, zoom))),
|
|
19
19
|
* });
|
|
20
20
|
* <div {...trim.handleProps} className='… cursor-ew-resize' />
|
|
21
21
|
* ```
|