@k2b/cloud 0.6.0-rc.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +98 -0
- package/package.json +128 -0
- package/public/logo.svg +1 -0
- package/scripts/app-favicon.test.ts +49 -0
- package/scripts/app-favicon.ts +51 -0
- package/scripts/build.ts +205 -0
- package/scripts/preload.ts +164 -0
- package/scripts/sync-recovery-smoke.ts +200 -0
- package/src/_internal/app-favicon.ts +2 -0
- package/src/_internal/app-presentation.ts +61 -0
- package/src/_internal/app-workspace-state.ts +24 -0
- package/src/_internal/bounded-json.ts +47 -0
- package/src/_internal/build-metadata.ts +9 -0
- package/src/_internal/capabilities.ts +1118 -0
- package/src/_internal/define-app.ts +801 -0
- package/src/_internal/heartbeat.ts +167 -0
- package/src/_internal/help-catalog.ts +241 -0
- package/src/_internal/help.ts +95 -0
- package/src/_internal/nats-connection.ts +34 -0
- package/src/_internal/page-responses.ts +40 -0
- package/src/_internal/process-sync.ts +117 -0
- package/src/_internal/readiness.ts +3 -0
- package/src/_internal/registry-validation.ts +136 -0
- package/src/_internal/registry-watch.ts +52 -0
- package/src/_internal/registry.ts +338 -0
- package/src/_internal/runtime-compatibility.ts +64 -0
- package/src/_internal/runtime-context.ts +84 -0
- package/src/_internal/runtime-watcher.ts +78 -0
- package/src/_internal/static-assets.ts +86 -0
- package/src/_internal/status-preserving-ssr.ts +49 -0
- package/src/access/PermissionEditor.tsx +486 -0
- package/src/access/ResourceApiKeys.tsx +271 -0
- package/src/access/messages.ts +121 -0
- package/src/access/ui.ts +16 -0
- package/src/account/Avatar.tsx +28 -0
- package/src/account/EntitySearch.tsx +363 -0
- package/src/account/avatar-upload-dialog.tsx +197 -0
- package/src/account/avatar-upload.ts +149 -0
- package/src/account/ui.ts +3 -0
- package/src/ai/admin.ts +47 -0
- package/src/ai/approval-routes.ts +130 -0
- package/src/ai/approvals.ts +139 -0
- package/src/ai/assistant-models.ts +61 -0
- package/src/ai/attachments.ts +40 -0
- package/src/ai/browser.ts +92 -0
- package/src/ai/capabilities.ts +714 -0
- package/src/ai/capability-execution.ts +151 -0
- package/src/ai/chat/blocks.render.test.tsx +1108 -0
- package/src/ai/chat/blocks.tsx +730 -0
- package/src/ai/chat/builtin-tools.tsx +428 -0
- package/src/ai/chat/capability-table.tsx +87 -0
- package/src/ai/chat/composer-adapter.ts +169 -0
- package/src/ai/chat/file-tools.tsx +81 -0
- package/src/ai/chat/message-actions.tsx +370 -0
- package/src/ai/chat/message-utils.ts +479 -0
- package/src/ai/chat/messages.ts +43 -0
- package/src/ai/chat/presentation.tsx +395 -0
- package/src/ai/chat/primitives.tsx +3 -0
- package/src/ai/chat/tool-disclosure.tsx +41 -0
- package/src/ai/chat/turn-navigator-utils.ts +28 -0
- package/src/ai/chat/turn-navigator.tsx +164 -0
- package/src/ai/chat/user-message.tsx +149 -0
- package/src/ai/chat/visual-tools.tsx +435 -0
- package/src/ai/chat/web-tools.tsx +202 -0
- package/src/ai/chat-task-contracts.ts +113 -0
- package/src/ai/chat-tasks.ts +952 -0
- package/src/ai/client/controller.ts +1211 -0
- package/src/ai/client/file-source.ts +95 -0
- package/src/ai/client/live-connection.ts +140 -0
- package/src/ai/client/projection.ts +178 -0
- package/src/ai/client/transport.ts +111 -0
- package/src/ai/compaction.ts +182 -0
- package/src/ai/credentials.ts +124 -0
- package/src/ai/default-tool-contracts.ts +108 -0
- package/src/ai/default-tools.ts +127 -0
- package/src/ai/enrich.ts +280 -0
- package/src/ai/executor.ts +1624 -0
- package/src/ai/fetch-file-tool.ts +313 -0
- package/src/ai/file-context.ts +92 -0
- package/src/ai/file-media-type.ts +28 -0
- package/src/ai/file-mount.ts +16 -0
- package/src/ai/file-tools.ts +566 -0
- package/src/ai/files-store.ts +390 -0
- package/src/ai/firecrawl-tools.ts +305 -0
- package/src/ai/grids-skill.ts +126 -0
- package/src/ai/http.ts +265 -0
- package/src/ai/index.ts +337 -0
- package/src/ai/kit-skill.ts +22 -0
- package/src/ai/limits.ts +5 -0
- package/src/ai/live-events.ts +289 -0
- package/src/ai/live-messages.ts +45 -0
- package/src/ai/live-outbox.ts +102 -0
- package/src/ai/live-routes.ts +412 -0
- package/src/ai/live.ts +2 -0
- package/src/ai/maintenance.ts +302 -0
- package/src/ai/markdown-pdf-tool.ts +95 -0
- package/src/ai/memories.ts +605 -0
- package/src/ai/memory-learning-runs.ts +222 -0
- package/src/ai/memory-learning.ts +619 -0
- package/src/ai/memory-tool.ts +120 -0
- package/src/ai/memory-workflow-evidence.ts +158 -0
- package/src/ai/migrate.ts +2082 -0
- package/src/ai/model-access-migrate.ts +30 -0
- package/src/ai/model-access.ts +191 -0
- package/src/ai/personal-agent.ts +6 -0
- package/src/ai/prefs.ts +72 -0
- package/src/ai/project-tool.ts +94 -0
- package/src/ai/projects-routes.ts +277 -0
- package/src/ai/projects.ts +902 -0
- package/src/ai/protocol.ts +279 -0
- package/src/ai/provider.ts +73 -0
- package/src/ai/public-projection.ts +25 -0
- package/src/ai/resource-markers.ts +31 -0
- package/src/ai/resource-refs.ts +70 -0
- package/src/ai/routes.ts +1131 -0
- package/src/ai/runtime-tools.ts +39 -0
- package/src/ai/runtime.ts +544 -0
- package/src/ai/settings.ts +529 -0
- package/src/ai/short-id.ts +45 -0
- package/src/ai/skill-catalog.ts +73 -0
- package/src/ai/skill-format.ts +145 -0
- package/src/ai/skill-seeds.ts +430 -0
- package/src/ai/skill-tool.ts +81 -0
- package/src/ai/skills-routes.ts +143 -0
- package/src/ai/skills.ts +934 -0
- package/src/ai/solid.ts +27 -0
- package/src/ai/store.ts +3113 -0
- package/src/ai/stream.ts +308 -0
- package/src/ai/structured-runs.ts +66 -0
- package/src/ai/structured.ts +186 -0
- package/src/ai/system-prompt.ts +170 -0
- package/src/ai/task-prompt.ts +22 -0
- package/src/ai/timeline.ts +148 -0
- package/src/ai/tool-audit.ts +177 -0
- package/src/ai/tool-result-budget.ts +16 -0
- package/src/ai/tools.ts +155 -0
- package/src/ai/types.ts +967 -0
- package/src/ai/ui.tsx +39 -0
- package/src/ai/usage-migrate.ts +81 -0
- package/src/ai/usage.ts +315 -0
- package/src/ai/validate.ts +54 -0
- package/src/ai/vision-tool.ts +79 -0
- package/src/api/accounts-entities.ts +174 -0
- package/src/api/admin-ai-projects.ts +74 -0
- package/src/api/admin-ai-skills.ts +76 -0
- package/src/api/admin-ai-usage.ts +42 -0
- package/src/api/admin-core-settings.ts +508 -0
- package/src/api/admin-identity.ts +148 -0
- package/src/api/admin-lifecycle.ts +206 -0
- package/src/api/admin-linux-identities.ts +66 -0
- package/src/api/announcements.ts +131 -0
- package/src/api/app-approval.ts +129 -0
- package/src/api/apps.ts +51 -0
- package/src/api/auth/schemas.ts +54 -0
- package/src/api/auth.ts +370 -0
- package/src/api/capabilities.ts +658 -0
- package/src/api/help-messages.ts +19 -0
- package/src/api/help.ts +78 -0
- package/src/api/index.ts +108 -0
- package/src/api/mcp.ts +744 -0
- package/src/api/me-rail.ts +45 -0
- package/src/api/me.ts +753 -0
- package/src/api/search/schemas.ts +79 -0
- package/src/api/search.bench.ts +185 -0
- package/src/api/search.ts +407 -0
- package/src/api/sync-ops.ts +79 -0
- package/src/api/widgets.ts +143 -0
- package/src/browser/CloudResourceSearch.behavior.test.tsx +74 -0
- package/src/browser/CloudResourceSearch.tsx +791 -0
- package/src/browser/app-approval-vault.ts +305 -0
- package/src/browser/app-approval.ts +234 -0
- package/src/browser/live-websocket.ts +268 -0
- package/src/browser/locale-preference.ts +25 -0
- package/src/browser/notification-target.ts +27 -0
- package/src/browser/notification-timeout.ts +14 -0
- package/src/browser/notifications.ts +181 -0
- package/src/browser/resource-clipboard.ts +70 -0
- package/src/browser/resource-picker.tsx +39 -0
- package/src/browser/resource-search-messages.ts +55 -0
- package/src/browser/resource-search.ts +27 -0
- package/src/capabilities/client.ts +149 -0
- package/src/capabilities/response.ts +39 -0
- package/src/capabilities/server.ts +215 -0
- package/src/capabilities/signals.ts +4 -0
- package/src/capabilities/testing.ts +12 -0
- package/src/capabilities/types.ts +32 -0
- package/src/cli/access.ts +499 -0
- package/src/cli/account.ts +382 -0
- package/src/cli/admin/account-administration.ts +45 -0
- package/src/cli/admin/account-categories.ts +49 -0
- package/src/cli/admin/ai-usage.ts +118 -0
- package/src/cli/admin/app-sign-in.ts +49 -0
- package/src/cli/admin/data.ts +343 -0
- package/src/cli/admin/documentation.ts +34 -0
- package/src/cli/admin/gateway.ts +155 -0
- package/src/cli/admin/index.ts +61 -0
- package/src/cli/admin/instance.ts +250 -0
- package/src/cli/admin/jobs.ts +223 -0
- package/src/cli/admin/legal.ts +122 -0
- package/src/cli/admin/linux.ts +53 -0
- package/src/cli/admin/logs.ts +324 -0
- package/src/cli/admin/metrics.ts +142 -0
- package/src/cli/admin/nats.ts +167 -0
- package/src/cli/admin/notifications.ts +516 -0
- package/src/cli/admin/shared.ts +113 -0
- package/src/cli/admin/sync.ts +188 -0
- package/src/cli/admin/telemetry.ts +314 -0
- package/src/cli/admin/webhooks.ts +222 -0
- package/src/cli/admin/workflows.ts +367 -0
- package/src/cli/apps.ts +40 -0
- package/src/cli/capabilities.ts +239 -0
- package/src/cli/commands.ts +604 -0
- package/src/cli/index.ts +61 -0
- package/src/cli/locale.ts +31 -0
- package/src/cli/output.ts +58 -0
- package/src/clients/core.ts +20 -0
- package/src/config/env.ts +54 -0
- package/src/config/index.ts +6 -0
- package/src/contracts/account-categories.ts +62 -0
- package/src/contracts/announcements.ts +121 -0
- package/src/contracts/app-approval.ts +197 -0
- package/src/contracts/app.ts +162 -0
- package/src/contracts/capabilities.ts +484 -0
- package/src/contracts/index.ts +14 -0
- package/src/contracts/notification-live.ts +66 -0
- package/src/contracts/notification-types.ts +235 -0
- package/src/contracts/posix.ts +69 -0
- package/src/contracts/profile.ts +85 -0
- package/src/contracts/rail-preferences.ts +53 -0
- package/src/contracts/registry.ts +110 -0
- package/src/contracts/resource-clipboard.ts +33 -0
- package/src/contracts/settings-types.ts +98 -0
- package/src/contracts/shared.ts +408 -0
- package/src/contracts/user-notifications.ts +101 -0
- package/src/contracts/widgets.ts +183 -0
- package/src/desktop/index.ts +704 -0
- package/src/desktop/solid.tsx +938 -0
- package/src/index.ts +58 -0
- package/src/server/actor.ts +41 -0
- package/src/server/api/index.ts +2 -0
- package/src/server/api/respond.ts +96 -0
- package/src/server/api-client.ts +54 -0
- package/src/server/app-context.ts +39 -0
- package/src/server/help.ts +187 -0
- package/src/server/index.ts +89 -0
- package/src/server/locale.ts +55 -0
- package/src/server/middleware/auth.ts +386 -0
- package/src/server/middleware/index.ts +28 -0
- package/src/server/middleware/invocation.ts +55 -0
- package/src/server/middleware/middleware.ts +65 -0
- package/src/server/middleware/openapi.ts +126 -0
- package/src/server/middleware/rate-limit.ts +125 -0
- package/src/server/middleware/request-logger.ts +41 -0
- package/src/server/middleware/route-template.ts +46 -0
- package/src/server/middleware/runtime.ts +22 -0
- package/src/server/middleware/settings.ts +55 -0
- package/src/server/middleware/validator.ts +49 -0
- package/src/server/middleware/workload.ts +22 -0
- package/src/server/ratelimit.ts +151 -0
- package/src/server/request-cookies.ts +18 -0
- package/src/server/services/access.ts +644 -0
- package/src/server/services/freeipa/client.ts +137 -0
- package/src/server/services/freeipa/index.ts +9 -0
- package/src/server/services/freeipa/session.ts +123 -0
- package/src/server/services/freeipa/test-certificates.ts +44 -0
- package/src/server/services/freeipa/tls.ts +44 -0
- package/src/server/services/freeipa/transport.ts +116 -0
- package/src/server/services/freeipa/util.ts +59 -0
- package/src/server/services/geo.ts +198 -0
- package/src/server/services/index.ts +48 -0
- package/src/server/services/pagination.ts +22 -0
- package/src/server/services/services.ts +13 -0
- package/src/server/time.ts +33 -0
- package/src/services/account-category-policy.ts +51 -0
- package/src/services/account-lifecycle/audit.ts +41 -0
- package/src/services/account-lifecycle/index.ts +940 -0
- package/src/services/account-lifecycle/ipa-backfill.ts +152 -0
- package/src/services/account-lifecycle/notification-sender.ts +13 -0
- package/src/services/account-lifecycle/scheduler.ts +506 -0
- package/src/services/account-model.ts +22 -0
- package/src/services/accounts/app.ts +1671 -0
- package/src/services/accounts/authz.ts +44 -0
- package/src/services/accounts/avatar.ts +120 -0
- package/src/services/accounts/base-group.ts +11 -0
- package/src/services/accounts/base-user.ts +46 -0
- package/src/services/accounts/duplicate-emails.ts +82 -0
- package/src/services/accounts/entities.ts +622 -0
- package/src/services/accounts/group-sql.ts +106 -0
- package/src/services/accounts/groups.ts +272 -0
- package/src/services/accounts/index.ts +14 -0
- package/src/services/accounts/ipa-data.ts +66 -0
- package/src/services/accounts/lifecycle.ts +2 -0
- package/src/services/accounts/local-groups.ts +499 -0
- package/src/services/accounts/model.ts +129 -0
- package/src/services/accounts/notification-sender.ts +31 -0
- package/src/services/accounts/posix.ts +386 -0
- package/src/services/accounts/request-policy.ts +11 -0
- package/src/services/accounts/switching.ts +126 -0
- package/src/services/accounts/users.ts +745 -0
- package/src/services/announcements/index.ts +224 -0
- package/src/services/app-approval.ts +498 -0
- package/src/services/audit/index.ts +438 -0
- package/src/services/auth-flows/index.ts +15 -0
- package/src/services/auth-flows/ipa.ts +197 -0
- package/src/services/auth-flows/magic-link.ts +185 -0
- package/src/services/auth-flows/notification-sender.ts +10 -0
- package/src/services/auth-flows/password-reset.ts +268 -0
- package/src/services/auth-flows/proxy-return.ts +49 -0
- package/src/services/document-extraction.ts +148 -0
- package/src/services/freeipa-config.ts +179 -0
- package/src/services/gateway.ts +186 -0
- package/src/services/identity/constants.ts +18 -0
- package/src/services/identity/index.ts +52 -0
- package/src/services/identity/invocation-actor.ts +120 -0
- package/src/services/identity/invocation-authority.ts +53 -0
- package/src/services/identity/invocation-operations.ts +15 -0
- package/src/services/identity/invocation-token.ts +276 -0
- package/src/services/identity/key-config.ts +41 -0
- package/src/services/identity/key-ring.ts +530 -0
- package/src/services/identity/metrics.ts +29 -0
- package/src/services/identity/routes.ts +18 -0
- package/src/services/identity/runtime-config.ts +88 -0
- package/src/services/identity/session-token.ts +152 -0
- package/src/services/identity/signer-refresh.ts +44 -0
- package/src/services/identity/workload-auth.ts +64 -0
- package/src/services/index.ts +187 -0
- package/src/services/ipa/auth.ts +216 -0
- package/src/services/ipa/connection.ts +57 -0
- package/src/services/ipa/effective-groups.ts +70 -0
- package/src/services/ipa/groups.ts +722 -0
- package/src/services/ipa/guard.ts +17 -0
- package/src/services/ipa/index.ts +17 -0
- package/src/services/ipa/posix.ts +19 -0
- package/src/services/ipa/profile.ts +132 -0
- package/src/services/ipa/runtime.ts +28 -0
- package/src/services/ipa/search.ts +154 -0
- package/src/services/ipa/service-account.ts +15 -0
- package/src/services/ipa/sync-planning.ts +100 -0
- package/src/services/ipa/sync.ts +862 -0
- package/src/services/ipa/users.ts +806 -0
- package/src/services/legal-consent.ts +76 -0
- package/src/services/logging/index.ts +477 -0
- package/src/services/logging/redaction.ts +20 -0
- package/src/services/logging/trace.ts +1231 -0
- package/src/services/mandates/index.ts +855 -0
- package/src/services/mandates/policy.ts +85 -0
- package/src/services/network-security.ts +31 -0
- package/src/services/notifications/batches.ts +722 -0
- package/src/services/notifications/browser.ts +252 -0
- package/src/services/notifications/catalog.ts +113 -0
- package/src/services/notifications/channels.ts +104 -0
- package/src/services/notifications/dispatcher.ts +139 -0
- package/src/services/notifications/email.ts +118 -0
- package/src/services/notifications/index.ts +633 -0
- package/src/services/notifications/live.ts +50 -0
- package/src/services/notifications/observability.ts +407 -0
- package/src/services/notifications/platform.ts +421 -0
- package/src/services/notifications/runtime.ts +120 -0
- package/src/services/notifications/user.ts +248 -0
- package/src/services/notifications/web-push-transport.ts +135 -0
- package/src/services/oauth-tokens.ts +209 -0
- package/src/services/outbox.ts +187 -0
- package/src/services/pdf/gotenberg.ts +290 -0
- package/src/services/pdf/index.ts +43 -0
- package/src/services/pdf/markdown.ts +209 -0
- package/src/services/pdf/template-preview.ts +122 -0
- package/src/services/postgres.ts +76 -0
- package/src/services/providers/index.ts +27 -0
- package/src/services/providers/local/auth.ts +51 -0
- package/src/services/providers/local/index.ts +4 -0
- package/src/services/providers/local/users.ts +263 -0
- package/src/services/rail-preferences.ts +27 -0
- package/src/services/runtime-lifecycle.ts +191 -0
- package/src/services/secrets.ts +10 -0
- package/src/services/service-account-credentials.ts +891 -0
- package/src/services/service-accounts.ts +184 -0
- package/src/services/session/index.ts +236 -0
- package/src/services/session/test-fixture.ts +18 -0
- package/src/services/session/user.ts +144 -0
- package/src/services/settings/api.ts +61 -0
- package/src/services/settings/app.ts +86 -0
- package/src/services/settings/core-settings.ts +796 -0
- package/src/services/settings/crypto.ts +69 -0
- package/src/services/settings/defaults.ts +374 -0
- package/src/services/settings/index.ts +215 -0
- package/src/services/settings/namespace.ts +9 -0
- package/src/services/settings/snapshot.ts +49 -0
- package/src/services/settings/store.ts +241 -0
- package/src/services/settings/templates.ts +4 -0
- package/src/services/sync-ops.ts +403 -0
- package/src/services/topic-cursor.ts +22 -0
- package/src/services/weather/forecast.ts +323 -0
- package/src/services/weather/geo.ts +119 -0
- package/src/services/weather/index.ts +67 -0
- package/src/services/weather/location.ts +24 -0
- package/src/services/weather/locations.ts +133 -0
- package/src/services/weather/migrate.ts +45 -0
- package/src/services/weather/settings.ts +66 -0
- package/src/services/weather/short-id.ts +57 -0
- package/src/services/weather/types.ts +61 -0
- package/src/services/weather/ui.ts +50 -0
- package/src/services/webauthn.ts +385 -0
- package/src/shared/account-action-notice.ts +70 -0
- package/src/shared/account-display.ts +15 -0
- package/src/shared/account-session.ts +15 -0
- package/src/shared/ai-platform-prompt.ts +134 -0
- package/src/shared/ai-usage.ts +49 -0
- package/src/shared/app-presentation.ts +48 -0
- package/src/shared/app-url.ts +12 -0
- package/src/shared/branding.ts +14 -0
- package/src/shared/capability-messages.ts +70 -0
- package/src/shared/email-html.ts +54 -0
- package/src/shared/format.ts +91 -0
- package/src/shared/help.ts +68 -0
- package/src/shared/icons.ts +400 -0
- package/src/shared/index.ts +54 -0
- package/src/shared/locale.ts +48 -0
- package/src/shared/login-method.ts +44 -0
- package/src/shared/markdown/client.ts +130 -0
- package/src/shared/markdown/extensions/code.ts +105 -0
- package/src/shared/markdown/extensions/guided-help.ts +100 -0
- package/src/shared/markdown/extensions/images.ts +79 -0
- package/src/shared/markdown/extensions/info-blocks.ts +97 -0
- package/src/shared/markdown/extensions/katex.ts +120 -0
- package/src/shared/markdown/extensions/links.ts +43 -0
- package/src/shared/markdown/extensions/mark.ts +48 -0
- package/src/shared/markdown/extensions/sub-sup.ts +60 -0
- package/src/shared/markdown/extensions/tables.ts +109 -0
- package/src/shared/markdown/extensions/task-list.ts +53 -0
- package/src/shared/markdown/formula.ts +1187 -0
- package/src/shared/markdown/index.ts +193 -0
- package/src/shared/markdown/shared.ts +36 -0
- package/src/shared/mock-cover.ts +130 -0
- package/src/shared/network-address.ts +106 -0
- package/src/shared/redirect.ts +56 -0
- package/src/shared/template-rendering.ts +140 -0
- package/src/shared/theme.ts +68 -0
- package/src/shared/time.ts +13 -0
- package/src/ssr/AdminLayout.tsx +53 -0
- package/src/ssr/AdminSidebar.tsx +50 -0
- package/src/ssr/AppLaunchpad.island.tsx +236 -0
- package/src/ssr/AppWorkspaceController.island.tsx +21 -0
- package/src/ssr/BrowserNotifications.island.tsx +135 -0
- package/src/ssr/GlobalAnnouncements.island.tsx +142 -0
- package/src/ssr/GlobalSearchDialog.behavior.test.tsx +96 -0
- package/src/ssr/GlobalSearchDialog.tsx +35 -0
- package/src/ssr/GlobalSearchHelpDialog.tsx +104 -0
- package/src/ssr/GlobalSearchTrigger.island.tsx +55 -0
- package/src/ssr/HotkeysHelpRail.island.tsx +55 -0
- package/src/ssr/Layout.render.test.tsx +148 -0
- package/src/ssr/Layout.tsx +292 -0
- package/src/ssr/LayoutBreadcrumbs.island.tsx +44 -0
- package/src/ssr/LayoutFooter.tsx +22 -0
- package/src/ssr/LayoutHeader.tsx +81 -0
- package/src/ssr/LayoutHelp.tsx +869 -0
- package/src/ssr/LayoutPreferences.island.tsx +36 -0
- package/src/ssr/LayoutRail.tsx +58 -0
- package/src/ssr/MinimalLayout.tsx +46 -0
- package/src/ssr/PageError.tsx +29 -0
- package/src/ssr/ProfilePreferences.island.tsx +92 -0
- package/src/ssr/RailApps.island.tsx +61 -0
- package/src/ssr/RailEditor.tsx +293 -0
- package/src/ssr/RegisteredHelpDocuments.island.tsx +3 -0
- package/src/ssr/TimezoneCookie.island.tsx +23 -0
- package/src/ssr/admin-active-link.ts +47 -0
- package/src/ssr/admin-navigation.ts +78 -0
- package/src/ssr/app-appearance.ts +23 -0
- package/src/ssr/app-navigation.ts +41 -0
- package/src/ssr/help-messages.ts +104 -0
- package/src/ssr/index.ts +14 -0
- package/src/ssr/islands/SearchBar.island.tsx +80 -0
- package/src/ssr/islands/index.ts +16 -0
- package/src/ssr/layout-context.ts +17 -0
- package/src/ssr/layout-help-markdown.ts +9 -0
- package/src/ssr/layout-help-navigation.ts +24 -0
- package/src/ssr/layout-help-url.ts +5 -0
- package/src/ssr/layout-runtime.ts +22 -0
- package/src/ssr/page-error-messages.ts +25 -0
- package/src/ssr/platform-messages.ts +135 -0
- package/src/ssr/preference-controller.ts +44 -0
- package/src/ssr/profile-preferences-messages.ts +29 -0
- package/src/ssr/rail-context.ts +21 -0
- package/src/ssr/rail-messages.ts +66 -0
- package/src/ssr/rail-navigation.ts +60 -0
- package/src/ssr/runtime.ts +31 -0
- package/src/ssr/url-filter.ts +127 -0
- package/src/styles/base-popover.css +36 -0
- package/src/styles/effects.css +851 -0
- package/src/styles/global.css +268 -0
- package/src/styles/input.css +58 -0
- package/src/styles/tokens.css +230 -0
- package/src/styles/utilities-buttons.css +405 -0
- package/src/styles/utilities-data.css +33 -0
- package/src/styles/utilities-feedback.css +232 -0
- package/src/styles/utilities-layout.css +603 -0
- package/src/styles/utilities-markdown-editor.css +525 -0
- package/src/styles/utilities-markdown-table.css +234 -0
- package/src/styles/utilities-navigation.css +1054 -0
- package/src/types/ambient.d.ts +24 -0
- package/src/workflows/ai/index.ts +17 -0
- package/src/workflows/ai/runtime.ts +286 -0
- package/src/workflows/ai/store.ts +314 -0
- package/src/workflows/ai/types.ts +111 -0
- package/src/workflows/ai-actions.ts +269 -0
- package/src/workflows/authoring.ts +88 -0
- package/src/workflows/builtins.ts +193 -0
- package/src/workflows/contracts.ts +280 -0
- package/src/workflows/definition.ts +334 -0
- package/src/workflows/editor.ts +113 -0
- package/src/workflows/index.ts +71 -0
- package/src/workflows/language/binder.ts +45 -0
- package/src/workflows/language/canonical.ts +29 -0
- package/src/workflows/language/compiler.ts +396 -0
- package/src/workflows/language/expressions.ts +34 -0
- package/src/workflows/language/index.ts +20 -0
- package/src/workflows/language/references.ts +55 -0
- package/src/workflows/language/schema.ts +134 -0
- package/src/workflows/language/strict-yaml.ts +131 -0
- package/src/workflows/manifest.ts +24 -0
- package/src/workflows/module.ts +12 -0
- package/src/workflows/runtime/coordinator.ts +115 -0
- package/src/workflows/runtime/executor.ts +1003 -0
- package/src/workflows/runtime/index.ts +60 -0
- package/src/workflows/runtime/instant.ts +8 -0
- package/src/workflows/runtime/ports.ts +213 -0
- package/src/workflows/runtime/schedule.ts +203 -0
- package/src/workflows/runtime/trigger.ts +37 -0
- package/src/workflows/runtime/wake.ts +13 -0
- package/src/workflows/store/actions.ts +438 -0
- package/src/workflows/store/budget.ts +145 -0
- package/src/workflows/store/definitions.ts +345 -0
- package/src/workflows/store/events.ts +383 -0
- package/src/workflows/store/index.ts +107 -0
- package/src/workflows/store/observability.ts +594 -0
- package/src/workflows/store/runs.ts +975 -0
- package/src/workflows/store/transaction.ts +23 -0
- package/src/workflows/store/worker.ts +439 -0
- package/src/workflows/testing/conformance.ts +72 -0
- package/src/workflows/testing/index.ts +11 -0
- package/src/workflows/testing/process-fixtures.ts +275 -0
|
@@ -0,0 +1,525 @@
|
|
|
1
|
+
/* Markdown editor — overtype-style layered textarea + preview.
|
|
2
|
+
|
|
3
|
+
The textarea has `color: transparent` so its glyphs are invisible; only
|
|
4
|
+
the cursor (caret-color) and selection show through. The preview div
|
|
5
|
+
beneath renders the same text with markdown syntax highlighted. Identical
|
|
6
|
+
font / padding / whitespace / wrapping on both layers is REQUIRED for
|
|
7
|
+
the cursor to line up exactly with the visible glyphs in the preview.
|
|
8
|
+
|
|
9
|
+
All glyph-affecting properties on `.md-editor-layer` use `!important` to
|
|
10
|
+
defeat any cascading style that would shift the layers relative to each
|
|
11
|
+
other. No font-size, font-weight, or font-style is ever varied between
|
|
12
|
+
the textarea and inner preview spans — bold uses a text-shadow trick,
|
|
13
|
+
italic uses colour. Any real weight/style change risks glyph-width
|
|
14
|
+
drift even on nominally monospace fonts. */
|
|
15
|
+
|
|
16
|
+
.md-editor {
|
|
17
|
+
--md-editor-hover: var(--ui-field-hover);
|
|
18
|
+
--md-editor-hover-border: var(--ui-field-hover-border);
|
|
19
|
+
position: relative;
|
|
20
|
+
border: 1px solid var(--ui-field-border);
|
|
21
|
+
border-radius: var(--ui-radius-control);
|
|
22
|
+
background: var(--ui-field);
|
|
23
|
+
@apply transition-colors;
|
|
24
|
+
@apply overflow-hidden;
|
|
25
|
+
/* Recessed well — matches the `input` utility (default variant is field-shaped).
|
|
26
|
+
The `paper` variant below overrides this with a card bevel instead. */
|
|
27
|
+
box-shadow: var(--ui-control-recess);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
.md-editor:hover {
|
|
31
|
+
border-color: var(--md-editor-hover-border, var(--ui-field-hover-border));
|
|
32
|
+
background: var(--md-editor-hover, var(--ui-field-hover));
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
.md-editor:focus-within {
|
|
36
|
+
border-color: var(--ui-field-focus-border);
|
|
37
|
+
background: var(--ui-field-focus);
|
|
38
|
+
box-shadow: var(--ui-focus);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
.md-editor[data-variant="paper"] {
|
|
42
|
+
border-color: var(--ui-border);
|
|
43
|
+
border-radius: var(--ui-radius-surface);
|
|
44
|
+
background: var(--ui-surface);
|
|
45
|
+
/* Paper variant = a document surface, so it gets the card bevel (raised),
|
|
46
|
+
not the recess of the field variant. */
|
|
47
|
+
box-shadow: var(--ui-shadow-surface);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
.md-editor[data-variant="paper"]:hover {
|
|
51
|
+
border-color: var(--ui-border);
|
|
52
|
+
background: var(--ui-surface);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
.md-editor[data-variant="paper"]:focus-within {
|
|
56
|
+
border-color: var(--ui-field-focus-border);
|
|
57
|
+
background: var(--ui-surface);
|
|
58
|
+
box-shadow: var(--ui-shadow-surface), var(--ui-focus);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
.md-editor[data-variant="paper"] .md-editor-toolbar {
|
|
62
|
+
border-color: var(--ui-border);
|
|
63
|
+
background: var(--ui-surface);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
.md-editor[data-variant="paper"] .md-editor-tool {
|
|
67
|
+
@apply hover:bg-zinc-100;
|
|
68
|
+
@apply dark:hover:bg-zinc-800;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
.md-editor[data-disabled="true"] {
|
|
72
|
+
@apply opacity-50 cursor-not-allowed;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/* Error state — red border, both unfocused and focused, mirroring how
|
|
76
|
+
the standard `.input` utility would visually signal an error. The
|
|
77
|
+
error MESSAGE itself is rendered separately by `InputWrapper` below
|
|
78
|
+
the editor. */
|
|
79
|
+
.md-editor[data-error="true"],
|
|
80
|
+
.md-editor[data-error="true"]:focus-within {
|
|
81
|
+
@apply border-red-400 dark:border-red-500;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/* Toolbar bar above the editor surface */
|
|
85
|
+
.md-editor-toolbar {
|
|
86
|
+
@apply flex items-center gap-0.5 flex-wrap;
|
|
87
|
+
@apply px-1.5 py-1;
|
|
88
|
+
border-bottom: 1px solid var(--ui-divider);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
.md-editor:focus-within .md-editor-toolbar {
|
|
92
|
+
border-color: var(--ui-divider);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
.md-editor-tool {
|
|
96
|
+
@apply inline-flex items-center justify-center;
|
|
97
|
+
@apply w-7 h-7 rounded;
|
|
98
|
+
@apply text-zinc-500 dark:text-zinc-400;
|
|
99
|
+
@apply hover:bg-zinc-200 hover:text-zinc-800;
|
|
100
|
+
@apply dark:hover:bg-zinc-700 dark:hover:text-zinc-100;
|
|
101
|
+
@apply transition-colors;
|
|
102
|
+
font-size: 0.95rem;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/* Active formatting at the caret — blue tint + faint blue background
|
|
106
|
+
so the active state is unmistakable at a glance, without becoming
|
|
107
|
+
visually loud. Hover on an active button keeps the blue surface
|
|
108
|
+
tone (not the zinc one) so the colour doesn't flicker. */
|
|
109
|
+
.md-editor-tool[aria-pressed="true"] {
|
|
110
|
+
@apply text-blue-600 bg-blue-50;
|
|
111
|
+
@apply dark:text-blue-400 dark:bg-blue-950/40;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
.md-editor-tool[aria-pressed="true"]:hover {
|
|
115
|
+
@apply bg-blue-100 text-blue-700;
|
|
116
|
+
@apply dark:bg-blue-900/40 dark:text-blue-300;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
.md-editor-tool-sep {
|
|
120
|
+
@apply w-px h-4 bg-zinc-300 dark:bg-zinc-600 mx-1;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/* The two stacked layers. The wrapper has explicit height (set inline
|
|
124
|
+
via style="--md-h: ...em") so both layers can size to it via 100%. */
|
|
125
|
+
.md-editor-surface {
|
|
126
|
+
position: relative;
|
|
127
|
+
height: var(--md-h, 8rem);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/* Fill mode — the editor stretches to its (flex) parent instead of a
|
|
131
|
+
line-count height. Used by IDE-style hosts like the file browser. */
|
|
132
|
+
.md-editor[data-fill="true"] {
|
|
133
|
+
height: 100%;
|
|
134
|
+
display: flex;
|
|
135
|
+
flex-direction: column;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
.md-editor[data-fill="true"] .md-editor-surface {
|
|
139
|
+
flex: 1;
|
|
140
|
+
min-height: 0;
|
|
141
|
+
height: auto;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
.md-editor-layer {
|
|
145
|
+
/* These properties MUST be identical on textarea and preview.
|
|
146
|
+
`!important` because user-agent textarea defaults + any stray rule
|
|
147
|
+
could otherwise shift one layer relative to the other.
|
|
148
|
+
|
|
149
|
+
Bold + italic are NOT done via font-weight / font-style on this
|
|
150
|
+
layer — see the rules further down. We rely on text-shadow for
|
|
151
|
+
fake-bold and colour-only for italic so the glyph advance widths
|
|
152
|
+
stay identical between the textarea and the preview. */
|
|
153
|
+
position: absolute !important;
|
|
154
|
+
inset: 0 !important;
|
|
155
|
+
display: block !important;
|
|
156
|
+
|
|
157
|
+
/* Typography — identical glyph metrics on both layers.
|
|
158
|
+
Every property here is locked down so the textarea and preview
|
|
159
|
+
can never disagree on glyph advance widths. The four critical
|
|
160
|
+
subtleties:
|
|
161
|
+
1. `font-synthesis: none` — only-loaded weights (400/500/600
|
|
162
|
+
for IBM Plex Mono) get used. Asking for 700 would synthesise
|
|
163
|
+
a faux-bold, and synthesised bold does NOT preserve mono
|
|
164
|
+
glyph widths.
|
|
165
|
+
2. `font-variant-ligatures: none` + `font-feature-settings`
|
|
166
|
+
disable ligatures (`==` → `≡` etc.) and contextual
|
|
167
|
+
alternates. Both reshape glyph runs and break alignment.
|
|
168
|
+
3. `letter-spacing: 0` (NOT `normal`) — `normal` lets the font
|
|
169
|
+
decide and some shells inject a fractional value.
|
|
170
|
+
4. `text-rendering: geometricPrecision` — disables kerning so
|
|
171
|
+
even non-monospace fallback fonts don't shift glyph X
|
|
172
|
+
positions across layers. */
|
|
173
|
+
/* IBM Plex Mono is shipped via `/public/fonts.css` (regular + italic +
|
|
174
|
+
500 + 600 weights). Pinning the font here means the
|
|
175
|
+
editor looks identical across OSes and we control the italic
|
|
176
|
+
variant precisely. The bold/heading "weight" is faked via
|
|
177
|
+
text-shadow further down so we never actually request a weight
|
|
178
|
+
the loaded font lacks. The trailing `monospace` is a last-ditch
|
|
179
|
+
fallback if Plex Mono ever fails to load. */
|
|
180
|
+
font-family: "IBM Plex Mono", monospace !important;
|
|
181
|
+
font-size: 0.875rem !important; /* 14px */
|
|
182
|
+
line-height: 1.55 !important;
|
|
183
|
+
font-weight: 400 !important;
|
|
184
|
+
font-style: normal !important;
|
|
185
|
+
font-variant: normal !important;
|
|
186
|
+
font-variant-ligatures: none !important;
|
|
187
|
+
font-variant-numeric: tabular-nums !important;
|
|
188
|
+
font-variant-position: normal !important;
|
|
189
|
+
font-stretch: normal !important;
|
|
190
|
+
font-kerning: none !important;
|
|
191
|
+
font-synthesis: none !important;
|
|
192
|
+
-webkit-font-synthesis: none !important;
|
|
193
|
+
font-feature-settings:
|
|
194
|
+
"liga" 0,
|
|
195
|
+
"clig" 0,
|
|
196
|
+
"calt" 0 !important;
|
|
197
|
+
font-variation-settings: normal !important;
|
|
198
|
+
font-optical-sizing: none !important;
|
|
199
|
+
letter-spacing: 0 !important;
|
|
200
|
+
word-spacing: 0 !important;
|
|
201
|
+
text-align: left !important;
|
|
202
|
+
text-indent: 0 !important;
|
|
203
|
+
text-transform: none !important;
|
|
204
|
+
text-rendering: geometricPrecision !important;
|
|
205
|
+
|
|
206
|
+
/* Box model */
|
|
207
|
+
padding: 0.625rem 0.75rem !important;
|
|
208
|
+
margin: 0 !important;
|
|
209
|
+
border: 0 !important;
|
|
210
|
+
outline: 0 !important;
|
|
211
|
+
box-sizing: border-box !important;
|
|
212
|
+
|
|
213
|
+
/* Whitespace + wrapping — must agree on every char position */
|
|
214
|
+
white-space: pre-wrap !important;
|
|
215
|
+
word-wrap: break-word !important;
|
|
216
|
+
word-break: normal !important;
|
|
217
|
+
overflow-wrap: break-word !important;
|
|
218
|
+
tab-size: 2 !important;
|
|
219
|
+
-moz-tab-size: 2 !important;
|
|
220
|
+
|
|
221
|
+
/* Sizing */
|
|
222
|
+
width: 100% !important;
|
|
223
|
+
height: 100% !important;
|
|
224
|
+
min-height: 0 !important;
|
|
225
|
+
max-height: none !important;
|
|
226
|
+
min-width: 0 !important;
|
|
227
|
+
max-width: none !important;
|
|
228
|
+
|
|
229
|
+
/* Scrolling — both layers must reserve scrollbar space identically
|
|
230
|
+
or the content widths diverge and long lines wrap at different
|
|
231
|
+
columns. We force `overflow-y: scroll` on both so the gutter is
|
|
232
|
+
always present. The textarea shows its native scrollbar; the
|
|
233
|
+
preview's scrollbar is rendered but painted transparent (see
|
|
234
|
+
`.md-editor-preview` block) — the gutter stays, the visual goes. */
|
|
235
|
+
overflow-y: scroll !important;
|
|
236
|
+
overflow-x: hidden !important;
|
|
237
|
+
scrollbar-width: thin !important;
|
|
238
|
+
|
|
239
|
+
/* Background neutralised — wrapper owns the surface color */
|
|
240
|
+
background: transparent !important;
|
|
241
|
+
|
|
242
|
+
/* No animations that could shift glyph position */
|
|
243
|
+
animation: none !important;
|
|
244
|
+
transition: none !important;
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
.md-editor-input {
|
|
248
|
+
z-index: 2 !important;
|
|
249
|
+
resize: none !important;
|
|
250
|
+
appearance: none !important;
|
|
251
|
+
-webkit-appearance: none !important;
|
|
252
|
+
-moz-appearance: none !important;
|
|
253
|
+
/* Hide own glyphs, show only cursor.
|
|
254
|
+
`caret-color` must be an explicit colour, NOT `currentColor` — the
|
|
255
|
+
textarea's own `color` is `transparent`, so `currentColor` would
|
|
256
|
+
resolve to transparent and the cursor would vanish. We mirror the
|
|
257
|
+
preview's prose colour (zinc-900 light / zinc-100 dark). */
|
|
258
|
+
color: transparent !important;
|
|
259
|
+
-webkit-text-fill-color: transparent !important;
|
|
260
|
+
caret-color: #18181b !important; /* zinc-900 */
|
|
261
|
+
/* Prevent mobile double-tap zoom */
|
|
262
|
+
touch-action: manipulation !important;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
.dark .md-editor-input {
|
|
266
|
+
caret-color: #f4f4f5 !important; /* zinc-100 */
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
/* Selection background visible even with transparent glyphs */
|
|
270
|
+
.md-editor-input::selection {
|
|
271
|
+
background: rgb(59 130 246 / 0.35);
|
|
272
|
+
color: transparent;
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
.md-editor-preview {
|
|
276
|
+
z-index: 1 !important;
|
|
277
|
+
/* Click + selection happen on the textarea, not here */
|
|
278
|
+
pointer-events: none !important;
|
|
279
|
+
user-select: none !important;
|
|
280
|
+
-webkit-user-select: none !important;
|
|
281
|
+
@apply text-zinc-900 dark:text-zinc-100;
|
|
282
|
+
/* Paint the preview's scrollbar transparent so only the textarea's
|
|
283
|
+
scrollbar (sitting on top, z-index: 2) is visible. We CAN'T set
|
|
284
|
+
`scrollbar-width: none` here — that would also remove the gutter
|
|
285
|
+
and the preview's content width would no longer match the
|
|
286
|
+
textarea's, breaking wrap alignment. The transparent-colour trick
|
|
287
|
+
preserves the gutter while hiding the visual. */
|
|
288
|
+
scrollbar-color: transparent transparent !important;
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
.md-editor-preview::-webkit-scrollbar-thumb,
|
|
292
|
+
.md-editor-preview::-webkit-scrollbar-track,
|
|
293
|
+
.md-editor-preview::-webkit-scrollbar-corner {
|
|
294
|
+
background: transparent !important;
|
|
295
|
+
border: 0 !important;
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
/* Critical alignment safeguard (overtype lesson, styles.js:256-264):
|
|
299
|
+
force EVERY descendant inside the preview to inherit font-family,
|
|
300
|
+
font-size, and line-height from the preview itself. Without this,
|
|
301
|
+
external CSS (Tailwind base, @tailwindcss/typography, etc.) can
|
|
302
|
+
set element-specific font-size on, say, `<span>` or implicit
|
|
303
|
+
`<h2>` elements. Any such per-element metric difference inflates
|
|
304
|
+
the line-box height and drifts the overlay relative to the
|
|
305
|
+
textarea — visible as a "cursor far to the right of the visible
|
|
306
|
+
text" symptom. Also reset margin/padding/border so no inner
|
|
307
|
+
element can add box-model space the textarea doesn't have. */
|
|
308
|
+
.md-editor-preview *,
|
|
309
|
+
.md-editor-preview *::before,
|
|
310
|
+
.md-editor-preview *::after {
|
|
311
|
+
font-family: inherit !important;
|
|
312
|
+
font-size: inherit !important;
|
|
313
|
+
line-height: inherit !important;
|
|
314
|
+
font-stretch: inherit !important;
|
|
315
|
+
letter-spacing: inherit !important;
|
|
316
|
+
word-spacing: inherit !important;
|
|
317
|
+
margin: 0 !important;
|
|
318
|
+
padding: 0 !important;
|
|
319
|
+
border: 0 !important;
|
|
320
|
+
text-indent: 0 !important;
|
|
321
|
+
vertical-align: baseline !important;
|
|
322
|
+
display: inline !important;
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
/* Placeholder shim — shown when the textarea is empty. MUST use the
|
|
326
|
+
exact same typography stack as `.md-editor-layer` so the cursor
|
|
327
|
+
position doesn't visibly jump when the first character is typed
|
|
328
|
+
and the placeholder fades out. */
|
|
329
|
+
.md-editor-placeholder {
|
|
330
|
+
position: absolute !important;
|
|
331
|
+
inset: 0 !important;
|
|
332
|
+
padding: 0.625rem 0.75rem !important;
|
|
333
|
+
font-family: "IBM Plex Mono", monospace !important;
|
|
334
|
+
font-size: 0.875rem !important;
|
|
335
|
+
line-height: 1.55 !important;
|
|
336
|
+
font-weight: 400 !important;
|
|
337
|
+
letter-spacing: 0 !important;
|
|
338
|
+
word-spacing: 0 !important;
|
|
339
|
+
pointer-events: none !important;
|
|
340
|
+
user-select: none !important;
|
|
341
|
+
z-index: 0 !important;
|
|
342
|
+
@apply text-zinc-400 dark:text-zinc-500;
|
|
343
|
+
white-space: pre-wrap !important;
|
|
344
|
+
word-wrap: break-word !important;
|
|
345
|
+
word-break: normal !important;
|
|
346
|
+
overflow-wrap: break-word !important;
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
/* Syntax highlighting classes — applied INSIDE the preview div by the
|
|
350
|
+
highlighter. Each rule must preserve glyph width (monospace font does
|
|
351
|
+
the heavy lifting; we only change weight, color, background). */
|
|
352
|
+
|
|
353
|
+
/* The visible markdown syntax characters (**, #, -, >, etc.) — kept
|
|
354
|
+
on-screen but dimmed so prose stands out. */
|
|
355
|
+
.md-syntax,
|
|
356
|
+
.md-marker {
|
|
357
|
+
@apply text-zinc-400 dark:text-zinc-500;
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
/* Bold + headers via `text-shadow` instead of `font-weight`.
|
|
361
|
+
|
|
362
|
+
Why: any font-weight change risks glyph-advance-width drift between
|
|
363
|
+
the textarea (locked at weight 400) and the preview. Even nominal
|
|
364
|
+
monospace fonts can have subtle weight-dependent width changes,
|
|
365
|
+
especially in browser rasterisers. `text-shadow: 0.5px 0 0
|
|
366
|
+
currentColor` paints a copy of each glyph 0.5px to the right —
|
|
367
|
+
visually equivalent to a heavier stroke, but the underlying glyph
|
|
368
|
+
advance is UNCHANGED. The cursor in the textarea (running at
|
|
369
|
+
weight 400) lines up perfectly with the visibly "bold" glyphs in
|
|
370
|
+
the preview because they ARE rendered at weight 400 underneath.
|
|
371
|
+
|
|
372
|
+
Italics: same logic — `font-style: italic` swaps in a different
|
|
373
|
+
font face whose glyph metrics may not perfectly match upright. We
|
|
374
|
+
simulate italic via colour + a transparent overlay we can't get
|
|
375
|
+
in CSS, so for italic we accept a colour-only differentiation. */
|
|
376
|
+
.md-h1,
|
|
377
|
+
.md-h2,
|
|
378
|
+
.md-h3,
|
|
379
|
+
.md-bold {
|
|
380
|
+
text-shadow: 0.5px 0 0 currentColor;
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
/* Slight tonal ladder so the heading levels are still distinguishable
|
|
384
|
+
at a glance, even though they share the same weight + size. */
|
|
385
|
+
.md-h1 {
|
|
386
|
+
@apply text-zinc-950 dark:text-white;
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
.md-h2 {
|
|
390
|
+
@apply text-zinc-900 dark:text-zinc-50;
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
.md-h3 {
|
|
394
|
+
@apply text-zinc-800 dark:text-zinc-200;
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
/* Italic: real `font-style: italic`. IBM Plex Mono Italic 400 is
|
|
398
|
+
loaded as a separate face (see global.css) and is designed as
|
|
399
|
+
monospace — its glyph advance widths match the regular face. The
|
|
400
|
+
`!important` defeats the layer-level `font-style: normal !important`
|
|
401
|
+
so the .md-italic span actually picks up italic. */
|
|
402
|
+
.md-italic {
|
|
403
|
+
font-style: italic !important;
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
/* Inline code — background only, no width change.
|
|
407
|
+
Negative padding would break alignment; we just paint behind the
|
|
408
|
+
glyphs and accept that the highlight doesn't have inset. */
|
|
409
|
+
.md-code {
|
|
410
|
+
@apply bg-zinc-200/60 dark:bg-zinc-700/50 rounded-sm;
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
/* Links — color + underline, both width-safe */
|
|
414
|
+
.md-link {
|
|
415
|
+
@apply text-blue-600 dark:text-blue-400 underline;
|
|
416
|
+
text-underline-offset: 2px;
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
/* Rendered links use one anchor for their complete visible hit area. */
|
|
420
|
+
.md-link-widget {
|
|
421
|
+
display: inline-flex;
|
|
422
|
+
align-items: baseline;
|
|
423
|
+
gap: 0.125rem;
|
|
424
|
+
color: inherit;
|
|
425
|
+
font-weight: 600;
|
|
426
|
+
text-decoration: none;
|
|
427
|
+
transition: color 150ms ease;
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
.md-link-widget:hover {
|
|
431
|
+
color: var(--ui-app-accent-text);
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
.md-link-widget:focus-visible {
|
|
435
|
+
border-radius: 0.125rem;
|
|
436
|
+
outline: 2px solid var(--ui-app-accent-border);
|
|
437
|
+
outline-offset: 2px;
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
.md-link-icon {
|
|
441
|
+
opacity: 0.7;
|
|
442
|
+
transition: opacity 150ms ease;
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
.md-link-widget:hover .md-link-icon,
|
|
446
|
+
.md-link-widget:focus-visible .md-link-icon {
|
|
447
|
+
opacity: 1;
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
/* Blockquote — color + inset box-shadow for the left bar (box-shadow
|
|
451
|
+
doesn't affect layout, unlike border-left or padding-left). The bar
|
|
452
|
+
sits visually outside the text column edge so prose stays aligned. */
|
|
453
|
+
.md-quote {
|
|
454
|
+
@apply text-zinc-600 dark:text-zinc-400;
|
|
455
|
+
box-shadow: inset 3px 0 0 var(--color-zinc-300);
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
.dark .md-quote {
|
|
459
|
+
box-shadow: inset 3px 0 0 var(--color-zinc-600);
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
/* Fenced code lines — background only */
|
|
463
|
+
.md-code-block {
|
|
464
|
+
@apply bg-zinc-200/40 dark:bg-zinc-800;
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
.md-code-block pre,
|
|
468
|
+
.md-mermaid-block,
|
|
469
|
+
.md-katex-block {
|
|
470
|
+
border: 1px solid rgb(228 228 231 / 0.72) !important;
|
|
471
|
+
border-radius: 0.42rem !important;
|
|
472
|
+
background: color-mix(in oklab, white 92%, rgb(244 244 245)) !important;
|
|
473
|
+
box-shadow:
|
|
474
|
+
inset 0 1px 0 rgb(255 255 255 / 0.46),
|
|
475
|
+
inset 0 -1px 0 rgb(0 0 0 / 0.025);
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
.md-katex-block {
|
|
479
|
+
padding: 0.75rem;
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
.dark .md-code-block pre,
|
|
483
|
+
.dark .md-mermaid-block,
|
|
484
|
+
.dark .md-katex-block {
|
|
485
|
+
border-color: rgb(63 63 70 / 0.72) !important;
|
|
486
|
+
background: color-mix(in oklab, rgb(24 24 27) 90%, rgb(39 39 42)) !important;
|
|
487
|
+
box-shadow:
|
|
488
|
+
inset 0 1px 0 rgb(255 255 255 / 0.045),
|
|
489
|
+
inset 0 -1px 0 rgb(0 0 0 / 0.28);
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
/* Horizontal rule (---) — just dim the marker; can't draw an actual
|
|
493
|
+
rule line without inserting layout-shifting elements. */
|
|
494
|
+
.md-hr {
|
|
495
|
+
@apply text-zinc-400 dark:text-zinc-500;
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
/* Completion match — every occurrence of a registered completion
|
|
499
|
+
label (abbreviation or trigger result) is tinted blue so the
|
|
500
|
+
reader can see what's a recognised mention vs. plain prose.
|
|
501
|
+
No underline: a dotted underline reads too much like a spellcheck
|
|
502
|
+
squiggle and trips people into thinking something's broken. */
|
|
503
|
+
.md-completion-match {
|
|
504
|
+
@apply text-blue-600 dark:text-blue-400;
|
|
505
|
+
}
|
|
506
|
+
|
|
507
|
+
/* Stats footer — lines / words / chars, anchored at the bottom-left
|
|
508
|
+
of the editor. No border, no background tint — it inherits the
|
|
509
|
+
editor body colour and sits as a quiet meta-row separated from the
|
|
510
|
+
content only by its dim mono text and a hair of padding.
|
|
511
|
+
When the editor is empty we keep the element rendered (so the
|
|
512
|
+
editor's outer height stays constant — no layout shift across all
|
|
513
|
+
sibling fields when the user starts / clears typing) but flip
|
|
514
|
+
`visibility: hidden` to remove the stats from sight. */
|
|
515
|
+
.md-editor-stats {
|
|
516
|
+
@apply flex justify-start items-center gap-3;
|
|
517
|
+
@apply px-3 py-1;
|
|
518
|
+
@apply text-[10px] text-zinc-400 dark:text-zinc-500;
|
|
519
|
+
@apply font-mono select-none;
|
|
520
|
+
letter-spacing: 0.02em;
|
|
521
|
+
}
|
|
522
|
+
|
|
523
|
+
.md-editor-stats[data-empty="true"] {
|
|
524
|
+
visibility: hidden;
|
|
525
|
+
}
|