@cosmicdrift/kumiko-samples 0.373.0 → 0.377.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/packages/bundled-features/package.json +6 -4
- package/packages/bundled-features/src/account-security/changes.json +6 -0
- package/packages/bundled-features/src/account-security/constants.ts +1 -0
- package/packages/bundled-features/src/account-security/index.ts +1 -0
- package/packages/bundled-features/src/admin-shell/web/client-plugin.tsx +1 -1
- package/packages/bundled-features/src/audit/web/client-plugin.tsx +1 -1
- package/packages/bundled-features/src/auth-email-password/changes.json +6 -0
- package/packages/bundled-features/src/auth-email-password/i18n.ts +1 -0
- package/packages/bundled-features/src/auth-email-password/mail-notifications.ts +1 -1
- package/packages/bundled-features/src/auth-email-password/web/auth-client.ts +1 -1
- package/packages/bundled-features/src/auth-email-password/web/auth-form-primitives.tsx +1 -1
- package/packages/bundled-features/src/auth-email-password/web/client-actions.ts +36 -0
- package/packages/bundled-features/src/auth-email-password/web/client-plugin.ts +7 -4
- package/packages/bundled-features/src/auth-email-password/web/default-topbar-actions.tsx +1 -1
- package/packages/bundled-features/src/auth-email-password/web/index.ts +1 -1
- package/packages/bundled-features/src/auth-email-password/web/session.tsx +1 -1
- package/packages/bundled-features/src/auth-email-password/web/tenant-menu-items.tsx +1 -1
- package/packages/bundled-features/src/auth-email-password/web/tenant-switcher.tsx +1 -1
- package/packages/bundled-features/src/auth-email-password/web/user-menu.tsx +1 -1
- package/packages/bundled-features/src/auth-foundation/changes.json +6 -0
- package/packages/bundled-features/src/auth-foundation/env.ts +27 -0
- package/packages/bundled-features/src/auth-foundation/index.ts +1 -0
- package/packages/bundled-features/src/billing-foundation/changes.json +6 -0
- package/packages/bundled-features/src/billing-foundation/consumer-protection/confirmation-mail.ts +1 -1
- package/packages/bundled-features/src/billing-foundation/consumer-protection/termination-pages.ts +1 -1
- package/packages/bundled-features/src/billing-foundation/contact-card.ts +14 -0
- package/packages/bundled-features/src/billing-foundation/handlers/billing-plans.query.ts +1 -1
- package/packages/bundled-features/src/billing-foundation/index.ts +1 -0
- package/packages/bundled-features/src/billing-foundation/plan-catalog.ts +1 -0
- package/packages/bundled-features/src/billing-foundation/types.ts +12 -0
- package/packages/bundled-features/src/billing-foundation/validate-options.ts +16 -0
- package/packages/bundled-features/src/billing-foundation/web/billing-contact-plan.tsx +32 -0
- package/packages/bundled-features/src/billing-foundation/web/billing-plans-panel.tsx +5 -15
- package/packages/bundled-features/src/billing-foundation/web/cancel-contract-dialog.tsx +2 -2
- package/packages/bundled-features/src/billing-foundation/web/checkout-consent-dialog.tsx +1 -1
- package/packages/bundled-features/src/billing-foundation/web/client-plugin.tsx +1 -1
- package/packages/bundled-features/src/billing-foundation/web/localized-params.ts +14 -0
- package/packages/bundled-features/src/cap-overview/changes.json +7 -0
- package/packages/bundled-features/src/cap-overview/handlers/tenant-caps-list.query.ts +15 -76
- package/packages/bundled-features/src/cap-overview/i18n.ts +0 -2
- package/packages/bundled-features/src/cap-overview/web/cap-cards-panel.tsx +3 -3
- package/packages/bundled-features/src/cap-overview/web/client-plugin.tsx +1 -1
- package/packages/bundled-features/src/channel-email/changes.json +6 -0
- package/packages/bundled-features/src/channel-email/email-channel.ts +2 -1
- package/packages/bundled-features/src/compliance-profiles/web/client-plugin.tsx +1 -1
- package/packages/bundled-features/src/config/feature.ts +2 -2
- package/packages/bundled-features/src/crypto-shredding/changes.json +6 -0
- package/packages/bundled-features/src/custom-fields/web/client-plugin.tsx +1 -1
- package/packages/bundled-features/src/delivery/unsubscribe-page.ts +1 -1
- package/packages/bundled-features/src/delivery/web/client-plugin.tsx +1 -1
- package/packages/bundled-features/src/delivery/web/delivery-status-cell.tsx +1 -1
- package/packages/bundled-features/src/feature-toggles/web/client-plugin.tsx +1 -1
- package/packages/bundled-features/src/file-provider-s3/changes.json +6 -0
- package/packages/bundled-features/src/file-provider-s3/env-named-feature.ts +45 -0
- package/packages/bundled-features/src/file-provider-s3/env-schema.ts +20 -13
- package/packages/bundled-features/src/file-provider-s3/index.ts +4 -0
- package/packages/bundled-features/src/folders/web/client-plugin.tsx +1 -1
- package/packages/bundled-features/src/folders/web/folder-section.tsx +3 -4
- package/packages/bundled-features/src/host-routing/README.md +7 -0
- package/packages/bundled-features/src/host-routing/changes.json +6 -0
- package/packages/bundled-features/src/host-routing/constants.ts +4 -0
- package/packages/bundled-features/src/host-routing/dispatch.ts +34 -26
- package/packages/bundled-features/src/host-routing/feature.ts +122 -41
- package/packages/bundled-features/src/host-routing/host.ts +28 -1
- package/packages/bundled-features/src/host-routing/index.ts +3 -0
- package/packages/bundled-features/src/host-routing/options.ts +45 -2
- package/packages/bundled-features/src/host-routing/redirects.ts +33 -0
- package/packages/bundled-features/src/host-routing/tenant-lookup.ts +65 -0
- package/packages/bundled-features/src/host-routing/validate-options.ts +48 -1
- package/packages/bundled-features/src/inbound-mail-foundation/changes.json +7 -0
- package/packages/bundled-features/src/inbound-mail-foundation/feature.ts +8 -0
- package/packages/bundled-features/src/inbound-mail-foundation/i18n.ts +42 -0
- package/packages/bundled-features/src/inbound-mail-foundation/index.ts +4 -0
- package/packages/bundled-features/src/inbound-mail-foundation/screens.ts +100 -0
- package/packages/bundled-features/src/inbound-mail-foundation/types.ts +2 -2
- package/packages/bundled-features/src/jobs/web/client-plugin.tsx +1 -1
- package/packages/bundled-features/src/legal-pages/changes.json +6 -0
- package/packages/bundled-features/src/legal-pages/feature.ts +14 -1
- package/packages/bundled-features/src/legal-pages/layout.ts +6 -6
- package/packages/bundled-features/src/legal-pages/web/client-plugin.ts +1 -1
- package/packages/bundled-features/src/mail-foundation/feature.ts +21 -22
- package/packages/bundled-features/src/managed-pages/web/client-plugin.tsx +1 -1
- package/packages/bundled-features/src/notes-history/web/client-plugin.tsx +1 -1
- package/packages/bundled-features/src/page-render/branding.ts +1 -1
- package/packages/bundled-features/src/page-render/layout.ts +2 -2
- package/packages/bundled-features/src/page-render/markdown.ts +1 -1
- package/packages/bundled-features/src/personal-access-tokens/i18n.ts +1 -1
- package/packages/bundled-features/src/personal-access-tokens/screens.ts +1 -1
- package/packages/bundled-features/src/secrets/feature.ts +4 -4
- package/packages/bundled-features/src/seo/sitemap.ts +1 -1
- package/packages/bundled-features/src/shared/mail-template-body.ts +1 -1
- package/packages/bundled-features/src/shared/purge-files-reaching-subject.ts +127 -2
- package/packages/bundled-features/src/tags/web/client-plugin.tsx +1 -1
- package/packages/bundled-features/src/template-resolver/changes.json +18 -0
- package/packages/bundled-features/src/template-resolver/document-blocks.ts +34 -0
- package/packages/bundled-features/src/template-resolver/document-ops.ts +515 -0
- package/packages/bundled-features/src/template-resolver/document-sanitizer.ts +9 -0
- package/packages/bundled-features/src/template-resolver/feature.ts +4 -0
- package/packages/bundled-features/src/template-resolver/handlers/bundle-import.ts +1 -0
- package/packages/bundled-features/src/template-resolver/handlers/document-base.ts +86 -0
- package/packages/bundled-features/src/template-resolver/handlers/document-blocks.query.ts +48 -0
- package/packages/bundled-features/src/template-resolver/handlers/export-bundle.query.ts +11 -3
- package/packages/bundled-features/src/template-resolver/handlers/patch-draft.write.ts +125 -0
- package/packages/bundled-features/src/template-resolver/handlers/preview.query.ts +2 -1
- package/packages/bundled-features/src/template-resolver/handlers/send-test.write.ts +2 -1
- package/packages/bundled-features/src/template-resolver/handlers/template-write.ts +22 -1
- package/packages/bundled-features/src/template-resolver/handlers/validate.query.ts +24 -9
- package/packages/bundled-features/src/template-resolver/{web/placeholder-text.ts → placeholder-text.ts} +1 -1
- package/packages/bundled-features/src/template-resolver/qualified-names.ts +2 -0
- package/packages/bundled-features/src/template-resolver/seeding.ts +3 -1
- package/packages/bundled-features/src/template-resolver/template-bundle.ts +6 -1
- package/packages/bundled-features/src/template-resolver/template-preview.ts +24 -8
- package/packages/bundled-features/src/template-resolver/template-validation.ts +1 -1
- package/packages/bundled-features/src/template-resolver/web/client-plugin.tsx +3 -3
- package/packages/bundled-features/src/template-resolver/web/document-tiptap-editor.tsx +1 -1
- package/packages/bundled-features/src/template-resolver/web/document-toolbar-blocks.ts +7 -33
- package/packages/bundled-features/src/template-resolver/web/i18n.ts +24 -0
- package/packages/bundled-features/src/template-resolver/web/placeholder-line-editor.tsx +2 -2
- package/packages/bundled-features/src/tenant/web/client-plugin.tsx +1 -1
- package/packages/bundled-features/src/tenant/web/member-status-cell.tsx +1 -1
- package/packages/bundled-features/src/tier-engine/web/client-plugin.tsx +1 -1
- package/packages/bundled-features/src/user-data-rights/changes.json +6 -0
- package/packages/bundled-features/src/user-data-rights/env.ts +15 -0
- package/packages/bundled-features/src/user-data-rights/feature.ts +4 -2
- package/packages/bundled-features/src/user-data-rights/index.ts +1 -0
- package/packages/bundled-features/src/user-data-rights/lib/mail-transport-resolver.ts +1 -1
- package/packages/bundled-features/src/user-data-rights/lib/storage-provider-resolver.ts +1 -1
- package/packages/bundled-features/src/user-data-rights/mail-notifications.ts +1 -1
- package/packages/bundled-features/src/user-data-rights/web/client-plugin.tsx +1 -1
- package/packages/bundled-features/src/user-data-rights/web/privacy-center-screen.tsx +2 -2
- package/packages/bundled-features/src/waitlist/changes.json +6 -0
- package/packages/bundled-features/src/waitlist/legacy-migrate.ts +51 -2
- package/samples/apps/admin-console/package.json +0 -3
- package/samples/apps/admin-console/src/app/client.tsx +1 -1
- package/samples/apps/admin-console/src/app/shell.tsx +1 -1
- package/samples/apps/config-demo/package.json +1 -3
- package/samples/apps/config-demo/src/app/client.tsx +1 -1
- package/samples/apps/config-demo/src/app/shell.tsx +2 -2
- package/samples/apps/config-demo/src/features/demo/web/index.ts +1 -1
- package/samples/apps/config-demo/tsconfig.json +0 -12
- package/samples/apps/marketing-demo/package.json +1 -3
- package/samples/apps/marketing-demo/src/app/client.tsx +1 -1
- package/samples/apps/marketing-demo/src/app/shell.tsx +1 -1
- package/samples/apps/marketing-demo/src/features/assets/web/index.ts +1 -1
- package/samples/apps/marketing-demo/src/features/helpdesk/web/index.ts +1 -1
- package/samples/apps/showcase/package.json +1 -3
- package/samples/apps/showcase/src/app/client.tsx +1 -1
- package/samples/apps/showcase/src/app/shell.tsx +1 -1
- package/samples/apps/showcase/src/features/demos/web/index.ts +1 -1
- package/samples/apps/showcase/src/features/demos/web/pages/sidebar-panel.tsx +1 -1
- package/samples/apps/showcase/src/features/demos/web/pages/toast.tsx +1 -1
- package/samples/apps/showcase/src/features/items/web/index.ts +1 -1
- package/samples/apps/styleguide/package.json +1 -3
- package/samples/apps/styleguide/src/app/client.tsx +1 -1
- package/samples/apps/styleguide/src/app/shell.tsx +2 -2
- package/samples/apps/styleguide/src/features/ai-settings/web.ts +1 -1
- package/samples/apps/styleguide/src/features/content/web.tsx +2 -2
- package/samples/apps/styleguide/src/features/demo/web.ts +1 -1
- package/samples/apps/styleguide/src/features/examples/web.ts +1 -1
- package/samples/apps/styleguide/src/features/gallery/web/Gallery.tsx +1 -1
- package/samples/apps/styleguide/src/features/gallery/web/index.ts +1 -1
- package/samples/apps/styleguide/src/features/widgets/demo-locale.ts +1 -1
- package/samples/apps/styleguide/src/features/widgets/feature.ts +17 -0
- package/samples/apps/styleguide/src/features/widgets/i18n.ts +8 -0
- package/samples/apps/styleguide/src/features/widgets/lib/format.ts +1 -1
- package/samples/apps/styleguide/src/features/widgets/web/DashboardFilterEcho.tsx +1 -1
- package/samples/apps/styleguide/src/features/widgets/web/FormExamples.tsx +1 -1
- package/samples/apps/styleguide/src/features/widgets/web/Widgets.tsx +1 -1
- package/samples/apps/styleguide/src/features/widgets/web/index.ts +1 -1
- package/samples/apps/styleguide/tsconfig.json +0 -12
- package/samples/apps/ui-walkthrough/package.json +1 -3
- package/samples/apps/ui-walkthrough/src/app/client.tsx +1 -1
- package/samples/apps/ui-walkthrough/src/app/shell.tsx +1 -1
- package/samples/apps/ui-walkthrough/src/features/billing/web/index.ts +1 -1
- package/samples/apps/ui-walkthrough/src/features/rental/web/index.ts +1 -1
- package/samples/apps/ui-walkthrough/src/features/tasks/web/index.ts +1 -1
- package/samples/apps/ui-walkthrough/src/features/vehicles/web/index.ts +1 -1
- package/samples/apps/use-all-bundled/bin/main.ts +3 -2
- package/samples/apps/use-all-bundled/e2e-billing-gallery/gallery-features.ts +12 -0
- package/samples/apps/use-all-bundled/e2e-billing-gallery/server.ts +1 -1
- package/samples/apps/use-all-bundled/feature-manifest.json +1 -0
- package/samples/apps/use-all-bundled/package.json +1 -3
- package/samples/apps/use-all-bundled/src/app/client.tsx +1 -1
- package/samples/apps/use-all-bundled/src/app/dev-app-options.ts +5 -4
- package/samples/apps/use-all-bundled/src/app/shell.tsx +1 -1
- package/samples/apps/use-all-bundled/src/run-config.ts +10 -1
- package/samples/apps/workspaces/package.json +1 -3
- package/samples/apps/workspaces/src/app/client.tsx +1 -1
- package/samples/apps/workspaces/src/app/shell.tsx +1 -1
- package/samples/apps/workspaces/src/features/demo/web/index.ts +1 -1
- package/samples/apps/workspaces/src/features/demo-driver/web/index.ts +1 -1
- package/samples/recipes/apex-landing/package.json +1 -1
- package/samples/recipes/apex-landing/src/feature.ts +1 -1
- package/samples/recipes/apex-surface-auth/README.md +1 -1
- package/samples/recipes/apex-surface-auth/src/feature.ts +2 -2
- package/samples/recipes/compose-stacks/README.md +7 -4
- package/samples/recipes/embedded-entity-form/package.json +0 -1
- package/samples/recipes/embedded-entity-form/src/web/accept-suggestion-drawer.tsx +1 -1
- package/samples/recipes/notes-history-basic/README.md +1 -1
- package/samples/recipes/record-detail-layout/package.json +0 -1
- package/samples/recipes/tags-basic/README.md +1 -1
- package/samples/recipes/user-profile/README.md +1 -1
- package/samples/recipes/wizard-form/package.json +0 -1
- package/samples/recipes/wizard-form/src/web/index.ts +2 -2
- package/samples/recipes/wizard-form/src/web/listing-review-section.tsx +2 -2
- package/samples/recipes/writeform-section/package.json +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { formatMoney } from "@cosmicdrift/kumiko-renderer
|
|
1
|
+
import { formatMoney } from "@cosmicdrift/kumiko-renderer/web";
|
|
2
2
|
|
|
3
3
|
// `locale` comes from useLocale(), whose default resolver reads it
|
|
4
4
|
// unvalidated from localStorage/navigator.language — a structurally invalid
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
// DashboardFilterDefinition in feature.ts).
|
|
5
5
|
|
|
6
6
|
import { type ExtensionSectionProps, useTranslation } from "@cosmicdrift/kumiko-renderer";
|
|
7
|
-
import { SectionCard } from "@cosmicdrift/kumiko-renderer
|
|
7
|
+
import { SectionCard } from "@cosmicdrift/kumiko-renderer/web";
|
|
8
8
|
import type { ReactNode } from "react";
|
|
9
9
|
|
|
10
10
|
export function DashboardFilterEcho({ filterParams }: ExtensionSectionProps): ReactNode {
|
|
@@ -36,7 +36,7 @@ import {
|
|
|
36
36
|
TextField,
|
|
37
37
|
TimeseriesChart,
|
|
38
38
|
useDraft,
|
|
39
|
-
} from "@cosmicdrift/kumiko-renderer
|
|
39
|
+
} from "@cosmicdrift/kumiko-renderer/web";
|
|
40
40
|
import { Wallet } from "lucide-react";
|
|
41
41
|
import { type ReactNode, useEffect, useMemo, useState } from "react";
|
|
42
42
|
import { euro, percent } from "../lib/format";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { TranslationsByLocale } from "@cosmicdrift/kumiko-renderer";
|
|
2
|
-
import type { ClientFeatureDefinition } from "@cosmicdrift/kumiko-renderer
|
|
2
|
+
import type { ClientFeatureDefinition } from "@cosmicdrift/kumiko-renderer/web";
|
|
3
3
|
import { WIDGETS_I18N } from "../i18n";
|
|
4
4
|
import { DashboardFilterEcho } from "./DashboardFilterEcho";
|
|
5
5
|
import { DashboardKpiIcon } from "./DashboardKpiIcon";
|
|
@@ -14,18 +14,6 @@
|
|
|
14
14
|
"@cosmicdrift/kumiko-dev-server/*": [
|
|
15
15
|
"../../../packages/dev-server/src/*"
|
|
16
16
|
],
|
|
17
|
-
"@cosmicdrift/kumiko-renderer-web": [
|
|
18
|
-
"../../../packages/renderer-web/src/index.ts"
|
|
19
|
-
],
|
|
20
|
-
"@cosmicdrift/kumiko-renderer-web/*": [
|
|
21
|
-
"../../../packages/renderer-web/src/*"
|
|
22
|
-
],
|
|
23
|
-
"@cosmicdrift/kumiko-dispatcher-live": [
|
|
24
|
-
"../../../packages/dispatcher-live/src/index.ts"
|
|
25
|
-
],
|
|
26
|
-
"@cosmicdrift/kumiko-headless": [
|
|
27
|
-
"../../../packages/headless/src/index.ts"
|
|
28
|
-
],
|
|
29
17
|
"@cosmicdrift/kumiko-renderer": [
|
|
30
18
|
"../../../packages/renderer/src/index.ts"
|
|
31
19
|
],
|
|
@@ -11,12 +11,10 @@
|
|
|
11
11
|
"@cosmicdrift/kumiko-bundled-features": "workspace:*",
|
|
12
12
|
"@cosmicdrift/kumiko-dev-server": "workspace:*",
|
|
13
13
|
"@cosmicdrift/kumiko-document-designer": "workspace:*",
|
|
14
|
-
"@cosmicdrift/kumiko-
|
|
14
|
+
"@cosmicdrift/kumiko-renderer": "workspace:*",
|
|
15
15
|
"@cosmicdrift/kumiko-framework": "workspace:*",
|
|
16
|
-
"@cosmicdrift/kumiko-headless": "workspace:*",
|
|
17
16
|
"@cosmicdrift/kumiko-renderer-mail-html": "workspace:*",
|
|
18
17
|
"@cosmicdrift/kumiko-renderer-puppeteer-client": "workspace:*",
|
|
19
|
-
"@cosmicdrift/kumiko-renderer-web": "workspace:*",
|
|
20
18
|
"@cosmicdrift/kumiko-server-runtime": "workspace:*",
|
|
21
19
|
"react": "^19.2.6",
|
|
22
20
|
"react-dom": "^19.2.6",
|
|
@@ -5,7 +5,7 @@ import { emailPasswordClient } from "@cosmicdrift/kumiko-bundled-features/auth-e
|
|
|
5
5
|
import { textBlocksClient } from "@cosmicdrift/kumiko-bundled-features/template-resolver/web";
|
|
6
6
|
import { documentDesignerClient } from "@cosmicdrift/kumiko-document-designer/web";
|
|
7
7
|
import { localeDeClient } from "@cosmicdrift/kumiko-locale-de/web";
|
|
8
|
-
import { createKumikoApp } from "@cosmicdrift/kumiko-renderer
|
|
8
|
+
import { createKumikoApp } from "@cosmicdrift/kumiko-renderer/web";
|
|
9
9
|
import { billingClient } from "../features/billing/web";
|
|
10
10
|
import { rentalClient } from "../features/rental/web";
|
|
11
11
|
import { tasksClient } from "../features/tasks/web";
|
|
@@ -15,7 +15,7 @@ import {
|
|
|
15
15
|
ThemeMenuItem,
|
|
16
16
|
ThemeToggle,
|
|
17
17
|
useTranslation,
|
|
18
|
-
} from "@cosmicdrift/kumiko-renderer
|
|
18
|
+
} from "@cosmicdrift/kumiko-renderer/web";
|
|
19
19
|
import { MoonStar, Sun } from "lucide-react";
|
|
20
20
|
import type { ReactNode } from "react";
|
|
21
21
|
import { AssistantAction } from "./assistant-action";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ClientFeatureDefinition } from "@cosmicdrift/kumiko-renderer
|
|
1
|
+
import type { ClientFeatureDefinition } from "@cosmicdrift/kumiko-renderer/web";
|
|
2
2
|
import { billingTranslations } from "../i18n";
|
|
3
3
|
|
|
4
4
|
export const billingClient: ClientFeatureDefinition = {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ClientFeatureDefinition } from "@cosmicdrift/kumiko-renderer
|
|
1
|
+
import type { ClientFeatureDefinition } from "@cosmicdrift/kumiko-renderer/web";
|
|
2
2
|
import { rentalTranslations } from "../i18n";
|
|
3
3
|
import { LeaseHubHeader, LeaseHubHistory } from "./lease-hub-components";
|
|
4
4
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// Tasks-Feature — Web-Plattform-Plugin. Heute nur Translations,
|
|
2
2
|
// keine Custom-Components.
|
|
3
3
|
|
|
4
|
-
import type { ClientFeatureDefinition } from "@cosmicdrift/kumiko-renderer
|
|
4
|
+
import type { ClientFeatureDefinition } from "@cosmicdrift/kumiko-renderer/web";
|
|
5
5
|
import { tasksTranslations } from "../i18n";
|
|
6
6
|
|
|
7
7
|
export const tasksClient: ClientFeatureDefinition = {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ClientFeatureDefinition } from "@cosmicdrift/kumiko-renderer
|
|
1
|
+
import type { ClientFeatureDefinition } from "@cosmicdrift/kumiko-renderer/web";
|
|
2
2
|
import { vehiclesTranslations } from "../i18n";
|
|
3
3
|
|
|
4
4
|
export const vehiclesClient: ClientFeatureDefinition = {
|
|
@@ -8,7 +8,7 @@ import { InMemoryKmsAdapter } from "@cosmicdrift/kumiko-framework/crypto";
|
|
|
8
8
|
import type { TenantId } from "@cosmicdrift/kumiko-framework/engine";
|
|
9
9
|
import { composeEnvSchema } from "@cosmicdrift/kumiko-framework/env";
|
|
10
10
|
import { runProdApp } from "@cosmicdrift/kumiko-server-runtime";
|
|
11
|
-
import { APP_FEATURES, AUTH_COMPOSE_OPTIONS } from "../src/run-config";
|
|
11
|
+
import { APP_FEATURES, AUTH_COMPOSE_OPTIONS, BOOT_FEATURES } from "../src/run-config";
|
|
12
12
|
|
|
13
13
|
const SMOKE_TENANT_ID = "00000000-0000-4000-8000-000000000001" as TenantId;
|
|
14
14
|
|
|
@@ -18,7 +18,8 @@ const envSchema = composeEnvSchema({
|
|
|
18
18
|
});
|
|
19
19
|
|
|
20
20
|
await runProdApp({
|
|
21
|
-
features:
|
|
21
|
+
features: BOOT_FEATURES,
|
|
22
|
+
featureToggles: true,
|
|
22
23
|
envSchema,
|
|
23
24
|
// Smoke-only: exercises the hard PII boot gate + blind-index gate with
|
|
24
25
|
// every bundled feature mounted. Real apps wire createPgKmsAdapter(...).
|
|
@@ -75,6 +75,12 @@ export function createGalleryBillingFeature(baseUrl: string): FeatureDefinition
|
|
|
75
75
|
successPath: GALLERY_PLAN_PATH,
|
|
76
76
|
cancelPath: GALLERY_PLAN_PATH,
|
|
77
77
|
providerName: GALLERY_PROVIDER,
|
|
78
|
+
contact: {
|
|
79
|
+
labelKey: "gallery-screens:plan.enterprise.label",
|
|
80
|
+
benefits: [{ labelKey: "gallery-screens:plan.enterprise.benefit" }],
|
|
81
|
+
actionLabelKey: "gallery-screens:plan.enterprise.action",
|
|
82
|
+
href: "mailto:sales@gallery.example",
|
|
83
|
+
},
|
|
78
84
|
},
|
|
79
85
|
consumerProtection: {
|
|
80
86
|
termsTextBlock: GALLERY_TERMS_SLUG,
|
|
@@ -140,6 +146,12 @@ export const galleryScreensFeature: FeatureDefinition = defineFeature("gallery-s
|
|
|
140
146
|
"gallery-screens:plan.free.label": { de: "Free", en: "Free" },
|
|
141
147
|
"gallery-screens:plan.starter.label": { de: "Starter", en: "Starter" },
|
|
142
148
|
"gallery-screens:plan.pro.label": { de: "Pro", en: "Pro" },
|
|
149
|
+
"gallery-screens:plan.enterprise.label": { de: "Enterprise", en: "Enterprise" },
|
|
150
|
+
"gallery-screens:plan.enterprise.benefit": {
|
|
151
|
+
de: "Individuelle Konditionen und persönlicher Ansprechpartner",
|
|
152
|
+
en: "Custom terms and a dedicated contact",
|
|
153
|
+
},
|
|
154
|
+
"gallery-screens:plan.enterprise.action": { de: "Kontakt aufnehmen", en: "Contact us" },
|
|
143
155
|
"gallery-screens:plan.starter.benefit": { de: "Für kleine Teams", en: "For small teams" },
|
|
144
156
|
"gallery-screens:plan.pro.benefit": { de: "Für wachsende Teams", en: "For growing teams" },
|
|
145
157
|
"gallery-screens:plan.free.benefit": { de: "Zum Ausprobieren", en: "To try things out" },
|
|
@@ -13,8 +13,8 @@ import { createDeliveryTestContext } from "@cosmicdrift/kumiko-bundled-features/
|
|
|
13
13
|
import { createTemplateResolverApi } from "@cosmicdrift/kumiko-bundled-features/template-resolver";
|
|
14
14
|
import { seedTextBlock } from "@cosmicdrift/kumiko-bundled-features/template-resolver/seeding";
|
|
15
15
|
import { runDevApp, type SeedFn } from "@cosmicdrift/kumiko-dev-server";
|
|
16
|
+
import { createE2eSeedRoutes } from "@cosmicdrift/kumiko-dev-server/testing";
|
|
16
17
|
import { SYSTEM_TENANT_ID } from "@cosmicdrift/kumiko-framework/engine";
|
|
17
|
-
import { createE2eSeedRoutes } from "@cosmicdrift/kumiko-testing/e2e/seed-route";
|
|
18
18
|
import { devAppOptions } from "../src/app/dev-app-options";
|
|
19
19
|
import { GALLERY_TENANT_HOST, GALLERY_TERMS_SLUG } from "./gallery-constants";
|
|
20
20
|
import {
|
|
@@ -2644,6 +2644,7 @@
|
|
|
2644
2644
|
"template-resolver:write:discard-draft-system",
|
|
2645
2645
|
"template-resolver:write:import-bundle",
|
|
2646
2646
|
"template-resolver:write:import-bundle-system",
|
|
2647
|
+
"template-resolver:write:patch-draft",
|
|
2647
2648
|
"template-resolver:write:publish",
|
|
2648
2649
|
"template-resolver:write:publish-system",
|
|
2649
2650
|
"template-resolver:write:reply-snippets-set",
|
|
@@ -17,13 +17,11 @@
|
|
|
17
17
|
"dependencies": {
|
|
18
18
|
"@cosmicdrift/kumiko-bundled-features": "workspace:*",
|
|
19
19
|
"@cosmicdrift/kumiko-dev-server": "workspace:*",
|
|
20
|
-
"@cosmicdrift/kumiko-
|
|
20
|
+
"@cosmicdrift/kumiko-renderer": "workspace:*",
|
|
21
21
|
"@cosmicdrift/kumiko-document-designer": "workspace:*",
|
|
22
22
|
"@cosmicdrift/kumiko-framework": "workspace:*",
|
|
23
|
-
"@cosmicdrift/kumiko-headless": "workspace:*",
|
|
24
23
|
"@cosmicdrift/kumiko-renderer-mail-html": "workspace:*",
|
|
25
24
|
"@cosmicdrift/kumiko-renderer-puppeteer-client": "workspace:*",
|
|
26
|
-
"@cosmicdrift/kumiko-renderer-web": "workspace:*",
|
|
27
25
|
"@cosmicdrift/kumiko-server-runtime": "workspace:*",
|
|
28
26
|
"@cosmicdrift/kumiko-types": "workspace:*",
|
|
29
27
|
"react": "^19.2.6",
|
|
@@ -37,7 +37,7 @@ import { documentDesignerClient } from "@cosmicdrift/kumiko-document-designer/we
|
|
|
37
37
|
import { SYSTEM_TENANT_ID } from "@cosmicdrift/kumiko-framework/engine/types";
|
|
38
38
|
import { localeDeClient } from "@cosmicdrift/kumiko-locale-de/web";
|
|
39
39
|
import type { TranslationsByLocale } from "@cosmicdrift/kumiko-renderer";
|
|
40
|
-
import { type ClientFeatureDefinition, createKumikoApp } from "@cosmicdrift/kumiko-renderer
|
|
40
|
+
import { type ClientFeatureDefinition, createKumikoApp } from "@cosmicdrift/kumiko-renderer/web";
|
|
41
41
|
import { AppShell } from "./shell";
|
|
42
42
|
|
|
43
43
|
const APP_TRANSLATIONS: TranslationsByLocale = {
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
import { createTemplateResolverApi } from "@cosmicdrift/kumiko-bundled-features/template-resolver";
|
|
14
14
|
import type { RunDevAppOptions } from "@cosmicdrift/kumiko-dev-server";
|
|
15
15
|
import { SYSTEM_TENANT_ID, type TenantId } from "@cosmicdrift/kumiko-framework/engine";
|
|
16
|
-
import {
|
|
16
|
+
import { AUTH_COMPOSE_OPTIONS, BOOT_FEATURES } from "../run-config";
|
|
17
17
|
import { ADMIN_EMAIL, ADMIN_PASSWORD, BETA_TENANT_ID, DEV_TENANT_ID } from "./auth-constants";
|
|
18
18
|
import { notesFeature } from "./notes-feature";
|
|
19
19
|
import { appScreensFeature } from "./screens-feature";
|
|
@@ -24,10 +24,11 @@ import { seedScreenshotData } from "./seed";
|
|
|
24
24
|
// würde den Resolver auf jedem Write aktivieren (inkl. Login) und braucht
|
|
25
25
|
// per-Tenant Tier-Assignments — disproportional für einen Preview-Screenshot.
|
|
26
26
|
|
|
27
|
-
export const devAppOptions
|
|
27
|
+
export const devAppOptions = {
|
|
28
28
|
// notesFeature is dev-only (app-owned tag host) — see notes-feature.ts for why
|
|
29
29
|
// it stays out of APP_FEATURES. appScreensFeature places the user-profile screen.
|
|
30
|
-
features: [...
|
|
30
|
+
features: [...BOOT_FEATURES, appScreensFeature, notesFeature],
|
|
31
|
+
featureToggles: true,
|
|
31
32
|
port: Number.parseInt(process.env["PORT"] ?? "4186", 10),
|
|
32
33
|
clientEntry: "./src/app/client.tsx",
|
|
33
34
|
htmlPath: "./public/index.html",
|
|
@@ -72,4 +73,4 @@ export const devAppOptions: RunDevAppOptions = {
|
|
|
72
73
|
emailVerification: AUTH_COMPOSE_OPTIONS.emailVerification,
|
|
73
74
|
accountUnlock: AUTH_COMPOSE_OPTIONS.accountUnlock,
|
|
74
75
|
},
|
|
75
|
-
};
|
|
76
|
+
} satisfies RunDevAppOptions;
|
|
@@ -2,7 +2,7 @@ import {
|
|
|
2
2
|
DefaultTopbarActions,
|
|
3
3
|
useShellUser,
|
|
4
4
|
} from "@cosmicdrift/kumiko-bundled-features/auth-email-password/web";
|
|
5
|
-
import { type AppSchema, LanguageSwitcher, WorkspaceShell } from "@cosmicdrift/kumiko-renderer
|
|
5
|
+
import { type AppSchema, LanguageSwitcher, WorkspaceShell } from "@cosmicdrift/kumiko-renderer/web";
|
|
6
6
|
import { MoonStar, Sun } from "lucide-react";
|
|
7
7
|
import type { ReactNode } from "react";
|
|
8
8
|
import { BETA_TENANT_ID, DEV_TENANT_ID } from "./auth-constants";
|
|
@@ -43,7 +43,10 @@ import { createDataRetentionFeature } from "@cosmicdrift/kumiko-bundled-features
|
|
|
43
43
|
import { createDeliveryFeature } from "@cosmicdrift/kumiko-bundled-features/delivery";
|
|
44
44
|
import { createDerivativesSharpFeature } from "@cosmicdrift/kumiko-bundled-features/derivatives-sharp";
|
|
45
45
|
import { createDocumentIngestFoundationFeature } from "@cosmicdrift/kumiko-bundled-features/document-ingest-foundation";
|
|
46
|
-
import {
|
|
46
|
+
import {
|
|
47
|
+
createFeatureTogglesFeature,
|
|
48
|
+
FEATURE_TOGGLES_FEATURE,
|
|
49
|
+
} from "@cosmicdrift/kumiko-bundled-features/feature-toggles";
|
|
47
50
|
import { createFileDerivativesFeature } from "@cosmicdrift/kumiko-bundled-features/file-derivatives";
|
|
48
51
|
import { createFilesTenantDataFeature } from "@cosmicdrift/kumiko-bundled-features/files-tenant-data";
|
|
49
52
|
import { createFoldersFeature } from "@cosmicdrift/kumiko-bundled-features/folders";
|
|
@@ -405,6 +408,12 @@ export const APP_FEATURES = [
|
|
|
405
408
|
createAgentToolsFeature(),
|
|
406
409
|
] as const;
|
|
407
410
|
|
|
411
|
+
// runProdApp / runDevApp mount feature-toggles themselves with `featureToggles: true`
|
|
412
|
+
// and reject a second copy in `features`; APP_FEATURES keeps it for schema and coverage tooling.
|
|
413
|
+
export const BOOT_FEATURES = APP_FEATURES.filter(
|
|
414
|
+
(feature) => feature.name !== FEATURE_TOGGLES_FEATURE,
|
|
415
|
+
);
|
|
416
|
+
|
|
408
417
|
// Smoke signup — enables createAuthSelfRegistrationToggleFeature via
|
|
409
418
|
// composeFeatures when passed as authOptions (#1521 Option A). Same shape
|
|
410
419
|
// as run{Dev,Prod}App's auth.signup; appUrl is a stub (no real mail in boot).
|
|
@@ -9,10 +9,8 @@
|
|
|
9
9
|
},
|
|
10
10
|
"dependencies": {
|
|
11
11
|
"@cosmicdrift/kumiko-dev-server": "workspace:*",
|
|
12
|
-
"@cosmicdrift/kumiko-
|
|
12
|
+
"@cosmicdrift/kumiko-renderer": "workspace:*",
|
|
13
13
|
"@cosmicdrift/kumiko-framework": "workspace:*",
|
|
14
|
-
"@cosmicdrift/kumiko-headless": "workspace:*",
|
|
15
|
-
"@cosmicdrift/kumiko-renderer-web": "workspace:*",
|
|
16
14
|
"react": "^19.2.6",
|
|
17
15
|
"react-dom": "^19.2.6",
|
|
18
16
|
"@cosmicdrift/kumiko-locale-de": "workspace:*"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { emailPasswordClient } from "@cosmicdrift/kumiko-bundled-features/auth-email-password/web";
|
|
2
2
|
import { localeDeClient } from "@cosmicdrift/kumiko-locale-de/web";
|
|
3
|
-
import { createKumikoApp } from "@cosmicdrift/kumiko-renderer
|
|
3
|
+
import { createKumikoApp } from "@cosmicdrift/kumiko-renderer/web";
|
|
4
4
|
import { demoClient } from "../features/demo/web";
|
|
5
5
|
import { driverClient } from "../features/demo-driver/web";
|
|
6
6
|
import { AppShell } from "./shell";
|
|
@@ -5,7 +5,7 @@ import {
|
|
|
5
5
|
DefaultTopbarActions,
|
|
6
6
|
useShellUser,
|
|
7
7
|
} from "@cosmicdrift/kumiko-bundled-features/auth-email-password/web";
|
|
8
|
-
import { type AppSchema, WorkspaceShell } from "@cosmicdrift/kumiko-renderer
|
|
8
|
+
import { type AppSchema, WorkspaceShell } from "@cosmicdrift/kumiko-renderer/web";
|
|
9
9
|
import { MoonStar, Sun } from "lucide-react";
|
|
10
10
|
import type { ReactNode } from "react";
|
|
11
11
|
|
|
@@ -18,7 +18,7 @@ import {
|
|
|
18
18
|
type ApexPage,
|
|
19
19
|
type ApexPricingTier,
|
|
20
20
|
renderApexPage,
|
|
21
|
-
} from "@cosmicdrift/kumiko-headless/apex";
|
|
21
|
+
} from "@cosmicdrift/kumiko-renderer/headless/apex";
|
|
22
22
|
import { HERO_SCREENSHOT } from "./constants";
|
|
23
23
|
|
|
24
24
|
// --- Inputs: shapes the surrounding features hand you -----------------------
|
|
@@ -34,7 +34,7 @@ import {
|
|
|
34
34
|
import {
|
|
35
35
|
RequestAccountDeletionScreen, ConfirmAccountDeletionScreen,
|
|
36
36
|
} from "@cosmicdrift/kumiko-bundled-features/user-data-rights/web";
|
|
37
|
-
import { createPublicSurface } from "@cosmicdrift/kumiko-renderer
|
|
37
|
+
import { createPublicSurface } from "@cosmicdrift/kumiko-renderer/web";
|
|
38
38
|
|
|
39
39
|
// createLoginRoute, not a raw LoginScreen render — it owns the challenge-
|
|
40
40
|
// swap for a second factor, so mounting auth-mfa later doesn't need this
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
// 2. Client (Kommentar unten + README): wie createPublicSurface + AuthShell
|
|
12
12
|
// die Screens in der Apex-Chrome mounten.
|
|
13
13
|
//
|
|
14
|
-
// CLIENT-WIRING (apex.tsx der App — renderer
|
|
14
|
+
// CLIENT-WIRING (apex.tsx der App — renderer/web, hier nur als Referenz, da
|
|
15
15
|
// Recipes keine Browser-Deps ziehen):
|
|
16
16
|
//
|
|
17
17
|
// import {
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
// RequestAccountDeletionScreen, ConfirmAccountDeletionScreen,
|
|
23
23
|
// defaultTranslations as deletionI18n,
|
|
24
24
|
// } from "@cosmicdrift/kumiko-bundled-features/user-data-rights/web";
|
|
25
|
-
// import { createPublicSurface } from "@cosmicdrift/kumiko-renderer
|
|
25
|
+
// import { createPublicSurface } from "@cosmicdrift/kumiko-renderer/web";
|
|
26
26
|
//
|
|
27
27
|
// // AuthShell: die Auth-Card rendert in der Marketing-Chrome statt
|
|
28
28
|
// // Fullscreen. Default (ohne Provider) bleibt der Fullscreen-Wrapper.
|
|
@@ -36,22 +36,25 @@ the option.
|
|
|
36
36
|
| `composeGdprStack` | `kmsMode` | `kms` or `allowPlaintextPii` |
|
|
37
37
|
| `composeGdprStack({ selfService })`, `composeUserDataRightsStack` | `mail` | a mounted `channel-email` |
|
|
38
38
|
| `composeSecurityStack` | `kmsMode`, `rateLimit` not `false` | `kms` or `allowPlaintextPii` |
|
|
39
|
-
| `composeSaasStack({ billing: "stripe" })` | `billing` | a mounted subscription provider |
|
|
39
|
+
| `composeSaasStack({ billing: "stripe" })` | `billing` (warning only) | a mounted subscription provider |
|
|
40
40
|
|
|
41
41
|
A missing option fails the boot with:
|
|
42
42
|
|
|
43
43
|
```
|
|
44
44
|
[runProdApp] stacks in `features` need boot options that are not set:
|
|
45
|
-
-
|
|
45
|
+
- composeGdprStack needs the boot option `kmsMode`: set kmsMode: "required" (or { plaintextReason } for a demo)
|
|
46
46
|
```
|
|
47
47
|
|
|
48
|
+
A stripe `composeSaasStack` without `billing` boots and logs the same line as a warning, so an
|
|
49
|
+
app can go live before its prices exist.
|
|
50
|
+
|
|
48
51
|
## Flow
|
|
49
52
|
|
|
50
53
|
1. `src/app.ts` lists the stacks and the boot options they need.
|
|
51
54
|
2. The test boots with `KUMIKO_DRY_RUN_ENV=boot`, which runs the whole
|
|
52
55
|
validation and stops before any DB or Redis connection: with the options
|
|
53
|
-
the boot passes, without `
|
|
54
|
-
|
|
56
|
+
the boot passes, without `kmsMode` it fails and names the stacks, and
|
|
57
|
+
without `billing` it warns.
|
|
55
58
|
|
|
56
59
|
## Tests
|
|
57
60
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { RenderEditControls } from "@cosmicdrift/kumiko-renderer";
|
|
2
2
|
import { RenderEdit, useDispatcher, usePrimitives } from "@cosmicdrift/kumiko-renderer";
|
|
3
|
-
import { Drawer } from "@cosmicdrift/kumiko-renderer
|
|
3
|
+
import { Drawer } from "@cosmicdrift/kumiko-renderer/web";
|
|
4
4
|
import { type ReactNode, useMemo, useRef, useState } from "react";
|
|
5
5
|
import { z } from "zod";
|
|
6
6
|
import { prospectEntity } from "../entities/prospect";
|
|
@@ -47,7 +47,7 @@ handler as above. Register `notesHistoryClient()` once (for its component +
|
|
|
47
47
|
i18n), then mount it either way:
|
|
48
48
|
|
|
49
49
|
```tsx illustration
|
|
50
|
-
import { createKumikoApp } from "@cosmicdrift/kumiko-renderer
|
|
50
|
+
import { createKumikoApp } from "@cosmicdrift/kumiko-renderer/web";
|
|
51
51
|
import { notesHistoryClient, NotesSection, NOTES_SECTION_EXTENSION_NAME } from "@cosmicdrift/kumiko-bundled-features/notes-history/web";
|
|
52
52
|
|
|
53
53
|
// once, at app boot — required even for standalone use (registers i18n):
|
|
@@ -48,7 +48,7 @@ as above. Register `tagsClient()` once (for its component + i18n), then mount it
|
|
|
48
48
|
either way:
|
|
49
49
|
|
|
50
50
|
```tsx illustration
|
|
51
|
-
import { createKumikoApp } from "@cosmicdrift/kumiko-renderer
|
|
51
|
+
import { createKumikoApp } from "@cosmicdrift/kumiko-renderer/web";
|
|
52
52
|
import { tagsClient, TagSection, TAGS_SECTION_EXTENSION_NAME } from "@cosmicdrift/kumiko-bundled-features/tags/web";
|
|
53
53
|
|
|
54
54
|
// once, at app boot — required even for standalone use (registers i18n):
|
|
@@ -46,7 +46,7 @@ itself needs no client registration):
|
|
|
46
46
|
```tsx illustration
|
|
47
47
|
import { userProfileClient } from "@cosmicdrift/kumiko-bundled-features/user-profile/web";
|
|
48
48
|
import { emailPasswordClient } from "@cosmicdrift/kumiko-bundled-features/auth-email-password/web";
|
|
49
|
-
import { createKumikoApp } from "@cosmicdrift/kumiko-renderer
|
|
49
|
+
import { createKumikoApp } from "@cosmicdrift/kumiko-renderer/web";
|
|
50
50
|
|
|
51
51
|
createKumikoApp({
|
|
52
52
|
clientFeatures: [emailPasswordClient(), userProfileClient()],
|
|
@@ -10,7 +10,6 @@
|
|
|
10
10
|
"@cosmicdrift/kumiko-bundled-features": "workspace:*",
|
|
11
11
|
"@cosmicdrift/kumiko-framework": "workspace:*",
|
|
12
12
|
"@cosmicdrift/kumiko-renderer": "workspace:*",
|
|
13
|
-
"@cosmicdrift/kumiko-renderer-web": "workspace:*",
|
|
14
13
|
"react": "^19.2.6"
|
|
15
14
|
},
|
|
16
15
|
"devDependencies": {
|
|
@@ -3,11 +3,11 @@
|
|
|
3
3
|
// A `kind: "extension"` section only resolves through
|
|
4
4
|
// clientFeatures.extensionSectionComponents (createKumikoApp → ExtensionSectionsProvider)
|
|
5
5
|
// — never imported directly from feature.ts, which keeps the server file
|
|
6
|
-
// free of the renderer
|
|
6
|
+
// free of the renderer/web graph. Without registering this export, an app
|
|
7
7
|
// mounting this recipe gets RenderEdit's fallback placeholder instead of
|
|
8
8
|
// the real review step.
|
|
9
9
|
|
|
10
|
-
import type { ClientFeatureDefinition } from "@cosmicdrift/kumiko-renderer
|
|
10
|
+
import type { ClientFeatureDefinition } from "@cosmicdrift/kumiko-renderer/web";
|
|
11
11
|
import { ListingReviewSection } from "./listing-review-section";
|
|
12
12
|
|
|
13
13
|
export const listingsClient: ClientFeatureDefinition = {
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import type { ExtensionSectionProps } from "@cosmicdrift/kumiko-renderer";
|
|
2
|
-
import { DetailList } from "@cosmicdrift/kumiko-renderer
|
|
2
|
+
import { DetailList } from "@cosmicdrift/kumiko-renderer/web";
|
|
3
3
|
import type { ReactNode } from "react";
|
|
4
4
|
|
|
5
5
|
// Registered under the `__component` name the feature's review section
|
|
6
6
|
// points at (see feature.ts) — never imported by feature.ts itself, the
|
|
7
7
|
// string name is the only link so the server file stays free of the
|
|
8
|
-
// renderer
|
|
8
|
+
// renderer/web graph.
|
|
9
9
|
export function ListingReviewSection({ values }: ExtensionSectionProps): ReactNode {
|
|
10
10
|
return (
|
|
11
11
|
<DetailList
|