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
|
@@ -576,7 +576,7 @@ export interface DataTableProps<TRow extends Record<string, unknown>> {
|
|
|
576
576
|
* date created."* Clicking a column already in the stack cycles it
|
|
577
577
|
* ascending → descending → out, without disturbing the others.
|
|
578
578
|
*
|
|
579
|
-
* Default `true`. `false` restores the old one-key-at-a-time
|
|
579
|
+
* Default `true`. `false` restores the old one-key-at-a-time behavior.
|
|
580
580
|
*/
|
|
581
581
|
multiSort?: boolean;
|
|
582
582
|
/**
|
|
@@ -803,7 +803,7 @@ export function declaredTrackFloor(
|
|
|
803
803
|
* What one header click does to the sort STACK.
|
|
804
804
|
*
|
|
805
805
|
* 🔴 The new key goes to the FRONT, and that is the whole feature. The owner
|
|
806
|
-
* described the
|
|
806
|
+
* described the behavior by its result — *"I sort by date created, then sort by
|
|
807
807
|
* artist and I get a list ordered by artist with their tracks still sorted by
|
|
808
808
|
* date created"* — which is a stack in click order where the LATEST click is the
|
|
809
809
|
* primary key and everything clicked before it survives as a tie-breaker.
|
|
@@ -846,7 +846,7 @@ export function nextSortStack(
|
|
|
846
846
|
}
|
|
847
847
|
|
|
848
848
|
/**
|
|
849
|
-
* Read a `ColDef.key` off a row,
|
|
849
|
+
* Read a `ColDef.key` off a row, honoring the dot-notation `ColDef` documents.
|
|
850
850
|
* TanStack's own `accessorKey` does this for the cells; the filter builder runs
|
|
851
851
|
* BEFORE TanStack (see `filteredData`) and so needs the same reading, or a
|
|
852
852
|
* nested column would filter on `undefined` and match nothing.
|
|
@@ -874,13 +874,13 @@ function readPath(row: unknown, key: string): unknown {
|
|
|
874
874
|
* too, so a collapsed cell reads as nothing, not as a value nobody can see.)
|
|
875
875
|
*
|
|
876
876
|
* 🔴 `invisible` too: `[&>*]` reaches child ELEMENTS only, and a `render` that returns a bare
|
|
877
|
-
* string is a text node — it overflowed the zero-wide cell and printed across its
|
|
877
|
+
* string is a text node — it overflowed the zero-wide cell and printed across its neighbor at
|
|
878
878
|
* phone width (desk's folder list, forge task 2762). Hidden visibility hides the text and takes
|
|
879
879
|
* it out of the accessibility tree, without touching the column's box.
|
|
880
880
|
*
|
|
881
881
|
* 🔴 And a font size of zero: hidden text still LAYS OUT, and a table's auto layout hands each
|
|
882
882
|
* column a share of the spare width by its content's width — so a collapsed column whose cells
|
|
883
|
-
* are bare strings ("3m 16s") stood 45px wide and blank between its
|
|
883
|
+
* are bare strings ("3m 16s") stood 45px wide and blank between its neighbors (station's Insights
|
|
884
884
|
* kinds table at 1440, forge task 2975). Text at size zero has no width, and the column is 0px.
|
|
885
885
|
*/
|
|
886
886
|
const HIDE_BELOW_CLASS = {
|
|
@@ -1315,13 +1315,13 @@ export function DataTable<TRow extends Record<string, unknown>>({
|
|
|
1315
1315
|
columns: tsColumns,
|
|
1316
1316
|
getRowId: resolvedGetRowId,
|
|
1317
1317
|
state: { sorting, columnFilters, globalFilter: search, columnVisibility, pagination },
|
|
1318
|
-
// Through `applySorting`, like every other write — so a controlled `sorting` is
|
|
1318
|
+
// Through `applySorting`, like every other write — so a controlled `sorting` is honored
|
|
1319
1319
|
// whether TanStack or a header asked for the change.
|
|
1320
1320
|
onSortingChange: (updater) =>
|
|
1321
1321
|
applySorting((prev) => (typeof updater === 'function' ? updater(prev) : updater)),
|
|
1322
1322
|
onColumnFiltersChange: chainUpdaterResettingPage(setColumnFilters, setPagination, onColumnFiltersChange),
|
|
1323
1323
|
// TanStack hands the updater whatever `state.globalFilter` is, which is now
|
|
1324
|
-
// a TableSearchState; the toolbar sets TEXT, so
|
|
1324
|
+
// a TableSearchState; the toolbar sets TEXT, so normalize both shapes.
|
|
1325
1325
|
onGlobalFilterChange: (updater) => {
|
|
1326
1326
|
const next = typeof updater === 'function' ? updater(search) : updater;
|
|
1327
1327
|
const text = typeof next === 'string' ? next : ((next as TableSearchState | undefined)?.text ?? '');
|
|
@@ -1333,7 +1333,7 @@ export function DataTable<TRow extends Record<string, unknown>>({
|
|
|
1333
1333
|
// `String(new Date())` / `String(['rock','80s'])` are not the text the
|
|
1334
1334
|
// reader can see in the cell — a date column answered nothing at all for a
|
|
1335
1335
|
// typed year, which is the owner's own *"'199' in the date created"* case.
|
|
1336
|
-
// `filterableText` is the SAME
|
|
1336
|
+
// `filterableText` is the SAME normalization the filter builder uses, so a
|
|
1337
1337
|
// search and a `contains` condition on one column agree by construction
|
|
1338
1338
|
// rather than by two implementations happening to match.
|
|
1339
1339
|
globalFilterFn: (row, columnId, value) => {
|
|
@@ -1346,7 +1346,7 @@ export function DataTable<TRow extends Record<string, unknown>>({
|
|
|
1346
1346
|
return filterableText(row.getValue(columnId)).toLowerCase().includes(text.toLowerCase());
|
|
1347
1347
|
},
|
|
1348
1348
|
// A server window is server-ordered and server-filtered by construction: a WINDOW
|
|
1349
|
-
// re-sorted locally would put row 4,000's
|
|
1349
|
+
// re-sorted locally would put row 4,000's neighbors next to row 12's.
|
|
1350
1350
|
manualSorting: serverSide || !!serverWindow,
|
|
1351
1351
|
manualFiltering: serverSide || !!serverWindow,
|
|
1352
1352
|
manualPagination: serverSide,
|
|
@@ -2138,7 +2138,7 @@ export function DataTable<TRow extends Record<string, unknown>>({
|
|
|
2138
2138
|
</div>
|
|
2139
2139
|
)}
|
|
2140
2140
|
{/* The totals row's narrow form: the cards and the list have no column to sit a total
|
|
2141
|
-
under, so each footer reads as a
|
|
2141
|
+
under, so each footer reads as a labeled figure under the last row. */}
|
|
2142
2142
|
{mobileCards && footerHeaders ? (
|
|
2143
2143
|
<dl data-cb-table-footer-summary='' className='m-0 mt-3 flex flex-wrap gap-x-6 gap-y-1 border-t-2 border-border pt-2 text-sm @3xl:hidden'>
|
|
2144
2144
|
{footerHeaders
|
|
@@ -106,11 +106,11 @@ export function SearchBox({
|
|
|
106
106
|
// h-9 matches the search input beside it on a mouse; the floor only applies
|
|
107
107
|
// to a finger (DESIGN.md §5), and e2e/touch-targets.spec.ts measures it.
|
|
108
108
|
// RAW_BUTTON then `border-solid`: without preflight a `border` width is drawn in the UA's
|
|
109
|
-
// `outset` style, and an unfilled trigger must not read as a disabled
|
|
109
|
+
// `outset` style, and an unfilled trigger must not read as a disabled gray box (task 2749).
|
|
110
110
|
RAW_BUTTON,
|
|
111
111
|
'inline-flex h-9 shrink-0 items-center gap-1 rounded-md border border-solid border-border px-2 text-caption transition-colors pointer-coarse:h-11',
|
|
112
112
|
'hover:bg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',
|
|
113
|
-
// Narrowed scope reads as ACTIVE state, not as another
|
|
113
|
+
// Narrowed scope reads as ACTIVE state, not as another gray
|
|
114
114
|
// control — the whole point is that it cannot hide.
|
|
115
115
|
isAll ? 'text-muted-foreground' : 'border-accent/60 bg-accent/10 text-foreground',
|
|
116
116
|
)}
|
|
@@ -144,7 +144,7 @@ export function SortHeader<TRow>({
|
|
|
144
144
|
// button reset lands `text-transform: none` on this element, and
|
|
145
145
|
// text-transform does not inherit past a value that is explicitly set. So
|
|
146
146
|
// every SORTABLE header in every cursedbelt table has been rendering
|
|
147
|
-
// "Heartbeat" beside a non-sortable
|
|
147
|
+
// "Heartbeat" beside a non-sortable neighbor's "WORKER" — measured
|
|
148
148
|
// computed styles on orch's Fleet tab, 2026-08-12: `th` uppercase,
|
|
149
149
|
// `button` none. Letter-spacing does inherit (0.55px on both), so only
|
|
150
150
|
// the case needs restating.
|
|
@@ -60,7 +60,7 @@ const OP_OPTIONS = (Object.keys(FILTER_OP_LABELS) as FilterOp[]).map((op) => ({
|
|
|
60
60
|
* the exact `FilterNode` its API consumes so what is built is what the server
|
|
61
61
|
* filters and exports by.
|
|
62
62
|
*
|
|
63
|
-
* Neither is the other
|
|
63
|
+
* Neither is the other generalized. Collapsing them would mean either giving a
|
|
64
64
|
* table toolbar a regex field and a three-deep nesting rule, or taking typed
|
|
65
65
|
* operators away from a filter the server evaluates — so they stay two, and
|
|
66
66
|
* this one says which it is. See {@link FilterQuery} for the shape it edits;
|
|
@@ -73,7 +73,7 @@ describe('DataTable row selection', () => {
|
|
|
73
73
|
expect(container.querySelectorAll('tbody tr')[0]?.querySelectorAll('td').length).toBe(COLUMNS.length);
|
|
74
74
|
});
|
|
75
75
|
|
|
76
|
-
test('selection on: a leading checkbox column in the grid, one
|
|
76
|
+
test('selection on: a leading checkbox column in the grid, one labeled box per row', () => {
|
|
77
77
|
const { container } = render(<Harness />);
|
|
78
78
|
const ths = container.querySelectorAll('thead th');
|
|
79
79
|
expect(ths.length).toBe(COLUMNS.length + 1);
|
|
@@ -41,7 +41,7 @@ const table = (props: Partial<React.ComponentProps<typeof DataTable<Row>>> = {})
|
|
|
41
41
|
const bodyRows = () => [...document.querySelectorAll('tbody tr')];
|
|
42
42
|
|
|
43
43
|
describe('virtualize', () => {
|
|
44
|
-
test('🔴 OFF by default, and off means byte-identical
|
|
44
|
+
test('🔴 OFF by default, and off means byte-identical behavior', () => {
|
|
45
45
|
// Every existing consumer must keep paginating exactly as it did — the pager is
|
|
46
46
|
// the visible proof that nothing about the default path moved.
|
|
47
47
|
table();
|
|
@@ -159,7 +159,7 @@ function MenuSections({ items }: { items: readonly DropdownMenuItem[] }) {
|
|
|
159
159
|
const sections = useMemo(() => arrangeMenuItems(items), [items]);
|
|
160
160
|
/*
|
|
161
161
|
* One row that can be checked gives every row of this menu the check column, as a native menu
|
|
162
|
-
* does: otherwise the toggles' icons sit 24px right of their
|
|
162
|
+
* does: otherwise the toggles' icons sit 24px right of their neighbors' (the player's ⋯, forge
|
|
163
163
|
* task 2568). A submenu is its own menu and decides for itself.
|
|
164
164
|
*/
|
|
165
165
|
const inset = items.some((item) => !item.divider && item.checked !== undefined);
|
|
@@ -112,7 +112,7 @@ export type FieldProps = FieldBaseProps &
|
|
|
112
112
|
*
|
|
113
113
|
* Why it is not cosmetic: a `<label>` binds to ONE control, and pointing it at a wrapper
|
|
114
114
|
* binds it to nothing. Measured in desk (2026-09): a caption welded onto the first chip of a
|
|
115
|
-
* group announced that chip as "Items are Prod" — the caption plus its
|
|
115
|
+
* group announced that chip as "Items are Prod" — the caption plus its neighbor — and a
|
|
116
116
|
* click on the description pressed it. Inside a `role="group"` both go away.
|
|
117
117
|
*/
|
|
118
118
|
group: true;
|
|
@@ -37,7 +37,7 @@ export interface FormPreviewLayoutProps {
|
|
|
37
37
|
* (col-span-7) and an interactive … preview window (col-span-5). This handles the wide layout
|
|
38
38
|
* beautifully without leaving empty dead space on the right."* And for a phone: *"the live
|
|
39
39
|
* preview panel moves … to a sticky floating bar at the very top … This allows users to watch
|
|
40
|
-
* the card's accent
|
|
40
|
+
* the card's accent color and label adjust in real-time as they scroll."*
|
|
41
41
|
*
|
|
42
42
|
* - **Wide** (its container ≥ 52rem): twelve columns, the form on seven, the preview on five
|
|
43
43
|
* and sticky at the top of its column; `below` spans all twelve underneath.
|
|
@@ -72,7 +72,7 @@ describe('heatScaleFrom — the baseline is the data’s own', () => {
|
|
|
72
72
|
});
|
|
73
73
|
|
|
74
74
|
describe('the tones', () => {
|
|
75
|
-
test('only the two bands that mean trouble
|
|
75
|
+
test('only the two bands that mean trouble color a tile; the rest stay quiet', () => {
|
|
76
76
|
expect(heatTileTone('critical')).toBe('danger');
|
|
77
77
|
expect(heatTileTone('high')).toBe('warning');
|
|
78
78
|
expect(heatTileTone('notice')).toBeUndefined();
|
|
@@ -16,8 +16,8 @@ import type { StatTileTone } from './StatTile.js';
|
|
|
16
16
|
* Heat answers "how does this row compare to the OTHERS" — a column of costs, token counts or
|
|
17
17
|
* error rates, each scored against the column's baseline (its median by default, or a limit the
|
|
18
18
|
* caller names). Five bands, never a continuous gradient: a gradient makes every cell a slightly
|
|
19
|
-
* different
|
|
20
|
-
* status tokens (FND-10,
|
|
19
|
+
* different color and nothing stands out, which is the opposite of the ask. The bands ride the
|
|
20
|
+
* status tokens (FND-10, color means status), so they re-theme and clear 4.5:1 in both modes:
|
|
21
21
|
*
|
|
22
22
|
* good well under the baseline success tint
|
|
23
23
|
* ok about the baseline no tint — the quiet default
|
|
@@ -26,13 +26,13 @@ import type { StatTileTone } from './StatTile.js';
|
|
|
26
26
|
* critical far over destructive tint
|
|
27
27
|
*
|
|
28
28
|
* The number stays the signal: the tint is added to it, never substituted for it, and the band's
|
|
29
|
-
* word rides along for assistive tech (`sr-only`), so
|
|
29
|
+
* word rides along for assistive tech (`sr-only`), so color is never the only channel (FND-9).
|
|
30
30
|
*
|
|
31
31
|
* ── Where it goes ───────────────────────────────────────────────────────────
|
|
32
32
|
* A `DataTable` column through {@link heatColumn}; any number through {@link HeatCell}; a tile's
|
|
33
|
-
* tone through {@link heatTileTone}; a bar's
|
|
33
|
+
* tone through {@link heatTileTone}; a bar's color through {@link heatChartTone} and `BarChart`'s
|
|
34
34
|
* `colorBy`. One scale per column — two columns scored against each other's baselines would make
|
|
35
|
-
* the same number two
|
|
35
|
+
* the same number two colors.
|
|
36
36
|
*/
|
|
37
37
|
export type HeatBand = 'good' | 'ok' | 'notice' | 'high' | 'critical';
|
|
38
38
|
|
|
@@ -59,7 +59,7 @@ export const RELATIVE_STEPS: HeatSteps = { good: 0.5, notice: 1.25, high: 1.75,
|
|
|
59
59
|
|
|
60
60
|
/**
|
|
61
61
|
* Scoring against a LIMIT (`baseline` is the allowance): the same 85% / 95% turns as
|
|
62
|
-
* {@link ThresholdMeter}, so a quota reads the same
|
|
62
|
+
* {@link ThresholdMeter}, so a quota reads the same color as a number and as a bar.
|
|
63
63
|
*/
|
|
64
64
|
export const LIMIT_STEPS: HeatSteps = { good: 0.5, notice: 0.7, high: 0.85, critical: 0.95 };
|
|
65
65
|
|
|
@@ -36,7 +36,7 @@ describe('searchIcons', () => {
|
|
|
36
36
|
});
|
|
37
37
|
|
|
38
38
|
describe('iconDataUrl', () => {
|
|
39
|
-
test('draws in the
|
|
39
|
+
test('draws in the color given, and only a hex or a name is spliced in', () => {
|
|
40
40
|
const icon = { body: '<path fill="currentColor"/>', width: 24, height: 24 };
|
|
41
41
|
expect(decodeURIComponent(iconDataUrl(icon, 'orange'))).toContain('color="orange"');
|
|
42
42
|
const hostile = decodeURIComponent(iconDataUrl(icon, '"><script>x</script>'));
|
|
@@ -12,7 +12,7 @@ import './editorPage.css';
|
|
|
12
12
|
export interface PickedIcon {
|
|
13
13
|
/** Iconify's name, `set:icon` — `lucide:code`, `simple-icons:kubernetes`. */
|
|
14
14
|
name: string;
|
|
15
|
-
/** The SVG's inner markup, every
|
|
15
|
+
/** The SVG's inner markup, every color `currentColor`. */
|
|
16
16
|
body: string;
|
|
17
17
|
width: number;
|
|
18
18
|
height: number;
|
|
@@ -24,9 +24,9 @@ export interface IconSet {
|
|
|
24
24
|
}
|
|
25
25
|
|
|
26
26
|
/**
|
|
27
|
-
* The sets searched, all single-
|
|
28
|
-
* for the brands a runbook names — Kubernetes, Datadog, GitHub. Multi-
|
|
29
|
-
* out because a
|
|
27
|
+
* The sets searched, all single-color (they tint): the general-purpose four, and Simple Icons
|
|
28
|
+
* for the brands a runbook names — Kubernetes, Datadog, GitHub. Multi-color logo sets are left
|
|
29
|
+
* out because a color of the owner's choosing is the point of the mark.
|
|
30
30
|
*/
|
|
31
31
|
export const ICON_SETS: readonly IconSet[] = [
|
|
32
32
|
{ prefix: 'lucide', label: 'Lucide' },
|
|
@@ -38,13 +38,13 @@ export const ICON_SETS: readonly IconSet[] = [
|
|
|
38
38
|
|
|
39
39
|
export const ICONIFY_API = 'https://api.iconify.design';
|
|
40
40
|
const RESULTS = 96;
|
|
41
|
-
/** A hex, or a named
|
|
41
|
+
/** A hex, or a named color — nothing that could close the attribute it is spliced into. */
|
|
42
42
|
const SAFE_COLOR = /^(?:#[0-9a-f]{3,8}|[a-z]+)$/i;
|
|
43
43
|
|
|
44
44
|
/**
|
|
45
45
|
* A picked icon as an `<img>` source, in `color`. An image rather than inline SVG on purpose: a
|
|
46
46
|
* stored body is drawn wherever the record goes, and an SVG inside an `<img>` cannot run script
|
|
47
|
-
* or reach the page, whatever the stored markup says. `color` must be a hex or a
|
|
47
|
+
* or reach the page, whatever the stored markup says. `color` must be a hex or a color's name —
|
|
48
48
|
* anything else is left out, and the icon draws in the SVG's default black.
|
|
49
49
|
*/
|
|
50
50
|
export function iconDataUrl(icon: Pick<PickedIcon, 'body' | 'width' | 'height'>, color: string): string {
|
|
@@ -109,8 +109,8 @@ export interface IconPickerProps {
|
|
|
109
109
|
value?: string | null;
|
|
110
110
|
onPick: (icon: PickedIcon) => void;
|
|
111
111
|
/**
|
|
112
|
-
* The
|
|
113
|
-
* or a
|
|
112
|
+
* The color the results are drawn in — the mark's own, so the choice is made in it. A hex
|
|
113
|
+
* or a color's name: the hits are images, which cannot inherit the page's `currentColor`.
|
|
114
114
|
*/
|
|
115
115
|
color: string;
|
|
116
116
|
/**
|
|
@@ -127,7 +127,7 @@ export interface IconPickerProps {
|
|
|
127
127
|
|
|
128
128
|
/**
|
|
129
129
|
* Search big icon sets and pick one: a search field, a row of sets, and a grid of hits drawn in
|
|
130
|
-
* the mark's own
|
|
130
|
+
* the mark's own color.
|
|
131
131
|
*
|
|
132
132
|
* The owner, 2026-10-05: *"For the mark I want a way to search in icon lists to choose a good
|
|
133
133
|
* icon … if I make a code snippet template I want to be able to pick an icon instead of letters
|
|
@@ -7,7 +7,7 @@ import { InfoHint } from './InfoHint.js';
|
|
|
7
7
|
afterEach(cleanup);
|
|
8
8
|
|
|
9
9
|
/**
|
|
10
|
-
* A BYTE contract as much as a
|
|
10
|
+
* A BYTE contract as much as a behavioral one: `InfoHint` is rendered by every field
|
|
11
11
|
* primitive that carries a long hint, so it must not carry `@floating-ui/react` with it — that
|
|
12
12
|
* engine arrives as its own chunk (`InfoHintImpl`). 5.40.0's SliderField imported it statically
|
|
13
13
|
* and roms' controls chunk grew 14.68 → 25.24 kB gzip (forge task 2518).
|
|
@@ -20,7 +20,7 @@ describe('InfoHint (lazy)', () => {
|
|
|
20
20
|
expect(src).toContain("import('./InfoHintImpl.js')");
|
|
21
21
|
});
|
|
22
22
|
|
|
23
|
-
test('the trigger draws its own ground, so a host without preflight shows no
|
|
23
|
+
test('the trigger draws its own ground, so a host without preflight shows no gray button box', () => {
|
|
24
24
|
// A raw <button>: without `border-0`/`bg-transparent` the browser's default chrome shows in
|
|
25
25
|
// desk, which loads no preflight (forge task 2752).
|
|
26
26
|
const { getByLabelText } = render(<InfoHint>Frames per tick</InfoHint>);
|
|
@@ -27,7 +27,7 @@ if (typeof window !== 'undefined') void preloadInfoHint();
|
|
|
27
27
|
|
|
28
28
|
/**
|
|
29
29
|
* "ⓘ" field-help: hover + focus on pointer devices, click/tap everywhere, the panel portaled
|
|
30
|
-
* and never clipped (the
|
|
30
|
+
* and never clipped (the behavior is `InfoHintImpl.tsx`).
|
|
31
31
|
*
|
|
32
32
|
* ── Why this file is a wrapper and not the hint ─────────────────────────────
|
|
33
33
|
* 🔴 The panel is built on `@floating-ui/react` (+ `tabbable`), ~10 KB gzip, and every field
|
|
@@ -45,7 +45,7 @@ export interface InheritBadgeProps {
|
|
|
45
45
|
* 🔴 Corrected 2026-08-19 (unit 11). This map used to be `bg-transparent` + a
|
|
46
46
|
* dashed border — i.e. exactly the "thin low-visibility unstyled outline"
|
|
47
47
|
* `DESIGN.md` §3 forbids, and the contradiction `UX_STANDARDS.md` §0 records as
|
|
48
|
-
* resolved in DESIGN.md's
|
|
48
|
+
* resolved in DESIGN.md's favor. Inherited and explicit still read apart, but as
|
|
49
49
|
* TWO FILLED TONES: 8% fill + dashed edge vs. the standard 15% fill + solid edge,
|
|
50
50
|
* with the glyph (◌ vs 📌) and the sr-only word carrying it a third and fourth
|
|
51
51
|
* time. The text stays on the `-strong` step, which is the audited ≥4.5:1 one.
|
|
@@ -140,7 +140,7 @@ export function InheritBadge({
|
|
|
140
140
|
// is what keeps this a real touch target, and forcing a size-5 square
|
|
141
141
|
// would quietly delete that on every phone.
|
|
142
142
|
// A DISABLED reset stays hidden until hover too: Button's `disabled:opacity-50`
|
|
143
|
-
// out-ranked the reveal's `opacity-0`, so an in-flight row showed a
|
|
143
|
+
// out-ranked the reveal's `opacity-0`, so an in-flight row showed a gray reset
|
|
144
144
|
// the others did not (forge task 2594).
|
|
145
145
|
className={cn(
|
|
146
146
|
'[&_svg]:size-3.5',
|
|
@@ -104,7 +104,7 @@ export function IsolatedFrame({
|
|
|
104
104
|
const frame = (
|
|
105
105
|
// No `bg-background` of its own: the iframe and the skeleton paint theirs, and a painted
|
|
106
106
|
// wrapper squared off the host's rounded corners (forge task 2594). `flex-col` lets the
|
|
107
|
-
// `fill` empty and error states actually
|
|
107
|
+
// `fill` empty and error states actually center.
|
|
108
108
|
<div className='relative flex h-full w-full flex-col'>
|
|
109
109
|
{errorSlot ??
|
|
110
110
|
(hasContent ? (
|
|
@@ -72,7 +72,7 @@ export interface ListToolbarProps {
|
|
|
72
72
|
*
|
|
73
73
|
* ── `flex-wrap`, and no `role='toolbar'` ──────────────────────────────────
|
|
74
74
|
* Wrapping, not a grid and not a breakpoint swap: the console runs at 1440 on a desk
|
|
75
|
-
* and 390 on a phone, and wrapping is the one
|
|
75
|
+
* and 390 on a phone, and wrapping is the one behavior that keeps DESIGN.md §5's 44px
|
|
76
76
|
* targets at both widths without a second layout. `ml-auto` on the right-hand cluster
|
|
77
77
|
* keeps the controls right when everything fits on one line and lets them ride down as
|
|
78
78
|
* a group when it does not.
|
|
@@ -75,7 +75,7 @@ export interface MenuItemProps {
|
|
|
75
75
|
onSelect?: () => void;
|
|
76
76
|
/** Drawn right-aligned and muted — `⌘D`, `Del`. */
|
|
77
77
|
shortcut?: string;
|
|
78
|
-
/** Destroys something: drawn in the destructive
|
|
78
|
+
/** Destroys something: drawn in the destructive color. */
|
|
79
79
|
danger?: boolean;
|
|
80
80
|
/** Momentarily inert. Use {@link MenuItemProps.unavailableReason} for "cannot work here". */
|
|
81
81
|
disabled?: boolean;
|
|
@@ -42,14 +42,14 @@ function sizeClass(size: ModalSize): string {
|
|
|
42
42
|
return SIZE[size];
|
|
43
43
|
}
|
|
44
44
|
|
|
45
|
-
/** Below `sm` (640px), where a
|
|
45
|
+
/** Below `sm` (640px), where a centered card becomes a bottom sheet. */
|
|
46
46
|
const PHONE_QUERY = '(max-width: 639px)';
|
|
47
47
|
|
|
48
48
|
/**
|
|
49
|
-
* 🔴 A phone gets a BOTTOM SHEET, not a
|
|
49
|
+
* 🔴 A phone gets a BOTTOM SHEET, not a centered card — the owner's cb-form review, 2026-09-30:
|
|
50
50
|
* *"Instead of a centered floating rectangle with a dark backdrop mask, the entire interaction
|
|
51
51
|
* behaves like a native iOS bottom drawer. It anchors to the bottom of the screen, sliding
|
|
52
|
-
* upward to take up 90% or 100% of the viewport."* A
|
|
52
|
+
* upward to take up 90% or 100% of the viewport."* A centered card on a 390px screen is a
|
|
53
53
|
* smaller screen inside the screen, with its Save button wherever the content left it; a sheet
|
|
54
54
|
* puts the footer's actions where the thumb already is, and comes down with the same swipe
|
|
55
55
|
* every native sheet does.
|
|
@@ -57,7 +57,7 @@ const PHONE_QUERY = '(max-width: 639px)';
|
|
|
57
57
|
const SHEET =
|
|
58
58
|
'max-sm:inset-x-0 max-sm:bottom-0 max-sm:w-full max-sm:max-w-none max-sm:max-h-[var(--sheet-h-phone)] max-sm:rounded-t-2xl max-sm:rounded-b-none max-sm:border-x-0 max-sm:border-b-0 max-sm:data-[state=open]:slide-in-from-bottom max-sm:data-[state=closed]:slide-out-to-bottom';
|
|
59
59
|
|
|
60
|
-
/** From `sm` up: the
|
|
60
|
+
/** From `sm` up: the centered card, capped to the viewport. It rises with every dialog
|
|
61
61
|
* (`DIALOG_MOTION`: 8px and 0.985); the phone's sheet above slides its whole height instead. */
|
|
62
62
|
const CARD =
|
|
63
63
|
'sm:top-1/2 sm:left-1/2 sm:w-[calc(100vw-2rem)] sm:-translate-x-1/2 sm:-translate-y-1/2 sm:rounded-xl sm:max-h-[min(90dvh,calc(100dvh-2rem))]';
|
|
@@ -201,7 +201,7 @@ export function Modal({
|
|
|
201
201
|
<DialogContent
|
|
202
202
|
data-cb-modal=''
|
|
203
203
|
className={cn(
|
|
204
|
-
// A bottom sheet on a phone, a
|
|
204
|
+
// A bottom sheet on a phone, a centered card from `sm` up (see SHEET / CARD). The
|
|
205
205
|
// card keeps a 1rem margin on each side at every size, then caps at the size's
|
|
206
206
|
// max-width.
|
|
207
207
|
'fixed flex flex-col gap-0 overflow-hidden',
|
|
@@ -6,7 +6,7 @@ import { PageContainer, PageHeader, ReadableColumn } from './Page.js';
|
|
|
6
6
|
afterEach(cleanup);
|
|
7
7
|
|
|
8
8
|
describe('ReadableColumn — DESIGN.md §1, prose is clamped to 750–850px', () => {
|
|
9
|
-
test('it clamps to the reading-width token and
|
|
9
|
+
test('it clamps to the reading-width token and centers', () => {
|
|
10
10
|
const { container } = render(<ReadableColumn>text</ReadableColumn>);
|
|
11
11
|
const el = container.querySelector('[data-cb-readable]');
|
|
12
12
|
expect(el?.className).toContain('max-w-[var(--reading-width)]');
|
|
@@ -82,7 +82,7 @@ export function PageContainer({ width = 'dashboard', className, ...p }: PageCont
|
|
|
82
82
|
* intents and every chat surface ran their text edge to edge. `--reading-width`
|
|
83
83
|
* (800px, the middle of the stated band) is the token; this is the component.
|
|
84
84
|
*
|
|
85
|
-
* It sets width and
|
|
85
|
+
* It sets width and centering only: no background, no padding beyond the page
|
|
86
86
|
* gutter, no scroll. A message list still owns its own `ScrollArea`.
|
|
87
87
|
*/
|
|
88
88
|
export function ReadableColumn({ className, ...p }: HTMLAttributes<HTMLDivElement>) {
|
|
@@ -236,7 +236,7 @@ function PageSubtitle({ children, dense }: { children: ReactNode; dense: boolean
|
|
|
236
236
|
{clipped ? (
|
|
237
237
|
// One text line tall, whatever the trigger is: on a coarse pointer the ⓘ carries a 44px
|
|
238
238
|
// TAP_TARGET, and as a flex child it grew the row 24px a frame AFTER first paint, so the
|
|
239
|
-
// browser's scroll anchoring moved a restored Back by 24px (forge task 2717).
|
|
239
|
+
// browser's scroll anchoring moved a restored Back by 24px (forge task 2717). Centered in
|
|
240
240
|
// a box this short it overflows evenly instead — the hit area stays 44px, the row 20px.
|
|
241
241
|
<span data-cb-page-subtitle-hint='' className='inline-flex h-5 shrink-0 items-center'>
|
|
242
242
|
<InfoHint label='The full description'>
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
* 🔴 **The seam is keyboard-operable.** Arrow keys move it by 2%, Home/End take it to the bounds.
|
|
15
15
|
*
|
|
16
16
|
* 🔴 **The hit strip lives inside the seam's own track** — a real flex item, never a bar hung over
|
|
17
|
-
* the boundary. An invisible strip
|
|
17
|
+
* the boundary. An invisible strip centered on the seam sits over the first pixels of the pane beside
|
|
18
18
|
* it and swallows clicks nobody aimed at it (desk's file `21`, where a 44px hit area ate a fill
|
|
19
19
|
* handle). So the track is a few pixels wide for the hand, painted the panes' own ground
|
|
20
20
|
* (`--cb-panesplit-ground`) with the hairline drawn down its middle: to the eye, two panes and one
|
|
@@ -64,7 +64,7 @@ export interface PathTextProps {
|
|
|
64
64
|
*
|
|
65
65
|
* 🔴 It paints as a {@link CodeChip} since unit 11, which is `DESIGN.md` §3's
|
|
66
66
|
* "monospace code block with a subtle background tint layer". The tint is what
|
|
67
|
-
* makes a path read as a LITERAL rather than as prose that happens to be
|
|
67
|
+
* makes a path read as a LITERAL rather than as prose that happens to be gray —
|
|
68
68
|
* one token, one border, shared with every other inline literal in the fleet.
|
|
69
69
|
*/
|
|
70
70
|
export function PathText({
|
|
@@ -92,7 +92,7 @@ describe('usePointerDrag', () => {
|
|
|
92
92
|
expect(after.defaultPrevented).toBe(false);
|
|
93
93
|
});
|
|
94
94
|
|
|
95
|
-
test('Escape abandons a drag —
|
|
95
|
+
test('Escape abandons a drag — canceled, never dropped', () => {
|
|
96
96
|
const onDrop = mock();
|
|
97
97
|
const onCancel = mock();
|
|
98
98
|
render(<Harness onDrop={onDrop} onCancel={onCancel} />);
|
|
@@ -20,7 +20,7 @@ function B(props: ButtonHTMLAttributes<HTMLButtonElement> & { ref?: Ref<HTMLButt
|
|
|
20
20
|
/**
|
|
21
21
|
* Owner report, 2026-09-27, on an iPhone: menus that stayed open after tapping away (flix's
|
|
22
22
|
* subtitle menu, music's folder menu). Each was a hand-rolled panel with no outside-press
|
|
23
|
-
* handling. These pin the
|
|
23
|
+
* handling. These pin the behavior every app now gets from this one component.
|
|
24
24
|
*/
|
|
25
25
|
function Harness({ modal = false }: { modal?: boolean }) {
|
|
26
26
|
const [open, setOpen] = useState(false);
|
|
@@ -243,7 +243,7 @@ describe('full screen', () => {
|
|
|
243
243
|
describe('an app-declared container', () => {
|
|
244
244
|
/*
|
|
245
245
|
* desk keeps its tokens on `.cs-root`, so a panel portalled to `body` draws with no
|
|
246
|
-
*
|
|
246
|
+
* colors and no z-index. `FloatingContainer` names where the app's panels mount.
|
|
247
247
|
*/
|
|
248
248
|
test('the panel mounts in the container the app named, not in body', () => {
|
|
249
249
|
const host = document.createElement('div');
|
|
@@ -55,7 +55,7 @@ export interface PopoverProps {
|
|
|
55
55
|
className?: string;
|
|
56
56
|
/**
|
|
57
57
|
* Drop the belt's surface — border, background, shadow, padding, arrow — and keep only
|
|
58
|
-
* the
|
|
58
|
+
* the behavior: positioning, collision flipping, and closing on a tap or click outside,
|
|
59
59
|
* on Escape and on focus leaving. For a panel that belongs to its own visual language
|
|
60
60
|
* (a video player's controls over the picture); `className` then carries the look.
|
|
61
61
|
*/
|
|
@@ -70,7 +70,7 @@ export interface PropertyProps extends Omit<HTMLAttributes<HTMLDivElement>, "chi
|
|
|
70
70
|
*
|
|
71
71
|
* The row is a `display: contents` wrapper, so the label and value sit on the LIST's shared
|
|
72
72
|
* tracks. Anything else given to it — a `className`, a `data-type`, a `data-tone` — lands on that
|
|
73
|
-
* wrapper, which is what lets an app hang its own
|
|
73
|
+
* wrapper, which is what lets an app hang its own customizing (a highlighted override, a row a
|
|
74
74
|
* test finds by type, tools shown on `:hover`) off the row without hand-rolling one (desk, task
|
|
75
75
|
* 2823: ten `<dl>`s whose rows each carried exactly that).
|
|
76
76
|
*/
|
|
@@ -91,14 +91,14 @@ function shortcutLabel(shortcut: string): string {
|
|
|
91
91
|
* The owner, 2026-10-10, on vault's entry form: *"I saw we don't style the dropdowns and that
|
|
92
92
|
* is a violation of our design requirements … cb should have components that handle this."*
|
|
93
93
|
* Its Type, Folder and field-kind controls were {@link NativeSelect}s, whose list the OS
|
|
94
|
-
* draws — on macOS a
|
|
94
|
+
* draws — on macOS a gray system menu no stylesheet reaches — beside a tree picker and a
|
|
95
95
|
* chip input that each looked different again. Three controls for one job, one of them not
|
|
96
96
|
* ours to style. This is the one control for "set a property of this record", drawn
|
|
97
97
|
* entirely by the kit, searchable the moment the list is long enough to need it.
|
|
98
98
|
*
|
|
99
99
|
* ── Which control to reach for ──────────────────────────────────────────────────
|
|
100
100
|
* - A property of the record being edited, in a header row → this.
|
|
101
|
-
* - A
|
|
101
|
+
* - A labeled field in a form column → {@link SelectField} / {@link ComboboxField}.
|
|
102
102
|
* - Choose-and-act-now (File under…) → {@link ChoiceMenu}.
|
|
103
103
|
*/
|
|
104
104
|
export function PropertyPicker(props: PropertyPickerProps) {
|
|
@@ -74,7 +74,7 @@ export function RatingField({
|
|
|
74
74
|
onKeyDown={onKeyDown}
|
|
75
75
|
className={cn(RAW_BUTTON,
|
|
76
76
|
'inline-flex items-center justify-center rounded p-1 transition focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-field-ring/40 disabled:cursor-not-allowed',
|
|
77
|
-
// DESIGN.md §5: a 28px star is a miss on a phone, and the
|
|
77
|
+
// DESIGN.md §5: a 28px star is a miss on a phone, and the neighboring
|
|
78
78
|
// star is a different rating.
|
|
79
79
|
TAP_TARGET,
|
|
80
80
|
filled ? 'text-warning' : 'text-muted-foreground hover:text-warning',
|
|
@@ -54,9 +54,9 @@ const DOT: Record<SaveState, string> = {
|
|
|
54
54
|
* At rest (`idle`, `saved`) the dot says it on its own and the label is spoken, not drawn —
|
|
55
55
|
* the owner: *"the green circle with a tooltip is fine so it doesn't have to take up space
|
|
56
56
|
* with the word there"*. `Saving…`, `3 unsaved`, `Changed elsewhere` and `Save failed` are
|
|
57
|
-
* each a state somebody has to act on, and a
|
|
57
|
+
* each a state somebody has to act on, and a colored dot is not a sentence, so those are
|
|
58
58
|
* drawn. 🔴 The resting label is `sr-only`, never deleted: whether work is written is
|
|
59
|
-
* exactly what a screen reader user cannot infer from a
|
|
59
|
+
* exactly what a screen reader user cannot infer from a color.
|
|
60
60
|
*
|
|
61
61
|
* `data-cb-save-indicator`, `data-state` and `data-saves` are stable test hooks.
|
|
62
62
|
*
|
|
@@ -26,7 +26,7 @@ export interface SearchInputProps extends Omit<InputProps, 'value' | 'onChange'
|
|
|
26
26
|
showSyntaxBadge?: boolean;
|
|
27
27
|
/** Classes for the wrapper, which carries the width. */
|
|
28
28
|
className?: string;
|
|
29
|
-
/** Classes for the `<input>` itself —
|
|
29
|
+
/** Classes for the `<input>` itself — colors, radius, text size. */
|
|
30
30
|
inputClassName?: string;
|
|
31
31
|
/**
|
|
32
32
|
* Draw a ✕ that empties the box (and keeps the caret in it) while there is text to clear.
|
|
@@ -96,7 +96,7 @@ export interface SecretInputProps extends StyleableProps<SecretInputSlot> {
|
|
|
96
96
|
* `copyThenClear`, which WIPES the clipboard ~45s later — and because this
|
|
97
97
|
* component owned the copy, the vault shipped two copy affordances side by
|
|
98
98
|
* side: a text link that cleared, and this button, which left the password on
|
|
99
|
-
* the clipboard for ever. A primitive whose
|
|
99
|
+
* the clipboard for ever. A primitive whose behavior an app cannot correct
|
|
100
100
|
* gets worked around, and the workaround is the bug.
|
|
101
101
|
*
|
|
102
102
|
* `onCopied` still fires afterwards, so a toast stays in one place.
|
|
@@ -13,7 +13,7 @@ export interface SectionProps extends Omit<HTMLAttributes<HTMLElement>, 'title'>
|
|
|
13
13
|
/** Right-anchored section-level controls. */
|
|
14
14
|
actions?: ReactNode;
|
|
15
15
|
/**
|
|
16
|
-
* `plain` (default) — a
|
|
16
|
+
* `plain` (default) — a labeled band on the page background: its title sits
|
|
17
17
|
* over a 1px hairline rule, and whitespace does the rest (LAY-5, task 2461 —
|
|
18
18
|
* settings, forms and control panels read better cardless).
|
|
19
19
|
* `card` — the same header/body in a bordered, tinted container. An explicit
|
|
@@ -21,7 +21,7 @@ function renderNav(value = 'general', onValueChange = mock((_id: string) => {}))
|
|
|
21
21
|
}
|
|
22
22
|
|
|
23
23
|
describe('SectionNav', () => {
|
|
24
|
-
test('a
|
|
24
|
+
test('a labeled nav of list items carrying each section’s words', () => {
|
|
25
25
|
const { getByRole, getAllByRole, button } = renderNav();
|
|
26
26
|
expect(getByRole('navigation', { name: 'Settings' })).toBeTruthy();
|
|
27
27
|
const words = getAllByRole('listitem').map((li) => li.textContent);
|
|
@@ -29,7 +29,7 @@ describe('SectionNav', () => {
|
|
|
29
29
|
// No preflight in some hosts: the list resets its own bullets and indent.
|
|
30
30
|
const list = getByRole('list').className.split(/\s+/);
|
|
31
31
|
expect(list).toEqual(expect.arrayContaining(['list-none', 'm-0', 'p-0']));
|
|
32
|
-
// …and each item its own ground, family and weight (no
|
|
32
|
+
// …and each item its own ground, family and weight (no gray button box, no button font).
|
|
33
33
|
const general = button('Fields').className.split(/\s+/);
|
|
34
34
|
expect(general).toEqual(expect.arrayContaining(['border-0', 'bg-transparent', 'font-[inherit]', 'font-normal']));
|
|
35
35
|
});
|
|
@@ -80,7 +80,7 @@ describe('SectionNav', () => {
|
|
|
80
80
|
expect(document.activeElement).toBe(button('Billing'));
|
|
81
81
|
});
|
|
82
82
|
|
|
83
|
-
test('the marker’s words are in the item’s accessible name, never
|
|
83
|
+
test('the marker’s words are in the item’s accessible name, never color alone', () => {
|
|
84
84
|
const { button } = renderNav();
|
|
85
85
|
const notify = button('Notifications');
|
|
86
86
|
expect(notify.textContent).toContain('Unsaved changes');
|