@engenty/wizards-runtime 0.0.0-stage → 0.7.5
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/LICENSE +110 -0
- package/README.md +214 -2
- package/apps/runtime/dist/agents/architect.js +444 -0
- package/apps/runtime/dist/agents/studio-assistant.js +883 -0
- package/apps/runtime/dist/agents/subscription.js +207 -0
- package/apps/runtime/dist/agents/thought.js +21 -0
- package/apps/runtime/dist/agents/website.js +480 -0
- package/apps/runtime/dist/app.js +359 -0
- package/apps/runtime/dist/apple/wizards-apple +0 -0
- package/apps/runtime/dist/assistant/browser.js +26 -0
- package/apps/runtime/dist/assistant/docs.js +158 -0
- package/apps/runtime/dist/assistant/knows.js +353 -0
- package/apps/runtime/dist/assistant/primer.js +26 -0
- package/apps/runtime/dist/assistant/runs.js +24 -0
- package/apps/runtime/dist/auth/account.js +175 -0
- package/apps/runtime/dist/auth/device.js +112 -0
- package/apps/runtime/dist/auth/index.js +358 -0
- package/apps/runtime/dist/auth/keys.js +55 -0
- package/apps/runtime/dist/auth/local-ticket.js +26 -0
- package/apps/runtime/dist/authoring/example.js +74 -0
- package/apps/runtime/dist/authoring/guide.js +433 -0
- package/apps/runtime/dist/authoring/ops.js +117 -0
- package/apps/runtime/dist/browser/fast/action-space.js +160 -0
- package/apps/runtime/dist/browser/fast/classifier.js +91 -0
- package/apps/runtime/dist/browser/fast/decide.js +171 -0
- package/apps/runtime/dist/browser/fast/driver.js +141 -0
- package/apps/runtime/dist/browser/fast/instructions.js +33 -0
- package/apps/runtime/dist/browser/fast/run.js +249 -0
- package/apps/runtime/dist/browser/fast/span-picker.js +153 -0
- package/apps/runtime/dist/browser/fast/text-helper.js +178 -0
- package/apps/runtime/dist/browser/snapshot.js +335 -0
- package/apps/runtime/dist/cli/account.js +385 -0
- package/apps/runtime/dist/cli/autostart.js +182 -0
- package/apps/runtime/dist/cli/autoupdate.js +221 -0
- package/apps/runtime/dist/cli/clients.js +44 -0
- package/apps/runtime/dist/cli/connect.js +540 -0
- package/apps/runtime/dist/cli/environment.js +93 -0
- package/apps/runtime/dist/cli/exec.js +45 -0
- package/apps/runtime/dist/cli/features.js +50 -0
- package/apps/runtime/dist/cli/home.js +88 -0
- package/apps/runtime/dist/cli/install-env.js +33 -0
- package/apps/runtime/dist/cli/machine.js +107 -0
- package/apps/runtime/dist/cli/main.js +222 -0
- package/apps/runtime/dist/cli/mcp.js +136 -0
- package/apps/runtime/dist/cli/menu.js +202 -0
- package/apps/runtime/dist/cli/processes.js +72 -0
- package/apps/runtime/dist/cli/report.js +66 -0
- package/apps/runtime/dist/cli/setup.js +335 -0
- package/apps/runtime/dist/cli/start.js +276 -0
- package/apps/runtime/dist/cli/status.js +203 -0
- package/apps/runtime/dist/cli/ui.js +59 -0
- package/apps/runtime/dist/cli/uninstall-main.js +20 -0
- package/apps/runtime/dist/cli/uninstall.js +231 -0
- package/apps/runtime/dist/cli/update.js +86 -0
- package/apps/runtime/dist/cli/validate.js +75 -0
- package/apps/runtime/dist/cli/versions.js +123 -0
- package/apps/runtime/dist/connectors/builtin.js +86 -0
- package/apps/runtime/dist/connectors/external.js +409 -0
- package/apps/runtime/dist/connectors/gmail.js +107 -0
- package/apps/runtime/dist/connectors/imap.js +261 -0
- package/apps/runtime/dist/connectors/index.js +325 -0
- package/apps/runtime/dist/connectors/mail.js +72 -0
- package/apps/runtime/dist/connectors/outlook.js +90 -0
- package/apps/runtime/dist/connectors/plugin-connections.js +343 -0
- package/apps/runtime/dist/connectors/via-account.js +65 -0
- package/apps/runtime/dist/credits/credits.js +100 -0
- package/apps/runtime/dist/credits/estimate.js +152 -0
- package/apps/runtime/dist/db/adopt.js +149 -0
- package/apps/runtime/dist/db/client.js +173 -0
- package/apps/runtime/dist/db/control-schema.js +133 -0
- package/apps/runtime/dist/db/migrations/control/0000_last_absorbing_man.sql +47 -0
- package/apps/runtime/dist/db/migrations/control/0001_gorgeous_nicolaos.sql +41 -0
- package/apps/runtime/dist/db/migrations/control/0002_secret_penance.sql +1 -0
- package/apps/runtime/dist/db/migrations/control/0003_nasty_mordo.sql +3 -0
- package/apps/runtime/dist/db/migrations/control/0004_breezy_eddie_brock.sql +6 -0
- package/apps/runtime/dist/db/migrations/control/0005_chilly_oracle.sql +1 -0
- package/apps/runtime/dist/db/migrations/control/0006_sleepy_mojo.sql +1 -0
- package/apps/runtime/dist/db/migrations/control/0007_common_the_hand.sql +15 -0
- package/apps/runtime/dist/db/migrations/control/0008_runner.sql +8 -0
- package/apps/runtime/dist/db/migrations/control/0009_plugin_claim.sql +9 -0
- package/apps/runtime/dist/db/migrations/control/0010_tan_snowbird.sql +6 -0
- package/apps/runtime/dist/db/migrations/control/meta/0000_snapshot.json +311 -0
- package/apps/runtime/dist/db/migrations/control/meta/0001_snapshot.json +599 -0
- package/apps/runtime/dist/db/migrations/control/meta/0002_snapshot.json +607 -0
- package/apps/runtime/dist/db/migrations/control/meta/0003_snapshot.json +311 -0
- package/apps/runtime/dist/db/migrations/control/meta/0004_snapshot.json +350 -0
- package/apps/runtime/dist/db/migrations/control/meta/0005_snapshot.json +358 -0
- package/apps/runtime/dist/db/migrations/control/meta/0006_snapshot.json +365 -0
- package/apps/runtime/dist/db/migrations/control/meta/0007_snapshot.json +460 -0
- package/apps/runtime/dist/db/migrations/control/meta/0008_snapshot.json +505 -0
- package/apps/runtime/dist/db/migrations/control/meta/0009_snapshot.json +561 -0
- package/apps/runtime/dist/db/migrations/control/meta/0010_snapshot.json +600 -0
- package/apps/runtime/dist/db/migrations/control/meta/_journal.json +83 -0
- package/apps/runtime/dist/db/migrations/tenant/0000_eminent_freak.sql +188 -0
- package/apps/runtime/dist/db/migrations/tenant/0001_salty_master_chief.sql +1 -0
- package/apps/runtime/dist/db/migrations/tenant/0002_cloudy_firebird.sql +1 -0
- package/apps/runtime/dist/db/migrations/tenant/0003_brown_warbound.sql +52 -0
- package/apps/runtime/dist/db/migrations/tenant/0004_romantic_nocturne.sql +6 -0
- package/apps/runtime/dist/db/migrations/tenant/0005_reflective_forgotten_one.sql +2 -0
- package/apps/runtime/dist/db/migrations/tenant/0006_hard_war_machine.sql +30 -0
- package/apps/runtime/dist/db/migrations/tenant/0007_space_data.sql +43 -0
- package/apps/runtime/dist/db/migrations/tenant/0008_run_event_note.sql +1 -0
- package/apps/runtime/dist/db/migrations/tenant/0009_knowledge.sql +104 -0
- package/apps/runtime/dist/db/migrations/tenant/0010_plugin_connection.sql +15 -0
- package/apps/runtime/dist/db/migrations/tenant/0011_runners.sql +2 -0
- package/apps/runtime/dist/db/migrations/tenant/0012_assistant_chat.sql +40 -0
- package/apps/runtime/dist/db/migrations/tenant/0013_run_origin.sql +1 -0
- package/apps/runtime/dist/db/migrations/tenant/0014_run_answer.sql +2 -0
- package/apps/runtime/dist/db/migrations/tenant/0015_device_calls.sql +13 -0
- package/apps/runtime/dist/db/migrations/tenant/0016_even_trish_tilby.sql +12 -0
- package/apps/runtime/dist/db/migrations/tenant/meta/0000_snapshot.json +1323 -0
- package/apps/runtime/dist/db/migrations/tenant/meta/0001_snapshot.json +1330 -0
- package/apps/runtime/dist/db/migrations/tenant/meta/0002_snapshot.json +1337 -0
- package/apps/runtime/dist/db/migrations/tenant/meta/0003_snapshot.json +1605 -0
- package/apps/runtime/dist/db/migrations/tenant/meta/0004_snapshot.json +1645 -0
- package/apps/runtime/dist/db/migrations/tenant/meta/0005_snapshot.json +1659 -0
- package/apps/runtime/dist/db/migrations/tenant/meta/0006_snapshot.json +1696 -0
- package/apps/runtime/dist/db/migrations/tenant/meta/0007_snapshot.json +2012 -0
- package/apps/runtime/dist/db/migrations/tenant/meta/0008_snapshot.json +2019 -0
- package/apps/runtime/dist/db/migrations/tenant/meta/0009_snapshot.json +2837 -0
- package/apps/runtime/dist/db/migrations/tenant/meta/0010_snapshot.json +2942 -0
- package/apps/runtime/dist/db/migrations/tenant/meta/0011_snapshot.json +2956 -0
- package/apps/runtime/dist/db/migrations/tenant/meta/0012_snapshot.json +3132 -0
- package/apps/runtime/dist/db/migrations/tenant/meta/0013_snapshot.json +3139 -0
- package/apps/runtime/dist/db/migrations/tenant/meta/0014_snapshot.json +3154 -0
- package/apps/runtime/dist/db/migrations/tenant/meta/0015_snapshot.json +3243 -0
- package/apps/runtime/dist/db/migrations/tenant/meta/0016_snapshot.json +3326 -0
- package/apps/runtime/dist/db/migrations/tenant/meta/_journal.json +125 -0
- package/apps/runtime/dist/db/schema.js +602 -0
- package/apps/runtime/dist/debug.js +196 -0
- package/apps/runtime/dist/docs/dev/index.md +41 -0
- package/apps/runtime/dist/docs/dev/meta.json +7 -0
- package/apps/runtime/dist/docs/dev/plugins/connections.md +74 -0
- package/apps/runtime/dist/docs/dev/plugins/events.md +89 -0
- package/apps/runtime/dist/docs/dev/plugins/examples.md +101 -0
- package/apps/runtime/dist/docs/dev/plugins/index.md +78 -0
- package/apps/runtime/dist/docs/dev/plugins/layout.md +90 -0
- package/apps/runtime/dist/docs/dev/plugins/meta.json +28 -0
- package/apps/runtime/dist/docs/dev/plugins/quick-start.md +94 -0
- package/apps/runtime/dist/docs/dev/plugins/reference.md +348 -0
- package/apps/runtime/dist/docs/dev/plugins/reloading.md +76 -0
- package/apps/runtime/dist/docs/dev/plugins/routes.md +185 -0
- package/apps/runtime/dist/docs/dev/plugins/runners.md +230 -0
- package/apps/runtime/dist/docs/dev/plugins/server.md +281 -0
- package/apps/runtime/dist/docs/dev/plugins/shipping.md +79 -0
- package/apps/runtime/dist/docs/dev/plugins/space.md +297 -0
- package/apps/runtime/dist/docs/dev/plugins/starters.md +70 -0
- package/apps/runtime/dist/docs/dev/plugins/studio.md +363 -0
- package/apps/runtime/dist/docs/dev/plugins/styling.md +129 -0
- package/apps/runtime/dist/docs/dev/plugins/tables.md +104 -0
- package/apps/runtime/dist/docs/dev/plugins/tools.md +139 -0
- package/apps/runtime/dist/docs/dev/wizard-format.md +125 -0
- package/apps/runtime/dist/docs/meta.json +3 -0
- package/apps/runtime/dist/docs/user/ai-apps.md +112 -0
- package/apps/runtime/dist/docs/user/assistant.md +77 -0
- package/apps/runtime/dist/docs/user/build-a-wizard.md +116 -0
- package/apps/runtime/dist/docs/user/command-line.md +83 -0
- package/apps/runtime/dist/docs/user/connectors.md +90 -0
- package/apps/runtime/dist/docs/user/create-account.md +52 -0
- package/apps/runtime/dist/docs/user/data.md +66 -0
- package/apps/runtime/dist/docs/user/first-start.md +60 -0
- package/apps/runtime/dist/docs/user/index.md +49 -0
- package/apps/runtime/dist/docs/user/install.md +123 -0
- package/apps/runtime/dist/docs/user/local-only.md +42 -0
- package/apps/runtime/dist/docs/user/meta.json +32 -0
- package/apps/runtime/dist/docs/user/models.md +156 -0
- package/apps/runtime/dist/docs/user/plugins.md +71 -0
- package/apps/runtime/dist/docs/user/run.md +98 -0
- package/apps/runtime/dist/docs/user/server.md +52 -0
- package/apps/runtime/dist/docs/user/space.md +126 -0
- package/apps/runtime/dist/docs/user/steps.md +220 -0
- package/apps/runtime/dist/docs/user/test-and-share.md +224 -0
- package/apps/runtime/dist/docs/user/troubleshooting.md +67 -0
- package/apps/runtime/dist/docs/user/wordpress.md +121 -0
- package/apps/runtime/dist/documents/parse.js +246 -0
- package/apps/runtime/dist/engenty/connections-external/build-connector.js +193 -0
- package/apps/runtime/dist/engenty/connections-external/errors.js +11 -0
- package/apps/runtime/dist/engenty/connections-external/import-service.js +270 -0
- package/apps/runtime/dist/engenty/connections-external/importer/classify.js +34 -0
- package/apps/runtime/dist/engenty/connections-external/importer/map-auth.js +185 -0
- package/apps/runtime/dist/engenty/connections-external/importer/normalize-mcp.js +63 -0
- package/apps/runtime/dist/engenty/connections-external/importer/normalize-openapi.js +130 -0
- package/apps/runtime/dist/engenty/connections-external/invoke/http-invoker.js +143 -0
- package/apps/runtime/dist/engenty/connections-external/invoke/mcp-client.js +143 -0
- package/apps/runtime/dist/engenty/connections-external/net/guarded-fetch.js +119 -0
- package/apps/runtime/dist/engenty/connections-external/oauth-dcr.js +88 -0
- package/apps/runtime/dist/engenty/connections-external/registry-client.js +336 -0
- package/apps/runtime/dist/engenty/connections-external/registry-source.js +82 -0
- package/apps/runtime/dist/engenty/connections-external/types.js +7 -0
- package/apps/runtime/dist/engenty/connections-github/connector.js +209 -0
- package/apps/runtime/dist/engenty/connections-google/connectors/calendar.js +381 -0
- package/apps/runtime/dist/engenty/connections-google/connectors/contacts.js +94 -0
- package/apps/runtime/dist/engenty/connections-google/connectors/drive.js +290 -0
- package/apps/runtime/dist/engenty/connections-google/connectors/gmail.js +567 -0
- package/apps/runtime/dist/engenty/connections-google/definitions.js +11 -0
- package/apps/runtime/dist/engenty/connections-google/shared.js +73 -0
- package/apps/runtime/dist/engenty/connections-hubspot/connector.js +140 -0
- package/apps/runtime/dist/engenty/connections-microsoft/action.js +17 -0
- package/apps/runtime/dist/engenty/connections-microsoft/graph.js +114 -0
- package/apps/runtime/dist/engenty/connections-microsoft/onedrive.js +286 -0
- package/apps/runtime/dist/engenty/connections-microsoft/outlook.js +492 -0
- package/apps/runtime/dist/engenty/connections-s3/s3.js +328 -0
- package/apps/runtime/dist/engenty/connections-sdk/files-capability.js +86 -0
- package/apps/runtime/dist/engenty/connections-sdk/oauth2.js +150 -0
- package/apps/runtime/dist/engenty/connections-sdk/registry.js +89 -0
- package/apps/runtime/dist/engenty/connections-sdk/storage-capability.js +84 -0
- package/apps/runtime/dist/engenty/connections-sdk/types.js +30 -0
- package/apps/runtime/dist/engenty/connections-slack/connector.js +360 -0
- package/apps/runtime/dist/engenty/csv-import/csv-matrix.js +178 -0
- package/apps/runtime/dist/engenty/csv-import/import-sources.js +87 -0
- package/apps/runtime/dist/engenty/csv-import/parse-csv.js +129 -0
- package/apps/runtime/dist/engenty/csv-import/serialize-csv.js +20 -0
- package/apps/runtime/dist/engenty/csv-import/types.js +1 -0
- package/apps/runtime/dist/engenty/csv-import/xlsx-workbook.js +159 -0
- package/apps/runtime/dist/engenty/doc-converter/interface.js +9 -0
- package/apps/runtime/dist/engenty/doc-converter/page-break.js +92 -0
- package/apps/runtime/dist/engenty/doc-converter/providers/local/index.js +72 -0
- package/apps/runtime/dist/engenty/document-scanner/schemas/classifier.js +30 -0
- package/apps/runtime/dist/engenty/document-scanner/schemas/index.js +4 -0
- package/apps/runtime/dist/engenty/document-scanner/schemas/invoice.js +73 -0
- package/apps/runtime/dist/engenty/document-scanner/schemas/receipt.js +63 -0
- package/apps/runtime/dist/engenty/document-scanner/schemas/shared.js +40 -0
- package/apps/runtime/dist/engenty/search-index/chunks.js +164 -0
- package/apps/runtime/dist/engenty/search-index/contracts.js +9 -0
- package/apps/runtime/dist/engenty/shims/connections-sdk.js +39 -0
- package/apps/runtime/dist/engenty/shims/plugin-sdk.js +1 -0
- package/apps/runtime/dist/engenty/shims/web-ingest.js +19 -0
- package/apps/runtime/dist/engenty/web-ingest/ssrf.js +277 -0
- package/apps/runtime/dist/engine/asks.js +82 -0
- package/apps/runtime/dist/engine/decide.js +82 -0
- package/apps/runtime/dist/engine/device.js +194 -0
- package/apps/runtime/dist/engine/events.js +128 -0
- package/apps/runtime/dist/engine/input.js +208 -0
- package/apps/runtime/dist/engine/owner.js +32 -0
- package/apps/runtime/dist/engine/prepare.js +90 -0
- package/apps/runtime/dist/engine/push.js +58 -0
- package/apps/runtime/dist/engine/requirements.js +355 -0
- package/apps/runtime/dist/engine/resources.js +198 -0
- package/apps/runtime/dist/engine/runner.js +970 -0
- package/apps/runtime/dist/engine/steps.js +1000 -0
- package/apps/runtime/dist/engine/surface.js +91 -0
- package/apps/runtime/dist/engine/template.js +240 -0
- package/apps/runtime/dist/engine/types.js +4 -0
- package/apps/runtime/dist/env.js +295 -0
- package/apps/runtime/dist/features.js +123 -0
- package/apps/runtime/dist/files/blobs.js +22 -0
- package/apps/runtime/dist/files/objects.js +86 -0
- package/apps/runtime/dist/files/storage.js +120 -0
- package/apps/runtime/dist/files/web-images.js +101 -0
- package/apps/runtime/dist/film/project.js +257 -0
- package/apps/runtime/dist/film/skills.js +91 -0
- package/apps/runtime/dist/film/sounds.js +122 -0
- package/apps/runtime/dist/film/step.js +289 -0
- package/apps/runtime/dist/film/tools.js +99 -0
- package/apps/runtime/dist/geocode.js +58 -0
- package/apps/runtime/dist/harness/antigravity.js +129 -0
- package/apps/runtime/dist/harness/apple.js +270 -0
- package/apps/runtime/dist/harness/claude.js +147 -0
- package/apps/runtime/dist/harness/codex.js +229 -0
- package/apps/runtime/dist/harness/cursor.js +93 -0
- package/apps/runtime/dist/harness/env.js +124 -0
- package/apps/runtime/dist/harness/index.js +95 -0
- package/apps/runtime/dist/harness/model.js +279 -0
- package/apps/runtime/dist/harness/prompt.js +121 -0
- package/apps/runtime/dist/harness/terminal.js +194 -0
- package/apps/runtime/dist/harness/types.js +7 -0
- package/apps/runtime/dist/index.js +113 -0
- package/apps/runtime/dist/limits.js +81 -0
- package/apps/runtime/dist/link-preview.js +60 -0
- package/apps/runtime/dist/log.js +106 -0
- package/apps/runtime/dist/manage.js +249 -0
- package/apps/runtime/dist/mcp/auth.js +161 -0
- package/apps/runtime/dist/mcp/bridge.js +59 -0
- package/apps/runtime/dist/mcp/flow-app.js +97 -0
- package/apps/runtime/dist/mcp/handler.js +54 -0
- package/apps/runtime/dist/mcp/scopes.js +14 -0
- package/apps/runtime/dist/mcp/seen.js +65 -0
- package/apps/runtime/dist/mcp/tools.js +572 -0
- package/apps/runtime/dist/media/conversation.js +167 -0
- package/apps/runtime/dist/media/ffmpeg.js +121 -0
- package/apps/runtime/dist/media/generate.js +120 -0
- package/apps/runtime/dist/media/marking.js +121 -0
- package/apps/runtime/dist/media/transcribe.js +198 -0
- package/apps/runtime/dist/model-errors.js +42 -0
- package/apps/runtime/dist/models.js +1164 -0
- package/apps/runtime/dist/plugin.js +61 -0
- package/apps/runtime/dist/plugins/channels.js +78 -0
- package/apps/runtime/dist/plugins/claims.js +56 -0
- package/apps/runtime/dist/plugins/discovery.js +155 -0
- package/apps/runtime/dist/plugins/events.js +63 -0
- package/apps/runtime/dist/plugins/jobs.js +64 -0
- package/apps/runtime/dist/plugins/loader.js +508 -0
- package/apps/runtime/dist/plugins/migrations.js +69 -0
- package/apps/runtime/dist/plugins/pro-keys.js +34 -0
- package/apps/runtime/dist/plugins/pro-state.js +83 -0
- package/apps/runtime/dist/plugins/pro.js +310 -0
- package/apps/runtime/dist/plugins/public.js +44 -0
- package/apps/runtime/dist/plugins/registry.js +122 -0
- package/apps/runtime/dist/plugins/runs.js +210 -0
- package/apps/runtime/dist/render/browser-path.js +54 -0
- package/apps/runtime/dist/render/chromium.js +98 -0
- package/apps/runtime/dist/render/convert.js +158 -0
- package/apps/runtime/dist/render/downloads.js +299 -0
- package/apps/runtime/dist/render/guard.js +25 -0
- package/apps/runtime/dist/render/shaped.js +137 -0
- package/apps/runtime/dist/routes/api.js +440 -0
- package/apps/runtime/dist/routes/debug.js +42 -0
- package/apps/runtime/dist/routes/delivery.js +90 -0
- package/apps/runtime/dist/routes/internal.js +81 -0
- package/apps/runtime/dist/routes/lang.js +25 -0
- package/apps/runtime/dist/routes/marketplace.js +43 -0
- package/apps/runtime/dist/routes/plugin-public.js +113 -0
- package/apps/runtime/dist/routes/plugins.js +212 -0
- package/apps/runtime/dist/routes/runs.js +1422 -0
- package/apps/runtime/dist/routes/studio.js +1629 -0
- package/apps/runtime/dist/routes/wizard-stream.js +30 -0
- package/apps/runtime/dist/running.js +39 -0
- package/apps/runtime/dist/sandbox/docker.js +75 -0
- package/apps/runtime/dist/sandbox/index.js +23 -0
- package/apps/runtime/dist/sandbox/types.js +1 -0
- package/apps/runtime/dist/secrets/crypto.js +28 -0
- package/apps/runtime/dist/secrets/signing.js +52 -0
- package/apps/runtime/dist/secrets/vault.js +59 -0
- package/apps/runtime/dist/services/access.js +88 -0
- package/apps/runtime/dist/services/api.js +248 -0
- package/apps/runtime/dist/services/architect.js +95 -0
- package/apps/runtime/dist/services/assistant-chats.js +311 -0
- package/apps/runtime/dist/services/brand.js +85 -0
- package/apps/runtime/dist/services/cloud.js +456 -0
- package/apps/runtime/dist/services/draft-events.js +27 -0
- package/apps/runtime/dist/services/engenty-shapes.js +71 -0
- package/apps/runtime/dist/services/errors.js +29 -0
- package/apps/runtime/dist/services/files.js +178 -0
- package/apps/runtime/dist/services/knowledge-model.js +559 -0
- package/apps/runtime/dist/services/knowledge.js +721 -0
- package/apps/runtime/dist/services/links.js +16 -0
- package/apps/runtime/dist/services/marketplace.js +492 -0
- package/apps/runtime/dist/services/onboarding.js +152 -0
- package/apps/runtime/dist/services/package-file.js +82 -0
- package/apps/runtime/dist/services/package.js +170 -0
- package/apps/runtime/dist/services/profile.js +51 -0
- package/apps/runtime/dist/services/project-files.js +439 -0
- package/apps/runtime/dist/services/project-index.js +707 -0
- package/apps/runtime/dist/services/projects.js +387 -0
- package/apps/runtime/dist/services/relevance.js +58 -0
- package/apps/runtime/dist/services/runners.js +178 -0
- package/apps/runtime/dist/services/runs.js +524 -0
- package/apps/runtime/dist/services/shares.js +130 -0
- package/apps/runtime/dist/services/site.js +270 -0
- package/apps/runtime/dist/services/space-categories.js +861 -0
- package/apps/runtime/dist/services/space-data.js +792 -0
- package/apps/runtime/dist/services/space-origin.js +207 -0
- package/apps/runtime/dist/services/spaces.js +656 -0
- package/apps/runtime/dist/services/translations.js +306 -0
- package/apps/runtime/dist/services/widgets.js +34 -0
- package/apps/runtime/dist/services/wizard-icon.js +157 -0
- package/apps/runtime/dist/services/wizards.js +420 -0
- package/apps/runtime/dist/settings.js +16 -0
- package/apps/runtime/dist/store/errors.js +4 -0
- package/apps/runtime/dist/store/index.js +299 -0
- package/apps/runtime/dist/store/shared-lists.js +123 -0
- package/apps/runtime/dist/tenants/control.js +238 -0
- package/apps/runtime/dist/tenants/tenant.js +26 -0
- package/apps/runtime/dist/texts.js +207 -0
- package/apps/runtime/dist/tools/browser.js +703 -0
- package/apps/runtime/dist/tools/connector.js +204 -0
- package/apps/runtime/dist/tools/index.js +291 -0
- package/apps/runtime/dist/tools/mail.js +104 -0
- package/apps/runtime/dist/tools/net-guard.js +170 -0
- package/apps/runtime/dist/tools/pages.js +81 -0
- package/apps/runtime/dist/tools/plugin.js +180 -0
- package/apps/runtime/dist/tools/project.js +154 -0
- package/apps/runtime/dist/tools/shared.js +69 -0
- package/apps/runtime/dist/tools/store.js +238 -0
- package/apps/runtime/dist/update.js +113 -0
- package/apps/runtime/dist/widgets/bundle.js +99 -0
- package/apps/runtime/dist/widgets/render.js +329 -0
- package/apps/runtime/dist/widgets/runtime.js +108 -0
- package/apps/runtime/dist/widgets/script.js +30 -0
- package/apps/runtime/dist/widgets/step.js +223 -0
- package/apps/web/dist/ai-labels/ai-black.svg +20 -0
- package/apps/web/dist/ai-labels/ai-generated-black.svg +31 -0
- package/apps/web/dist/ai-labels/ai-generated-white.svg +32 -0
- package/apps/web/dist/ai-labels/ai-modified-black.svg +30 -0
- package/apps/web/dist/ai-labels/ai-modified-white.svg +31 -0
- package/apps/web/dist/ai-labels/ai-white.svg +21 -0
- package/apps/web/dist/assets/AboutDialog-D4mvc-zu.js +1 -0
- package/apps/web/dist/assets/ChangelogDialog-DLqpJsF6.js +1 -0
- package/apps/web/dist/assets/ChatView-3laypRcE.js +10 -0
- package/apps/web/dist/assets/EditorPage-BalA5U2Y.js +3 -0
- package/apps/web/dist/assets/FlowPreview-CusP7ci9.js +1 -0
- package/apps/web/dist/assets/Harness-BrP-ENHg.css +1 -0
- package/apps/web/dist/assets/Harness-iYLtOLaK.js +16 -0
- package/apps/web/dist/assets/NewWizardChannels-CbwJ9A56.js +1 -0
- package/apps/web/dist/assets/NewWizardPage-BOBYiB9i.js +7 -0
- package/apps/web/dist/assets/OnboardingPage-CUwCiVIr.js +1 -0
- package/apps/web/dist/assets/ProjectPage-Bb16MdYG.js +1 -0
- package/apps/web/dist/assets/PublicRunner-BCt7Q6C-.js +1 -0
- package/apps/web/dist/assets/ReadOnly-kIHX2TEy.js +1 -0
- package/apps/web/dist/assets/RunDrawer-hZ9oeSXu.js +4 -0
- package/apps/web/dist/assets/RunnerView-DUS9fPmx.js +1 -0
- package/apps/web/dist/assets/SettingsPage-BzwR50fi.js +1 -0
- package/apps/web/dist/assets/SetupPage-gAp7rPxp.js +1 -0
- package/apps/web/dist/assets/SharePage-DqZWHva_.js +1 -0
- package/apps/web/dist/assets/changelog-DugmCNSf.js +1 -0
- package/apps/web/dist/assets/engenty-eXZ-EAwd.js +1 -0
- package/apps/web/dist/assets/esm-DXeMu8Lb.js +7 -0
- package/apps/web/dist/assets/fluffy-engenty-ClRou7yu.js +456 -0
- package/apps/web/dist/assets/index-AfUa8xKD.css +1 -0
- package/apps/web/dist/assets/index-C5Sm7tTR.js +14 -0
- package/apps/web/dist/assets/jsx-runtime-BNakU3Ej.js +1 -0
- package/apps/web/dist/assets/lock-R_CfU0Xo.js +1 -0
- package/apps/web/dist/assets/oss-credits-cZ9NUaLZ.js +1 -0
- package/apps/web/dist/assets/pdfmake-Cx9scTbD.js +228 -0
- package/apps/web/dist/assets/phone-CgrIS4_-.js +1 -0
- package/apps/web/dist/assets/preload-helper-CNEI7N0N.js +1 -0
- package/apps/web/dist/assets/qr-scanner-worker.min-CJaXo3yu.js +98 -0
- package/apps/web/dist/assets/qr-scanner.min-C_UI0gH-.js +1 -0
- package/apps/web/dist/assets/rolldown-runtime-hePW80VL.js +1 -0
- package/apps/web/dist/assets/settings-menu-2IMOOlLl.js +1 -0
- package/apps/web/dist/assets/ui-dzGvc3xk.js +137 -0
- package/apps/web/dist/assets/upload-BSuTilFF.js +1 -0
- package/apps/web/dist/assets/vfs_fonts-DllDSYt1.js +1 -0
- package/apps/web/dist/embed.js +266 -0
- package/apps/web/dist/favicon.svg +1 -0
- package/apps/web/dist/icons/apple-touch-icon.png +0 -0
- package/apps/web/dist/icons/icon-192.png +0 -0
- package/apps/web/dist/icons/icon-512.png +0 -0
- package/apps/web/dist/icons/icon-maskable-512.png +0 -0
- package/apps/web/dist/index.html +48 -0
- package/apps/web/dist/install.sh +577 -0
- package/apps/web/dist/manifest.webmanifest +21 -0
- package/apps/web/dist/mcp/flow.html +980 -0
- package/apps/web/dist/sw.js +15 -0
- package/bin/wizards.mjs +288 -0
- package/modules/README.md +15 -0
- package/node_modules/@engenty/wizards/dist/plugin/index.d.ts +1150 -0
- package/node_modules/@engenty/wizards/dist/plugin/index.js +4 -0
- package/node_modules/@engenty/wizards/dist/plugin/studio.d.ts +322 -0
- package/node_modules/@engenty/wizards/dist/plugin/studio.js +4 -0
- package/node_modules/@engenty/wizards/dist/plugin/thread.d.ts +174 -0
- package/node_modules/@engenty/wizards/dist/plugin/thread.js +821 -0
- package/node_modules/@engenty/wizards/package.json +11 -0
- package/node_modules/@engenty-wizards/shared/dist/assistant.d.ts +174 -0
- package/node_modules/@engenty-wizards/shared/dist/assistant.js +65 -0
- package/node_modules/@engenty-wizards/shared/dist/changes.d.ts +22 -0
- package/node_modules/@engenty-wizards/shared/dist/changes.js +61 -0
- package/node_modules/@engenty-wizards/shared/dist/connectors.d.ts +77 -0
- package/node_modules/@engenty-wizards/shared/dist/connectors.js +2 -0
- package/node_modules/@engenty-wizards/shared/dist/decision.d.ts +76 -0
- package/node_modules/@engenty-wizards/shared/dist/decision.js +147 -0
- package/node_modules/@engenty-wizards/shared/dist/definition.d.ts +2922 -0
- package/node_modules/@engenty-wizards/shared/dist/definition.js +1920 -0
- package/node_modules/@engenty-wizards/shared/dist/engenty/data-tables/columns-format.d.ts +5 -0
- package/node_modules/@engenty-wizards/shared/dist/engenty/data-tables/columns-format.js +132 -0
- package/node_modules/@engenty-wizards/shared/dist/engenty/data-tables/columns-value.d.ts +11 -0
- package/node_modules/@engenty-wizards/shared/dist/engenty/data-tables/columns-value.js +209 -0
- package/node_modules/@engenty-wizards/shared/dist/engenty/data-tables/columns.d.ts +532 -0
- package/node_modules/@engenty-wizards/shared/dist/engenty/data-tables/columns.js +217 -0
- package/node_modules/@engenty-wizards/shared/dist/engenty/data-tables/index.d.ts +3 -0
- package/node_modules/@engenty-wizards/shared/dist/engenty/data-tables/index.js +3 -0
- package/node_modules/@engenty-wizards/shared/dist/engenty/search-index/catalog-lexical.d.ts +14 -0
- package/node_modules/@engenty-wizards/shared/dist/engenty/search-index/catalog-lexical.js +166 -0
- package/node_modules/@engenty-wizards/shared/dist/engenty/search-index/catalog-rank.d.ts +33 -0
- package/node_modules/@engenty-wizards/shared/dist/engenty/search-index/catalog-rank.js +99 -0
- package/node_modules/@engenty-wizards/shared/dist/feature-flags.d.ts +78 -0
- package/node_modules/@engenty-wizards/shared/dist/feature-flags.js +70 -0
- package/node_modules/@engenty-wizards/shared/dist/features.d.ts +41 -0
- package/node_modules/@engenty-wizards/shared/dist/features.js +89 -0
- package/node_modules/@engenty-wizards/shared/dist/fit.d.ts +71 -0
- package/node_modules/@engenty-wizards/shared/dist/fit.js +382 -0
- package/node_modules/@engenty-wizards/shared/dist/json-schema.d.ts +14 -0
- package/node_modules/@engenty-wizards/shared/dist/json-schema.js +66 -0
- package/node_modules/@engenty-wizards/shared/dist/knowledge.d.ts +199 -0
- package/node_modules/@engenty-wizards/shared/dist/knowledge.js +68 -0
- package/node_modules/@engenty-wizards/shared/dist/marketplace-entry.d.ts +35 -0
- package/node_modules/@engenty-wizards/shared/dist/marketplace-entry.js +107 -0
- package/node_modules/@engenty-wizards/shared/dist/marketplace-search.d.ts +20 -0
- package/node_modules/@engenty-wizards/shared/dist/marketplace-search.js +136 -0
- package/node_modules/@engenty-wizards/shared/dist/marketplace.d.ts +227 -0
- package/node_modules/@engenty-wizards/shared/dist/marketplace.js +354 -0
- package/node_modules/@engenty-wizards/shared/dist/merge.d.ts +7 -0
- package/node_modules/@engenty-wizards/shared/dist/merge.js +40 -0
- package/node_modules/@engenty-wizards/shared/dist/numbers.d.ts +24 -0
- package/node_modules/@engenty-wizards/shared/dist/numbers.js +54 -0
- package/node_modules/@engenty-wizards/shared/dist/projects.d.ts +224 -0
- package/node_modules/@engenty-wizards/shared/dist/projects.js +319 -0
- package/node_modules/@engenty-wizards/shared/dist/providers.d.ts +101 -0
- package/node_modules/@engenty-wizards/shared/dist/providers.js +390 -0
- package/node_modules/@engenty-wizards/shared/dist/run.d.ts +680 -0
- package/node_modules/@engenty-wizards/shared/dist/run.js +620 -0
- package/node_modules/@engenty-wizards/shared/dist/runner-texts.d.ts +546 -0
- package/node_modules/@engenty-wizards/shared/dist/runner-texts.js +523 -0
- package/node_modules/@engenty-wizards/shared/dist/runners.d.ts +93 -0
- package/node_modules/@engenty-wizards/shared/dist/runners.js +146 -0
- package/node_modules/@engenty-wizards/shared/dist/shape.d.ts +102 -0
- package/node_modules/@engenty-wizards/shared/dist/shape.js +318 -0
- package/node_modules/@engenty-wizards/shared/dist/space-data.d.ts +89 -0
- package/node_modules/@engenty-wizards/shared/dist/space-data.js +47 -0
- package/node_modules/@engenty-wizards/shared/dist/store.d.ts +117 -0
- package/node_modules/@engenty-wizards/shared/dist/store.js +81 -0
- package/node_modules/@engenty-wizards/shared/dist/surface.d.ts +115 -0
- package/node_modules/@engenty-wizards/shared/dist/surface.js +442 -0
- package/node_modules/@engenty-wizards/shared/dist/texts.d.ts +45 -0
- package/node_modules/@engenty-wizards/shared/dist/texts.js +54 -0
- package/node_modules/@engenty-wizards/shared/dist/translation.d.ts +23 -0
- package/node_modules/@engenty-wizards/shared/dist/translation.js +154 -0
- package/node_modules/@engenty-wizards/shared/dist/wizard-package.d.ts +48 -0
- package/node_modules/@engenty-wizards/shared/dist/wizard-package.js +49 -0
- package/node_modules/@engenty-wizards/shared/dist/workspace.d.ts +16 -0
- package/node_modules/@engenty-wizards/shared/dist/workspace.js +51 -0
- package/node_modules/@engenty-wizards/shared/package.json +10 -0
- package/package.json +77 -4
- package/plugin/.claude-plugin/plugin.json +9 -0
- package/plugin/.mcp.json +8 -0
- package/plugin/commands/wizard.md +8 -0
- package/plugin/skills/build-wizard/SKILL.md +27 -0
- package/plugin/skills/use-wizard/SKILL.md +18 -0
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
// SPDX-License-Identifier: FSL-1.1-MIT OR MIT
|
|
2
|
+
/**
|
|
3
|
+
* Numbers as people write and read them: what a phone's number pad, a table cell or a document
|
|
4
|
+
* gives, and an amount or a file's size as a page shows it. The server, the studio and the runner read and
|
|
5
|
+
* show them the same way.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* A number as a person types it: digits with at most one decimal mark, a point or a comma
|
|
9
|
+
* alike, as a phone's number pad gives it in either language (`1.5`, `1,5`, `89,90`). There are
|
|
10
|
+
* no thousands separators: `1.234` and `1,234` are 1.234, and anything with two marks
|
|
11
|
+
* (`1.234,50`, `1.234.567`) is no number, since only the writer's language could say which mark
|
|
12
|
+
* is which. Text that is not typed (a document, a website) is read by a model into numbers
|
|
13
|
+
* before it gets here. With `units`, what stands around the number is dropped (`38 h`,
|
|
14
|
+
* `19 %`); without, anything but the number makes it none. Null where there is no number.
|
|
15
|
+
*/
|
|
16
|
+
export function readNumber(value, opts = {}) {
|
|
17
|
+
if (typeof value === "number") {
|
|
18
|
+
return Number.isFinite(value) ? value : null;
|
|
19
|
+
}
|
|
20
|
+
if (typeof value !== "string") {
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
const s = opts.units ? value.replace(/[^\d,.-]/g, "") : value.trim();
|
|
24
|
+
if (!/^-?(\d+([.,]\d*)?|[.,]\d+)$/.test(s)) {
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
const n = Number(s.replace(",", "."));
|
|
28
|
+
return Number.isFinite(n) ? n : null;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* A file's size for a list, in decimal units as the operating systems show them: `1 KB` for
|
|
32
|
+
* anything below a kilobyte but nothing (`0 KB`), `340 KB`, `2.4 MB`, `1.2 GB`.
|
|
33
|
+
*/
|
|
34
|
+
export function formatBytes(bytes) {
|
|
35
|
+
if (!(bytes > 0)) {
|
|
36
|
+
return "0 KB";
|
|
37
|
+
}
|
|
38
|
+
if (bytes < 999_500) {
|
|
39
|
+
return `${Math.max(1, Math.round(bytes / 1000))} KB`;
|
|
40
|
+
}
|
|
41
|
+
if (bytes < 999_950_000) {
|
|
42
|
+
return `${(bytes / 1_000_000).toFixed(1)} MB`;
|
|
43
|
+
}
|
|
44
|
+
return `${(bytes / 1_000_000_000).toFixed(1)} GB`;
|
|
45
|
+
}
|
|
46
|
+
/** An amount in a currency, as the language writes it (`1.234,50 €`); an unknown currency code as `1234.50 XYZ`. */
|
|
47
|
+
export function formatMoney(amount, currency, locale) {
|
|
48
|
+
try {
|
|
49
|
+
return new Intl.NumberFormat(locale, { style: "currency", currency }).format(amount);
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
return `${amount.toFixed(2)} ${currency}`;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
import type { RunTheme } from "./run.js";
|
|
2
|
+
export declare const FACT_TYPES: readonly ["text", "longtext", "number", "date", "url", "email", "phone", "boolean"];
|
|
3
|
+
export type FactType = (typeof FACT_TYPES)[number];
|
|
4
|
+
export interface ProjectFact {
|
|
5
|
+
/** How templates name it: `{{facts.<key>}}`. Made from the label, stable afterwards. */
|
|
6
|
+
key: string;
|
|
7
|
+
label: string;
|
|
8
|
+
value: string;
|
|
9
|
+
/** Only when chosen by hand; otherwise the type is read off the value. */
|
|
10
|
+
type?: FactType;
|
|
11
|
+
}
|
|
12
|
+
/** The type a value looks like. A value that looks like nothing in particular is text. */
|
|
13
|
+
export declare function detectFactType(value: string): FactType;
|
|
14
|
+
export declare function factType(fact: Pick<ProjectFact, "value" | "type">): FactType;
|
|
15
|
+
/** A fact's key from its label: lower case, a-z 0-9 and _, unique among `taken`. */
|
|
16
|
+
export declare function factKey(label: string, taken?: string[]): string;
|
|
17
|
+
/** Facts most projects have, by key; offered as empty rows to fill in (labels: `fact.<key>`). */
|
|
18
|
+
export declare const BASIC_FACTS: readonly ["adresse", "plz", "ort", "uid", "telefon", "e_mail", "website", "iban"];
|
|
19
|
+
export type BasicFact = (typeof BASIC_FACTS)[number];
|
|
20
|
+
export interface BrandColor {
|
|
21
|
+
/** What the colour is for and how to use it, in the admin's words: "Primär – Buttons und Überschriften". */
|
|
22
|
+
name: string;
|
|
23
|
+
/** #rrggbb */
|
|
24
|
+
value: string;
|
|
25
|
+
/** The `ColorSection` it belongs to; none for the standard colours. */
|
|
26
|
+
section?: string;
|
|
27
|
+
}
|
|
28
|
+
export declare const COLOR_SECTION_KINDS: readonly ["colors", "gradients", "patterns"];
|
|
29
|
+
export type ColorSectionKind = (typeof COLOR_SECTION_KINDS)[number];
|
|
30
|
+
/**
|
|
31
|
+
* Further colours of one use, as a brand guide groups them: "Illustration". Optional. A section
|
|
32
|
+
* holds colours, gradients or patterns (`kind`, colours when none); each of them says itself what
|
|
33
|
+
* it is for. Colours in no section are the standard ones: they come first, and the first of them
|
|
34
|
+
* is the accent.
|
|
35
|
+
*/
|
|
36
|
+
export interface ColorSection {
|
|
37
|
+
id: string;
|
|
38
|
+
title: string;
|
|
39
|
+
kind?: ColorSectionKind;
|
|
40
|
+
}
|
|
41
|
+
export declare const GRADIENT_TYPES: readonly ["linear", "radial", "conic"];
|
|
42
|
+
export type GradientType = (typeof GRADIENT_TYPES)[number];
|
|
43
|
+
/** A gradient of the brand, as CSS draws it: its type, its angle and its colour stops. */
|
|
44
|
+
export interface BrandGradient {
|
|
45
|
+
id: string;
|
|
46
|
+
name: string;
|
|
47
|
+
/** What it is for and how to use it, as a colour's name says it. */
|
|
48
|
+
description?: string;
|
|
49
|
+
/** The gradients section it is in. */
|
|
50
|
+
section: string;
|
|
51
|
+
type: GradientType;
|
|
52
|
+
/** Degrees: the direction of a linear one, where a conic one starts. */
|
|
53
|
+
angle: number;
|
|
54
|
+
stops: {
|
|
55
|
+
color: string;
|
|
56
|
+
at: number;
|
|
57
|
+
}[];
|
|
58
|
+
}
|
|
59
|
+
/** A pattern or a fill of the brand: a picture of the space (`file`), tiled or filling. */
|
|
60
|
+
export interface BrandPattern {
|
|
61
|
+
id: string;
|
|
62
|
+
name: string;
|
|
63
|
+
/** What it is for and how to use it. */
|
|
64
|
+
description?: string;
|
|
65
|
+
/** The patterns section it is in. */
|
|
66
|
+
section: string;
|
|
67
|
+
/** The project file (kind `pattern`) with the picture. */
|
|
68
|
+
file: string;
|
|
69
|
+
/** Repeated as a tile; else it fills the area. */
|
|
70
|
+
tile?: boolean;
|
|
71
|
+
}
|
|
72
|
+
/** The gradient as CSS. */
|
|
73
|
+
export declare function gradientCss(g: Pick<BrandGradient, "type" | "angle" | "stops">): string;
|
|
74
|
+
/**
|
|
75
|
+
* A CSS gradient read back: linear, radial or conic, with hex stops. Stops without a position
|
|
76
|
+
* are spread evenly. Null where it is not one of these.
|
|
77
|
+
*/
|
|
78
|
+
export declare function parseGradient(css: string): Pick<BrandGradient, "type" | "angle" | "stops"> | null;
|
|
79
|
+
/**
|
|
80
|
+
* The colours as stored: the standard ones first, then each section's in the sections' order; a
|
|
81
|
+
* section that is not there any more is dropped from its colours.
|
|
82
|
+
*/
|
|
83
|
+
export declare function orderColors(colors: BrandColor[], sections: ColorSection[]): BrandColor[];
|
|
84
|
+
/**
|
|
85
|
+
* Further logos of one use, as a brand guide groups them: "Logomark – small spaces, app icons".
|
|
86
|
+
* Optional. Logos in no section are the standard ones: they come first, without a title, and
|
|
87
|
+
* the first of them is the main logo.
|
|
88
|
+
*/
|
|
89
|
+
export interface LogoSection {
|
|
90
|
+
id: string;
|
|
91
|
+
title: string;
|
|
92
|
+
/** When to use the logos in it. */
|
|
93
|
+
description: string;
|
|
94
|
+
/** The logo files in it, in order. A file sits in one section at most. */
|
|
95
|
+
logos: string[];
|
|
96
|
+
}
|
|
97
|
+
/** The main logo: the first standard one (in no section), else the first of all. */
|
|
98
|
+
export declare function mainLogo<T extends {
|
|
99
|
+
id: string;
|
|
100
|
+
}>(logos: T[], sections: LogoSection[] | undefined): T | undefined;
|
|
101
|
+
/** The sign before a rule: a bullet unless chosen. */
|
|
102
|
+
export declare const RULE_MARKS: readonly ["bullet", "do", "dont", "question", "important", "number"];
|
|
103
|
+
export type RuleMark = (typeof RULE_MARKS)[number];
|
|
104
|
+
/** A rule of the brand — for its logos, colours or type — in the admin's words. */
|
|
105
|
+
export interface BrandRule {
|
|
106
|
+
text: string;
|
|
107
|
+
/** None: a bullet. */
|
|
108
|
+
mark?: RuleMark;
|
|
109
|
+
}
|
|
110
|
+
/** Rules as a model reads them: the sign said in words, numbered ones counted. */
|
|
111
|
+
export declare function ruleLines(rules: BrandRule[]): string;
|
|
112
|
+
/** What a font's licence can allow it for, among what the wizards make. */
|
|
113
|
+
export declare const FONT_USES: readonly ["web", "documents", "print", "images", "video"];
|
|
114
|
+
export type FontUse = (typeof FONT_USES)[number];
|
|
115
|
+
/** How a model reads a use. */
|
|
116
|
+
export declare const FONT_USE_WORDS: Record<FontUse, string>;
|
|
117
|
+
/** A typeface of the brand and what it is for: "Space Grotesk – headings". */
|
|
118
|
+
export interface BrandFont {
|
|
119
|
+
id: string;
|
|
120
|
+
/** The family as CSS names it: "Space Grotesk". */
|
|
121
|
+
family: string;
|
|
122
|
+
/** What it is for, in the admin's words. */
|
|
123
|
+
role: string;
|
|
124
|
+
/** The weights the brand uses: 400, 600, … */
|
|
125
|
+
weights: number[];
|
|
126
|
+
/** Its licence as the admin names it: "SIL Open Font License", "Adobe Fonts". */
|
|
127
|
+
license?: string;
|
|
128
|
+
/**
|
|
129
|
+
* All the licence allows it for; none: not said. What a step makes for another use is set in
|
|
130
|
+
* a system font.
|
|
131
|
+
*/
|
|
132
|
+
uses?: FontUse[];
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* How a wizard's pages look, from the brand: the first standard colour is the accent, a standard
|
|
136
|
+
* colour named as the ground ("Hintergrund") the background, the next colourful one the second
|
|
137
|
+
* colour; the typeface for headings and the one for text by their roles. What the brand does not
|
|
138
|
+
* say stays the runner's own.
|
|
139
|
+
*/
|
|
140
|
+
export declare function runTheme(brand: {
|
|
141
|
+
colors?: BrandColor[];
|
|
142
|
+
fonts?: Pick<BrandFont, "family" | "role">[];
|
|
143
|
+
}): RunTheme;
|
|
144
|
+
/** The font's licence as a model reads it: ", licence …, may only be used for …". */
|
|
145
|
+
export declare function fontLicenseWords(f: Pick<BrandFont, "license" | "uses">): string;
|
|
146
|
+
/** A text style of the type scale: "Headline XL – Space Grotesk 600, 48 px, line 90 %, −4 %". */
|
|
147
|
+
export interface TextStyle {
|
|
148
|
+
id: string;
|
|
149
|
+
name: string;
|
|
150
|
+
/** The `BrandFont` it is set in; none for the first font. */
|
|
151
|
+
font?: string;
|
|
152
|
+
/** px */
|
|
153
|
+
size: number;
|
|
154
|
+
weight: number;
|
|
155
|
+
/** Line height in % of the size. */
|
|
156
|
+
lineHeight: number;
|
|
157
|
+
/** Letter spacing in % of the size. */
|
|
158
|
+
tracking: number;
|
|
159
|
+
uppercase?: boolean;
|
|
160
|
+
}
|
|
161
|
+
export declare const FONT_WEIGHTS: readonly [300, 400, 500, 600, 700, 800];
|
|
162
|
+
/** A text style as a model and a person read it: "Space Grotesk 600, 48 px, line 90 %, tracking −4 %". */
|
|
163
|
+
export declare function textStyleLine(style: TextStyle, fonts: BrandFont[]): string;
|
|
164
|
+
/**
|
|
165
|
+
* Assets of one kind, shown as a tab of their own, named by its title: "Icons", "Background
|
|
166
|
+
* images". Optional.
|
|
167
|
+
* Assets in no section are the general ones, in the first tab.
|
|
168
|
+
*/
|
|
169
|
+
export interface AssetSection {
|
|
170
|
+
id: string;
|
|
171
|
+
title: string;
|
|
172
|
+
/** The asset files in it, in order. A file sits in one section at most. */
|
|
173
|
+
assets: string[];
|
|
174
|
+
}
|
|
175
|
+
/** The sections as stored: each file in its first section only, ids not known to `files` left out. */
|
|
176
|
+
export declare function cleanLogoSections(sections: LogoSection[], files?: string[]): LogoSection[];
|
|
177
|
+
export declare function cleanAssetSections(sections: AssetSection[], files?: string[]): AssetSection[];
|
|
178
|
+
export declare const PROJECT_FILE_KINDS: readonly ["logo", "asset", "document", "pattern"];
|
|
179
|
+
export type ProjectFileKind = (typeof PROJECT_FILE_KINDS)[number];
|
|
180
|
+
/** `pending`: being read, described and indexed. */
|
|
181
|
+
export type ProjectFileStatus = "pending" | "ready" | "failed";
|
|
182
|
+
export interface ProjectFileView {
|
|
183
|
+
id: string;
|
|
184
|
+
kind: ProjectFileKind;
|
|
185
|
+
name: string;
|
|
186
|
+
mime: string;
|
|
187
|
+
size: number;
|
|
188
|
+
description: string;
|
|
189
|
+
/** A web address the file was fetched from, when it was not uploaded. */
|
|
190
|
+
source: string | null;
|
|
191
|
+
status: ProjectFileStatus;
|
|
192
|
+
error: string | null;
|
|
193
|
+
/** Documents: what the index holds of it. `embeddings` includes the keywords. */
|
|
194
|
+
indexed: "embeddings" | "keywords" | null;
|
|
195
|
+
pages: number | null;
|
|
196
|
+
chars: number | null;
|
|
197
|
+
createdAt: string;
|
|
198
|
+
}
|
|
199
|
+
export declare const PROJECT_LIMITS: {
|
|
200
|
+
readonly facts: 100;
|
|
201
|
+
readonly colors: 32;
|
|
202
|
+
readonly fonts: 6;
|
|
203
|
+
readonly textStyles: 16;
|
|
204
|
+
/** Sections of logos, and of colours, each. */
|
|
205
|
+
readonly logoSections: 8;
|
|
206
|
+
/** Rows of logo rules. */
|
|
207
|
+
readonly logoRules: 16;
|
|
208
|
+
readonly files: {
|
|
209
|
+
readonly logo: 24;
|
|
210
|
+
readonly asset: 100;
|
|
211
|
+
readonly document: 2000;
|
|
212
|
+
readonly pattern: 24;
|
|
213
|
+
};
|
|
214
|
+
readonly gradients: 24;
|
|
215
|
+
readonly bytes: {
|
|
216
|
+
readonly logo: 5000000;
|
|
217
|
+
readonly asset: 15000000;
|
|
218
|
+
readonly video: 80000000;
|
|
219
|
+
readonly document: 30000000;
|
|
220
|
+
readonly pattern: 10000000;
|
|
221
|
+
};
|
|
222
|
+
};
|
|
223
|
+
/** The largest file of a kind and type a project takes. */
|
|
224
|
+
export declare function projectFileLimit(kind: ProjectFileKind, mime: string): number;
|
|
@@ -0,0 +1,319 @@
|
|
|
1
|
+
// --- facts ---------------------------------------------------------------------
|
|
2
|
+
// What a project knows about itself as label and value: an address, a VAT id, anything. Every
|
|
3
|
+
// step of the project's wizards can read them.
|
|
4
|
+
export const FACT_TYPES = [
|
|
5
|
+
"text",
|
|
6
|
+
"longtext",
|
|
7
|
+
"number",
|
|
8
|
+
"date",
|
|
9
|
+
"url",
|
|
10
|
+
"email",
|
|
11
|
+
"phone",
|
|
12
|
+
"boolean",
|
|
13
|
+
];
|
|
14
|
+
const DATE_RE = /^(\d{4}-\d{2}-\d{2}|\d{1,2}\.\s?\d{1,2}\.\s?\d{4})$/;
|
|
15
|
+
const NUMBER_RE = /^[+-]?\d{1,3}([.,\s']?\d{3})*([.,]\d+)?$/;
|
|
16
|
+
const EMAIL_RE = /^[^\s@]+@[^\s@]+\.[^\s@]{2,}$/;
|
|
17
|
+
const URL_RE = /^(https?:\/\/|www\.)\S+$/i;
|
|
18
|
+
const PHONE_RE = /^\+?[\d\s()/.-]{7,20}$/;
|
|
19
|
+
const BOOLEAN_RE = /^(ja|nein|yes|no|true|false)$/i;
|
|
20
|
+
/** The type a value looks like. A value that looks like nothing in particular is text. */
|
|
21
|
+
export function detectFactType(value) {
|
|
22
|
+
const v = value.trim();
|
|
23
|
+
if (!v) {
|
|
24
|
+
return "text";
|
|
25
|
+
}
|
|
26
|
+
if (v.includes("\n") || v.length > 140) {
|
|
27
|
+
return "longtext";
|
|
28
|
+
}
|
|
29
|
+
if (BOOLEAN_RE.test(v)) {
|
|
30
|
+
return "boolean";
|
|
31
|
+
}
|
|
32
|
+
if (EMAIL_RE.test(v)) {
|
|
33
|
+
return "email";
|
|
34
|
+
}
|
|
35
|
+
if (URL_RE.test(v)) {
|
|
36
|
+
return "url";
|
|
37
|
+
}
|
|
38
|
+
if (DATE_RE.test(v)) {
|
|
39
|
+
return "date";
|
|
40
|
+
}
|
|
41
|
+
// A postcode or a count is a number; a phone number starts with + or 0 and is longer.
|
|
42
|
+
if (NUMBER_RE.test(v) && !/^(\+|0\d)/.test(v)) {
|
|
43
|
+
return "number";
|
|
44
|
+
}
|
|
45
|
+
if (PHONE_RE.test(v) && v.replace(/\D/g, "").length >= 7) {
|
|
46
|
+
return "phone";
|
|
47
|
+
}
|
|
48
|
+
return "text";
|
|
49
|
+
}
|
|
50
|
+
export function factType(fact) {
|
|
51
|
+
return fact.type ?? detectFactType(fact.value);
|
|
52
|
+
}
|
|
53
|
+
/** A fact's key from its label: lower case, a-z 0-9 and _, unique among `taken`. */
|
|
54
|
+
export function factKey(label, taken = []) {
|
|
55
|
+
const base = label
|
|
56
|
+
.toLowerCase()
|
|
57
|
+
.replace(/ä/g, "ae")
|
|
58
|
+
.replace(/ö/g, "oe")
|
|
59
|
+
.replace(/ü/g, "ue")
|
|
60
|
+
.replace(/ß/g, "ss")
|
|
61
|
+
.normalize("NFD")
|
|
62
|
+
.replace(/[^a-z0-9]+/g, "_")
|
|
63
|
+
.replace(/^_+|_+$/g, "")
|
|
64
|
+
.slice(0, 40) || "fakt";
|
|
65
|
+
let key = base;
|
|
66
|
+
for (let i = 2; taken.includes(key); i++) {
|
|
67
|
+
key = `${base}_${i}`;
|
|
68
|
+
}
|
|
69
|
+
return key;
|
|
70
|
+
}
|
|
71
|
+
/** Facts most projects have, by key; offered as empty rows to fill in (labels: `fact.<key>`). */
|
|
72
|
+
export const BASIC_FACTS = [
|
|
73
|
+
"adresse",
|
|
74
|
+
"plz",
|
|
75
|
+
"ort",
|
|
76
|
+
"uid",
|
|
77
|
+
"telefon",
|
|
78
|
+
"e_mail",
|
|
79
|
+
"website",
|
|
80
|
+
"iban",
|
|
81
|
+
];
|
|
82
|
+
export const COLOR_SECTION_KINDS = ["colors", "gradients", "patterns"];
|
|
83
|
+
export const GRADIENT_TYPES = ["linear", "radial", "conic"];
|
|
84
|
+
/** The gradient as CSS. */
|
|
85
|
+
export function gradientCss(g) {
|
|
86
|
+
const stops = [...g.stops]
|
|
87
|
+
.sort((a, b) => a.at - b.at)
|
|
88
|
+
.map((s) => `${s.color} ${Math.round(s.at)}%`)
|
|
89
|
+
.join(", ");
|
|
90
|
+
if (g.type === "radial") {
|
|
91
|
+
return `radial-gradient(circle at center, ${stops})`;
|
|
92
|
+
}
|
|
93
|
+
if (g.type === "conic") {
|
|
94
|
+
return `conic-gradient(from ${Math.round(g.angle)}deg at center, ${stops})`;
|
|
95
|
+
}
|
|
96
|
+
return `linear-gradient(${Math.round(g.angle)}deg, ${stops})`;
|
|
97
|
+
}
|
|
98
|
+
const SIDES = {
|
|
99
|
+
top: 0,
|
|
100
|
+
"top right": 45,
|
|
101
|
+
right: 90,
|
|
102
|
+
"bottom right": 135,
|
|
103
|
+
bottom: 180,
|
|
104
|
+
"bottom left": 225,
|
|
105
|
+
left: 270,
|
|
106
|
+
"top left": 315,
|
|
107
|
+
};
|
|
108
|
+
/**
|
|
109
|
+
* A CSS gradient read back: linear, radial or conic, with hex stops. Stops without a position
|
|
110
|
+
* are spread evenly. Null where it is not one of these.
|
|
111
|
+
*/
|
|
112
|
+
export function parseGradient(css) {
|
|
113
|
+
const m = css.trim().match(/^(repeating-)?(linear|radial|conic)-gradient\(\s*([\s\S]*)\)\s*;?$/i);
|
|
114
|
+
if (!m) {
|
|
115
|
+
return null;
|
|
116
|
+
}
|
|
117
|
+
const type = m[2].toLowerCase();
|
|
118
|
+
const parts = m[3].split(/,(?![^(]*\))/).map((p) => p.trim());
|
|
119
|
+
let angle = type === "linear" ? 180 : 0;
|
|
120
|
+
const head = parts[0] ?? "";
|
|
121
|
+
if (!/^#|^rgb|^hsl|^oklch/i.test(head)) {
|
|
122
|
+
parts.shift();
|
|
123
|
+
const deg = head.match(/(-?[\d.]+)deg/);
|
|
124
|
+
const side = head.match(/^to\s+(.+)$/i)?.[1].toLowerCase();
|
|
125
|
+
if (deg) {
|
|
126
|
+
angle = Number(deg[1]);
|
|
127
|
+
}
|
|
128
|
+
else if (side && side in SIDES) {
|
|
129
|
+
angle = SIDES[side];
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
const stops = parts
|
|
133
|
+
.map((p) => p.match(/^(#[0-9a-f]{3,8})\b\s*(-?[\d.]+%)?/i))
|
|
134
|
+
.filter((x) => Boolean(x))
|
|
135
|
+
.map((x, i, all) => ({
|
|
136
|
+
color: x[1].toLowerCase(),
|
|
137
|
+
at: x[2] ? Number.parseFloat(x[2]) : all.length > 1 ? (i / (all.length - 1)) * 100 : 0,
|
|
138
|
+
}));
|
|
139
|
+
return stops.length >= 2 ? { type, angle: ((angle % 360) + 360) % 360, stops } : null;
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* The colours as stored: the standard ones first, then each section's in the sections' order; a
|
|
143
|
+
* section that is not there any more is dropped from its colours.
|
|
144
|
+
*/
|
|
145
|
+
export function orderColors(colors, sections) {
|
|
146
|
+
const at = (c) => (c.section ? sections.findIndex((s) => s.id === c.section) : -1);
|
|
147
|
+
return colors
|
|
148
|
+
.map((c) => (c.section && at(c) < 0 ? { name: c.name, value: c.value } : c))
|
|
149
|
+
.map((c, i) => ({ c, i }))
|
|
150
|
+
.sort((a, b) => at(a.c) - at(b.c) || a.i - b.i)
|
|
151
|
+
.map(({ c }) => c);
|
|
152
|
+
}
|
|
153
|
+
/** The main logo: the first standard one (in no section), else the first of all. */
|
|
154
|
+
export function mainLogo(logos, sections) {
|
|
155
|
+
const grouped = new Set(sections?.flatMap((s) => s.logos));
|
|
156
|
+
return logos.find((f) => !grouped.has(f.id)) ?? logos[0];
|
|
157
|
+
}
|
|
158
|
+
/** The sign before a rule: a bullet unless chosen. */
|
|
159
|
+
export const RULE_MARKS = ["bullet", "do", "dont", "question", "important", "number"];
|
|
160
|
+
/** Rules as a model reads them: the sign said in words, numbered ones counted. */
|
|
161
|
+
export function ruleLines(rules) {
|
|
162
|
+
let n = 0;
|
|
163
|
+
return rules
|
|
164
|
+
.map((r) => {
|
|
165
|
+
switch (r.mark) {
|
|
166
|
+
case "do":
|
|
167
|
+
return `- Do: ${r.text}`;
|
|
168
|
+
case "dont":
|
|
169
|
+
return `- Don't: ${r.text}`;
|
|
170
|
+
case "question":
|
|
171
|
+
return `- To check with the person: ${r.text}`;
|
|
172
|
+
case "important":
|
|
173
|
+
return `- Important: ${r.text}`;
|
|
174
|
+
case "number":
|
|
175
|
+
n += 1;
|
|
176
|
+
return `${n}. ${r.text}`;
|
|
177
|
+
default:
|
|
178
|
+
return `- ${r.text}`;
|
|
179
|
+
}
|
|
180
|
+
})
|
|
181
|
+
.join("\n");
|
|
182
|
+
}
|
|
183
|
+
/** What a font's licence can allow it for, among what the wizards make. */
|
|
184
|
+
export const FONT_USES = ["web", "documents", "print", "images", "video"];
|
|
185
|
+
/** How a model reads a use. */
|
|
186
|
+
export const FONT_USE_WORDS = {
|
|
187
|
+
web: "web pages and widgets",
|
|
188
|
+
documents: "documents (PDF, Word, slides)",
|
|
189
|
+
print: "print",
|
|
190
|
+
images: "images and social graphics",
|
|
191
|
+
video: "video",
|
|
192
|
+
};
|
|
193
|
+
const BACKGROUND_WORDS = /hintergrund|background|untergrund|grund|paper|papier|fläche|surface/i;
|
|
194
|
+
const TEXT_WORDS = /\btext|schrift|ink|typo/i;
|
|
195
|
+
const DISPLAY_ROLES = /head|überschrift|display|titel|title|headline/i;
|
|
196
|
+
const BODY_ROLES = /body|fließ|copy|lauf|text|ui|interface/i;
|
|
197
|
+
/** The channels of a #rrggbb colour, 0–255; null for anything else. */
|
|
198
|
+
function rgbOf(hex) {
|
|
199
|
+
const m = /^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i.exec(hex.trim());
|
|
200
|
+
return m
|
|
201
|
+
? [Number.parseInt(m[1], 16), Number.parseInt(m[2], 16), Number.parseInt(m[3], 16)]
|
|
202
|
+
: null;
|
|
203
|
+
}
|
|
204
|
+
/** How light a colour looks, 0–1 (relative luminance). */
|
|
205
|
+
function luminance(hex) {
|
|
206
|
+
const rgb = rgbOf(hex);
|
|
207
|
+
if (!rgb) {
|
|
208
|
+
return 1;
|
|
209
|
+
}
|
|
210
|
+
const [r, g, b] = rgb.map((c) => {
|
|
211
|
+
const v = c / 255;
|
|
212
|
+
return v <= 0.04045 ? v / 12.92 : ((v + 0.055) / 1.055) ** 2.4;
|
|
213
|
+
});
|
|
214
|
+
return 0.2126 * r + 0.7152 * g + 0.0722 * b;
|
|
215
|
+
}
|
|
216
|
+
/** A colour with a hue of its own, not a grey, white or black. */
|
|
217
|
+
function colourful(hex) {
|
|
218
|
+
const rgb = rgbOf(hex);
|
|
219
|
+
return rgb ? Math.max(...rgb) - Math.min(...rgb) > 40 : false;
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* How a wizard's pages look, from the brand: the first standard colour is the accent, a standard
|
|
223
|
+
* colour named as the ground ("Hintergrund") the background, the next colourful one the second
|
|
224
|
+
* colour; the typeface for headings and the one for text by their roles. What the brand does not
|
|
225
|
+
* say stays the runner's own.
|
|
226
|
+
*/
|
|
227
|
+
export function runTheme(brand) {
|
|
228
|
+
const standard = (brand.colors ?? []).filter((c) => !c.section && rgbOf(c.value));
|
|
229
|
+
const accent = standard[0]?.value ?? null;
|
|
230
|
+
const background = standard.find((c) => BACKGROUND_WORDS.test(c.name))?.value ?? null;
|
|
231
|
+
const second = standard
|
|
232
|
+
.slice(1)
|
|
233
|
+
.find((c) => c.value !== background && !TEXT_WORDS.test(c.name) && colourful(c.value))
|
|
234
|
+
?.value ?? null;
|
|
235
|
+
const fonts = brand.fonts ?? [];
|
|
236
|
+
const display = fonts.find((f) => DISPLAY_ROLES.test(f.role)) ?? fonts[0];
|
|
237
|
+
const body = fonts.find((f) => f !== display && BODY_ROLES.test(f.role)) ?? fonts.find((f) => f !== display);
|
|
238
|
+
return {
|
|
239
|
+
accent,
|
|
240
|
+
second,
|
|
241
|
+
background,
|
|
242
|
+
display: display?.family ?? null,
|
|
243
|
+
body: body?.family ?? null,
|
|
244
|
+
dark: background ? luminance(background) < 0.18 : false,
|
|
245
|
+
};
|
|
246
|
+
}
|
|
247
|
+
/** The font's licence as a model reads it: ", licence …, may only be used for …". */
|
|
248
|
+
export function fontLicenseWords(f) {
|
|
249
|
+
return [
|
|
250
|
+
f.license ? `licence ${f.license}` : "",
|
|
251
|
+
f.uses?.length ? `may only be used for ${f.uses.map((u) => FONT_USE_WORDS[u]).join(", ")}` : "",
|
|
252
|
+
]
|
|
253
|
+
.filter(Boolean)
|
|
254
|
+
.map((x) => `, ${x}`)
|
|
255
|
+
.join("");
|
|
256
|
+
}
|
|
257
|
+
export const FONT_WEIGHTS = [300, 400, 500, 600, 700, 800];
|
|
258
|
+
/** A text style as a model and a person read it: "Space Grotesk 600, 48 px, line 90 %, tracking −4 %". */
|
|
259
|
+
export function textStyleLine(style, fonts) {
|
|
260
|
+
const family = (fonts.find((f) => f.id === style.font) ?? fonts[0])?.family;
|
|
261
|
+
return [
|
|
262
|
+
family ? `${family} ${style.weight}` : `weight ${style.weight}`,
|
|
263
|
+
`${style.size} px`,
|
|
264
|
+
`line ${style.lineHeight} %`,
|
|
265
|
+
`tracking ${style.tracking} %`,
|
|
266
|
+
style.uppercase ? "uppercase" : "",
|
|
267
|
+
]
|
|
268
|
+
.filter(Boolean)
|
|
269
|
+
.join(", ");
|
|
270
|
+
}
|
|
271
|
+
/** Each file in its first list only; ids not known to `files` left out. */
|
|
272
|
+
function uniqueFiles(lists, files) {
|
|
273
|
+
const seen = new Set();
|
|
274
|
+
const known = files ? new Set(files) : null;
|
|
275
|
+
return lists.map((ids) => ids.filter((id) => {
|
|
276
|
+
if (seen.has(id) || (known && !known.has(id))) {
|
|
277
|
+
return false;
|
|
278
|
+
}
|
|
279
|
+
seen.add(id);
|
|
280
|
+
return true;
|
|
281
|
+
}));
|
|
282
|
+
}
|
|
283
|
+
/** The sections as stored: each file in its first section only, ids not known to `files` left out. */
|
|
284
|
+
export function cleanLogoSections(sections, files) {
|
|
285
|
+
const lists = uniqueFiles(sections.map((s) => s.logos), files);
|
|
286
|
+
return sections.map((s, i) => ({ ...s, logos: lists[i] }));
|
|
287
|
+
}
|
|
288
|
+
export function cleanAssetSections(sections, files) {
|
|
289
|
+
const lists = uniqueFiles(sections.map((s) => s.assets), files);
|
|
290
|
+
return sections.map((s, i) => ({ ...s, assets: lists[i] }));
|
|
291
|
+
}
|
|
292
|
+
// --- files -----------------------------------------------------------------------
|
|
293
|
+
export const PROJECT_FILE_KINDS = ["logo", "asset", "document", "pattern"];
|
|
294
|
+
export const PROJECT_LIMITS = {
|
|
295
|
+
facts: 100,
|
|
296
|
+
colors: 32,
|
|
297
|
+
fonts: 6,
|
|
298
|
+
textStyles: 16,
|
|
299
|
+
/** Sections of logos, and of colours, each. */
|
|
300
|
+
logoSections: 8,
|
|
301
|
+
/** Rows of logo rules. */
|
|
302
|
+
logoRules: 16,
|
|
303
|
+
files: { logo: 24, asset: 100, document: 2000, pattern: 24 },
|
|
304
|
+
gradients: 24,
|
|
305
|
+
bytes: {
|
|
306
|
+
logo: 5_000_000,
|
|
307
|
+
asset: 15_000_000,
|
|
308
|
+
video: 80_000_000,
|
|
309
|
+
document: 30_000_000,
|
|
310
|
+
pattern: 10_000_000,
|
|
311
|
+
},
|
|
312
|
+
};
|
|
313
|
+
/** The largest file of a kind and type a project takes. */
|
|
314
|
+
export function projectFileLimit(kind, mime) {
|
|
315
|
+
if (kind === "asset" && mime.startsWith("video/")) {
|
|
316
|
+
return PROJECT_LIMITS.bytes.video;
|
|
317
|
+
}
|
|
318
|
+
return PROJECT_LIMITS.bytes[kind];
|
|
319
|
+
}
|