@owlmeans/viable-common 0.0.43 → 0.0.45
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 +3 -3
- package/agent-meta/manifest.json +2 -2
- package/agent-meta/skills/agent-presentation/SKILL.md +4 -4
- package/agent-meta/skills/viable-common/SKILL.md +59 -36
- package/build/agent/consts.d.ts +58 -0
- package/build/agent/consts.d.ts.map +1 -0
- package/build/agent/consts.js +63 -0
- package/build/agent/consts.js.map +1 -0
- package/build/agent/consts.local.d.ts +21 -0
- package/build/agent/consts.local.d.ts.map +1 -0
- package/build/agent/consts.local.js +44 -0
- package/build/agent/consts.local.js.map +1 -0
- package/build/agent/index.d.ts +2 -0
- package/build/agent/index.d.ts.map +1 -1
- package/build/agent/index.js +1 -0
- package/build/agent/index.js.map +1 -1
- package/build/agent/presentation/types.d.ts +21 -0
- package/build/agent/presentation/types.d.ts.map +1 -0
- package/build/agent/presentation/types.js.map +1 -0
- package/build/agent/presentation.d.ts +12 -94
- package/build/agent/presentation.d.ts.map +1 -1
- package/build/agent/presentation.js +218 -299
- package/build/agent/presentation.js.map +1 -1
- package/build/agent/types.d.ts +30 -0
- package/build/agent/types.d.ts.map +1 -1
- package/build/agent/types.local.d.ts +4 -0
- package/build/agent/types.local.d.ts.map +1 -0
- package/build/agent/types.local.js +2 -0
- package/build/agent/types.local.js.map +1 -0
- package/build/areas/consts.d.ts +5 -0
- package/build/areas/consts.d.ts.map +1 -1
- package/build/areas/consts.js +4 -0
- package/build/areas/consts.js.map +1 -1
- package/build/areas/index.d.ts +1 -0
- package/build/areas/index.d.ts.map +1 -1
- package/build/areas/index.js.map +1 -1
- package/build/areas/tenancy/types.d.ts +23 -0
- package/build/areas/tenancy/types.d.ts.map +1 -0
- package/build/areas/tenancy/types.js +2 -0
- package/build/areas/tenancy/types.js.map +1 -0
- package/build/areas/tenancy.d.ts +6 -50
- package/build/areas/tenancy.d.ts.map +1 -1
- package/build/areas/tenancy.js +21 -31
- package/build/areas/tenancy.js.map +1 -1
- package/build/areas/types.d.ts +32 -0
- package/build/areas/types.d.ts.map +1 -1
- package/build/ba/connecting/types.d.ts +45 -0
- package/build/ba/connecting/types.d.ts.map +1 -0
- package/build/ba/connecting/types.js +2 -0
- package/build/ba/connecting/types.js.map +1 -0
- package/build/ba/connecting.d.ts +4 -0
- package/build/ba/connecting.d.ts.map +1 -0
- package/build/ba/connecting.js +47 -0
- package/build/ba/connecting.js.map +1 -0
- package/build/ba/helpers.d.ts +4 -39
- package/build/ba/helpers.d.ts.map +1 -1
- package/build/ba/helpers.js +5 -79
- package/build/ba/helpers.js.map +1 -1
- package/build/ba/index.d.ts +2 -0
- package/build/ba/index.d.ts.map +1 -1
- package/build/ba/index.js +1 -0
- package/build/ba/index.js.map +1 -1
- package/build/ba/types.d.ts +1 -1
- package/build/ba/types.d.ts.map +1 -1
- package/build/blueprint/consts.d.ts +41 -0
- package/build/blueprint/consts.d.ts.map +1 -1
- package/build/blueprint/consts.js +51 -0
- package/build/blueprint/consts.js.map +1 -1
- package/build/blueprint/consts.local.d.ts +2 -0
- package/build/blueprint/consts.local.d.ts.map +1 -0
- package/build/blueprint/consts.local.js +3 -0
- package/build/blueprint/consts.local.js.map +1 -0
- package/build/blueprint/index.d.ts +1 -0
- package/build/blueprint/index.d.ts.map +1 -1
- package/build/blueprint/index.js +1 -0
- package/build/blueprint/index.js.map +1 -1
- package/build/blueprint/types.d.ts +3 -52
- package/build/blueprint/types.d.ts.map +1 -1
- package/build/blueprint/types.js +1 -65
- package/build/blueprint/types.js.map +1 -1
- package/build/blueprint/utils.d.ts +11 -0
- package/build/blueprint/utils.d.ts.map +1 -0
- package/build/blueprint/utils.js +16 -0
- package/build/blueprint/utils.js.map +1 -0
- package/build/branding.d.ts +0 -8
- package/build/branding.d.ts.map +1 -1
- package/build/branding.js +0 -16
- package/build/branding.js.map +1 -1
- package/build/connect/branding/types.d.ts +28 -0
- package/build/connect/branding/types.d.ts.map +1 -0
- package/build/connect/branding/types.js +2 -0
- package/build/connect/branding/types.js.map +1 -0
- package/build/connect/consts.d.ts +2 -10
- package/build/connect/consts.d.ts.map +1 -1
- package/build/connect/consts.js +2 -23
- package/build/connect/consts.js.map +1 -1
- package/build/connect/conversion/types.d.ts +93 -0
- package/build/connect/conversion/types.d.ts.map +1 -0
- package/build/connect/conversion/types.js +2 -0
- package/build/connect/conversion/types.js.map +1 -0
- package/build/connect/entrypoints/types.d.ts +30 -0
- package/build/connect/entrypoints/types.d.ts.map +1 -0
- package/build/connect/entrypoints/types.js +2 -0
- package/build/connect/entrypoints/types.js.map +1 -0
- package/build/connect/entrypoints.d.ts +61 -92
- package/build/connect/entrypoints.d.ts.map +1 -1
- package/build/connect/entrypoints.js +5 -2
- package/build/connect/entrypoints.js.map +1 -1
- package/build/connect/errors/types.d.ts +20 -0
- package/build/connect/errors/types.d.ts.map +1 -0
- package/build/connect/errors/types.js +2 -0
- package/build/connect/errors/types.js.map +1 -0
- package/build/connect/errors.d.ts +32 -0
- package/build/connect/errors.d.ts.map +1 -1
- package/build/connect/errors.js +65 -0
- package/build/connect/errors.js.map +1 -1
- package/build/connect/index.d.ts +13 -2
- package/build/connect/index.d.ts.map +1 -1
- package/build/connect/index.js +1 -0
- package/build/connect/index.js.map +1 -1
- package/build/connect/kit/types.d.ts +52 -0
- package/build/connect/kit/types.d.ts.map +1 -0
- package/build/connect/kit/types.js +2 -0
- package/build/connect/{types.js.map → kit/types.js.map} +1 -1
- package/build/connect/model-tier/types.d.ts +16 -0
- package/build/connect/model-tier/types.d.ts.map +1 -0
- package/build/connect/model-tier/types.js +2 -0
- package/build/connect/model-tier/types.js.map +1 -0
- package/build/connect/model-tier.d.ts +4 -0
- package/build/connect/model-tier.d.ts.map +1 -0
- package/build/connect/model-tier.js +21 -0
- package/build/connect/model-tier.js.map +1 -0
- package/build/connect/{ops.d.ts → ops/types.d.ts} +13 -4
- package/build/connect/ops/types.d.ts.map +1 -0
- package/build/connect/ops/types.js +2 -0
- package/build/connect/ops/types.js.map +1 -0
- package/build/connect/pipeline/types.d.ts +39 -0
- package/build/connect/pipeline/types.d.ts.map +1 -0
- package/build/connect/pipeline/types.js +2 -0
- package/build/connect/pipeline/types.js.map +1 -0
- package/build/connect/project/types.d.ts +127 -0
- package/build/connect/project/types.d.ts.map +1 -0
- package/build/connect/project/types.js +2 -0
- package/build/connect/project/types.js.map +1 -0
- package/build/connect/references/types.d.ts +157 -0
- package/build/connect/references/types.d.ts.map +1 -0
- package/build/connect/references/types.js +2 -0
- package/build/connect/references/types.js.map +1 -0
- package/build/connect/references/types.local.d.ts +5 -0
- package/build/connect/references/types.local.d.ts.map +1 -0
- package/build/connect/references/types.local.js +2 -0
- package/build/connect/references/types.local.js.map +1 -0
- package/build/connect/references.d.ts +1 -153
- package/build/connect/references.d.ts.map +1 -1
- package/build/connect/references.js.map +1 -1
- package/build/connect/schemas.d.ts +9 -5
- package/build/connect/schemas.d.ts.map +1 -1
- package/build/connect/schemas.js +10 -3
- package/build/connect/schemas.js.map +1 -1
- package/build/connect/session/types.d.ts +73 -0
- package/build/connect/session/types.d.ts.map +1 -0
- package/build/connect/session/types.js +2 -0
- package/build/connect/session/types.js.map +1 -0
- package/build/connect/settings/types.d.ts +48 -0
- package/build/connect/settings/types.d.ts.map +1 -0
- package/build/connect/settings/types.js +2 -0
- package/build/connect/settings/types.js.map +1 -0
- package/build/consts.d.ts +8 -0
- package/build/consts.d.ts.map +1 -1
- package/build/consts.js +16 -0
- package/build/consts.js.map +1 -1
- package/build/convert/analysis/types.d.ts +93 -0
- package/build/convert/analysis/types.d.ts.map +1 -0
- package/build/convert/analysis/types.js +2 -0
- package/build/convert/analysis/types.js.map +1 -0
- package/build/convert/census/consts.local.d.ts +55 -0
- package/build/convert/census/consts.local.d.ts.map +1 -0
- package/build/convert/census/consts.local.js +104 -0
- package/build/convert/census/consts.local.js.map +1 -0
- package/build/convert/census/types.d.ts +176 -0
- package/build/convert/census/types.d.ts.map +1 -0
- package/build/convert/census/types.js +2 -0
- package/build/convert/census/types.js.map +1 -0
- package/build/convert/census.d.ts +4 -0
- package/build/convert/census.d.ts.map +1 -0
- package/build/convert/census.js +83 -0
- package/build/convert/census.js.map +1 -0
- package/build/convert/consts.d.ts +4 -12
- package/build/convert/consts.d.ts.map +1 -1
- package/build/convert/consts.js +4 -3
- package/build/convert/consts.js.map +1 -1
- package/build/convert/detection/types.d.ts +67 -0
- package/build/convert/detection/types.d.ts.map +1 -0
- package/build/convert/detection/types.js +2 -0
- package/build/convert/detection/types.js.map +1 -0
- package/build/convert/docs/types.d.ts +129 -0
- package/build/convert/docs/types.d.ts.map +1 -0
- package/build/convert/docs/types.js +2 -0
- package/build/convert/docs/types.js.map +1 -0
- package/build/convert/docs.d.ts +4 -0
- package/build/convert/docs.d.ts.map +1 -0
- package/build/convert/docs.js +9 -0
- package/build/convert/docs.js.map +1 -0
- package/build/convert/estimate/types.d.ts +77 -0
- package/build/convert/estimate/types.d.ts.map +1 -0
- package/build/convert/estimate/types.js +2 -0
- package/build/convert/estimate/types.js.map +1 -0
- package/build/convert/estimate.d.ts +11 -0
- package/build/convert/estimate.d.ts.map +1 -0
- package/build/convert/estimate.js +18 -0
- package/build/convert/estimate.js.map +1 -0
- package/build/convert/helpers.d.ts +14 -78
- package/build/convert/helpers.d.ts.map +1 -1
- package/build/convert/helpers.js +27 -300
- package/build/convert/helpers.js.map +1 -1
- package/build/convert/index.d.ts +15 -0
- package/build/convert/index.d.ts.map +1 -1
- package/build/convert/index.js +6 -0
- package/build/convert/index.js.map +1 -1
- package/build/convert/origin/types.d.ts +41 -0
- package/build/convert/origin/types.d.ts.map +1 -0
- package/build/convert/origin/types.js +2 -0
- package/build/convert/origin/types.js.map +1 -0
- package/build/convert/origin.d.ts +4 -0
- package/build/convert/origin.d.ts.map +1 -0
- package/build/convert/origin.js +25 -0
- package/build/convert/origin.js.map +1 -0
- package/build/convert/record/types.d.ts +98 -0
- package/build/convert/record/types.d.ts.map +1 -0
- package/build/convert/record/types.js +2 -0
- package/build/convert/record/types.js.map +1 -0
- package/build/convert/schemas.d.ts +7 -6
- package/build/convert/schemas.d.ts.map +1 -1
- package/build/convert/schemas.js +1 -5
- package/build/convert/schemas.js.map +1 -1
- package/build/convert/stage/types.d.ts +27 -0
- package/build/convert/stage/types.d.ts.map +1 -0
- package/build/convert/stage/types.js +2 -0
- package/build/convert/stage/types.js.map +1 -0
- package/build/convert/stage.d.ts +4 -0
- package/build/convert/stage.d.ts.map +1 -0
- package/build/convert/stage.js +25 -0
- package/build/convert/stage.js.map +1 -0
- package/build/convert/taxonomy/types.d.ts +71 -0
- package/build/convert/taxonomy/types.d.ts.map +1 -0
- package/build/convert/taxonomy/types.js +2 -0
- package/build/convert/taxonomy/types.js.map +1 -0
- package/build/convert/types.d.ts +1 -648
- package/build/convert/types.d.ts.map +1 -1
- package/build/convert/utils.d.ts +5 -0
- package/build/convert/utils.d.ts.map +1 -0
- package/build/convert/utils.js +6 -0
- package/build/convert/utils.js.map +1 -0
- package/build/design/consts.d.ts +37 -0
- package/build/design/consts.d.ts.map +1 -1
- package/build/design/consts.js +44 -8
- package/build/design/consts.js.map +1 -1
- package/build/design/helpers.d.ts +9 -49
- package/build/design/helpers.d.ts.map +1 -1
- package/build/design/helpers.js +17 -224
- package/build/design/helpers.js.map +1 -1
- package/build/design/index.d.ts +3 -0
- package/build/design/index.d.ts.map +1 -1
- package/build/design/index.js +1 -0
- package/build/design/index.js.map +1 -1
- package/build/design/runtime/types.d.ts +16 -0
- package/build/design/runtime/types.d.ts.map +1 -0
- package/build/design/runtime/types.js +2 -0
- package/build/design/runtime/types.js.map +1 -0
- package/build/design/runtime.d.ts +8 -105
- package/build/design/runtime.d.ts.map +1 -1
- package/build/design/runtime.js +13 -48
- package/build/design/runtime.js.map +1 -1
- package/build/design/schemas.d.ts +1 -9
- package/build/design/schemas.d.ts.map +1 -1
- package/build/design/schemas.js +1 -1
- package/build/design/schemas.js.map +1 -1
- package/build/design/story/types.d.ts +67 -0
- package/build/design/story/types.d.ts.map +1 -0
- package/build/design/story/types.js +2 -0
- package/build/design/story/types.js.map +1 -0
- package/build/design/story.d.ts +4 -0
- package/build/design/story.d.ts.map +1 -0
- package/build/design/story.js +184 -0
- package/build/design/story.js.map +1 -0
- package/build/design/types.d.ts +75 -1
- package/build/design/types.d.ts.map +1 -1
- package/build/dev/schemas.d.ts.map +1 -1
- package/build/dev/schemas.js.map +1 -1
- package/build/dev/types.local.d.ts +5 -0
- package/build/dev/types.local.d.ts.map +1 -0
- package/build/dev/types.local.js +2 -0
- package/build/dev/types.local.js.map +1 -0
- package/build/integrity/consts.d.ts +0 -117
- package/build/integrity/consts.d.ts.map +1 -1
- package/build/integrity/consts.js +0 -281
- package/build/integrity/consts.js.map +1 -1
- package/build/integrity/consts.local.d.ts +5 -0
- package/build/integrity/consts.local.d.ts.map +1 -0
- package/build/integrity/consts.local.js +5 -0
- package/build/integrity/consts.local.js.map +1 -0
- package/build/integrity/index.d.ts +5 -0
- package/build/integrity/index.d.ts.map +1 -1
- package/build/integrity/index.js +3 -0
- package/build/integrity/index.js.map +1 -1
- package/build/integrity/layout/consts.d.ts +59 -0
- package/build/integrity/layout/consts.d.ts.map +1 -0
- package/build/integrity/layout/consts.js +66 -0
- package/build/integrity/layout/consts.js.map +1 -0
- package/build/integrity/layout/consts.local.d.ts +18 -0
- package/build/integrity/layout/consts.local.d.ts.map +1 -0
- package/build/integrity/layout/consts.local.js +176 -0
- package/build/integrity/layout/consts.local.js.map +1 -0
- package/build/integrity/layout/types.d.ts +35 -0
- package/build/integrity/layout/types.d.ts.map +1 -0
- package/build/integrity/layout/types.js +2 -0
- package/build/integrity/layout/types.js.map +1 -0
- package/build/integrity/layout.d.ts +4 -0
- package/build/integrity/layout.d.ts.map +1 -0
- package/build/integrity/layout.js +25 -0
- package/build/integrity/layout.js.map +1 -0
- package/build/integrity/types.d.ts +36 -2
- package/build/integrity/types.d.ts.map +1 -1
- package/build/integrity/utils.d.ts +13 -0
- package/build/integrity/utils.d.ts.map +1 -0
- package/build/integrity/utils.js +12 -0
- package/build/integrity/utils.js.map +1 -0
- package/build/integrity/verify/types.d.ts +26 -0
- package/build/integrity/verify/types.d.ts.map +1 -0
- package/build/integrity/verify/types.js +2 -0
- package/build/integrity/verify/types.js.map +1 -0
- package/build/integrity/verify.d.ts +5 -19
- package/build/integrity/verify.d.ts.map +1 -1
- package/build/integrity/verify.js +165 -175
- package/build/integrity/verify.js.map +1 -1
- package/build/intent/consts.d.ts +16 -0
- package/build/intent/consts.d.ts.map +1 -1
- package/build/intent/consts.js +63 -0
- package/build/intent/consts.js.map +1 -1
- package/build/intent/entrypoints.d.ts +2 -12
- package/build/intent/entrypoints.d.ts.map +1 -1
- package/build/intent/entrypoints.js.map +1 -1
- package/build/intent/index.d.ts +0 -1
- package/build/intent/index.d.ts.map +1 -1
- package/build/intent/index.js +0 -1
- package/build/intent/index.js.map +1 -1
- package/build/intent/types.d.ts +13 -0
- package/build/intent/types.d.ts.map +1 -1
- package/build/metadata/consts.d.ts +33 -0
- package/build/metadata/consts.d.ts.map +1 -1
- package/build/metadata/consts.js +37 -0
- package/build/metadata/consts.js.map +1 -1
- package/build/metadata/types.d.ts +1 -33
- package/build/metadata/types.d.ts.map +1 -1
- package/build/metadata/types.js +1 -38
- package/build/metadata/types.js.map +1 -1
- package/build/moderation/index.d.ts +2 -0
- package/build/moderation/index.d.ts.map +1 -1
- package/build/moderation/index.js +1 -0
- package/build/moderation/index.js.map +1 -1
- package/build/moderation/utils.d.ts +3 -15
- package/build/moderation/utils.d.ts.map +1 -1
- package/build/moderation/utils.js +5 -30
- package/build/moderation/utils.js.map +1 -1
- package/build/moderation/verdict/types.d.ts +24 -0
- package/build/moderation/verdict/types.d.ts.map +1 -0
- package/build/moderation/verdict/types.js +2 -0
- package/build/moderation/verdict/types.js.map +1 -0
- package/build/moderation/verdict.d.ts +4 -0
- package/build/moderation/verdict.d.ts.map +1 -0
- package/build/moderation/verdict.js +21 -0
- package/build/moderation/verdict.js.map +1 -0
- package/build/planning/card/types.d.ts +42 -0
- package/build/planning/card/types.d.ts.map +1 -0
- package/build/planning/card/types.js +2 -0
- package/build/planning/card/types.js.map +1 -0
- package/build/planning/card.d.ts +4 -0
- package/build/planning/card.d.ts.map +1 -0
- package/build/planning/card.js +51 -0
- package/build/planning/card.js.map +1 -0
- package/build/planning/consts.d.ts +13 -1
- package/build/planning/consts.d.ts.map +1 -1
- package/build/planning/consts.js +13 -0
- package/build/planning/consts.js.map +1 -1
- package/build/planning/helpers.d.ts +11 -37
- package/build/planning/helpers.d.ts.map +1 -1
- package/build/planning/helpers.js +24 -103
- package/build/planning/helpers.js.map +1 -1
- package/build/planning/index.d.ts +5 -1
- package/build/planning/index.d.ts.map +1 -1
- package/build/planning/index.js +2 -1
- package/build/planning/index.js.map +1 -1
- package/build/planning/landing/types.d.ts +16 -0
- package/build/planning/landing/types.d.ts.map +1 -0
- package/build/planning/landing/types.js +2 -0
- package/build/planning/landing/types.js.map +1 -0
- package/build/planning/landing.d.ts +5 -22
- package/build/planning/landing.d.ts.map +1 -1
- package/build/planning/landing.js +21 -35
- package/build/planning/landing.js.map +1 -1
- package/build/planning/schemas.d.ts +33 -0
- package/build/planning/schemas.d.ts.map +1 -1
- package/build/planning/schemas.js +173 -4
- package/build/planning/schemas.js.map +1 -1
- package/build/planning/spec/types.d.ts +22 -0
- package/build/planning/spec/types.d.ts.map +1 -0
- package/build/planning/spec/types.js +2 -0
- package/build/planning/spec/types.js.map +1 -0
- package/build/planning/spec.d.ts +4 -0
- package/build/planning/spec.d.ts.map +1 -0
- package/build/planning/spec.js +30 -0
- package/build/planning/spec.js.map +1 -0
- package/build/planning/types.d.ts +6 -5
- package/build/planning/types.d.ts.map +1 -1
- package/build/preview/consts.d.ts +3 -1
- package/build/preview/consts.d.ts.map +1 -1
- package/build/preview/consts.js +2 -0
- package/build/preview/consts.js.map +1 -1
- package/build/preview/types.d.ts +17 -2
- package/build/preview/types.d.ts.map +1 -1
- package/build/scaffold/consts.d.ts +40 -1
- package/build/scaffold/consts.d.ts.map +1 -1
- package/build/scaffold/consts.js +52 -0
- package/build/scaffold/consts.js.map +1 -1
- package/build/scaffold/helpers.d.ts +5 -30
- package/build/scaffold/helpers.d.ts.map +1 -1
- package/build/scaffold/helpers.js +9 -53
- package/build/scaffold/helpers.js.map +1 -1
- package/build/scaffold/index.d.ts +4 -0
- package/build/scaffold/index.d.ts.map +1 -1
- package/build/scaffold/index.js +2 -0
- package/build/scaffold/index.js.map +1 -1
- package/build/scaffold/landing/types.d.ts +48 -0
- package/build/scaffold/landing/types.d.ts.map +1 -0
- package/build/scaffold/landing/types.js +2 -0
- package/build/scaffold/landing/types.js.map +1 -0
- package/build/scaffold/landing.d.ts +4 -0
- package/build/scaffold/landing.d.ts.map +1 -0
- package/build/scaffold/landing.js +95 -0
- package/build/scaffold/landing.js.map +1 -0
- package/build/scaffold/schemas.d.ts +3 -2
- package/build/scaffold/schemas.d.ts.map +1 -1
- package/build/scaffold/schemas.js +177 -7
- package/build/scaffold/schemas.js.map +1 -1
- package/build/scaffold/share/types.d.ts +35 -0
- package/build/scaffold/share/types.d.ts.map +1 -0
- package/build/scaffold/share/types.js +2 -0
- package/build/scaffold/share/types.js.map +1 -0
- package/build/scaffold/share.d.ts +4 -0
- package/build/scaffold/share.d.ts.map +1 -0
- package/build/scaffold/share.js +42 -0
- package/build/scaffold/share.js.map +1 -0
- package/build/scaffold/types.d.ts +114 -2
- package/build/scaffold/types.d.ts.map +1 -1
- package/build/skills/consts.d.ts +42 -0
- package/build/skills/consts.d.ts.map +1 -1
- package/build/skills/consts.js +43 -0
- package/build/skills/consts.js.map +1 -1
- package/build/skills/index.d.ts +0 -1
- package/build/skills/index.d.ts.map +1 -1
- package/build/skills/index.js +0 -1
- package/build/skills/index.js.map +1 -1
- package/build/slot/command/types.d.ts +21 -0
- package/build/slot/command/types.d.ts.map +1 -0
- package/build/slot/command/types.js +2 -0
- package/build/slot/command/types.js.map +1 -0
- package/build/slot/command.d.ts +4 -0
- package/build/slot/command.d.ts.map +1 -0
- package/build/slot/command.js +31 -0
- package/build/slot/command.js.map +1 -0
- package/build/slot/consts.d.ts +7 -13
- package/build/slot/consts.d.ts.map +1 -1
- package/build/slot/consts.js +10 -36
- package/build/slot/consts.js.map +1 -1
- package/build/slot/helpers.d.ts +3 -22
- package/build/slot/helpers.d.ts.map +1 -1
- package/build/slot/helpers.js +5 -26
- package/build/slot/helpers.js.map +1 -1
- package/build/slot/index.d.ts +6 -0
- package/build/slot/index.d.ts.map +1 -1
- package/build/slot/index.js +3 -0
- package/build/slot/index.js.map +1 -1
- package/build/slot/layout/types.d.ts +17 -0
- package/build/slot/layout/types.d.ts.map +1 -0
- package/build/slot/layout/types.js +2 -0
- package/build/slot/layout/types.js.map +1 -0
- package/build/slot/layout.d.ts +5 -66
- package/build/slot/layout.d.ts.map +1 -1
- package/build/slot/layout.js +13 -27
- package/build/slot/layout.js.map +1 -1
- package/build/slot/origin/types.d.ts +23 -0
- package/build/slot/origin/types.d.ts.map +1 -0
- package/build/slot/origin/types.js +2 -0
- package/build/slot/origin/types.js.map +1 -0
- package/build/slot/origin.d.ts +4 -0
- package/build/slot/origin.d.ts.map +1 -0
- package/build/slot/origin.js +15 -0
- package/build/slot/origin.js.map +1 -0
- package/build/slot/types.d.ts +55 -1
- package/build/slot/types.d.ts.map +1 -1
- package/build/slot/utils.d.ts +6 -0
- package/build/slot/utils.d.ts.map +1 -0
- package/build/slot/utils.js +6 -0
- package/build/slot/utils.js.map +1 -0
- package/build/topology/card/types.d.ts +21 -0
- package/build/topology/card/types.d.ts.map +1 -0
- package/build/topology/card/types.js +2 -0
- package/build/topology/card/types.js.map +1 -0
- package/build/topology/card.d.ts +7 -19
- package/build/topology/card.d.ts.map +1 -1
- package/build/topology/card.js +84 -89
- package/build/topology/card.js.map +1 -1
- package/build/topology/consts.local.d.ts +4 -0
- package/build/topology/consts.local.d.ts.map +1 -0
- package/build/topology/consts.local.js +4 -0
- package/build/topology/consts.local.js.map +1 -0
- package/build/topology/helpers.d.ts +7 -33
- package/build/topology/helpers.d.ts.map +1 -1
- package/build/topology/helpers.js +15 -111
- package/build/topology/helpers.js.map +1 -1
- package/build/topology/index.d.ts +3 -0
- package/build/topology/index.d.ts.map +1 -1
- package/build/topology/index.js +1 -0
- package/build/topology/index.js.map +1 -1
- package/build/topology/resolve/types.d.ts +47 -0
- package/build/topology/resolve/types.d.ts.map +1 -0
- package/build/topology/resolve/types.js +2 -0
- package/build/topology/resolve/types.js.map +1 -0
- package/build/topology/resolve.d.ts +4 -0
- package/build/topology/resolve.d.ts.map +1 -0
- package/build/topology/resolve.js +89 -0
- package/build/topology/resolve.js.map +1 -0
- package/build/topology/types.d.ts +5 -0
- package/build/topology/types.d.ts.map +1 -1
- package/package.json +13 -13
- package/src/agent/consts.local.ts +47 -0
- package/src/agent/consts.ts +61 -0
- package/src/agent/index.ts +2 -0
- package/src/agent/presentation/types.ts +21 -0
- package/src/agent/presentation.ts +200 -309
- package/src/agent/types.local.ts +3 -0
- package/src/agent/types.ts +40 -0
- package/src/areas/consts.ts +7 -0
- package/src/areas/index.ts +1 -0
- package/src/areas/tenancy/types.ts +23 -0
- package/src/areas/tenancy.ts +26 -61
- package/src/areas/types.ts +31 -0
- package/src/ba/connecting/types.ts +45 -0
- package/src/ba/connecting.ts +64 -0
- package/src/ba/helpers.ts +8 -92
- package/src/ba/index.ts +2 -0
- package/src/ba/types.ts +1 -1
- package/src/blueprint/consts.local.ts +3 -0
- package/src/blueprint/consts.ts +52 -0
- package/src/blueprint/index.ts +1 -0
- package/src/blueprint/types.ts +4 -74
- package/src/blueprint/utils.ts +20 -0
- package/src/branding.ts +0 -17
- package/src/connect/branding/types.ts +29 -0
- package/src/connect/consts.ts +3 -22
- package/src/connect/conversion/types.ts +96 -0
- package/src/connect/entrypoints/types.ts +25 -0
- package/src/connect/entrypoints.ts +18 -35
- package/src/connect/errors/types.ts +22 -0
- package/src/connect/errors.ts +75 -0
- package/src/connect/index.ts +13 -2
- package/src/connect/kit/types.ts +56 -0
- package/src/connect/model-tier/types.ts +16 -0
- package/src/connect/model-tier.ts +22 -0
- package/src/connect/{ops.ts → ops/types.ts} +13 -3
- package/src/connect/pipeline/types.ts +41 -0
- package/src/connect/project/types.ts +127 -0
- package/src/connect/references/types.local.ts +5 -0
- package/src/connect/references/types.ts +73 -0
- package/src/connect/references.ts +15 -75
- package/src/connect/schemas.ts +19 -12
- package/src/connect/session/types.ts +81 -0
- package/src/connect/settings/types.ts +52 -0
- package/src/consts.ts +17 -0
- package/src/convert/analysis/types.ts +89 -0
- package/src/convert/census/consts.local.ts +120 -0
- package/src/convert/census/types.ts +181 -0
- package/src/convert/census.ts +95 -0
- package/src/convert/consts.ts +5 -14
- package/src/convert/detection/types.ts +74 -0
- package/src/convert/docs/types.ts +151 -0
- package/src/convert/docs.ts +15 -0
- package/src/convert/estimate/types.ts +75 -0
- package/src/convert/estimate.ts +19 -0
- package/src/convert/helpers.ts +29 -328
- package/src/convert/index.ts +15 -0
- package/src/convert/origin/types.ts +43 -0
- package/src/convert/origin.ts +33 -0
- package/src/convert/record/types.ts +105 -0
- package/src/convert/schemas.ts +13 -12
- package/src/convert/stage/types.ts +27 -0
- package/src/convert/stage.ts +31 -0
- package/src/convert/taxonomy/types.ts +74 -0
- package/src/convert/types.ts +5 -703
- package/src/convert/utils.ts +7 -0
- package/src/design/consts.ts +48 -0
- package/src/design/helpers.ts +20 -245
- package/src/design/index.ts +3 -0
- package/src/design/runtime/types.ts +14 -0
- package/src/design/runtime.ts +18 -116
- package/src/design/schemas.ts +2 -10
- package/src/design/story/types.ts +67 -0
- package/src/design/story.ts +221 -0
- package/src/design/types.ts +81 -1
- package/src/dev/schemas.ts +1 -3
- package/src/dev/types.local.ts +4 -0
- package/src/integrity/consts.local.ts +5 -0
- package/src/integrity/consts.ts +0 -348
- package/src/integrity/index.ts +5 -0
- package/src/integrity/layout/consts.local.ts +188 -0
- package/src/integrity/layout/consts.ts +79 -0
- package/src/integrity/layout/types.ts +35 -0
- package/src/integrity/layout.ts +39 -0
- package/src/integrity/types.ts +37 -2
- package/src/integrity/utils.ts +21 -0
- package/src/integrity/verify/types.ts +26 -0
- package/src/integrity/verify.ts +178 -184
- package/src/intent/consts.ts +67 -0
- package/src/intent/entrypoints.ts +2 -3
- package/src/intent/index.ts +0 -1
- package/src/intent/types.ts +10 -0
- package/src/metadata/consts.ts +37 -0
- package/src/metadata/types.ts +1 -37
- package/src/moderation/index.ts +2 -0
- package/src/moderation/utils.ts +7 -30
- package/src/moderation/verdict/types.ts +22 -0
- package/src/moderation/verdict.ts +28 -0
- package/src/planning/card/types.ts +44 -0
- package/src/planning/card.ts +77 -0
- package/src/planning/consts.ts +15 -2
- package/src/planning/helpers.ts +28 -116
- package/src/planning/index.ts +5 -1
- package/src/planning/landing/types.ts +15 -0
- package/src/planning/landing.ts +28 -38
- package/src/planning/schemas.ts +191 -4
- package/src/planning/spec/types.ts +22 -0
- package/src/planning/spec.ts +41 -0
- package/src/planning/types.ts +6 -6
- package/src/preview/consts.ts +2 -0
- package/src/preview/types.ts +19 -0
- package/src/scaffold/consts.ts +65 -1
- package/src/scaffold/helpers.ts +14 -80
- package/src/scaffold/index.ts +4 -0
- package/src/scaffold/landing/types.ts +48 -0
- package/src/scaffold/landing.ts +120 -0
- package/src/scaffold/schemas.ts +183 -7
- package/src/scaffold/share/types.ts +35 -0
- package/src/scaffold/share.ts +60 -0
- package/src/scaffold/types.ts +123 -1
- package/src/skills/consts.ts +46 -0
- package/src/skills/index.ts +0 -1
- package/src/slot/command/types.ts +21 -0
- package/src/slot/command.ts +38 -0
- package/src/slot/consts.ts +11 -40
- package/src/slot/helpers.ts +6 -31
- package/src/slot/index.ts +6 -0
- package/src/slot/layout/types.ts +17 -0
- package/src/slot/layout.ts +19 -77
- package/src/slot/origin/types.ts +23 -0
- package/src/slot/origin.ts +20 -0
- package/src/slot/types.ts +58 -1
- package/src/slot/utils.ts +10 -0
- package/src/topology/card/types.ts +21 -0
- package/src/topology/card.ts +85 -90
- package/src/topology/consts.local.ts +6 -0
- package/src/topology/helpers.ts +20 -125
- package/src/topology/index.ts +3 -0
- package/src/topology/resolve/types.ts +47 -0
- package/src/topology/resolve.ts +118 -0
- package/src/topology/types.ts +6 -0
- package/tests/blueprint.spec.ts +1 -2
- package/tests/branding.spec.ts +2 -2
- package/tests/connect-convert.spec.ts +21 -1
- package/tests/connect-errors.spec.ts +34 -1
- package/tests/convert.spec.ts +51 -52
- package/tests/design.spec.ts +13 -16
- package/tests/error-status.spec.ts +7 -1
- package/tests/planning.spec.ts +58 -75
- package/tests/presentation.spec.ts +21 -23
- package/tests/scaffold.spec.ts +286 -6
- package/tests/tenancy.spec.ts +21 -21
- package/build/connect/ops.d.ts.map +0 -1
- package/build/connect/ops.js +0 -2
- package/build/connect/ops.js.map +0 -1
- package/build/connect/types.d.ts +0 -437
- package/build/connect/types.d.ts.map +0 -1
- package/build/intent/flow.d.ts +0 -17
- package/build/intent/flow.d.ts.map +0 -1
- package/build/intent/flow.js +0 -65
- package/build/intent/flow.js.map +0 -1
- package/build/planning/flows.d.ts +0 -34
- package/build/planning/flows.d.ts.map +0 -1
- package/build/planning/flows.js +0 -174
- package/build/planning/flows.js.map +0 -1
- package/build/skills/roles.d.ts +0 -43
- package/build/skills/roles.d.ts.map +0 -1
- package/build/skills/roles.js +0 -44
- package/build/skills/roles.js.map +0 -1
- package/src/connect/types.ts +0 -466
- package/src/intent/flow.ts +0 -67
- package/src/planning/flows.ts +0 -204
- package/src/skills/roles.ts +0 -46
- /package/build/{connect → agent/presentation}/types.js +0 -0
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { GuestHomePlan, LandingBand, LandingMenuEntry, LandingSlot } from '../types.js'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* ONE reading of what a landing page draws, so the stamper, the menu and the link planner agree.
|
|
5
|
+
*
|
|
6
|
+
* Pure, IO-free and total over a stored plan of any age: every optional band may be absent or
|
|
7
|
+
* `null`, and blank model text counts as absent.
|
|
8
|
+
*/
|
|
9
|
+
export interface LandingPlanHelper {
|
|
10
|
+
/**
|
|
11
|
+
* The bands a landing page draws, in the house order `LANDING_BAND_ORDER`.
|
|
12
|
+
*
|
|
13
|
+
* One presence rule per band:
|
|
14
|
+
*
|
|
15
|
+
* - `hero`, `features`, `problem` (problem and solution) — always;
|
|
16
|
+
* - `steps` — at least one step with a title;
|
|
17
|
+
* - `use-cases` — at least `LANDING_USE_CASES.min` titled cases;
|
|
18
|
+
* - `differentiator` — at least `LANDING_CONTRAST.min` contrast rows filled on both sides,
|
|
19
|
+
* OR a title and a text: the band is a heading and a paragraph, and the table under them is
|
|
20
|
+
* drawn only when it has enough rows;
|
|
21
|
+
* - `approach` — at least `LANDING_PRINCIPLES.min` titled principles;
|
|
22
|
+
* - `testimonials` — at least two quotes;
|
|
23
|
+
* - `about` — a title and a text;
|
|
24
|
+
* - `closing` — whenever the plan carries one.
|
|
25
|
+
*/
|
|
26
|
+
landingBandsOf: (home: GuestHomePlan) => LandingBand[]
|
|
27
|
+
/**
|
|
28
|
+
* The guest header menu a page draws.
|
|
29
|
+
*
|
|
30
|
+
* Keeps only entries whose band the page draws (and whose anchor exists), the first of each
|
|
31
|
+
* anchor, in page order; caps the list at `max` (never below `LANDING_MENU.min`); then pads
|
|
32
|
+
* to `LANDING_MENU.min` with `how`, `features` and the first other band the page draws. A
|
|
33
|
+
* label falls back to the page's own section label, then to `LANDING_ANCHOR_LABELS`.
|
|
34
|
+
*/
|
|
35
|
+
landingMenuOf: (home: GuestHomePlan, max?: number) => LandingMenuEntry[]
|
|
36
|
+
/**
|
|
37
|
+
* The buttons and links of a landing page that exist — the places a home link can attach to,
|
|
38
|
+
* in page order.
|
|
39
|
+
*
|
|
40
|
+
* - `hero.cta` and `closing.primary` (with a closing) — only without a usable gate, which takes
|
|
41
|
+
* their place (`LANDING_GATE_SLOTS`);
|
|
42
|
+
* - `hero.secondary` — only without a usable gate, and only when the plan labels it;
|
|
43
|
+
* - `hero.browse`, `closing.secondary` — when the plan labels them;
|
|
44
|
+
* - `closing.link.N` — one per titled closing card, at most two;
|
|
45
|
+
* - `useCase.N` — one per drawn case, when the use-cases band is drawn.
|
|
46
|
+
*/
|
|
47
|
+
homeSlotsOf: (home: GuestHomePlan) => LandingSlot[]
|
|
48
|
+
}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import {
|
|
2
|
+
LANDING_ANCHOR_BAND, LANDING_ANCHOR_LABELS, LANDING_ANCHORS, LANDING_BAND_ORDER, LANDING_CONTRAST,
|
|
3
|
+
LANDING_MENU, LANDING_PRINCIPLES, LANDING_USE_CASES,
|
|
4
|
+
} from './consts.js'
|
|
5
|
+
import type { GuestHomePlan, LandingAnchor, LandingBand, LandingMenuEntry, LandingSlot } from './types.js'
|
|
6
|
+
import type { LandingPlanHelper } from './landing/types.js'
|
|
7
|
+
|
|
8
|
+
const filled = (value: string | null | undefined): boolean => (value?.trim() ?? '') !== ''
|
|
9
|
+
|
|
10
|
+
export const createLandingPlanHelper = (): LandingPlanHelper => {
|
|
11
|
+
/** The use cases a page draws: titled ones, at most {@link LANDING_USE_CASES}.max. */
|
|
12
|
+
const drawnUseCases = (home: GuestHomePlan) =>
|
|
13
|
+
(home.useCases?.cases ?? []).filter(entry => filled(entry.title)).slice(0, LANDING_USE_CASES.max)
|
|
14
|
+
|
|
15
|
+
/** The closing link cards a page draws: titled ones, at most two. */
|
|
16
|
+
const drawnClosingLinks = (home: GuestHomePlan) =>
|
|
17
|
+
(home.closing?.links ?? []).filter(entry => filled(entry.title)).slice(0, 2)
|
|
18
|
+
|
|
19
|
+
/** Whether the gate is drawn: a gate is a form, and one without fields is no gate at all. */
|
|
20
|
+
const usableGate = (home: GuestHomePlan): boolean =>
|
|
21
|
+
home.gate != null && (home.gate.fields ?? []).length > 0
|
|
22
|
+
|
|
23
|
+
/** One presence rule per band — see {@link LandingPlanHelper.landingBandsOf}. */
|
|
24
|
+
const bandPresent: Record<LandingBand, (home: GuestHomePlan) => boolean> = {
|
|
25
|
+
hero: () => true,
|
|
26
|
+
steps: home => (home.steps ?? []).some(step => filled(step.title)),
|
|
27
|
+
features: () => true,
|
|
28
|
+
'use-cases': home => drawnUseCases(home).length >= LANDING_USE_CASES.min,
|
|
29
|
+
problem: () => true,
|
|
30
|
+
differentiator: home => {
|
|
31
|
+
const band = home.differentiator
|
|
32
|
+
if (band == null) return false
|
|
33
|
+
const rows = (band.contrast ?? []).filter(row => filled(row.usual) && filled(row.ours))
|
|
34
|
+
|
|
35
|
+
return rows.length >= LANDING_CONTRAST.min || (filled(band.title) && filled(band.text))
|
|
36
|
+
},
|
|
37
|
+
approach: home =>
|
|
38
|
+
(home.approach?.principles ?? []).filter(entry => filled(entry.title)).length >= LANDING_PRINCIPLES.min,
|
|
39
|
+
testimonials: home => (home.testimonials ?? []).filter(entry => filled(entry.quote)).length >= 2,
|
|
40
|
+
about: home => home.about != null && filled(home.about.title) && filled(home.about.text),
|
|
41
|
+
closing: home => home.closing != null,
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
const landingBandsOf: LandingPlanHelper['landingBandsOf'] = home =>
|
|
45
|
+
LANDING_BAND_ORDER.filter(band => bandPresent[band](home))
|
|
46
|
+
|
|
47
|
+
/** The page's own section label for an anchor's band, when the plan wrote one. */
|
|
48
|
+
const sectionLabel = (home: GuestHomePlan, anchor: LandingAnchor): string | null | undefined => {
|
|
49
|
+
const labels = home.labels ?? {}
|
|
50
|
+
switch (anchor) {
|
|
51
|
+
case 'how': return labels.steps
|
|
52
|
+
case 'features': return labels.features
|
|
53
|
+
case 'use-cases': return labels.useCases
|
|
54
|
+
case 'why': return labels.differentiator
|
|
55
|
+
case 'approach': return labels.approach
|
|
56
|
+
case 'community': return labels.testimonials
|
|
57
|
+
case 'about': return labels.about
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
const landingMenuOf: LandingPlanHelper['landingMenuOf'] = (home, max = LANDING_MENU.max) => {
|
|
62
|
+
const bands = landingBandsOf(home)
|
|
63
|
+
const drawn = (anchor: LandingAnchor) =>
|
|
64
|
+
LANDING_ANCHORS.includes(anchor) && bands.includes(LANDING_ANCHOR_BAND[anchor])
|
|
65
|
+
const order = (anchor: LandingAnchor) => LANDING_ANCHORS.indexOf(anchor)
|
|
66
|
+
const label = (anchor: LandingAnchor, own?: string | null): string => {
|
|
67
|
+
const candidates = [own, sectionLabel(home, anchor)]
|
|
68
|
+
const chosen = candidates.find(filled)
|
|
69
|
+
|
|
70
|
+
return chosen?.trim() ?? LANDING_ANCHOR_LABELS[anchor]
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
const chosen: LandingMenuEntry[] = []
|
|
74
|
+
for (const entry of home.menu ?? []) {
|
|
75
|
+
if (entry == null || !drawn(entry.anchor) || chosen.some(kept => kept.anchor === entry.anchor)) {
|
|
76
|
+
continue
|
|
77
|
+
}
|
|
78
|
+
chosen.push({ anchor: entry.anchor, label: label(entry.anchor, entry.label) })
|
|
79
|
+
}
|
|
80
|
+
chosen.sort((a, b) => order(a.anchor) - order(b.anchor))
|
|
81
|
+
chosen.splice(Math.max(LANDING_MENU.min, max))
|
|
82
|
+
|
|
83
|
+
const padding: LandingAnchor[] = ['how', 'features', ...LANDING_ANCHORS.filter(
|
|
84
|
+
anchor => anchor !== 'how' && anchor !== 'features'
|
|
85
|
+
)]
|
|
86
|
+
for (const anchor of padding) {
|
|
87
|
+
if (chosen.length >= LANDING_MENU.min) break
|
|
88
|
+
if (drawn(anchor) && !chosen.some(kept => kept.anchor === anchor)) {
|
|
89
|
+
chosen.push({ anchor, label: label(anchor) })
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
return chosen.sort((a, b) => order(a.anchor) - order(b.anchor))
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
const homeSlotsOf: LandingPlanHelper['homeSlotsOf'] = home => {
|
|
97
|
+
const gate = usableGate(home)
|
|
98
|
+
const slots: LandingSlot[] = []
|
|
99
|
+
|
|
100
|
+
if (!gate) slots.push('hero.cta')
|
|
101
|
+
if (!gate && filled(home.hero.secondary?.label)) slots.push('hero.secondary')
|
|
102
|
+
if (filled(home.hero.browse?.label)) slots.push('hero.browse')
|
|
103
|
+
|
|
104
|
+
if (bandPresent['use-cases'](home)) {
|
|
105
|
+
drawnUseCases(home).forEach((_, index) => slots.push(`useCase.${index + 1}` as LandingSlot))
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
if (home.closing != null) {
|
|
109
|
+
if (!gate) slots.push('closing.primary')
|
|
110
|
+
if (filled(home.closing.secondary?.label)) slots.push('closing.secondary')
|
|
111
|
+
drawnClosingLinks(home).forEach((_, index) => slots.push(`closing.link.${index + 1}` as LandingSlot))
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
return slots
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
return { landingBandsOf, landingMenuOf, homeSlotsOf }
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
export const landingPlanHelper = createLandingPlanHelper()
|
package/src/scaffold/schemas.ts
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import type { JSONSchemaType } from 'ajv'
|
|
2
2
|
|
|
3
3
|
import { ProjectArea } from '../areas/consts.js'
|
|
4
|
-
import {
|
|
4
|
+
import {
|
|
5
|
+
BENTO_FRAGMENT_KINDS, LANDING_ANCHORS, LANDING_GATE_FIELD_KINDS, LANDING_SLOTS, WidgetKind,
|
|
6
|
+
} from './consts.js'
|
|
5
7
|
import type {
|
|
6
8
|
BentoFragment, GuestHomePlan, LandingGateAnswer, LandingGateField, LandingGatePlan, ProductIdentity,
|
|
7
9
|
ScaffoldAreaPlan, ScaffoldPlan, ScaffoldStoryPlan, SketchContent,
|
|
@@ -352,6 +354,27 @@ const LandingGatePlanSchema: JSONSchemaType<LandingGatePlan> = {
|
|
|
352
354
|
additionalProperties: false,
|
|
353
355
|
}
|
|
354
356
|
|
|
357
|
+
/**
|
|
358
|
+
* The `basis` every band added with the gated landing page carries — one text, so the model reads
|
|
359
|
+
* the same rule on each band and the check downstream has one contract to enforce.
|
|
360
|
+
*/
|
|
361
|
+
const BASIS_TEXT = 'A short passage (a few words up to one sentence) copied EXACTLY, word for word,'
|
|
362
|
+
+ ' from the person\'s own words, the specification or the vision, that this band is built on.'
|
|
363
|
+
+ ' It is checked; a band whose basis is not found there is removed.'
|
|
364
|
+
|
|
365
|
+
const basis = { type: 'string' as const, description: BASIS_TEXT }
|
|
366
|
+
|
|
367
|
+
/** A title + text pair inside a band — required, because the band object itself is optional. */
|
|
368
|
+
const titledText = (title: string, text: string) => ({
|
|
369
|
+
type: 'object' as const,
|
|
370
|
+
properties: {
|
|
371
|
+
title: { type: 'string' as const, description: title },
|
|
372
|
+
text: { type: 'string' as const, description: text },
|
|
373
|
+
},
|
|
374
|
+
required: ['title', 'text'] as ('title' | 'text')[],
|
|
375
|
+
additionalProperties: false as const,
|
|
376
|
+
})
|
|
377
|
+
|
|
355
378
|
const GuestHomePlanSchema: JSONSchemaType<GuestHomePlan> = {
|
|
356
379
|
type: 'object',
|
|
357
380
|
title: 'GuestHomePlan',
|
|
@@ -425,7 +448,7 @@ const GuestHomePlanSchema: JSONSchemaType<GuestHomePlan> = {
|
|
|
425
448
|
+ ' specification actually describes. Give most of them a fragment'
|
|
426
449
|
},
|
|
427
450
|
testimonials: {
|
|
428
|
-
type: 'array',
|
|
451
|
+
type: 'array', nullable: true,
|
|
429
452
|
items: {
|
|
430
453
|
type: 'object',
|
|
431
454
|
properties: {
|
|
@@ -436,7 +459,8 @@ const GuestHomePlanSchema: JSONSchemaType<GuestHomePlan> = {
|
|
|
436
459
|
required: ['quote', 'name', 'role'],
|
|
437
460
|
additionalProperties: false,
|
|
438
461
|
},
|
|
439
|
-
description: '2 illustrative testimonials
|
|
462
|
+
description: 'OPTIONAL: 0 or exactly 2 illustrative testimonials; leave it out unless the'
|
|
463
|
+
+ ' product\'s end users choose it for themselves. No ratings, no numbers, no company names'
|
|
440
464
|
},
|
|
441
465
|
steps: {
|
|
442
466
|
type: 'array', nullable: true,
|
|
@@ -452,6 +476,94 @@ const GuestHomePlanSchema: JSONSchemaType<GuestHomePlan> = {
|
|
|
452
476
|
description: '"How it works": 3 steps taken from the main flow, in order, the last one'
|
|
453
477
|
+ ' delivering the value'
|
|
454
478
|
},
|
|
479
|
+
useCases: {
|
|
480
|
+
type: 'object', nullable: true,
|
|
481
|
+
description: 'OPTIONAL "Use cases": who the product is for, case by case - only cases the'
|
|
482
|
+
+ ' person\'s words, the specification or the vision actually name',
|
|
483
|
+
properties: {
|
|
484
|
+
cases: {
|
|
485
|
+
type: 'array',
|
|
486
|
+
items: {
|
|
487
|
+
type: 'object',
|
|
488
|
+
properties: {
|
|
489
|
+
audience: { type: 'string', description: 'Who this case is for, 1-4 words' },
|
|
490
|
+
title: { type: 'string', description: 'What they do with the product, 2-5 words' },
|
|
491
|
+
text: { type: 'string', description: 'One sentence on what it gives them' },
|
|
492
|
+
},
|
|
493
|
+
required: ['audience', 'title', 'text'],
|
|
494
|
+
additionalProperties: false,
|
|
495
|
+
},
|
|
496
|
+
description: '2 to 4 cases',
|
|
497
|
+
},
|
|
498
|
+
basis,
|
|
499
|
+
},
|
|
500
|
+
required: ['cases', 'basis'],
|
|
501
|
+
additionalProperties: false,
|
|
502
|
+
},
|
|
503
|
+
differentiator: {
|
|
504
|
+
type: 'object', nullable: true,
|
|
505
|
+
description: 'OPTIONAL "Why us": what this product does differently from the usual way,'
|
|
506
|
+
+ ' only when the person\'s words, the specification or the vision say so',
|
|
507
|
+
properties: {
|
|
508
|
+
title: { type: 'string', description: 'The difference in 3-6 words' },
|
|
509
|
+
text: { type: 'string', description: 'One or two sentences on it. No invented numbers' },
|
|
510
|
+
contrast: {
|
|
511
|
+
type: 'array',
|
|
512
|
+
items: {
|
|
513
|
+
type: 'object',
|
|
514
|
+
properties: {
|
|
515
|
+
usual: { type: 'string', description: 'How it is usually done, at most 6 words' },
|
|
516
|
+
ours: { type: 'string', description: 'How this product does it, at most 6 words' },
|
|
517
|
+
},
|
|
518
|
+
required: ['usual', 'ours'],
|
|
519
|
+
additionalProperties: false,
|
|
520
|
+
},
|
|
521
|
+
description: '2 to 3 usual-vs-ours rows',
|
|
522
|
+
},
|
|
523
|
+
usualLabel: {
|
|
524
|
+
type: 'string', nullable: true,
|
|
525
|
+
description: 'OPTIONAL heading over the usual column, 1-2 words - e.g. "Usually"',
|
|
526
|
+
},
|
|
527
|
+
oursLabel: {
|
|
528
|
+
type: 'string', nullable: true,
|
|
529
|
+
description: 'OPTIONAL heading over this product\'s column, 1-2 words - e.g. "With us"',
|
|
530
|
+
},
|
|
531
|
+
basis,
|
|
532
|
+
},
|
|
533
|
+
required: ['title', 'text', 'contrast', 'basis'],
|
|
534
|
+
additionalProperties: false,
|
|
535
|
+
},
|
|
536
|
+
approach: {
|
|
537
|
+
type: 'object', nullable: true,
|
|
538
|
+
description: 'OPTIONAL "How we work": the principles the product is run by, only when the'
|
|
539
|
+
+ ' person\'s words, the specification or the vision state them',
|
|
540
|
+
properties: {
|
|
541
|
+
title: {
|
|
542
|
+
type: 'string', nullable: true,
|
|
543
|
+
description: 'OPTIONAL heading of the band, one short concrete sentence',
|
|
544
|
+
},
|
|
545
|
+
principles: {
|
|
546
|
+
type: 'array',
|
|
547
|
+
items: titledText('The principle, 2-4 words', 'One sentence on what it means in practice'),
|
|
548
|
+
description: '3 to 4 principles',
|
|
549
|
+
},
|
|
550
|
+
basis,
|
|
551
|
+
},
|
|
552
|
+
required: ['principles', 'basis'],
|
|
553
|
+
additionalProperties: false,
|
|
554
|
+
},
|
|
555
|
+
about: {
|
|
556
|
+
type: 'object', nullable: true,
|
|
557
|
+
description: 'OPTIONAL "About": who is behind the product, only when the person\'s words,'
|
|
558
|
+
+ ' the specification or the vision say who',
|
|
559
|
+
properties: {
|
|
560
|
+
title: { type: 'string', description: 'The heading, 2-5 words' },
|
|
561
|
+
text: { type: 'string', description: 'Two or three sentences. Nothing invented' },
|
|
562
|
+
basis,
|
|
563
|
+
},
|
|
564
|
+
required: ['title', 'text', 'basis'],
|
|
565
|
+
additionalProperties: false,
|
|
566
|
+
},
|
|
455
567
|
labels: {
|
|
456
568
|
type: 'object', nullable: true,
|
|
457
569
|
description: 'The small label over each section and that section\'s heading, in the product\'s'
|
|
@@ -472,6 +584,17 @@ const GuestHomePlanSchema: JSONSchemaType<GuestHomePlan> = {
|
|
|
472
584
|
},
|
|
473
585
|
problem: { type: 'string', nullable: true, description: 'e.g. "The problem"' },
|
|
474
586
|
solution: { type: 'string', nullable: true, description: 'e.g. "The solution"' },
|
|
587
|
+
useCases: { type: 'string', nullable: true, description: 'e.g. "Use cases"' },
|
|
588
|
+
useCasesTitle: {
|
|
589
|
+
type: 'string', nullable: true, description: 'e.g. "Made for every kind of home baker."'
|
|
590
|
+
},
|
|
591
|
+
differentiator: { type: 'string', nullable: true, description: 'e.g. "Why us"' },
|
|
592
|
+
approach: { type: 'string', nullable: true, description: 'e.g. "How we work"' },
|
|
593
|
+
approachTitle: {
|
|
594
|
+
type: 'string', nullable: true,
|
|
595
|
+
description: 'e.g. "Small batches, honest notes." - used when the approach has no title'
|
|
596
|
+
},
|
|
597
|
+
about: { type: 'string', nullable: true, description: 'e.g. "About"' },
|
|
475
598
|
},
|
|
476
599
|
required: [],
|
|
477
600
|
additionalProperties: false,
|
|
@@ -511,8 +634,57 @@ const GuestHomePlanSchema: JSONSchemaType<GuestHomePlan> = {
|
|
|
511
634
|
description: 'ONLY when you were given a landing story; omit it otherwise. '
|
|
512
635
|
+ LandingGatePlanSchema.description,
|
|
513
636
|
},
|
|
637
|
+
menu: {
|
|
638
|
+
type: 'array', nullable: true,
|
|
639
|
+
items: {
|
|
640
|
+
type: 'object',
|
|
641
|
+
properties: {
|
|
642
|
+
anchor: {
|
|
643
|
+
type: 'string',
|
|
644
|
+
enum: LANDING_ANCHORS,
|
|
645
|
+
description: 'The band it jumps to: how (how it works), features, use-cases, why'
|
|
646
|
+
+ ' (the differentiator), approach (how we work), community (testimonials), about'
|
|
647
|
+
},
|
|
648
|
+
label: { type: 'string', description: 'The menu word, 1-2 words in the product\'s language' },
|
|
649
|
+
},
|
|
650
|
+
required: ['anchor', 'label'],
|
|
651
|
+
additionalProperties: false,
|
|
652
|
+
},
|
|
653
|
+
description: 'The header menu of the landing page: 2 to 4 entries, each pointing at a band'
|
|
654
|
+
+ ' this page carries, in page order'
|
|
655
|
+
},
|
|
656
|
+
links: {
|
|
657
|
+
type: 'array', nullable: true,
|
|
658
|
+
items: {
|
|
659
|
+
type: 'object',
|
|
660
|
+
properties: {
|
|
661
|
+
slot: {
|
|
662
|
+
type: 'string',
|
|
663
|
+
enum: LANDING_SLOTS,
|
|
664
|
+
description: 'The button: hero.cta, hero.secondary, hero.browse, closing.primary,'
|
|
665
|
+
+ ' closing.secondary, closing.link.1/2 (the closing cards), useCase.1-4 (the use'
|
|
666
|
+
+ ' cases in order). Without a gate only; with one, hero.cta, hero.secondary and'
|
|
667
|
+
+ ' closing.primary do not exist'
|
|
668
|
+
},
|
|
669
|
+
story: {
|
|
670
|
+
type: 'string',
|
|
671
|
+
description: 'The story code, copied EXACTLY from the story list given to you'
|
|
672
|
+
},
|
|
673
|
+
},
|
|
674
|
+
required: ['slot', 'story'],
|
|
675
|
+
additionalProperties: false,
|
|
676
|
+
},
|
|
677
|
+
description: 'Which home buttons open which user story. Leave it out when undecided; an'
|
|
678
|
+
+ ' empty list means decided: none. At most one entry per button'
|
|
679
|
+
},
|
|
680
|
+
linksDecided: {
|
|
681
|
+
type: 'array', nullable: true,
|
|
682
|
+
items: { type: 'string' },
|
|
683
|
+
description: 'Story codes whose links were decided at development time (a decision of no'
|
|
684
|
+
+ ' button included). Absent on a plan whose links the planner decided. Filled by code'
|
|
685
|
+
},
|
|
514
686
|
},
|
|
515
|
-
required: ['hero', 'problem', 'solution', 'features'
|
|
687
|
+
required: ['hero', 'problem', 'solution', 'features'],
|
|
516
688
|
additionalProperties: false,
|
|
517
689
|
}
|
|
518
690
|
|
|
@@ -567,10 +739,14 @@ export const ScaffoldPlanSchema: JSONSchemaType<ScaffoldPlan> = {
|
|
|
567
739
|
additionalProperties: false,
|
|
568
740
|
}
|
|
569
741
|
|
|
742
|
+
/** The guest home's keys a model may answer: `linksDecided` is written by code, never asked. */
|
|
743
|
+
const { linksDecided: _linksDecided, ...answeredHomeProperties } = GuestHomePlanSchema.properties!
|
|
744
|
+
|
|
570
745
|
/**
|
|
571
746
|
* The plan as the planning MODEL answers it — {@link ScaffoldPlanSchema} with the gate held to the
|
|
572
|
-
* form
|
|
573
|
-
* offering them to the model would let it write a chip
|
|
747
|
+
* form and without the code-written `linksDecided`. The stored schema keeps the pre-form gate keys
|
|
748
|
+
* optional so an old plan still validates; offering them to the model would let it write a chip
|
|
749
|
+
* picker again. Typed as the stored plan
|
|
574
750
|
* because every answer is one: the answer's gate is a subset of the stored gate.
|
|
575
751
|
*/
|
|
576
752
|
export const ScaffoldPlanAnswerSchema = {
|
|
@@ -580,7 +756,7 @@ export const ScaffoldPlanAnswerSchema = {
|
|
|
580
756
|
guestHome: {
|
|
581
757
|
...GuestHomePlanSchema,
|
|
582
758
|
properties: {
|
|
583
|
-
...
|
|
759
|
+
...answeredHomeProperties,
|
|
584
760
|
gate: {
|
|
585
761
|
...LandingGateAnswerSchema,
|
|
586
762
|
nullable: true,
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { ScaffoldPlan, ShareKind } from '../types.js'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* ONE reading of who owns a drawn artifact, so no consumer has to interpret the plan itself.
|
|
5
|
+
*
|
|
6
|
+
* The plan carries `sharesWidgetWith` / `sharesScreenWith` as untrusted hints — a model may drop
|
|
7
|
+
* them, invent a code, point forwards, or build a cycle. These resolve all of that away, and
|
|
8
|
+
* every one is TOTAL: a code the plan does not hold answers itself, which is the unshared
|
|
9
|
+
* behaviour and therefore exactly today's drawn tree.
|
|
10
|
+
*
|
|
11
|
+
* Pure and IO-free. `fillScaffoldPlan` normalises a plan through them before anything is stamped,
|
|
12
|
+
* so the stampers and the scaffold loop can read a plan that is already sane.
|
|
13
|
+
*/
|
|
14
|
+
export interface ScaffoldShareHelper {
|
|
15
|
+
/**
|
|
16
|
+
* The code whose artifact this story renders — itself when it owns one.
|
|
17
|
+
*
|
|
18
|
+
* Backward-only and bounded: an arrow is followed only to a story EARLIER in plan order, which
|
|
19
|
+
* makes a cycle unrepresentable rather than merely unlikely, and makes the owner the earliest
|
|
20
|
+
* member of its group. That is what keeps `widgetDefinition(owner)` stable — the name is a
|
|
21
|
+
* function of one code, never of the group, so adding a member renames nothing.
|
|
22
|
+
*/
|
|
23
|
+
shareOwner: (plan: Pick<ScaffoldPlan, 'stories'>, code: string, kind?: ShareKind) => string
|
|
24
|
+
/**
|
|
25
|
+
* Owner code → every member, owner first, in plan order.
|
|
26
|
+
*
|
|
27
|
+
* The shape the stampers need: one artifact per entry, and the full member list for the notice
|
|
28
|
+
* that names them.
|
|
29
|
+
*/
|
|
30
|
+
shareGroups: (plan: Pick<ScaffoldPlan, 'stories'>, kind?: ShareKind) => Map<string, string[]>
|
|
31
|
+
/** Every story that renders this owner's artifact, owner first. Total: an owner alone answers `[code]`. */
|
|
32
|
+
shareMembers: (plan: Pick<ScaffoldPlan, 'stories'>, owner: string, kind?: ShareKind) => string[]
|
|
33
|
+
/** Whether this story draws the artifact, as opposed to rendering somebody else's. */
|
|
34
|
+
ownsShare: (plan: Pick<ScaffoldPlan, 'stories'>, code: string, kind?: ShareKind) => boolean
|
|
35
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import type { ScaffoldPlan, ScaffoldStoryPlan, ShareKind } from './types.js'
|
|
2
|
+
import type { ScaffoldShareHelper } from './share/types.js'
|
|
3
|
+
|
|
4
|
+
export const createScaffoldShareHelper = (): ScaffoldShareHelper => {
|
|
5
|
+
const pointerOf = (story: ScaffoldStoryPlan, kind: ShareKind): string | undefined =>
|
|
6
|
+
kind === 'widget' ? story.sharesWidgetWith : story.sharesScreenWith
|
|
7
|
+
|
|
8
|
+
const shareOwner = (
|
|
9
|
+
plan: Pick<ScaffoldPlan, 'stories'>, code: string, kind: ShareKind = 'widget'
|
|
10
|
+
): string => {
|
|
11
|
+
const order = new Map(plan.stories.map((story, index) => [story.code, index]))
|
|
12
|
+
const byCode = new Map(plan.stories.map(story => [story.code, story]))
|
|
13
|
+
|
|
14
|
+
let current = code
|
|
15
|
+
// Bounded by the list length: every hop strictly decreases the plan index, so it terminates.
|
|
16
|
+
for (let hop = 0; hop <= plan.stories.length; hop++) {
|
|
17
|
+
const story = byCode.get(current)
|
|
18
|
+
const target = story != null ? pointerOf(story, kind) : undefined
|
|
19
|
+
if (story == null || target == null || target === '' || target === current) {
|
|
20
|
+
return current
|
|
21
|
+
}
|
|
22
|
+
const here = order.get(current)
|
|
23
|
+
const there = order.get(target)
|
|
24
|
+
// Unknown, forward or self-referential — none of them is a group, so the story owns its own.
|
|
25
|
+
if (here == null || there == null || there >= here) {
|
|
26
|
+
return current
|
|
27
|
+
}
|
|
28
|
+
current = target
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
return current
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const shareGroups = (
|
|
35
|
+
plan: Pick<ScaffoldPlan, 'stories'>, kind: ShareKind = 'widget'
|
|
36
|
+
): Map<string, string[]> => {
|
|
37
|
+
const groups = new Map<string, string[]>()
|
|
38
|
+
for (const story of plan.stories) {
|
|
39
|
+
const owner = shareOwner(plan, story.code, kind)
|
|
40
|
+
const members = groups.get(owner) ?? []
|
|
41
|
+
if (!members.includes(owner)) members.push(owner)
|
|
42
|
+
if (!members.includes(story.code)) members.push(story.code)
|
|
43
|
+
groups.set(owner, members)
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
return groups
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
const shareMembers = (
|
|
50
|
+
plan: Pick<ScaffoldPlan, 'stories'>, owner: string, kind: ShareKind = 'widget'
|
|
51
|
+
): string[] => shareGroups(plan, kind).get(owner) ?? [owner]
|
|
52
|
+
|
|
53
|
+
const ownsShare = (
|
|
54
|
+
plan: Pick<ScaffoldPlan, 'stories'>, code: string, kind: ShareKind = 'widget'
|
|
55
|
+
): boolean => shareOwner(plan, code, kind) === code
|
|
56
|
+
|
|
57
|
+
return { shareOwner, shareGroups, shareMembers, ownsShare }
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export const scaffoldShareHelper = createScaffoldShareHelper()
|
package/src/scaffold/types.ts
CHANGED
|
@@ -198,6 +198,90 @@ export interface LandingGateAnswer {
|
|
|
198
198
|
note: string
|
|
199
199
|
}
|
|
200
200
|
|
|
201
|
+
/**
|
|
202
|
+
* A band of the landing page that the header menu can jump to — the `id` its section carries.
|
|
203
|
+
* A CLOSED set: each value is one stamped band, so a value nothing draws is a menu entry that
|
|
204
|
+
* scrolls nowhere. `LANDING_ANCHOR_BAND` maps each to its band.
|
|
205
|
+
*/
|
|
206
|
+
export type LandingAnchor = 'how' | 'features' | 'use-cases' | 'why' | 'approach' | 'community' | 'about'
|
|
207
|
+
|
|
208
|
+
/**
|
|
209
|
+
* The bands a landing page can carry, named in the house order `LANDING_BAND_ORDER` declares.
|
|
210
|
+
* `problem` is the problem-and-solution band. Which of them a page draws is `landingBandsOf`.
|
|
211
|
+
*/
|
|
212
|
+
export type LandingBand =
|
|
213
|
+
| 'hero' | 'steps' | 'features' | 'use-cases' | 'problem' | 'differentiator' | 'approach'
|
|
214
|
+
| 'testimonials' | 'about' | 'closing'
|
|
215
|
+
|
|
216
|
+
/**
|
|
217
|
+
* A button or link of the landing page that can open a user story — the place a {@link HomeLink}
|
|
218
|
+
* attaches to. Which of them a given page actually draws is `homeSlotsOf`.
|
|
219
|
+
*/
|
|
220
|
+
export type LandingSlot =
|
|
221
|
+
| 'hero.cta' | 'hero.secondary' | 'hero.browse'
|
|
222
|
+
| 'closing.primary' | 'closing.secondary' | 'closing.link.1' | 'closing.link.2'
|
|
223
|
+
| 'useCase.1' | 'useCase.2' | 'useCase.3' | 'useCase.4'
|
|
224
|
+
|
|
225
|
+
/** One entry of the guest header menu: a band to jump to and the word it is shown as. */
|
|
226
|
+
export interface LandingMenuEntry {
|
|
227
|
+
anchor: LandingAnchor
|
|
228
|
+
/** 1-2 words in the product's language. */
|
|
229
|
+
label: string
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
/** A home button that opens a user story instead of its default action. */
|
|
233
|
+
export interface HomeLink {
|
|
234
|
+
slot: LandingSlot
|
|
235
|
+
/** The story's CODE. */
|
|
236
|
+
story: string
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
/** One use case of the landing page: who, doing what. */
|
|
240
|
+
export interface LandingUseCase {
|
|
241
|
+
/** Who this case is for, in a few words. */
|
|
242
|
+
audience: string
|
|
243
|
+
title: string
|
|
244
|
+
text: string
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
/**
|
|
248
|
+
* The bands added with the gated landing page carry a `basis`: a passage copied word for word from
|
|
249
|
+
* the person's own words, the specification or the vision. It is checked downstream, and a band
|
|
250
|
+
* whose basis is not found there is removed — the band exists only when its claim has a source.
|
|
251
|
+
*/
|
|
252
|
+
export interface LandingUseCases {
|
|
253
|
+
/** Two to four cases. */
|
|
254
|
+
cases: LandingUseCase[]
|
|
255
|
+
basis: string
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
/** "Why us": what this product does differently, as a short usual-vs-ours contrast. */
|
|
259
|
+
export interface LandingDifferentiator {
|
|
260
|
+
title: string
|
|
261
|
+
text: string
|
|
262
|
+
/** Two to three rows, at most six words on each side. */
|
|
263
|
+
contrast: { usual: string, ours: string }[]
|
|
264
|
+
/** The heading over the `usual` column; absent falls back to the stamper's own. */
|
|
265
|
+
usualLabel?: string | null
|
|
266
|
+
/** The heading over the `ours` column; absent falls back to the stamper's own. */
|
|
267
|
+
oursLabel?: string | null
|
|
268
|
+
basis: string
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
/** "How we work": the principles the product is run by, three to four. */
|
|
272
|
+
export interface LandingApproach {
|
|
273
|
+
title?: string | null
|
|
274
|
+
principles: { title: string, text: string }[]
|
|
275
|
+
basis: string
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
/** The about band: who is behind the product. */
|
|
279
|
+
export interface LandingAbout {
|
|
280
|
+
title: string
|
|
281
|
+
text: string
|
|
282
|
+
basis: string
|
|
283
|
+
}
|
|
284
|
+
|
|
201
285
|
/** The guest area's landing page — the product's public face. */
|
|
202
286
|
export interface GuestHomePlan {
|
|
203
287
|
hero: {
|
|
@@ -219,9 +303,21 @@ export interface GuestHomePlan {
|
|
|
219
303
|
solution: { title: string, text: string }
|
|
220
304
|
/** The bento tiles — four, each optionally anchored by a fragment of the product's interface. */
|
|
221
305
|
features: { title: string, text: string, fragment?: BentoFragment }[]
|
|
222
|
-
|
|
306
|
+
/**
|
|
307
|
+
* None or exactly two. Optional since the gated landing page: a plan stored before carries it,
|
|
308
|
+
* and a product whose end users do not choose it for themselves leaves it out.
|
|
309
|
+
*/
|
|
310
|
+
testimonials?: { quote: string, name: string, role: string }[] | null
|
|
223
311
|
/** "How it works" — three steps taken from the main flow. */
|
|
224
312
|
steps?: { title: string, text: string }[]
|
|
313
|
+
/** Who it is for, case by case. */
|
|
314
|
+
useCases?: LandingUseCases | null
|
|
315
|
+
/** "Why us". */
|
|
316
|
+
differentiator?: LandingDifferentiator | null
|
|
317
|
+
/** "How we work". */
|
|
318
|
+
approach?: LandingApproach | null
|
|
319
|
+
/** Who is behind the product. */
|
|
320
|
+
about?: LandingAbout | null
|
|
225
321
|
/** The small section labels and section headings; absent ones fall back to the stamper's own. */
|
|
226
322
|
labels?: {
|
|
227
323
|
steps?: string
|
|
@@ -232,7 +328,30 @@ export interface GuestHomePlan {
|
|
|
232
328
|
testimonialsTitle?: string
|
|
233
329
|
problem?: string
|
|
234
330
|
solution?: string
|
|
331
|
+
useCases?: string | null
|
|
332
|
+
useCasesTitle?: string | null
|
|
333
|
+
differentiator?: string | null
|
|
334
|
+
approach?: string | null
|
|
335
|
+
approachTitle?: string | null
|
|
336
|
+
about?: string | null
|
|
235
337
|
}
|
|
338
|
+
/**
|
|
339
|
+
* The guest header menu — two to four bands to jump to. Entries whose band the page does not
|
|
340
|
+
* draw are dropped; `landingMenuOf` is the one reading of it.
|
|
341
|
+
*/
|
|
342
|
+
menu?: LandingMenuEntry[] | null
|
|
343
|
+
/**
|
|
344
|
+
* Which home buttons open which user story. Absent or `null` means NOT DECIDED yet; `[]` means
|
|
345
|
+
* decided: none. A slot the page does not draw (`homeSlotsOf`) is ignored.
|
|
346
|
+
*/
|
|
347
|
+
links?: HomeLink[] | null
|
|
348
|
+
/**
|
|
349
|
+
* The story codes whose links were decided at DEVELOPMENT time, one per story asked — a decision
|
|
350
|
+
* of "no control" included. Absent (or `null`) on a plan whose links the planner decided: then
|
|
351
|
+
* {@link GuestHomePlan.links} speaks for every story of the plan. Written by code, never asked of
|
|
352
|
+
* the model.
|
|
353
|
+
*/
|
|
354
|
+
linksDecided?: string[] | null
|
|
236
355
|
/** The closing band: a headline, a lead, the two pills and two link cards. */
|
|
237
356
|
closing?: {
|
|
238
357
|
headline: string
|
|
@@ -266,3 +385,6 @@ export interface ScaffoldPlan {
|
|
|
266
385
|
*/
|
|
267
386
|
motifs: string
|
|
268
387
|
}
|
|
388
|
+
|
|
389
|
+
/** Which field the arrow is being followed along. */
|
|
390
|
+
export type ShareKind = 'widget' | 'screen'
|