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 @@ export interface SectionNavItem {
|
|
|
9
9
|
/** Trailing mark, e.g. a dot for unsaved changes. */
|
|
10
10
|
marker?: ReactNode;
|
|
11
11
|
/** Words for the marker — the item's hint on hover and on a touch-and-hold, and part of its
|
|
12
|
-
* accessible name, so the mark is never
|
|
12
|
+
* accessible name, so the mark is never color alone. */
|
|
13
13
|
markerLabel?: string;
|
|
14
14
|
/** Refuses the item and says why (Button's `unavailableReason`): drawn disabled, still
|
|
15
15
|
* focusable and hoverable so the reason is reachable. */
|
|
@@ -28,7 +28,7 @@ export interface SectionNavProps {
|
|
|
28
28
|
}
|
|
29
29
|
|
|
30
30
|
/**
|
|
31
|
-
* The section selector of a settings page — the
|
|
31
|
+
* The section selector of a settings page — the labeled list beside the form that Linear,
|
|
32
32
|
* GitHub and Vercel settings all draw. From `md` (768px) up it is a vertical column of
|
|
33
33
|
* full-width rows; below it, one line that scrolls sideways above the form, the active section
|
|
34
34
|
* kept in view.
|
|
@@ -39,7 +39,7 @@ export interface SectionNavProps {
|
|
|
39
39
|
* A refused item stays in that traversal on purpose — its reason is only reachable focused.
|
|
40
40
|
*
|
|
41
41
|
* `list-none m-0 p-0` and an explicit ground on every item: some hosts (desk) mount this with no
|
|
42
|
-
* Tailwind preflight, where a bare `<ul>` has bullets and a `<button>` the browser's
|
|
42
|
+
* Tailwind preflight, where a bare `<ul>` has bullets and a `<button>` the browser's gray box.
|
|
43
43
|
*/
|
|
44
44
|
export function SectionNav({ items, value, onValueChange, 'aria-label': ariaLabel, className, ...rest }: SectionNavProps) {
|
|
45
45
|
const refs = useRef(new Map<string, HTMLButtonElement>());
|
|
@@ -41,7 +41,7 @@ function Picker({ Field, onPick }: { Field: typeof SelectField; onPick?: (v: str
|
|
|
41
41
|
}
|
|
42
42
|
|
|
43
43
|
/**
|
|
44
|
-
* A BYTE contract as much as a
|
|
44
|
+
* A BYTE contract as much as a behavioral one: a SelectField on an app's entry chunk hoisted
|
|
45
45
|
* Radix Select there (+29.20 kB gzip in music, forge task 3096), so the Radix select is its own
|
|
46
46
|
* chunk and this file is a trigger.
|
|
47
47
|
*/
|
|
@@ -79,7 +79,7 @@ export function Slider({
|
|
|
79
79
|
data-cb-slider-tick=''
|
|
80
80
|
className='pointer-events-none absolute bottom-0 h-1 w-px -translate-x-1/2 bg-border-strong'
|
|
81
81
|
// Radix keeps the thumb inside the track, so its centre runs from half a thumb in at `min`
|
|
82
|
-
// to half a thumb in from the end at `max`; a tick sits where the thumb's
|
|
82
|
+
// to half a thumb in from the end at `max`; a tick sits where the thumb's center would.
|
|
83
83
|
style={{ left: `calc(0.5rem + (100% - 1rem) * ${(tick - min) / (max - min)})` }}
|
|
84
84
|
/>
|
|
85
85
|
))}
|
|
@@ -60,7 +60,7 @@ describe('StarRating — whole steps render real buttons', () => {
|
|
|
60
60
|
|
|
61
61
|
test('🔴 a click does not reach the row underneath — the SLIDER branch too', () => {
|
|
62
62
|
// The two affordances are two code paths, and only the button one had this.
|
|
63
|
-
// Stopping `pointerdown` does NOT stop the `click` the browser
|
|
63
|
+
// Stopping `pointerdown` does NOT stop the `click` the browser synthesizes
|
|
64
64
|
// after it, so every fractional rating in apps/music also started the track
|
|
65
65
|
// the moment it moved to step={0.25} (owner, 2026-08-25).
|
|
66
66
|
const onRowClick = mock(() => {});
|
|
@@ -125,13 +125,13 @@ describe('StarRating — fractional steps render a slider', () => {
|
|
|
125
125
|
expect(onChange).toHaveBeenLastCalledWith(0);
|
|
126
126
|
});
|
|
127
127
|
|
|
128
|
-
test('🔴 a step that is not a binary fraction never emits a float
|
|
128
|
+
test('🔴 a step that is not a binary fraction never emits a float artifact', () => {
|
|
129
129
|
// Quarters are exactly representable, so `step={0.25}` is safe by accident —
|
|
130
130
|
// which is precisely why the guard needs a test that does not use it. 0.2 +
|
|
131
131
|
// 0.1 is 0.30000000000000004, and persisted, that is a rating no other code
|
|
132
132
|
// path will ever produce again: equality ("press the value you have to clear
|
|
133
133
|
// it") silently stops working on that row, forever.
|
|
134
|
-
expect(0.2 + 0.1).not.toBe(0.3); // the
|
|
134
|
+
expect(0.2 + 0.1).not.toBe(0.3); // the artifact is real, not hypothetical
|
|
135
135
|
const onChange = mock((_: number) => {});
|
|
136
136
|
const { getByRole } = render(<StarRating value={0.2} onChange={onChange} step={0.1} />);
|
|
137
137
|
fireEvent.keyDown(getByRole('slider'), { key: 'ArrowRight' });
|
|
@@ -206,7 +206,7 @@ describe('StarRating — read-only', () => {
|
|
|
206
206
|
});
|
|
207
207
|
|
|
208
208
|
describe('StarRating — max', () => {
|
|
209
|
-
test('
|
|
209
|
+
test('honors a non-default star count in both the row and the labels', () => {
|
|
210
210
|
const { getAllByRole } = render(<StarRating value={0} onChange={() => {}} max={10} />);
|
|
211
211
|
const buttons = getAllByRole('button');
|
|
212
212
|
expect(buttons).toHaveLength(10);
|
|
@@ -94,7 +94,7 @@ function Star({ fill }: { fill: number }) {
|
|
|
94
94
|
(measured ~1.1:1 on music's canvas).
|
|
95
95
|
Filled and empty still differ by WEIGHT as well as hue (the reason this
|
|
96
96
|
is not simply a paler gold — measured 1.63:1 on a light card when both
|
|
97
|
-
were the same
|
|
97
|
+
were the same color); the weight now comes from the token, which is
|
|
98
98
|
audited per theme, instead of from an alpha that only ever worked on one
|
|
99
99
|
of them. The `--border-strong` fallback keeps this readable in a host
|
|
100
100
|
that has not adopted the token yet. */}
|
|
@@ -154,7 +154,7 @@ export function StarRating({
|
|
|
154
154
|
return (
|
|
155
155
|
// No `role="group"` wrapper, and that is deliberate (apps/music's original
|
|
156
156
|
// reasoning, kept): each button's accessible name already carries the label
|
|
157
|
-
// ("Rate 3 out of 5 on A Song"), so a
|
|
157
|
+
// ("Rate 3 out of 5 on A Song"), so a labeled group announces the same thing
|
|
158
158
|
// twice and adds nothing a screen reader does not already have.
|
|
159
159
|
<span {...rest} className={cn('inline-flex w-fit gap-0.5', className)}>
|
|
160
160
|
{stars.map((i) => {
|
|
@@ -250,7 +250,7 @@ export function StarRating({
|
|
|
250
250
|
/*
|
|
251
251
|
* 🔴 The CLICK has to be stopped as well as the pointerdown, and they are two
|
|
252
252
|
* events: stopping `pointerdown` does not stop the `click` the browser
|
|
253
|
-
*
|
|
253
|
+
* synthesizes after it. The whole-star branch above already carries this — a
|
|
254
254
|
* rating control very often sits inside a row that is itself click-to-open, and
|
|
255
255
|
* apps/music's track row PLAYS on a plain click — and the slider branch was
|
|
256
256
|
* missing it, so every fractional rating also started the track. It only became
|
|
@@ -5,7 +5,7 @@ import { type SwatchOption, SwatchPicker } from './SwatchPicker.js';
|
|
|
5
5
|
afterEach(cleanup);
|
|
6
6
|
|
|
7
7
|
const OPTIONS: SwatchOption[] = [
|
|
8
|
-
{ value: '', none: true, label: 'No
|
|
8
|
+
{ value: '', none: true, label: 'No color' },
|
|
9
9
|
{ value: '1', color: 'var(--chart-1)', label: 'Red' },
|
|
10
10
|
{ value: '2', color: 'var(--chart-2)', label: 'Green' },
|
|
11
11
|
{ value: '3', color: 'var(--chart-3)', label: 'Blue' },
|
|
@@ -19,10 +19,10 @@ const radios = (getAllByRole: (role: string) => HTMLElement[]) => getAllByRole('
|
|
|
19
19
|
describe('SwatchPicker', () => {
|
|
20
20
|
test('one named radiogroup, one radio per swatch, named by its label — and no native `title` (DESIGN.md §4)', () => {
|
|
21
21
|
const { getByRole, getAllByRole, container } = render(
|
|
22
|
-
<SwatchPicker aria-label='Card
|
|
22
|
+
<SwatchPicker aria-label='Card color' options={OPTIONS} value='2' onChange={() => {}} />,
|
|
23
23
|
);
|
|
24
|
-
expect(getByRole('radiogroup').getAttribute('aria-label')).toBe('Card
|
|
25
|
-
expect(radios(getAllByRole).map((r) => r.getAttribute('aria-label'))).toEqual(['No
|
|
24
|
+
expect(getByRole('radiogroup').getAttribute('aria-label')).toBe('Card color');
|
|
25
|
+
expect(radios(getAllByRole).map((r) => r.getAttribute('aria-label'))).toEqual(['No color', 'Red', 'Green', 'Blue']);
|
|
26
26
|
expect(radios(getAllByRole).map((r) => r.getAttribute('aria-checked'))).toEqual(['false', 'false', 'true', 'false']);
|
|
27
27
|
expect(container.querySelector('[title]')).toBeNull();
|
|
28
28
|
});
|
|
@@ -13,7 +13,7 @@ interface SwatchOptionBase<T extends string> {
|
|
|
13
13
|
disabled?: boolean;
|
|
14
14
|
}
|
|
15
15
|
|
|
16
|
-
/** One swatch: a
|
|
16
|
+
/** One swatch: a color — or, with `none`, the "no color" choice, drawn as the ground struck through. */
|
|
17
17
|
export type SwatchOption<T extends string = string> = SwatchOptionBase<T> &
|
|
18
18
|
(
|
|
19
19
|
| {
|
|
@@ -22,7 +22,7 @@ export type SwatchOption<T extends string = string> = SwatchOptionBase<T> &
|
|
|
22
22
|
none?: undefined;
|
|
23
23
|
}
|
|
24
24
|
| {
|
|
25
|
-
/** The "no
|
|
25
|
+
/** The "no color" swatch (a fill cleared, an accent removed): the card ground with a slash. */
|
|
26
26
|
none: true;
|
|
27
27
|
color?: undefined;
|
|
28
28
|
}
|
|
@@ -34,15 +34,15 @@ export interface SwatchPickerProps<T extends string = string> {
|
|
|
34
34
|
onChange: (value: T) => void;
|
|
35
35
|
/** Swatch diameter: `sm` 1.5rem, `md` (default) 1.75rem, `lg` 2.25rem. */
|
|
36
36
|
size?: 'sm' | 'md' | 'lg';
|
|
37
|
-
/** `dot` (default) is round; `tile` is a rounded square — a palette's chip (Excel's
|
|
37
|
+
/** `dot` (default) is round; `tile` is a rounded square — a palette's chip (Excel's color grid). */
|
|
38
38
|
shape?: 'dot' | 'tile';
|
|
39
39
|
/** Lay the swatches out as a grid this many across (a 2-D palette) instead of one wrapping row. */
|
|
40
40
|
columns?: number;
|
|
41
41
|
/**
|
|
42
42
|
* `automatic` (default): the arrow keys move the choice, as a radio group's do — right for a
|
|
43
|
-
* value being SET (an accent, a series
|
|
43
|
+
* value being SET (an accent, a series color). `manual`: the arrows only move focus, and
|
|
44
44
|
* Enter, Space or a click picks — including the swatch already checked, which reports again.
|
|
45
|
-
* Right for a palette that APPLIES a
|
|
45
|
+
* Right for a palette that APPLIES a color (a format menu, a selection's toolbar), where every
|
|
46
46
|
* arrow press would otherwise be an edit and the first one would close the menu. The words are
|
|
47
47
|
* Radix Tabs' `activationMode`.
|
|
48
48
|
*/
|
|
@@ -54,7 +54,7 @@ export interface SwatchPickerProps<T extends string = string> {
|
|
|
54
54
|
|
|
55
55
|
const SIZE = { sm: 'size-6', md: 'size-7', lg: 'size-9' } as const;
|
|
56
56
|
const SHAPE = { dot: 'rounded-full', tile: 'rounded-sm' } as const;
|
|
57
|
-
/** "No
|
|
57
|
+
/** "No color": the card ground, struck through corner to corner in the destructive hue. */
|
|
58
58
|
const NONE_FILL =
|
|
59
59
|
'linear-gradient(135deg, transparent calc(50% - 1px), var(--destructive) calc(50% - 1px) calc(50% + 1px), transparent calc(50% + 1px)), var(--card)';
|
|
60
60
|
|
|
@@ -68,7 +68,7 @@ const NONE_FILL =
|
|
|
68
68
|
*
|
|
69
69
|
* This is the shared primitive for every "row of color dots" UI. For the nav
|
|
70
70
|
* accent picker (presets + custom hex + reset) see `ColorSwatchGrid`, which
|
|
71
|
-
* composes this with a native color input; for an accent row with an any-
|
|
71
|
+
* composes this with a native color input; for an accent row with an any-color
|
|
72
72
|
* well, `ColorSwatches`.
|
|
73
73
|
*
|
|
74
74
|
* The checked ring keys off `aria-checked`, not Radix's `data-state`: the tooltip's
|
|
@@ -146,14 +146,14 @@ export function SwatchPicker<T extends string = string>({
|
|
|
146
146
|
SIZE[size],
|
|
147
147
|
SHAPE[shape],
|
|
148
148
|
// A finger needs 44px (DESIGN.md §5): the swatch itself grows on a coarse pointer, since
|
|
149
|
-
// the
|
|
149
|
+
// the color IS the button. A 28px one failed e2e/touch-targets (forge task 2514).
|
|
150
150
|
TAP_TARGET_SQUARE,
|
|
151
151
|
'hover:scale-110 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1',
|
|
152
152
|
'aria-checked:ring-2 aria-checked:ring-foreground aria-checked:ring-offset-1',
|
|
153
153
|
'disabled:cursor-not-allowed disabled:opacity-40 disabled:hover:scale-100',
|
|
154
154
|
)}
|
|
155
155
|
>
|
|
156
|
-
{/* The slash IS the "no
|
|
156
|
+
{/* The slash IS the "no color" mark; a check over it would read as a second glyph. */}
|
|
157
157
|
{opt.none ? null : (
|
|
158
158
|
<RadioGroup.Indicator asChild>
|
|
159
159
|
<Check className='size-3.5 text-white mix-blend-difference' aria-hidden />
|
|
@@ -9,7 +9,7 @@ import { Tooltip, TooltipDelay } from './Tooltip.js';
|
|
|
9
9
|
afterEach(cleanup);
|
|
10
10
|
|
|
11
11
|
/**
|
|
12
|
-
* The contract this file protects is a BYTE one as much as a
|
|
12
|
+
* The contract this file protects is a BYTE one as much as a behavioral one:
|
|
13
13
|
* `Tooltip` is what lands in an app's entry chunk and it must stay dependency-free,
|
|
14
14
|
* with the Radix/floating-ui stack arriving as a separate chunk. See the header of
|
|
15
15
|
* `Tooltip.tsx` for the measurement (≈36 KB in 12 of 13 satellites' entry chunks).
|
|
@@ -65,7 +65,7 @@ describe('Tooltip (lazy)', () => {
|
|
|
65
65
|
test('🔴 a pointer that only PASSES OVER a control never opens it', async () => {
|
|
66
66
|
// The failure the delay exists to prevent, in its exact shape: roms' transport is a
|
|
67
67
|
// row of 32px controls, so reaching the last one drags the cursor across every one
|
|
68
|
-
// before it. At the old 120ms each of those produced a bubble over its
|
|
68
|
+
// before it. At the old 120ms each of those produced a bubble over its neighbor.
|
|
69
69
|
const { getByRole } = render(
|
|
70
70
|
<Tooltip content='Full label'>
|
|
71
71
|
<button
|
|
@@ -412,7 +412,7 @@ describe('TooltipDelay — the person-chosen delay', () => {
|
|
|
412
412
|
);
|
|
413
413
|
});
|
|
414
414
|
|
|
415
|
-
test('a disabled control
|
|
415
|
+
test('a disabled control honors it too', async () => {
|
|
416
416
|
const { getByRole } = render(
|
|
417
417
|
<TooltipDelay ms={slow}>
|
|
418
418
|
<Tooltip content='Load a ROM first'>
|
|
@@ -110,7 +110,7 @@ const OWN_PROPS = new Set([
|
|
|
110
110
|
*
|
|
111
111
|
* `data-state` is the one prop two owners genuinely want: the tooltip's Radix trigger sets
|
|
112
112
|
* its own after this runs, so a wrapped trigger's `data-state` reports the TOOLTIP. That is
|
|
113
|
-
* a styling hook, not a
|
|
113
|
+
* a styling hook, not a behavioral one — Radix reads its own open state from React, never
|
|
114
114
|
* from the DOM — and the alternative (suppressing the tooltip's) breaks the bubble's own
|
|
115
115
|
* animation classes.
|
|
116
116
|
*/
|
|
@@ -163,7 +163,7 @@ function buildParentMap(
|
|
|
163
163
|
return map;
|
|
164
164
|
}
|
|
165
165
|
|
|
166
|
-
/** `:focus-visible`, where the engine knows it; a DOM without it keeps the ring (the old
|
|
166
|
+
/** `:focus-visible`, where the engine knows it; a DOM without it keeps the ring (the old behavior). */
|
|
167
167
|
function isFocusVisible(el: HTMLElement): boolean {
|
|
168
168
|
try {
|
|
169
169
|
return el.matches(':focus-visible');
|
|
@@ -41,7 +41,7 @@ export interface TruncatedTextProps {
|
|
|
41
41
|
* ── Why this exists ─────────────────────────────────────────────────────────
|
|
42
42
|
* `<span className='truncate' title={value}>` is the fleet's most-repeated line
|
|
43
43
|
* and it is a `DESIGN.md` §4 violation everywhere it appears: the native `title`
|
|
44
|
-
* is drawn by the OS after 1–2 seconds, in its own
|
|
44
|
+
* is drawn by the OS after 1–2 seconds, in its own gray box, in the wrong theme,
|
|
45
45
|
* and it does not exist at all on the owner's phone. It is also the exact defect
|
|
46
46
|
* the owner reported against family ("title should show on hover faster") — the
|
|
47
47
|
* delay is the operating system's, so no amount of CSS or JS can tune it. The
|
|
@@ -17,11 +17,11 @@ export interface UnstyledButtonProps extends ButtonHTMLAttributes<HTMLButtonElem
|
|
|
17
17
|
}
|
|
18
18
|
|
|
19
19
|
/**
|
|
20
|
-
* A `<button>` that brings none of the belt's look and all of its
|
|
20
|
+
* A `<button>` that brings none of the belt's look and all of its behavior.
|
|
21
21
|
*
|
|
22
22
|
* Mantine's name for the same thing. For a control whose look is the caller's own — a tab
|
|
23
23
|
* in a deck, a pin in a sidebar, a breadcrumb step — that still has to explain itself and
|
|
24
|
-
* still has to refuse a press it cannot
|
|
24
|
+
* still has to refuse a press it cannot honor. {@link Button} with `asChild` would restyle
|
|
25
25
|
* the child with the button's variants; this adds no class at all, so `className` is the
|
|
26
26
|
* whole of its look.
|
|
27
27
|
*
|
|
@@ -59,7 +59,7 @@ export function AuthCard({
|
|
|
59
59
|
{...rest}
|
|
60
60
|
className={cn(
|
|
61
61
|
'flex w-full flex-col items-center justify-center gap-6 p-4',
|
|
62
|
-
// The page
|
|
62
|
+
// The page color belongs to the full-screen page only. Embedded, the card sits on its
|
|
63
63
|
// host's surface — painting `bg-background` there drew a slab around it, a box on a box
|
|
64
64
|
// inside the host's panel (forge task 2466).
|
|
65
65
|
aurora ? 'dark cb-aurora cb-auth-aurora' : fullScreen && 'bg-background',
|
|
@@ -26,13 +26,13 @@
|
|
|
26
26
|
border-block-start: 1px solid var(--border);
|
|
27
27
|
background: var(--surface-raised, var(--card));
|
|
28
28
|
color: var(--foreground);
|
|
29
|
-
/* A cast shadow lifting the bar off the page, not a surface
|
|
29
|
+
/* A cast shadow lifting the bar off the page, not a surface color — it darkens whatever
|
|
30
30
|
is behind it, in both themes, and a token would tint a shadow.
|
|
31
31
|
guardrails-ignore no-hardcoded-colors: see above. */
|
|
32
32
|
box-shadow: 0 -6px 24px -12px rgb(0 0 0 / 0.35);
|
|
33
33
|
}
|
|
34
34
|
|
|
35
|
-
/* The one bit of
|
|
35
|
+
/* The one bit of color — an update is information, not a failure, so it is the accent and
|
|
36
36
|
not the destructive tone. */
|
|
37
37
|
.cbbf-dot {
|
|
38
38
|
inline-size: 0.5rem;
|
|
@@ -75,9 +75,9 @@ describe('EventChip', () => {
|
|
|
75
75
|
expect(screen.getByRole('button').getAttribute('aria-label')).toMatch(/^\d{1,2}:\d{2}\s?(AM|PM) Stand-up$/);
|
|
76
76
|
});
|
|
77
77
|
|
|
78
|
-
test('a hex
|
|
78
|
+
test('a hex color is a TINT with same-hue ink, never a solid slab', () => {
|
|
79
79
|
// happy-dom drops `color-mix()` from a style, so the resolver is asserted; the browser spec
|
|
80
|
-
// (e2e/calendar-time.spec.ts) reads the painted
|
|
80
|
+
// (e2e/calendar-time.spec.ts) reads the painted color.
|
|
81
81
|
// guardrails-ignore no-hardcoded-colors: test fixture asserting on literal event color, not themeable chrome
|
|
82
82
|
const { chipStyle } = calendarColorClasses('#4f86f7');
|
|
83
83
|
// guardrails-ignore no-hardcoded-colors: test fixture asserting on literal event color, not themeable chrome
|
|
@@ -134,8 +134,8 @@ export function MonthGrid({
|
|
|
134
134
|
: ctx.inMonth
|
|
135
135
|
? 'text-foreground'
|
|
136
136
|
: // 🔴 Muted AND faded. `text-muted-foreground` alone was the same
|
|
137
|
-
// weight and very nearly the same
|
|
138
|
-
// "July 26–31 use the exact same bold font size and dark
|
|
137
|
+
// weight and very nearly the same color as the current month, so
|
|
138
|
+
// "July 26–31 use the exact same bold font size and dark coloring
|
|
139
139
|
// as August" was a fair reading of the screen. Faded to 85%, not 50%:
|
|
140
140
|
// half-strength muted text scored 2.32:1 (FND-9, forge task 2628);
|
|
141
141
|
// at 85% it clears 4.5:1 (80% was 4.48:1) and still reads a step below the month.
|
|
@@ -54,11 +54,11 @@ export const isHexColor = (color?: string): color is string =>
|
|
|
54
54
|
!!color && /^#[0-9a-f]{6}$/i.test(color);
|
|
55
55
|
|
|
56
56
|
/**
|
|
57
|
-
* A custom
|
|
57
|
+
* A custom color drawn the way the named ones are: a soft tint of the hue with ink of the same hue
|
|
58
58
|
* pulled toward the theme's foreground — so it reads in light AND dark, and sits beside the
|
|
59
59
|
* `bg-sky-100 text-sky-800` chips as a peer. Until forge task 2591 a hex was a SOLID fill with
|
|
60
60
|
* white or black text, the loudest mark on the grid whatever it meant (Google Calendar and Linear
|
|
61
|
-
* both tint a custom
|
|
61
|
+
* both tint a custom color rather than fill with it).
|
|
62
62
|
*/
|
|
63
63
|
const hexChip = (hex: string) => ({
|
|
64
64
|
backgroundColor: `color-mix(in srgb, ${hex} 18%, transparent)`,
|
|
@@ -90,7 +90,7 @@ export const DialogContent = forwardRef<HTMLDivElement, DialogContentProps>(
|
|
|
90
90
|
/*
|
|
91
91
|
🔴 Where the dialog mounts is the app's, exactly as for a Popover or a DropdownMenu. An app
|
|
92
92
|
whose tokens live on its own root (desk keeps every variable on `.cs-root`) got a dialog in
|
|
93
|
-
`document.body` drawn with no
|
|
93
|
+
`document.body` drawn with no colors at all, and a full-screen element hid it outright.
|
|
94
94
|
*/
|
|
95
95
|
const container = useFloatingContainer();
|
|
96
96
|
return (
|
|
@@ -2,7 +2,7 @@ import { AlertCircle } from 'lucide-react';
|
|
|
2
2
|
import type { ReactNode } from 'react';
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
|
-
* The inline error row a {@link Field} draws under its control — icon,
|
|
5
|
+
* The inline error row a {@link Field} draws under its control — icon, color and size in one
|
|
6
6
|
* place. Internal: a control that cannot sit in a `Field` (SignupForm's terms checkbox, whose
|
|
7
7
|
* label is the checkbox's own) draws this, so its error reads like every other one (forge task
|
|
8
8
|
* 2466 found that checkbox's error with no icon, as a bare red line).
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
*
|
|
10
10
|
* Knobs:
|
|
11
11
|
* --cb-panesplit-ground what the seam's track is painted — set it to the panes' background
|
|
12
|
-
* --cb-panesplit-line the hairline's
|
|
12
|
+
* --cb-panesplit-line the hairline's color (default `--border`)
|
|
13
13
|
* --cb-panesplit-reach the seam's track, the size of the hit area (default 5px)
|
|
14
14
|
* --cb-panesplit-active the line on hover and focus (default `--ring`)
|
|
15
15
|
*/
|
|
@@ -20,6 +20,21 @@ const groupGrant: ShareGrantRow = {
|
|
|
20
20
|
};
|
|
21
21
|
|
|
22
22
|
describe('ShareEditor', () => {
|
|
23
|
+
test('the picker placeholder and the list heading can name what this editor is for', () => {
|
|
24
|
+
const { getByPlaceholderText, getByText, queryByText } = render(
|
|
25
|
+
<ShareEditor
|
|
26
|
+
resource={RESOURCE}
|
|
27
|
+
loadRecipients={loadRecipients}
|
|
28
|
+
onAdd={() => {}}
|
|
29
|
+
placeholder='Add a group…'
|
|
30
|
+
listLabel='Groups with access'
|
|
31
|
+
/>,
|
|
32
|
+
);
|
|
33
|
+
expect(getByPlaceholderText('Add a group…')).toBeTruthy();
|
|
34
|
+
expect(getByText('Groups with access')).toBeTruthy();
|
|
35
|
+
expect(queryByText('Shared with')).toBeNull();
|
|
36
|
+
});
|
|
37
|
+
|
|
23
38
|
test('a person known only by email is named by the address, once — not "Someone" above it', () => {
|
|
24
39
|
const { getAllByText, queryByText } = render(
|
|
25
40
|
<ShareEditor
|
|
@@ -35,6 +35,10 @@ export interface ShareEditorProps {
|
|
|
35
35
|
/** Revoke a grant (a confirm step fires first). */
|
|
36
36
|
onRevoke?: (grantId: string) => void;
|
|
37
37
|
emptyMessage?: string;
|
|
38
|
+
/** The picker's placeholder — name what it adds ("Add a group…"). Default `'Add people or groups…'`. */
|
|
39
|
+
placeholder?: string;
|
|
40
|
+
/** The heading over the current grants. Default `'Shared with'`. */
|
|
41
|
+
listLabel?: string;
|
|
38
42
|
className?: string;
|
|
39
43
|
}
|
|
40
44
|
|
|
@@ -127,7 +131,7 @@ function GrantRow({
|
|
|
127
131
|
(editable ? (
|
|
128
132
|
<RevokeButton onConfirm={() => onRevoke(grant.id)} />
|
|
129
133
|
) : (
|
|
130
|
-
// Holds the remove column, so a fixed row's level lines up with its
|
|
134
|
+
// Holds the remove column, so a fixed row's level lines up with its neighbors'.
|
|
131
135
|
<span className='size-9 shrink-0' aria-hidden='true' />
|
|
132
136
|
))}
|
|
133
137
|
</li>
|
|
@@ -152,6 +156,8 @@ export function ShareEditor({
|
|
|
152
156
|
onChangeLevel,
|
|
153
157
|
onRevoke,
|
|
154
158
|
emptyMessage = 'Not shared with anyone yet.',
|
|
159
|
+
placeholder,
|
|
160
|
+
listLabel = 'Shared with',
|
|
155
161
|
className,
|
|
156
162
|
// Named so it stays off the root `<div>`: the handlers already carry the resource.
|
|
157
163
|
resource: _resource,
|
|
@@ -166,10 +172,15 @@ export function ShareEditor({
|
|
|
166
172
|
|
|
167
173
|
return (
|
|
168
174
|
<div {...rest} className={cn('space-y-4', className)}>
|
|
169
|
-
<RecipientPicker
|
|
175
|
+
<RecipientPicker
|
|
176
|
+
loadRecipients={loadRecipients}
|
|
177
|
+
onPick={onAdd}
|
|
178
|
+
excludeIds={excludeIds}
|
|
179
|
+
{...(placeholder ? { placeholder } : {})}
|
|
180
|
+
/>
|
|
170
181
|
|
|
171
182
|
<div>
|
|
172
|
-
<p className='mb-1 text-xs font-semibold text-muted-foreground'>
|
|
183
|
+
<p className='mb-1 text-xs font-semibold text-muted-foreground'>{listLabel}</p>
|
|
173
184
|
{isLoading ? (
|
|
174
185
|
<div className='flex justify-center py-4'>
|
|
175
186
|
<Spinner />
|
|
@@ -60,7 +60,7 @@ describe('format', () => {
|
|
|
60
60
|
expect(links.root('library')).toBe('#/');
|
|
61
61
|
});
|
|
62
62
|
|
|
63
|
-
test('history mode writes real paths and
|
|
63
|
+
test('history mode writes real paths and honors a base', () => {
|
|
64
64
|
const history = defineDeepLinks({
|
|
65
65
|
mode: 'history',
|
|
66
66
|
base: '/inspector',
|
|
@@ -132,7 +132,7 @@ export interface DeepLinks<V extends string = string> {
|
|
|
132
132
|
paramsOf(view: V): readonly string[];
|
|
133
133
|
/** True when this href carries no place at all — the bare entry resume restores. */
|
|
134
134
|
isBare(raw: string): boolean;
|
|
135
|
-
/** Structural equality, so a no-op navigation can be
|
|
135
|
+
/** Structural equality, so a no-op navigation can be recognized as one. */
|
|
136
136
|
equals(a: DeepLinkLocation<V>, b: DeepLinkLocation<V>): boolean;
|
|
137
137
|
}
|
|
138
138
|
|
|
@@ -108,7 +108,7 @@ describe('useResume', () => {
|
|
|
108
108
|
|
|
109
109
|
/**
|
|
110
110
|
* The defect the music browser smoke found: the location moved while the read was in
|
|
111
|
-
* flight, the effect re-ran, its cleanup
|
|
111
|
+
* flight, the effect re-ran, its cleanup canceled the read, and nothing was ever
|
|
112
112
|
* recorded again for the life of the page.
|
|
113
113
|
*/
|
|
114
114
|
test('a navigation DURING the read does not kill recording', async () => {
|
|
@@ -157,7 +157,7 @@ export function useResume<V extends string = string>(options: UseResumeOptions<V
|
|
|
157
157
|
* Every one of them — `navigateTo`, `client`, `canRestore` — has an identity
|
|
158
158
|
* that changes when the location changes, so a dependency list naming them
|
|
159
159
|
* re-runs the effect mid-read. The re-run bailed on `attempted`, its cleanup
|
|
160
|
-
*
|
|
160
|
+
* canceled the read in flight, `ready` never became true, and NOTHING WAS
|
|
161
161
|
* EVER RECORDED. It was invisible in a hook test (the read resolved before
|
|
162
162
|
* anything re-rendered) and reproduced every time in a browser, which is why
|
|
163
163
|
* `apps/music/__smoke/deepLinks.spec.ts` exists.
|
|
@@ -57,7 +57,7 @@
|
|
|
57
57
|
opacity: 1 !important;
|
|
58
58
|
}
|
|
59
59
|
|
|
60
|
-
/* Syntax
|
|
60
|
+
/* Syntax colors from cursedbelt's text-safe tone tokens, for both themes (the tokens flip
|
|
61
61
|
* under `.dark`). The library ships GitHub's literal palette (#d73a49, #e36209, #6f42c1,
|
|
62
62
|
* #005cc5), which measured 3.5-4.3:1 on white and on the added/removed line tints. Every
|
|
63
63
|
* token below clears 4.5:1 on the plain, added, removed and highlighted backgrounds, light
|
|
@@ -14,7 +14,7 @@ import type { FileTreeNode } from 'cursedbelt-core/file-tree/file-tree-model';
|
|
|
14
14
|
* passes on any implementation, which is worse than no test (the lesson
|
|
15
15
|
* `denseGallery.layout.spec.ts` records at length). The drop RULES are therefore tested as
|
|
16
16
|
* arithmetic in `core/file-tree/fileTreeModel.spec.ts`, and what is left here is everything
|
|
17
|
-
* that is real DOM
|
|
17
|
+
* that is real DOM behavior: selection, disclosure, the keyboard, the rename field and the
|
|
18
18
|
* external-drag path, which uses real `dragover`/`drop` events and needs no layout.
|
|
19
19
|
*/
|
|
20
20
|
|
|
@@ -79,7 +79,7 @@ describe('drawing', () => {
|
|
|
79
79
|
expect(container.querySelectorAll('[role="treeitem"]')).toHaveLength(5);
|
|
80
80
|
});
|
|
81
81
|
|
|
82
|
-
test('`expandable: false` is still
|
|
82
|
+
test('`expandable: false` is still honored — that row gets an icon, not an arrow', () => {
|
|
83
83
|
const { container } = render(
|
|
84
84
|
<FileTree
|
|
85
85
|
nodes={[{ id: 'inert', name: 'Inert', kind: 'folder', expandable: false }]}
|
|
@@ -333,7 +333,7 @@ describe('renaming in place', () => {
|
|
|
333
333
|
|
|
334
334
|
test('🔴 the draft row is named BEFORE anything is created', () => {
|
|
335
335
|
// A folder made first and renamed afterwards is a row that spent a moment called
|
|
336
|
-
// "untitled", and a row left behind if the field is
|
|
336
|
+
// "untitled", and a row left behind if the field is canceled.
|
|
337
337
|
const made: string[] = [];
|
|
338
338
|
tree({ draft: { parentId: 'simpsons' }, onDraftCommit: (name) => made.push(name) });
|
|
339
339
|
const field = screen.getByLabelText('Name') as HTMLInputElement;
|
|
@@ -614,7 +614,7 @@ describe('a private row is marked as private', () => {
|
|
|
614
614
|
|
|
615
615
|
test('🔴 the mark does not swallow the click that opens the row', () => {
|
|
616
616
|
// A dead spot at the end of every private row would be a worse bug than the one this fixes.
|
|
617
|
-
// `pointer-events: none` in the stylesheet is the mechanism; this is the
|
|
617
|
+
// `pointer-events: none` in the stylesheet is the mechanism; this is the behavior.
|
|
618
618
|
const picked: string[] = [];
|
|
619
619
|
render(
|
|
620
620
|
<FileTree nodes={tree} selectedId={null} onSelect={(node) => picked.push(node.id)} />,
|
|
@@ -625,7 +625,7 @@ describe('a private row is marked as private', () => {
|
|
|
625
625
|
});
|
|
626
626
|
|
|
627
627
|
/**
|
|
628
|
-
* The six
|
|
628
|
+
* The six behaviors that came over from `cursedesk`'s tree on 2026-09-13 so that adopting
|
|
629
629
|
* this one is a graduation rather than a regression. See `FileTree.tsx`'s header.
|
|
630
630
|
*/
|
|
631
631
|
describe('where you are', () => {
|
|
@@ -1268,7 +1268,7 @@ describe('selecting more than one row', () => {
|
|
|
1268
1268
|
});
|
|
1269
1269
|
|
|
1270
1270
|
test('🔴 the anchor does not move, so a second shift-click re-covers from the same start', () => {
|
|
1271
|
-
// The
|
|
1271
|
+
// The behavior every file explorer has: shift-click down four rows, realize you meant
|
|
1272
1272
|
// two, shift-click the second — and get two, not six.
|
|
1273
1273
|
const reported: string[][] = [];
|
|
1274
1274
|
tree({ onSelectionChange: (ids) => reported.push(ids) });
|
|
@@ -1509,7 +1509,7 @@ describe('deleting a selection', () => {
|
|
|
1509
1509
|
expect(many).toEqual([['simpsons']]);
|
|
1510
1510
|
});
|
|
1511
1511
|
|
|
1512
|
-
test('🔴 without `onDeleteMany` it is the focused row alone — today’s
|
|
1512
|
+
test('🔴 without `onDeleteMany` it is the focused row alone — today’s behavior, kept', () => {
|
|
1513
1513
|
const one: string[] = [];
|
|
1514
1514
|
tree({
|
|
1515
1515
|
selectedIds: ['dinos', 'travels'],
|
|
@@ -1764,7 +1764,7 @@ describe('the clipboard', () => {
|
|
|
1764
1764
|
await act(async () => undefined);
|
|
1765
1765
|
const { row } = pressV('Simpsons');
|
|
1766
1766
|
const paste = fireEvent.paste(row, { clipboardData: clipboardWith('Dinos') });
|
|
1767
|
-
// `fireEvent` returns false when the event was
|
|
1767
|
+
// `fireEvent` returns false when the event was canceled.
|
|
1768
1768
|
expect(paste).toBe(false);
|
|
1769
1769
|
await act(async () => new Promise((done) => setTimeout(done, 5)));
|
|
1770
1770
|
// Once — the fallback timer must not paste the same keypress a second time.
|
|
@@ -1844,7 +1844,7 @@ describe('New Folder with Selection', () => {
|
|
|
1844
1844
|
onDraftCommit: (name, wrap) => made.push([name, wrap]),
|
|
1845
1845
|
});
|
|
1846
1846
|
// Enter on the SUGGESTION, unchanged — which is the person agreeing with it, not
|
|
1847
|
-
//
|
|
1847
|
+
// canceling. An unchanged RENAME still cancels; see the rename spec above.
|
|
1848
1848
|
fireEvent.keyDown(screen.getByLabelText('Name'), { key: 'Enter' });
|
|
1849
1849
|
expect(made).toEqual([['beach', ['trips/beach']]]);
|
|
1850
1850
|
});
|
|
@@ -2138,9 +2138,9 @@ describe('pinned rows', () => {
|
|
|
2138
2138
|
|
|
2139
2139
|
test('the section takes the consumer’s own word for it', () => {
|
|
2140
2140
|
// The mechanism is general and the vocabulary is not — the same reason `accessCopy` exists.
|
|
2141
|
-
tree({ pinnedIds: ['dinos'], pinnedLabel: '
|
|
2142
|
-
expect(screen.getByRole('tree', { name: '
|
|
2143
|
-
expect(screen.getByText('
|
|
2141
|
+
tree({ pinnedIds: ['dinos'], pinnedLabel: 'Favorites' });
|
|
2142
|
+
expect(screen.getByRole('tree', { name: 'Favorites' })).toBeDefined();
|
|
2143
|
+
expect(screen.getByText('Favorites')).toBeDefined();
|
|
2144
2144
|
});
|
|
2145
2145
|
|
|
2146
2146
|
test('🔴 a consumer wiring none of it sees byte-for-byte its current tree', () => {
|
|
@@ -2159,7 +2159,7 @@ describe('pinned rows', () => {
|
|
|
2159
2159
|
selectedId={null}
|
|
2160
2160
|
onSelect={() => undefined}
|
|
2161
2161
|
pinnedIds={[]}
|
|
2162
|
-
pinnedLabel='
|
|
2162
|
+
pinnedLabel='Favorites'
|
|
2163
2163
|
/>,
|
|
2164
2164
|
);
|
|
2165
2165
|
expect(withPins.container.innerHTML).toBe(plain.container.innerHTML);
|