cursedbelt 1.0.0 → 2.3.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 +391 -0
- package/dist/styles.css +27 -0
- package/package.json +19 -167
- package/scripts/generateStaticStyles.ts +122 -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 +391 -0
- package/src/styles.css +27 -0
- package/src/stylesStaticMatches.spec.ts +134 -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
|
@@ -0,0 +1,391 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* cursedbelt component-class source registration.
|
|
3
|
+
* Consuming apps import (after `@import "tailwindcss";`):
|
|
4
|
+
* @import "cursedbelt/styles.css";
|
|
5
|
+
* @import "cursedbelt/theme.css";
|
|
6
|
+
* This `@source` makes Tailwind v4 scan cursedbelt's source files so the utility
|
|
7
|
+
* classes used by its components are generated in the app's stylesheet.
|
|
8
|
+
*
|
|
9
|
+
* ── Two entry points, and which one an app wants ─────────────────────────────
|
|
10
|
+
* `@source "."` is the expensive half: it points Tailwind's JIT at cursedbelt's
|
|
11
|
+
* ENTIRE source tree, so the app emits the union of the whole design system
|
|
12
|
+
* (113 KB / 846 selectors, measured in the previous generation) whether it
|
|
13
|
+
* renders three components or eighty. Everything else in this file is CSS the
|
|
14
|
+
* components genuinely need and no app can do without.
|
|
15
|
+
*
|
|
16
|
+
* A CSS `@import` takes the whole file, so the split is a second subpath:
|
|
17
|
+
*
|
|
18
|
+
* cursedbelt/styles.css this file — the real CSS + the `@source` scan
|
|
19
|
+
* cursedbelt/styles-static.css the same file MINUS the `@source` line
|
|
20
|
+
*
|
|
21
|
+
* The static one is for an app that pays for its own scanning — it gets the
|
|
22
|
+
* tooltip pointer-events fix, the Progress keyframes, the lightbox bridge, the
|
|
23
|
+
* ambient/glass layer and `tw-animate-css`, and emits none of cursedbelt's
|
|
24
|
+
* utility classes, so whatever component utilities it needs must come from
|
|
25
|
+
* sources IT registers. Do not hand-list cursedbelt's component files to get
|
|
26
|
+
* them back: a relative `@source` reaching into this package's source tree is a
|
|
27
|
+
* `file:` dependency wearing a stylesheet's clothes, and it is the thing the
|
|
28
|
+
* previous generation's 29-line-per-app arrangement is remembered for.
|
|
29
|
+
*
|
|
30
|
+
* 🔴 This header is in BOTH files, because one is generated from the other and a
|
|
31
|
+
* test holds them byte-identical apart from the `@source` line. Always edit
|
|
32
|
+
* `src/styles.css`; never `src/styles-static.css`, which
|
|
33
|
+
* `scripts/generateStaticStyles.ts` rewrites on every `bun run build` and
|
|
34
|
+
* `src/stylesStaticMatches.spec.ts` fails on when it is stale.
|
|
35
|
+
*/
|
|
36
|
+
|
|
37
|
+
/* Animation utilities (animate-in/out, fade/zoom/slide-in-from-*) consumed by the
|
|
38
|
+
floating layer's FLOATING_ANIMATION and the modal/overlay family — the Tailwind v4
|
|
39
|
+
successor to tailwindcss-animate. Imported here so every consuming app inherits the
|
|
40
|
+
enter/exit motion with no per-app wiring. Lands after `@import "tailwindcss"` since
|
|
41
|
+
apps import this file after Tailwind. */
|
|
42
|
+
@import "tw-animate-css";
|
|
43
|
+
|
|
44
|
+
/*
|
|
45
|
+
* Typography utilities (task cbux-41) — theme-token-based replacements for the
|
|
46
|
+
* `uppercase tracking-wide text-muted-foreground text-xs` / `font-mono bg-…` clusters
|
|
47
|
+
* that were hand-rolled per call site. One class each, so a future restyle of "how a
|
|
48
|
+
* section header reads" or "how inline code reads" is a two-rule change here.
|
|
49
|
+
*/
|
|
50
|
+
|
|
51
|
+
/* Category / section header label: small, bold, uppercase, wide tracking, muted.
|
|
52
|
+
Use for group headers, panel eyebrows, table section labels — anywhere a
|
|
53
|
+
"SECTION" style caption sits above real content. */
|
|
54
|
+
.cb-meta-label {
|
|
55
|
+
/* 🔴 12px, not the 11px this was until 2026-08-19 (unit 11). DESIGN.md §4 states a
|
|
56
|
+
FLOOR for secondary metadata and this class IS the fleet's section-label style, so
|
|
57
|
+
11px here was the law being broken by the design system's own stylesheet — in a file
|
|
58
|
+
the `micro-typography-floor` lint did not scan, because the rule ran over `src/react`
|
|
59
|
+
only. It scans this file now too. */
|
|
60
|
+
font-size: 0.75rem; /* 12px */
|
|
61
|
+
font-weight: 700;
|
|
62
|
+
text-transform: uppercase;
|
|
63
|
+
letter-spacing: 0.06em;
|
|
64
|
+
color: var(--muted-foreground);
|
|
65
|
+
/* 🔴 NOT `user-select: none`, which this carried until 2026-08-23 (owner report:
|
|
66
|
+
*"I cannot highlight text on the card"* — the KPI tiles on orch's Insights board).
|
|
67
|
+
This class is the label of every stat tile, table section and panel eyebrow in the
|
|
68
|
+
fleet, i.e. the TOP-LEFT of a card and the natural place a drag-select starts.
|
|
69
|
+
Chrome refuses to begin a selection whose anchor is in an unselectable node, so one
|
|
70
|
+
declaration here made whole cards feel unselectable even though the value beside the
|
|
71
|
+
label never was. A label is content — it is what tells you what the number you are
|
|
72
|
+
copying MEANS — so it is selectable like everything else. Unselectable text belongs
|
|
73
|
+
on things that are gestures rather than content: a drag handle, a menu item, a
|
|
74
|
+
slider, a line-number gutter. */
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/* Inline/block monospace "code" surface: mono font on the sunken-surface token
|
|
78
|
+
(never a hardcoded dark-slate box) — used for code snippets, IDs, hashes, and
|
|
79
|
+
other literal/technical values that want to read as data, not prose. */
|
|
80
|
+
.cb-code {
|
|
81
|
+
font-family: var(--font-mono, ui-monospace, SFMono-Regular, Menlo, Consolas, monospace);
|
|
82
|
+
font-size: 0.75rem; /* 12px */
|
|
83
|
+
line-height: 1.5;
|
|
84
|
+
background-color: var(--surface-sunken);
|
|
85
|
+
color: var(--foreground);
|
|
86
|
+
border-radius: var(--radius-sm);
|
|
87
|
+
padding: 0.5rem 0.625rem;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/* Indeterminate sweep for the Progress bar (no `value`): the 1/3-width fill slides
|
|
91
|
+
across the track on loop. Registered as a Tailwind theme animation so the
|
|
92
|
+
`animate-progress-indeterminate` utility is generated in consuming apps. */
|
|
93
|
+
@theme {
|
|
94
|
+
--animate-progress-indeterminate: progress-indeterminate 1.2s ease-in-out infinite;
|
|
95
|
+
}
|
|
96
|
+
@keyframes progress-indeterminate {
|
|
97
|
+
from {
|
|
98
|
+
transform: translateX(-100%);
|
|
99
|
+
}
|
|
100
|
+
to {
|
|
101
|
+
transform: translateX(300%);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/*
|
|
106
|
+
* Media subsystem (task 19) theme bridge — map the design tokens onto the CSS custom
|
|
107
|
+
* properties of yet-another-react-lightbox so the lightbox reads as part of the app
|
|
108
|
+
* (and its backdrop tracks light/dark instead of staying a fixed black). The doubled
|
|
109
|
+
* `.yarl__root.yarl__root` selector outranks YARL's own `.yarl__root` defaults no
|
|
110
|
+
* matter the stylesheet load order. The lightbox is an always-dark overlay, so the
|
|
111
|
+
* controls stay light; only the surfaces + accents derive from tokens.
|
|
112
|
+
*/
|
|
113
|
+
.yarl__root.yarl__root {
|
|
114
|
+
--yarl__color_backdrop: color-mix(in srgb, #000 90%, var(--background)); /* guardrails-ignore no-hardcoded-colors: third-party yarl lightbox library CSS custom properties require literal color values */
|
|
115
|
+
--yarl__color_button: rgb(255 255 255 / 0.78); /* guardrails-ignore no-hardcoded-colors: third-party yarl lightbox library CSS custom properties require literal color values */
|
|
116
|
+
--yarl__color_button_active: #ffffff; /* guardrails-ignore no-hardcoded-colors: third-party yarl lightbox library CSS custom properties require literal color values */
|
|
117
|
+
--yarl__color_button_disabled: rgb(255 255 255 / 0.35); /* guardrails-ignore no-hardcoded-colors: third-party yarl lightbox library CSS custom properties require literal color values */
|
|
118
|
+
--yarl__slide_icon_loading_color: var(--accent);
|
|
119
|
+
--yarl__slide_icon_error_color: var(--destructive);
|
|
120
|
+
--yarl__counter_color: rgb(255 255 255 / 0.75); /* guardrails-ignore no-hardcoded-colors: third-party yarl lightbox library CSS custom properties require literal color values */
|
|
121
|
+
|
|
122
|
+
/* Thumbnails strip → token surfaces + accent active border. */
|
|
123
|
+
--yarl__thumbnails_container_background_color: transparent;
|
|
124
|
+
--yarl__thumbnails_thumbnail_background: var(--card-overlay);
|
|
125
|
+
--yarl__thumbnails_thumbnail_border_color: var(--border-strong);
|
|
126
|
+
--yarl__thumbnails_thumbnail_active_border_color: var(--accent-solid);
|
|
127
|
+
--yarl__thumbnails_thumbnail_border_radius: var(--radius-md);
|
|
128
|
+
--yarl__thumbnails_thumbnail_icon_color: #ffffff; /* guardrails-ignore no-hardcoded-colors: third-party yarl lightbox library CSS custom properties require literal color values */
|
|
129
|
+
|
|
130
|
+
/* Captions → translucent token-tinted bar. */
|
|
131
|
+
--yarl__slide_captions_container_background: color-mix(
|
|
132
|
+
in srgb,
|
|
133
|
+
var(--background) 55%,
|
|
134
|
+
transparent
|
|
135
|
+
);
|
|
136
|
+
--yarl__slide_title_color: #ffffff; /* guardrails-ignore no-hardcoded-colors: third-party yarl lightbox library CSS custom properties require literal color values */
|
|
137
|
+
--yarl__slide_description_color: rgb(255 255 255 / 0.8); /* guardrails-ignore no-hardcoded-colors: third-party yarl lightbox library CSS custom properties require literal color values */
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/*
|
|
141
|
+
* Tooltip bubbles are transient hints and must NEVER be pointer targets: a
|
|
142
|
+
* focus-opened tooltip (e.g. a discard prompt auto-focusing its safe default
|
|
143
|
+
* button) otherwise hovers over the adjacent control and eats the user's click.
|
|
144
|
+
* The Content element carries `pointer-events-none`, but Radix positions it inside
|
|
145
|
+
* a transparent `data-radix-popper-content-wrapper` div that hit-tests on its own,
|
|
146
|
+
* so the wrapper must be neutralized too — scoped via :has() to tooltip bubbles
|
|
147
|
+
* only (popovers/menus/selects share the same popper wrapper and stay interactive).
|
|
148
|
+
*/
|
|
149
|
+
[data-radix-popper-content-wrapper]:has(> [data-cb-tooltip]) {
|
|
150
|
+
pointer-events: none;
|
|
151
|
+
}
|
|
152
|
+
/* !important: when a modal dialog disables body pointer events, Radix's
|
|
153
|
+
DismissableLayer re-enables the tooltip layer with an INLINE `pointer-events:
|
|
154
|
+
auto` — exactly the case (tooltip inside an open modal) this rule exists for. */
|
|
155
|
+
[data-cb-tooltip] {
|
|
156
|
+
pointer-events: none !important;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/*
|
|
160
|
+
* ══════════════════════════ The ambient / glass layer ══════════════════════════
|
|
161
|
+
*
|
|
162
|
+
* The decorative half of the design language, as three plain component classes so
|
|
163
|
+
* they cost nothing to adopt: a scoped stylesheet gets them through the static
|
|
164
|
+
* import, with no per-component `@source` line to remember (the silent failure
|
|
165
|
+
* mode `cursed-satellites/scripts/cssSources.test.ts` exists for).
|
|
166
|
+
*
|
|
167
|
+
* All three read TOKENS — `--ambient-1..3`, `--ambient-strength`, `--glass-*`,
|
|
168
|
+
* `--accent-gradient` (theme.css) — never literals, so an app re-brands its whole
|
|
169
|
+
* atmosphere by overriding variables and every surface follows. That is the point:
|
|
170
|
+
* this began life as `.cb-auth-aurora`, a one-off welded to the sign-in card and
|
|
171
|
+
* to the marketing palette, and could not be reused by anything. Nothing here
|
|
172
|
+
* knows the word "aurora"; the aurora theme is just the first caller.
|
|
173
|
+
*/
|
|
174
|
+
|
|
175
|
+
/* ── AmbientBackdrop ─────────────────────────────────────────────────────────
|
|
176
|
+
The lit field a page floats on: a soft wash from the top plus three big blurred
|
|
177
|
+
color blobs, screen-blended so they ADD light rather than paint over content.
|
|
178
|
+
`isolation` on the host is what keeps `mix-blend-mode: screen` blending against
|
|
179
|
+
this stack instead of punching through to whatever is behind the app. */
|
|
180
|
+
.cb-ambient-host {
|
|
181
|
+
position: relative;
|
|
182
|
+
isolation: isolate;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
.cb-ambient {
|
|
186
|
+
position: absolute;
|
|
187
|
+
inset: 0;
|
|
188
|
+
z-index: -1;
|
|
189
|
+
overflow: hidden;
|
|
190
|
+
pointer-events: none;
|
|
191
|
+
background: radial-gradient(
|
|
192
|
+
ellipse 120% 60% at 50% -10%,
|
|
193
|
+
color-mix(in srgb, var(--ambient-2) calc(var(--ambient-strength) * 100%), transparent),
|
|
194
|
+
transparent 60%
|
|
195
|
+
);
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
/* `position: fixed` variant — the backdrop stays put while the app scrolls, which
|
|
199
|
+
is what makes a long page feel like it sits IN a space rather than on a
|
|
200
|
+
repeating texture. Separate class rather than a prop-driven inline style so the
|
|
201
|
+
value stays in CSS with the rest of the layer. */
|
|
202
|
+
.cb-ambient--fixed {
|
|
203
|
+
position: fixed;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
.cb-ambient__blob {
|
|
207
|
+
position: absolute;
|
|
208
|
+
border-radius: 999px;
|
|
209
|
+
/* The blur is what turns three circles into weather. Below ~60px they read as
|
|
210
|
+
circles; the compositor cost is flat in radius, so this is free. */
|
|
211
|
+
filter: blur(90px);
|
|
212
|
+
mix-blend-mode: screen;
|
|
213
|
+
will-change: transform;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
/* Each blob's alpha is `--ambient-strength` scaled by its own weight, so a theme
|
|
217
|
+
(or the component's `intensity` prop) tunes the whole field with one number and
|
|
218
|
+
the three hues keep their relative balance. */
|
|
219
|
+
.cb-ambient__blob--a {
|
|
220
|
+
width: 60vw;
|
|
221
|
+
height: 60vw;
|
|
222
|
+
min-width: 460px;
|
|
223
|
+
min-height: 460px;
|
|
224
|
+
left: -16vw;
|
|
225
|
+
top: -20vw;
|
|
226
|
+
background: radial-gradient(
|
|
227
|
+
circle at 35% 35%,
|
|
228
|
+
color-mix(in srgb, var(--ambient-1) calc(var(--ambient-strength) * 200%), transparent),
|
|
229
|
+
transparent 62%
|
|
230
|
+
);
|
|
231
|
+
}
|
|
232
|
+
.cb-ambient__blob--b {
|
|
233
|
+
width: 52vw;
|
|
234
|
+
height: 52vw;
|
|
235
|
+
min-width: 420px;
|
|
236
|
+
min-height: 420px;
|
|
237
|
+
right: -18vw;
|
|
238
|
+
top: -12vw;
|
|
239
|
+
background: radial-gradient(
|
|
240
|
+
circle at 60% 40%,
|
|
241
|
+
color-mix(in srgb, var(--ambient-2) calc(var(--ambient-strength) * 215%), transparent),
|
|
242
|
+
transparent 64%
|
|
243
|
+
);
|
|
244
|
+
}
|
|
245
|
+
.cb-ambient__blob--c {
|
|
246
|
+
width: 42vw;
|
|
247
|
+
height: 42vw;
|
|
248
|
+
min-width: 360px;
|
|
249
|
+
min-height: 360px;
|
|
250
|
+
left: 28vw;
|
|
251
|
+
bottom: -22vw;
|
|
252
|
+
background: radial-gradient(
|
|
253
|
+
circle at 50% 50%,
|
|
254
|
+
color-mix(in srgb, var(--ambient-3) calc(var(--ambient-strength) * 100%), transparent),
|
|
255
|
+
transparent 62%
|
|
256
|
+
);
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
/* Drift only when the visitor hasn't asked for reduced motion. Minute-scale
|
|
260
|
+
periods, all mutually prime-ish, so the field never visibly loops. */
|
|
261
|
+
@media (prefers-reduced-motion: no-preference) {
|
|
262
|
+
.cb-ambient__blob--a {
|
|
263
|
+
animation: cb-ambient-drift-a 46s ease-in-out infinite alternate;
|
|
264
|
+
}
|
|
265
|
+
.cb-ambient__blob--b {
|
|
266
|
+
animation: cb-ambient-drift-b 58s ease-in-out infinite alternate;
|
|
267
|
+
}
|
|
268
|
+
.cb-ambient__blob--c {
|
|
269
|
+
animation: cb-ambient-drift-c 70s ease-in-out infinite alternate;
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
@keyframes cb-ambient-drift-a {
|
|
273
|
+
from { transform: translate3d(0, 0, 0) scale(1); }
|
|
274
|
+
to { transform: translate3d(6vw, 5vh, 0) scale(1.12); }
|
|
275
|
+
}
|
|
276
|
+
@keyframes cb-ambient-drift-b {
|
|
277
|
+
from { transform: translate3d(0, 0, 0) scale(1.08); }
|
|
278
|
+
to { transform: translate3d(-5vw, 6vh, 0) scale(0.96); }
|
|
279
|
+
}
|
|
280
|
+
@keyframes cb-ambient-drift-c {
|
|
281
|
+
from { transform: translate3d(0, 0, 0); }
|
|
282
|
+
to { transform: translate3d(8vw, -4vh, 0); }
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
/* Fine grain over the whole field. Big soft gradients BAND on 8-bit displays —
|
|
286
|
+
this is the standard dither, and it is an inline SVG so it costs no request. */
|
|
287
|
+
.cb-ambient__grain {
|
|
288
|
+
position: absolute;
|
|
289
|
+
inset: 0;
|
|
290
|
+
pointer-events: none;
|
|
291
|
+
opacity: 0.045;
|
|
292
|
+
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='160' height='160'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='2'/%3E%3C/filter%3E%3Crect width='160' height='160' filter='url(%23n)' opacity='0.6'/%3E%3C/svg%3E");
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
/* ── Glass ───────────────────────────────────────────────────────────────────
|
|
296
|
+
`Surface level="glass"`. A translucent fill, a 1px light edge and a backdrop
|
|
297
|
+
blur, so the ambient field reads THROUGH the panel. In the default LIGHT theme
|
|
298
|
+
the fill is a near-opaque white frost — glass over white is white — so a glass
|
|
299
|
+
Surface is never a legibility regression on an app that never opted into a
|
|
300
|
+
theme. `backdrop-filter` degrades to a plain translucent fill where it is
|
|
301
|
+
unsupported, which is the correct failure. */
|
|
302
|
+
.cb-glass {
|
|
303
|
+
background: var(--glass-bg);
|
|
304
|
+
border: 1px solid var(--glass-edge);
|
|
305
|
+
box-shadow: var(--glass-shadow);
|
|
306
|
+
backdrop-filter: blur(var(--glass-blur)) saturate(140%);
|
|
307
|
+
-webkit-backdrop-filter: blur(var(--glass-blur)) saturate(140%);
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
/* Chrome glass: the fill + blur ONLY — no edge, no shadow. For app chrome that owns
|
|
311
|
+
its own directional border (a header's `border-b`, a nav rail's `border-r`); the
|
|
312
|
+
full `.cb-glass` would draw a box around it. */
|
|
313
|
+
.cb-glass-chrome {
|
|
314
|
+
background: var(--glass-bg-strong);
|
|
315
|
+
backdrop-filter: blur(var(--glass-blur)) saturate(140%);
|
|
316
|
+
-webkit-backdrop-filter: blur(var(--glass-blur)) saturate(140%);
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
/* The heavier fill, for a surface that has to hold dense text (a sidebar, a
|
|
320
|
+
sticky header) where maximum see-through would cost legibility. */
|
|
321
|
+
.cb-glass-strong {
|
|
322
|
+
background: var(--glass-bg-strong);
|
|
323
|
+
border: 1px solid var(--glass-edge);
|
|
324
|
+
box-shadow: var(--glass-shadow);
|
|
325
|
+
backdrop-filter: blur(var(--glass-blur)) saturate(140%);
|
|
326
|
+
-webkit-backdrop-filter: blur(var(--glass-blur)) saturate(140%);
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
/* ── Brand gradient ──────────────────────────────────────────────────────────
|
|
330
|
+
Text in the accent ramp (a product wordmark, a hero headline). Deliberately NOT
|
|
331
|
+
offered for body copy: gradient text has no single contrast ratio to audit. */
|
|
332
|
+
.cb-gradient-text {
|
|
333
|
+
background: var(--accent-gradient);
|
|
334
|
+
-webkit-background-clip: text;
|
|
335
|
+
background-clip: text;
|
|
336
|
+
color: transparent;
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
/* A filled surface in the accent ramp — the "this is the one action" treatment.
|
|
340
|
+
The `.cb-gradient-fill` class carries its own white label because a gradient
|
|
341
|
+
has no token to derive an on-fill foreground from; every ramp this is used with
|
|
342
|
+
is saturated enough for white to clear AA (the same contract
|
|
343
|
+
`--accent-solid-foreground` makes for the flat solid). */
|
|
344
|
+
.cb-gradient-fill {
|
|
345
|
+
background: var(--accent-gradient);
|
|
346
|
+
color: #ffffff; /* guardrails-ignore no-hardcoded-colors: white label on the saturated accent gradient — the fill's own on-surface foreground, mode-independent by the same contract as --accent-solid-foreground */
|
|
347
|
+
border: 0;
|
|
348
|
+
transition:
|
|
349
|
+
filter var(--duration-fast, 120ms) ease,
|
|
350
|
+
box-shadow var(--duration-fast, 120ms) ease;
|
|
351
|
+
}
|
|
352
|
+
.cb-gradient-fill:hover:not(:disabled) {
|
|
353
|
+
background: var(--accent-gradient);
|
|
354
|
+
filter: brightness(1.08);
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
/*
|
|
358
|
+
* Aurora front door — the logged-out sign-in / register surface.
|
|
359
|
+
*
|
|
360
|
+
* Now just a THIN composition over the layer above: the aurora theme scope
|
|
361
|
+
* (`.cb-aurora` in theme.css) supplies the palette, `AmbientBackdrop` paints the
|
|
362
|
+
* field, `Surface level="glass"` is the card, `.cb-gradient-text` is the title.
|
|
363
|
+
* What remains here is the two things that are genuinely about this surface: it
|
|
364
|
+
* fills the viewport with the canvas color, and its submit button is the
|
|
365
|
+
* gradient action. Scoped under `.cb-auth-aurora` (AuthCard's `aurora` prop) so
|
|
366
|
+
* the product's own in-app chrome — including the EMBEDDED AuthCard in the
|
|
367
|
+
* account panel — is untouched.
|
|
368
|
+
*/
|
|
369
|
+
.cb-auth-aurora {
|
|
370
|
+
position: relative;
|
|
371
|
+
isolation: isolate;
|
|
372
|
+
background-color: var(--background);
|
|
373
|
+
color: var(--foreground);
|
|
374
|
+
overflow: hidden;
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
/* Primary action carries the accent gradient instead of the flat solid.
|
|
378
|
+
Specificity (one class + the attribute-qualified element) clears Tailwind's
|
|
379
|
+
single-class `bg-accent-solid`. */
|
|
380
|
+
.cb-auth-aurora button[type="submit"] {
|
|
381
|
+
background: var(--accent-gradient);
|
|
382
|
+
color: #ffffff; /* guardrails-ignore no-hardcoded-colors: white label on the saturated accent gradient — the button's own on-fill foreground, mode-independent */
|
|
383
|
+
border: 0;
|
|
384
|
+
box-shadow: 0 8px 24px color-mix(in srgb, var(--ambient-1) 20%, transparent);
|
|
385
|
+
transition: filter var(--duration-fast, 120ms) ease, box-shadow var(--duration-fast, 120ms) ease;
|
|
386
|
+
}
|
|
387
|
+
.cb-auth-aurora button[type="submit"]:hover:not(:disabled) {
|
|
388
|
+
background: var(--accent-gradient);
|
|
389
|
+
filter: brightness(1.08);
|
|
390
|
+
box-shadow: 0 10px 28px color-mix(in srgb, var(--ambient-2) 30%, transparent);
|
|
391
|
+
}
|
package/src/styles.css
CHANGED
|
@@ -5,6 +5,33 @@
|
|
|
5
5
|
* @import "cursedbelt/theme.css";
|
|
6
6
|
* This `@source` makes Tailwind v4 scan cursedbelt's source files so the utility
|
|
7
7
|
* classes used by its components are generated in the app's stylesheet.
|
|
8
|
+
*
|
|
9
|
+
* ── Two entry points, and which one an app wants ─────────────────────────────
|
|
10
|
+
* `@source "."` is the expensive half: it points Tailwind's JIT at cursedbelt's
|
|
11
|
+
* ENTIRE source tree, so the app emits the union of the whole design system
|
|
12
|
+
* (113 KB / 846 selectors, measured in the previous generation) whether it
|
|
13
|
+
* renders three components or eighty. Everything else in this file is CSS the
|
|
14
|
+
* components genuinely need and no app can do without.
|
|
15
|
+
*
|
|
16
|
+
* A CSS `@import` takes the whole file, so the split is a second subpath:
|
|
17
|
+
*
|
|
18
|
+
* cursedbelt/styles.css this file — the real CSS + the `@source` scan
|
|
19
|
+
* cursedbelt/styles-static.css the same file MINUS the `@source` line
|
|
20
|
+
*
|
|
21
|
+
* The static one is for an app that pays for its own scanning — it gets the
|
|
22
|
+
* tooltip pointer-events fix, the Progress keyframes, the lightbox bridge, the
|
|
23
|
+
* ambient/glass layer and `tw-animate-css`, and emits none of cursedbelt's
|
|
24
|
+
* utility classes, so whatever component utilities it needs must come from
|
|
25
|
+
* sources IT registers. Do not hand-list cursedbelt's component files to get
|
|
26
|
+
* them back: a relative `@source` reaching into this package's source tree is a
|
|
27
|
+
* `file:` dependency wearing a stylesheet's clothes, and it is the thing the
|
|
28
|
+
* previous generation's 29-line-per-app arrangement is remembered for.
|
|
29
|
+
*
|
|
30
|
+
* 🔴 This header is in BOTH files, because one is generated from the other and a
|
|
31
|
+
* test holds them byte-identical apart from the `@source` line. Always edit
|
|
32
|
+
* `src/styles.css`; never `src/styles-static.css`, which
|
|
33
|
+
* `scripts/generateStaticStyles.ts` rewrites on every `bun run build` and
|
|
34
|
+
* `src/stylesStaticMatches.spec.ts` fails on when it is stale.
|
|
8
35
|
*/
|
|
9
36
|
|
|
10
37
|
/* Animation utilities (animate-in/out, fade/zoom/slide-in-from-*) consumed by the
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `src/styles-static.css` is `src/styles.css` minus its `@source` line — and
|
|
3
|
+
* nothing else (2026-09-14).
|
|
4
|
+
*
|
|
5
|
+
* ## What this exists to prevent
|
|
6
|
+
*
|
|
7
|
+
* The scoped entry point has to be a SECOND FILE, because a CSS `@import` takes
|
|
8
|
+
* the whole of the one it is given: an app cannot ask for `styles.css` without
|
|
9
|
+
* `@source "."`, and `@source "."` is what makes every consumer emit the union
|
|
10
|
+
* of the entire design system.
|
|
11
|
+
*
|
|
12
|
+
* The previous generation's second file was `satellite-kit/styles/belt-static.css`
|
|
13
|
+
* — a hand-kept copy with the one line deleted and nothing comparing the two.
|
|
14
|
+
* That is a file that drifts, and drifts SILENTLY: the day someone adds a rule to
|
|
15
|
+
* `styles.css` and not to the copy, every scoped app quietly loses it. The loss is
|
|
16
|
+
* invisible in review (the diff looks complete), invisible to `tsc` (it is CSS),
|
|
17
|
+
* and invisible to Biome (nothing is wrong with either file). It shows up as a
|
|
18
|
+
* tooltip eating a click, or a Progress bar that never animates, in one app, weeks
|
|
19
|
+
* later.
|
|
20
|
+
*
|
|
21
|
+
* So the copy is OUTPUT — `scripts/generateStaticStyles.ts`, which `bun run build`
|
|
22
|
+
* runs before it compiles — and this spec is the gate that makes that true rather
|
|
23
|
+
* than merely intended. `bun run verify` builds before it tests, so a forgotten
|
|
24
|
+
* regeneration self-heals there; editing `styles.css` and running `bun test src`
|
|
25
|
+
* alone is where this goes red.
|
|
26
|
+
*
|
|
27
|
+
* The assertions deliberately come at it from both sides: one compares the file on
|
|
28
|
+
* disk to what the generator produces (is the checked-in output current?), and the
|
|
29
|
+
* rest compare it to `styles.css` DIRECTLY (is the generator still doing only what
|
|
30
|
+
* it claims?). A spec that only asked the generator to agree with itself would pass
|
|
31
|
+
* a generator that had started dropping real rules.
|
|
32
|
+
*
|
|
33
|
+
* 🔴 `Bun.file`, NOT node:fs — this package's test preload virtualizes node:fs, so
|
|
34
|
+
* a `readFileSync` here would read MOCK data and pass against files it never
|
|
35
|
+
* opened. Same trap as `src/publishShape.spec.ts`; see its header.
|
|
36
|
+
*/
|
|
37
|
+
import { describe, expect, it } from 'bun:test';
|
|
38
|
+
import pkg from '../package.json';
|
|
39
|
+
import {
|
|
40
|
+
REPO_ROOT,
|
|
41
|
+
SOURCE_DIRECTIVE,
|
|
42
|
+
STATIC_STYLESHEET,
|
|
43
|
+
readStylesheets,
|
|
44
|
+
staticStylesFrom,
|
|
45
|
+
} from '../scripts/generateStaticStyles';
|
|
46
|
+
|
|
47
|
+
const { source, expected, onDisk } = await readStylesheets();
|
|
48
|
+
|
|
49
|
+
/** The command every failure below is fixed by, as a line the owner can paste. */
|
|
50
|
+
const REGENERATE = `cd ${REPO_ROOT} && bun run styles:static`;
|
|
51
|
+
|
|
52
|
+
const lines = (css: string): string[] => css.split('\n');
|
|
53
|
+
const directives = (css: string): string[] => lines(css).filter((l) => SOURCE_DIRECTIVE.test(l));
|
|
54
|
+
|
|
55
|
+
describe('styles-static.css is a generated, gated copy of styles.css', () => {
|
|
56
|
+
it('is checked in and byte-identical to what the generator produces', () => {
|
|
57
|
+
expect(onDisk, `${STATIC_STYLESHEET} is missing. It is generated:\n ${REGENERATE}`).not.toBeNull();
|
|
58
|
+
expect(
|
|
59
|
+
onDisk,
|
|
60
|
+
`${STATIC_STYLESHEET} is stale — src/styles.css changed and the static variant was not\n` +
|
|
61
|
+
'regenerated, so every app importing `cursedbelt/styles-static.css` is missing the\n' +
|
|
62
|
+
`difference. Run:\n ${REGENERATE}`,
|
|
63
|
+
).toBe(expected);
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
it('drops the `@source` line and keeps every other line, in order', () => {
|
|
67
|
+
// The independent half: compared against styles.css itself, not against the
|
|
68
|
+
// generator's output. Blank lines are excluded from the sequence check only
|
|
69
|
+
// because the dropped directive takes its trailing blank line with it; the
|
|
70
|
+
// exact line-count assertion below is what pins that down.
|
|
71
|
+
const kept = lines(source).filter((l) => l.trim() !== '' && !SOURCE_DIRECTIVE.test(l));
|
|
72
|
+
expect(lines(expected).filter((l) => l.trim() !== '')).toEqual(kept);
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
it('removes exactly the directive and the blank line it leaves behind', () => {
|
|
76
|
+
expect(
|
|
77
|
+
directives(source),
|
|
78
|
+
'src/styles.css must carry exactly the one `@source "."` this whole split is about',
|
|
79
|
+
).toEqual(['@source ".";']);
|
|
80
|
+
expect(directives(expected), 'the static variant must carry no `@source` at all').toEqual([]);
|
|
81
|
+
// 2 = the directive + the now-orphaned blank line after it. A third line
|
|
82
|
+
// going missing means the transform grew a second job.
|
|
83
|
+
expect(lines(source).length - lines(expected).length).toBe(2);
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
it('is not a pointless duplicate', () => {
|
|
87
|
+
// If `@source "."` ever leaves styles.css, the two files become identical and
|
|
88
|
+
// the static subpath is dead weight — but worse, the FULL entry point has
|
|
89
|
+
// stopped scanning and every consuming app emits no cursedbelt utilities.
|
|
90
|
+
expect(expected).not.toBe(source);
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
it('is exported as a subpath that resolves into a directory `files` ships', () => {
|
|
94
|
+
const exports = (pkg as { exports: Record<string, unknown> }).exports;
|
|
95
|
+
expect(exports['./styles-static.css']).toBe(`./${STATIC_STYLESHEET}`);
|
|
96
|
+
// It must resolve out of `src/`, exactly like its sibling: `./styles.css`
|
|
97
|
+
// points at the SOURCE tree (not dist) because `@source "."` has to resolve
|
|
98
|
+
// relative to the files it is meant to scan, and a pair of app-facing
|
|
99
|
+
// stylesheets served from two different directories is a difference nobody
|
|
100
|
+
// can see in CSS.
|
|
101
|
+
expect(exports['./styles.css']).toBe('./src/styles.css');
|
|
102
|
+
// `files` ships whole directories, so `src` is what actually puts both of
|
|
103
|
+
// them in the tarball. publishShape.spec.ts proves the general rule; this is
|
|
104
|
+
// the one line that makes THIS subpath's failure legible.
|
|
105
|
+
expect((pkg as { files: string[] }).files).toContain('src');
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
it('resolves as `cursedbelt/styles-static.css` through the real resolver', () => {
|
|
109
|
+
// The assertions above read the manifest; this one RESOLVES the specifier the
|
|
110
|
+
// way a consumer's bundler does, through the package's own `exports` map (bun
|
|
111
|
+
// honours a self-reference by package name). An export entry pointing at a
|
|
112
|
+
// path that does not exist satisfies every string comparison in this file and
|
|
113
|
+
// fails here — which is the failure `belt-static.css` would have been.
|
|
114
|
+
expect(Bun.resolveSync(`${pkg.name}/styles-static.css`, REPO_ROOT)).toBe(
|
|
115
|
+
`${REPO_ROOT}/${STATIC_STYLESHEET}`,
|
|
116
|
+
);
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
it('is regenerated by the build, so a stale copy cannot be published', () => {
|
|
120
|
+
// `prepublishOnly` → `verify` → `build`, so the tarball's copy is always the
|
|
121
|
+
// one this repo's current styles.css produces. Without this step in `build`,
|
|
122
|
+
// the only thing standing between a drifted copy and a publish is a person
|
|
123
|
+
// remembering to run a script.
|
|
124
|
+
expect((pkg as { scripts: Record<string, string> }).scripts.build).toContain(
|
|
125
|
+
'scripts/generateStaticStyles.ts',
|
|
126
|
+
);
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
it('exposes the transform as a pure function', () => {
|
|
130
|
+
// Cheap guard on the one behaviour every assertion above leans on.
|
|
131
|
+
expect(staticStylesFrom('a\n@source ".";\n\nb\n')).toBe('a\nb\n');
|
|
132
|
+
expect(staticStylesFrom('a\nb\n')).toBe('a\nb\n');
|
|
133
|
+
});
|
|
134
|
+
});
|