@orbit-work/ui 0.1.2-preview.0 → 0.1.3
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/README.md +59 -57
- package/dist/about-window.cjs +271 -1
- package/dist/about-window.cjs.map +1 -0
- package/dist/about-window.d.cts +20 -2
- package/dist/about-window.d.ts +20 -2
- package/dist/about-window.js +271 -1
- package/dist/about-window.js.map +1 -0
- package/dist/appearance.cjs +41 -1
- package/dist/appearance.cjs.map +1 -0
- package/dist/appearance.d.cts +7 -1
- package/dist/appearance.d.ts +7 -1
- package/dist/appearance.js +41 -1
- package/dist/appearance.js.map +1 -0
- package/dist/brand-preview.cjs +14 -0
- package/dist/brand-preview.cjs.map +1 -0
- package/dist/brand-preview.d.cts +13 -0
- package/dist/brand-preview.d.ts +13 -0
- package/dist/brand-preview.js +14 -0
- package/dist/brand-preview.js.map +1 -0
- package/dist/browser-annotation-popup.cjs +9 -1
- package/dist/browser-annotation-popup.cjs.map +1 -0
- package/dist/browser-annotation-popup.d.cts +6 -6
- package/dist/browser-annotation-popup.d.ts +6 -6
- package/dist/browser-annotation-popup.js +9 -1
- package/dist/browser-annotation-popup.js.map +1 -0
- package/dist/chunk-66VEV7G2.js +111 -0
- package/dist/chunk-66VEV7G2.js.map +1 -0
- package/dist/chunk-JC7BHKS4.cjs +734 -0
- package/dist/chunk-JC7BHKS4.cjs.map +1 -0
- package/dist/chunk-K7ONUTLA.cjs +240 -0
- package/dist/chunk-K7ONUTLA.cjs.map +1 -0
- package/dist/chunk-KTNWR3H5.js +399 -0
- package/dist/chunk-KTNWR3H5.js.map +1 -0
- package/dist/chunk-LSGO6AQR.js +734 -0
- package/dist/chunk-LSGO6AQR.js.map +1 -0
- package/dist/chunk-Q7B4M5GC.cjs +399 -0
- package/dist/chunk-Q7B4M5GC.cjs.map +1 -0
- package/dist/chunk-QS55W5Q5.cjs +111 -0
- package/dist/chunk-QS55W5Q5.cjs.map +1 -0
- package/dist/chunk-UT5LC6MR.js +38 -0
- package/dist/chunk-UT5LC6MR.js.map +1 -0
- package/dist/chunk-ZXMHCL6D.js +240 -0
- package/dist/chunk-ZXMHCL6D.js.map +1 -0
- package/dist/chunk-ZZTEY4YX.cjs +38 -0
- package/dist/chunk-ZZTEY4YX.cjs.map +1 -0
- package/dist/core.css +7895 -0
- package/dist/core.scoped.css +7888 -0
- package/dist/file-tree.css +85 -0
- package/dist/index-nLo7jMlP.d.cts +166 -0
- package/dist/index-nLo7jMlP.d.ts +166 -0
- package/dist/index.cjs +38996 -26
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +3797 -3027
- package/dist/index.d.ts +3797 -3027
- package/dist/index.js +38996 -26
- package/dist/index.js.map +1 -0
- package/dist/locale.cjs +15 -0
- package/dist/locale.cjs.map +1 -0
- package/dist/locale.d.cts +28 -0
- package/dist/locale.d.ts +28 -0
- package/dist/locale.js +15 -0
- package/dist/locale.js.map +1 -0
- package/dist/office.css +1146 -0
- package/dist/slot-core.cjs +200 -0
- package/dist/slot-core.cjs.map +1 -0
- package/dist/slot-core.d.cts +146 -0
- package/dist/slot-core.d.ts +146 -0
- package/dist/slot-core.js +200 -0
- package/dist/slot-core.js.map +1 -0
- package/dist/slot-react.cjs +153 -0
- package/dist/slot-react.cjs.map +1 -0
- package/dist/slot-react.d.cts +36 -0
- package/dist/slot-react.d.ts +36 -0
- package/dist/slot-react.js +153 -0
- package/dist/slot-react.js.map +1 -0
- package/dist/tailwind.css +137 -0
- package/dist/unifiedTheme-DQ-sETKO.d.cts +201 -0
- package/dist/unifiedTheme-DQ-sETKO.d.ts +201 -0
- package/dist/workbench.css +9023 -0
- package/package.json +126 -47
- package/dist/appearance-D5uQ53j3.d.cts +0 -210
- package/dist/appearance-D5uQ53j3.d.ts +0 -210
- package/dist/chunk-3KT7IU4X.js +0 -13
- package/dist/chunk-5VLBKOG7.cjs +0 -194
- package/dist/chunk-7YJY64LZ.js +0 -82
- package/dist/chunk-EF2BSN3K.cjs +0 -13
- package/dist/chunk-GMMYDILD.cjs +0 -82
- package/dist/chunk-VG7FQQ7K.js +0 -194
- package/dist/fonts/JetBrainsMono-Medium.ttf +0 -0
- package/dist/fonts/JetBrainsMono-Regular.ttf +0 -0
- package/dist/fonts/SpaceGrotesk-700-latin-ext.woff2 +0 -0
- package/dist/fonts/SpaceGrotesk-700-latin.woff2 +0 -0
- package/dist/index.css +0 -1
- package/dist/orbitwork.css +0 -22209
- package/src/components/Layout/AppLayout/AppLayout.stories.tsx +0 -246
- package/src/components/Layout/AppLayout/AppLayoutSource.test.mjs +0 -37
- package/src/components/Layout/AppLayout/index.tsx +0 -122
- package/src/components/Layout/Sidebar/index.tsx +0 -13
- package/src/components/Layout/SidebarShell/SidebarShell.stories.tsx +0 -676
- package/src/components/Layout/SidebarShell/SidebarShellSource.test.mjs +0 -161
- package/src/components/Layout/SidebarShell/index.tsx +0 -326
- package/src/components/Layout/index.ts +0 -10
- package/src/components/composite/ActionBar/ActionBar.stories.tsx +0 -26
- package/src/components/composite/ActionBar/index.tsx +0 -31
- package/src/components/composite/ActionStatus/ActionStatus.stories.tsx +0 -60
- package/src/components/composite/ActionStatus/index.tsx +0 -21
- package/src/components/composite/AskQuestionCardView/AskQuestionCardView.stories.tsx +0 -175
- package/src/components/composite/AskQuestionCardView/AskQuestionCardViewSource.test.mjs +0 -92
- package/src/components/composite/AskQuestionCardView/index.tsx +0 -119
- package/src/components/composite/AssistantChannelCard/AssistantChannelCard.stories.tsx +0 -265
- package/src/components/composite/AssistantChannelCard/AssistantChannelCardSource.test.mjs +0 -45
- package/src/components/composite/AssistantChannelCard/index.tsx +0 -102
- package/src/components/composite/AssistantToggleRow/AssistantToggleRow.stories.tsx +0 -197
- package/src/components/composite/AssistantToggleRow/index.tsx +0 -35
- package/src/components/composite/AttachmentCard/AttachmentCard.stories.tsx +0 -125
- package/src/components/composite/AttachmentCard/index.tsx +0 -80
- package/src/components/composite/BackButton/BackButton.stories.tsx +0 -93
- package/src/components/composite/BackButton/BackButtonSource.test.mjs +0 -29
- package/src/components/composite/BackButton/index.tsx +0 -48
- package/src/components/composite/Banner/Banner.stories.tsx +0 -180
- package/src/components/composite/Banner/BannerSource.test.mjs +0 -67
- package/src/components/composite/Banner/index.tsx +0 -125
- package/src/components/composite/BeaconIcons/BeaconIcons.stories.tsx +0 -153
- package/src/components/composite/BeaconIcons/index.tsx +0 -265
- package/src/components/composite/BeaconSpinner/BeaconSpinner.stories.tsx +0 -144
- package/src/components/composite/BeaconSpinner/index.tsx +0 -185
- package/src/components/composite/CatalogStates/CatalogEmptyState.stories.tsx +0 -108
- package/src/components/composite/CatalogStates/CatalogStates.stories.tsx +0 -53
- package/src/components/composite/CatalogStates/CatalogStatesSource.test.mjs +0 -149
- package/src/components/composite/CatalogStates/index.tsx +0 -113
- package/src/components/composite/Charts/Charts.stories.tsx +0 -174
- package/src/components/composite/Charts/ChartsSource.test.mjs +0 -111
- package/src/components/composite/Charts/index.tsx +0 -385
- package/src/components/composite/CodeBlock/CodeBlock.stories.tsx +0 -308
- package/src/components/composite/CodeBlock/CodeFaceSource.test.mjs +0 -89
- package/src/components/composite/CodeBlock/index.tsx +0 -300
- package/src/components/composite/CodeDiff/CodeDiff.stories.tsx +0 -169
- package/src/components/composite/CodeDiff/index.tsx +0 -373
- package/src/components/composite/CodePreview/CodePreview.stories.tsx +0 -127
- package/src/components/composite/CodePreview/CodePreviewSource.test.mjs +0 -43
- package/src/components/composite/CodePreview/index.tsx +0 -98
- package/src/components/composite/CommandPalette/CommandPalette.stories.tsx +0 -89
- package/src/components/composite/CommandPalette/CommandPaletteSource.test.mjs +0 -61
- package/src/components/composite/CommandPalette/index.tsx +0 -310
- package/src/components/composite/ContentRecommendation/ContentRecommendation.stories.tsx +0 -300
- package/src/components/composite/ContentRecommendation/ContentRecommendationSource.test.mjs +0 -48
- package/src/components/composite/ContentRecommendation/index.tsx +0 -116
- package/src/components/composite/ContextChip/ContextChip.stories.tsx +0 -123
- package/src/components/composite/ContextChip/ContextChipSource.test.mjs +0 -24
- package/src/components/composite/ContextChip/index.tsx +0 -25
- package/src/components/composite/ContextUsageIndicatorView/ContextUsageIndicatorSizeSource.test.mjs +0 -15
- package/src/components/composite/ContextUsageIndicatorView/ContextUsageIndicatorView.stories.tsx +0 -110
- package/src/components/composite/ContextUsageIndicatorView/ContextUsageLoadingSource.test.mjs +0 -23
- package/src/components/composite/ContextUsageIndicatorView/index.tsx +0 -139
- package/src/components/composite/Controls/Controls.stories.tsx +0 -227
- package/src/components/composite/Controls/index.tsx +0 -15
- package/src/components/composite/CreateProjectDialog/CreateProjectDialog.stories.tsx +0 -56
- package/src/components/composite/CreateProjectDialog/index.tsx +0 -70
- package/src/components/composite/DataManagementSectionView/DataManagementSectionView.stories.tsx +0 -123
- package/src/components/composite/DataManagementSectionView/DataManagementSectionViewSource.test.mjs +0 -45
- package/src/components/composite/DataManagementSectionView/index.tsx +0 -110
- package/src/components/composite/DataTable/DataTable.stories.tsx +0 -159
- package/src/components/composite/DataTable/DataTableSource.test.mjs +0 -96
- package/src/components/composite/DataTable/index.tsx +0 -373
- package/src/components/composite/DetailChrome/DetailChrome.stories.tsx +0 -61
- package/src/components/composite/DetailChrome/DetailChromeSource.test.mjs +0 -31
- package/src/components/composite/DetailChrome/index.tsx +0 -94
- package/src/components/composite/DetailPanel/DetailPanel.stories.tsx +0 -185
- package/src/components/composite/DetailPanel/DetailPanelSource.test.mjs +0 -49
- package/src/components/composite/DetailPanel/index.tsx +0 -120
- package/src/components/composite/DetailScaffold/DetailScaffold.stories.tsx +0 -203
- package/src/components/composite/DetailScaffold/DetailScaffoldSource.test.mjs +0 -38
- package/src/components/composite/DetailScaffold/index.tsx +0 -114
- package/src/components/composite/Dialog/Dialog.stories.tsx +0 -343
- package/src/components/composite/Dialog/DialogSource.test.mjs +0 -130
- package/src/components/composite/Dialog/index.tsx +0 -333
- package/src/components/composite/DropZone/DropZone.stories.tsx +0 -105
- package/src/components/composite/DropZone/DropZoneSource.test.mjs +0 -68
- package/src/components/composite/DropZone/index.tsx +0 -196
- package/src/components/composite/FSelect/FSelect.stories.tsx +0 -64
- package/src/components/composite/FSelect/index.tsx +0 -29
- package/src/components/composite/FeedbackContextMenuView/FeedbackContextMenuView.stories.tsx +0 -106
- package/src/components/composite/FeedbackContextMenuView/index.tsx +0 -51
- package/src/components/composite/FeedbackDialogView/FeedbackDialogView.stories.tsx +0 -291
- package/src/components/composite/FeedbackDialogView/index.tsx +0 -95
- package/src/components/composite/FileReferenceCard/FileReferenceCard.stories.tsx +0 -364
- package/src/components/composite/FileReferenceCard/FileReferenceCardSource.test.mjs +0 -48
- package/src/components/composite/FileReferenceCard/index.tsx +0 -122
- package/src/components/composite/FilterBar/FilterBar.stories.tsx +0 -167
- package/src/components/composite/FilterBar/FilterBarSource.test.mjs +0 -75
- package/src/components/composite/FilterBar/index.tsx +0 -206
- package/src/components/composite/FormField/FormField.stories.tsx +0 -158
- package/src/components/composite/FormField/FormFieldSource.test.mjs +0 -56
- package/src/components/composite/FormField/index.tsx +0 -219
- package/src/components/composite/HomeBackdrop/HomeBackdrop.stories.tsx +0 -54
- package/src/components/composite/HomeBackdrop/HomeBackdropSource.test.mjs +0 -50
- package/src/components/composite/HomeBackdrop/index.tsx +0 -53
- package/src/components/composite/Icons/Icons.stories.tsx +0 -153
- package/src/components/composite/Icons/IconsSource.test.mjs +0 -23
- package/src/components/composite/Icons/index.tsx +0 -1367
- package/src/components/composite/ImageCard/ImageCard.stories.tsx +0 -54
- package/src/components/composite/ImageCard/index.tsx +0 -33
- package/src/components/composite/ImagePreview/ImagePreview.stories.tsx +0 -172
- package/src/components/composite/ImagePreview/ImagePreviewSource.test.mjs +0 -95
- package/src/components/composite/ImagePreview/index.tsx +0 -339
- package/src/components/composite/ListRow/ListRow.stories.tsx +0 -257
- package/src/components/composite/ListRow/ListRowSource.test.mjs +0 -101
- package/src/components/composite/ListRow/index.tsx +0 -309
- package/src/components/composite/Markdown/Markdown.stories.tsx +0 -192
- package/src/components/composite/Markdown/MarkdownSource.test.mjs +0 -126
- package/src/components/composite/Markdown/MarkdownStyleSource.test.mjs +0 -167
- package/src/components/composite/Markdown/index.tsx +0 -702
- package/src/components/composite/MarkdownPreview/MarkdownPreview.stories.tsx +0 -174
- package/src/components/composite/MarkdownPreview/MarkdownPreviewTabsSource.test.mjs +0 -31
- package/src/components/composite/MarkdownPreview/MarkdownRenderedStyleSource.test.mjs +0 -84
- package/src/components/composite/MarkdownPreview/index.tsx +0 -140
- package/src/components/composite/MarkdownPreviewModalView/MarkdownPreviewModalView.stories.tsx +0 -104
- package/src/components/composite/MarkdownPreviewModalView/index.tsx +0 -85
- package/src/components/composite/MessageFeedbackDialog/MessageFeedbackDialog.stories.tsx +0 -66
- package/src/components/composite/MessageFeedbackDialog/index.tsx +0 -115
- package/src/components/composite/ModelCatalogErrorState/ModelCatalogErrorState.stories.tsx +0 -101
- package/src/components/composite/ModelCatalogErrorState/ModelCatalogRetrySource.test.mjs +0 -86
- package/src/components/composite/ModelCatalogErrorState/index.tsx +0 -59
- package/src/components/composite/ModelModalityFlow/ModelModalityFlow.stories.tsx +0 -224
- package/src/components/composite/ModelModalityFlow/ModelModalityFlowSource.test.mjs +0 -56
- package/src/components/composite/ModelModalityFlow/index.tsx +0 -113
- package/src/components/composite/ModelPickerList/ModelPickerList.stories.tsx +0 -313
- package/src/components/composite/ModelPickerList/index.tsx +0 -142
- package/src/components/composite/ModelSelect/ModelSelect.stories.tsx +0 -90
- package/src/components/composite/ModelSelect/index.tsx +0 -148
- package/src/components/composite/ModelsSettingsSectionView/ModelsSettingsSectionView.stories.tsx +0 -170
- package/src/components/composite/ModelsSettingsSectionView/index.tsx +0 -139
- package/src/components/composite/NativeControls/NativeControls.stories.tsx +0 -386
- package/src/components/composite/NativeControls/NativeControlsStyleSource.test.mjs +0 -63
- package/src/components/composite/NativeControls/index.tsx +0 -97
- package/src/components/composite/NavMenu/NavMenu.stories.tsx +0 -383
- package/src/components/composite/NavMenu/NavMenuSource.test.mjs +0 -56
- package/src/components/composite/NavMenu/index.tsx +0 -142
- package/src/components/composite/NoPlanPanelView/NoPlanPanelView.stories.tsx +0 -344
- package/src/components/composite/NoPlanPanelView/NoPlanPanelViewSource.test.mjs +0 -34
- package/src/components/composite/NoPlanPanelView/index.tsx +0 -97
- package/src/components/composite/OpenWithButton/OpenWithButton.stories.tsx +0 -78
- package/src/components/composite/OpenWithButton/index.tsx +0 -46
- package/src/components/composite/OrbitworkLogo/OrbitworkLogo.stories.tsx +0 -192
- package/src/components/composite/OrbitworkLogo/index.tsx +0 -207
- package/src/components/composite/OrbitworkModal/OrbitworkModal.stories.tsx +0 -58
- package/src/components/composite/OrbitworkModal/index.tsx +0 -31
- package/src/components/composite/PageHead/PageHead.stories.tsx +0 -235
- package/src/components/composite/PageHead/PageHeadSource.test.mjs +0 -76
- package/src/components/composite/PageHead/index.tsx +0 -128
- package/src/components/composite/PlanFeatureIcon/PlanFeatureIcon.stories.tsx +0 -205
- package/src/components/composite/PlanFeatureIcon/PlanFeatureIconSource.test.mjs +0 -38
- package/src/components/composite/PlanFeatureIcon/index.tsx +0 -48
- package/src/components/composite/PlanSettingsSectionView/PlanSettingsSectionView.stories.tsx +0 -231
- package/src/components/composite/PlanSettingsSectionView/PlanSettingsSectionViewSource.test.mjs +0 -85
- package/src/components/composite/PlanSettingsSectionView/index.tsx +0 -264
- package/src/components/composite/Popover/Popover.stories.tsx +0 -175
- package/src/components/composite/Popover/PopoverSource.test.mjs +0 -59
- package/src/components/composite/Popover/index.tsx +0 -176
- package/src/components/composite/PptxRenderer/ElementDispatcher/index.tsx +0 -70
- package/src/components/composite/PptxRenderer/PptxChromeStyleSource.test.mjs +0 -36
- package/src/components/composite/PptxRenderer/PptxRenderer.stories.tsx +0 -128
- package/src/components/composite/PptxRenderer/PptxSlide/index.tsx +0 -48
- package/src/components/composite/PptxRenderer/constants.ts +0 -2
- package/src/components/composite/PptxRenderer/elements/AudioElement/index.tsx +0 -48
- package/src/components/composite/PptxRenderer/elements/ChartElement/index.tsx +0 -172
- package/src/components/composite/PptxRenderer/elements/DiagramElement/index.tsx +0 -46
- package/src/components/composite/PptxRenderer/elements/GroupElement/index.tsx +0 -28
- package/src/components/composite/PptxRenderer/elements/ImageElement/index.tsx +0 -61
- package/src/components/composite/PptxRenderer/elements/MathElement/index.tsx +0 -57
- package/src/components/composite/PptxRenderer/elements/ShapeElement/index.tsx +0 -327
- package/src/components/composite/PptxRenderer/elements/TableElement/index.tsx +0 -90
- package/src/components/composite/PptxRenderer/elements/TextElement/index.tsx +0 -57
- package/src/components/composite/PptxRenderer/elements/VideoElement/index.tsx +0 -43
- package/src/components/composite/PptxRenderer/index.ts +0 -24
- package/src/components/composite/PptxRenderer/types.ts +0 -326
- package/src/components/composite/PptxRenderer/utils.ts +0 -129
- package/src/components/composite/ProjectSelect/ProjectSelect.stories.tsx +0 -112
- package/src/components/composite/ProjectSelect/ProjectSelectSource.test.mjs +0 -34
- package/src/components/composite/ProjectSelect/index.tsx +0 -155
- package/src/components/composite/RadioCard/RadioCard.stories.tsx +0 -130
- package/src/components/composite/RadioCard/RadioCardSource.test.mjs +0 -42
- package/src/components/composite/RadioCard/index.tsx +0 -171
- package/src/components/composite/RowOverflowMenu/RowOverflowMenu.stories.tsx +0 -113
- package/src/components/composite/RowOverflowMenu/RowOverflowMenuSource.test.mjs +0 -59
- package/src/components/composite/RowOverflowMenu/index.tsx +0 -101
- package/src/components/composite/SandboxPermissionPrompt/SandboxPermissionPrompt.stories.tsx +0 -159
- package/src/components/composite/SandboxPermissionPrompt/SandboxPermissionPromptSource.test.mjs +0 -71
- package/src/components/composite/SandboxPermissionPrompt/index.tsx +0 -157
- package/src/components/composite/SearchInput/SearchInput.stories.tsx +0 -127
- package/src/components/composite/SearchInput/index.tsx +0 -91
- package/src/components/composite/SearchResult/SearchResult.stories.tsx +0 -305
- package/src/components/composite/SearchResult/SearchResultSource.test.mjs +0 -45
- package/src/components/composite/SearchResult/index.tsx +0 -148
- package/src/components/composite/Section/Section.stories.tsx +0 -148
- package/src/components/composite/Section/SectionSource.test.mjs +0 -59
- package/src/components/composite/Section/index.tsx +0 -105
- package/src/components/composite/SelectionBulkBar/SelectionBulkBar.stories.tsx +0 -111
- package/src/components/composite/SelectionBulkBar/SelectionBulkBarSource.test.mjs +0 -44
- package/src/components/composite/SelectionBulkBar/index.tsx +0 -99
- package/src/components/composite/ShareStrip/ShareStrip.stories.tsx +0 -123
- package/src/components/composite/ShareStrip/index.tsx +0 -83
- package/src/components/composite/ShortcutSheet/ShortcutSheet.stories.tsx +0 -90
- package/src/components/composite/ShortcutSheet/ShortcutSheetSource.test.mjs +0 -49
- package/src/components/composite/ShortcutSheet/index.tsx +0 -163
- package/src/components/composite/SitesArtifactCardView/SitesArtifactCardView.stories.tsx +0 -328
- package/src/components/composite/SitesArtifactCardView/SitesArtifactCardViewSource.test.mjs +0 -45
- package/src/components/composite/SitesArtifactCardView/index.tsx +0 -100
- package/src/components/composite/Skeleton/Skeleton.stories.tsx +0 -188
- package/src/components/composite/Skeleton/SkeletonSource.test.mjs +0 -25
- package/src/components/composite/Skeleton/index.tsx +0 -152
- package/src/components/composite/Splash/Splash.stories.tsx +0 -150
- package/src/components/composite/Splash/index.tsx +0 -229
- package/src/components/composite/StatusTag/StatusTag.stories.tsx +0 -66
- package/src/components/composite/StatusTag/StatusTagSource.test.mjs +0 -64
- package/src/components/composite/StatusTag/index.tsx +0 -78
- package/src/components/composite/StepList/StepList.stories.tsx +0 -352
- package/src/components/composite/StepList/index.tsx +0 -23
- package/src/components/composite/Tag/Tag.stories.tsx +0 -279
- package/src/components/composite/Tag/TagSource.test.mjs +0 -67
- package/src/components/composite/Tag/index.tsx +0 -229
- package/src/components/composite/TimePicker/TimePicker.stories.tsx +0 -91
- package/src/components/composite/TimePicker/TimePickerSource.test.mjs +0 -98
- package/src/components/composite/TimePicker/index.tsx +0 -208
- package/src/components/composite/TitleBar/TitleBar.stories.tsx +0 -329
- package/src/components/composite/TitleBar/TitleBarSource.test.mjs +0 -140
- package/src/components/composite/TitleBar/index.tsx +0 -350
- package/src/components/composite/Toast/Toast.stories.tsx +0 -304
- package/src/components/composite/Toast/ToastSource.test.mjs +0 -63
- package/src/components/composite/Toast/index.tsx +0 -135
- package/src/components/composite/Tooltip/Tooltip.stories.tsx +0 -304
- package/src/components/composite/Tooltip/TooltipSource.test.mjs +0 -34
- package/src/components/composite/Tooltip/index.tsx +0 -204
- package/src/components/composite/TranscriptDividers/TranscriptDividers.stories.tsx +0 -160
- package/src/components/composite/TranscriptDividers/TranscriptDividersSource.test.mjs +0 -90
- package/src/components/composite/TranscriptDividers/index.tsx +0 -352
- package/src/components/composite/WCardShell/WCardShell.stories.tsx +0 -228
- package/src/components/composite/WCardShell/index.tsx +0 -101
- package/src/components/composite/index.ts +0 -81
- package/src/components/domain/artifacts/ArtifactPreviewSidebarView/ArtifactPreviewSidebarView.stories.tsx +0 -128
- package/src/components/domain/artifacts/ArtifactPreviewSidebarView/ArtifactPreviewSidebarViewSource.test.mjs +0 -69
- package/src/components/domain/artifacts/ArtifactPreviewSidebarView/index.tsx +0 -212
- package/src/components/domain/artifacts/index.ts +0 -1
- package/src/components/domain/browser/BrowserAnnotationPopupView/BrowserAnnotationPopupView.stories.tsx +0 -211
- package/src/components/domain/browser/BrowserAnnotationPopupView/BrowserAnnotationPopupViewSource.test.mjs +0 -82
- package/src/components/domain/browser/BrowserAnnotationPopupView/index.tsx +0 -235
- package/src/components/domain/browser/BrowserDeviceToolbarView/BrowserDeviceToolbarView.stories.tsx +0 -260
- package/src/components/domain/browser/BrowserDeviceToolbarView/BrowserDeviceToolbarViewSource.test.mjs +0 -12
- package/src/components/domain/browser/BrowserDeviceToolbarView/index.tsx +0 -154
- package/src/components/domain/browser/BrowserFindBarView/BrowserFindBarView.stories.tsx +0 -52
- package/src/components/domain/browser/BrowserFindBarView/index.tsx +0 -111
- package/src/components/domain/browser/BrowserImportDialogView/BrowserImportDialogView.stories.tsx +0 -89
- package/src/components/domain/browser/BrowserImportDialogView/index.tsx +0 -155
- package/src/components/domain/browser/BrowserLoadErrorView/BrowserLoadErrorView.stories.tsx +0 -197
- package/src/components/domain/browser/BrowserLoadErrorView/BrowserLoadErrorViewSource.test.mjs +0 -29
- package/src/components/domain/browser/BrowserLoadErrorView/index.tsx +0 -45
- package/src/components/domain/browser/BrowserMoreMenuView/BrowserMoreMenuView.stories.tsx +0 -66
- package/src/components/domain/browser/BrowserMoreMenuView/index.tsx +0 -268
- package/src/components/domain/browser/BrowserNavBarView/BrowserNavBarView.stories.tsx +0 -149
- package/src/components/domain/browser/BrowserNavBarView/index.tsx +0 -156
- package/src/components/domain/browser/BrowserTabBarView/index.tsx +0 -18
- package/src/components/domain/browser/SubAgentPane/SubAgentPane.stories.tsx +0 -96
- package/src/components/domain/browser/SubAgentPane/SubAgentPaneSource.test.mjs +0 -48
- package/src/components/domain/browser/SubAgentPane/index.tsx +0 -121
- package/src/components/domain/browser/TerminalPane/TerminalPane.stories.tsx +0 -95
- package/src/components/domain/browser/TerminalPane/TerminalPaneSource.test.mjs +0 -52
- package/src/components/domain/browser/TerminalPane/index.tsx +0 -75
- package/src/components/domain/browser/WebPreview/WebPreview.stories.tsx +0 -71
- package/src/components/domain/browser/WebPreview/index.tsx +0 -141
- package/src/components/domain/browser/WebPreviewConsole/WebPreviewConsole.stories.tsx +0 -61
- package/src/components/domain/browser/WebPreviewConsole/WebPreviewConsoleSource.test.mjs +0 -66
- package/src/components/domain/browser/WebPreviewConsole/index.tsx +0 -239
- package/src/components/domain/browser/WebPreviewDialog/WebPreviewDialog.stories.tsx +0 -288
- package/src/components/domain/browser/WebPreviewDialog/WebPreviewDialogSource.test.mjs +0 -62
- package/src/components/domain/browser/WebPreviewDialog/index.tsx +0 -82
- package/src/components/domain/browser/WebPreviewNav/WebPreviewNav.stories.tsx +0 -462
- package/src/components/domain/browser/WebPreviewNav/WebPreviewNavSource.test.mjs +0 -353
- package/src/components/domain/browser/WebPreviewNav/index.tsx +0 -351
- package/src/components/domain/browser/WebPreviewShell/WebPreviewShell.stories.tsx +0 -226
- package/src/components/domain/browser/WebPreviewShell/WebPreviewShellSource.test.mjs +0 -172
- package/src/components/domain/browser/WebPreviewShell/index.tsx +0 -324
- package/src/components/domain/browser/index.ts +0 -45
- package/src/components/domain/chat/AgentLoopSegment/AgentLoopSegment.stories.tsx +0 -107
- package/src/components/domain/chat/AgentLoopSegment/AgentLoopSegmentSource.test.mjs +0 -45
- package/src/components/domain/chat/AgentLoopSegment/index.tsx +0 -29
- package/src/components/domain/chat/AgentTurn/AgentTurn.stories.tsx +0 -162
- package/src/components/domain/chat/AgentTurn/AgentTurnSource.test.mjs +0 -98
- package/src/components/domain/chat/AgentTurn/beaconContext.ts +0 -37
- package/src/components/domain/chat/AgentTurn/index.tsx +0 -226
- package/src/components/domain/chat/ArtifactCard/ArtifactCard.stories.tsx +0 -127
- package/src/components/domain/chat/ArtifactCard/index.tsx +0 -249
- package/src/components/domain/chat/Attachment/Attachment.stories.tsx +0 -235
- package/src/components/domain/chat/Attachment/AttachmentSource.test.mjs +0 -160
- package/src/components/domain/chat/Attachment/index.tsx +0 -857
- package/src/components/domain/chat/AuthorizationCard/AuthorizationCard.stories.tsx +0 -53
- package/src/components/domain/chat/AuthorizationCard/AuthorizationCardSource.test.mjs +0 -80
- package/src/components/domain/chat/AuthorizationCard/index.tsx +0 -89
- package/src/components/domain/chat/ChatBubble/ChatBubble.stories.tsx +0 -32
- package/src/components/domain/chat/ChatBubble/index.tsx +0 -24
- package/src/components/domain/chat/ChatMessage/ChatMessage.stories.tsx +0 -31
- package/src/components/domain/chat/ChatMessage/index.tsx +0 -23
- package/src/components/domain/chat/ChatR2ReviewSource.test.mjs +0 -98
- package/src/components/domain/chat/ChatThinking/ChatThinking.stories.tsx +0 -125
- package/src/components/domain/chat/ChatThinking/index.tsx +0 -55
- package/src/components/domain/chat/Chatbot/Chatbot.stories.tsx +0 -49
- package/src/components/domain/chat/Chatbot/index.tsx +0 -37
- package/src/components/domain/chat/Composer/Composer.stories.tsx +0 -227
- package/src/components/domain/chat/Composer/ComposerSource.test.mjs +0 -175
- package/src/components/domain/chat/Composer/index.tsx +0 -450
- package/src/components/domain/chat/Composer/parts/ComposerAudioSpectrum.stories.tsx +0 -203
- package/src/components/domain/chat/Composer/parts/ComposerAudioSpectrum.tsx +0 -110
- package/src/components/domain/chat/Composer/parts/ComposerAudioSpectrumSource.test.mjs +0 -54
- package/src/components/domain/chat/Composer/parts/ComposerAuthorization.stories.tsx +0 -155
- package/src/components/domain/chat/Composer/parts/ComposerAuthorization.tsx +0 -108
- package/src/components/domain/chat/Composer/parts/ComposerMentions.stories.tsx +0 -76
- package/src/components/domain/chat/Composer/parts/ComposerMentions.tsx +0 -83
- package/src/components/domain/chat/Composer/parts/ComposerMentionsSource.test.mjs +0 -85
- package/src/components/domain/chat/Composer/parts/ComposerMenu.stories.tsx +0 -266
- package/src/components/domain/chat/Composer/parts/ComposerMenu.tsx +0 -232
- package/src/components/domain/chat/Composer/parts/ComposerMenuPopover.stories.tsx +0 -166
- package/src/components/domain/chat/Composer/parts/ComposerMenuPopover.tsx +0 -87
- package/src/components/domain/chat/Composer/parts/ComposerMenuPopoverSource.test.mjs +0 -56
- package/src/components/domain/chat/Composer/parts/ComposerPopover.stories.tsx +0 -257
- package/src/components/domain/chat/Composer/parts/ComposerPopover.tsx +0 -221
- package/src/components/domain/chat/Composer/parts/ComposerPopoverSource.test.mjs +0 -71
- package/src/components/domain/chat/Composer/parts/ComposerProjectPicker.stories.tsx +0 -260
- package/src/components/domain/chat/Composer/parts/ComposerProjectPicker.tsx +0 -246
- package/src/components/domain/chat/Composer/parts/ComposerProjectPickerSource.test.mjs +0 -46
- package/src/components/domain/chat/Composer/parts/ComposerQueue.stories.tsx +0 -275
- package/src/components/domain/chat/Composer/parts/ComposerQueue.tsx +0 -155
- package/src/components/domain/chat/Composer/parts/ComposerQueueSource.test.mjs +0 -95
- package/src/components/domain/chat/Composer/parts/ComposerVoiceInput.stories.tsx +0 -77
- package/src/components/domain/chat/Composer/parts/ComposerVoiceInput.tsx +0 -70
- package/src/components/domain/chat/Composer/parts/mountChip.ts +0 -21
- package/src/components/domain/chat/ContextUsage/ContextUsage.stories.tsx +0 -62
- package/src/components/domain/chat/ContextUsage/index.tsx +0 -69
- package/src/components/domain/chat/ExecutionSummary/ExecutionSummary.stories.tsx +0 -238
- package/src/components/domain/chat/ExecutionSummary/ExecutionSummarySource.test.mjs +0 -210
- package/src/components/domain/chat/ExecutionSummary/index.tsx +0 -487
- package/src/components/domain/chat/Message/Message.stories.tsx +0 -264
- package/src/components/domain/chat/Message/index.tsx +0 -44
- package/src/components/domain/chat/MessageActions/MessageActions.stories.tsx +0 -132
- package/src/components/domain/chat/MessageActions/MessageActionsSource.test.mjs +0 -79
- package/src/components/domain/chat/MessageActions/index.tsx +0 -186
- package/src/components/domain/chat/PlanCard/PlanCard.stories.tsx +0 -87
- package/src/components/domain/chat/PlanCard/index.tsx +0 -170
- package/src/components/domain/chat/RichContent/RichContent.stories.tsx +0 -102
- package/src/components/domain/chat/RichContent/RichContentSource.test.mjs +0 -82
- package/src/components/domain/chat/RichContent/index.tsx +0 -465
- package/src/components/domain/chat/SubAgentThread/SubAgentThread.stories.tsx +0 -119
- package/src/components/domain/chat/SubAgentThread/index.tsx +0 -104
- package/src/components/domain/chat/Thinking/Thinking.stories.tsx +0 -196
- package/src/components/domain/chat/Thinking/ThinkingInlineSource.test.mjs +0 -154
- package/src/components/domain/chat/Thinking/index.tsx +0 -237
- package/src/components/domain/chat/ToolCallRow/ToolCallRow.stories.tsx +0 -105
- package/src/components/domain/chat/ToolCallRow/ToolCallRowSource.test.mjs +0 -83
- package/src/components/domain/chat/ToolCallRow/index.tsx +0 -113
- package/src/components/domain/chat/Transcript/Transcript.stories.tsx +0 -296
- package/src/components/domain/chat/Transcript/TranscriptSource.test.mjs +0 -189
- package/src/components/domain/chat/Transcript/index.tsx +0 -187
- package/src/components/domain/chat/TranscriptSpine/TranscriptSpine.stories.tsx +0 -124
- package/src/components/domain/chat/TranscriptSpine/index.tsx +0 -245
- package/src/components/domain/chat/UserTurn/UserTurn.stories.tsx +0 -176
- package/src/components/domain/chat/UserTurn/UserTurnSource.test.mjs +0 -150
- package/src/components/domain/chat/UserTurn/index.tsx +0 -194
- package/src/components/domain/chat/index.ts +0 -22
- package/src/components/domain/desktop/DesktopAccountMenuView/DesktopAccountMenuView.stories.tsx +0 -116
- package/src/components/domain/desktop/DesktopAccountMenuView/DesktopAccountMenuViewSource.test.mjs +0 -80
- package/src/components/domain/desktop/DesktopAccountMenuView/index.tsx +0 -355
- package/src/components/domain/desktop/DesktopAppearanceSettings/DesktopAppearanceSettings.stories.tsx +0 -96
- package/src/components/domain/desktop/DesktopAppearanceSettings/DesktopAppearanceSettingsSource.test.mjs +0 -89
- package/src/components/domain/desktop/DesktopAppearanceSettings/index.tsx +0 -155
- package/src/components/domain/desktop/DesktopAssistantConfigView/DesktopAssistantConfigView.stories.tsx +0 -275
- package/src/components/domain/desktop/DesktopAssistantConfigView/DesktopAssistantConfigViewSource.test.mjs +0 -37
- package/src/components/domain/desktop/DesktopAssistantConfigView/index.tsx +0 -221
- package/src/components/domain/desktop/DesktopCatalogView/DesktopCatalogView.stories.tsx +0 -537
- package/src/components/domain/desktop/DesktopCatalogView/DesktopCatalogViewSource.test.mjs +0 -339
- package/src/components/domain/desktop/DesktopCatalogView/index.tsx +0 -1074
- package/src/components/domain/desktop/DesktopChatBranchDivider/DesktopChatBranchDivider.stories.tsx +0 -58
- package/src/components/domain/desktop/DesktopChatBranchDivider/index.tsx +0 -33
- package/src/components/domain/desktop/DesktopChatEmptyStateView/DesktopChatEmptyStateView.stories.tsx +0 -75
- package/src/components/domain/desktop/DesktopChatEmptyStateView/DesktopChatEmptyStateViewSource.test.mjs +0 -54
- package/src/components/domain/desktop/DesktopChatEmptyStateView/index.tsx +0 -64
- package/src/components/domain/desktop/DesktopChatHeaderView/DesktopChatHeaderView.stories.tsx +0 -83
- package/src/components/domain/desktop/DesktopChatHeaderView/DesktopChatHeaderViewSource.test.mjs +0 -126
- package/src/components/domain/desktop/DesktopChatHeaderView/index.tsx +0 -169
- package/src/components/domain/desktop/DesktopChatMessageView/DesktopChatMessageView.stories.tsx +0 -170
- package/src/components/domain/desktop/DesktopChatMessageView/DesktopChatMessageViewSource.test.mjs +0 -47
- package/src/components/domain/desktop/DesktopChatMessageView/index.tsx +0 -213
- package/src/components/domain/desktop/DesktopChatTurnView/DesktopChatTurnView.stories.tsx +0 -498
- package/src/components/domain/desktop/DesktopChatTurnView/DesktopChatTurnViewSource.test.mjs +0 -187
- package/src/components/domain/desktop/DesktopChatTurnView/index.tsx +0 -490
- package/src/components/domain/desktop/DesktopComposer/DesktopComposer.stories.tsx +0 -195
- package/src/components/domain/desktop/DesktopComposer/DesktopComposerModelPickerSource.test.mjs +0 -132
- package/src/components/domain/desktop/DesktopComposer/DesktopComposerMountChipSource.test.mjs +0 -43
- package/src/components/domain/desktop/DesktopComposer/DesktopComposerResponsiveSource.test.mjs +0 -44
- package/src/components/domain/desktop/DesktopComposer/DesktopMcpFormThemeSource.test.mjs +0 -30
- package/src/components/domain/desktop/DesktopComposer/index.tsx +0 -206
- package/src/components/domain/desktop/DesktopConnectorDetailView/DesktopConnectorDetailView.stories.tsx +0 -72
- package/src/components/domain/desktop/DesktopConnectorDetailView/DesktopConnectorDetailViewSource.test.mjs +0 -81
- package/src/components/domain/desktop/DesktopConnectorDetailView/index.tsx +0 -301
- package/src/components/domain/desktop/DesktopHomeView/DesktopHomeView.stories.tsx +0 -103
- package/src/components/domain/desktop/DesktopHomeView/DesktopHomeViewSource.test.mjs +0 -51
- package/src/components/domain/desktop/DesktopHomeView/index.tsx +0 -122
- package/src/components/domain/desktop/DesktopLibraryAuthorizationDialog/DesktopLibraryAuthorizationDialog.stories.tsx +0 -55
- package/src/components/domain/desktop/DesktopLibraryAuthorizationDialog/DesktopLibraryAuthorizationDialogSource.test.mjs +0 -22
- package/src/components/domain/desktop/DesktopLibraryAuthorizationDialog/index.tsx +0 -171
- package/src/components/domain/desktop/DesktopLibraryPageView/DesktopLibraryPageView.stories.tsx +0 -49
- package/src/components/domain/desktop/DesktopLibraryPageView/index.tsx +0 -49
- package/src/components/domain/desktop/DesktopLoginView/DesktopLoginView.css +0 -75
- package/src/components/domain/desktop/DesktopLoginView/DesktopLoginView.stories.tsx +0 -230
- package/src/components/domain/desktop/DesktopLoginView/DesktopLoginViewSource.test.mjs +0 -156
- package/src/components/domain/desktop/DesktopLoginView/index.tsx +0 -432
- package/src/components/domain/desktop/DesktopOnboardingTourView/DesktopOnboardingTourView.stories.tsx +0 -103
- package/src/components/domain/desktop/DesktopOnboardingTourView/DesktopOnboardingTourViewSource.test.mjs +0 -57
- package/src/components/domain/desktop/DesktopOnboardingTourView/index.tsx +0 -189
- package/src/components/domain/desktop/DesktopPet/DesktopPet.fixture.ts +0 -243
- package/src/components/domain/desktop/DesktopPet/DesktopPet.stories.tsx +0 -337
- package/src/components/domain/desktop/DesktopPet/DesktopPetSource.test.mjs +0 -191
- package/src/components/domain/desktop/DesktopPet/index.tsx +0 -591
- package/src/components/domain/desktop/DesktopPetSettings/DesktopPetSettings.stories.tsx +0 -159
- package/src/components/domain/desktop/DesktopPetSettings/DesktopPetSettingsSource.test.mjs +0 -76
- package/src/components/domain/desktop/DesktopPetSettings/index.tsx +0 -140
- package/src/components/domain/desktop/DesktopRunStatusView/DesktopRunStatusView.stories.tsx +0 -166
- package/src/components/domain/desktop/DesktopRunStatusView/DesktopRunStatusViewSource.test.mjs +0 -51
- package/src/components/domain/desktop/DesktopRunStatusView/index.tsx +0 -34
- package/src/components/domain/desktop/DesktopSelectionCard/DesktopSelectionCard.stories.tsx +0 -122
- package/src/components/domain/desktop/DesktopSelectionCard/DesktopSelectionCardSource.test.mjs +0 -42
- package/src/components/domain/desktop/DesktopSelectionCard/index.tsx +0 -75
- package/src/components/domain/desktop/DesktopSettingsMemorySection/DesktopSettingsMemorySection.stories.tsx +0 -225
- package/src/components/domain/desktop/DesktopSettingsMemorySection/DesktopSettingsMemorySectionSource.test.mjs +0 -105
- package/src/components/domain/desktop/DesktopSettingsMemorySection/index.tsx +0 -340
- package/src/components/domain/desktop/DesktopSettingsView/DesktopSettingsView.stories.tsx +0 -177
- package/src/components/domain/desktop/DesktopSettingsView/DesktopSettingsViewSource.test.mjs +0 -195
- package/src/components/domain/desktop/DesktopSettingsView/index.tsx +0 -176
- package/src/components/domain/desktop/DesktopShareSelectionBarView/DesktopShareSelectionBarView.stories.tsx +0 -77
- package/src/components/domain/desktop/DesktopShareSelectionBarView/DesktopShareSelectionBarViewSource.test.mjs +0 -76
- package/src/components/domain/desktop/DesktopShareSelectionBarView/index.tsx +0 -55
- package/src/components/domain/desktop/DesktopSidebarView/DesktopSidebarView.stories.tsx +0 -454
- package/src/components/domain/desktop/DesktopSidebarView/DesktopSidebarViewSource.test.mjs +0 -388
- package/src/components/domain/desktop/DesktopSidebarView/index.tsx +0 -1111
- package/src/components/domain/desktop/DesktopSiteReleasesView/DesktopSiteReleasesView.stories.tsx +0 -369
- package/src/components/domain/desktop/DesktopSiteReleasesView/DesktopSiteReleasesViewSource.test.mjs +0 -123
- package/src/components/domain/desktop/DesktopSiteReleasesView/index.tsx +0 -392
- package/src/components/domain/desktop/DesktopSitesListView/DesktopSitesListView.stories.tsx +0 -244
- package/src/components/domain/desktop/DesktopSitesListView/DesktopSitesListViewSource.test.mjs +0 -198
- package/src/components/domain/desktop/DesktopSitesListView/index.tsx +0 -417
- package/src/components/domain/desktop/DesktopSkillsPageView/DesktopSkillsPageView.stories.tsx +0 -230
- package/src/components/domain/desktop/DesktopSkillsPageView/DesktopSkillsPageViewSource.test.mjs +0 -149
- package/src/components/domain/desktop/DesktopSkillsPageView/index.tsx +0 -235
- package/src/components/domain/desktop/DesktopTaskDetailView/index.tsx +0 -111
- package/src/components/domain/desktop/DesktopToolCallView/DesktopToolCallListViewSource.test.mjs +0 -302
- package/src/components/domain/desktop/DesktopToolCallView/DesktopToolCallView.stories.tsx +0 -409
- package/src/components/domain/desktop/DesktopToolCallView/index.tsx +0 -388
- package/src/components/domain/desktop/DesktopWorkbenchShell/DesktopWorkbenchShell.stories.tsx +0 -418
- package/src/components/domain/desktop/DesktopWorkbenchShell/DesktopWorkbenchShellSource.test.mjs +0 -151
- package/src/components/domain/desktop/DesktopWorkbenchShell/index.tsx +0 -167
- package/src/components/domain/desktop/DesktopWorkspacePageView/DesktopWorkspacePageView.stories.tsx +0 -135
- package/src/components/domain/desktop/DesktopWorkspacePageView/DesktopWorkspacePageViewSource.test.mjs +0 -57
- package/src/components/domain/desktop/DesktopWorkspacePageView/index.tsx +0 -114
- package/src/components/domain/desktop/DesktopWorkspaceView/DesktopWorkspaceView.stories.tsx +0 -227
- package/src/components/domain/desktop/DesktopWorkspaceView/DesktopWorkspaceViewSource.test.mjs +0 -175
- package/src/components/domain/desktop/DesktopWorkspaceView/index.tsx +0 -580
- package/src/components/domain/desktop/ResourceManagement/ResourceManagement.stories.tsx +0 -19
- package/src/components/domain/desktop/ResourceManagement/ResourceManagementSource.test.mjs +0 -54
- package/src/components/domain/desktop/ResourceManagement/SharesList.tsx +0 -323
- package/src/components/domain/desktop/ResourceManagement/SnapshotViews.tsx +0 -92
- package/src/components/domain/desktop/ResourceManagement/SnapshotViewsSource.test.mjs +0 -15
- package/src/components/domain/desktop/ResourceManagement/index.tsx +0 -246
- package/src/components/domain/desktop/ShareSettingsDialogView/index.tsx +0 -234
- package/src/components/domain/desktop/SidePanelEmpty/SidePanelEmpty.stories.tsx +0 -100
- package/src/components/domain/desktop/SidePanelEmpty/SidePanelEmptySource.test.mjs +0 -67
- package/src/components/domain/desktop/SidePanelEmpty/index.tsx +0 -113
- package/src/components/domain/desktop/StarterCapsules/StarterCapsules.stories.tsx +0 -65
- package/src/components/domain/desktop/StarterCapsules/StarterCapsulesSource.test.mjs +0 -43
- package/src/components/domain/desktop/StarterCapsules/index.tsx +0 -90
- package/src/components/domain/desktop/WorkbenchSidePanel/WorkbenchSidePanel.stories.tsx +0 -59
- package/src/components/domain/desktop/WorkbenchSidePanel/WorkbenchSidePanelSource.test.mjs +0 -51
- package/src/components/domain/desktop/WorkbenchSidePanel/index.tsx +0 -74
- package/src/components/domain/desktop/WorkspaceMigrateConfirm/WorkspaceMigrateConfirm.stories.tsx +0 -79
- package/src/components/domain/desktop/WorkspaceMigrateConfirm/WorkspaceMigrateConfirmSource.test.mjs +0 -34
- package/src/components/domain/desktop/WorkspaceMigrateConfirm/index.tsx +0 -92
- package/src/components/domain/desktop/index.ts +0 -64
- package/src/components/domain/files/FileBrowser/FileBrowser.stories.tsx +0 -397
- package/src/components/domain/files/FileBrowser/FileBrowserSource.test.mjs +0 -75
- package/src/components/domain/files/FileBrowser/index.tsx +0 -221
- package/src/components/domain/files/FileIcon/FileIcon.stories.tsx +0 -207
- package/src/components/domain/files/FileIcon/FileIconSource.test.mjs +0 -39
- package/src/components/domain/files/FileIcon/index.tsx +0 -133
- package/src/components/domain/files/FilePreviewContentView/FilePreviewContentView.stories.tsx +0 -242
- package/src/components/domain/files/FilePreviewContentView/FilePreviewContentViewSource.test.mjs +0 -44
- package/src/components/domain/files/FilePreviewContentView/index.tsx +0 -125
- package/src/components/domain/files/FileTree/FileTree.stories.tsx +0 -204
- package/src/components/domain/files/FileTree/FileTreeSource.test.mjs +0 -18
- package/src/components/domain/files/FileTree/index.tsx +0 -106
- package/src/components/domain/files/PreviewDialog/PreviewDialog.stories.tsx +0 -178
- package/src/components/domain/files/PreviewDialog/PreviewDialogSource.test.mjs +0 -92
- package/src/components/domain/files/PreviewDialog/index.tsx +0 -294
- package/src/components/domain/files/index.ts +0 -5
- package/src/components/domain/index.ts +0 -8
- package/src/components/domain/office/CsvPreview/CsvPreview.stories.tsx +0 -264
- package/src/components/domain/office/CsvPreview/CsvPreviewSource.test.mjs +0 -77
- package/src/components/domain/office/CsvPreview/index.tsx +0 -224
- package/src/components/domain/office/OfficePreview/OfficePreview.stories.tsx +0 -265
- package/src/components/domain/office/OfficePreview/OfficePreviewDialog.stories.tsx +0 -71
- package/src/components/domain/office/OfficePreview/OfficePreviewDialog.tsx +0 -43
- package/src/components/domain/office/OfficePreview/OfficePreviewSource.test.mjs +0 -126
- package/src/components/domain/office/OfficePreview/index.tsx +0 -782
- package/src/components/domain/office/PdfPreview/PdfPreview.stories.tsx +0 -280
- package/src/components/domain/office/PdfPreview/PdfPreviewDialog.stories.tsx +0 -61
- package/src/components/domain/office/PdfPreview/PdfPreviewDialog.tsx +0 -61
- package/src/components/domain/office/PdfPreview/PdfPreviewSource.test.mjs +0 -70
- package/src/components/domain/office/PdfPreview/index.tsx +0 -217
- package/src/components/domain/office/index.ts +0 -5
- package/src/components/domain/skills/McpServerListView/McpServerListView.stories.tsx +0 -510
- package/src/components/domain/skills/McpServerListView/McpServerListViewSource.test.mjs +0 -101
- package/src/components/domain/skills/McpServerListView/index.tsx +0 -250
- package/src/components/domain/skills/SkillAvatarView/SkillAvatarView.stories.tsx +0 -121
- package/src/components/domain/skills/SkillAvatarView/SkillAvatarViewSource.test.mjs +0 -67
- package/src/components/domain/skills/SkillAvatarView/index.tsx +0 -112
- package/src/components/domain/skills/SkillCardView/SkillCardView.stories.tsx +0 -374
- package/src/components/domain/skills/SkillCardView/SkillCardViewSource.test.mjs +0 -35
- package/src/components/domain/skills/SkillCardView/index.tsx +0 -88
- package/src/components/domain/skills/SkillDetailPanelView/SkillDetailPanelView.stories.tsx +0 -113
- package/src/components/domain/skills/SkillDetailPanelView/index.tsx +0 -115
- package/src/components/domain/skills/SkillDetailView/SkillDetailView.stories.tsx +0 -274
- package/src/components/domain/skills/SkillDetailView/index.tsx +0 -121
- package/src/components/domain/skills/SkillImportDialogView/SkillImportDialogView.stories.tsx +0 -128
- package/src/components/domain/skills/SkillImportDialogView/SkillImportDialogViewSource.test.mjs +0 -11
- package/src/components/domain/skills/SkillImportDialogView/index.tsx +0 -147
- package/src/components/domain/skills/ToolDetailModalView/ToolDetailModalView.stories.tsx +0 -160
- package/src/components/domain/skills/ToolDetailModalView/ToolDetailModalViewSource.test.mjs +0 -99
- package/src/components/domain/skills/ToolDetailModalView/index.tsx +0 -160
- package/src/components/domain/skills/index.ts +0 -7
- package/src/components/domain/tasks/ScheduledTaskCardView/ScheduledTaskCardView.stories.tsx +0 -120
- package/src/components/domain/tasks/ScheduledTaskCardView/ScheduledTaskCardViewSource.test.mjs +0 -40
- package/src/components/domain/tasks/ScheduledTaskCardView/index.tsx +0 -135
- package/src/components/domain/tasks/ScheduledTaskDeleteDialog/ScheduledTaskDeleteDialog.stories.tsx +0 -56
- package/src/components/domain/tasks/ScheduledTaskDeleteDialog/ScheduledTaskDeleteDialogSource.test.mjs +0 -35
- package/src/components/domain/tasks/ScheduledTaskDeleteDialog/index.tsx +0 -73
- package/src/components/domain/tasks/ScheduledTaskDetailView/ScheduledTaskDetailView.stories.tsx +0 -121
- package/src/components/domain/tasks/ScheduledTaskDetailView/ScheduledTaskDetailViewSource.test.mjs +0 -115
- package/src/components/domain/tasks/ScheduledTaskDetailView/index.tsx +0 -223
- package/src/components/domain/tasks/ScheduledTasksSpaceView/ScheduledTasksSpaceView.stories.tsx +0 -526
- package/src/components/domain/tasks/ScheduledTasksSpaceView/ScheduledTasksSpaceViewSource.test.mjs +0 -85
- package/src/components/domain/tasks/ScheduledTasksSpaceView/index.tsx +0 -118
- package/src/components/domain/tasks/index.ts +0 -4
- package/src/components/domain/theme/SkinManager.stories.tsx +0 -43
- package/src/components/domain/theme/SkinManagerUI.tsx +0 -382
- package/src/components/domain/theme/ThemeDemo.stories.tsx +0 -12
- package/src/components/domain/theme/ThemeDemo.tsx +0 -224
- package/src/components/index.ts +0 -11
- package/src/components/primitives/Avatar/Avatar.stories.tsx +0 -170
- package/src/components/primitives/Avatar/AvatarSource.test.mjs +0 -37
- package/src/components/primitives/Avatar/index.tsx +0 -180
- package/src/components/primitives/BackTop/BackTop.stories.tsx +0 -122
- package/src/components/primitives/BackTop/BackTopSource.test.mjs +0 -61
- package/src/components/primitives/BackTop/index.tsx +0 -93
- package/src/components/primitives/Badge/Badge.stories.tsx +0 -376
- package/src/components/primitives/Badge/BadgeSource.test.mjs +0 -27
- package/src/components/primitives/Badge/index.tsx +0 -65
- package/src/components/primitives/Button/Button.stories.tsx +0 -287
- package/src/components/primitives/Button/ButtonSource.test.mjs +0 -84
- package/src/components/primitives/Button/index.tsx +0 -219
- package/src/components/primitives/Card/Card.stories.tsx +0 -186
- package/src/components/primitives/Card/CardSource.test.mjs +0 -73
- package/src/components/primitives/Card/index.tsx +0 -137
- package/src/components/primitives/Checkbox/Checkbox.stories.tsx +0 -79
- package/src/components/primitives/Checkbox/CheckboxSource.test.mjs +0 -43
- package/src/components/primitives/Checkbox/index.tsx +0 -87
- package/src/components/primitives/Chip/Chip.stories.tsx +0 -149
- package/src/components/primitives/Chip/ChipSource.test.mjs +0 -73
- package/src/components/primitives/Chip/index.tsx +0 -252
- package/src/components/primitives/Divider/Divider.stories.tsx +0 -68
- package/src/components/primitives/Divider/DividerSource.test.mjs +0 -26
- package/src/components/primitives/Divider/index.tsx +0 -65
- package/src/components/primitives/Dropdown/Dropdown.stories.tsx +0 -38
- package/src/components/primitives/Dropdown/DropdownSource.test.mjs +0 -23
- package/src/components/primitives/Dropdown/index.tsx +0 -29
- package/src/components/primitives/EmptyState/EmptyState.stories.tsx +0 -159
- package/src/components/primitives/EmptyState/EmptyStateSource.test.mjs +0 -169
- package/src/components/primitives/EmptyState/index.tsx +0 -185
- package/src/components/primitives/ErrorCard/ErrorCard.stories.tsx +0 -50
- package/src/components/primitives/ErrorCard/index.tsx +0 -78
- package/src/components/primitives/Field/Field.stories.tsx +0 -208
- package/src/components/primitives/Field/FieldSource.test.mjs +0 -70
- package/src/components/primitives/Field/index.tsx +0 -297
- package/src/components/primitives/InlineMessage/InlineMessage.stories.tsx +0 -137
- package/src/components/primitives/InlineMessage/InlineMessageSource.test.mjs +0 -50
- package/src/components/primitives/InlineMessage/index.tsx +0 -141
- package/src/components/primitives/Input/Input.stories.tsx +0 -30
- package/src/components/primitives/Input/index.tsx +0 -12
- package/src/components/primitives/Keycap/Keycap.stories.tsx +0 -93
- package/src/components/primitives/Keycap/KeycapSource.test.mjs +0 -30
- package/src/components/primitives/Keycap/index.tsx +0 -67
- package/src/components/primitives/Menu/Menu.stories.tsx +0 -416
- package/src/components/primitives/Menu/MenuEmptySource.test.mjs +0 -23
- package/src/components/primitives/Menu/MenuSource.test.mjs +0 -207
- package/src/components/primitives/Menu/index.tsx +0 -923
- package/src/components/primitives/Pagination/Pagination.stories.tsx +0 -77
- package/src/components/primitives/Pagination/PaginationSource.test.mjs +0 -24
- package/src/components/primitives/Pagination/index.tsx +0 -85
- package/src/components/primitives/Pagination/pagination.ts +0 -25
- package/src/components/primitives/Pagination/paginationModel.test.mjs +0 -18
- package/src/components/primitives/ProgressBar/ProgressBar.stories.tsx +0 -103
- package/src/components/primitives/ProgressBar/ProgressBarSource.test.mjs +0 -44
- package/src/components/primitives/ProgressBar/index.tsx +0 -68
- package/src/components/primitives/Radio/Radio.stories.tsx +0 -84
- package/src/components/primitives/Radio/RadioSource.test.mjs +0 -38
- package/src/components/primitives/Radio/index.tsx +0 -161
- package/src/components/primitives/SegmentedControl/SegmentedControl.stories.tsx +0 -110
- package/src/components/primitives/SegmentedControl/SegmentedControlSource.test.mjs +0 -75
- package/src/components/primitives/SegmentedControl/index.tsx +0 -188
- package/src/components/primitives/Select/Select.stories.tsx +0 -158
- package/src/components/primitives/Select/SelectSource.test.mjs +0 -94
- package/src/components/primitives/Select/index.tsx +0 -406
- package/src/components/primitives/Spinner/index.tsx +0 -58
- package/src/components/primitives/Switch/Switch.stories.tsx +0 -64
- package/src/components/primitives/Switch/SwitchSource.test.mjs +0 -38
- package/src/components/primitives/Switch/index.tsx +0 -84
- package/src/components/primitives/Tabs/Tabs.stories.tsx +0 -230
- package/src/components/primitives/Tabs/TabsSource.test.mjs +0 -91
- package/src/components/primitives/Tabs/index.tsx +0 -183
- package/src/components/primitives/index.ts +0 -24
- package/src/examples/ResourceManagementExample.tsx +0 -119
- package/src/examples/SiteWorkbenchExample.tsx +0 -96
- package/src/hooks/index.ts +0 -7
- package/src/hooks/useClickOutside.ts +0 -20
- package/src/hooks/useDragReorder.ts +0 -29
- package/src/hooks/useImeAwareEnter.ts +0 -59
- package/src/hooks/useImeAwareEnterSource.test.mjs +0 -65
- package/src/hooks/useKeyboard.ts +0 -16
- package/src/hooks/usePopover.ts +0 -67
- package/src/hooks/useSelectedOptionLocator.ts +0 -33
- package/src/hooks/useSidebarResize.ts +0 -107
- package/src/hooks/useTenantTheme.ts +0 -53
- package/src/hooks/useUnifiedTheme.ts +0 -85
- package/src/index.ts +0 -6
- package/src/lib/InjectedStyleTokenMirrorSource.test.mjs +0 -67
- package/src/lib/about-window.test.mjs +0 -46
- package/src/lib/about-window.ts +0 -218
- package/src/lib/appearance.test.mjs +0 -283
- package/src/lib/appearance.ts +0 -46
- package/src/lib/browser-annotation-popup.ts +0 -151
- package/src/lib/focusTrap.ts +0 -51
- package/src/lib/index.ts +0 -5
- package/src/lib/shortcut.test.mjs +0 -100
- package/src/lib/shortcut.ts +0 -97
- package/src/lib/twMergeOw.ts +0 -18
- package/src/lib/utils.ts +0 -6
- package/src/screens/Browser.stories.tsx +0 -353
- package/src/screens/Chat.stories.tsx +0 -808
- package/src/screens/Home.stories.tsx +0 -253
- package/src/screens/Login.stories.tsx +0 -134
- package/src/screens/McpManager.stories.tsx +0 -159
- package/src/screens/Onboarding.stories.tsx +0 -155
- package/src/screens/ScheduledTasks.stories.tsx +0 -134
- package/src/screens/ScreenFrameSource.test.mjs +0 -77
- package/src/screens/SettingsAppearance.stories.tsx +0 -117
- package/src/screens/SettingsMemory.stories.tsx +0 -128
- package/src/screens/SettingsModels.stories.tsx +0 -228
- package/src/screens/SettingsSections.stories.tsx +0 -164
- package/src/screens/Share.stories.tsx +0 -202
- package/src/screens/SharePage.stories.tsx +0 -29
- package/src/screens/Sites.stories.tsx +0 -183
- package/src/screens/Skills.stories.tsx +0 -83
- package/src/screens/Workspace.stories.tsx +0 -191
- package/src/screens/_home.tsx +0 -46
- package/src/screens/_screen.tsx +0 -355
- package/src/screens/_settingsNav.ts +0 -27
- package/src/screens/_skillsCatalog.tsx +0 -372
- package/src/theme/SkinDenylistSyncSource.test.mjs +0 -124
- package/src/theme/__tests__/skins.test.mjs +0 -84
- package/src/theme/core/semanticAdapter.ts +0 -116
- package/src/theme/core/skin.ts +0 -605
- package/src/theme/core/skinScoped.ts +0 -289
- package/src/theme/core/tenantTheme.test.mjs +0 -127
- package/src/theme/core/tenantTheme.ts +0 -124
- package/src/theme/core/types.ts +0 -60
- package/src/theme/core/unifiedTheme.ts +0 -157
- package/src/theme/index.ts +0 -33
- package/src/theme/providers/BrandingProvider.tsx +0 -57
- package/src/theme/providers/ThemeProvider.tsx +0 -221
- package/src/theme/skinDs2PropertyGate.test.mjs +0 -109
- package/src/theme/skins/index.ts +0 -107
- package/src/theme/utils/cssSafety.ts +0 -92
- package/src/theme/utils/skinManager.ts +0 -159
- package/src/theme/utils/themeApplier.ts +0 -75
- package/src/tokens/DesktopSurfacesSweep15Source.test.mjs +0 -77
- package/src/tokens/SharedStyleSheetsSource.test.mjs +0 -90
- package/src/tokens/TailwindThemeSupplySource.test.mjs +0 -129
- package/src/tokens/base.ts +0 -199
- package/src/tokens/dark.ts +0 -288
- package/src/tokens/index.ts +0 -4
- package/src/tokens/light.ts +0 -320
- package/src/tokens/tailwind.ts +0 -216
- package/src/types/desktop-pet.ts +0 -100
- package/src/types/file-browser.ts +0 -51
- package/src/types/file-tree.ts +0 -34
- package/src/types/index.ts +0 -3
- package/src/types/xspreadsheet.d.ts +0 -4
- package/src/utils/cn.ts +0 -6
- package/src/utils/glyphColor.ts +0 -32
- package/src/utils/index.ts +0 -4
- package/src/utils/localPathInline.test.mjs +0 -45
- package/src/utils/localPathInline.ts +0 -49
- package/src/utils/markdownFileRefs.test.mjs +0 -88
- package/src/utils/markdownFileRefs.ts +0 -140
- package/src/utils/office-excel.ts +0 -452
- package/src/utils/shiki.ts +0 -156
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/Users/wowzin/projects/orbit/packages/ui/dist/chunk-JC7BHKS4.cjs","../src/tokens/base.ts","../src/theme/core/fontScale.ts","../src/theme/utils/cssSafety.ts","../src/theme/core/skin.ts"],"names":[],"mappings":"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","file":"/Users/wowzin/projects/orbit/packages/ui/dist/chunk-JC7BHKS4.cjs","sourcesContent":[null,"/**\n * Orbitwork Design System — Primitive tokens.\n *\n * Theme-invariant foundation scales consumed by the CSS generator. Component\n * and layout measurements live in metrics.ts; theme semantics live in the\n * light/dark modules.\n */\n\nexport const primitive = {\n // Core brand colors\n navy: \"#0F1B3D\",\n yellow: \"#FFD23E\",\n yellowDeep: \"#D8A300\",\n white: \"#F7F6F1\",\n graphite: \"#16171B\",\n graphiteRaised: \"#1E2025\",\n graphiteBorder: \"#2A2C33\",\n\n // Theme-invariant brand lockup palette.\n brand: {\n dividerLight: \"#D8D5CC\",\n dividerDark: \"var(--ow-gray-70)\",\n cnLight: \"#3A3E46\",\n cnDark: \"#C9CBD1\",\n },\n\n // Grayscale 00-90: warm white to navy\n gray: {\n \"00\": \"#F7F6F1\",\n \"05\": \"#ECEBE5\",\n \"10\": \"#DCDCD7\",\n \"20\": \"#C2C3C1\",\n \"30\": \"#A2A5A9\",\n \"40\": \"#82878F\",\n \"50\": \"#646B7A\",\n \"60\": \"#4A5164\",\n \"70\": \"#333B50\",\n \"80\": \"#202942\",\n \"90\": \"#0F1B3D\",\n },\n\n // Spacing — Orbitwork DS standard scale\n space: {\n \"05\": \"2px\",\n \"1\": \"4px\",\n \"15\": \"6px\",\n \"2\": \"8px\",\n \"3\": \"12px\",\n \"4\": \"16px\",\n \"5\": \"20px\",\n \"6\": \"24px\",\n \"8\": \"32px\",\n \"10\": \"40px\",\n \"12\": \"48px\",\n \"16\": \"64px\",\n \"24\": \"96px\",\n },\n\n // Radius\n radius: {\n \"2xs\": \"4px\",\n xs: \"6px\",\n sm: \"8px\",\n md: \"10px\",\n lg: \"12px\",\n xl: \"16px\",\n pill: \"999px\",\n },\n\n // Typography — fonts\n fontDisplay: \"'Space Grotesk', 'HarmonyOS Sans SC', 'Noto Sans SC', sans-serif\",\n fontSans:\n \"'HarmonyOS Sans SC', 'Noto Sans SC', 'PingFang SC', 'Microsoft YaHei', sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Noto Color Emoji'\",\n fontMono:\n \"'IBM Plex Mono', ui-monospace, 'SF Mono', monospace, 'Apple Color Emoji', 'Segoe UI Emoji', 'Noto Color Emoji'\",\n\n // Type scale\n fsDisplay: \"46px\",\n fsHeadline: \"32px\",\n fsTitle: \"22px\",\n fsSubtitle: \"16px\",\n fsBody: \"14px\",\n fsCaption: \"12px\",\n fsEyebrow: \"11px\",\n fsUi: \"13px\",\n fsCode: \"13px\",\n fsEyebrowCjk: \"12px\",\n // Extended type scale\n fsHeadlineLg: \"34px\",\n fsHeadlineMd: \"27px\",\n fsHeadlineSm: \"22px\",\n fsTitleLg: \"19px\",\n fsTitleMd: \"16px\",\n fsTitleSm: \"14px\",\n fsBodyLg: \"16px\",\n fsBodyMd: \"14px\",\n fsBodySm: \"12px\",\n fsMarkMd: \"11px\",\n fsMarkSm: \"10px\",\n\n // Line heights\n lhHeadline: \"1.15\",\n lhTitle: \"1.3\",\n lhBody: \"1.75\",\n lhUi: \"1.5\",\n lhCode: \"1.7\",\n\n // Letter spacing\n lsTitle: \"0.01em\",\n lsEyebrow: \"0.14em\",\n lsEyebrowCjk: \"0.08em\",\n\n // Motion\n easeBeacon: \"cubic-bezier(0.22, 1, 0.36, 1)\",\n dur1: \"120ms\",\n dur2: \"200ms\",\n dur3: \"320ms\",\n durSpin: \"1.6s\",\n durSpinFast: \"0.9s\",\n durSplash: \"1250ms\",\n staggerBeacon: \"125ms\",\n\n // Font weight\n fontWeightNormal: \"400\",\n fontWeightMedium: \"500\",\n fontWeightSemibold: \"600\",\n fontWeightBold: \"700\",\n\n // Border width\n borderWidthThin: \"0.5px\",\n borderWidthDefault: \"1px\",\n borderWidthThick: \"2px\",\n\n // Opacity levels\n opacityMuted: \"0.6\",\n opacityHover: \"0.8\",\n} as const\n","import { primitive } from \"../../tokens/base.ts\"\n\n/** Supported text sizes, independent of the light/dark palette. */\nexport const ORBITWORK_FONT_SCALES = [0.9, 1, 1.1, 1.2] as const\nexport type OrbitworkFontScale = (typeof ORBITWORK_FONT_SCALES)[number]\n\nexport function isOrbitworkFontScale(value: unknown): value is OrbitworkFontScale {\n return typeof value === \"number\" && ORBITWORK_FONT_SCALES.some((scale) => scale === value)\n}\n\n/** Personal device preference wins over a skin preset; old settings resolve to 100%. */\nexport function resolveOrbitworkFontScale(preference: unknown, skinScale?: unknown): OrbitworkFontScale {\n return isOrbitworkFontScale(preference) ? preference : isOrbitworkFontScale(skinScale) ? skinScale : 1\n}\n\n/** Reuse the maintained DS2 scale. Never compound a previously applied size. */\nexport function fontScaleTokens(scale: OrbitworkFontScale): Record<string, string> {\n if (!isOrbitworkFontScale(scale) || scale === 1) return {}\n return Object.fromEntries(\n Object.entries(primitive)\n .filter(([key]) => /^fs[A-Z]/.test(key))\n .map(([key, value]) => [\n `--ow-${key.replace(/[A-Z]/g, (letter) => `-${letter.toLowerCase()}`)}`,\n `${Math.round(Number.parseFloat(String(value)) * scale * 100) / 100}px`,\n ]),\n )\n}\n","/** Security verdict for precision CSS before it reaches the runtime stylesheet. */\nexport interface CSSSafetyReport {\n ok: boolean\n blockedImports: number\n blockedUrls: number\n blockedScripts: number\n warnings: string[]\n}\n\n/**\n * Precision CSS is declarative styling only. Assets use dedicated validated\n * skin fields, so every import, URL and executable CSS form is rejected here.\n */\nexport function analyzeSkinCSS(css: string): CSSSafetyReport {\n const blockedImports = css.match(/@import\\b/gi)?.length ?? 0\n const blockedUrls = css.match(/url\\s*\\(/gi)?.length ?? 0\n const blockedScripts = (css.match(/javascript\\s*:/gi)?.length ?? 0) + (css.match(/expression\\s*\\(/gi)?.length ?? 0)\n const warnings: string[] = []\n\n if (blockedImports > 0) warnings.push(`检测到 ${blockedImports} 个 @import 规则`)\n if (blockedUrls > 0) warnings.push(`检测到 ${blockedUrls} 个 url() 引用`)\n if (blockedScripts > 0) warnings.push(`检测到 ${blockedScripts} 个可执行 CSS 表达式`)\n\n return {\n ok: warnings.length === 0,\n blockedImports,\n blockedUrls,\n blockedScripts,\n warnings,\n }\n}\n","/**\n * Orbitwork skin protocol — aligned with Design project architecture.\n * A skin is a validated JSON document that overrides --ow-* CSS variables\n * at runtime. This module is framework-agnostic.\n */\n\nimport { analyzeSkinCSS } from \"../utils/cssSafety.ts\"\nimport { type OrbitworkFontScale, isOrbitworkFontScale } from \"./fontScale.ts\"\n\nexport type Theme = \"light\" | \"dark\" | \"system\"\nexport type ResolvedTheme = \"light\" | \"dark\"\n\n/**\n * DS2 皮肤白名单(COMPONENT-RULES §15 · 2026-08-31 裁决):\n * - 可覆盖:中性表面/边框/文字梯度、chat/composer/sidebar 背景类、\n * btn-primary 族(唯一开放的租户品牌色位)。\n * - 已移除(禁覆盖):primary 族(--ow-primary 暗档=荧黄行动极)、link、\n * switchActive(--ow-control-on 无彩选中)、功能色四族、cardRadius/buttonRadius\n * (圆角是品牌定稿)。\n */\nexport type OrbitworkSkinTokens = {\n backgroundPrimary?: string\n backgroundSecondary?: string\n backgroundTertiary?: string\n foregroundPrimary?: string\n foregroundSecondary?: string\n foregroundMuted?: string\n borderSubtle?: string\n borderStrong?: string\n buttonPrimaryBackground?: string\n buttonPrimaryForeground?: string\n chatBackground?: string\n chatBackgroundImage?: string\n /** 0–1 decimal string; kept under the legacy chatBackground namespace for skin.json compatibility. */\n chatBackgroundImageOpacity?: string\n chatBackgroundOverlay?: string\n chatBackgroundMaskColor?: string\n chatBackgroundPosition?:\n | \"center\"\n | \"top\"\n | \"bottom\"\n | \"left\"\n | \"right\"\n | \"top left\"\n | \"top right\"\n | \"bottom left\"\n | \"bottom right\"\n chatBackgroundSize?: \"cover\" | \"contain\" | \"auto\"\n userBubbleBackground?: string\n userBubbleForeground?: string\n userBubbleBorder?: string\n composerBackground?: string\n composerBorder?: string\n sidebarBackground?: string\n sidebarSelectedBackground?: string\n}\n\n/** Maintenance record for each public-part precision selector. */\nexport type OrbitworkSkinRegistryEntry = {\n target: string\n reason: string\n}\n\nexport type OrbitworkSkin = {\n version: 1\n id: string\n name: string\n description?: string\n /** Uniform text size preset, shared by both color modes. */\n fontScale?: OrbitworkFontScale\n modes: {\n light?: OrbitworkSkinTokens\n dark?: OrbitworkSkinTokens\n }\n contributes?: {\n /** Registered CSS targeting component roots and their public parts. */\n publicPartStyles?: string\n /** Every public-part selector must have a matching maintenance record. */\n registry?: OrbitworkSkinRegistryEntry[]\n }\n}\n\nexport type SkinValidationResult = { ok: true; skin: OrbitworkSkin } | { ok: false; error: string }\n\nconst COLOR_KEYS = [\n \"backgroundPrimary\",\n \"backgroundSecondary\",\n \"backgroundTertiary\",\n \"foregroundPrimary\",\n \"foregroundSecondary\",\n \"foregroundMuted\",\n \"borderSubtle\",\n \"borderStrong\",\n \"buttonPrimaryBackground\",\n \"buttonPrimaryForeground\",\n \"chatBackground\",\n \"chatBackgroundOverlay\",\n \"userBubbleBackground\",\n \"userBubbleForeground\",\n \"userBubbleBorder\",\n \"composerBackground\",\n \"composerBorder\",\n \"sidebarBackground\",\n \"sidebarSelectedBackground\",\n] as const\nconst IMAGE_KEYS = [\"chatBackgroundImage\"] as const\nconst OPACITY_KEYS = [\"chatBackgroundImageOpacity\"] as const\nconst MASK_COLOR_KEYS = [\"chatBackgroundMaskColor\"] as const\nconst POSITION_KEYS = [\"chatBackgroundPosition\"] as const\nconst SIZE_KEYS = [\"chatBackgroundSize\"] as const\nconst TOKEN_KEYS = [\n ...COLOR_KEYS,\n ...MASK_COLOR_KEYS,\n ...IMAGE_KEYS,\n ...OPACITY_KEYS,\n ...POSITION_KEYS,\n ...SIZE_KEYS,\n] as const\nconst ROOT_KEYS = new Set([\"version\", \"id\", \"name\", \"description\", \"fontScale\", \"modes\", \"contributes\"])\nconst MODE_KEYS = new Set([\"light\", \"dark\"])\nconst TOKEN_KEY_SET = new Set<string>(TOKEN_KEYS)\nconst CONTRIBUTES_KEYS = new Set([\"publicPartStyles\", \"registry\"])\nconst REGISTRY_ENTRY_KEYS = new Set([\"target\", \"reason\"])\nexport const HEX_COLOR = /^#(?:[0-9a-f]{3,4}|[0-9a-f]{6}|[0-9a-f]{8})$/i\nconst MASK_HEX_COLOR = /^#[0-9a-f]{6}(?:[0-9a-f]{2})?$/i\nconst DATA_IMAGE = /^data:image\\/(png|jpeg|webp);base64,([A-Za-z0-9+/]+={0,2})$/\nconst BACKGROUND_POSITIONS = new Set([\n \"center\",\n \"top\",\n \"bottom\",\n \"left\",\n \"right\",\n \"top left\",\n \"top right\",\n \"bottom left\",\n \"bottom right\",\n])\nconst BACKGROUND_SIZES = new Set([\"cover\", \"contain\", \"auto\"])\nexport const MAX_ORBITWORK_SKIN_IMAGE_BYTES = 5 * 1024 * 1024\nconst CHAT_BACKGROUND_MASK_DERIVED_PROPERTIES = [\n \"--ow-chat-bg-mask-start-opacity\",\n \"--ow-chat-bg-mask-end-opacity\",\n] as const\n\nexport type OrbitworkSkinChatBackgroundMask = {\n color: string\n strength: number\n startOpacity: number\n endOpacity: number\n}\n\n/** Six-digit colors retain the original 80% → 50% mask; explicit alpha controls final strength. */\nexport function resolveOrbitworkSkinChatBackgroundMask(value: string): OrbitworkSkinChatBackgroundMask {\n const normalized = MASK_HEX_COLOR.test(value) ? value.toLowerCase() : \"#000000\"\n const strength = normalized.length === 9 ? Math.round((Number.parseInt(normalized.slice(7), 16) / 255) * 100) : 80\n const startOpacity = strength\n const endOpacity = strength <= 80 ? strength * 0.625 : 50 + (strength - 80) * 2.5\n return { color: normalized.slice(0, 7), strength, startOpacity, endOpacity }\n}\n\nexport function orbitworkSkinChatBackgroundMaskColor(color: string, strength: number): string {\n const normalizedColor = /^#[0-9a-f]{6}$/i.test(color) ? color.toLowerCase() : \"#000000\"\n const alpha = Math.round((Math.min(100, Math.max(0, strength)) / 100) * 255)\n return `${normalizedColor}${alpha.toString(16).padStart(2, \"0\")}`\n}\n\nexport const ORBITWORK_SKIN_CSS_VARIABLES: Readonly<Record<keyof OrbitworkSkinTokens, string>> = {\n backgroundPrimary: \"--ow-bg\",\n backgroundSecondary: \"--ow-surface\",\n backgroundTertiary: \"--ow-surface-2\",\n foregroundPrimary: \"--ow-text\",\n foregroundSecondary: \"--ow-text-2\",\n foregroundMuted: \"--ow-text-3\",\n borderSubtle: \"--ow-border\",\n borderStrong: \"--ow-border-strong\",\n buttonPrimaryBackground: \"--ow-btn-primary-bg\",\n buttonPrimaryForeground: \"--ow-btn-primary-fg\",\n chatBackground: \"--ow-chat-bg\",\n chatBackgroundImage: \"--ow-chat-bg-image\",\n chatBackgroundImageOpacity: \"--ow-chat-bg-image-opacity\",\n chatBackgroundOverlay: \"--ow-chat-bg-overlay\",\n chatBackgroundMaskColor: \"--ow-chat-bg-mask-color\",\n chatBackgroundPosition: \"--ow-chat-bg-position\",\n chatBackgroundSize: \"--ow-chat-bg-size\",\n // 三件用户气泡钩子由 domain/chat/UserTurn 消费;未覆盖时兜底 DS2 井色配方\n // (bg=--ow-bubble-user / fg=--ow-text / border=--ow-border),不再兜底透明。\n userBubbleBackground: \"--ow-chat-user-bubble-bg\",\n userBubbleForeground: \"--ow-chat-user-bubble-fg\",\n userBubbleBorder: \"--ow-chat-user-bubble-border\",\n composerBackground: \"--ow-composer-bg\",\n composerBorder: \"--ow-composer-border\",\n sidebarBackground: \"--ow-sidebar-bg\",\n sidebarSelectedBackground: \"--ow-sidebar-selected-bg\",\n}\n\n/**\n * DS2 皮肤禁覆盖清单(COMPONENT-RULES §15 · 2026-08-31 裁决)。\n * 条目以 `*` 结尾表示前缀匹配;其余为精确名(含其 `-` 后缀派生,如\n * `--ow-control-on` 同时覆盖 `--ow-control-on-glyph`)。\n *\n * 官方 skin skill 直接调用本模块导出的 parseOrbitworkSkin,不复制这份清单。\n */\nexport const DS2_SKIN_DENYLIST = [\n // 三极 token\n \"--ow-beacon\",\n \"--ow-beacon-idle\",\n \"--ow-accent-dot\",\n \"--ow-data-today\",\n // 行动极族(租户品牌色只经 btn-primary 族开放,--ow-primary 落点不可写)\n \"--ow-primary*\",\n // 无彩选中原则\n \"--ow-control-on\",\n // focus-ring\n \"--ow-focus-ring\",\n // 功能色四族全档\n \"--ow-info*\",\n \"--ow-success*\",\n \"--ow-warning*\",\n \"--ow-error*\",\n // 功能色别名:--ow-mention-bg/-text 直挂 --ow-info-tint/-on-tint,\n // Aliases are denied too, so precision CSS cannot bypass functional colors.\n \"--ow-mention*\",\n // 恒定域\n \"--ow-paper\",\n \"--ow-stage-*\",\n \"--ow-term-*\",\n \"--ow-ansi-*\",\n // 圆角(形状表是品牌定稿)\n \"--ow-radius-*\",\n] as const\n\n/**\n * DS2 皮肤禁覆盖 **CSS 属性** 清单(COMPONENT-RULES §5/§7/§9 · W5 终扫补闸)。\n *\n * `DS2_SKIN_DENYLIST` only sees token names. Precision CSS can also write\n * `box-shadow: 0 0 20px …`, `border-radius: 18px`,\n * `transform: translateY(-2px)`、`animation: neon-pulse 2s infinite` 完全绕开它——\n * 而这四类恰恰是 2.0 明令收口的三层:贴地零影(§5)、形状表定稿(§7)、\n * 唯一动效语汇=信标(§9)。故对属性维度另立一闸:命中即整块剥除。\n *\n * 条目为属性名前缀(连字符边界):`border-radius` 同时覆盖\n * `border-top-left-radius` 等长写;`transition` 覆盖 `transition-property` 等。\n *\n * 官方 skin skill 直接调用本模块导出的 parseOrbitworkSkin,不复制这份清单。\n */\nexport const DS2_SKIN_DENIED_PROPERTIES = [\n \"border-radius\",\n \"border-top-left-radius\",\n \"border-top-right-radius\",\n \"border-bottom-left-radius\",\n \"border-bottom-right-radius\",\n \"box-shadow\",\n \"transform\",\n \"animation\",\n \"transition\",\n \"backdrop-filter\",\n \"-webkit-backdrop-filter\",\n] as const\n\n/**\n * 判断某个 CSS 属性名是否命中属性维度禁覆盖清单。\n * 只按连字符边界做前缀匹配,避免 `animation` 误伤自定义属性 `--animation-x`\n * (自定义属性由 token 维度那一闸单独管)。\n */\nexport function isDs2SkinDeniedProperty(propertyName: string): boolean {\n const name = propertyName.trim().toLowerCase()\n if (name.startsWith(\"--\")) return false\n return DS2_SKIN_DENIED_PROPERTIES.some((entry) => name === entry || name.startsWith(`${entry}-`))\n}\n\n/**\n * 在一段 CSS 文本里找出第一处命中属性维度禁覆盖清单的声明。\n * 只在「声明位置」匹配(块首/`;`/`{` 之后的标识符 + `:`),选择器与值里的同名词不算。\n */\nexport function findDs2DeniedCssProperty(css: string): string | null {\n const declaration = /(?:^|[{;])\\s*(-{0,2}[a-z][a-z0-9-]*)\\s*:/gi\n let match: RegExpExecArray | null = declaration.exec(css)\n while (match) {\n const property = match[1] ?? \"\"\n if (isDs2SkinDeniedProperty(property)) return property.toLowerCase()\n match = declaration.exec(css)\n }\n return null\n}\n\n/**\n * 值维度禁覆盖(DS2 判据 7「品牌外渐变一律清除」)。\n *\n * 校验脚本不得复制该规则,统一委托 parseOrbitworkSkin。\n *\n * 为什么不是往 DS2_SKIN_DENIED_PROPERTIES 里加 `background`:皮肤本来就该能改底色,\n * 按属性名封会把整类合法覆盖一起封掉。要拦的是**值的形态**——任何 *-gradient()。\n * R2 之前这一层完全没有:glass.ts 的 `body { background: linear-gradient(135deg,\n * rgba(59,130,246,.1), rgba(139,92,246,.1)) }`(V1 蓝紫)是整份皮肤里唯二穿过闸口的\n * 块之一;cyberpunk.ts 的 `userBubbleBackground: \"linear-gradient(135deg,#E91E63,#9C27B0)\"`\n * 更是走 mode token 直接落到用户气泡上——两条路都得拦。\n */\nexport const DS2_SKIN_DENIED_VALUE_PATTERNS = [\"-gradient(\"] as const\n\n/** 判断某个 CSS 值是否命中值维度禁覆盖(渐变)。 */\nexport function isDs2SkinDeniedValue(value: string): boolean {\n const v = value.toLowerCase()\n return DS2_SKIN_DENIED_VALUE_PATTERNS.some((entry) => v.includes(entry))\n}\n\n/**\n * 在一段 CSS 文本里找出第一处命中值维度禁覆盖的声明值。\n * 只看声明的**值**侧,选择器与注释里的同名词不算(调用方已剥注释)。\n */\nexport function findDs2DeniedCssValue(css: string): string | null {\n const declaration = /(?:^|[{;])\\s*-{0,2}[a-z][a-z0-9-]*\\s*:([^;{}]*)/gi\n let match: RegExpExecArray | null = declaration.exec(css)\n while (match) {\n const value = match[1] ?? \"\"\n if (isDs2SkinDeniedValue(value)) {\n const hit = /[a-z-]*-gradient\\(/i.exec(value)\n return hit ? hit[0].slice(0, -1) : \"gradient\"\n }\n match = declaration.exec(css)\n }\n return null\n}\n\n/** Brand-locked component roots that precision styles cannot target. */\nexport const DS2_LOCKED_SLOT_SELECTORS = [\"beacon-spinner\", \"orbitwork-mark\", \"orbitwork-lockup\"] as const\n\nexport const MAX_ORBITWORK_SKIN_CSS_BYTES = 256 * 1024\n\n/**\n * Exact precision-style surface maintained by Orbitwork UI.\n * A data-slot/data-ow-part attribute is not skin-public unless it appears here.\n * Each target also owns its allowed visual properties so skins cannot turn a\n * stable selector into an undocumented layout or behavior override.\n */\nexport const ORBITWORK_SKIN_PUBLIC_PARTS = Object.freeze({\n '[data-slot=\"artifact-preview-card\"] [data-ow-part=\"meta\"]': Object.freeze([\"color\", \"font-weight\"]),\n} as const)\n\n/** One shared DS2 verdict for both import-time rejection and apply-time defence. */\nexport function findDs2SkinCssViolation(css: string): string | null {\n for (const slot of DS2_LOCKED_SLOT_SELECTORS) {\n if (css.includes(slot)) return `锁定件选择器 \"${slot}\"`\n }\n const tokenNames = css.match(/--ow-[a-z0-9-]+/gi) ?? []\n for (const tokenName of tokenNames) {\n if (isDs2SkinDeniedToken(tokenName)) return `禁覆盖 token ${tokenName}`\n }\n const property = findDs2DeniedCssProperty(css)\n if (property) return `禁覆盖 CSS 属性 ${property}`\n const gradient = findDs2DeniedCssValue(css)\n if (gradient) return `禁覆盖值形态 ${gradient}()`\n return null\n}\n\n/** 判断某个 CSS 自定义属性名是否命中 DS2 禁覆盖清单。 */\nexport function isDs2SkinDeniedToken(tokenName: string): boolean {\n const name = tokenName.trim()\n return DS2_SKIN_DENYLIST.some((entry) =>\n entry.endsWith(\"*\") ? name.startsWith(entry.slice(0, -1)) : name === entry || name.startsWith(`${entry}-`),\n )\n}\n\n/** WCAG 2.x 相对亮度 → 对比度实算(输入为 3/4/6/8 位 hex;alpha 忽略,按不透明计算)。 */\nexport function ds2ContrastRatio(hexA: string, hexB: string): number {\n const la = relativeLuminance(hexA)\n const lb = relativeLuminance(hexB)\n const lighter = Math.max(la, lb)\n const darker = Math.min(la, lb)\n return (lighter + 0.05) / (darker + 0.05)\n}\n\nfunction relativeLuminance(hex: string): number {\n const [r, g, b] = hexToRgb(hex)\n const toLinear = (channel: number) => {\n const c = channel / 255\n return c <= 0.04045 ? c / 12.92 : ((c + 0.055) / 1.055) ** 2.4\n }\n return 0.2126 * toLinear(r) + 0.7152 * toLinear(g) + 0.0722 * toLinear(b)\n}\n\nfunction hexToRgb(hex: string): [number, number, number] {\n let value = hex.replace(/^#/, \"\")\n if (value.length === 3 || value.length === 4) {\n value = value\n .slice(0, 3)\n .split(\"\")\n .map((c) => c + c)\n .join(\"\")\n }\n return [\n Number.parseInt(value.slice(0, 2), 16),\n Number.parseInt(value.slice(2, 4), 16),\n Number.parseInt(value.slice(4, 6), 16),\n ]\n}\n\n/** 中性梯度整组闸:命中任一触发键即要求整组提交并过对比度实算。 */\nconst NEUTRAL_TRIGGER_KEYS = [\n \"backgroundPrimary\",\n \"backgroundSecondary\",\n \"backgroundTertiary\",\n \"foregroundPrimary\",\n \"foregroundSecondary\",\n \"foregroundMuted\",\n] as const\nconst NEUTRAL_REQUIRED_KEYS = [\n \"backgroundPrimary\",\n \"backgroundSecondary\",\n \"backgroundTertiary\",\n \"foregroundPrimary\",\n \"foregroundSecondary\",\n \"foregroundMuted\",\n \"borderSubtle\",\n \"borderStrong\",\n] as const\nconst NEUTRAL_CONTRAST_PAIRS: ReadonlyArray<readonly [keyof OrbitworkSkinTokens, keyof OrbitworkSkinTokens]> = [\n [\"foregroundPrimary\", \"backgroundPrimary\"],\n [\"foregroundPrimary\", \"backgroundSecondary\"],\n [\"foregroundPrimary\", \"backgroundTertiary\"],\n [\"foregroundSecondary\", \"backgroundPrimary\"],\n [\"foregroundSecondary\", \"backgroundSecondary\"],\n [\"foregroundSecondary\", \"backgroundTertiary\"],\n [\"foregroundMuted\", \"backgroundPrimary\"],\n [\"foregroundMuted\", \"backgroundSecondary\"],\n [\"foregroundMuted\", \"backgroundTertiary\"],\n]\nconst MIN_NEUTRAL_CONTRAST = 4.5\n\n/** 闸 (a):覆盖项落点命中禁覆盖清单即拒绝(白名单收敛后属兜底防线)。 */\nfunction assertTokensNotDenied(tokens: OrbitworkSkinTokens, path: string): void {\n for (const [key, value] of Object.entries(tokens)) {\n const cssVar = ORBITWORK_SKIN_CSS_VARIABLES[key as keyof OrbitworkSkinTokens]\n if (cssVar && isDs2SkinDeniedToken(cssVar)) {\n throw new Error(`${path}.${key} 的落点 ${cssVar} 命中 DS2 禁覆盖清单,拒绝该皮肤`)\n }\n // 值维度:token 值本身是渐变时,属性闸与 token 闸都拦不住(落点名合法、属性名合法),\n // 直接落到气泡/侧栏底上——判据 7「品牌外渐变一律清除」在这里收口。\n // chatBackgroundImage 例外:它本来就是一张图/图案的落点,由 orbitwork-skin-image 单独校验。\n if (key !== \"chatBackgroundImage\" && typeof value === \"string\" && isDs2SkinDeniedValue(value)) {\n throw new Error(`${path}.${key} 的值是渐变(${value}),DS2 判据 7 品牌外渐变一律清除,拒绝该皮肤`)\n }\n }\n}\n\n/** 闸 (b):中性梯度整组提交 + WCAG 对比度实算(text-on-bg / text-on-surface ≥ 4.5:1)。 */\nfunction assertNeutralGroupContrast(tokens: OrbitworkSkinTokens, path: string): void {\n const touched = NEUTRAL_TRIGGER_KEYS.some((key) => tokens[key] !== undefined)\n if (!touched) return\n const missing = NEUTRAL_REQUIRED_KEYS.filter((key) => tokens[key] === undefined)\n if (missing.length > 0) {\n throw new Error(`${path} 中性梯度须整组提交(text 系与 bg/surface 系同批),缺少:${missing.join(\"、\")}`)\n }\n for (const [textKey, bgKey] of NEUTRAL_CONTRAST_PAIRS) {\n const text = tokens[textKey]\n const bg = tokens[bgKey]\n if (!text || !bg) continue\n const ratio = ds2ContrastRatio(text, bg)\n if (ratio < MIN_NEUTRAL_CONTRAST) {\n throw new Error(\n `${path} 对比度不达标:${textKey}(${text}) 在 ${bgKey}(${bg}) 上为 ${ratio.toFixed(2)}:1,要求 ≥ ${MIN_NEUTRAL_CONTRAST}:1`,\n )\n }\n }\n}\n\n/** Runtime btn-primary is open, but yellow-adjacent values would impersonate the locked beacon pole. */\nexport function isNeonYellowAdjacent(value: string): boolean {\n if (!HEX_COLOR.test(value)) return false\n const [r, g, b] = hexToRgb(value)\n const max = Math.max(r, g, b) / 255\n const min = Math.min(r, g, b) / 255\n const delta = max - min\n if (delta === 0) return false\n const red = r / 255\n const green = g / 255\n const blue = b / 255\n let hue =\n max === red ? ((green - blue) / delta) % 6 : max === green ? (blue - red) / delta + 2 : (red - green) / delta + 4\n hue = (hue * 60 + 360) % 360\n const lightness = (max + min) / 2\n const saturation = delta / (1 - Math.abs(2 * lightness - 1))\n return hue >= 40 && hue <= 75 && saturation >= 0.5 && lightness >= 0.35\n}\n\nfunction assertButtonPrimary(tokens: OrbitworkSkinTokens, path: string): void {\n const background = tokens.buttonPrimaryBackground\n const foreground = tokens.buttonPrimaryForeground\n if (!background && !foreground) return\n if (!background || !foreground) throw new Error(`${path} btn-primary 须同时提交 background 与 foreground`)\n if (isNeonYellowAdjacent(background)) throw new Error(`${path}.buttonPrimaryBackground 不得使用荧黄邻近色`)\n const ratio = ds2ContrastRatio(background, foreground)\n if (ratio < 4.5) throw new Error(`${path} btn-primary 对比度为 ${ratio.toFixed(2)}:1,要求 ≥ 4.5:1`)\n}\n\nexport function hasOrbitworkSkinChatBackground(skin: OrbitworkSkin | null | undefined, mode: ResolvedTheme): boolean {\n return Boolean(skin?.modes?.[mode]?.chatBackgroundImage)\n}\n\nexport function parseOrbitworkSkin(input: unknown): SkinValidationResult {\n try {\n if (!isRecord(input)) throw new Error(\"主题必须是 JSON 对象\")\n assertKnownKeys(input, ROOT_KEYS, \"主题\")\n if (input.version !== 1) throw new Error(\"仅支持 version: 1\")\n if (typeof input.id !== \"string\" || !/^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(input.id) || input.id.length > 64)\n throw new Error(\"id 必须是最多 64 字符的小写短横线标识\")\n if (typeof input.name !== \"string\" || !input.name.trim() || input.name.length > 48)\n throw new Error(\"name 必须是 1–48 个字符\")\n if (input.description !== undefined && (typeof input.description !== \"string\" || input.description.length > 160))\n throw new Error(\"description 最多 160 个字符\")\n if (input.fontScale !== undefined && !isOrbitworkFontScale(input.fontScale))\n throw new Error(\"fontScale 必须是 0.9、1、1.1 或 1.2\")\n if (!isRecord(input.modes)) throw new Error(\"modes 必须是对象\")\n assertKnownKeys(input.modes, MODE_KEYS, \"modes\")\n const light =\n input.modes.light === undefined ? undefined : parseTokens(input.modes.light, TOKEN_KEY_SET, \"modes.light\")\n const dark = input.modes.dark === undefined ? undefined : parseTokens(input.modes.dark, TOKEN_KEY_SET, \"modes.dark\")\n if (!light && !dark) throw new Error(\"modes 至少需要 light 或 dark\")\n\n // DS2 两道闸:禁覆盖清单拦截 + 中性梯度整组对比度实算\n if (light) {\n assertTokensNotDenied(light, \"modes.light\")\n assertNeutralGroupContrast(light, \"modes.light\")\n assertButtonPrimary(light, \"modes.light\")\n }\n if (dark) {\n assertTokensNotDenied(dark, \"modes.dark\")\n assertNeutralGroupContrast(dark, \"modes.dark\")\n assertButtonPrimary(dark, \"modes.dark\")\n }\n\n // Parse registered public-part styles.\n let contributes: OrbitworkSkin[\"contributes\"] | undefined\n if (input.contributes !== undefined) {\n if (!isRecord(input.contributes)) throw new Error(\"contributes 必须是对象\")\n assertKnownKeys(input.contributes, CONTRIBUTES_KEYS, \"contributes\")\n const publicPartStyles = input.contributes.publicPartStyles\n if (publicPartStyles !== undefined && typeof publicPartStyles !== \"string\")\n throw new Error(\"contributes.publicPartStyles 必须是字符串\")\n const registry = parseRegistry(input.contributes.registry)\n const normalizedPublicPartStyles = assertSkinContributions(publicPartStyles, registry)\n if (normalizedPublicPartStyles || registry) {\n contributes = {\n ...(normalizedPublicPartStyles ? { publicPartStyles: normalizedPublicPartStyles } : {}),\n ...(registry ? { registry } : {}),\n }\n }\n }\n\n return {\n ok: true,\n skin: {\n version: 1,\n id: input.id,\n name: input.name.trim(),\n ...(input.description ? { description: input.description.trim() } : {}),\n ...(input.fontScale !== undefined ? { fontScale: input.fontScale } : {}),\n modes: { ...(light ? { light } : {}), ...(dark ? { dark } : {}) },\n ...(contributes ? { contributes } : {}),\n },\n }\n } catch (error) {\n return { ok: false, error: error instanceof Error ? error.message : \"主题格式无效\" }\n }\n}\n\nconst PUBLIC_PART_TARGET =\n /^\\[data-slot=[\"'][a-z0-9]+(?:-[a-z0-9]+)*[\"']\\](?:\\s+(?:>\\s+)?\\[data-ow-(?:part|state|role|kind|context)=[\"'][a-z0-9]+(?:-[a-z0-9]+)*[\"']\\])*$/\n\ntype SkinCssDeclaration = { property: string; value: string }\ntype SkinCssRule = { selectors: string[]; declarations: SkinCssDeclaration[] }\n\nfunction assertSkinCssValue(property: string, value: string): void {\n if (property === \"color\" && /^var\\(--ow-text(?:-2)?\\)$/.test(value)) {\n return\n }\n if (\n property === \"font-weight\" &&\n (/^(?:[1-9]00|normal|bold)$/i.test(value) || /^var\\(--ow-font-weight-[a-z0-9-]+\\)$/i.test(value))\n )\n return\n throw new Error(`contributes.publicPartStyles 不允许 ${property} 使用值 ${value}`)\n}\n\n/**\n * Parse the deliberately tiny public-part CSS language and serialize it back\n * to one canonical representation. Comments and escapes are rejected instead\n * of being stripped: validation and browser injection must consume identical\n * semantics.\n */\nfunction cssRules(css: string): SkinCssRule[] {\n if (css.includes(\"/*\") || css.includes(\"*/\")) {\n throw new Error(\"contributes.publicPartStyles 不支持 CSS 注释\")\n }\n if (css.includes(\"\\\\\")) throw new Error(\"contributes.publicPartStyles 不支持 CSS 转义\")\n const rules: SkinCssRule[] = []\n let cursor = 0\n while (cursor < css.length) {\n while (/\\s/.test(css[cursor] ?? \"\")) cursor += 1\n if (cursor >= css.length) break\n const open = css.indexOf(\"{\", cursor)\n if (open < 0) throw new Error(\"contributes.publicPartStyles 包含不完整的 CSS 规则\")\n const close = css.indexOf(\"}\", open + 1)\n if (close < 0 || css.slice(open + 1, close).includes(\"{\")) {\n throw new Error(\"contributes.publicPartStyles 只能包含扁平 CSS 规则\")\n }\n const prelude = css.slice(cursor, open).trim()\n if (!prelude || prelude.startsWith(\"@\")) {\n throw new Error(\"contributes.publicPartStyles 不支持 @ 规则或空选择器\")\n }\n const selectors = prelude\n .split(\",\")\n .map((selector) => selector.trim())\n .filter(Boolean)\n const declarations = css\n .slice(open + 1, close)\n .split(\";\")\n .map((declaration) => declaration.trim())\n .filter(Boolean)\n .map((declaration) => {\n const separator = declaration.indexOf(\":\")\n if (separator <= 0 || !declaration.slice(separator + 1).trim()) {\n throw new Error(`contributes.publicPartStyles 包含无效声明:${declaration}`)\n }\n const property = declaration.slice(0, separator).trim().toLowerCase()\n const value = declaration.slice(separator + 1).trim()\n if (!/^[a-z][a-z-]*$/.test(property) || /[{};\"'@]/.test(value) || /!\\s*important/i.test(value)) {\n throw new Error(`contributes.publicPartStyles 包含无效声明:${declaration}`)\n }\n assertSkinCssValue(property, value)\n return { property, value }\n })\n if (declarations.length === 0) throw new Error(\"contributes.publicPartStyles 不接受空规则\")\n rules.push({ selectors, declarations })\n cursor = close + 1\n }\n if (css.trim() && rules.length === 0) throw new Error(\"contributes.publicPartStyles 没有有效规则\")\n return rules\n}\n\nexport function normalizeOrbitworkSkinPublicPartStyles(publicPartStyles: string): string {\n const path = \"contributes.publicPartStyles\"\n const publicPartCss = publicPartStyles.trim()\n if (new TextEncoder().encode(publicPartCss).byteLength > MAX_ORBITWORK_SKIN_CSS_BYTES)\n throw new Error(`${path} 不能超过 256 KiB`)\n const rules = cssRules(publicPartCss)\n for (const rule of rules) {\n for (const selector of rule.selectors) {\n if (!PUBLIC_PART_TARGET.test(selector))\n throw new Error(`${path} 只能定位 data-slot 根及其 data-ow-* public part:${selector}`)\n const allowedProperties = ORBITWORK_SKIN_PUBLIC_PARTS[selector as keyof typeof ORBITWORK_SKIN_PUBLIC_PARTS]\n if (!allowedProperties) throw new Error(`${path} 选择器不是 Orbitwork 开放的皮肤 public part:${selector}`)\n for (const { property } of rule.declarations) {\n if (!(allowedProperties as readonly string[]).includes(property)) {\n throw new Error(`${path} 不允许在 ${selector} 覆盖属性 ${property}`)\n }\n }\n }\n }\n const canonical = rules\n .map(\n ({ selectors, declarations }) =>\n `${selectors.join(\", \")} { ${declarations.map(({ property, value }) => `${property}: ${value};`).join(\" \")} }`,\n )\n .join(\"\\n\")\n const safety = analyzeSkinCSS(canonical)\n if (!safety.ok) throw new Error(`${path} 包含不安全内容:${safety.warnings.join(\";\")}`)\n const violation = findDs2SkinCssViolation(canonical)\n if (violation) throw new Error(`${path} 命中 DS2 禁覆盖:${violation}`)\n return canonical\n}\n\nfunction assertSkinContributions(\n publicPartStyles: unknown,\n registry: OrbitworkSkinRegistryEntry[] | undefined,\n): string | undefined {\n const publicPartCss = typeof publicPartStyles === \"string\" ? publicPartStyles.trim() : \"\"\n const hasCss = publicPartCss.length > 0\n\n if (hasCss && !registry?.length) throw new Error(\"contributes.publicPartStyles 必须提供 registry 登记\")\n if (!hasCss && registry?.length) throw new Error(\"contributes.registry 不能脱离 publicPartStyles 单独存在\")\n if (!hasCss || !registry) return undefined\n\n const normalized = normalizeOrbitworkSkinPublicPartStyles(publicPartCss)\n const rules = cssRules(normalized)\n const selectors = rules.flatMap((rule) => rule.selectors)\n const registeredTargets = new Set(registry.map((entry) => entry.target))\n for (const rule of rules) {\n for (const selector of rule.selectors) {\n if (!registeredTargets.has(selector)) throw new Error(`contributes.publicPartStyles 选择器未登记:${selector}`)\n }\n }\n const selectorSet = new Set(selectors)\n for (const entry of registry) {\n if (!selectorSet.has(entry.target)) throw new Error(`contributes.registry target 未出现在 CSS:${entry.target}`)\n }\n return normalized\n}\n\nfunction parseTokens(input: unknown, allowed: Set<string>, path: string): OrbitworkSkinTokens {\n if (!isRecord(input)) throw new Error(`${path} 必须是对象`)\n assertKnownKeys(input, allowed, path)\n const result: OrbitworkSkinTokens = {}\n for (const [key, value] of Object.entries(input)) {\n if (typeof value !== \"string\") throw new Error(`${path}.${key} 必须是字符串`)\n if (COLOR_KEYS.includes(key as (typeof COLOR_KEYS)[number])) {\n if (!HEX_COLOR.test(value)) throw new Error(`${path}.${key} 必须是十六进制颜色`)\n ;(result as Record<string, string>)[key] = value.toLowerCase()\n } else if (MASK_COLOR_KEYS.includes(key as (typeof MASK_COLOR_KEYS)[number])) {\n if (!MASK_HEX_COLOR.test(value)) throw new Error(`${path}.${key} 必须是六位或八位十六进制颜色`)\n ;(result as Record<string, string>)[key] = value.toLowerCase()\n } else if (IMAGE_KEYS.includes(key as (typeof IMAGE_KEYS)[number])) {\n assertSafeDataImage(value, `${path}.${key}`)\n ;(result as Record<string, string>)[key] = value\n } else if (OPACITY_KEYS.includes(key as (typeof OPACITY_KEYS)[number])) {\n const opacity = Number(value)\n if (!/^(?:0(?:\\.\\d+)?|1(?:\\.0+)?)$/.test(value) || !Number.isFinite(opacity) || opacity < 0 || opacity > 1) {\n throw new Error(`${path}.${key} 必须是 0–1 之间的十进制字符串`)\n }\n ;(result as Record<string, string>)[key] = String(opacity)\n } else if (POSITION_KEYS.includes(key as (typeof POSITION_KEYS)[number])) {\n const normalized = value.toLowerCase()\n if (!BACKGROUND_POSITIONS.has(normalized)) throw new Error(`${path}.${key} 不是支持的背景位置`)\n ;(result as Record<string, string>)[key] = normalized\n } else if (SIZE_KEYS.includes(key as (typeof SIZE_KEYS)[number])) {\n const normalized = value.toLowerCase()\n if (!BACKGROUND_SIZES.has(normalized)) throw new Error(`${path}.${key} 不是支持的背景尺寸`)\n ;(result as Record<string, string>)[key] = normalized\n } else {\n throw new Error(`${path} 包含不支持的字段:${key}`)\n }\n }\n return result\n}\n\nfunction parseRegistry(input: unknown): OrbitworkSkinRegistryEntry[] | undefined {\n if (input === undefined) return undefined\n if (!Array.isArray(input)) throw new Error(\"contributes.registry 必须是数组\")\n if (input.length === 0) return undefined\n const result = input.map((entry, index) => {\n if (!isRecord(entry)) throw new Error(`contributes.registry[${index}] 必须是 { target, reason } 对象`)\n assertKnownKeys(entry, REGISTRY_ENTRY_KEYS, `contributes.registry[${index}]`)\n const { target, reason } = entry\n if (typeof target !== \"string\" || !target.trim() || target.length > 200)\n throw new Error(`contributes.registry[${index}].target 必须是 1–200 字符的字符串`)\n if (typeof reason !== \"string\" || !reason.trim() || reason.length > 200)\n throw new Error(`contributes.registry[${index}].reason 必须是 1–200 字符的字符串`)\n return { target: target.trim(), reason: reason.trim() }\n })\n const duplicate = result.find(\n (entry, index) => result.findIndex((candidate) => candidate.target === entry.target) !== index,\n )\n if (duplicate) throw new Error(`contributes.registry target 重复:${duplicate.target}`)\n return result\n}\n\nfunction assertSafeDataImage(value: string, path: string): void {\n const match = DATA_IMAGE.exec(value)\n if (!match) throw new Error(`${path} 必须是 PNG、JPEG 或 WebP 的 base64 data URL`)\n const format = match[1]\n const payload = match[2]\n if (!format || !payload) throw new Error(`${path} 包含无效的图片数据`)\n if (payload.length % 4 !== 0) throw new Error(`${path} 包含无效的 base64 数据`)\n const padding = payload.endsWith(\"==\") ? 2 : payload.endsWith(\"=\") ? 1 : 0\n const decodedBytes = (payload.length / 4) * 3 - padding\n if (decodedBytes > MAX_ORBITWORK_SKIN_IMAGE_BYTES) throw new Error(`${path} 解码后不能超过 5 MiB`)\n let bytes: number[]\n try {\n const decoded = globalThis.atob(payload)\n bytes = Array.from(decoded.slice(0, 12), (char) => char.charCodeAt(0))\n } catch {\n throw new Error(`${path} 包含无效的 base64 数据`)\n }\n const validMagic =\n format === \"png\"\n ? [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a].every((byte, index) => bytes[index] === byte)\n : format === \"jpeg\"\n ? bytes[0] === 0xff && bytes[1] === 0xd8 && bytes[2] === 0xff\n : bytes[0] === 0x52 &&\n bytes[1] === 0x49 &&\n bytes[2] === 0x46 &&\n bytes[3] === 0x46 &&\n bytes[8] === 0x57 &&\n bytes[9] === 0x45 &&\n bytes[10] === 0x42 &&\n bytes[11] === 0x50\n if (!validMagic) throw new Error(`${path} 的内容与图片格式不匹配`)\n}\n\n/** Convert a validated embedded image into a CSS value without accepting arbitrary CSS or URLs. */\nexport function orbitworkSkinImageCssValue(value: string | undefined): string | undefined {\n if (!value) return undefined\n try {\n assertSafeDataImage(value, \"chatBackgroundImage\")\n return `url(\"${value}\")`\n } catch {\n return undefined\n }\n}\n\nexport function assertKnownKeys(value: Record<string, unknown>, allowed: Set<string>, path: string) {\n const unknown = Object.keys(value).find((key) => !allowed.has(key))\n if (unknown) throw new Error(`${path} 包含不支持的字段:${unknown}`)\n}\n\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === \"object\" && !Array.isArray(value)\n}\n"]}
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
var _chunkJC7BHKS4cjs = require('./chunk-JC7BHKS4.cjs');
|
|
9
|
+
|
|
10
|
+
// src/theme/core/unifiedTheme.ts
|
|
11
|
+
var TENANT_TOKEN_MAP = {
|
|
12
|
+
bg: "--ow-bg",
|
|
13
|
+
surface: "--ow-surface",
|
|
14
|
+
surface2: "--ow-surface-2",
|
|
15
|
+
text: "--ow-text",
|
|
16
|
+
text2: "--ow-text-2",
|
|
17
|
+
text3: "--ow-text-3",
|
|
18
|
+
border: "--ow-border",
|
|
19
|
+
borderStrong: "--ow-border-strong"
|
|
20
|
+
};
|
|
21
|
+
function tenantTokens(theme, mode) {
|
|
22
|
+
const colors = _optionalChain([theme, 'optionalAccess', _ => _.modes, 'access', _2 => _2[mode]]);
|
|
23
|
+
if (!colors) return {};
|
|
24
|
+
return Object.fromEntries(
|
|
25
|
+
Object.entries(TENANT_TOKEN_MAP).map(([key, token]) => [token, colors[key]])
|
|
26
|
+
);
|
|
27
|
+
}
|
|
28
|
+
function skinTokens(skin, mode) {
|
|
29
|
+
const values = _optionalChain([skin, 'optionalAccess', _3 => _3.modes, 'access', _4 => _4[mode]]);
|
|
30
|
+
if (!values) return {};
|
|
31
|
+
const tokens = {};
|
|
32
|
+
for (const [rawKey, value] of Object.entries(values)) {
|
|
33
|
+
const key = rawKey;
|
|
34
|
+
const property = _chunkJC7BHKS4cjs.ORBITWORK_SKIN_CSS_VARIABLES[key];
|
|
35
|
+
if (!property || !value) continue;
|
|
36
|
+
if (key === "chatBackgroundImage") {
|
|
37
|
+
const image = _chunkJC7BHKS4cjs.orbitworkSkinImageCssValue.call(void 0, value);
|
|
38
|
+
if (image) tokens[property] = image;
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
if (key === "chatBackgroundMaskColor") {
|
|
42
|
+
const mask = _chunkJC7BHKS4cjs.resolveOrbitworkSkinChatBackgroundMask.call(void 0, value);
|
|
43
|
+
tokens[property] = mask.color;
|
|
44
|
+
tokens["--ow-chat-bg-mask-start-opacity"] = `${mask.startOpacity}%`;
|
|
45
|
+
tokens["--ow-chat-bg-mask-end-opacity"] = `${mask.endOpacity}%`;
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
if (key === "chatBackgroundOverlay" && values.chatBackgroundMaskColor) continue;
|
|
49
|
+
tokens[property] = value;
|
|
50
|
+
}
|
|
51
|
+
return tokens;
|
|
52
|
+
}
|
|
53
|
+
function localeCandidates(locale) {
|
|
54
|
+
let canonical = "en-US";
|
|
55
|
+
try {
|
|
56
|
+
canonical = _nullishCoalesce(Intl.getCanonicalLocales(locale)[0], () => ( "en-US"));
|
|
57
|
+
} catch (e) {
|
|
58
|
+
}
|
|
59
|
+
const language = _nullishCoalesce(canonical.split("-")[0], () => ( "en"));
|
|
60
|
+
return [.../* @__PURE__ */ new Set([canonical, language, "en-US"])];
|
|
61
|
+
}
|
|
62
|
+
function localizedCopy(source, locale) {
|
|
63
|
+
if (!source) return void 0;
|
|
64
|
+
for (const candidate of localeCandidates(locale)) {
|
|
65
|
+
if (source[candidate]) return source[candidate];
|
|
66
|
+
}
|
|
67
|
+
return void 0;
|
|
68
|
+
}
|
|
69
|
+
function mergeUnifiedTheme(brand, tenant, userSkin, mode, locale = "en-US", appearanceOverlaySkin = null, fontScalePreference = null) {
|
|
70
|
+
const chatBackgroundImage = _nullishCoalesce(_optionalChain([appearanceOverlaySkin, 'optionalAccess', _5 => _5.modes, 'access', _6 => _6[mode], 'optionalAccess', _7 => _7.chatBackgroundImage]), () => ( _optionalChain([userSkin, 'optionalAccess', _8 => _8.modes, 'access', _9 => _9[mode], 'optionalAccess', _10 => _10.chatBackgroundImage])));
|
|
71
|
+
const tokens = {
|
|
72
|
+
..._nullishCoalesce(_optionalChain([brand, 'optionalAccess', _11 => _11.modes, 'access', _12 => _12[mode]]), () => ( {})),
|
|
73
|
+
...tenantTokens(tenant, mode),
|
|
74
|
+
...skinTokens(userSkin, mode),
|
|
75
|
+
...skinTokens(appearanceOverlaySkin, mode),
|
|
76
|
+
..._chunkJC7BHKS4cjs.fontScaleTokens.call(void 0, _chunkJC7BHKS4cjs.resolveOrbitworkFontScale.call(void 0, fontScalePreference, _nullishCoalesce(_optionalChain([userSkin, 'optionalAccess', _13 => _13.fontScale]), () => ( _optionalChain([brand, 'optionalAccess', _14 => _14.fontScale])))))
|
|
77
|
+
};
|
|
78
|
+
const typography = _nullishCoalesce(_optionalChain([tenant, 'optionalAccess', _15 => _15.typography]), () => ( _optionalChain([brand, 'optionalAccess', _16 => _16.typography])));
|
|
79
|
+
if (typography) {
|
|
80
|
+
tokens["--ow-font-sans"] = typography.fontSans;
|
|
81
|
+
tokens["--ow-font-mono"] = typography.fontMono;
|
|
82
|
+
}
|
|
83
|
+
const brandCopy = localizedCopy(_optionalChain([brand, 'optionalAccess', _17 => _17.branding]), locale);
|
|
84
|
+
const tenantCopy = localizedCopy(_optionalChain([tenant, 'optionalAccess', _18 => _18.branding]), locale);
|
|
85
|
+
const copy = tenantCopy ? { ..._nullishCoalesce(brandCopy, () => ( {})), ...tenantCopy } : _nullishCoalesce(brandCopy, () => ( null));
|
|
86
|
+
const logo = _optionalChain([tenant, 'optionalAccess', _19 => _19.logo]) || _optionalChain([brand, 'optionalAccess', _20 => _20.logo]);
|
|
87
|
+
const loginKV = _optionalChain([tenant, 'optionalAccess', _21 => _21.loginKV]) || _optionalChain([brand, 'optionalAccess', _22 => _22.loginKV]);
|
|
88
|
+
const favicon = _optionalChain([tenant, 'optionalAccess', _23 => _23.favicon]) || _optionalChain([brand, 'optionalAccess', _24 => _24.favicon]);
|
|
89
|
+
const branding = copy ? {
|
|
90
|
+
...copy,
|
|
91
|
+
...logo ? { logo } : {},
|
|
92
|
+
...loginKV ? { loginKV } : {},
|
|
93
|
+
...favicon ? { favicon } : {}
|
|
94
|
+
} : null;
|
|
95
|
+
return {
|
|
96
|
+
mode,
|
|
97
|
+
tokens,
|
|
98
|
+
branding,
|
|
99
|
+
skin: _optionalChain([userSkin, 'optionalAccess', _25 => _25.modes, 'access', _26 => _26[mode]]) || _optionalChain([appearanceOverlaySkin, 'optionalAccess', _27 => _27.modes, 'access', _28 => _28[mode]]) ? {
|
|
100
|
+
id: _nullishCoalesce(_nullishCoalesce(_optionalChain([userSkin, 'optionalAccess', _29 => _29.id]), () => ( _optionalChain([appearanceOverlaySkin, 'optionalAccess', _30 => _30.id]))), () => ( "default")),
|
|
101
|
+
..._optionalChain([userSkin, 'optionalAccess', _31 => _31.contributes, 'optionalAccess', _32 => _32.publicPartStyles]) ? { publicPartStyles: userSkin.contributes.publicPartStyles } : {},
|
|
102
|
+
...chatBackgroundImage ? { chatBackgroundImage } : {},
|
|
103
|
+
hasChatBackgroundImage: Boolean(chatBackgroundImage),
|
|
104
|
+
hasUserBubbleStyle: Boolean(
|
|
105
|
+
_optionalChain([userSkin, 'optionalAccess', _33 => _33.modes, 'access', _34 => _34[mode], 'optionalAccess', _35 => _35.userBubbleBackground]) || _optionalChain([userSkin, 'optionalAccess', _36 => _36.modes, 'access', _37 => _37[mode], 'optionalAccess', _38 => _38.userBubbleForeground]) || _optionalChain([userSkin, 'optionalAccess', _39 => _39.modes, 'access', _40 => _40[mode], 'optionalAccess', _41 => _41.userBubbleBorder])
|
|
106
|
+
)
|
|
107
|
+
} : null,
|
|
108
|
+
sources: {
|
|
109
|
+
brand: _nullishCoalesce(_optionalChain([brand, 'optionalAccess', _42 => _42.id]), () => ( null)),
|
|
110
|
+
tenant: _nullishCoalesce(_optionalChain([tenant, 'optionalAccess', _43 => _43.name]), () => ( null)),
|
|
111
|
+
user: _nullishCoalesce(_optionalChain([userSkin, 'optionalAccess', _44 => _44.id]), () => ( null))
|
|
112
|
+
}
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// src/theme/utils/themeApplier.ts
|
|
117
|
+
var managedProperties = /* @__PURE__ */ new WeakMap();
|
|
118
|
+
var managedPublicPartStyles = /* @__PURE__ */ new WeakMap();
|
|
119
|
+
var managedPublicPartScopes = /* @__PURE__ */ new WeakMap();
|
|
120
|
+
var managedChatBackgroundImages = /* @__PURE__ */ new WeakMap();
|
|
121
|
+
var nextPublicPartScope = 0;
|
|
122
|
+
var CHAT_BACKGROUND_IMAGE_PROPERTY = "--ow-chat-bg-image";
|
|
123
|
+
function applyUnifiedTheme(theme, target = document.documentElement) {
|
|
124
|
+
const previous = _nullishCoalesce(managedProperties.get(target), () => ( /* @__PURE__ */ new Set()));
|
|
125
|
+
const next = new Set(Object.keys(theme.tokens));
|
|
126
|
+
for (const property of previous) {
|
|
127
|
+
if (!next.has(property)) target.style.removeProperty(property);
|
|
128
|
+
}
|
|
129
|
+
for (const [property, value] of Object.entries(theme.tokens)) {
|
|
130
|
+
if (value === void 0) continue;
|
|
131
|
+
const appliedValue = property === CHAT_BACKGROUND_IMAGE_PROPERTY && _optionalChain([theme, 'access', _45 => _45.skin, 'optionalAccess', _46 => _46.chatBackgroundImage]) ? chatBackgroundImageCssValue(target, theme.skin.chatBackgroundImage, value) : value;
|
|
132
|
+
target.style.setProperty(property, appliedValue);
|
|
133
|
+
}
|
|
134
|
+
if (!next.has(CHAT_BACKGROUND_IMAGE_PROPERTY) || !_optionalChain([theme, 'access', _47 => _47.skin, 'optionalAccess', _48 => _48.chatBackgroundImage])) {
|
|
135
|
+
releaseChatBackgroundImage(target);
|
|
136
|
+
}
|
|
137
|
+
managedProperties.set(target, next);
|
|
138
|
+
setOptionalAttribute(target, "data-ow-brand-theme", theme.sources.brand);
|
|
139
|
+
setOptionalAttribute(target, "data-tenant-theme", theme.sources.tenant);
|
|
140
|
+
setOptionalAttribute(target, "data-ow-skin", _nullishCoalesce(_optionalChain([theme, 'access', _49 => _49.skin, 'optionalAccess', _50 => _50.id]), () => ( null)));
|
|
141
|
+
if (_optionalChain([theme, 'access', _51 => _51.skin, 'optionalAccess', _52 => _52.hasChatBackgroundImage])) target.setAttribute("data-desktop-background-image", "");
|
|
142
|
+
else target.removeAttribute("data-desktop-background-image");
|
|
143
|
+
if (_optionalChain([theme, 'access', _53 => _53.skin, 'optionalAccess', _54 => _54.hasUserBubbleStyle])) target.setAttribute("data-chat-user-bubble-skin", "");
|
|
144
|
+
else target.removeAttribute("data-chat-user-bubble-skin");
|
|
145
|
+
const targetDocument = _nullishCoalesce(target.ownerDocument, () => ( (typeof document === "undefined" ? null : document)));
|
|
146
|
+
if (targetDocument) applyPublicPartStyles(target, targetDocument, theme.skin);
|
|
147
|
+
}
|
|
148
|
+
function removeUnifiedTheme(target = document.documentElement) {
|
|
149
|
+
for (const property of _nullishCoalesce(managedProperties.get(target), () => ( []))) target.style.removeProperty(property);
|
|
150
|
+
managedProperties.delete(target);
|
|
151
|
+
releaseChatBackgroundImage(target);
|
|
152
|
+
target.removeAttribute("data-ow-brand-theme");
|
|
153
|
+
target.removeAttribute("data-tenant-theme");
|
|
154
|
+
target.removeAttribute("data-ow-skin");
|
|
155
|
+
target.removeAttribute("data-desktop-background-image");
|
|
156
|
+
target.removeAttribute("data-chat-user-bubble-skin");
|
|
157
|
+
removePublicPartStyles(target);
|
|
158
|
+
}
|
|
159
|
+
function chatBackgroundImageCssValue(target, dataUrl, fallback) {
|
|
160
|
+
const current = managedChatBackgroundImages.get(target);
|
|
161
|
+
if (_optionalChain([current, 'optionalAccess', _55 => _55.dataUrl]) === dataUrl) return `url("${current.objectUrl}")`;
|
|
162
|
+
const separator = dataUrl.indexOf(",");
|
|
163
|
+
const header = separator >= 0 ? dataUrl.slice(0, separator) : "";
|
|
164
|
+
if (!/^data:image\/(?:png|jpeg|webp);base64$/i.test(header)) {
|
|
165
|
+
releaseChatBackgroundImage(target);
|
|
166
|
+
return fallback;
|
|
167
|
+
}
|
|
168
|
+
try {
|
|
169
|
+
const binary = globalThis.atob(dataUrl.slice(separator + 1));
|
|
170
|
+
const bytes = new Uint8Array(binary.length);
|
|
171
|
+
for (let index = 0; index < binary.length; index += 1) bytes[index] = binary.charCodeAt(index);
|
|
172
|
+
const objectUrl = globalThis.URL.createObjectURL(new Blob([bytes], { type: header.slice(5, -7) }));
|
|
173
|
+
releaseChatBackgroundImage(target);
|
|
174
|
+
managedChatBackgroundImages.set(target, { dataUrl, objectUrl });
|
|
175
|
+
return `url("${objectUrl}")`;
|
|
176
|
+
} catch (e2) {
|
|
177
|
+
releaseChatBackgroundImage(target);
|
|
178
|
+
return fallback;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
function releaseChatBackgroundImage(target) {
|
|
182
|
+
const current = managedChatBackgroundImages.get(target);
|
|
183
|
+
if (!current) return;
|
|
184
|
+
globalThis.URL.revokeObjectURL(current.objectUrl);
|
|
185
|
+
managedChatBackgroundImages.delete(target);
|
|
186
|
+
}
|
|
187
|
+
function getCurrentThemeName(target = document.documentElement) {
|
|
188
|
+
return target.getAttribute("data-tenant-theme");
|
|
189
|
+
}
|
|
190
|
+
function setOptionalAttribute(target, name, value) {
|
|
191
|
+
if (value) target.setAttribute(name, value);
|
|
192
|
+
else target.removeAttribute(name);
|
|
193
|
+
}
|
|
194
|
+
function removePublicPartStyles(target) {
|
|
195
|
+
_optionalChain([managedPublicPartStyles, 'access', _56 => _56.get, 'call', _57 => _57(target), 'optionalAccess', _58 => _58.remove, 'call', _59 => _59()]);
|
|
196
|
+
managedPublicPartStyles.delete(target);
|
|
197
|
+
target.removeAttribute("data-ow-skin-scope");
|
|
198
|
+
}
|
|
199
|
+
function applyPublicPartStyles(target, document2, skin) {
|
|
200
|
+
const previous = managedPublicPartStyles.get(target);
|
|
201
|
+
if (!_optionalChain([skin, 'optionalAccess', _60 => _60.publicPartStyles])) {
|
|
202
|
+
removePublicPartStyles(target);
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
let normalized;
|
|
206
|
+
try {
|
|
207
|
+
normalized = _chunkJC7BHKS4cjs.normalizeOrbitworkSkinPublicPartStyles.call(void 0, skin.publicPartStyles);
|
|
208
|
+
} catch (error) {
|
|
209
|
+
console.error("[theme] rejected invalid public-part styles at apply time:", error);
|
|
210
|
+
removePublicPartStyles(target);
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
213
|
+
let scopeId = managedPublicPartScopes.get(target);
|
|
214
|
+
if (!scopeId) {
|
|
215
|
+
scopeId = `ow-skin-${++nextPublicPartScope}`;
|
|
216
|
+
managedPublicPartScopes.set(target, scopeId);
|
|
217
|
+
}
|
|
218
|
+
target.setAttribute("data-ow-skin-scope", scopeId);
|
|
219
|
+
const scope = `[data-ow-skin-scope="${scopeId}"]`;
|
|
220
|
+
const scopedCss = normalized.replace(/([^{}]+)\{/g, (_match, selector) => {
|
|
221
|
+
const selectors = selector.split(",").map((item) => `${scope} ${item.trim()}`).join(", ");
|
|
222
|
+
return `${selectors} {`;
|
|
223
|
+
});
|
|
224
|
+
const style = _nullishCoalesce(previous, () => ( document2.createElement("style")));
|
|
225
|
+
style.setAttribute("data-ow-skin-style", scopeId);
|
|
226
|
+
style.textContent = scopedCss;
|
|
227
|
+
if (!previous) {
|
|
228
|
+
managedPublicPartStyles.set(target, style);
|
|
229
|
+
document2.head.appendChild(style);
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
|
|
234
|
+
|
|
235
|
+
|
|
236
|
+
|
|
237
|
+
|
|
238
|
+
|
|
239
|
+
exports.localizedCopy = localizedCopy; exports.mergeUnifiedTheme = mergeUnifiedTheme; exports.applyUnifiedTheme = applyUnifiedTheme; exports.removeUnifiedTheme = removeUnifiedTheme; exports.getCurrentThemeName = getCurrentThemeName;
|
|
240
|
+
//# sourceMappingURL=chunk-K7ONUTLA.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/Users/wowzin/projects/orbit/packages/ui/dist/chunk-K7ONUTLA.cjs","../src/theme/core/unifiedTheme.ts","../src/theme/utils/themeApplier.ts"],"names":[],"mappings":"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","file":"/Users/wowzin/projects/orbit/packages/ui/dist/chunk-K7ONUTLA.cjs","sourcesContent":[null,"import { type OrbitworkFontScale, fontScaleTokens, resolveOrbitworkFontScale } from \"./fontScale.ts\"\nimport {\n ORBITWORK_SKIN_CSS_VARIABLES,\n type OrbitworkSkin,\n type OrbitworkSkinTokens,\n type ResolvedTheme,\n orbitworkSkinImageCssValue,\n resolveOrbitworkSkinChatBackgroundMask,\n} from \"./skin.ts\"\nimport type {\n BrandTheme,\n LocalizedBranding,\n TenantBranding,\n TenantTheme,\n TenantThemeColors,\n UnifiedThemeToken,\n} from \"./types.ts\"\n\nexport type UnifiedBranding = TenantBranding & {\n logo?: string\n loginKV?: string\n favicon?: string\n}\n\nexport type UnifiedTheme = {\n mode: ResolvedTheme\n /** Partial overrides only. DS2 CSS remains the sole source of defaults. */\n tokens: Readonly<Partial<Record<AppliedThemeToken, string>>>\n branding: UnifiedBranding | null\n skin: {\n id: string\n publicPartStyles?: string\n /** Validated embedded image retained outside CSSOM so the applier can use a short blob URL. */\n chatBackgroundImage?: string\n hasChatBackgroundImage: boolean\n hasUserBubbleStyle: boolean\n } | null\n sources: {\n brand: string | null\n tenant: string | null\n user: string | null\n }\n}\n\ntype SkinThemeToken =\n | (typeof ORBITWORK_SKIN_CSS_VARIABLES)[keyof typeof ORBITWORK_SKIN_CSS_VARIABLES]\n | \"--ow-chat-bg-mask-start-opacity\"\n | \"--ow-chat-bg-mask-end-opacity\"\n\nexport type AppliedThemeToken = UnifiedThemeToken | SkinThemeToken\n\nconst TENANT_TOKEN_MAP = {\n bg: \"--ow-bg\",\n surface: \"--ow-surface\",\n surface2: \"--ow-surface-2\",\n text: \"--ow-text\",\n text2: \"--ow-text-2\",\n text3: \"--ow-text-3\",\n border: \"--ow-border\",\n borderStrong: \"--ow-border-strong\",\n} as const satisfies Record<keyof TenantThemeColors, UnifiedThemeToken>\n\nfunction tenantTokens(theme: TenantTheme | null, mode: ResolvedTheme): Partial<Record<UnifiedThemeToken, string>> {\n const colors = theme?.modes[mode]\n if (!colors) return {}\n return Object.fromEntries(\n Object.entries(TENANT_TOKEN_MAP).map(([key, token]) => [token, colors[key as keyof TenantThemeColors]]),\n )\n}\n\nfunction skinTokens(skin: OrbitworkSkin | null, mode: ResolvedTheme): Partial<Record<AppliedThemeToken, string>> {\n const values = skin?.modes[mode]\n if (!values) return {}\n const tokens: Partial<Record<AppliedThemeToken, string>> = {}\n\n for (const [rawKey, value] of Object.entries(values)) {\n const key = rawKey as keyof OrbitworkSkinTokens\n const property = ORBITWORK_SKIN_CSS_VARIABLES[key]\n if (!property || !value) continue\n\n if (key === \"chatBackgroundImage\") {\n const image = orbitworkSkinImageCssValue(value)\n if (image) tokens[property] = image\n continue\n }\n if (key === \"chatBackgroundMaskColor\") {\n const mask = resolveOrbitworkSkinChatBackgroundMask(value)\n tokens[property] = mask.color\n tokens[\"--ow-chat-bg-mask-start-opacity\"] = `${mask.startOpacity}%`\n tokens[\"--ow-chat-bg-mask-end-opacity\"] = `${mask.endOpacity}%`\n continue\n }\n // The explicit readability mask supersedes the legacy uniform overlay so the image is not veiled twice.\n if (key === \"chatBackgroundOverlay\" && values.chatBackgroundMaskColor) continue\n tokens[property] = value\n }\n\n return tokens\n}\n\nfunction localeCandidates(locale: string): string[] {\n let canonical = \"en-US\"\n try {\n canonical = Intl.getCanonicalLocales(locale)[0] ?? \"en-US\"\n } catch {\n // Invalid runtime preference falls through to the contract baseline.\n }\n const language = canonical.split(\"-\")[0] ?? \"en\"\n return [...new Set([canonical, language, \"en-US\"])]\n}\n\n/** Pick the best localized copy for a locale: canonical, then language, then en-US. */\nexport function localizedCopy(source: LocalizedBranding | undefined, locale: string): TenantBranding | undefined {\n if (!source) return undefined\n for (const candidate of localeCandidates(locale)) {\n if (source[candidate]) return source[candidate]\n }\n return undefined\n}\n\n/**\n * Merge already-validated layers for one resolved color mode.\n * Priority: personal skin > tenant > OEM brand > DS2 CSS defaults.\n */\nexport function mergeUnifiedTheme(\n brand: BrandTheme | null,\n tenant: TenantTheme | null,\n userSkin: OrbitworkSkin | null,\n mode: ResolvedTheme,\n locale = \"en-US\",\n appearanceOverlaySkin: OrbitworkSkin | null = null,\n fontScalePreference: OrbitworkFontScale | null = null,\n): UnifiedTheme {\n const chatBackgroundImage =\n appearanceOverlaySkin?.modes[mode]?.chatBackgroundImage ?? userSkin?.modes[mode]?.chatBackgroundImage\n const tokens: Partial<Record<AppliedThemeToken, string>> = {\n ...(brand?.modes[mode] ?? {}),\n ...tenantTokens(tenant, mode),\n ...skinTokens(userSkin, mode),\n ...skinTokens(appearanceOverlaySkin, mode),\n ...fontScaleTokens(resolveOrbitworkFontScale(fontScalePreference, userSkin?.fontScale ?? brand?.fontScale)),\n }\n\n const typography = tenant?.typography ?? brand?.typography\n if (typography) {\n tokens[\"--ow-font-sans\"] = typography.fontSans\n tokens[\"--ow-font-mono\"] = typography.fontMono\n }\n\n const brandCopy = localizedCopy(brand?.branding, locale)\n const tenantCopy = localizedCopy(tenant?.branding, locale)\n const copy: TenantBranding | null = tenantCopy ? { ...(brandCopy ?? {}), ...tenantCopy } : (brandCopy ?? null)\n const logo = tenant?.logo || brand?.logo\n const loginKV = tenant?.loginKV || brand?.loginKV\n const favicon = tenant?.favicon || brand?.favicon\n const branding = copy\n ? {\n ...copy,\n ...(logo ? { logo } : {}),\n ...(loginKV ? { loginKV } : {}),\n ...(favicon ? { favicon } : {}),\n }\n : null\n\n return {\n mode,\n tokens,\n branding,\n skin:\n userSkin?.modes[mode] || appearanceOverlaySkin?.modes[mode]\n ? {\n id: userSkin?.id ?? appearanceOverlaySkin?.id ?? \"default\",\n ...(userSkin?.contributes?.publicPartStyles\n ? { publicPartStyles: userSkin.contributes.publicPartStyles }\n : {}),\n ...(chatBackgroundImage ? { chatBackgroundImage } : {}),\n hasChatBackgroundImage: Boolean(chatBackgroundImage),\n hasUserBubbleStyle: Boolean(\n userSkin?.modes[mode]?.userBubbleBackground ||\n userSkin?.modes[mode]?.userBubbleForeground ||\n userSkin?.modes[mode]?.userBubbleBorder,\n ),\n }\n : null,\n sources: {\n brand: brand?.id ?? null,\n tenant: tenant?.name ?? null,\n user: userSkin?.id ?? null,\n },\n }\n}\n","import { normalizeOrbitworkSkinPublicPartStyles } from \"../core/skin.ts\"\nimport type { UnifiedTheme } from \"../core/unifiedTheme.ts\"\n\nconst managedProperties = new WeakMap<HTMLElement, Set<string>>()\nconst managedPublicPartStyles = new WeakMap<HTMLElement, HTMLStyleElement>()\nconst managedPublicPartScopes = new WeakMap<HTMLElement, string>()\nconst managedChatBackgroundImages = new WeakMap<HTMLElement, { dataUrl: string; objectUrl: string }>()\nlet nextPublicPartScope = 0\nconst CHAT_BACKGROUND_IMAGE_PROPERTY = \"--ow-chat-bg-image\"\n\n/**\n * Atomically replace the variables owned by the unified theme pipeline.\n * Missing values are removed so DS2 CSS remains the only default source.\n */\nexport function applyUnifiedTheme(theme: UnifiedTheme, target: HTMLElement = document.documentElement): void {\n const previous = managedProperties.get(target) ?? new Set<string>()\n const next = new Set(Object.keys(theme.tokens))\n\n for (const property of previous) {\n if (!next.has(property)) target.style.removeProperty(property)\n }\n for (const [property, value] of Object.entries(theme.tokens)) {\n if (value === undefined) continue\n const appliedValue =\n property === CHAT_BACKGROUND_IMAGE_PROPERTY && theme.skin?.chatBackgroundImage\n ? chatBackgroundImageCssValue(target, theme.skin.chatBackgroundImage, value)\n : value\n target.style.setProperty(property, appliedValue)\n }\n if (!next.has(CHAT_BACKGROUND_IMAGE_PROPERTY) || !theme.skin?.chatBackgroundImage) {\n releaseChatBackgroundImage(target)\n }\n\n managedProperties.set(target, next)\n setOptionalAttribute(target, \"data-ow-brand-theme\", theme.sources.brand)\n setOptionalAttribute(target, \"data-tenant-theme\", theme.sources.tenant)\n setOptionalAttribute(target, \"data-ow-skin\", theme.skin?.id ?? null)\n if (theme.skin?.hasChatBackgroundImage) target.setAttribute(\"data-desktop-background-image\", \"\")\n else target.removeAttribute(\"data-desktop-background-image\")\n if (theme.skin?.hasUserBubbleStyle) target.setAttribute(\"data-chat-user-bubble-skin\", \"\")\n else target.removeAttribute(\"data-chat-user-bubble-skin\")\n\n const targetDocument = target.ownerDocument ?? (typeof document === \"undefined\" ? null : document)\n if (targetDocument) applyPublicPartStyles(target, targetDocument, theme.skin)\n}\n\n/** Remove only values owned by applyUnifiedTheme; unrelated inline styles survive. */\nexport function removeUnifiedTheme(target: HTMLElement = document.documentElement): void {\n for (const property of managedProperties.get(target) ?? []) target.style.removeProperty(property)\n managedProperties.delete(target)\n releaseChatBackgroundImage(target)\n target.removeAttribute(\"data-ow-brand-theme\")\n target.removeAttribute(\"data-tenant-theme\")\n target.removeAttribute(\"data-ow-skin\")\n target.removeAttribute(\"data-desktop-background-image\")\n target.removeAttribute(\"data-chat-user-bubble-skin\")\n removePublicPartStyles(target)\n}\n\nfunction chatBackgroundImageCssValue(target: HTMLElement, dataUrl: string, fallback: string): string {\n const current = managedChatBackgroundImages.get(target)\n if (current?.dataUrl === dataUrl) return `url(\"${current.objectUrl}\")`\n\n const separator = dataUrl.indexOf(\",\")\n const header = separator >= 0 ? dataUrl.slice(0, separator) : \"\"\n if (!/^data:image\\/(?:png|jpeg|webp);base64$/i.test(header)) {\n releaseChatBackgroundImage(target)\n return fallback\n }\n\n try {\n const binary = globalThis.atob(dataUrl.slice(separator + 1))\n const bytes = new Uint8Array(binary.length)\n for (let index = 0; index < binary.length; index += 1) bytes[index] = binary.charCodeAt(index)\n const objectUrl = globalThis.URL.createObjectURL(new Blob([bytes], { type: header.slice(5, -7) }))\n releaseChatBackgroundImage(target)\n managedChatBackgroundImages.set(target, { dataUrl, objectUrl })\n return `url(\"${objectUrl}\")`\n } catch {\n releaseChatBackgroundImage(target)\n return fallback\n }\n}\n\nfunction releaseChatBackgroundImage(target: HTMLElement): void {\n const current = managedChatBackgroundImages.get(target)\n if (!current) return\n globalThis.URL.revokeObjectURL(current.objectUrl)\n managedChatBackgroundImages.delete(target)\n}\n\nexport function getCurrentThemeName(target: HTMLElement = document.documentElement): string | null {\n return target.getAttribute(\"data-tenant-theme\")\n}\n\nfunction setOptionalAttribute(target: HTMLElement, name: string, value: string | null): void {\n if (value) target.setAttribute(name, value)\n else target.removeAttribute(name)\n}\n\nfunction removePublicPartStyles(target: HTMLElement): void {\n managedPublicPartStyles.get(target)?.remove()\n managedPublicPartStyles.delete(target)\n target.removeAttribute(\"data-ow-skin-scope\")\n}\n\nfunction applyPublicPartStyles(target: HTMLElement, document: Document, skin: UnifiedTheme[\"skin\"]): void {\n const previous = managedPublicPartStyles.get(target)\n if (!skin?.publicPartStyles) {\n removePublicPartStyles(target)\n return\n }\n\n let normalized: string\n try {\n normalized = normalizeOrbitworkSkinPublicPartStyles(skin.publicPartStyles)\n } catch (error) {\n console.error(\"[theme] rejected invalid public-part styles at apply time:\", error)\n removePublicPartStyles(target)\n return\n }\n let scopeId = managedPublicPartScopes.get(target)\n if (!scopeId) {\n scopeId = `ow-skin-${++nextPublicPartScope}`\n managedPublicPartScopes.set(target, scopeId)\n }\n target.setAttribute(\"data-ow-skin-scope\", scopeId)\n const scope = `[data-ow-skin-scope=\"${scopeId}\"]`\n const scopedCss = normalized.replace(/([^{}]+)\\{/g, (_match, selector: string) => {\n const selectors = selector\n .split(\",\")\n .map((item) => `${scope} ${item.trim()}`)\n .join(\", \")\n return `${selectors} {`\n })\n const style = previous ?? document.createElement(\"style\")\n style.setAttribute(\"data-ow-skin-style\", scopeId)\n style.textContent = scopedCss\n if (!previous) {\n managedPublicPartStyles.set(target, style)\n document.head.appendChild(style)\n }\n}\n"]}
|