cursedbelt 1.0.0 → 2.5.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/client/index.js +1 -1
- package/dist/core/category/index.d.ts.map +1 -1
- package/dist/core/category/index.js +2 -1
- package/dist/core/category/index.js.map +1 -1
- package/dist/core/category/types.js +1 -1
- package/dist/core/category/types.js.map +1 -1
- package/dist/core/file-tree/fileTreeModel.d.ts +49 -0
- package/dist/core/file-tree/fileTreeModel.d.ts.map +1 -1
- package/dist/core/file-tree/fileTreeModel.js +84 -0
- package/dist/core/file-tree/fileTreeModel.js.map +1 -1
- package/dist/core/layout/index.js +1 -1
- package/dist/core/layout/index.js.map +1 -1
- package/dist/core/media/index.js +1 -1
- package/dist/core/media/index.js.map +1 -1
- package/dist/core/media/types.js +1 -1
- package/dist/core/media/types.js.map +1 -1
- package/dist/core/media/uploadLimits.js +1 -1
- package/dist/core/media/uploadLimits.js.map +1 -1
- package/dist/core/sharing/model.d.ts +1 -1
- package/dist/ctgr/index.js +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/react/activity-bar/ActivityBar.d.ts +17 -0
- package/dist/react/activity-bar/ActivityBar.d.ts.map +1 -1
- package/dist/react/activity-bar/ActivityBar.js.map +1 -1
- package/dist/react/analytics/index.d.ts +1 -1
- package/dist/react/analytics/index.js +1 -1
- package/dist/react/chat/MessageComposer.d.ts.map +1 -1
- package/dist/react/chat/MessageComposer.js +5 -4
- package/dist/react/chat/MessageComposer.js.map +1 -1
- package/dist/react/components/Button.d.ts.map +1 -1
- package/dist/react/components/Button.js +3 -2
- package/dist/react/components/Button.js.map +1 -1
- package/dist/react/components/Checkbox.d.ts +19 -3
- package/dist/react/components/Checkbox.d.ts.map +1 -1
- package/dist/react/components/Checkbox.js +29 -12
- package/dist/react/components/Checkbox.js.map +1 -1
- package/dist/react/components/CodeArea.d.ts.map +1 -1
- package/dist/react/components/CodeArea.js +2 -1
- package/dist/react/components/CodeArea.js.map +1 -1
- package/dist/react/components/Collapsible.d.ts.map +1 -1
- package/dist/react/components/Collapsible.js +2 -1
- package/dist/react/components/Collapsible.js.map +1 -1
- package/dist/react/components/ComboboxField.d.ts.map +1 -1
- package/dist/react/components/ComboboxField.js +3 -2
- package/dist/react/components/ComboboxField.js.map +1 -1
- package/dist/react/components/CopyButton.d.ts.map +1 -1
- package/dist/react/components/CopyButton.js +2 -1
- package/dist/react/components/CopyButton.js.map +1 -1
- package/dist/react/components/DataTable/ColumnChecklist.d.ts.map +1 -1
- package/dist/react/components/DataTable/ColumnChecklist.js +2 -1
- package/dist/react/components/DataTable/ColumnChecklist.js.map +1 -1
- package/dist/react/components/DataTable/Pagination.d.ts.map +1 -1
- package/dist/react/components/DataTable/Pagination.js +2 -1
- package/dist/react/components/DataTable/Pagination.js.map +1 -1
- package/dist/react/components/DataTable/SortHeader.d.ts.map +1 -1
- package/dist/react/components/DataTable/SortHeader.js +2 -1
- package/dist/react/components/DataTable/SortHeader.js.map +1 -1
- package/dist/react/components/DataTable/TableFilterBuilder.d.ts +61 -0
- package/dist/react/components/DataTable/TableFilterBuilder.d.ts.map +1 -0
- package/dist/react/components/DataTable/{FilterBuilder.js → TableFilterBuilder.js} +26 -3
- package/dist/react/components/DataTable/TableFilterBuilder.js.map +1 -0
- package/dist/react/components/DataTable/Toolbar.d.ts +1 -1
- package/dist/react/components/DataTable/Toolbar.js +3 -3
- package/dist/react/components/DataTable/Toolbar.js.map +1 -1
- package/dist/react/components/DataTable/cells/LinkCell.d.ts.map +1 -1
- package/dist/react/components/DataTable/cells/LinkCell.js +2 -1
- package/dist/react/components/DataTable/cells/LinkCell.js.map +1 -1
- package/dist/react/components/DataTable/index.d.ts +1 -1
- package/dist/react/components/DataTable/index.d.ts.map +1 -1
- package/dist/react/components/DataTable/index.js +4 -1
- package/dist/react/components/DataTable/index.js.map +1 -1
- package/dist/react/components/DragHandle.d.ts.map +1 -1
- package/dist/react/components/DragHandle.js +2 -1
- package/dist/react/components/DragHandle.js.map +1 -1
- package/dist/react/components/EmojiField.d.ts.map +1 -1
- package/dist/react/components/EmojiField.js +2 -1
- package/dist/react/components/EmojiField.js.map +1 -1
- package/dist/react/components/EventTimeline.d.ts +3 -2
- package/dist/react/components/EventTimeline.d.ts.map +1 -1
- package/dist/react/components/EventTimeline.js +3 -2
- package/dist/react/components/EventTimeline.js.map +1 -1
- package/dist/react/components/IconButton.d.ts +1 -1
- package/dist/react/components/IconButton.js +1 -1
- package/dist/react/components/InfoHint.d.ts.map +1 -1
- package/dist/react/components/InfoHint.js +5 -4
- package/dist/react/components/InfoHint.js.map +1 -1
- package/dist/react/components/InheritBadge.js +1 -1
- package/dist/react/components/InheritBadge.js.map +1 -1
- package/dist/react/components/InlineEditableText.d.ts.map +1 -1
- package/dist/react/components/InlineEditableText.js +2 -1
- package/dist/react/components/InlineEditableText.js.map +1 -1
- package/dist/react/components/MeterList.d.ts.map +1 -1
- package/dist/react/components/MeterList.js +2 -1
- package/dist/react/components/MeterList.js.map +1 -1
- package/dist/react/components/PathText.d.ts +2 -2
- package/dist/react/components/PathText.d.ts.map +1 -1
- package/dist/react/components/PathText.js +2 -1
- package/dist/react/components/PathText.js.map +1 -1
- package/dist/react/components/RatingField.d.ts.map +1 -1
- package/dist/react/components/RatingField.js +2 -1
- package/dist/react/components/RatingField.js.map +1 -1
- package/dist/react/components/SecretInput.js +3 -2
- package/dist/react/components/SecretInput.js.map +1 -1
- package/dist/react/components/SegmentedControl.d.ts.map +1 -1
- package/dist/react/components/SegmentedControl.js +2 -1
- package/dist/react/components/SegmentedControl.js.map +1 -1
- package/dist/react/components/StarRating.d.ts.map +1 -1
- package/dist/react/components/StarRating.js +9 -5
- package/dist/react/components/StarRating.js.map +1 -1
- package/dist/react/components/StatStrip.d.ts.map +1 -1
- package/dist/react/components/StatStrip.js +2 -1
- package/dist/react/components/StatStrip.js.map +1 -1
- package/dist/react/components/StatTile.d.ts.map +1 -1
- package/dist/react/components/StatTile.js +3 -2
- package/dist/react/components/StatTile.js.map +1 -1
- package/dist/react/components/Tabs.d.ts.map +1 -1
- package/dist/react/components/Tabs.js +2 -1
- package/dist/react/components/Tabs.js.map +1 -1
- package/dist/react/components/TruncatedText.d.ts +2 -1
- package/dist/react/components/TruncatedText.d.ts.map +1 -1
- package/dist/react/components/TruncatedText.js +2 -1
- package/dist/react/components/TruncatedText.js.map +1 -1
- package/dist/react/components/calendar/MonthGrid.d.ts.map +1 -1
- package/dist/react/components/calendar/MonthGrid.js +2 -1
- package/dist/react/components/calendar/MonthGrid.js.map +1 -1
- package/dist/react/components/calendar/WeekView.d.ts.map +1 -1
- package/dist/react/components/calendar/WeekView.js +2 -1
- package/dist/react/components/calendar/WeekView.js.map +1 -1
- package/dist/react/components/revealOnHover.d.ts.map +1 -1
- package/dist/react/components/revealOnHover.js +2 -1
- package/dist/react/components/revealOnHover.js.map +1 -1
- package/dist/react/file-tree/FileTree.d.ts +50 -1
- package/dist/react/file-tree/FileTree.d.ts.map +1 -1
- package/dist/react/file-tree/FileTree.js +234 -6
- package/dist/react/file-tree/FileTree.js.map +1 -1
- package/dist/react/file-tree/fileTree.css +52 -0
- package/dist/react/filter-rail/FilterRail.d.ts.map +1 -1
- package/dist/react/filter-rail/FilterRail.js +5 -4
- package/dist/react/filter-rail/FilterRail.js.map +1 -1
- package/dist/react/folder-tree/FolderTreeRail.d.ts.map +1 -1
- package/dist/react/folder-tree/FolderTreeRail.js +2 -1
- package/dist/react/folder-tree/FolderTreeRail.js.map +1 -1
- package/dist/react/index.d.ts +5 -1
- package/dist/react/index.d.ts.map +1 -1
- package/dist/react/index.js +5 -1
- package/dist/react/index.js.map +1 -1
- package/dist/react/layoutEngine/index.js +1 -1
- package/dist/react/layoutEngine/index.js.map +1 -1
- package/dist/react/lib/field.d.ts.map +1 -1
- package/dist/react/lib/field.js +3 -2
- package/dist/react/lib/field.js.map +1 -1
- package/dist/react/lib/floatingStyles.d.ts.map +1 -1
- package/dist/react/lib/floatingStyles.js +2 -1
- package/dist/react/lib/floatingStyles.js.map +1 -1
- package/dist/react/lib/tapTarget.d.ts +96 -0
- package/dist/react/lib/tapTarget.d.ts.map +1 -0
- package/dist/react/lib/tapTarget.js +96 -0
- package/dist/react/lib/tapTarget.js.map +1 -0
- package/dist/react/media/VideoTrimmer.d.ts +1 -1
- package/dist/react/media/VideoTrimmer.js +1 -1
- package/dist/react/media/denseGallery.css +3 -3
- package/dist/react/media/ffmpegWasm.js +2 -2
- package/dist/react/media/ffmpegWasm.js.map +1 -1
- package/dist/react/media/videoPlayer.css +42 -0
- package/dist/react/namespace/NamespaceTargetCapsule.d.ts +2 -2
- package/dist/react/namespace/NamespaceTargetCapsule.d.ts.map +1 -1
- package/dist/react/nav/BreadcrumbTrail.d.ts.map +1 -1
- package/dist/react/nav/BreadcrumbTrail.js +4 -3
- package/dist/react/nav/BreadcrumbTrail.js.map +1 -1
- package/dist/react/nav/HubTileGrid.d.ts.map +1 -1
- package/dist/react/nav/HubTileGrid.js +2 -1
- package/dist/react/nav/HubTileGrid.js.map +1 -1
- package/dist/react/nav/SideNav.d.ts.map +1 -1
- package/dist/react/nav/SideNav.js +4 -3
- package/dist/react/nav/SideNav.js.map +1 -1
- package/dist/react/nav/SideNavCustomize.d.ts.map +1 -1
- package/dist/react/nav/SideNavCustomize.js +2 -1
- package/dist/react/nav/SideNavCustomize.js.map +1 -1
- package/dist/react/palette/CommandPalette.d.ts.map +1 -1
- package/dist/react/palette/CommandPalette.js +3 -2
- package/dist/react/palette/CommandPalette.js.map +1 -1
- package/dist/server/drivers/pooledControlStores.pg.test.js +1 -0
- package/dist/server/drivers/pooledControlStores.pg.test.js.map +1 -1
- package/dist/server/drivers/pooledIdentityStore.pg.test.js +1 -0
- package/dist/server/drivers/pooledIdentityStore.pg.test.js.map +1 -1
- package/dist/server/drivers/retentionPolicy.pg.test.js +1 -0
- package/dist/server/drivers/retentionPolicy.pg.test.js.map +1 -1
- package/dist/server/guard/argon2Binding.d.ts +1 -1
- package/dist/server/guard/argon2Binding.js +1 -1
- package/dist/server/incidents/store.d.ts +3 -3
- package/dist/server/index.js +1 -1
- package/dist/server/index.js.map +1 -1
- package/dist/server/master-lock/masterLock.d.ts +1 -1
- package/dist/server/media-bun/index.js +1 -1
- package/dist/server/media-bun/index.js.map +1 -1
- package/dist/server/paths/appDataHome.d.ts +20 -0
- package/dist/server/paths/appDataHome.d.ts.map +1 -0
- package/dist/server/paths/appDataHome.js +69 -0
- package/dist/server/paths/appDataHome.js.map +1 -0
- package/dist/server/retention/archive.d.ts +3 -4
- package/dist/server/retention/archive.d.ts.map +1 -1
- package/dist/server/retention/archive.js +20 -15
- package/dist/server/retention/archive.js.map +1 -1
- package/dist/server/retention/index.d.ts +1 -1
- package/dist/server/retention/index.js +1 -1
- package/dist/server/retention/policy.d.ts +2 -2
- package/dist/server/retention/policy.d.ts.map +1 -1
- package/dist/server/retention/policy.js +1 -1
- package/dist/server/retention/store.d.ts.map +1 -1
- package/dist/server/retention/store.js +27 -20
- package/dist/server/retention/store.js.map +1 -1
- package/dist/server/runtime/localHost.d.ts +10 -5
- package/dist/server/runtime/localHost.d.ts.map +1 -1
- package/dist/server/runtime/localHost.js +12 -8
- package/dist/server/runtime/localHost.js.map +1 -1
- package/dist/server/runtime/meterRollup.pg.test.js +1 -0
- package/dist/server/runtime/meterRollup.pg.test.js.map +1 -1
- package/dist/server/runtime/recipe.d.ts +4 -4
- package/dist/server/runtime/retentionJob.pg.test.js +1 -0
- package/dist/server/runtime/retentionJob.pg.test.js.map +1 -1
- package/dist/server/search/pgSearchProvider.pg.test.js +1 -0
- package/dist/server/search/pgSearchProvider.pg.test.js.map +1 -1
- package/dist/shared/errors.d.ts +1 -1
- package/dist/shared/errors.js +1 -1
- package/dist/styles-static.css +413 -0
- package/dist/styles-utilities.css +5074 -0
- package/dist/styles.css +49 -0
- package/package.json +30 -168
- package/scripts/generateStaticStyles.ts +122 -0
- package/scripts/generateUtilityStyles.ts +215 -0
- package/scripts/publicSurface.ts +455 -0
- package/scripts/testTmpRoot.ts +34 -5
- package/src/client/index.ts +1 -1
- package/src/core/category/index.ts +2 -1
- package/src/core/category/types.ts +1 -1
- package/src/core/file-tree/fileTreeModel.spec.ts +134 -0
- package/src/core/file-tree/fileTreeModel.ts +104 -0
- package/src/core/layout/index.ts +1 -1
- package/src/core/media/index.ts +1 -1
- package/src/core/media/types.ts +1 -1
- package/src/core/media/uploadLimits.ts +1 -1
- package/src/core/sharing/model.ts +1 -1
- package/src/ctgr/index.ts +1 -1
- package/src/declaredDepsAreImported.spec.ts +87 -0
- package/src/demoFixture.spec.ts +133 -0
- package/src/index.ts +1 -1
- package/src/lockfileIsTracked.spec.ts +50 -0
- package/src/namedSubpathsResolve.spec.ts +119 -0
- package/src/publicSurface.spec.ts +72 -0
- package/src/react/activity-bar/ActivityBar.tsx +17 -0
- package/src/react/analytics/index.ts +1 -1
- package/src/react/chat/MessageComposer.tsx +5 -4
- package/src/react/components/Button.tsx +3 -2
- package/src/react/components/Checkbox.spec.tsx +51 -0
- package/src/react/components/Checkbox.tsx +68 -26
- package/src/react/components/CodeArea.tsx +2 -1
- package/src/react/components/CodeChip.spec.tsx +2 -2
- package/src/react/components/Collapsible.tsx +2 -1
- package/src/react/components/ComboboxField.tsx +3 -2
- package/src/react/components/CopyButton.tsx +2 -1
- package/src/react/components/CopyableText.spec.tsx +1 -1
- package/src/react/components/DataTable/ColumnChecklist.tsx +2 -1
- package/src/react/components/DataTable/Pagination.tsx +2 -1
- package/src/react/components/DataTable/SortHeader.tsx +2 -1
- package/src/react/components/DataTable/{FilterBuilder.tsx → TableFilterBuilder.tsx} +33 -5
- package/src/react/components/DataTable/Toolbar.tsx +3 -3
- package/src/react/components/DataTable/cells/LinkCell.tsx +2 -1
- package/src/react/components/DataTable/index.ts +8 -1
- package/src/react/components/DragHandle.tsx +2 -1
- package/src/react/components/EmojiField.tsx +2 -1
- package/src/react/components/EventTimeline.tsx +3 -2
- package/src/react/components/FileLocation.spec.tsx +1 -1
- package/src/react/components/IconButton.tsx +1 -1
- package/src/react/components/InfoHint.tsx +5 -4
- package/src/react/components/InheritBadge.tsx +1 -1
- package/src/react/components/InlineEditableText.tsx +2 -1
- package/src/react/components/MeterList.tsx +2 -1
- package/src/react/components/PathText.tsx +4 -3
- package/src/react/components/RatingField.tsx +2 -1
- package/src/react/components/SecretInput.tsx +3 -3
- package/src/react/components/SegmentedControl.tsx +2 -2
- package/src/react/components/StarRating.spec.tsx +2 -2
- package/src/react/components/StarRating.tsx +9 -5
- package/src/react/components/StatStrip.tsx +2 -1
- package/src/react/components/StatTile.tsx +3 -3
- package/src/react/components/Tabs.spec.tsx +3 -2
- package/src/react/components/Tabs.tsx +2 -1
- package/src/react/components/TruncatedText.tsx +2 -1
- package/src/react/components/calendar/MonthGrid.spec.tsx +2 -1
- package/src/react/components/calendar/MonthGrid.tsx +2 -1
- package/src/react/components/calendar/WeekView.tsx +2 -1
- package/src/react/components/revealOnHover.ts +3 -2
- package/src/react/file-tree/FileTree.spec.tsx +248 -0
- package/src/react/file-tree/FileTree.tsx +304 -4
- package/src/react/file-tree/fileTree.css +52 -0
- package/src/react/file-tree/fileTreeGeometry.fixture.json +151 -0
- package/src/react/file-tree/fileTreeGeometry.spec.ts +33 -52
- package/src/react/filter-rail/FilterRail.spec.tsx +2 -1
- package/src/react/filter-rail/FilterRail.tsx +5 -4
- package/src/react/folder-tree/FolderTreeRail.tsx +2 -1
- package/src/react/index.ts +13 -3
- package/src/react/layoutEngine/index.ts +1 -1
- package/src/react/layoutEngine/types.ts +1 -1
- package/src/react/lib/field.ts +4 -2
- package/src/react/lib/floatingStyles.spec.ts +2 -1
- package/src/react/lib/floatingStyles.ts +3 -1
- package/src/react/lib/tapTarget.ts +100 -0
- package/src/react/media/MaskPainter.tsx +2 -2
- package/src/react/media/VideoTrimmer.tsx +1 -1
- package/src/react/media/denseGallery.css +3 -3
- package/src/react/media/ffmpegWasm.ts +2 -2
- package/src/react/media/videoPlayer.css +42 -0
- package/src/react/namespace/NamespaceTargetCapsule.tsx +2 -2
- package/src/react/nav/BreadcrumbTrail.tsx +4 -3
- package/src/react/nav/HubTileGrid.tsx +2 -1
- package/src/react/nav/SideNav.tsx +4 -3
- package/src/react/nav/SideNavCustomize.tsx +2 -1
- package/src/react/palette/CommandPalette.tsx +3 -2
- package/src/server/ctgr.ts +1 -1
- package/src/server/drivers/pooledControlStores.pg.test.ts +1 -0
- package/src/server/drivers/pooledIdentityStore.pg.test.ts +1 -0
- package/src/server/drivers/retentionPolicy.pg.test.ts +1 -0
- package/src/server/guard/argon2Binding.ts +1 -1
- package/src/server/incidents/store.ts +3 -3
- package/src/server/index.ts +1 -1
- package/src/server/master-lock/masterLock.spec.ts +18 -2
- package/src/server/master-lock/masterLock.ts +1 -1
- package/src/server/media-bun/image.spec.ts +1 -0
- package/src/server/media-bun/index.ts +1 -1
- package/src/server/media-bun/video.spec.ts +1 -0
- package/src/server/paths/appDataHome.spec.ts +87 -0
- package/src/server/paths/appDataHome.ts +84 -0
- package/src/server/retention/archive.spec.ts +26 -4
- package/src/server/retention/archive.ts +20 -15
- package/src/server/retention/index.ts +1 -1
- package/src/server/retention/policy.ts +2 -2
- package/src/server/retention/store.spec.ts +38 -10
- package/src/server/retention/store.ts +26 -19
- package/src/server/runtime/localHost.spec.ts +22 -3
- package/src/server/runtime/localHost.ts +12 -9
- package/src/server/runtime/meterRollup.pg.test.ts +1 -0
- package/src/server/runtime/recipe.ts +4 -4
- package/src/server/runtime/retentionJob.pg.test.ts +1 -0
- package/src/server/search/pgSearchProvider.pg.test.ts +1 -0
- package/src/server/storage/binaryServerProcessing.integration.spec.ts +6 -2
- package/src/server/storage/chunked.integration.spec.ts +5 -2
- package/src/server/storage/fileUploadClient-chunked.integration.spec.ts +5 -2
- package/src/server/storage/files/adapter.photo.display.spec.ts +1 -0
- package/src/server/storage/imageThumbnail.spec.ts +1 -0
- package/src/server/storage/transcode.integration.spec.ts +5 -2
- package/src/server/storage/videoProcessor.posterOnly.spec.ts +1 -0
- package/src/shared/errors.ts +1 -1
- package/src/skippedTestsAreAnswered.spec.ts +215 -0
- package/src/styles-static.css +413 -0
- package/src/styles-utilities.css +5074 -0
- package/src/styles.css +49 -0
- package/src/stylesStaticMatches.spec.ts +134 -0
- package/src/stylesUtilitiesMatches.spec.ts +314 -0
- package/src/tapTargetStylesheet.spec.ts +150 -0
- package/src/testTmpRoot.spec.ts +102 -0
- package/dist/core/duplicates/index.d.ts +0 -116
- package/dist/core/duplicates/index.d.ts.map +0 -1
- package/dist/core/duplicates/index.js +0 -178
- package/dist/core/duplicates/index.js.map +0 -1
- package/dist/core/namespace/helpers.d.ts +0 -14
- package/dist/core/namespace/helpers.d.ts.map +0 -1
- package/dist/core/namespace/helpers.js +0 -29
- package/dist/core/namespace/helpers.js.map +0 -1
- package/dist/core/namespace/index.d.ts +0 -4
- package/dist/core/namespace/index.d.ts.map +0 -1
- package/dist/core/namespace/index.js +0 -6
- package/dist/core/namespace/index.js.map +0 -1
- package/dist/core/namespace/memoryStore.d.ts +0 -19
- package/dist/core/namespace/memoryStore.d.ts.map +0 -1
- package/dist/core/namespace/memoryStore.js +0 -70
- package/dist/core/namespace/memoryStore.js.map +0 -1
- package/dist/core/namespace/types.d.ts +0 -44
- package/dist/core/namespace/types.d.ts.map +0 -1
- package/dist/core/namespace/types.js +0 -8
- package/dist/core/namespace/types.js.map +0 -1
- package/dist/game/core/DisposeRegistry.d.ts +0 -42
- package/dist/game/core/DisposeRegistry.d.ts.map +0 -1
- package/dist/game/core/DisposeRegistry.js +0 -67
- package/dist/game/core/DisposeRegistry.js.map +0 -1
- package/dist/game/core/drawBudget.d.ts +0 -26
- package/dist/game/core/drawBudget.d.ts.map +0 -1
- package/dist/game/core/drawBudget.js +0 -55
- package/dist/game/core/drawBudget.js.map +0 -1
- package/dist/game/core/fixedTimestep.d.ts +0 -38
- package/dist/game/core/fixedTimestep.d.ts.map +0 -1
- package/dist/game/core/fixedTimestep.js +0 -47
- package/dist/game/core/fixedTimestep.js.map +0 -1
- package/dist/game/core/index.d.ts +0 -9
- package/dist/game/core/index.d.ts.map +0 -1
- package/dist/game/core/index.js +0 -8
- package/dist/game/core/index.js.map +0 -1
- package/dist/game/core/inputCollector.d.ts +0 -82
- package/dist/game/core/inputCollector.d.ts.map +0 -1
- package/dist/game/core/inputCollector.js +0 -176
- package/dist/game/core/inputCollector.js.map +0 -1
- package/dist/game/core/resizeCanvas.d.ts +0 -19
- package/dist/game/core/resizeCanvas.d.ts.map +0 -1
- package/dist/game/core/resizeCanvas.js +0 -29
- package/dist/game/core/resizeCanvas.js.map +0 -1
- package/dist/game/react/index.d.ts +0 -3
- package/dist/game/react/index.d.ts.map +0 -1
- package/dist/game/react/index.js +0 -5
- package/dist/game/react/index.js.map +0 -1
- package/dist/game/react/useGameEngine.d.ts +0 -64
- package/dist/game/react/useGameEngine.d.ts.map +0 -1
- package/dist/game/react/useGameEngine.js +0 -78
- package/dist/game/react/useGameEngine.js.map +0 -1
- package/dist/react/canvas/CanvasNavHUD.d.ts +0 -64
- package/dist/react/canvas/CanvasNavHUD.d.ts.map +0 -1
- package/dist/react/canvas/CanvasNavHUD.js +0 -58
- package/dist/react/canvas/CanvasNavHUD.js.map +0 -1
- package/dist/react/canvas/fitLabel.d.ts +0 -53
- package/dist/react/canvas/fitLabel.d.ts.map +0 -1
- package/dist/react/canvas/fitLabel.js +0 -104
- package/dist/react/canvas/fitLabel.js.map +0 -1
- package/dist/react/canvas/index.d.ts +0 -4
- package/dist/react/canvas/index.d.ts.map +0 -1
- package/dist/react/canvas/index.js +0 -4
- package/dist/react/canvas/index.js.map +0 -1
- package/dist/react/canvas/lod.d.ts +0 -40
- package/dist/react/canvas/lod.d.ts.map +0 -1
- package/dist/react/canvas/lod.js +0 -37
- package/dist/react/canvas/lod.js.map +0 -1
- package/dist/react/components/DataTable/FilterBuilder.d.ts +0 -38
- package/dist/react/components/DataTable/FilterBuilder.d.ts.map +0 -1
- package/dist/react/components/DataTable/FilterBuilder.js.map +0 -1
- package/dist/react/seo/HeadProvider.d.ts +0 -14
- package/dist/react/seo/HeadProvider.d.ts.map +0 -1
- package/dist/react/seo/HeadProvider.js +0 -44
- package/dist/react/seo/HeadProvider.js.map +0 -1
- package/dist/react/seo/applyHeadToDocument.d.ts +0 -3
- package/dist/react/seo/applyHeadToDocument.d.ts.map +0 -1
- package/dist/react/seo/applyHeadToDocument.js +0 -66
- package/dist/react/seo/applyHeadToDocument.js.map +0 -1
- package/dist/react/seo/index.d.ts +0 -3
- package/dist/react/seo/index.d.ts.map +0 -1
- package/dist/react/seo/index.js +0 -7
- package/dist/react/seo/index.js.map +0 -1
- package/dist/react/timeline/ClipView.d.ts +0 -29
- package/dist/react/timeline/ClipView.d.ts.map +0 -1
- package/dist/react/timeline/ClipView.js +0 -53
- package/dist/react/timeline/ClipView.js.map +0 -1
- package/dist/react/timeline/Playhead.d.ts +0 -16
- package/dist/react/timeline/Playhead.d.ts.map +0 -1
- package/dist/react/timeline/Playhead.js +0 -26
- package/dist/react/timeline/Playhead.js.map +0 -1
- package/dist/react/timeline/TimeRuler.d.ts +0 -21
- package/dist/react/timeline/TimeRuler.d.ts.map +0 -1
- package/dist/react/timeline/TimeRuler.js +0 -31
- package/dist/react/timeline/TimeRuler.js.map +0 -1
- package/dist/react/timeline/TimelineSurface.d.ts +0 -29
- package/dist/react/timeline/TimelineSurface.d.ts.map +0 -1
- package/dist/react/timeline/TimelineSurface.js +0 -56
- package/dist/react/timeline/TimelineSurface.js.map +0 -1
- package/dist/react/timeline/TrackLane.d.ts +0 -31
- package/dist/react/timeline/TrackLane.d.ts.map +0 -1
- package/dist/react/timeline/TrackLane.js +0 -32
- package/dist/react/timeline/TrackLane.js.map +0 -1
- package/dist/react/timeline/index.d.ts +0 -6
- package/dist/react/timeline/index.d.ts.map +0 -1
- package/dist/react/timeline/index.js +0 -12
- package/dist/react/timeline/index.js.map +0 -1
- package/dist/server/private-media/index.d.ts +0 -7
- package/dist/server/private-media/index.d.ts.map +0 -1
- package/dist/server/private-media/index.js +0 -13
- package/dist/server/private-media/index.js.map +0 -1
- package/dist/server/seo/index.d.ts +0 -3
- package/dist/server/seo/index.d.ts.map +0 -1
- package/dist/server/seo/index.js +0 -6
- package/dist/server/seo/index.js.map +0 -1
- package/dist/server/seo/mountSeoRoutes.d.ts +0 -9
- package/dist/server/seo/mountSeoRoutes.d.ts.map +0 -1
- package/dist/server/seo/mountSeoRoutes.js +0 -19
- package/dist/server/seo/mountSeoRoutes.js.map +0 -1
- package/dist/server/seo/serveHeadInjectedIndex.d.ts +0 -9
- package/dist/server/seo/serveHeadInjectedIndex.d.ts.map +0 -1
- package/dist/server/seo/serveHeadInjectedIndex.js +0 -20
- package/dist/server/seo/serveHeadInjectedIndex.js.map +0 -1
- package/dist/upload.d.ts +0 -148
- package/dist/upload.d.ts.map +0 -1
- package/dist/upload.js +0 -159
- package/dist/upload.js.map +0 -1
- package/dist/verify/runtime/index.d.ts +0 -16
- package/dist/verify/runtime/index.d.ts.map +0 -1
- package/dist/verify/runtime/index.js +0 -16
- package/dist/verify/runtime/index.js.map +0 -1
- package/scripts/demoCheck.ts +0 -42
- package/src/core/duplicates/index.spec.ts +0 -116
- package/src/core/duplicates/index.ts +0 -203
- package/src/core/namespace/helpers.ts +0 -31
- package/src/core/namespace/index.ts +0 -12
- package/src/core/namespace/memoryStore.ts +0 -77
- package/src/core/namespace/namespace.spec.ts +0 -117
- package/src/core/namespace/types.ts +0 -53
- package/src/game/core/DisposeRegistry.spec.ts +0 -53
- package/src/game/core/DisposeRegistry.ts +0 -70
- package/src/game/core/drawBudget.spec.ts +0 -51
- package/src/game/core/drawBudget.ts +0 -75
- package/src/game/core/fixedTimestep.spec.ts +0 -91
- package/src/game/core/fixedTimestep.ts +0 -79
- package/src/game/core/index.ts +0 -16
- package/src/game/core/inputCollector.spec.ts +0 -29
- package/src/game/core/inputCollector.ts +0 -245
- package/src/game/core/resizeCanvas.ts +0 -31
- package/src/game/react/index.ts +0 -10
- package/src/game/react/useGameEngine.ts +0 -125
- package/src/react/canvas/CanvasNavHUD.spec.tsx +0 -62
- package/src/react/canvas/CanvasNavHUD.tsx +0 -210
- package/src/react/canvas/fitLabel.spec.ts +0 -82
- package/src/react/canvas/fitLabel.ts +0 -150
- package/src/react/canvas/index.ts +0 -15
- package/src/react/canvas/lod.ts +0 -53
- package/src/react/seo/HeadProvider.tsx +0 -67
- package/src/react/seo/applyHeadToDocument.ts +0 -73
- package/src/react/seo/index.ts +0 -12
- package/src/react/seo/seo.spec.tsx +0 -101
- package/src/react/timeline/ClipView.tsx +0 -146
- package/src/react/timeline/Playhead.tsx +0 -63
- package/src/react/timeline/TimeRuler.tsx +0 -85
- package/src/react/timeline/TimelineSurface.tsx +0 -157
- package/src/react/timeline/TrackLane.tsx +0 -87
- package/src/react/timeline/index.ts +0 -12
- package/src/react/timeline/timeline.spec.tsx +0 -175
- package/src/server/private-media/index.ts +0 -45
- package/src/server/seo/index.ts +0 -8
- package/src/server/seo/mountSeoRoutes.ts +0 -37
- package/src/server/seo/seo.spec.ts +0 -128
- package/src/server/seo/serveHeadInjectedIndex.ts +0 -36
- package/src/upload.spec.ts +0 -300
- package/src/upload.ts +0 -288
- package/src/verify/runtime/index.ts +0 -64
|
@@ -2,6 +2,7 @@ import type { Column } from '@tanstack/react-table';
|
|
|
2
2
|
import { ArrowDown, ArrowUp, ArrowUpDown } from 'lucide-react';
|
|
3
3
|
import type { ReactNode } from 'react';
|
|
4
4
|
import { Tooltip } from '../Tooltip';
|
|
5
|
+
import { TAP_TARGET_HEIGHT } from '../../lib/tapTarget';
|
|
5
6
|
|
|
6
7
|
/**
|
|
7
8
|
* The full label, one hover away — and it is OURS, not the browser's.
|
|
@@ -84,7 +85,7 @@ export function SortHeader<TRow>({
|
|
|
84
85
|
// computed styles on orch's Fleet tab, 2026-08-12: `th` uppercase,
|
|
85
86
|
// `button` none. Letter-spacing does inherit (0.55px on both), so only
|
|
86
87
|
// the case needs restating.
|
|
87
|
-
className=
|
|
88
|
+
className={`-mx-1 -my-2.5 inline-flex max-w-full items-center gap-1 rounded px-1 py-2.5 uppercase transition-colors hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring ${TAP_TARGET_HEIGHT}`}
|
|
88
89
|
>
|
|
89
90
|
{/* min-w-0 so the label is what gives way in a narrow track — the sort
|
|
90
91
|
arrow is the affordance and must survive at any width. */}
|
|
@@ -18,13 +18,13 @@ import {
|
|
|
18
18
|
VALUELESS_OPS,
|
|
19
19
|
} from './filterQuery';
|
|
20
20
|
|
|
21
|
-
export interface
|
|
21
|
+
export interface TableFilterBuilderColumn {
|
|
22
22
|
key: string;
|
|
23
23
|
label: string;
|
|
24
24
|
}
|
|
25
25
|
|
|
26
|
-
export interface
|
|
27
|
-
columns:
|
|
26
|
+
export interface TableFilterBuilderProps {
|
|
27
|
+
columns: TableFilterBuilderColumn[];
|
|
28
28
|
value: FilterQuery;
|
|
29
29
|
onChange: (next: FilterQuery) => void;
|
|
30
30
|
className?: string;
|
|
@@ -36,7 +36,30 @@ const OP_OPTIONS = (Object.keys(FILTER_OP_LABELS) as FilterOp[]).map((op) => ({
|
|
|
36
36
|
}));
|
|
37
37
|
|
|
38
38
|
/**
|
|
39
|
-
* The filter builder — `(A and B) or (C and D)`, and the UX is the hard half.
|
|
39
|
+
* The TABLE's filter builder — `(A and B) or (C and D)`, and the UX is the hard half.
|
|
40
|
+
*
|
|
41
|
+
* ── 🔴 Why the name carries `Table`, 2026-09-13 ─────────────────────────────
|
|
42
|
+
* It was `FilterBuilder`, and `cursedesk` has a `FilterBuilder` of its own. The
|
|
43
|
+
* graduation pass that looked at the pair to decide which one should live here
|
|
44
|
+
* found they are not two copies of one component — they are two different
|
|
45
|
+
* components wearing one basename, which is the trap that makes the next person
|
|
46
|
+
* merge them wrongly:
|
|
47
|
+
*
|
|
48
|
+
* - **This one is a VIEW filter.** Two levels by construction (groups OR'd,
|
|
49
|
+
* conditions AND'd inside one), values are strings, columns are `{key,label}`
|
|
50
|
+
* with no type, and it narrows rows already on screen behind a popover on the
|
|
51
|
+
* `DataTable` toolbar. Nothing it builds crosses a wire.
|
|
52
|
+
* - **`cursedesk`'s is a QUERY builder** — an arbitrarily-nested AND/OR/NOT
|
|
53
|
+
* tree with per-type operator sets (`between`, `matches`, `in`, `isEmpty`),
|
|
54
|
+
* range and set editors, `caseSensitive` per rule and a validator, editing
|
|
55
|
+
* the exact `FilterNode` its API consumes so what is built is what the server
|
|
56
|
+
* filters and exports by.
|
|
57
|
+
*
|
|
58
|
+
* Neither is the other generalised. Collapsing them would mean either giving a
|
|
59
|
+
* table toolbar a regex field and a three-deep nesting rule, or taking typed
|
|
60
|
+
* operators away from a filter the server evaluates — so they stay two, and
|
|
61
|
+
* this one says which it is. See {@link FilterQuery} for the shape it edits;
|
|
62
|
+
* the name of the thing it is NOT is `cursedesk`'s `ui/workbench/FilterBuilder`.
|
|
40
63
|
*
|
|
41
64
|
* The owner's closing clause is the acceptance test, not a nicety: *"easy enough
|
|
42
65
|
* that I don't give up on trying it."* So every decision here is made against
|
|
@@ -60,7 +83,12 @@ const OP_OPTIONS = (Object.keys(FILTER_OP_LABELS) as FilterOp[]).map((op) => ({
|
|
|
60
83
|
* The trigger carries the live count so the toolbar says how many constraints
|
|
61
84
|
* are on without opening anything (DESIGN.md §2 — one line, state legible on it).
|
|
62
85
|
*/
|
|
63
|
-
export function
|
|
86
|
+
export function TableFilterBuilder({
|
|
87
|
+
columns,
|
|
88
|
+
value,
|
|
89
|
+
onChange,
|
|
90
|
+
className,
|
|
91
|
+
}: TableFilterBuilderProps) {
|
|
64
92
|
const [open, setOpen] = useState(false);
|
|
65
93
|
const activeCount = countActiveConditions(value);
|
|
66
94
|
const firstColumn = columns[0]?.key ?? '';
|
|
@@ -3,9 +3,9 @@ import { Download, Plus, Upload } from 'lucide-react';
|
|
|
3
3
|
import type { ReactNode } from 'react';
|
|
4
4
|
import { Button } from '../Button';
|
|
5
5
|
import { Cluster, Split } from '../layout';
|
|
6
|
-
import { FilterBuilder } from './FilterBuilder';
|
|
7
6
|
import { SearchBox } from './SearchBox';
|
|
8
7
|
import { SortStack } from './SortStack';
|
|
8
|
+
import { TableFilterBuilder } from './TableFilterBuilder';
|
|
9
9
|
import { TableViewToggle } from './TableViewToggle';
|
|
10
10
|
import { ViewOptionsMenu } from './ViewOptionsMenu';
|
|
11
11
|
|
|
@@ -34,7 +34,7 @@ export interface TableToolbarProps<TRow> {
|
|
|
34
34
|
* left/centre, actions far right, never a second row.
|
|
35
35
|
*
|
|
36
36
|
* What sits on it, left to right: the search box with its use-time scope control
|
|
37
|
-
* ({@link SearchBox}), the filter builder ({@link
|
|
37
|
+
* ({@link SearchBox}), the filter builder ({@link TableFilterBuilder}), the sort stack
|
|
38
38
|
* ({@link SortStack}), anything the caller adds, then — right-aligned — the
|
|
39
39
|
* rows ⇄ cards toggle, the column menu, and import/export/add.
|
|
40
40
|
*
|
|
@@ -88,7 +88,7 @@ export function TableToolbar<TRow>({
|
|
|
88
88
|
/>
|
|
89
89
|
) : null}
|
|
90
90
|
{enableFilterBuilder && controls ? (
|
|
91
|
-
<
|
|
91
|
+
<TableFilterBuilder
|
|
92
92
|
columns={controls.filterColumns}
|
|
93
93
|
value={controls.filterQuery}
|
|
94
94
|
onChange={controls.setFilterQuery}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { JSX } from 'react';
|
|
2
2
|
import { ExternalLink } from '../../ExternalLink';
|
|
3
|
+
import { TAP_TARGET_HEIGHT } from '../../../lib/tapTarget';
|
|
3
4
|
|
|
4
5
|
export interface LinkCellProps {
|
|
5
6
|
href: string;
|
|
@@ -24,7 +25,7 @@ export function LinkCell({ href, label }: LinkCellProps): JSX.Element | null {
|
|
|
24
25
|
url={href}
|
|
25
26
|
{...(label === undefined ? {} : { display: label })}
|
|
26
27
|
stopPropagation
|
|
27
|
-
className=
|
|
28
|
+
className={`max-w-[180px] truncate font-sans not-italic ${TAP_TARGET_HEIGHT}`}
|
|
28
29
|
/>
|
|
29
30
|
);
|
|
30
31
|
}
|
|
@@ -18,7 +18,14 @@ export {
|
|
|
18
18
|
type DataTableProps,
|
|
19
19
|
nextSortStack,
|
|
20
20
|
} from './DataTable';
|
|
21
|
-
|
|
21
|
+
// 🔴 `TableFilterBuilder`, not `FilterBuilder` — see its header. The bare name belonged to
|
|
22
|
+
// two different components in two repos, and a shared basename that is not a shared
|
|
23
|
+
// component is how the next person merges them wrongly.
|
|
24
|
+
export {
|
|
25
|
+
TableFilterBuilder,
|
|
26
|
+
type TableFilterBuilderColumn,
|
|
27
|
+
type TableFilterBuilderProps,
|
|
28
|
+
} from './TableFilterBuilder';
|
|
22
29
|
export {
|
|
23
30
|
activeGroups,
|
|
24
31
|
compareValues,
|
|
@@ -3,6 +3,7 @@ import { DragHandleIcon } from '../hooks/DragHandleIcon';
|
|
|
3
3
|
import { cn } from '../lib/cn';
|
|
4
4
|
import { REVEAL_ON_HOVER } from './revealOnHover';
|
|
5
5
|
import { Tooltip } from './Tooltip';
|
|
6
|
+
import { TAP_TARGET } from '../lib/tapTarget';
|
|
6
7
|
|
|
7
8
|
export interface DragHandleProps {
|
|
8
9
|
/** Spread from a drag hook's `handleProps` — the pointer/keyboard drag wiring. */
|
|
@@ -35,7 +36,7 @@ export function DragHandle({
|
|
|
35
36
|
{...handleProps}
|
|
36
37
|
aria-label={label}
|
|
37
38
|
className={cn(
|
|
38
|
-
|
|
39
|
+
`flex w-6 shrink-0 items-center justify-center self-stretch text-muted-foreground/60 ${TAP_TARGET}`,
|
|
39
40
|
alwaysVisible ? 'transition' : REVEAL_ON_HOVER,
|
|
40
41
|
className,
|
|
41
42
|
)}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { useState } from 'react';
|
|
2
2
|
import { EmojiPicker } from '../emoji/EmojiPicker';
|
|
3
3
|
import { cn } from '../lib/cn';
|
|
4
|
+
import { TAP_TARGET } from '../lib/tapTarget';
|
|
4
5
|
|
|
5
6
|
export interface EmojiFieldProps {
|
|
6
7
|
/** The current emoji (a single grapheme), or '' for none. */
|
|
@@ -46,7 +47,7 @@ export function EmojiField({
|
|
|
46
47
|
aria-describedby={ariaDescribedBy}
|
|
47
48
|
aria-label={value ? `Emoji: ${value}` : 'Pick an emoji'}
|
|
48
49
|
className={cn(
|
|
49
|
-
|
|
50
|
+
`inline-flex size-10 items-center justify-center rounded-field border border-field-border bg-field-bg text-xl transition hover:border-field-ring focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-field-ring/30 disabled:cursor-not-allowed disabled:opacity-50 ${TAP_TARGET}`,
|
|
50
51
|
className,
|
|
51
52
|
)}
|
|
52
53
|
>
|
|
@@ -43,8 +43,9 @@ const TONE_MARKER: Record<EventTimelineTone, { icon: ReactNode; className: strin
|
|
|
43
43
|
* consistently indented body. Subtle dividers separate events; the axis line
|
|
44
44
|
* connects markers so the sequence reads as one story.
|
|
45
45
|
*
|
|
46
|
-
*
|
|
47
|
-
* canvas
|
|
46
|
+
* This is the presentational history list. (It used to need distinguishing from a
|
|
47
|
+
* time-scaled editing canvas in `react/timeline`; that went with the unreferenced
|
|
48
|
+
* subpaths on 2026-09-13, so `EventTimeline` is now the only timeline here.)
|
|
48
49
|
*/
|
|
49
50
|
export function EventTimeline({ items, className }: EventTimelineProps) {
|
|
50
51
|
return (
|
|
@@ -4,7 +4,7 @@ import { FileLocation } from './FileLocation';
|
|
|
4
4
|
|
|
5
5
|
afterEach(cleanup);
|
|
6
6
|
|
|
7
|
-
const PATH = '/
|
|
7
|
+
const PATH = '/srv/demo-app/.aliasManager/aliases.sh';
|
|
8
8
|
|
|
9
9
|
describe('FileLocation', () => {
|
|
10
10
|
test('shows the path and the default "Saved in" label', () => {
|
|
@@ -30,7 +30,7 @@ export interface IconButtonProps extends Omit<ButtonProps, 'size' | 'leftIcon' |
|
|
|
30
30
|
|
|
31
31
|
/**
|
|
32
32
|
* Icon-only button: a {@link Button} locked to a square `icon*` size (≥44px touch
|
|
33
|
-
* target on coarse pointers via Button's `
|
|
33
|
+
* target on coarse pointers via Button's `TAP_TARGET_HEIGHT` baseline,
|
|
34
34
|
* regardless of `size`) with a mandatory `aria-label`. Defaults to the `ghost`
|
|
35
35
|
* variant — the right weight for toolbars/row actions. Slightly larger glyphs
|
|
36
36
|
* (`size-5`) than a text button's, since the icon carries the whole meaning.
|
|
@@ -17,6 +17,7 @@ import { type ReactNode, useState } from 'react';
|
|
|
17
17
|
import { useHasHover } from '../hooks/useHasHover';
|
|
18
18
|
import { cn } from '../lib/cn';
|
|
19
19
|
import { HOVER_HINT_DELAY_MS } from '../lib/hoverIntent';
|
|
20
|
+
import { TAP_TARGET } from '../lib/tapTarget';
|
|
20
21
|
|
|
21
22
|
export interface InfoHintProps {
|
|
22
23
|
/** The help body. */
|
|
@@ -90,10 +91,10 @@ export function InfoHint({
|
|
|
90
91
|
ref={refs.setReference}
|
|
91
92
|
aria-label={label}
|
|
92
93
|
className={cn(
|
|
93
|
-
// ≥44px touch target on coarse pointers (same floor
|
|
94
|
-
//
|
|
95
|
-
//
|
|
96
|
-
|
|
94
|
+
// ≥44px touch target on coarse pointers (the same `TAP_TARGET` floor
|
|
95
|
+
// Button/IconButton carry — a bare `size-4` icon glyph with no padding
|
|
96
|
+
// measured 16×16px on mobile, cc/197).
|
|
97
|
+
`inline-flex items-center justify-center text-muted-foreground hover:text-accent ${TAP_TARGET}`,
|
|
97
98
|
className,
|
|
98
99
|
)}
|
|
99
100
|
{...getReferenceProps()}
|
|
@@ -135,7 +135,7 @@ export function InheritBadge({
|
|
|
135
135
|
label={resetLabel}
|
|
136
136
|
disabled={disabled}
|
|
137
137
|
onClick={onReset}
|
|
138
|
-
// Glyph only is shrunk, never the BOX: Button's `
|
|
138
|
+
// Glyph only is shrunk, never the BOX: Button's `TAP_TARGET_HEIGHT`
|
|
139
139
|
// is what keeps this a real touch target, and forcing a size-5 square
|
|
140
140
|
// would quietly delete that on every phone.
|
|
141
141
|
className={cn('[&_svg]:size-3.5', REVEAL_ON_HOVER)}
|
|
@@ -5,6 +5,7 @@ import { AutoGrowTextarea } from './AutoGrowTextarea';
|
|
|
5
5
|
import { IconButton } from './IconButton';
|
|
6
6
|
import { Input } from './Input';
|
|
7
7
|
import { Tooltip } from './Tooltip';
|
|
8
|
+
import { TAP_TARGET_HEIGHT } from '../lib/tapTarget';
|
|
8
9
|
|
|
9
10
|
export interface InlineEditableTextProps {
|
|
10
11
|
value: string;
|
|
@@ -184,7 +185,7 @@ export function InlineEditableText({
|
|
|
184
185
|
// measuring gate (and any tool that reasons about layout) still sees 24px.
|
|
185
186
|
// `DESIGN.md` §5's footprint is the floor and UX_STANDARDS §0 records that it
|
|
186
187
|
// wins over the band — so the box grows too, and the band stays as the extra.
|
|
187
|
-
|
|
188
|
+
TAP_TARGET_HEIGHT,
|
|
188
189
|
'pointer-coarse:before:absolute pointer-coarse:before:top-[-10px] pointer-coarse:before:bottom-[-10px] pointer-coarse:before:left-[-4px] pointer-coarse:before:right-[-4px] pointer-coarse:before:content-[""]',
|
|
189
190
|
wrap ? 'whitespace-pre-wrap break-words' : 'block w-full truncate',
|
|
190
191
|
!value && 'italic text-muted-foreground',
|
|
@@ -2,6 +2,7 @@ import type { KeyboardEvent, ReactNode } from 'react';
|
|
|
2
2
|
import { cn } from '../lib/cn';
|
|
3
3
|
import { Surface } from './Surface';
|
|
4
4
|
import type { StatTileTone } from './StatTile';
|
|
5
|
+
import { TAP_TARGET_ALWAYS } from '../lib/tapTarget';
|
|
5
6
|
|
|
6
7
|
const TONE_DOT: Record<StatTileTone, string> = {
|
|
7
8
|
success: 'bg-success',
|
|
@@ -111,7 +112,7 @@ export function MeterList({ items, flat = false, labelWidth = 'default', classNa
|
|
|
111
112
|
) : null}
|
|
112
113
|
<span className='truncate'>{item.label}</span>
|
|
113
114
|
{item.actionHint ? (
|
|
114
|
-
<span className=
|
|
115
|
+
<span className={`text-caption font-medium text-muted-foreground opacity-0 transition-opacity group-hover/meter:opacity-100 group-focus-visible/meter:opacity-100 ${TAP_TARGET_ALWAYS}`}>
|
|
115
116
|
{item.actionHint}
|
|
116
117
|
</span>
|
|
117
118
|
) : null}
|
|
@@ -6,6 +6,7 @@ import { CopyButton } from './CopyButton';
|
|
|
6
6
|
import { type FileManagerKind, REVEAL_LABEL } from './FileLocation';
|
|
7
7
|
import { IconButton } from './IconButton';
|
|
8
8
|
import { Tooltip } from './Tooltip';
|
|
9
|
+
import { TAP_TARGET_ALWAYS } from '../lib/tapTarget';
|
|
9
10
|
|
|
10
11
|
export interface PathTextProps {
|
|
11
12
|
/** The full path (file path, module id, URL path). Never pre-truncate it. */
|
|
@@ -32,8 +33,8 @@ export interface PathTextProps {
|
|
|
32
33
|
* lives". `PathText` is the INLINE form — a chip inside a fact row, a table cell, a
|
|
33
34
|
* sentence — and it is where most paths in a control plane actually appear. The
|
|
34
35
|
* owner reported the gap from the inline side (station, 2026-08-15): *"I see Repo
|
|
35
|
-
*
|
|
36
|
-
*
|
|
36
|
+
* ~/… but I want icons to open finder there and open vscode there because it is a
|
|
37
|
+
* path"*. That app answered it by hand-rolling a second component; the
|
|
37
38
|
* answer belongs on the primitive, so every app's inline paths get the same doors.
|
|
38
39
|
*/
|
|
39
40
|
onReveal?: (path: string) => void;
|
|
@@ -135,7 +136,7 @@ export function PathText({
|
|
|
135
136
|
confirmToast={false}
|
|
136
137
|
stopPropagation
|
|
137
138
|
iconSize={12}
|
|
138
|
-
className=
|
|
139
|
+
className={`opacity-0 transition-opacity focus-visible:opacity-100 group-hover/path:opacity-100 ${TAP_TARGET_ALWAYS}`}
|
|
139
140
|
/>
|
|
140
141
|
)}
|
|
141
142
|
</span>
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { Star } from 'lucide-react';
|
|
2
2
|
import type { KeyboardEvent } from 'react';
|
|
3
3
|
import { cn } from '../lib/cn';
|
|
4
|
+
import { TAP_TARGET } from '../lib/tapTarget';
|
|
4
5
|
|
|
5
6
|
export interface RatingFieldProps {
|
|
6
7
|
/** The current rating (0 = unrated). */
|
|
@@ -72,7 +73,7 @@ export function RatingField({
|
|
|
72
73
|
'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',
|
|
73
74
|
// DESIGN.md §5: a 28px star is a miss on a phone, and the neighbouring
|
|
74
75
|
// star is a different rating.
|
|
75
|
-
|
|
76
|
+
TAP_TARGET,
|
|
76
77
|
filled ? 'text-warning' : 'text-muted-foreground hover:text-warning',
|
|
77
78
|
)}
|
|
78
79
|
>
|
|
@@ -3,6 +3,7 @@ import { useCopyToClipboard } from '../hooks/useCopyToClipboard';
|
|
|
3
3
|
import { CONTROL_HEIGHT_CLASS, type ControlSize } from '../lib/field';
|
|
4
4
|
import { resolveClass, resolveStyle, type StyleableProps } from '../styling';
|
|
5
5
|
import { IconButton } from './IconButton';
|
|
6
|
+
import { TAP_TARGET, TAP_TARGET_HEIGHT } from '../lib/tapTarget';
|
|
6
7
|
|
|
7
8
|
// Tiny self-contained icons so the component carries no icon dependency.
|
|
8
9
|
const Eye = () => (
|
|
@@ -63,8 +64,7 @@ const Check = () => (
|
|
|
63
64
|
|
|
64
65
|
// Token-driven (unit 11) — --muted-foreground/--foreground/--muted already carry
|
|
65
66
|
// light and dark, so the five palette classes and their dark: twins are one set now.
|
|
66
|
-
const BTN_CLASS =
|
|
67
|
-
'h-auto min-h-0 w-auto inline-flex shrink-0 items-center justify-center rounded p-1 text-muted-foreground transition hover:text-foreground hover:bg-muted pointer-coarse:min-h-11 pointer-coarse:min-w-11';
|
|
67
|
+
const BTN_CLASS = `h-auto min-h-0 w-auto inline-flex shrink-0 items-center justify-center rounded p-1 text-muted-foreground transition hover:text-foreground hover:bg-muted ${TAP_TARGET}`;
|
|
68
68
|
|
|
69
69
|
export type SecretInputSlot = 'root' | 'input' | 'button';
|
|
70
70
|
|
|
@@ -184,7 +184,7 @@ export const SecretInput = ({
|
|
|
184
184
|
return (
|
|
185
185
|
<div
|
|
186
186
|
className={resolveClass(
|
|
187
|
-
`flex items-center gap-0.5 ${CONTROL_HEIGHT_CLASS[size]}
|
|
187
|
+
`flex items-center gap-0.5 ${CONTROL_HEIGHT_CLASS[size]} ${TAP_TARGET_HEIGHT} rounded-field border border-field-border bg-field-bg px-1 transition focus-within:border-field-ring focus-within:ring-2 focus-within:ring-field-ring/30 has-[[aria-invalid=true]]:border-field-error`,
|
|
188
188
|
classNames?.root ?? className,
|
|
189
189
|
unstyled,
|
|
190
190
|
)}
|
|
@@ -3,6 +3,7 @@ import type { ReactNode } from 'react';
|
|
|
3
3
|
import { cn } from '../lib/cn';
|
|
4
4
|
import { CONTROL_HEIGHT_CLASS, type ControlSize } from '../lib/field';
|
|
5
5
|
import { Tooltip } from './Tooltip';
|
|
6
|
+
import { TAP_TARGET } from '../lib/tapTarget';
|
|
6
7
|
|
|
7
8
|
export interface SegmentOption<T extends string> {
|
|
8
9
|
value: T;
|
|
@@ -75,13 +76,12 @@ export function SegmentedControl<T extends string>({
|
|
|
75
76
|
data-testid={opt['data-testid']}
|
|
76
77
|
className={cn(
|
|
77
78
|
'inline-flex shrink-0 items-center justify-center whitespace-nowrap rounded-[calc(var(--radius-md)-0.25rem)] px-3 text-sm font-medium transition-colors',
|
|
78
|
-
'pointer-coarse:min-h-11',
|
|
79
79
|
CONTROL_HEIGHT_CLASS[size],
|
|
80
80
|
'text-muted-foreground hover:text-foreground',
|
|
81
81
|
'data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]:shadow-raised',
|
|
82
82
|
'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',
|
|
83
83
|
'disabled:cursor-not-allowed disabled:opacity-50 disabled:hover:text-muted-foreground',
|
|
84
|
-
|
|
84
|
+
TAP_TARGET,
|
|
85
85
|
capitalize && 'capitalize',
|
|
86
86
|
)}
|
|
87
87
|
>
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { afterEach, describe, expect, mock, test } from 'bun:test';
|
|
2
2
|
import { cleanup, fireEvent, render } from '@testing-library/react';
|
|
3
3
|
import { StarRating } from './StarRating';
|
|
4
|
+
import { TAP_TARGET } from '../lib/tapTarget';
|
|
4
5
|
|
|
5
6
|
afterEach(cleanup);
|
|
6
7
|
|
|
@@ -80,8 +81,7 @@ describe('StarRating — whole steps render real buttons', () => {
|
|
|
80
81
|
const { getAllByRole } = render(<StarRating value={0} onChange={() => {}} size='sm' />);
|
|
81
82
|
for (const button of getAllByRole('button')) {
|
|
82
83
|
const cls = button.getAttribute('class') ?? '';
|
|
83
|
-
expect(cls).toContain(
|
|
84
|
-
expect(cls).toContain('pointer-coarse:min-w-11');
|
|
84
|
+
for (const utility of TAP_TARGET.split(' ')) expect(cls).toContain(utility);
|
|
85
85
|
}
|
|
86
86
|
});
|
|
87
87
|
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { useId, useRef, useState } from 'react';
|
|
2
2
|
import { cn } from '../lib/cn';
|
|
3
3
|
import { Tooltip } from './Tooltip';
|
|
4
|
+
import { TAP_TARGET, TAP_TARGET_HEIGHT } from '../lib/tapTarget';
|
|
4
5
|
|
|
5
6
|
/**
|
|
6
7
|
* The fleet's one star rating.
|
|
@@ -161,12 +162,15 @@ export function StarRating({
|
|
|
161
162
|
key={i}
|
|
162
163
|
// guardrails-ignore no-raw-action-button: a star is a GLYPH, not a chrome control — Button/IconButton bring a border, a background, a hover fill and a locked `icon*` size, and five of those in a table cell is a toolbar where a rating should be. This IS the rating primitive; what the rule protects (the ≥44px coarse-pointer target, the visible focus ring, `type='button'`) is carried here explicitly and pinned by StarRating.spec.tsx.
|
|
163
164
|
type='button'
|
|
164
|
-
// ≥44px on a coarse pointer without growing the PAINTED star
|
|
165
|
-
//
|
|
166
|
-
//
|
|
165
|
+
// ≥44px on a coarse pointer without growing the PAINTED star: this
|
|
166
|
+
// button has no background of its own, so the floor can sit on it
|
|
167
|
+
// directly. (Checkbox cannot do that — its control IS the painted
|
|
168
|
+
// box, so its floor lives on the `<label>` around it instead.) A
|
|
169
|
+
// 20px star with a 44px target is the whole reason music could stop
|
|
170
|
+
// hiding its rating on a phone.
|
|
167
171
|
className={cn(
|
|
168
172
|
'inline-flex cursor-pointer items-center justify-center rounded-sm bg-transparent p-0',
|
|
169
|
-
|
|
173
|
+
TAP_TARGET,
|
|
170
174
|
'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',
|
|
171
175
|
height,
|
|
172
176
|
)}
|
|
@@ -228,7 +232,7 @@ export function StarRating({
|
|
|
228
232
|
tabIndex={0}
|
|
229
233
|
className={cn(
|
|
230
234
|
'inline-flex w-fit cursor-pointer gap-0.5 outline-none',
|
|
231
|
-
|
|
235
|
+
`${TAP_TARGET_HEIGHT} pointer-coarse:items-center`,
|
|
232
236
|
'focus-visible:ring-2 focus-visible:ring-ring',
|
|
233
237
|
height,
|
|
234
238
|
className,
|
|
@@ -5,6 +5,7 @@ import { ScrollArea } from './ScrollArea';
|
|
|
5
5
|
import { Surface } from './Surface';
|
|
6
6
|
import { Sparkline } from './Sparkline';
|
|
7
7
|
import type { StatTileTone } from './StatTile';
|
|
8
|
+
import { TAP_TARGET_ALWAYS } from '../lib/tapTarget';
|
|
8
9
|
|
|
9
10
|
const TONE_DOT: Record<StatTileTone, string> = {
|
|
10
11
|
success: 'bg-success',
|
|
@@ -59,7 +60,7 @@ function ItemBody({ item, orientation }: { item: StatStripItem; orientation: 'ho
|
|
|
59
60
|
<span
|
|
60
61
|
className={cn(
|
|
61
62
|
'ml-auto text-caption font-medium normal-case tracking-normal text-muted-foreground',
|
|
62
|
-
|
|
63
|
+
`opacity-0 transition-opacity group-hover/stat:opacity-100 group-focus-visible/stat:opacity-100 ${TAP_TARGET_ALWAYS}`,
|
|
63
64
|
)}
|
|
64
65
|
>
|
|
65
66
|
{item.actionHint}
|
|
@@ -5,6 +5,7 @@ import { CopyButton } from './CopyButton';
|
|
|
5
5
|
import { Sparkline } from './Sparkline';
|
|
6
6
|
import { TruncatedText } from './TruncatedText';
|
|
7
7
|
import { Tooltip } from './Tooltip';
|
|
8
|
+
import { TAP_TARGET_ALWAYS } from '../lib/tapTarget';
|
|
8
9
|
|
|
9
10
|
interface Progress {
|
|
10
11
|
value: number;
|
|
@@ -117,8 +118,7 @@ const VALUE_SIZE = { sm: 'text-base', md: 'text-2xl', lg: 'text-3xl' } as const;
|
|
|
117
118
|
* an unnamed group-hover would make all eight copy buttons appear at once the
|
|
118
119
|
* moment the pointer entered the panel.
|
|
119
120
|
*/
|
|
120
|
-
const REVEAL_ON_TILE_HOVER =
|
|
121
|
-
'opacity-0 transition-opacity group-hover/tile:opacity-100 focus-visible:opacity-100 pointer-coarse:opacity-100';
|
|
121
|
+
const REVEAL_ON_TILE_HOVER = `opacity-0 transition-opacity group-hover/tile:opacity-100 focus-visible:opacity-100 ${TAP_TARGET_ALWAYS}`;
|
|
122
122
|
|
|
123
123
|
/** Color by SEMANTIC direction, never by the sign of the number. */
|
|
124
124
|
const DELTA_CLASS = {
|
|
@@ -215,7 +215,7 @@ export function StatTile({
|
|
|
215
215
|
{onPress && actionHint ? (
|
|
216
216
|
<span
|
|
217
217
|
aria-hidden
|
|
218
|
-
className=
|
|
218
|
+
className={`text-caption font-medium text-muted-foreground opacity-0 transition-opacity group-hover/tile:opacity-100 group-focus-visible/tile:opacity-100 ${TAP_TARGET_ALWAYS}`}
|
|
219
219
|
>
|
|
220
220
|
{actionHint}
|
|
221
221
|
</span>
|
|
@@ -80,8 +80,9 @@ describe('Tabs', () => {
|
|
|
80
80
|
// The pointer is removed rather than repaired because there is nothing to point AT.
|
|
81
81
|
// What these class assertions can prove, they prove; that the rendered list actually
|
|
82
82
|
// scrolls at a real viewport is UNPROVEN. Do not read the three tests below as more
|
|
83
|
-
// than they are.
|
|
84
|
-
//
|
|
83
|
+
// than they are. The backlog file that used to be named here as the place the browser
|
|
84
|
+
// proof was tracked belonged to a previous generation and no longer exists, so this
|
|
85
|
+
// says where the gap is rather than pretending somebody else is holding it.
|
|
85
86
|
describe('fill', () => {
|
|
86
87
|
test('default is a plain auto-height block — no layout opinions', () => {
|
|
87
88
|
const { getByRole } = render(<Tabs items={ITEMS} />);
|
|
@@ -2,6 +2,7 @@ import * as RadixTabs from '@radix-ui/react-tabs';
|
|
|
2
2
|
import type { JSX, ReactNode } from 'react';
|
|
3
3
|
import { useCallback, useEffect, useRef, useState } from 'react';
|
|
4
4
|
import { cn } from '../lib/cn';
|
|
5
|
+
import { TAP_TARGET } from '../lib/tapTarget';
|
|
5
6
|
|
|
6
7
|
export interface TabItem<T extends string = string> {
|
|
7
8
|
value: T;
|
|
@@ -156,7 +157,7 @@ export function Tabs<T extends string = string>({
|
|
|
156
157
|
// an automated touch-target probe flags even though `min-h-11` already
|
|
157
158
|
// satisfies the height floor (orch-host task-sources mobile scan measured
|
|
158
159
|
// a "db" tab at 17×44px).
|
|
159
|
-
|
|
160
|
+
TAP_TARGET,
|
|
160
161
|
// Active underline tab: accent underline + accent text + semibold — the
|
|
161
162
|
// same accent-marks-the-active-view treatment as the sidebar nav, so the
|
|
162
163
|
// selected tab is unmistakable at a glance (not just a hairline shift).
|
|
@@ -49,7 +49,8 @@ export interface TruncatedTextProps {
|
|
|
49
49
|
*
|
|
50
50
|
* It also answers `DESIGN.md` §5's "node labels must never truncate with harsh,
|
|
51
51
|
* broken text string cuts" for the DOM case: the cut is still there, but the whole
|
|
52
|
-
* string is one hover away instead of lost.
|
|
52
|
+
* string is one hover away instead of lost. (The canvas/SVG half of that answer lived
|
|
53
|
+
* in `react/canvas`, removed with the unreferenced subpaths on 2026-09-13.)
|
|
53
54
|
*
|
|
54
55
|
* ── The hint is conditional, and measured at MOUNT ───────────────────────────
|
|
55
56
|
* A hover bubble that repeats a label you can already read in full is noise, so
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { afterEach, describe, expect, test } from 'bun:test';
|
|
2
2
|
import { cleanup, render, screen } from '@testing-library/react';
|
|
3
3
|
import { MonthGrid } from './MonthGrid';
|
|
4
|
+
import { TAP_TARGET_ALWAYS } from '../../lib/tapTarget';
|
|
4
5
|
|
|
5
6
|
afterEach(cleanup);
|
|
6
7
|
|
|
@@ -100,7 +101,7 @@ describe('MonthGrid', () => {
|
|
|
100
101
|
// The keyboard path the component documents must survive the reveal.
|
|
101
102
|
expect(wrapper?.className).toContain('group-focus-within:opacity-100');
|
|
102
103
|
// A finger cannot hover.
|
|
103
|
-
expect(wrapper?.className).toContain(
|
|
104
|
+
expect(wrapper?.className).toContain(TAP_TARGET_ALWAYS);
|
|
104
105
|
});
|
|
105
106
|
|
|
106
107
|
test("dayActionReveal='always' opts a grid out of the reveal", () => {
|
|
@@ -2,6 +2,7 @@ import type { WeekStart } from 'cwip/calendar';
|
|
|
2
2
|
import { dayStartMs, monthMatrix, todayKey, WEEKDAY_LABELS } from 'cwip/calendar';
|
|
3
3
|
import type { ReactNode } from 'react';
|
|
4
4
|
import { cn } from '../../lib/cn';
|
|
5
|
+
import { TAP_TARGET_ALWAYS } from '../../lib/tapTarget';
|
|
5
6
|
|
|
6
7
|
export interface MonthGridDay {
|
|
7
8
|
/** Local day key ("YYYY-MM-DD") this cell represents. */
|
|
@@ -148,7 +149,7 @@ export function MonthGrid({
|
|
|
148
149
|
// the keyboard path this grid documents keeps working. `pointer-
|
|
149
150
|
// coarse` is a question about the input DEVICE — a finger cannot
|
|
150
151
|
// hover, so on a touch screen the action is simply visible.
|
|
151
|
-
|
|
152
|
+
`opacity-0 transition-opacity group-hover:opacity-100 group-focus-within:opacity-100 ${TAP_TARGET_ALWAYS}`,
|
|
152
153
|
)}
|
|
153
154
|
>
|
|
154
155
|
{action}
|
|
@@ -15,6 +15,7 @@ import { IconButton } from '../IconButton';
|
|
|
15
15
|
import { EventChip } from './EventChip';
|
|
16
16
|
import { filterOccurrences } from './occurrences';
|
|
17
17
|
import type { CalendarEventBase, OccurrenceFilters } from './types';
|
|
18
|
+
import { TAP_TARGET_ALWAYS } from '../../lib/tapTarget';
|
|
18
19
|
|
|
19
20
|
export interface WeekViewProps {
|
|
20
21
|
/** Any date within the week to render. */
|
|
@@ -111,7 +112,7 @@ export function WeekView({
|
|
|
111
112
|
'h-auto min-h-[44px] w-auto min-w-[44px] rounded p-1.5 text-muted-foreground',
|
|
112
113
|
'opacity-0 transition-opacity hover:bg-muted hover:text-foreground',
|
|
113
114
|
'focus:opacity-100 group-hover:opacity-100',
|
|
114
|
-
|
|
115
|
+
TAP_TARGET_ALWAYS,
|
|
115
116
|
)}
|
|
116
117
|
>
|
|
117
118
|
<Plus className='h-3.5 w-3.5' />
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { TAP_TARGET_ALWAYS } from '../lib/tapTarget';
|
|
2
|
+
|
|
1
3
|
/** Hide until the parent `.group` is hovered/focused; always shown on touch. */
|
|
2
|
-
export const REVEAL_ON_HOVER =
|
|
3
|
-
'opacity-0 transition group-hover:opacity-100 focus-visible:opacity-100 pointer-coarse:opacity-100';
|
|
4
|
+
export const REVEAL_ON_HOVER = `opacity-0 transition group-hover:opacity-100 focus-visible:opacity-100 ${TAP_TARGET_ALWAYS}`;
|