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
package/src/react/icons.tsx
CHANGED
|
@@ -258,7 +258,7 @@ export interface DynamicIconProps {
|
|
|
258
258
|
*
|
|
259
259
|
* 🔴 Omitted, it is `defaultIconMap` — NOT "nothing registered". Until 5.15.1 a missing
|
|
260
260
|
* `iconMap` resolved every token to the letter fallback, so vault's header, which renders
|
|
261
|
-
* `<DynamicIcon token="unlock" />` and its
|
|
261
|
+
* `<DynamicIcon token="unlock" />` and its neighbors with no map, painted the letters
|
|
262
262
|
* "U W S" where its lock, generator and settings icons belonged, on every screen, from the
|
|
263
263
|
* day it adopted the component. A registry that was never passed is not a registry that was
|
|
264
264
|
* cleared; only an explicit map may leave a token unresolved.
|
|
@@ -503,7 +503,7 @@ export const IconCheck = handDrawnIcon(() => <path d="m5 13 4 4L19 7" />);
|
|
|
503
503
|
* A pin, as a drawing pin seen from the side — the shape every application
|
|
504
504
|
* uses for "keep this where I can reach it".
|
|
505
505
|
*
|
|
506
|
-
* Two of them, filled and struck through, rather than one that changes
|
|
506
|
+
* Two of them, filled and struck through, rather than one that changes color:
|
|
507
507
|
* a control whose only state signal is a tint is one nobody can read at a
|
|
508
508
|
* glance in either theme, and the pinned/unpinned pair is the state somebody
|
|
509
509
|
* checks fastest of anything in this sidebar.
|
|
@@ -535,7 +535,7 @@ export const IconMusic = handDrawnIcon(() => <><path d="M9 18V6l11-2v12" /><circ
|
|
|
535
535
|
* three of those, and at 13px a fourth would be a shape nobody can separate
|
|
536
536
|
* from the other three while scrolling. A timeline is the one thing a
|
|
537
537
|
* `.context` file is that no other document in this app is, so that is what the
|
|
538
|
-
* mark draws. See `fileKinds.tsx` on why
|
|
538
|
+
* mark draws. See `fileKinds.tsx` on why color is never the only cue.
|
|
539
539
|
*/
|
|
540
540
|
/** A list — three lines, the first two ticked. The `.list` note's mark. */
|
|
541
541
|
export const IconChecklist = handDrawnIcon(() => <><path d="m3 6.5 1.6 1.6L7.6 5" /><path d="m3 13 1.6 1.6L7.6 11.5" /><path d="M11 6.5h10" /><path d="M11 13h10" /><path d="M11 19h7" /><circle cx="5" cy="19" r="1.2" fill="currentColor" stroke="none" /></>);
|
|
@@ -603,6 +603,13 @@ export const IconCode = handDrawnIcon(() => <><path d="m9 8-5 4 5 4" /><path d="
|
|
|
603
603
|
*/
|
|
604
604
|
export const IconSplitRow = handDrawnIcon(() => <><rect x="3" y="4" width="18" height="16" rx="2" /><path d="M12 4v16" /></>);
|
|
605
605
|
export const IconSplitColumn = handDrawnIcon(() => <><rect x="3" y="4" width="18" height="16" rx="2" /><path d="M3 12h18" /></>);
|
|
606
|
+
/**
|
|
607
|
+
* A spreadsheet's Merge Cells and Unmerge Cells (forge task 3569), Lucide's `table-cells-merge`
|
|
608
|
+
* and `table-cells-split`: a three-row table whose middle row has lost its divider, and one whose
|
|
609
|
+
* middle row has it back.
|
|
610
|
+
*/
|
|
611
|
+
export const IconMergeCells = handDrawnIcon(() => <><rect x="3" y="3" width="18" height="18" rx="2" /><path d="M3 9h18" /><path d="M3 15h18" /><path d="M12 3v6" /><path d="M12 15v6" /></>);
|
|
612
|
+
export const IconUnmergeCells = handDrawnIcon(() => <><rect x="3" y="3" width="18" height="18" rx="2" /><path d="M3 9h18" /><path d="M3 15h18" /><path d="M12 9v6" /></>);
|
|
606
613
|
/** A pane closing: the frame, with the corner taken out of it. */
|
|
607
614
|
export const IconPaneClose = handDrawnIcon(() => <><rect x="3" y="4" width="18" height="16" rx="2" /><path d="m9.5 10.5 5 5" /><path d="m14.5 10.5-5 5" /></>);
|
|
608
615
|
/**
|
|
@@ -623,9 +630,9 @@ export const IconCamera = handDrawnIcon(() => <><path d="M4 8h3l1.5-2h7L17 8h3a1
|
|
|
623
630
|
|
|
624
631
|
// ── Formatting ──────────────────────────────────────────────────────────────
|
|
625
632
|
//
|
|
626
|
-
// Drawn rather than lettered, with two exceptions: bold and font
|
|
633
|
+
// Drawn rather than lettered, with two exceptions: bold and font color are a
|
|
627
634
|
// glyph everywhere a spreadsheet has ever existed, and a pictogram of them
|
|
628
|
-
// would be less
|
|
635
|
+
// would be less recognizable than the letter itself.
|
|
629
636
|
|
|
630
637
|
export const IconBold = handDrawnIcon(() => <><path d="M7 5h6a3.5 3.5 0 0 1 0 7H7Z" /><path d="M7 12h7a3.5 3.5 0 0 1 0 7H7Z" /></>);
|
|
631
638
|
/** A slanted stroke between two serifs — the letter, for the same reason. */
|
|
@@ -638,15 +645,15 @@ export const IconStrikethrough = handDrawnIcon(() => <><path d="M16 4H9a3 3 0 0
|
|
|
638
645
|
* The three alignments, drawn as four lines of text with a ragged edge.
|
|
639
646
|
*
|
|
640
647
|
* Left and right rag on one side and stay flush on the other, so the flush
|
|
641
|
-
* edge is the meaning.
|
|
648
|
+
* edge is the meaning. Center has no flush edge, which leaves only the
|
|
642
649
|
* *contrast* between long and short lines to say "ragged on both sides" — and
|
|
643
650
|
* that is why it alternates one full line with one short one instead of
|
|
644
|
-
* cascading like its
|
|
651
|
+
* cascading like its neighbors. A cascade centered (16, 10, 14, 8 units) puts
|
|
645
652
|
* two nearly equal long lines on top of each other: at the 14px this renders
|
|
646
653
|
* at, two units is under a pixel, so the icon read as a solid block and told
|
|
647
654
|
* the user nothing. Every ribbon that has ever shipped alternates here.
|
|
648
655
|
*
|
|
649
|
-
* The lines span y 4.5–19.5 rather than 6–21, which
|
|
656
|
+
* The lines span y 4.5–19.5 rather than 6–21, which centers them in the 24-box
|
|
650
657
|
* the rest of the set uses; before, these three sat visibly low in their
|
|
651
658
|
* buttons next to bold and italic.
|
|
652
659
|
*/
|
|
@@ -703,14 +710,14 @@ export const IconBorderRight = borderIcon(() => <path d="M20 4v16" />);
|
|
|
703
710
|
/** Nothing over the ghost — the eraser, and the only preset that removes. */
|
|
704
711
|
export const IconBorderNone = borderIcon(() => null);
|
|
705
712
|
|
|
706
|
-
/** The paint bucket — a fill, which is what Excel calls a cell
|
|
713
|
+
/** The paint bucket — a fill, which is what Excel calls a cell color. */
|
|
707
714
|
/* The rich text toolbar's own marks (file `36`) — a table, the two indents and
|
|
708
715
|
a horizontal rule, drawn at the same 24-unit scale as everything above. */
|
|
709
716
|
export const IconIndent = handDrawnIcon(() => <><path d="M4 5h16" /><path d="M10 10h10" /><path d="M10 15h10" /><path d="M4 20h16" /><path d="m4 9.5 3 2.5-3 2.5Z" fill="currentColor" /></>);
|
|
710
717
|
export const IconOutdent = handDrawnIcon(() => <><path d="M4 5h16" /><path d="M10 10h10" /><path d="M10 15h10" /><path d="M4 20h16" /><path d="m7 9.5-3 2.5 3 2.5Z" fill="currentColor" /></>);
|
|
711
718
|
export const IconRule = handDrawnIcon(() => <><path d="M4 12h16" /><path d="M6 6.5h12" opacity="0.35" /><path d="M6 17.5h12" opacity="0.35" /></>);
|
|
712
719
|
export const IconFill = handDrawnIcon(() => <><path d="m5 12 7-7 7 7-7 7z" /><path d="M5 12h14" /><path d="M19.5 16.5c0 1-.7 1.8-1.5 1.8s-1.5-.8-1.5-1.8c0-.9 1.5-2.8 1.5-2.8s1.5 1.9 1.5 2.8Z" /></>);
|
|
713
|
-
/** A letter with a bar under it — Excel's font
|
|
720
|
+
/** A letter with a bar under it — Excel's font color, drawn the same way. */
|
|
714
721
|
export const IconFontColor = handDrawnIcon(() => <><path d="m6 16 5-11 5 11" /><path d="M7.8 12.5h6.4" /><path d="M4 20h16" /></>);
|
|
715
722
|
/* A number wearing a decimal point — the Format menu, in one glyph. */
|
|
716
723
|
export const IconNumberFormat = handDrawnIcon(() => <><path d="M4 8h2v9" /><path d="M9.5 8.5a2 2 0 1 1 3 1.7L9.5 17h5" /><circle cx="17.5" cy="16" r="1.2" fill="currentColor" stroke="none" /><path d="M20 8v9" /></>);
|
|
@@ -730,7 +737,7 @@ export const IconFreeze = handDrawnIcon(() => <><rect x="3" y="3" width="18" hei
|
|
|
730
737
|
*
|
|
731
738
|
* Nobody under thirty has held one and every application on this machine draws
|
|
732
739
|
* save as this shape anyway, which is the whole argument: an icon's job is to be
|
|
733
|
-
*
|
|
740
|
+
* recognized, and a more *honest* mark — a downward arrow, a hard drive — is one
|
|
734
741
|
* people would have to learn. It arrives with the owner's explicit save.
|
|
735
742
|
*/
|
|
736
743
|
/**
|
|
@@ -62,7 +62,7 @@ afterEach(() => {
|
|
|
62
62
|
describe('createKeepAwakeEngine', () => {
|
|
63
63
|
/**
|
|
64
64
|
* 🔴 The `data-keep-awake` stamp, and this is the only case in the file whose subject is
|
|
65
|
-
* OBSERVABILITY rather than
|
|
65
|
+
* OBSERVABILITY rather than behavior.
|
|
66
66
|
*
|
|
67
67
|
* Everything else about this component is invisible: it renders nothing, a
|
|
68
68
|
* `WakeLockSentinel` is not a node, and the fallback element is equally present playing or
|
|
@@ -178,7 +178,7 @@ export function LayoutConfigDialog<F extends LayoutField = LayoutField>({
|
|
|
178
178
|
<div className='flex shrink-0 items-center justify-between gap-3 border-b border-border px-5 py-3'>
|
|
179
179
|
<DialogTitle className='text-lg font-semibold'>{title}</DialogTitle>
|
|
180
180
|
{/* Undo, redo and close are one row of `sm` glyph squares, as in Figma's and Notion's
|
|
181
|
-
editors: as
|
|
181
|
+
editors: as labeled buttons they took 200px of a 390px header and broke the title
|
|
182
182
|
over two lines, and the 28px close sat beside 32px buttons (FND-4, forge task 2594). */}
|
|
183
183
|
<div className='flex shrink-0 items-center gap-1'>
|
|
184
184
|
<IconButton size='sm' label='Undo' tooltip='Undo the last change' disabled={!editor.canUndo} onClick={editor.undo}>
|
|
@@ -51,7 +51,7 @@ type RenderCtx<F extends LayoutField> = {
|
|
|
51
51
|
// @lg:col-span-11 @lg:row-span-2 @lg:row-span-3
|
|
52
52
|
// And every class the style maps (`nodeBoxClass`/`nodeTextClass`) can return — the tones ride the
|
|
53
53
|
// theme's `--tone-<hue>-*` roles since cwip 4.11.1; as raw palette classes no toned block was ever
|
|
54
|
-
//
|
|
54
|
+
// colored (forge task 2661). The same spec derives these from the maps.
|
|
55
55
|
// bg-card bg-muted bg-muted/40 bg-muted/60 bg-tone-amber-bg bg-tone-amber-bg/50 bg-tone-cyan-bg
|
|
56
56
|
// bg-tone-cyan-bg/50 bg-tone-emerald-bg bg-tone-emerald-bg/50 bg-tone-purple-bg
|
|
57
57
|
// bg-tone-purple-bg/50 bg-tone-rose-bg bg-tone-rose-bg/50 bg-tone-sky-bg bg-tone-sky-bg/50
|
|
@@ -40,7 +40,7 @@ const STYLE_VALUES: { [K in keyof NodeStyle]-?: (NodeStyle[K] | undefined)[] } =
|
|
|
40
40
|
};
|
|
41
41
|
|
|
42
42
|
/**
|
|
43
|
-
* Every class the style maps (`nodeBoxClass`/`nodeTextClass`) can return: tone × fill × text
|
|
43
|
+
* Every class the style maps (`nodeBoxClass`/`nodeTextClass`) can return: tone × fill × text color
|
|
44
44
|
* together (the tone's text role depends on the fill), and each other key on its own.
|
|
45
45
|
*/
|
|
46
46
|
function everyStyleClass(): string[] {
|
|
@@ -67,9 +67,9 @@ describe('layout engine grid classes ship in the stylesheet', () => {
|
|
|
67
67
|
expect(everyGridClass().filter((cls) => !selector(cls).test(css))).toEqual([]);
|
|
68
68
|
});
|
|
69
69
|
|
|
70
|
-
test('styles-utilities.css has a rule for every style class too — a toned block is
|
|
70
|
+
test('styles-utilities.css has a rule for every style class too — a toned block is colored', () => {
|
|
71
71
|
const css = readFileSync(join(SRC, 'styles-utilities.css'), 'utf8');
|
|
72
|
-
// A raw Tailwind palette tone (emerald fifty) had no rule, so every toned block drew
|
|
72
|
+
// A raw Tailwind palette tone (emerald fifty) had no rule, so every toned block drew uncolored (forge task 2661).
|
|
73
73
|
expect(everyStyleClass().filter((cls) => !selector(cls).test(css))).toEqual([]);
|
|
74
74
|
});
|
|
75
75
|
|
package/src/react/lib/cn.spec.ts
CHANGED
|
@@ -19,7 +19,7 @@ describe('cn', () => {
|
|
|
19
19
|
expect(cn()).toBe('');
|
|
20
20
|
expect(cn(false, null, undefined)).toBe('');
|
|
21
21
|
});
|
|
22
|
-
test('🔴 a named type step survives a
|
|
22
|
+
test('🔴 a named type step survives a color after it — the scale is font-size, not color (task 2460)', () => {
|
|
23
23
|
expect(cn('text-caption', 'text-muted-foreground')).toBe('text-caption text-muted-foreground');
|
|
24
24
|
expect(cn('text-data text-foreground')).toBe('text-data text-foreground');
|
|
25
25
|
// …and still conflicts with a size, last wins.
|
package/src/react/lib/cn.ts
CHANGED
|
@@ -3,7 +3,7 @@ import { extendTailwindMerge } from 'tailwind-merge';
|
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* The type scale's named steps (`theme.css` → `--text-*`). tailwind-merge knows only Tailwind's
|
|
6
|
-
* own sizes, so it read `text-caption` as a
|
|
6
|
+
* own sizes, so it read `text-caption` as a COLOR and dropped it the moment a real color
|
|
7
7
|
* followed — `cn('text-caption', 'text-muted-foreground')` was `'text-muted-foreground'`, and
|
|
8
8
|
* every DataTable header rendered at the inherited 14px instead of its 12px caption step. The
|
|
9
9
|
* design audit found it (forge task 2460); `cn.spec.ts` pins it.
|
|
@@ -29,16 +29,16 @@ export function cn(...inputs: ClassValue[]): string {
|
|
|
29
29
|
|
|
30
30
|
/**
|
|
31
31
|
* What Tailwind's preflight gives every `<button>`, stated on the button itself: no margin, no
|
|
32
|
-
* border, no fill, no padding, and the host's font and
|
|
32
|
+
* border, no fill, no padding, and the host's font and color.
|
|
33
33
|
*
|
|
34
34
|
* A host may load the belt's utilities WITHOUT preflight (desk compiles only theme + utilities
|
|
35
35
|
* under `.cs-root`). There a raw `<button>` that does not reset itself draws the browser's own
|
|
36
|
-
* control — a
|
|
36
|
+
* control — a gray filled, outset-bordered box in system-ui 13.33px, black text in dark mode.
|
|
37
37
|
* desk's folder list showed it on every sortable header and on the search-scope trigger, and its
|
|
38
38
|
* filter chips wore an outset border (forge task 2749; 2748, 2752 and 2757 fixed the same thing
|
|
39
39
|
* one component at a time).
|
|
40
40
|
*
|
|
41
|
-
* Put it FIRST in `cn(…)`, so the button's own padding, border, fill and
|
|
41
|
+
* Put it FIRST in `cn(…)`, so the button's own padding, border, fill and color win the merge.
|
|
42
42
|
* The `raw-button-resets-face` guardrail counts the belt's raw buttons that carry neither this
|
|
43
43
|
* nor `font-[inherit]`, and its baseline only falls.
|
|
44
44
|
*
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* `cursedbelt/react/upload-direct` — the browser half of a resumable upload to binary-server.
|
|
3
3
|
*
|
|
4
4
|
* Neither app that carried this module (collections, family) had a test of it, so these pin the
|
|
5
|
-
*
|
|
5
|
+
* behaviors a 10 GB upload depends on, against a scripted `fetch`: resume skips delivered parts,
|
|
6
6
|
* parts are PUT with their bytes, a 403 re-mints the token, a 507 is terminal and never retried, a
|
|
7
7
|
* dropped part is retried, low disk only WARNS, and a lost final response is recovered by asking.
|
|
8
8
|
*/
|
package/src/react/lib/field.ts
CHANGED
|
@@ -87,7 +87,7 @@ export function fieldControlClass(size: ControlSize = 'md'): string {
|
|
|
87
87
|
*
|
|
88
88
|
* | width | cap | for |
|
|
89
89
|
* |---|---|---|
|
|
90
|
-
* | `xs` | 10rem | a number, a
|
|
90
|
+
* | `xs` | 10rem | a number, a color, a short code |
|
|
91
91
|
* | `sm` | 20rem | a date, a time, a short choice |
|
|
92
92
|
* | `md` | 28rem | a name, a title, a single-line choice — the default for one-line controls |
|
|
93
93
|
* | `lg` | 32rem | a URL, an email, a longer one-line value |
|
|
@@ -38,7 +38,7 @@ const AppContainer = createContext<Element | null>(null);
|
|
|
38
38
|
*
|
|
39
39
|
* For an app whose design tokens are scoped to its own root rather than `:root` — desk
|
|
40
40
|
* keeps every `--cs-*` variable on `.cs-root`, so a panel portalled to `body` draws with
|
|
41
|
-
* no
|
|
41
|
+
* no colors, no radius and no z-index. It also keeps a panel OUT of whatever opened it:
|
|
42
42
|
* rendering in place (`portal={false}`) made a focused field inside the panel scroll the
|
|
43
43
|
* grid it was a descendant of (desk, file `77`). A full-screen element still wins, for
|
|
44
44
|
* the reason {@link fullscreenElement} gives. `null` (the host not mounted yet) means
|
|
@@ -61,7 +61,7 @@ describe('the floating layer — DESIGN.md §5 containment', () => {
|
|
|
61
61
|
});
|
|
62
62
|
|
|
63
63
|
test('a menu row clears 44px on a touch pointer', () => {
|
|
64
|
-
// A mis-tap in a MENU costs the most: the
|
|
64
|
+
// A mis-tap in a MENU costs the most: the neighboring row is a different action.
|
|
65
65
|
expect(FLOATING_ITEM_BASE).toContain(TAP_TARGET_HEIGHT);
|
|
66
66
|
});
|
|
67
67
|
});
|
|
@@ -51,14 +51,14 @@ export const FLOATING_CONTENT_BASE =
|
|
|
51
51
|
* Base row for a selectable/actionable item inside a floating panel.
|
|
52
52
|
*
|
|
53
53
|
* It does NOT take the press dip (`lib/press.ts`) on purpose: a full-width row in a scrolling
|
|
54
|
-
* list that scales pulls its edges in from its
|
|
54
|
+
* list that scales pulls its edges in from its neighbors and reads as the list wobbling; the
|
|
55
55
|
* highlight already answers, and the menu closes on the press (forge task 2912).
|
|
56
56
|
*/
|
|
57
57
|
export const FLOATING_ITEM_BASE =
|
|
58
58
|
'relative flex cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none ' +
|
|
59
59
|
// DESIGN.md §5's 44px floor, on coarse pointers only so the dense desktop menu
|
|
60
60
|
// keeps its rhythm. A 32px menu row is a miss on a phone, and a menu is exactly
|
|
61
|
-
// where a mis-tap costs the most: the
|
|
61
|
+
// where a mis-tap costs the most: the neighboring row is a different action.
|
|
62
62
|
`${TAP_TARGET_HEIGHT} ` +
|
|
63
63
|
'data-[disabled]:pointer-events-none data-[disabled]:opacity-50 ' +
|
|
64
64
|
'focus:bg-accent/10 focus:text-accent';
|
|
@@ -22,13 +22,13 @@ import { createContext, createElement, type ReactNode, useContext } from 'react'
|
|
|
22
22
|
* 120ms: a tooltip is not a thing you go and read, it is a thing you needed
|
|
23
23
|
* ONCE. After that first read it is pure occlusion — it paints over the control
|
|
24
24
|
* next to the one you are aiming at, on a toolbar where the controls are 32px
|
|
25
|
-
* apart.
|
|
25
|
+
* apart. Optimizing its open time for the first minute of a user's life costs
|
|
26
26
|
* them every minute after it.
|
|
27
27
|
*
|
|
28
28
|
* So the delay is deliberately long enough that a pointer merely CROSSING a
|
|
29
|
-
* control never reaches it. A cursor
|
|
30
|
-
*
|
|
31
|
-
* they do not
|
|
29
|
+
* control never reaches it. A cursor traveling to a target passes over its
|
|
30
|
+
* neighbors in well under 100ms; a person who has actually stopped, because
|
|
31
|
+
* they do not recognize an icon, rests for far longer than half a second before
|
|
32
32
|
* they start wondering. 500ms sits in the gap and is the same number the native
|
|
33
33
|
* `title` tooltip trained everyone on for thirty years.
|
|
34
34
|
*
|
|
@@ -51,7 +51,7 @@ export const HOVER_HINT_DELAY_MS = 500;
|
|
|
51
51
|
* A gesture that IS the request — a tap or click on a disclosure control whose
|
|
52
52
|
* only job is to reveal the hint. Named rather than written as a bare `0` so
|
|
53
53
|
* that reading `delayDuration={HOVER_HINT_INSTANT_MS}` says *why* it is instant,
|
|
54
|
-
* and so `no-fast-tooltip` has an allowed spelling to
|
|
54
|
+
* and so `no-fast-tooltip` has an allowed spelling to recognize instead of every
|
|
55
55
|
* touch branch needing an opt-out comment.
|
|
56
56
|
*/
|
|
57
57
|
export const HOVER_HINT_INSTANT_MS = 0;
|
|
@@ -65,7 +65,7 @@ const HoverHintDelayContext = createContext<number | null>(null);
|
|
|
65
65
|
* desk carries a "Tooltip delay" setting the owner asked for by name (*"slowing down
|
|
66
66
|
* tooltip times later when I know what most things do, or speeding them up to learn the
|
|
67
67
|
* icons myself"*). That is the same owner and the same rule as above, pointed the other
|
|
68
|
-
* way: a delay the person at the keyboard
|
|
68
|
+
* way: a delay the person at the keyboard dialed in is a deliberate REQUEST, not a
|
|
69
69
|
* default somebody re-tuned. So the value arrives from a setting at runtime, and
|
|
70
70
|
* `no-fast-tooltip` still refuses any literal below the floor written in code.
|
|
71
71
|
*
|
|
@@ -27,7 +27,7 @@ export interface InfoHintImplProps extends InfoHintProps {
|
|
|
27
27
|
* and the swap between them moves nothing. ≥44px touch target on coarse pointers (the same
|
|
28
28
|
* `TAP_TARGET` floor Button/IconButton carry — a bare `size-4` glyph measured 16×16px, cc/197).
|
|
29
29
|
* `border-0 bg-transparent p-0 font-[inherit]`: it is a raw `<button>`, and a host without
|
|
30
|
-
* Tailwind's preflight (desk) drew the browser's own chrome around the glyph — a
|
|
30
|
+
* Tailwind's preflight (desk) drew the browser's own chrome around the glyph — a gray filled
|
|
31
31
|
* 44px box on a phone, a bordered one on a desktop (forge task 2752, PlaceBar's More had the
|
|
32
32
|
* same fix in 2748). The ring is the focus mark that chrome used to be. */
|
|
33
33
|
export const INFO_HINT_TRIGGER = `inline-flex items-center justify-center rounded-sm border-0 bg-transparent p-0 font-[inherit] text-muted-foreground hover:text-accent focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring ${TAP_TARGET}`;
|
|
@@ -33,7 +33,7 @@ const CLOSED_PASSTHROUGH = 'data-[state=closed]:pointer-events-none!';
|
|
|
33
33
|
|
|
34
34
|
/** A tooltip: the fast speed, a fade and a 4px rise from its trigger's side. Only a DELAYED
|
|
35
35
|
* open animates — moving between triggers inside the skip-delay window (`instant-open`) swaps
|
|
36
|
-
* the bubble in place, the way Linear's do, instead of re-fading it on every
|
|
36
|
+
* the bubble in place, the way Linear's do, instead of re-fading it on every neighbor. */
|
|
37
37
|
export const TOOLTIP_MOTION =
|
|
38
38
|
'duration-[var(--duration-fast)] ease-[var(--ease-out)] motion-reduce:duration-0 ' +
|
|
39
39
|
'data-[state=delayed-open]:animate-in data-[state=delayed-open]:fade-in-0 data-[state=delayed-open]:zoom-in-[0.985] ' +
|
package/src/react/lib/press.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* The press contract, written once (forge task 2912): every pressable surface answers a finger.
|
|
3
3
|
*
|
|
4
|
-
* While held, a control dips to `--press-scale` and eases its
|
|
4
|
+
* While held, a control dips to `--press-scale` and eases its colors AND that dip over
|
|
5
5
|
* `--duration-fast` on `--ease-out` — the way Linear's and Obsidian's controls do, and the brief's
|
|
6
6
|
* `.tactile` class (`owner-drafting-area/linear-art.md/app.css`) as a token instead of a class. A
|
|
7
7
|
* control that changes nothing under the finger reads as dead on a phone.
|
|
@@ -80,12 +80,12 @@ export function selectTriggerClass({
|
|
|
80
80
|
}
|
|
81
81
|
|
|
82
82
|
/** The value's text wrapper. One line, ellipsized, left-aligned: a long value (a deep path) used to
|
|
83
|
-
* wrap to three
|
|
83
|
+
* wrap to three centered lines and spill out of a 36px trigger at 390px (Radix Themes' Select
|
|
84
84
|
* truncates the same way, forge task 2594). Radix's Value drops `className`, so the truncation
|
|
85
85
|
* lives on a wrapper. */
|
|
86
86
|
export const SELECT_VALUE_CLASS = 'block min-w-0 flex-1 truncate text-left';
|
|
87
87
|
|
|
88
|
-
/** `groups` when given, else `options` as one
|
|
88
|
+
/** `groups` when given, else `options` as one unlabeled group. */
|
|
89
89
|
export function selectGroupsOf({ options = [], groups = [] }: Pick<SelectFieldProps, 'options' | 'groups'>): SelectGroup[] {
|
|
90
90
|
return groups.length > 0 ? groups : options.length > 0 ? [{ options }] : [];
|
|
91
91
|
}
|
|
@@ -20,7 +20,7 @@ import type { z } from 'zod';
|
|
|
20
20
|
* `validateFieldsNatively` (MIT, © 2019-present Beier (Bill) Luo), reduced to the one schema
|
|
21
21
|
* library this package peers on (`zod ^4.4.0`) and the one call shape {@link makeFormConfig}
|
|
22
22
|
* makes. `react-hook-form` is already a dependency, and supplies `get`, `set` and
|
|
23
|
-
* `appendErrors`. `zodResolver.spec.ts` pins the
|
|
23
|
+
* `appendErrors`. `zodResolver.spec.ts` pins the behaviors that matter: nested paths, the
|
|
24
24
|
* closest union branch, `criteriaMode: 'all'`, a field-array root error, and parsed output.
|
|
25
25
|
*/
|
|
26
26
|
|
|
@@ -27,7 +27,7 @@ export interface AppearanceMenuProps
|
|
|
27
27
|
* instead (family, vault).
|
|
28
28
|
*
|
|
29
29
|
* Why a panel and not a second toggle: a look is a choice among four, and the scheme a choice
|
|
30
|
-
* among three, and Linear (Preferences → Interface theme) and Obsidian (Appearance → Base
|
|
30
|
+
* among three, and Linear (Preferences → Interface theme) and Obsidian (Appearance → Base color
|
|
31
31
|
* scheme + Themes) both answer them together in one place. One press more to flip dark mode buys
|
|
32
32
|
* the reader every look without a Settings page (forge task 2916).
|
|
33
33
|
*
|
|
@@ -26,14 +26,14 @@ export interface LookPickerProps {
|
|
|
26
26
|
/**
|
|
27
27
|
* Pick the app's look: one card per look, each a small picture of itself drawn with that look's
|
|
28
28
|
* OWN tokens (the card wears the `cb-<look>` scope, so what it shows is what you get, in the
|
|
29
|
-
*
|
|
30
|
-
* `ThemeToggle` does the
|
|
29
|
+
* color scheme the page is in right now). Reads and writes the shared look store itself, like
|
|
30
|
+
* `ThemeToggle` does the color scheme, so dropping it into Settings is the whole integration.
|
|
31
31
|
*
|
|
32
32
|
* Linear's Preferences → Theme and Obsidian's Appearance both draw their themes as swatch cards,
|
|
33
33
|
* which is why this is cards and not a select (REV-5). Radix `RadioGroup`: each card IS the
|
|
34
34
|
* focusable element (roving tabindex, arrow keys), nothing hidden is drawn anywhere else — the
|
|
35
35
|
* same reason `ChoiceGroup` is built on it. The checked card is marked by its accent edge AND a
|
|
36
|
-
* check mark, never by
|
|
36
|
+
* check mark, never by color alone.
|
|
37
37
|
*/
|
|
38
38
|
export function LookPicker({
|
|
39
39
|
looks: offered,
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* A look is one of the `cb-<id>` scopes the stylesheets define: `cb-aurora` in `theme.css`, and
|
|
5
5
|
* `cb-obsidian`, `cb-nord` and `cb-dracula` in `looks.css`. Every look re-binds the SAME semantic
|
|
6
6
|
* surface tokens (`--background`, `--card`, `--border`, the shadows, the glass, the field aliases),
|
|
7
|
-
* so a component never knows which look it is in — and light/dark stays the
|
|
7
|
+
* so a component never knows which look it is in — and light/dark stays the color-scheme store's
|
|
8
8
|
* business: `.dark` sits beside the look class on `<html>`, and each look declares both schemes.
|
|
9
9
|
*
|
|
10
10
|
* This holds the chosen look, persists it under {@link LOOK_STORAGE_KEY}, applies it as exactly ONE
|
|
@@ -30,10 +30,10 @@ export interface Look {
|
|
|
30
30
|
|
|
31
31
|
/** Every look the stylesheets ship, in the order a picker offers them. `looks.spec.ts` holds the CSS to this list. */
|
|
32
32
|
export const LOOKS: readonly Look[] = [
|
|
33
|
-
{ id: 'obsidian', label: 'Obsidian', description: 'Monochrome and quiet.
|
|
33
|
+
{ id: 'obsidian', label: 'Obsidian', description: 'Monochrome and quiet. Color only where it means something.' },
|
|
34
34
|
{ id: 'aurora', label: 'Aurora', description: 'Glass panels over a field of ambient light.' },
|
|
35
|
-
{ id: 'nord', label: 'Nord', description: 'Cool blue-
|
|
36
|
-
{ id: 'dracula', label: 'Dracula', description: 'Deep violet-
|
|
35
|
+
{ id: 'nord', label: 'Nord', description: 'Cool blue-gray, soft on the eyes.' },
|
|
36
|
+
{ id: 'dracula', label: 'Dracula', description: 'Deep violet-gray with warm text.' },
|
|
37
37
|
];
|
|
38
38
|
|
|
39
39
|
export const LOOK_STORAGE_KEY = 'cwip.look';
|
|
@@ -44,7 +44,7 @@ describe('MarkdownDoc', () => {
|
|
|
44
44
|
|
|
45
45
|
test('javascript: and unknown-scheme links are neutralized to plain text', () => {
|
|
46
46
|
const { container } = render(
|
|
47
|
-
<MarkdownDoc markdown={'[bad](javascript:alert(1)) and [weird](vbscript:x) and [ok](docs/x.md)'} />, // check-doc-citations:ignore markdown fixture for the link
|
|
47
|
+
<MarkdownDoc markdown={'[bad](javascript:alert(1)) and [weird](vbscript:x) and [ok](docs/x.md)'} />, // check-doc-citations:ignore markdown fixture for the link sanitizer
|
|
48
48
|
);
|
|
49
49
|
const anchors = Array.from(container.querySelectorAll('a'));
|
|
50
50
|
expect(anchors).toHaveLength(1);
|
|
@@ -240,7 +240,7 @@ export function MasterDetail({
|
|
|
240
240
|
{selectedId ? (
|
|
241
241
|
<div className="min-h-full">{detail}</div>
|
|
242
242
|
) : (
|
|
243
|
-
//
|
|
243
|
+
// Centered in the pane, as Linear's empty detail is: at the top it read as a
|
|
244
244
|
// stray caption over a blank pane (forge task 2594).
|
|
245
245
|
<div className="flex min-h-full items-center justify-center p-6">
|
|
246
246
|
{emptyDetail ?? (
|
|
@@ -82,7 +82,7 @@ export function MasterLockDialog({
|
|
|
82
82
|
if (!res.ok || typeof body?.idleMs !== "number") throw new Error("refused");
|
|
83
83
|
onIdleSaved(body.idleMs);
|
|
84
84
|
// Echo the SERVER's number, not the typed one: it clamps, and a field that keeps
|
|
85
|
-
// showing an out-of-range value the app is not
|
|
85
|
+
// showing an out-of-range value the app is not honoring is a lie.
|
|
86
86
|
setMinutes(Math.max(MIN_MINUTES, Math.round(body.idleMs / 60_000)));
|
|
87
87
|
setNote({ text: "Timeout saved for this app.", tone: "ok" });
|
|
88
88
|
} catch {
|
|
@@ -121,7 +121,7 @@ export function MasterLockDialog({
|
|
|
121
121
|
* at once — rotating account 2 would silently lock him out of account 1.
|
|
122
122
|
*
|
|
123
123
|
* `cursedbelt-server`'s guard refuses the old shape with `409 {"error":"stale-client"}`
|
|
124
|
-
* rather than
|
|
124
|
+
* rather than honoring it, so this dialog did not corrupt anything; it simply
|
|
125
125
|
* stopped working, and the owner could not change his master password from inside
|
|
126
126
|
* any app. The salt never rotating is the accepted cost — it is 16 random bytes
|
|
127
127
|
* whose job is to stop precomputation across apps, and it does that for as long as
|
|
@@ -95,7 +95,7 @@ describe("the idle watcher", () => {
|
|
|
95
95
|
* shape from before accounts existed. Every account on an app now derives under one shared
|
|
96
96
|
* descriptor, so a fresh salt stores a verifier hash nothing can ever match: the owner sets a
|
|
97
97
|
* new password, the rotation logs him out, and neither the old nor the new one opens the app.
|
|
98
|
-
* `cursedbelt-server`'s guard answers that shape `409 stale-client` rather than
|
|
98
|
+
* `cursedbelt-server`'s guard answers that shape `409 stale-client` rather than honoring it,
|
|
99
99
|
* so the dialog did not corrupt anything — it simply refused, and the owner could not change
|
|
100
100
|
* his master password from inside any app for as long as it shipped.
|
|
101
101
|
*
|
|
@@ -232,7 +232,7 @@ export interface MasterLockMenuItemsProps {
|
|
|
232
232
|
/** Dismiss the menu these sit in. `AccountMenu` hands it to its `children` render prop. */
|
|
233
233
|
close?: () => void;
|
|
234
234
|
/**
|
|
235
|
-
* The HOST menu's own item class, so the entries look like their
|
|
235
|
+
* The HOST menu's own item class, so the entries look like their neighbors —
|
|
236
236
|
* `"sam-item"` for `satellite-kit`'s `AccountMenu`.
|
|
237
237
|
*/
|
|
238
238
|
itemClassName?: string;
|
|
@@ -49,7 +49,7 @@ export interface GalleryActionButtonProps
|
|
|
49
49
|
/** Hover/focus explanation. A pill with a non-obvious effect should always carry one. */
|
|
50
50
|
tooltip?: ReactNode;
|
|
51
51
|
/**
|
|
52
|
-
* Draw `children` as a bare glyph in a square pill instead of a
|
|
52
|
+
* Draw `children` as a bare glyph in a square pill instead of a labeled one — the shape
|
|
53
53
|
* the whole gallery toolbar uses since 2026-09-16 (owner: *"Make it have icons only,
|
|
54
54
|
* instead of words in the strip of tools"*).
|
|
55
55
|
*
|
|
@@ -222,7 +222,7 @@ export interface DenseGalleryShellProps<O extends string = string> {
|
|
|
222
222
|
*
|
|
223
223
|
* A slot rather than a `viewMode` prop because the shell has no business knowing what the
|
|
224
224
|
* alternative view IS. It owns the chrome; whoever passes `body` owns the rows. `empty`,
|
|
225
|
-
* `loading` and `onNearEnd` become that caller's to
|
|
225
|
+
* `loading` and `onNearEnd` become that caller's to honor, which is the honest split:
|
|
226
226
|
* a table paginates and measures differently from a virtualized grid of tiles.
|
|
227
227
|
*/
|
|
228
228
|
body?: ReactNode;
|
|
@@ -359,7 +359,7 @@ export interface DenseGalleryDetailProps {
|
|
|
359
359
|
actions?: ReactNode;
|
|
360
360
|
/**
|
|
361
361
|
* Step to the previous/next item. Given, the stage draws overlay arrows on its left
|
|
362
|
-
* and right edges — vertically
|
|
362
|
+
* and right edges — vertically centered on a frame whose height never changes, so
|
|
363
363
|
* "next, look, next, look" is one pointer position for the whole set.
|
|
364
364
|
*
|
|
365
365
|
* Owner report, 2026-08-23: *"It stops me from being able to press next button
|
|
@@ -521,7 +521,7 @@ export function FocusViewer({
|
|
|
521
521
|
setNote(`GIF downloaded — ${weight}.`);
|
|
522
522
|
}
|
|
523
523
|
} catch (err) {
|
|
524
|
-
if (err instanceof DOMException && err.name === "AbortError") setNote("GIF
|
|
524
|
+
if (err instanceof DOMException && err.name === "AbortError") setNote("GIF canceled.");
|
|
525
525
|
else setError(err instanceof Error ? err.message : "The GIF could not be made.");
|
|
526
526
|
} finally {
|
|
527
527
|
if (gifAbort.current === abort) gifAbort.current = null;
|
|
@@ -753,7 +753,7 @@ export function FocusViewer({
|
|
|
753
753
|
* It used to sit in the `else` chain below, behind a guard that stood down for any
|
|
754
754
|
* focused button. This viewer's transport is made of buttons, so the shortcut was off
|
|
755
755
|
* exactly where the hand had just been: press a control, then press Space, and the
|
|
756
|
-
* control fires again instead of playback toggling.
|
|
756
|
+
* control fires again instead of playback toggling. Canceling the KEYDOWN is what
|
|
757
757
|
* stops that, because a button activates on the keyup.
|
|
758
758
|
*/
|
|
759
759
|
if (isPlayPauseSpace(event)) {
|
|
@@ -802,7 +802,7 @@ export function FocusViewer({
|
|
|
802
802
|
/*
|
|
803
803
|
* 🔴 The PICTURE takes the region's shape, which is what makes a fraction of what you see
|
|
804
804
|
* and a fraction of the region the same number — see `stageAspectFor`. Without it a
|
|
805
|
-
* marquee over the
|
|
805
|
+
* marquee over the center of a letterboxed picture resolves to a region off to one side.
|
|
806
806
|
*
|
|
807
807
|
* 16/9 until the video reports its decoded size: a shape has to be chosen for the first
|
|
808
808
|
* paint, and this one is corrected on `loadedmetadata` a moment later.
|
|
@@ -77,7 +77,7 @@ describe('🔴 FrameGrabber — Space toggles the clip you are scrubbing', () =>
|
|
|
77
77
|
});
|
|
78
78
|
|
|
79
79
|
test('🔴 …and it still toggles while one of the dialog’s own buttons has focus', () => {
|
|
80
|
-
// The state the hand is actually in: Cancel,
|
|
80
|
+
// The state the hand is actually in: Cancel, Center it, a crop pill or the segment was the
|
|
81
81
|
// last thing pressed, and the browser would otherwise activate it on the Space KEYUP. That
|
|
82
82
|
// inversion is the whole point of `playerSpaceKey` — see its header.
|
|
83
83
|
open();
|
|
@@ -128,7 +128,7 @@ describe('🔴 FrameGrabber — Space toggles the clip you are scrubbing', () =>
|
|
|
128
128
|
|
|
129
129
|
test('🔴 the rule is IMPORTED from playerSpaceKey, not re-implemented here', () => {
|
|
130
130
|
// The three previous copies of this rule disagreed in the one case the owner hits, which is
|
|
131
|
-
// why `playerSpaceKey.ts` exists. A
|
|
131
|
+
// why `playerSpaceKey.ts` exists. A behavioral test cannot tell a fourth copy that happens
|
|
132
132
|
// to agree today from the shared rule; this can.
|
|
133
133
|
const source = readFileSync(resolve(import.meta.dir, 'FrameGrabber.tsx'), 'utf8');
|
|
134
134
|
expect(source).toInclude("from './playerSpaceKey.js'");
|
|
@@ -634,7 +634,7 @@ export function FrameGrabber({
|
|
|
634
634
|
</label>
|
|
635
635
|
<button
|
|
636
636
|
// guardrails-ignore no-raw-action-button: toolbar pill styled by this module's
|
|
637
|
-
// own plain CSS, matching the gallery's `.cbgd-order-btn`
|
|
637
|
+
// own plain CSS, matching the gallery's `.cbgd-order-btn` neighbors.
|
|
638
638
|
type='button'
|
|
639
639
|
className={cn(RAW_BUTTON, 'cbpe-btn')}
|
|
640
640
|
// 🔴 Gated on `isFramed`, which counts the PAN as well as the zoom. The old
|
|
@@ -643,7 +643,7 @@ export function FrameGrabber({
|
|
|
643
643
|
disabled={!isFramed(framing)}
|
|
644
644
|
onClick={() => setFraming(DEFAULT_FRAMING)}
|
|
645
645
|
>
|
|
646
|
-
|
|
646
|
+
Center it
|
|
647
647
|
</button>
|
|
648
648
|
</div>
|
|
649
649
|
) : (
|
|
@@ -689,7 +689,7 @@ export function FrameGrabber({
|
|
|
689
689
|
[
|
|
690
690
|
['brightness', 'Brightness'],
|
|
691
691
|
['contrast', 'Contrast'],
|
|
692
|
-
['saturation', '
|
|
692
|
+
['saturation', 'Color'],
|
|
693
693
|
] as const
|
|
694
694
|
).map(([key, label]) => (
|
|
695
695
|
<label className='cbpe-slider' key={key}>
|
|
@@ -42,7 +42,7 @@ const SCRUB_STEP_MS = 900;
|
|
|
42
42
|
/** How long a finger rests on a tile before it counts as a hold rather than a tap. */
|
|
43
43
|
const TOUCH_HOLD_MS = 300;
|
|
44
44
|
/** How far a finger may wander during a hold before it is a scroll instead — a resting thumb is
|
|
45
|
-
* never perfectly still, and a hold that any jitter
|
|
45
|
+
* never perfectly still, and a hold that any jitter canceled would read as one that never works. */
|
|
46
46
|
const TOUCH_HOLD_SLOP_PX = 10;
|
|
47
47
|
|
|
48
48
|
/**
|
|
@@ -127,7 +127,7 @@ export interface HoverScrubVideoThumbProps {
|
|
|
127
127
|
* `PREVIEW_SETTLE_MS` (`previewGate.ts`), so a grid scrolled past fast never opens a stream
|
|
128
128
|
* per row. Without an `IntersectionObserver` the tile counts as visible.
|
|
129
129
|
*
|
|
130
|
-
* 🔴
|
|
130
|
+
* 🔴 Honored on a TOUCH screen too. It was suppressed under a coarse pointer until
|
|
131
131
|
* 2026-10-10, so the "Preview all" button on a phone lit up and nothing moved — owner, on an
|
|
132
132
|
* iPhone: *"The play icon above the player clicked but it did not make all the video
|
|
133
133
|
* thumbnails start playing like I thought it would."* A control the reader pressed is the
|
|
@@ -324,7 +324,7 @@ export function HoverScrubVideoThumb({
|
|
|
324
324
|
*
|
|
325
325
|
* Three things about this badge are deliberate:
|
|
326
326
|
*
|
|
327
|
-
* · **It is drawn OVER the poster,
|
|
327
|
+
* · **It is drawn OVER the poster, centered, in a filled disc** rather than as a
|
|
328
328
|
* tint on the tile. A shade reads as a state (selected, disabled, still
|
|
329
329
|
* uploading) and competes with the `optimizing…` chip directly below it; a play
|
|
330
330
|
* triangle means one thing and means it at any tile size, in either theme, and
|
|
@@ -17,7 +17,7 @@ export interface MediaCellProps {
|
|
|
17
17
|
}
|
|
18
18
|
|
|
19
19
|
/**
|
|
20
|
-
* One
|
|
20
|
+
* One catalog tile: the thumbnail, a play/audio badge + duration for time-based
|
|
21
21
|
* media, and hover edit/delete actions. The single render unit shared by the
|
|
22
22
|
* virtualized rows renderer AND react-photo-album's `render.photo`, so the grid looks
|
|
23
23
|
* identical regardless of layout driver.
|