create-principles-disciple 1.146.4 → 1.146.6
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/_release/product-identity.json +1 -1
- package/package.json +3 -3
- package/release-manager/package.json +3 -3
- package/console/dist/ui/App.d.ts +0 -1
- package/console/dist/ui/App.js +0 -172
- package/console/dist/ui/api.d.ts +0 -611
- package/console/dist/ui/api.js +0 -1094
- package/console/dist/ui/components/auth/login-form.d.ts +0 -4
- package/console/dist/ui/components/auth/login-form.js +0 -142
- package/console/dist/ui/components/auth/splash-screen.d.ts +0 -9
- package/console/dist/ui/components/auth/splash-screen.js +0 -22
- package/console/dist/ui/components/error-boundary.d.ts +0 -15
- package/console/dist/ui/components/error-boundary.js +0 -30
- package/console/dist/ui/components/focus/daily-thought-card.d.ts +0 -1
- package/console/dist/ui/components/focus/daily-thought-card.js +0 -41
- package/console/dist/ui/components/language-switcher.d.ts +0 -2
- package/console/dist/ui/components/language-switcher.js +0 -17
- package/console/dist/ui/components/layout/app-sidebar.d.ts +0 -27
- package/console/dist/ui/components/layout/app-sidebar.js +0 -128
- package/console/dist/ui/components/layout/page-loading.d.ts +0 -13
- package/console/dist/ui/components/layout/page-loading.js +0 -14
- package/console/dist/ui/components/layout/page-shell.d.ts +0 -12
- package/console/dist/ui/components/layout/page-shell.js +0 -11
- package/console/dist/ui/components/layout/section-title.d.ts +0 -10
- package/console/dist/ui/components/layout/section-title.js +0 -9
- package/console/dist/ui/components/notifications/NotificationProvider.d.ts +0 -14
- package/console/dist/ui/components/notifications/NotificationProvider.js +0 -136
- package/console/dist/ui/components/notifications/favicon-badge.d.ts +0 -3
- package/console/dist/ui/components/notifications/favicon-badge.js +0 -68
- package/console/dist/ui/components/notifications/notification-reducer.d.ts +0 -9
- package/console/dist/ui/components/notifications/notification-reducer.js +0 -9
- package/console/dist/ui/components/notifications/sound-storage.d.ts +0 -3
- package/console/dist/ui/components/notifications/sound-storage.js +0 -37
- package/console/dist/ui/components/notifications/useNotifications.d.ts +0 -1
- package/console/dist/ui/components/notifications/useNotifications.js +0 -9
- package/console/dist/ui/components/onboarding/CircuitDiagram.d.ts +0 -8
- package/console/dist/ui/components/onboarding/CircuitDiagram.js +0 -18
- package/console/dist/ui/components/onboarding/DemoResultView.d.ts +0 -22
- package/console/dist/ui/components/onboarding/DemoResultView.js +0 -33
- package/console/dist/ui/components/onboarding/SlashCommandsCard.d.ts +0 -16
- package/console/dist/ui/components/onboarding/SlashCommandsCard.js +0 -20
- package/console/dist/ui/components/onboarding/slashCommands.d.ts +0 -20
- package/console/dist/ui/components/onboarding/slashCommands.js +0 -22
- package/console/dist/ui/components/receipts/ReceiptCoverageDisclosure.d.ts +0 -6
- package/console/dist/ui/components/receipts/ReceiptCoverageDisclosure.js +0 -66
- package/console/dist/ui/components/theme-provider.d.ts +0 -14
- package/console/dist/ui/components/theme-provider.js +0 -40
- package/console/dist/ui/components/theme-toggle.d.ts +0 -2
- package/console/dist/ui/components/theme-toggle.js +0 -11
- package/console/dist/ui/components/ui/alert-dialog.d.ts +0 -20
- package/console/dist/ui/components/ui/alert-dialog.js +0 -26
- package/console/dist/ui/components/ui/badge.d.ts +0 -9
- package/console/dist/ui/components/ui/badge.js +0 -22
- package/console/dist/ui/components/ui/button.d.ts +0 -11
- package/console/dist/ui/components/ui/button.js +0 -34
- package/console/dist/ui/components/ui/card.d.ts +0 -8
- package/console/dist/ui/components/ui/card.js +0 -16
- package/console/dist/ui/components/ui/charts.d.ts +0 -51
- package/console/dist/ui/components/ui/charts.js +0 -72
- package/console/dist/ui/components/ui/dialog.d.ts +0 -19
- package/console/dist/ui/components/ui/dialog.js +0 -22
- package/console/dist/ui/components/ui/input.d.ts +0 -3
- package/console/dist/ui/components/ui/input.js +0 -8
- package/console/dist/ui/components/ui/markdown.d.ts +0 -24
- package/console/dist/ui/components/ui/markdown.js +0 -119
- package/console/dist/ui/components/ui/progress-bar.d.ts +0 -20
- package/console/dist/ui/components/ui/progress-bar.js +0 -38
- package/console/dist/ui/components/ui/select.d.ts +0 -13
- package/console/dist/ui/components/ui/select.js +0 -26
- package/console/dist/ui/components/ui/separator.d.ts +0 -3
- package/console/dist/ui/components/ui/separator.js +0 -6
- package/console/dist/ui/components/ui/sheet.d.ts +0 -25
- package/console/dist/ui/components/ui/sheet.js +0 -37
- package/console/dist/ui/components/ui/shiny-text.d.ts +0 -28
- package/console/dist/ui/components/ui/shiny-text.js +0 -46
- package/console/dist/ui/components/ui/skeleton.d.ts +0 -3
- package/console/dist/ui/components/ui/skeleton.js +0 -6
- package/console/dist/ui/components/ui/sonner.d.ts +0 -3
- package/console/dist/ui/components/ui/sonner.js +0 -13
- package/console/dist/ui/components/ui/tooltip.d.ts +0 -7
- package/console/dist/ui/components/ui/tooltip.js +0 -10
- package/console/dist/ui/data/daily-thoughts.d.ts +0 -15
- package/console/dist/ui/data/daily-thoughts.js +0 -164
- package/console/dist/ui/hooks/useNotificationSound.d.ts +0 -12
- package/console/dist/ui/hooks/useNotificationSound.js +0 -74
- package/console/dist/ui/i18n/en.json +0 -2399
- package/console/dist/ui/i18n/index.d.ts +0 -2
- package/console/dist/ui/i18n/index.js +0 -32
- package/console/dist/ui/i18n/zh-CN.json +0 -2399
- package/console/dist/ui/main.d.ts +0 -1
- package/console/dist/ui/main.js +0 -9
- package/console/dist/ui/pages/ReportProblemValidators.d.ts +0 -144
- package/console/dist/ui/pages/ReportProblemValidators.js +0 -418
- package/console/dist/ui/pages/activation/ActivationPage.d.ts +0 -1
- package/console/dist/ui/pages/activation/ActivationPage.js +0 -512
- package/console/dist/ui/pages/activation/ActivationValidators.d.ts +0 -20
- package/console/dist/ui/pages/activation/ActivationValidators.js +0 -160
- package/console/dist/ui/pages/control-center/AgentCard.d.ts +0 -31
- package/console/dist/ui/pages/control-center/AgentCard.js +0 -212
- package/console/dist/ui/pages/control-center/AgentGroup.d.ts +0 -26
- package/console/dist/ui/pages/control-center/AgentGroup.js +0 -38
- package/console/dist/ui/pages/control-center/ControlCenterPage.d.ts +0 -1
- package/console/dist/ui/pages/control-center/ControlCenterPage.js +0 -509
- package/console/dist/ui/pages/control-center/DesignGatePanel.d.ts +0 -1
- package/console/dist/ui/pages/control-center/DesignGatePanel.js +0 -137
- package/console/dist/ui/pages/control-center/RuntimeProfileManager.d.ts +0 -31
- package/console/dist/ui/pages/control-center/RuntimeProfileManager.js +0 -199
- package/console/dist/ui/pages/control-center/WorkflowDiagram.d.ts +0 -17
- package/console/dist/ui/pages/control-center/WorkflowDiagram.js +0 -55
- package/console/dist/ui/pages/debt/DebtPage.d.ts +0 -2
- package/console/dist/ui/pages/debt/DebtPage.js +0 -222
- package/console/dist/ui/pages/design-system/DesignSystemPage.d.ts +0 -2
- package/console/dist/ui/pages/design-system/DesignSystemPage.js +0 -30
- package/console/dist/ui/pages/examiner/ExaminerPage.d.ts +0 -15
- package/console/dist/ui/pages/examiner/ExaminerPage.js +0 -158
- package/console/dist/ui/pages/failed-tasks/FailedTasksPage.d.ts +0 -1
- package/console/dist/ui/pages/failed-tasks/FailedTasksPage.js +0 -421
- package/console/dist/ui/pages/focus/ApprovalSubjectReading.d.ts +0 -24
- package/console/dist/ui/pages/focus/ApprovalSubjectReading.js +0 -133
- package/console/dist/ui/pages/focus/FocusPage.d.ts +0 -123
- package/console/dist/ui/pages/focus/FocusPage.js +0 -567
- package/console/dist/ui/pages/focus/OwnerDecisionCard.d.ts +0 -9
- package/console/dist/ui/pages/focus/OwnerDecisionCard.js +0 -111
- package/console/dist/ui/pages/focus/OwnerWorkbench.d.ts +0 -19
- package/console/dist/ui/pages/focus/OwnerWorkbench.js +0 -75
- package/console/dist/ui/pages/focus/RuleCandidateBindingPanel.d.ts +0 -34
- package/console/dist/ui/pages/focus/RuleCandidateBindingPanel.js +0 -298
- package/console/dist/ui/pages/focus/focus-validation.d.ts +0 -40
- package/console/dist/ui/pages/focus/focus-validation.js +0 -211
- package/console/dist/ui/pages/intent/IntentOnboarding.d.ts +0 -67
- package/console/dist/ui/pages/intent/IntentOnboarding.js +0 -289
- package/console/dist/ui/pages/intent/IntentPage.d.ts +0 -1
- package/console/dist/ui/pages/intent/IntentPage.js +0 -252
- package/console/dist/ui/pages/pain/PainEvidenceValidators.d.ts +0 -59
- package/console/dist/ui/pages/pain/PainEvidenceValidators.js +0 -125
- package/console/dist/ui/pages/pain/PainPage.d.ts +0 -1
- package/console/dist/ui/pages/pain/PainPage.js +0 -420
- package/console/dist/ui/pages/pain/pain-card-helpers.d.ts +0 -175
- package/console/dist/ui/pages/pain/pain-card-helpers.js +0 -181
- package/console/dist/ui/pages/principles/CorePrinciplesPage.d.ts +0 -10
- package/console/dist/ui/pages/principles/CorePrinciplesPage.js +0 -59
- package/console/dist/ui/pages/principles/PrincipleDetailPage.d.ts +0 -60
- package/console/dist/ui/pages/principles/PrincipleDetailPage.js +0 -602
- package/console/dist/ui/pages/principles/PrinciplesPage.d.ts +0 -1
- package/console/dist/ui/pages/principles/PrinciplesPage.js +0 -327
- package/console/dist/ui/pages/principles/PrinciplesViewNav.d.ts +0 -8
- package/console/dist/ui/pages/principles/PrinciplesViewNav.js +0 -15
- package/console/dist/ui/pages/report-problem/ReportProblemPage.d.ts +0 -1
- package/console/dist/ui/pages/report-problem/ReportProblemPage.js +0 -467
- package/console/dist/ui/pages/settings/SettingsPage.d.ts +0 -4
- package/console/dist/ui/pages/settings/SettingsPage.js +0 -457
- package/console/dist/ui/pages/settings/UpdatePage.d.ts +0 -1
- package/console/dist/ui/pages/settings/UpdatePage.js +0 -215
- package/console/dist/ui/pages/welcome/WelcomePage.d.ts +0 -5
- package/console/dist/ui/pages/welcome/WelcomePage.js +0 -187
- package/console/dist/ui/utils/agent-metadata.d.ts +0 -71
- package/console/dist/ui/utils/agent-metadata.js +0 -284
- package/console/dist/ui/utils/approval-review.d.ts +0 -30
- package/console/dist/ui/utils/approval-review.js +0 -50
- package/console/dist/ui/utils/approval-warning-localization.d.ts +0 -34
- package/console/dist/ui/utils/approval-warning-localization.js +0 -148
- package/console/dist/ui/utils/attention-presentation.d.ts +0 -35
- package/console/dist/ui/utils/attention-presentation.js +0 -46
- package/console/dist/ui/utils/blocker-localization.d.ts +0 -23
- package/console/dist/ui/utils/blocker-localization.js +0 -36
- package/console/dist/ui/utils/control-center-helpers.d.ts +0 -79
- package/console/dist/ui/utils/control-center-helpers.js +0 -189
- package/console/dist/ui/utils/enum-labels.d.ts +0 -50
- package/console/dist/ui/utils/enum-labels.js +0 -171
- package/console/dist/ui/utils/format-date.d.ts +0 -11
- package/console/dist/ui/utils/format-date.js +0 -17
- package/console/dist/ui/utils/onboarding-state.d.ts +0 -25
- package/console/dist/ui/utils/onboarding-state.js +0 -77
- package/console/dist/ui/utils/reading-layout.d.ts +0 -20
- package/console/dist/ui/utils/reading-layout.js +0 -46
- package/console/dist/ui/utils/rule-binding-validators.d.ts +0 -13
- package/console/dist/ui/utils/rule-binding-validators.js +0 -188
- package/console/dist/ui/utils/runtime-mode.d.ts +0 -11
- package/console/dist/ui/utils/runtime-mode.js +0 -11
- package/console/dist/ui/utils/token-storage.d.ts +0 -22
- package/console/dist/ui/utils/token-storage.js +0 -47
- package/console/dist/ui/utils/validators.d.ts +0 -1178
- package/console/dist/ui/utils/validators.js +0 -3297
- package/release-manager/dist/bootstrap-entry.d.ts +0 -2
- package/release-manager/dist/bootstrap-entry.d.ts.map +0 -1
- package/release-manager/dist/bootstrap-entry.js.map +0 -1
- package/release-manager/dist/i18n.d.ts +0 -6
- package/release-manager/dist/i18n.d.ts.map +0 -1
- package/release-manager/dist/i18n.js.map +0 -1
- package/release-manager/dist/index.d.ts +0 -7
- package/release-manager/dist/index.d.ts.map +0 -1
- package/release-manager/dist/index.js +0 -656
- package/release-manager/dist/index.js.map +0 -1
- package/release-manager/dist/installer.d.ts +0 -629
- package/release-manager/dist/installer.d.ts.map +0 -1
- package/release-manager/dist/installer.js.map +0 -1
- package/release-manager/dist/installers/codex-host-installer.d.ts +0 -39
- package/release-manager/dist/installers/codex-host-installer.d.ts.map +0 -1
- package/release-manager/dist/installers/codex-host-installer.js.map +0 -1
- package/release-manager/dist/installers/index.d.ts +0 -51
- package/release-manager/dist/installers/index.d.ts.map +0 -1
- package/release-manager/dist/installers/index.js.map +0 -1
- package/release-manager/dist/installers/openclaw-host-installer.d.ts +0 -14
- package/release-manager/dist/installers/openclaw-host-installer.d.ts.map +0 -1
- package/release-manager/dist/installers/openclaw-host-installer.js.map +0 -1
- package/release-manager/dist/installers/workbuddy-host-installer.d.ts +0 -335
- package/release-manager/dist/installers/workbuddy-host-installer.d.ts.map +0 -1
- package/release-manager/dist/installers/workbuddy-host-installer.js.map +0 -1
- package/release-manager/dist/mvp-config.d.ts +0 -233
- package/release-manager/dist/mvp-config.d.ts.map +0 -1
- package/release-manager/dist/mvp-config.js.map +0 -1
- package/release-manager/dist/prompts.d.ts +0 -43
- package/release-manager/dist/prompts.d.ts.map +0 -1
- package/release-manager/dist/prompts.js +0 -268
- package/release-manager/dist/prompts.js.map +0 -1
- package/release-manager/dist/skill-language.d.ts +0 -32
- package/release-manager/dist/skill-language.d.ts.map +0 -1
- package/release-manager/dist/skill-language.js.map +0 -1
- package/release-manager/dist/uninstaller.d.ts +0 -68
- package/release-manager/dist/uninstaller.d.ts.map +0 -1
- package/release-manager/dist/uninstaller.js +0 -746
- package/release-manager/dist/uninstaller.js.map +0 -1
- package/release-manager/dist/update/apply-payload.d.ts +0 -143
- package/release-manager/dist/update/apply-payload.d.ts.map +0 -1
- package/release-manager/dist/update/apply-payload.js.map +0 -1
- package/release-manager/dist/update/atomic-file.d.ts +0 -35
- package/release-manager/dist/update/atomic-file.d.ts.map +0 -1
- package/release-manager/dist/update/atomic-file.js.map +0 -1
- package/release-manager/dist/update/bootstrap-executor.d.ts +0 -21
- package/release-manager/dist/update/bootstrap-executor.d.ts.map +0 -1
- package/release-manager/dist/update/bootstrap-executor.js.map +0 -1
- package/release-manager/dist/update/bootstrap-protocol.d.ts +0 -56
- package/release-manager/dist/update/bootstrap-protocol.d.ts.map +0 -1
- package/release-manager/dist/update/bootstrap-protocol.js.map +0 -1
- package/release-manager/dist/update/channel-metadata.d.ts +0 -28
- package/release-manager/dist/update/channel-metadata.d.ts.map +0 -1
- package/release-manager/dist/update/channel-metadata.js.map +0 -1
- package/release-manager/dist/update/channel-promotion.d.ts +0 -39
- package/release-manager/dist/update/channel-promotion.d.ts.map +0 -1
- package/release-manager/dist/update/channel-promotion.js +0 -55
- package/release-manager/dist/update/channel-promotion.js.map +0 -1
- package/release-manager/dist/update/console-surface.d.ts +0 -19
- package/release-manager/dist/update/console-surface.d.ts.map +0 -1
- package/release-manager/dist/update/console-surface.js.map +0 -1
- package/release-manager/dist/update/data-compatibility.d.ts +0 -35
- package/release-manager/dist/update/data-compatibility.d.ts.map +0 -1
- package/release-manager/dist/update/data-compatibility.js +0 -45
- package/release-manager/dist/update/data-compatibility.js.map +0 -1
- package/release-manager/dist/update/install-layout.d.ts +0 -105
- package/release-manager/dist/update/install-layout.d.ts.map +0 -1
- package/release-manager/dist/update/install-layout.js.map +0 -1
- package/release-manager/dist/update/product-identity.d.ts +0 -70
- package/release-manager/dist/update/product-identity.d.ts.map +0 -1
- package/release-manager/dist/update/product-identity.js.map +0 -1
- package/release-manager/dist/update/release-asset-manifest.d.ts +0 -31
- package/release-manager/dist/update/release-asset-manifest.d.ts.map +0 -1
- package/release-manager/dist/update/release-asset-manifest.js.map +0 -1
- package/release-manager/dist/update/release-identity.d.ts +0 -33
- package/release-manager/dist/update/release-identity.d.ts.map +0 -1
- package/release-manager/dist/update/release-identity.js.map +0 -1
- package/release-manager/dist/update/release-manager-authority.d.ts +0 -39
- package/release-manager/dist/update/release-manager-authority.d.ts.map +0 -1
- package/release-manager/dist/update/release-manager-authority.js.map +0 -1
- package/release-manager/dist/update/release-manager.d.ts +0 -156
- package/release-manager/dist/update/release-manager.d.ts.map +0 -1
- package/release-manager/dist/update/release-manager.js.map +0 -1
- package/release-manager/dist/update/release-metadata-publisher.d.ts +0 -199
- package/release-manager/dist/update/release-metadata-publisher.d.ts.map +0 -1
- package/release-manager/dist/update/release-metadata-publisher.js +0 -478
- package/release-manager/dist/update/release-metadata-publisher.js.map +0 -1
- package/release-manager/dist/update/release-metadata-source.d.ts +0 -85
- package/release-manager/dist/update/release-metadata-source.d.ts.map +0 -1
- package/release-manager/dist/update/release-metadata-source.js.map +0 -1
- package/release-manager/dist/update/release-metadata.d.ts +0 -60
- package/release-manager/dist/update/release-metadata.d.ts.map +0 -1
- package/release-manager/dist/update/release-metadata.js.map +0 -1
- package/release-manager/dist/update/release-policy.d.ts +0 -51
- package/release-manager/dist/update/release-policy.d.ts.map +0 -1
- package/release-manager/dist/update/release-policy.js.map +0 -1
- package/release-manager/dist/update/rollback-policy.d.ts +0 -56
- package/release-manager/dist/update/rollback-policy.d.ts.map +0 -1
- package/release-manager/dist/update/rollback-policy.js +0 -61
- package/release-manager/dist/update/rollback-policy.js.map +0 -1
- package/release-manager/dist/update/transaction-journal.d.ts +0 -212
- package/release-manager/dist/update/transaction-journal.d.ts.map +0 -1
- package/release-manager/dist/update/transaction-journal.js.map +0 -1
- package/release-manager/dist/update/trust-metadata.d.ts +0 -55
- package/release-manager/dist/update/trust-metadata.d.ts.map +0 -1
- package/release-manager/dist/update/trust-metadata.js.map +0 -1
- package/release-manager/dist/update/trust-root-provisioning.d.ts +0 -99
- package/release-manager/dist/update/trust-root-provisioning.d.ts.map +0 -1
- package/release-manager/dist/update/trust-root-provisioning.js.map +0 -1
- package/release-manager/dist/update/update-history.d.ts +0 -46
- package/release-manager/dist/update/update-history.d.ts.map +0 -1
- package/release-manager/dist/update/update-history.js +0 -123
- package/release-manager/dist/update/update-history.js.map +0 -1
- package/release-manager/dist/utils/config-file-io.d.ts +0 -34
- package/release-manager/dist/utils/config-file-io.d.ts.map +0 -1
- package/release-manager/dist/utils/config-file-io.js.map +0 -1
- package/release-manager/dist/utils/env.d.ts +0 -94
- package/release-manager/dist/utils/env.d.ts.map +0 -1
- package/release-manager/dist/utils/env.js.map +0 -1
- package/release-manager/dist/utils/logger.d.ts +0 -15
- package/release-manager/dist/utils/logger.d.ts.map +0 -1
- package/release-manager/dist/utils/logger.js.map +0 -1
- package/release-manager/dist/utils/workspace-divergence.d.ts +0 -36
- package/release-manager/dist/utils/workspace-divergence.d.ts.map +0 -1
- package/release-manager/dist/utils/workspace-divergence.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export declare function PrinciplesPage(): import("react").JSX.Element;
|
|
@@ -1,327 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { useState, useEffect, useCallback, useRef } from "react";
|
|
3
|
-
import { Link, useSearchParams } from "react-router-dom";
|
|
4
|
-
import { useTranslation } from "react-i18next";
|
|
5
|
-
import { PageShell } from "../../components/layout/page-shell.js";
|
|
6
|
-
import { SectionTitle } from "../../components/layout/section-title.js";
|
|
7
|
-
import { Button } from "../../components/ui/button.js";
|
|
8
|
-
import { Skeleton } from "../../components/ui/skeleton.js";
|
|
9
|
-
import { ShinyText } from "../../components/ui/shiny-text.js";
|
|
10
|
-
import { fetchPrinciples, fetchApprovalsGrouped, fetchOwnerDecisionLibrary, } from "../../api.js";
|
|
11
|
-
import { enumLabel } from "../../utils/enum-labels.js";
|
|
12
|
-
import { splitReadingTitleBody, truncateByCodePoints } from "../../utils/reading-layout.js";
|
|
13
|
-
import { formatDate } from "../../utils/format-date.js";
|
|
14
|
-
import { PrinciplesViewNav } from "./PrinciplesViewNav.js";
|
|
15
|
-
// ── Map principle status to review status ───────────────────────────────────
|
|
16
|
-
function toReviewStatus(principleStatus, approvalStatus) {
|
|
17
|
-
if (approvalStatus === "approved")
|
|
18
|
-
return "approved";
|
|
19
|
-
if (approvalStatus === "rejected")
|
|
20
|
-
return "rejected";
|
|
21
|
-
if (principleStatus === "active")
|
|
22
|
-
return "approved";
|
|
23
|
-
if (principleStatus === "archived")
|
|
24
|
-
return "parked";
|
|
25
|
-
if (principleStatus === "deprecated")
|
|
26
|
-
return "rejected";
|
|
27
|
-
// PRI-629 INV-02: candidate/probation 是生命周期(内化进行中),不是"待你
|
|
28
|
-
// 审查"。真实 Owner 决策只在治理焦点 Owner Inbox 呈现。
|
|
29
|
-
return "candidate";
|
|
30
|
-
}
|
|
31
|
-
// ── Status visual mapping ───────────────────────────────────────────────────
|
|
32
|
-
const STATUS_BORDER = {
|
|
33
|
-
pending: "border-l-gov",
|
|
34
|
-
candidate: "border-l-ink-3",
|
|
35
|
-
approved: "border-l-green",
|
|
36
|
-
rejected: "border-l-danger",
|
|
37
|
-
parked: "border-l-ink-3",
|
|
38
|
-
};
|
|
39
|
-
const STATUS_TEXT = {
|
|
40
|
-
pending: "text-gov",
|
|
41
|
-
candidate: "text-ink-3",
|
|
42
|
-
approved: "text-green",
|
|
43
|
-
rejected: "text-danger",
|
|
44
|
-
parked: "text-ink-3",
|
|
45
|
-
};
|
|
46
|
-
const CHANNEL_LABELS = {
|
|
47
|
-
prompt: "channelPrompt",
|
|
48
|
-
defer_archive: "channelDeferArchive",
|
|
49
|
-
code_tool_hook: "channelCodeToolHook",
|
|
50
|
-
};
|
|
51
|
-
// ── PRI-558: timeline node fill + status-driven copy (theme tokens, dark-mode safe) ──
|
|
52
|
-
const STATUS_DOT_BG = {
|
|
53
|
-
pending: "bg-gov",
|
|
54
|
-
candidate: "bg-ink-3",
|
|
55
|
-
approved: "bg-green",
|
|
56
|
-
rejected: "bg-danger",
|
|
57
|
-
parked: "bg-ink-3",
|
|
58
|
-
};
|
|
59
|
-
// Governance decision row mirrors the true review status — rejected/parked must
|
|
60
|
-
// not read as "awaiting review" (labels reuse the existing status* keys).
|
|
61
|
-
const GOV_DECISION = {
|
|
62
|
-
approved: { glyph: "✓", labelKey: "principles.govApproved" },
|
|
63
|
-
pending: { glyph: "⏳", labelKey: "principles.govPending" },
|
|
64
|
-
candidate: { glyph: "○", labelKey: "principles.statusCandidate" },
|
|
65
|
-
rejected: { glyph: "✗", labelKey: "principles.statusRejected" },
|
|
66
|
-
parked: { glyph: "⏸", labelKey: "principles.statusParked" },
|
|
67
|
-
};
|
|
68
|
-
const BLOCK_IMPACT_KEY = {
|
|
69
|
-
approved: "principles.blockImpactActive",
|
|
70
|
-
pending: "principles.blockImpactPending",
|
|
71
|
-
candidate: "principles.blockImpactPending",
|
|
72
|
-
rejected: "principles.blockImpactRejected",
|
|
73
|
-
parked: "principles.blockImpactParked",
|
|
74
|
-
};
|
|
75
|
-
// Summary metric tile (one of the three numbers in the metrics bar)
|
|
76
|
-
function Metric({ num, label }) {
|
|
77
|
-
return (_jsxs("div", { className: "flex-1 min-w-[120px] px-4 py-3 border-r border-line last:border-r-0", children: [_jsx("div", { className: "font-mono text-[22px] font-semibold text-gov leading-none", children: num }), _jsx("div", { className: "font-mono text-[11px] uppercase tracking-[0.02em] text-ink-3 mt-1.5", children: label })] }));
|
|
78
|
-
}
|
|
79
|
-
// Evolution block rendered under each principle card
|
|
80
|
-
function EvolutionBlock({ label, children }) {
|
|
81
|
-
return (_jsxs("div", { className: "mt-3 pt-3 border-t border-line/60", children: [_jsx("div", { className: "font-mono text-[11px] uppercase tracking-[0.02em] text-ink-4 mb-1", children: label }), _jsx("div", { className: "text-ink-3 text-[13px] leading-relaxed", children: children })] }));
|
|
82
|
-
}
|
|
83
|
-
// ── Runtime validation helpers (H section) ──────────────────────────────────
|
|
84
|
-
function isString(v) {
|
|
85
|
-
return typeof v === "string";
|
|
86
|
-
}
|
|
87
|
-
function isRecord(v) {
|
|
88
|
-
return typeof v === "object" && v !== null && !Array.isArray(v);
|
|
89
|
-
}
|
|
90
|
-
function isStringArray(v) {
|
|
91
|
-
return Array.isArray(v) && v.every(isString);
|
|
92
|
-
}
|
|
93
|
-
function validatePrinciplesData(data) {
|
|
94
|
-
if (!isRecord(data))
|
|
95
|
-
return null;
|
|
96
|
-
if (!Object.hasOwn(data, "principles") || !Array.isArray(data.principles))
|
|
97
|
-
return null;
|
|
98
|
-
// Validate each principle element has required string fields
|
|
99
|
-
for (const item of data.principles) {
|
|
100
|
-
if (!isRecord(item))
|
|
101
|
-
return null;
|
|
102
|
-
if (!Object.hasOwn(item, "id") || !isString(item.id))
|
|
103
|
-
return null;
|
|
104
|
-
if (!Object.hasOwn(item, "text") || !isString(item.text))
|
|
105
|
-
return null;
|
|
106
|
-
if (!Object.hasOwn(item, "status") || !isString(item.status))
|
|
107
|
-
return null;
|
|
108
|
-
if (!Object.hasOwn(item, "updatedAt") || !isString(item.updatedAt))
|
|
109
|
-
return null;
|
|
110
|
-
if (!Object.hasOwn(item, "createdAt") || !isString(item.createdAt))
|
|
111
|
-
return null;
|
|
112
|
-
}
|
|
113
|
-
return data;
|
|
114
|
-
}
|
|
115
|
-
function validateApprovalsGrouped(data) {
|
|
116
|
-
if (!isRecord(data))
|
|
117
|
-
return null;
|
|
118
|
-
if (!Object.hasOwn(data, "groups") || !Array.isArray(data.groups))
|
|
119
|
-
return null;
|
|
120
|
-
// Validate each group element
|
|
121
|
-
for (const g of data.groups) {
|
|
122
|
-
if (!isRecord(g))
|
|
123
|
-
return null;
|
|
124
|
-
if (!Object.hasOwn(g, "principleId") || !isString(g.principleId))
|
|
125
|
-
return null;
|
|
126
|
-
if (!Object.hasOwn(g, "status") || !isString(g.status))
|
|
127
|
-
return null;
|
|
128
|
-
if (!Object.hasOwn(g, "records") || !Array.isArray(g.records))
|
|
129
|
-
return null;
|
|
130
|
-
for (const r of g.records) {
|
|
131
|
-
if (!isRecord(r))
|
|
132
|
-
return null;
|
|
133
|
-
if (!Object.hasOwn(r, "id") || !isString(r.id))
|
|
134
|
-
return null;
|
|
135
|
-
if (!Object.hasOwn(r, "channel") || !isString(r.channel))
|
|
136
|
-
return null;
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
return data;
|
|
140
|
-
}
|
|
141
|
-
// ── Component ───────────────────────────────────────────────────────────────
|
|
142
|
-
export function PrinciplesPage() {
|
|
143
|
-
const { t, i18n } = useTranslation("pages");
|
|
144
|
-
const [principles, setPrinciples] = useState([]);
|
|
145
|
-
const [approvalGroups, setApprovalGroups] = useState([]);
|
|
146
|
-
const [loading, setLoading] = useState(true);
|
|
147
|
-
const [error, setError] = useState(null);
|
|
148
|
-
// PRI-558: summary powers the metrics bar (already returned by /api/principles)
|
|
149
|
-
const [summary, setSummary] = useState(null);
|
|
150
|
-
// Search / filter / sort
|
|
151
|
-
const [searchParams, setSearchParams] = useSearchParams();
|
|
152
|
-
const updateQuery = (key, value) => { const next = new URLSearchParams(searchParams); next.set(key, value); setSearchParams(next, { replace: true, preventScrollReset: true }); };
|
|
153
|
-
const search = searchParams.get('q') ?? '';
|
|
154
|
-
const setSearch = (value) => updateQuery('q', value);
|
|
155
|
-
const statusParam = searchParams.get('status');
|
|
156
|
-
const statusFilter = statusParam === 'pending' || statusParam === 'candidate' || statusParam === 'approved' || statusParam === 'rejected' || statusParam === 'parked' ? statusParam : 'all';
|
|
157
|
-
const setStatusFilter = (value) => updateQuery('status', value);
|
|
158
|
-
const sortBy = searchParams.get('sort') === 'createdAt' ? 'createdAt' : 'updatedAt';
|
|
159
|
-
const setSortBy = (value) => updateQuery('sort', value);
|
|
160
|
-
// PRI-629 (INV-02): 默认展示全部 — candidate 是生命周期而非待办,
|
|
161
|
-
// "只看待决策"不再作为默认视图 (真实决策在治理焦点)。
|
|
162
|
-
const filterMode = searchParams.get('mode') === 'actionable' ? 'actionable' : 'all';
|
|
163
|
-
const setFilterMode = (value) => updateQuery('mode', value);
|
|
164
|
-
const [categories, setCategories] = useState();
|
|
165
|
-
// Owner Decision Experience v1: backend semantic titles + decision states
|
|
166
|
-
// (display-only — the page never re-derives decision qualification).
|
|
167
|
-
const [ownerDecisionLibrary, setOwnerDecisionLibrary] = useState(null);
|
|
168
|
-
// PRI-956 (F15, D3): runtime status cannot be confirmed when set
|
|
169
|
-
const [revocationUnavailable, setRevocationUnavailable] = useState(null);
|
|
170
|
-
const requestEpoch = useRef(0);
|
|
171
|
-
// Fetch data
|
|
172
|
-
const loadData = useCallback(async () => {
|
|
173
|
-
const epoch = ++requestEpoch.current;
|
|
174
|
-
setLoading(true);
|
|
175
|
-
setError(null);
|
|
176
|
-
try {
|
|
177
|
-
const [pResult, aResult, dResult] = await Promise.all([
|
|
178
|
-
fetchPrinciples(filterMode),
|
|
179
|
-
fetchApprovalsGrouped(),
|
|
180
|
-
fetchOwnerDecisionLibrary(),
|
|
181
|
-
]);
|
|
182
|
-
if (epoch !== requestEpoch.current)
|
|
183
|
-
return;
|
|
184
|
-
setOwnerDecisionLibrary(dResult.success && dResult.data ? dResult.data : null);
|
|
185
|
-
if (!pResult.success) {
|
|
186
|
-
setError(pResult.error ?? "Failed to load principles");
|
|
187
|
-
return;
|
|
188
|
-
}
|
|
189
|
-
const pData = validatePrinciplesData(pResult.data);
|
|
190
|
-
if (!pData) {
|
|
191
|
-
setError("Invalid principles data received");
|
|
192
|
-
return;
|
|
193
|
-
}
|
|
194
|
-
setPrinciples(pData.principles);
|
|
195
|
-
// PRI-330: Store categories for UI display
|
|
196
|
-
setCategories(pData.categories);
|
|
197
|
-
// PRI-558: expose summary for the metrics bar
|
|
198
|
-
setSummary(pData.summary);
|
|
199
|
-
// PRI-956 (F15, D3): propagate revocation check unavailability
|
|
200
|
-
setRevocationUnavailable(pData.revocationCheckUnavailable ?? null);
|
|
201
|
-
const aData = aResult.success ? validateApprovalsGrouped(aResult.data) : null;
|
|
202
|
-
setApprovalGroups(aData?.groups ?? []);
|
|
203
|
-
}
|
|
204
|
-
catch (err) {
|
|
205
|
-
if (epoch !== requestEpoch.current)
|
|
206
|
-
return;
|
|
207
|
-
setError(err instanceof Error ? err.message : "Unknown error");
|
|
208
|
-
}
|
|
209
|
-
finally {
|
|
210
|
-
if (epoch === requestEpoch.current)
|
|
211
|
-
setLoading(false);
|
|
212
|
-
}
|
|
213
|
-
}, [filterMode]);
|
|
214
|
-
useEffect(() => {
|
|
215
|
-
void loadData();
|
|
216
|
-
return () => { requestEpoch.current++; };
|
|
217
|
-
}, [loadData]);
|
|
218
|
-
// Build approval lookup
|
|
219
|
-
const approvalByPrinciple = new Map();
|
|
220
|
-
for (const g of approvalGroups) {
|
|
221
|
-
approvalByPrinciple.set(g.principleId, g);
|
|
222
|
-
}
|
|
223
|
-
// Merge principle + approval data into cards
|
|
224
|
-
const cards = principles.map((p) => {
|
|
225
|
-
const ag = approvalByPrinciple.get(p.id);
|
|
226
|
-
const channels = ag
|
|
227
|
-
? ag.records.map((r) => r.channel).filter(isString)
|
|
228
|
-
: ["prompt"];
|
|
229
|
-
const uniqueChannels = [...new Set(channels)];
|
|
230
|
-
// Owner Decision Experience v1 (SPEC §10/§11.2): the card title comes
|
|
231
|
-
// from the backend Semantic Selector; when no readable principle exists
|
|
232
|
-
// the card shows a NEUTRAL placeholder — the technical trigger/original
|
|
233
|
-
// text stays reachable in the collapsed details below (never the title).
|
|
234
|
-
const decision = ownerDecisionLibrary?.entries[p.id];
|
|
235
|
-
const semanticTitle = decision?.learnedPrinciple.status === 'known' ? decision.learnedPrinciple.text : undefined;
|
|
236
|
-
// PRI-332: Determine display title with bounded fallback for unreadable titles
|
|
237
|
-
const rawTitle = p.triggerPattern || truncateByCodePoints(p.text, 80);
|
|
238
|
-
const detectedLang = p.detectedLanguage ?? 'unknown';
|
|
239
|
-
const readWarningCode = p.readabilityWarningCode;
|
|
240
|
-
let displayTitle = rawTitle;
|
|
241
|
-
let usedFallback = false;
|
|
242
|
-
if (semanticTitle !== undefined) {
|
|
243
|
-
displayTitle = semanticTitle;
|
|
244
|
-
usedFallback = rawTitle !== semanticTitle;
|
|
245
|
-
}
|
|
246
|
-
else if (readWarningCode || decision !== undefined) {
|
|
247
|
-
// No qualified semantic text: neutral placeholder instead of a
|
|
248
|
-
// technical trigger as the Owner-facing title.
|
|
249
|
-
displayTitle = t("principles.readabilityFallbackTitle");
|
|
250
|
-
usedFallback = true;
|
|
251
|
-
}
|
|
252
|
-
return {
|
|
253
|
-
principleId: p.id,
|
|
254
|
-
title: splitReadingTitleBody(displayTitle).title,
|
|
255
|
-
searchText: semanticTitle ?? rawTitle,
|
|
256
|
-
originalTitle: rawTitle,
|
|
257
|
-
titleUsedFallback: usedFallback,
|
|
258
|
-
text: p.text,
|
|
259
|
-
action: p.action,
|
|
260
|
-
status: toReviewStatus(p.status, ag?.status),
|
|
261
|
-
channels: uniqueChannels,
|
|
262
|
-
evaluability: p.evaluability,
|
|
263
|
-
decisionState: decision?.decisionState,
|
|
264
|
-
runtimeDeactivated: p.runtimeDeactivated === true,
|
|
265
|
-
updatedAt: p.updatedAt,
|
|
266
|
-
createdAt: p.createdAt,
|
|
267
|
-
priority: p.priority,
|
|
268
|
-
detectedLanguage: detectedLang,
|
|
269
|
-
readabilityWarningCode: readWarningCode,
|
|
270
|
-
};
|
|
271
|
-
});
|
|
272
|
-
// Filter + sort
|
|
273
|
-
const filtered = cards
|
|
274
|
-
.filter((c) => {
|
|
275
|
-
if (statusFilter !== "all" && c.status !== statusFilter)
|
|
276
|
-
return false;
|
|
277
|
-
if (search) {
|
|
278
|
-
const q = search.toLowerCase();
|
|
279
|
-
if (!c.text.toLowerCase().includes(q) && !c.title.toLowerCase().includes(q) && !c.searchText.toLowerCase().includes(q))
|
|
280
|
-
return false;
|
|
281
|
-
}
|
|
282
|
-
return true;
|
|
283
|
-
})
|
|
284
|
-
.sort((a, b) => {
|
|
285
|
-
const key = sortBy === "updatedAt" ? "updatedAt" : "createdAt";
|
|
286
|
-
return new Date(b[key]).getTime() - new Date(a[key]).getTime();
|
|
287
|
-
});
|
|
288
|
-
const statusFilters = [
|
|
289
|
-
{ value: "all", label: t("principles.allStatuses") },
|
|
290
|
-
{ value: "pending", label: t("principles.statusPending") },
|
|
291
|
-
{ value: "approved", label: t("principles.statusApproved") },
|
|
292
|
-
{ value: "rejected", label: t("principles.statusRejected") },
|
|
293
|
-
{ value: "parked", label: t("principles.statusParked") },
|
|
294
|
-
];
|
|
295
|
-
// PRI-558: most recent update across loaded principles (drives "Last Updated" metric)
|
|
296
|
-
const latestUpdatedAt = principles.reduce((max, p) => (new Date(p.updatedAt).getTime() > new Date(max).getTime() ? p.updatedAt : max), principles[0]?.updatedAt ?? "");
|
|
297
|
-
return (_jsxs(PageShell, { children: [revocationUnavailable && (_jsx("div", { className: "mb-4 p-3 bg-amber-50 border border-amber-300 rounded-[var(--radius-md)] text-sm text-amber-800", children: t("principles.revocationStatusUnknown") })), _jsx(SectionTitle, { children: t("principles.reviewTitle") }), _jsx(ShinyText, { as: "h1", className: "text-[29px] font-semibold tracking-tight text-ink mb-2", duration: 4.5, brightness: 0.5, disabled: !(filterMode === 'actionable' && (categories?.owner_actionable ?? 0) > 0), children: t("principles.reviewSubtitle") }), _jsx("p", { className: "text-ink-3 text-[14px] leading-relaxed mb-6", children: t("principles.reviewDescription") }), _jsx(PrinciplesViewNav, { view: "workspace" }), _jsxs("div", { className: "flex flex-wrap items-center gap-3 mb-6", children: [_jsxs("div", { className: "flex gap-1", role: "group", "aria-label": "Filter mode", children: [_jsxs("button", { onClick: () => setFilterMode('actionable'), className: "font-mono text-[11px] uppercase tracking-[0.02em] border rounded-[2px] px-2 py-1 transition-colors focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-gov " +
|
|
298
|
-
(filterMode === 'actionable'
|
|
299
|
-
? "bg-gov text-paper border-gov"
|
|
300
|
-
: "bg-surface text-ink-3 border-line hover:border-line-2"), children: [t("principles.filterActionable", { defaultValue: "Actionable" }), categories?.owner_actionable ? ` (${categories.owner_actionable})` : ''] }), _jsxs("button", { onClick: () => setFilterMode('all'), className: "font-mono text-[11px] uppercase tracking-[0.02em] border rounded-[2px] px-2 py-1 transition-colors focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-gov " +
|
|
301
|
-
(filterMode === 'all'
|
|
302
|
-
? "bg-gov text-paper border-gov"
|
|
303
|
-
: "bg-surface text-ink-3 border-line hover:border-line-2"), children: [t("principles.filterAll", { defaultValue: "Show All" }), categories ? ` (${Object.values(categories).reduce((a, b) => a + b, 0)})` : ''] })] }), _jsx("input", { type: "text", value: search, onChange: (e) => setSearch(e.target.value), placeholder: t("principles.searchPlaceholder"), className: "flex-1 min-w-[200px] border border-line rounded-[var(--radius-md)] bg-surface text-ink px-3 py-2 text-[13px] focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-gov", "aria-label": t("principles.searchPlaceholder") }), _jsx("div", { className: "flex gap-1", role: "group", "aria-label": "Status filter", children: statusFilters.map((sf) => (_jsx("button", { onClick: () => setStatusFilter(sf.value), className: "font-mono text-[11px] uppercase tracking-[0.02em] border rounded-[2px] px-2 py-1 transition-colors focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-gov " +
|
|
304
|
-
(statusFilter === sf.value
|
|
305
|
-
? "bg-gov text-paper border-gov"
|
|
306
|
-
: "bg-surface text-ink-3 border-line hover:border-line-2"), children: sf.label }, sf.value))) }), _jsxs("select", { value: sortBy, onChange: (e) => setSortBy(e.target.value), className: "border border-line rounded-[var(--radius-md)] bg-surface text-ink-3 px-2 py-1 text-[12px] font-mono focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-gov", "aria-label": "Sort order", children: [_jsx("option", { value: "updatedAt", children: t("principles.sortByUpdated") }), _jsx("option", { value: "createdAt", children: t("principles.sortByCreated") })] })] }), !loading && !error && summary && (_jsxs("details", { className: "mb-6 text-[12px] text-ink-3", "data-testid": "principle-library-overview", children: [_jsx("summary", { className: "cursor-pointer text-gov", children: t('principles.libraryOverview') }), _jsxs("div", { className: "mt-3 flex flex-wrap border border-line rounded-[var(--radius-md)] bg-panel overflow-hidden", children: [_jsx(Metric, { num: String(summary.total), label: t("principles.metricDeposited") }), _jsx(Metric, { num: String(summary.active), label: t("principles.metricActive") }), _jsx(Metric, { num: latestUpdatedAt ? formatDate(latestUpdatedAt, i18n.language) : "—", label: t("principles.metricLatest") })] })] })), loading && (_jsx("div", { className: "grid gap-3 animate-[pdFadeIn_200ms_ease-out]", role: "status", "aria-live": "polite", "aria-label": t("principles.loading", { defaultValue: "Loading…" }), children: Array.from({ length: 4 }).map((_, i) => (_jsxs("div", { className: "bg-panel border border-line rounded-[var(--radius-md)] p-4 border-l-[3px] border-l-transparent", children: [_jsxs("div", { className: "flex items-start justify-between gap-3 mb-3", children: [_jsx(Skeleton, { className: "h-5 w-[55%] rounded-sm" }), _jsx(Skeleton, { className: "h-5 w-16 rounded-[2px]" })] }), _jsx(Skeleton, { className: "h-4 w-full rounded-sm mb-2" }), _jsx(Skeleton, { className: "h-4 w-[80%] rounded-sm mb-4" }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Skeleton, { className: "h-3.5 w-20 rounded-sm" }), _jsx(Skeleton, { className: "h-3.5 w-24 rounded-sm" })] })] }, i))) })), error && (_jsxs("div", { className: "border border-danger/30 rounded-[var(--radius-md)] p-4 mb-4", children: [_jsx("p", { className: "text-danger text-sm", children: error }), _jsx(Button, { variant: "outline", size: "sm", onClick: loadData, className: "mt-2", children: t("principles.retry", { defaultValue: "Retry" }) })] })), !loading && !error && filtered.length === 0 && principles.length === 0 && (_jsxs("div", { className: "text-center py-12", children: [_jsx("h2", { className: "text-ink-2 text-lg font-semibold mb-2", children: t("principles.emptyTitle") }), _jsx("p", { className: "text-ink-3 text-[14px] max-w-[480px] mx-auto leading-relaxed", children: filterMode === 'actionable'
|
|
307
|
-
? t("principles.emptyActionable", { defaultValue: "No owner-actionable principles at this time. When PD captures behavior deviation signals, principle candidates will appear here for your review." })
|
|
308
|
-
: t("principles.emptyDescription") }), categories && filterMode === 'actionable' && (_jsx("div", { className: "flex justify-center gap-2 flex-wrap mt-4", children: Object.entries(categories).map(([cat, count]) => (_jsxs("span", { className: "font-mono text-[11px] uppercase tracking-[0.02em] border border-line rounded-[2px] px-2 py-0.5 text-ink-4", children: [cat, ": ", count] }, cat))) }))] })), !loading && !error && filtered.length === 0 && principles.length > 0 && (_jsx("p", { className: "text-ink-3 text-sm", children: t("principles.noResults") })), !loading && !error && filtered.length > 0 && (_jsxs("div", { className: "relative pl-6 grid gap-3 animate-[pdFadeIn_400ms_ease-out]", children: [_jsx("span", { className: "absolute left-[12.5px] top-3 bottom-3 w-px bg-line", "aria-hidden": "true" }), filtered.map((card) => {
|
|
309
|
-
const ag = approvalByPrinciple.get(card.principleId);
|
|
310
|
-
const decision = GOV_DECISION[card.status];
|
|
311
|
-
const decisionRecord = ag?.records?.find((r) => r.status === ag.status) ?? ag?.records?.[0];
|
|
312
|
-
const decisionDate = decisionRecord?.createdAt;
|
|
313
|
-
return (_jsxs("article", { className: "relative bg-panel border border-line rounded-[var(--radius-md)] p-5 " +
|
|
314
|
-
"border-l-[3px] " +
|
|
315
|
-
STATUS_BORDER[card.status] + " " +
|
|
316
|
-
"transition-[border-color,background,transform] duration-150 " +
|
|
317
|
-
"hover:border-line-2 " +
|
|
318
|
-
"focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-gov", children: [_jsx("span", { className: "absolute -left-[19px] top-4 h-2.5 w-2.5 rounded-full border-2 border-paper " +
|
|
319
|
-
STATUS_DOT_BG[card.status], "aria-hidden": "true" }), _jsxs("div", { className: "mb-2 flex flex-wrap items-start justify-between gap-3", children: [_jsx("h3", { className: "min-w-0 flex-1 text-[15px] font-semibold leading-relaxed text-ink", children: _jsx(Link, { className: "rounded-sm hover:text-gov focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-gov", to: `/principles/${card.principleId}`, state: { returnTo: `/principles?${searchParams}` }, children: card.title }) }), _jsx("span", { className: `rounded-[2px] border px-2 py-1 text-[11px] ${STATUS_TEXT[card.status]}`, children: card.decisionState !== undefined ? t(`principles.ownerDecision.state.${card.decisionState}`, { defaultValue: card.decisionState }) : t(decision.labelKey) })] }), card.readabilityWarningCode && (_jsx("div", { className: "mb-2 px-3 py-1.5 bg-amber/5 border border-amber/20 rounded-[3px] text-ink-3 text-[12px] leading-snug", children: t("principles.readabilityWarning." + card.readabilityWarningCode, { defaultValue: t("principles.readabilityFallbackTitle") }) })), card.text.trim() !== card.title.trim() && _jsx("p", { className: "text-ink-3 text-[13px] line-clamp-2 leading-relaxed", children: card.text }), card.runtimeDeactivated === true && _jsx("p", { className: "mt-3 text-[12px] text-amber", role: "status", children: t('principles.runtimeDeactivated') }), _jsxs("details", { className: "mt-4 border-t border-line/60 pt-3", "data-testid": "principle-context-disclosure", children: [_jsx("summary", { className: "cursor-pointer text-[12px] text-gov", children: t('principles.contextDisclosure') }), _jsxs("div", { className: "mt-4 space-y-3", children: [_jsxs("div", { className: "flex items-center gap-2 mb-2 flex-wrap", children: [_jsx("span", { className: "font-mono text-[11px] uppercase tracking-[0.02em] border rounded-[2px] px-2 py-0.5 " +
|
|
320
|
-
STATUS_TEXT[card.status] +
|
|
321
|
-
" border-current/20", children: t("principles.status" + card.status.charAt(0).toUpperCase() + card.status.slice(1)) }), card.channels.map((ch) => (_jsx("span", { className: "font-mono text-[11px] uppercase tracking-[0.02em] border border-line rounded-[2px] px-2 py-0.5 text-ink-3", children: enumLabel('channel', ch, t) }, ch))), card.detectedLanguage && card.detectedLanguage !== 'unknown' && (_jsx("span", { className: "font-mono text-[11px] tracking-[0.02em] border border-line rounded-[2px] px-2 py-0.5 text-ink-4", children: card.detectedLanguage === 'zh'
|
|
322
|
-
? t("principles.languageHintZh")
|
|
323
|
-
: t("principles.languageHintEn") })), _jsxs("span", { className: "font-mono text-[11px] text-ink-4", children: [t("principles.evaluabilityLabel", { defaultValue: "可评价性" }), ": ", enumLabel('evaluability', card.evaluability, t)] }), card.decisionState !== undefined && (_jsx("span", { className: "font-mono text-[11px] tracking-[0.02em] border border-line rounded-[2px] px-2 py-0.5 text-ink-4", children: t(`principles.ownerDecision.state.${card.decisionState}`, { defaultValue: card.decisionState }) }))] }), card.detectedLanguage && card.detectedLanguage !== 'unknown' && i18n.language && !i18n.language.startsWith(card.detectedLanguage) && (_jsx("div", { className: "mb-2 px-3 py-1.5 bg-surface/60 border-l-2 border-line rounded-[3px] text-ink-4 text-[12px] leading-snug", children: t("principles.languageMismatchHint", { lang: card.detectedLanguage === 'en' ? 'English' : '中文' }) })), card.titleUsedFallback && card.originalTitle && (_jsxs("details", { className: "mb-1", children: [_jsx("summary", { className: "text-ink-4 text-[11px] font-mono cursor-pointer hover:underline", children: t("principles.readabilityOriginalLabel") }), _jsx("div", { className: "text-ink-4 text-[12px] leading-snug mt-1 font-mono bg-surface/40 px-2 py-1 rounded-[3px] break-all", children: card.originalTitle })] })), _jsxs("p", { className: "font-mono text-[11px] text-ink-4 mt-2", children: [t("principles.updatedAt"), ": ", formatDate(card.updatedAt, i18n.language)] }), _jsx(EvolutionBlock, { label: t("principles.blockBasis"), children: t("principles.blockBasisFallback") }), _jsx(EvolutionBlock, { label: t("principles.blockImpact"), children: card.decisionState !== undefined
|
|
324
|
-
? t("principles.blockImpactSeeDecisionView", { defaultValue: "以详情页「当前实际执行」为准(本卡片不据此判断影响)。" })
|
|
325
|
-
: t(BLOCK_IMPACT_KEY[card.status]) }), _jsx(EvolutionBlock, { label: t("principles.blockBehavior"), children: card.action ? card.action : t("principles.blockBehaviorFallback") }), decisionDate && _jsxs("p", { className: "text-[11px] text-ink-4", children: [t('principles.govDecision'), ": ", formatDate(decisionDate, i18n.language)] })] })] }), _jsx(Link, { className: "mt-3 inline-block text-[12px] text-gov underline underline-offset-4", to: `/principles/${card.principleId}`, state: { returnTo: `/principles?${searchParams}` }, children: t('principles.openDetails') })] }, card.principleId));
|
|
326
|
-
})] }))] }));
|
|
327
|
-
}
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* PRI-641: internal navigation inside the Principles section — Workspace
|
|
3
|
-
* Principles vs the read-only PD Core Principles reference surface. The
|
|
4
|
-
* sidebar keeps a single "Principles" entry; this is the only extra nav.
|
|
5
|
-
*/
|
|
6
|
-
export declare function PrinciplesViewNav({ view }: {
|
|
7
|
-
view: "workspace" | "core";
|
|
8
|
-
}): import("react").JSX.Element;
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { Link } from "react-router-dom";
|
|
3
|
-
import { useTranslation } from "react-i18next";
|
|
4
|
-
/**
|
|
5
|
-
* PRI-641: internal navigation inside the Principles section — Workspace
|
|
6
|
-
* Principles vs the read-only PD Core Principles reference surface. The
|
|
7
|
-
* sidebar keeps a single "Principles" entry; this is the only extra nav.
|
|
8
|
-
*/
|
|
9
|
-
export function PrinciplesViewNav({ view }) {
|
|
10
|
-
const { t } = useTranslation("pages");
|
|
11
|
-
const base = "font-mono text-[11px] uppercase tracking-[0.02em] border rounded-[2px] px-2 py-1 transition-colors focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-gov ";
|
|
12
|
-
const active = "bg-gov text-paper border-gov";
|
|
13
|
-
const inactive = "bg-surface text-ink-3 border-line hover:border-line-2";
|
|
14
|
-
return (_jsxs("div", { className: "flex gap-1 mb-6", role: "group", "aria-label": t("principles.viewNavLabel"), children: [_jsx(Link, { to: "/principles", className: base + (view === "workspace" ? active : inactive), "aria-current": view === "workspace" ? "page" : undefined, children: t("principles.tabWorkspace") }), _jsx(Link, { to: "/principles/core", className: base + (view === "core" ? active : inactive), "aria-current": view === "core" ? "page" : undefined, children: t("principles.tabCore") })] }));
|
|
15
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export declare function ReportProblemPage(): import("react").JSX.Element;
|