@k2b/cloud 0.6.0-rc.0 → 0.7.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 +2 -2
- package/package.json +30 -17
- package/scripts/browser-performance.ts +14 -0
- package/scripts/build-pdf-renderer.ts +39 -0
- package/scripts/build.ts +15 -35
- package/scripts/preload.ts +9 -12
- package/scripts/sync-recovery-smoke.ts +2 -1
- package/src/_internal/app-presentation.ts +14 -2
- package/src/_internal/capabilities.ts +108 -7
- package/src/_internal/capability-streams.ts +81 -0
- package/src/_internal/define-app.ts +62 -36
- package/src/_internal/heartbeat.ts +4 -0
- package/src/_internal/help-catalog.ts +27 -172
- package/src/_internal/help.ts +13 -76
- package/src/_internal/page-responses.ts +2 -0
- package/src/_internal/postgres-application-name.ts +30 -0
- package/src/_internal/process-identity.ts +15 -0
- package/src/_internal/process-sync.ts +1 -1
- package/src/_internal/registry-validation.ts +29 -25
- package/src/_internal/registry.ts +2 -53
- package/src/_internal/runtime-context.ts +5 -16
- package/src/_internal/server-timing.ts +13 -0
- package/src/_internal/status-preserving-ssr.ts +18 -6
- package/src/_internal/web-vitals-asset.ts +10 -0
- package/src/access/PermissionEditor.tsx +14 -153
- package/src/access/PrincipalPicker.tsx +104 -0
- package/src/access/ui.ts +2 -0
- package/src/ai/admin.ts +14 -13
- package/src/ai/assistant-models.ts +12 -1
- package/src/ai/audio-format.ts +34 -0
- package/src/ai/audio-tool.ts +90 -0
- package/src/ai/browser-code-contracts.ts +79 -0
- package/src/ai/browser.ts +2 -0
- package/src/ai/capabilities.ts +55 -36
- package/src/ai/capability-execution.ts +47 -12
- package/src/ai/chat/blocks.tsx +157 -95
- package/src/ai/chat/capability-result.ts +15 -0
- package/src/ai/chat/capability-table.tsx +2 -10
- package/src/ai/chat/composer-adapter.ts +48 -3
- package/src/ai/chat/message-actions.tsx +8 -7
- package/src/ai/chat/message-utils.ts +12 -1
- package/src/ai/chat/messages.ts +2 -0
- package/src/ai/chat/presentation.tsx +19 -48
- package/src/ai/chat/primitives.tsx +43 -1
- package/src/ai/chat/tool-disclosure.tsx +17 -2
- package/src/ai/chat/tool-groups.ts +52 -0
- package/src/ai/chat-quotas.ts +25 -0
- package/src/ai/chat-task-contracts.ts +9 -1
- package/src/ai/chat-tasks.ts +276 -43
- package/src/ai/client/controller.ts +110 -33
- package/src/ai/client/file-source.ts +12 -6
- package/src/ai/client/live-connection.ts +1 -0
- package/src/ai/client/projection.ts +22 -11
- package/src/ai/client/transport.ts +4 -0
- package/src/ai/code-capability-routes.ts +110 -0
- package/src/ai/code-capability-transport.ts +38 -0
- package/src/ai/code-mode-skill.ts +114 -0
- package/src/ai/code-runtime-tools.ts +166 -0
- package/src/ai/code-source-contracts.ts +202 -0
- package/src/ai/code-source-tools.ts +145 -0
- package/src/ai/compaction.ts +27 -6
- package/src/ai/data-analysis-skill.ts +10 -0
- package/src/ai/default-tools.ts +25 -2
- package/src/ai/dictation-runtime.ts +171 -0
- package/src/ai/dictations.ts +188 -0
- package/src/ai/draft-content.ts +34 -0
- package/src/ai/enrich.ts +6 -0
- package/src/ai/executor.ts +191 -31
- package/src/ai/file-content-version.ts +22 -0
- package/src/ai/file-context.ts +2 -1
- package/src/ai/file-media-type.ts +12 -0
- package/src/ai/file-reference-contracts.ts +15 -0
- package/src/ai/file-tools.ts +2 -1
- package/src/ai/files-store.ts +174 -71
- package/src/ai/fixtures/vision-encrypted.pdf +0 -0
- package/src/ai/grids-skill.ts +40 -10
- package/src/ai/http.ts +15 -8
- package/src/ai/index.ts +26 -2
- package/src/ai/inference-calls.ts +198 -0
- package/src/ai/live-events.ts +5 -1
- package/src/ai/memory-learning.ts +60 -28
- package/src/ai/message-queue.ts +167 -0
- package/src/ai/migrate.ts +187 -11
- package/src/ai/model-pricing.ts +43 -0
- package/src/ai/pdf-render-worker.ts +74 -0
- package/src/ai/pdf-render.fixture.ts +28 -0
- package/src/ai/pdf-render.ts +77 -0
- package/src/ai/projects-routes.ts +3 -3
- package/src/ai/projects.ts +20 -6
- package/src/ai/protocol.ts +3 -0
- package/src/ai/provider.ts +1 -8
- package/src/ai/quota-provider.ts +191 -0
- package/src/ai/quota-report.ts +152 -0
- package/src/ai/quotas-migrate.ts +45 -0
- package/src/ai/quotas.ts +168 -0
- package/src/ai/routes.ts +215 -11
- package/src/ai/run-timeout.ts +10 -0
- package/src/ai/runtime-tools.ts +3 -0
- package/src/ai/runtime.ts +55 -16
- package/src/ai/settings.ts +36 -8
- package/src/ai/short-id.ts +2 -2
- package/src/ai/skill-catalog.ts +0 -10
- package/src/ai/skill-search.ts +47 -0
- package/src/ai/skill-seeds.ts +105 -20
- package/src/ai/skill-tool.ts +16 -5
- package/src/ai/skills-routes.ts +32 -4
- package/src/ai/skills.ts +324 -155
- package/src/ai/store.ts +373 -191
- package/src/ai/stream.ts +5 -0
- package/src/ai/structured-runs.ts +4 -3
- package/src/ai/structured.ts +8 -1
- package/src/ai/system-prompt.ts +12 -2
- package/src/ai/timeline.ts +2 -5
- package/src/ai/todo-contracts.ts +20 -0
- package/src/ai/todo-tool.ts +16 -0
- package/src/ai/tool-audit.ts +30 -40
- package/src/ai/tools.ts +6 -0
- package/src/ai/transcription.ts +202 -0
- package/src/ai/turn-timing.ts +114 -0
- package/src/ai/types.ts +58 -10
- package/src/ai/ui.tsx +2 -0
- package/src/ai/usage.ts +118 -118
- package/src/ai/vision-tool.ts +39 -10
- package/src/api/admin-ai-projects.ts +2 -2
- package/src/api/admin-ai-quotas.ts +74 -0
- package/src/api/admin-ai-skills.ts +48 -5
- package/src/api/admin-ai-usage.ts +2 -2
- package/src/api/admin-core-settings.ts +25 -0
- package/src/api/admin-identity.ts +91 -51
- package/src/api/admin-rail.ts +58 -0
- package/src/api/announcements.ts +14 -0
- package/src/api/capabilities.ts +292 -43
- package/src/api/capability-streams.ts +262 -0
- package/src/api/help.ts +8 -44
- package/src/api/index.ts +6 -0
- package/src/api/mcp.ts +44 -26
- package/src/api/me-web-vitals.ts +35 -0
- package/src/api/me.ts +2 -0
- package/src/api/search/schemas.ts +26 -15
- package/src/api/search.bench.ts +1 -1
- package/src/api/search.ts +54 -17
- package/src/browser/CloudResourceSearch.tsx +640 -702
- package/src/browser/app-approval-vault.ts +19 -7
- package/src/browser/command-bridge.ts +109 -0
- package/src/browser/command-shortcuts.ts +76 -0
- package/src/browser/commands.ts +66 -0
- package/src/browser/navigation-search.ts +48 -0
- package/src/browser/notifications.ts +1 -1
- package/src/browser/resource-picker.tsx +5 -18
- package/src/browser/resource-search-dialog.ts +9 -0
- package/src/browser/resource-search-input.ts +46 -0
- package/src/browser/resource-search-messages.ts +76 -40
- package/src/browser/resource-search.ts +7 -0
- package/src/browser/search-bridge.ts +102 -0
- package/src/browser/search-commands.ts +59 -0
- package/src/browser/search.ts +13 -0
- package/src/browser/spotlight-position.ts +208 -0
- package/src/browser/testing.ts +5 -0
- package/src/browser/web-vitals.ts +25 -0
- package/src/capabilities/claims.ts +179 -0
- package/src/capabilities/client.ts +34 -0
- package/src/capabilities/command-link.ts +16 -0
- package/src/capabilities/executions.ts +298 -0
- package/src/capabilities/migrate.ts +81 -0
- package/src/capabilities/server.ts +114 -34
- package/src/capabilities/stream-body.ts +16 -0
- package/src/capabilities/streams.ts +28 -0
- package/src/cli/admin/ai-quotas.ts +161 -0
- package/src/cli/admin/ai-skills.ts +64 -0
- package/src/cli/admin/ai-usage.ts +53 -30
- package/src/cli/admin/app-credentials.ts +79 -0
- package/src/cli/admin/data.ts +17 -0
- package/src/cli/admin/index.ts +9 -0
- package/src/cli/capabilities.ts +29 -0
- package/src/cli/capability-streams.ts +25 -0
- package/src/cli/index.ts +3 -2
- package/src/config/env.ts +11 -8
- package/src/contracts/app.ts +23 -3
- package/src/contracts/capabilities.ts +68 -5
- package/src/contracts/capability-streams.ts +46 -0
- package/src/contracts/commands.ts +49 -0
- package/src/contracts/index.ts +6 -1
- package/src/contracts/rail-admin.ts +38 -0
- package/src/contracts/rail-preferences.ts +16 -0
- package/src/contracts/registry.ts +3 -27
- package/src/contracts/settings-types.ts +1 -1
- package/src/contracts/shared.ts +9 -5
- package/src/contracts/web-vitals.ts +27 -0
- package/src/desktop/solid.tsx +3 -3
- package/src/index.ts +0 -4
- package/src/server/index.ts +3 -0
- package/src/server/middleware/auth.ts +3 -2
- package/src/server/middleware/route-template.ts +9 -3
- package/src/server/middleware/runtime.ts +2 -1
- package/src/server/middleware/settings.ts +17 -11
- package/src/server/services/access-revision.ts +10 -0
- package/src/server/services/access.ts +1 -1
- package/src/server/services/index.ts +1 -0
- package/src/services/account-category-policy.ts +9 -0
- package/src/services/account-lifecycle/audit.ts +1 -1
- package/src/services/accounts/app.ts +12 -2
- package/src/services/accounts/email-write.ts +23 -0
- package/src/services/accounts/groups.ts +15 -4
- package/src/services/accounts/identities.ts +249 -0
- package/src/services/accounts/identity-reconciliation.ts +87 -0
- package/src/services/accounts/ipa-data.ts +2 -2
- package/src/services/accounts/local-groups.ts +2 -2
- package/src/services/accounts/posix.ts +45 -29
- package/src/services/accounts/users.ts +2 -2
- package/src/services/announcements/index.ts +69 -8
- package/src/services/audit/index.ts +1 -1
- package/src/services/cache-fill.ts +35 -0
- package/src/services/help/index.ts +109 -0
- package/src/services/help/maintenance.ts +25 -0
- package/src/services/help/store.ts +180 -0
- package/src/services/help/types.ts +46 -0
- package/src/services/identity/invocation-actor.ts +2 -2
- package/src/services/identity/key-config.ts +2 -1
- package/src/services/identity/key-ring.ts +1 -1
- package/src/services/index.ts +15 -0
- package/src/services/ipa/users.ts +268 -221
- package/src/services/legal-consent.ts +1 -1
- package/src/services/logging/index.ts +15 -13
- package/src/services/logging/trace.ts +2 -1
- package/src/services/logging/web-vitals.ts +81 -0
- package/src/services/mandates/index.ts +18 -4
- package/src/services/mandates/policy.ts +65 -2
- package/src/services/notifications/batches.ts +124 -57
- package/src/services/notifications/browser.ts +12 -0
- package/src/services/notifications/index.ts +0 -2
- package/src/services/notifications/platform.ts +0 -4
- package/src/services/oauth-tokens.ts +3 -3
- package/src/services/pdf/gotenberg.ts +107 -84
- package/src/services/pdf/index.ts +3 -0
- package/src/services/providers/local/users.ts +25 -16
- package/src/services/public-http.ts +101 -0
- package/src/services/rail-shortcuts.ts +95 -0
- package/src/services/rail-snapshot.ts +53 -0
- package/src/services/request-cache-redis.ts +28 -0
- package/src/services/session/index.ts +15 -2
- package/src/services/session/user.ts +62 -37
- package/src/services/settings/core-settings.ts +21 -28
- package/src/services/settings/defaults.ts +5 -0
- package/src/services/settings/store.ts +58 -84
- package/src/shared/ai-costs.ts +42 -0
- package/src/shared/ai-platform-prompt.ts +1 -1
- package/src/shared/ai-quotas.ts +136 -0
- package/src/shared/ai-usage.ts +6 -16
- package/src/shared/app-presentation.ts +21 -15
- package/src/shared/capability-messages.ts +14 -0
- package/src/shared/help.ts +6 -42
- package/src/shared/index.ts +6 -0
- package/src/ssr/AdminLayout.tsx +7 -5
- package/src/ssr/AdminSidebar.tsx +29 -15
- package/src/ssr/AppLaunchpad.island.tsx +24 -137
- package/src/ssr/AppLaunchpadPanel.tsx +181 -0
- package/src/ssr/BrowserPushRegistration.island.tsx +12 -0
- package/src/ssr/GlobalSearchDialog.tsx +167 -20
- package/src/ssr/GlobalSearchTrigger.island.tsx +33 -22
- package/src/ssr/Layout.tsx +17 -6
- package/src/ssr/LayoutBreadcrumbs.island.tsx +3 -5
- package/src/ssr/LayoutFooter.tsx +1 -1
- package/src/ssr/LayoutHeader.tsx +46 -14
- package/src/ssr/LayoutHelp.tsx +23 -22
- package/src/ssr/{HotkeysHelpRail.island.tsx → LayoutHelpTrigger.island.tsx} +18 -12
- package/src/ssr/LayoutRail.tsx +17 -9
- package/src/ssr/MobileNavigation.tsx +71 -0
- package/src/ssr/MobileProfileActions.tsx +49 -0
- package/src/ssr/ProfilePreferences.island.tsx +3 -36
- package/src/ssr/RailApps.island.tsx +2 -2
- package/src/ssr/RailEditor.tsx +17 -2
- package/src/ssr/WorkspaceNavigation.island.tsx +7 -0
- package/src/ssr/WorkspaceNavigationProvider.tsx +16 -0
- package/src/ssr/admin-navigation.ts +7 -1
- package/src/ssr/help.ts +29 -0
- package/src/ssr/islands/SearchBar.tsx +67 -0
- package/src/ssr/islands/index.ts +3 -1
- package/src/ssr/layout-context.ts +2 -2
- package/src/ssr/layout-help-search.ts +15 -0
- package/src/ssr/mobile-menu-history.ts +70 -0
- package/src/ssr/platform-messages.ts +16 -8
- package/src/ssr/profile-actions.ts +42 -0
- package/src/ssr/rail-context.ts +8 -4
- package/src/ssr/rail-messages.ts +2 -0
- package/src/ssr/rail-navigation.ts +3 -3
- package/src/ssr/workspace-navigation.ts +75 -0
- package/src/styles/effects.css +6 -6
- package/src/styles/global.css +54 -0
- package/src/styles/input.css +43 -41
- package/src/styles/resource-search.css +505 -0
- package/src/styles/utilities-feedback.css +13 -0
- package/src/styles/utilities-layout.css +1 -5
- package/src/styles/utilities-navigation.css +3 -39
- package/src/types/ambient.d.ts +5 -0
- package/src/workflows/ai/runtime.ts +5 -1
- package/src/workflows/ai/store.ts +2 -0
- package/src/workflows/ai-actions.ts +16 -13
- package/src/workflows/definition.ts +10 -5
- package/src/workflows/store/actions.ts +44 -20
- package/src/workflows/store/index.ts +2 -0
- package/src/workflows/store/runs.ts +36 -0
- package/src/workflows/store/worker-pool.ts +55 -0
- package/src/workflows/store/worker-runtime.ts +90 -0
- package/scripts/app-favicon.test.ts +0 -49
- package/src/ai/chat/blocks.render.test.tsx +0 -1108
- package/src/ai/kit-skill.ts +0 -22
- package/src/ai/usage-migrate.ts +0 -81
- package/src/browser/CloudResourceSearch.behavior.test.tsx +0 -74
- package/src/browser/notification-target.ts +0 -27
- package/src/contracts/notification-live.ts +0 -66
- package/src/services/notifications/live.ts +0 -50
- package/src/ssr/BrowserNotifications.island.tsx +0 -135
- package/src/ssr/GlobalSearchDialog.behavior.test.tsx +0 -96
- package/src/ssr/Layout.render.test.tsx +0 -148
- package/src/ssr/islands/SearchBar.island.tsx +0 -80
|
@@ -1,148 +0,0 @@
|
|
|
1
|
-
import { describe, expect, test } from "bun:test";
|
|
2
|
-
import { mkdtempSync, rmSync } from "node:fs";
|
|
3
|
-
import { tmpdir } from "node:os";
|
|
4
|
-
import { resolve } from "node:path";
|
|
5
|
-
import { createConfig } from "@k2b/ssr";
|
|
6
|
-
import { Hono } from "hono";
|
|
7
|
-
import { createComponent } from "solid-js";
|
|
8
|
-
|
|
9
|
-
const root = mkdtempSync(resolve(tmpdir(), "cloud-layout-render-tests-"));
|
|
10
|
-
const { plugin } = createConfig({ dev: true, rootDir: root });
|
|
11
|
-
Bun.plugin(plugin());
|
|
12
|
-
process.once("exit", () => rmSync(root, { recursive: true, force: true }));
|
|
13
|
-
|
|
14
|
-
const { defineApp } = await import("../_internal/define-app");
|
|
15
|
-
const { default: Layout } = await import("./Layout");
|
|
16
|
-
const { default: MinimalLayout } = await import("./MinimalLayout");
|
|
17
|
-
const { default: AdminLayout } = await import("./AdminLayout");
|
|
18
|
-
|
|
19
|
-
const app = defineApp({
|
|
20
|
-
id: "layout-render-probe",
|
|
21
|
-
name: "Layout render probe",
|
|
22
|
-
icon: "ti ti-layout",
|
|
23
|
-
description: "Anonymous and minimal layout render probe",
|
|
24
|
-
baseUrl: "http://layout-render-probe:3000",
|
|
25
|
-
routes: ["/layout", "/minimal"],
|
|
26
|
-
});
|
|
27
|
-
|
|
28
|
-
type LayoutContextArg = Parameters<typeof Layout>[0]["c"];
|
|
29
|
-
type MinimalLayoutContextArg = Parameters<typeof MinimalLayout>[0]["c"];
|
|
30
|
-
type PreferencePosition = Exclude<Parameters<typeof MinimalLayout>[0]["preferences"], false | undefined>;
|
|
31
|
-
const preferencePositions: PreferencePosition[] = ["top-left", "top-right", "bottom-left", "bottom-right"];
|
|
32
|
-
|
|
33
|
-
const server = new Hono()
|
|
34
|
-
.use("*", async (c, next) => {
|
|
35
|
-
c.set("runtime" as never, { apps: [] } as never);
|
|
36
|
-
await next();
|
|
37
|
-
})
|
|
38
|
-
.get(
|
|
39
|
-
"/admin",
|
|
40
|
-
...app.ssr(
|
|
41
|
-
(c) => () =>
|
|
42
|
-
createComponent(AdminLayout, {
|
|
43
|
-
c,
|
|
44
|
-
title: "Settings",
|
|
45
|
-
scroll: c.req.query("scroll") !== "false",
|
|
46
|
-
children: "Admin content",
|
|
47
|
-
}),
|
|
48
|
-
),
|
|
49
|
-
)
|
|
50
|
-
.get(
|
|
51
|
-
"/layout",
|
|
52
|
-
...app.ssr(
|
|
53
|
-
(c) => () =>
|
|
54
|
-
createComponent(Layout, {
|
|
55
|
-
c: c as unknown as LayoutContextArg,
|
|
56
|
-
fullPage: true,
|
|
57
|
-
title: "Public tools",
|
|
58
|
-
children: "Anonymous content",
|
|
59
|
-
}),
|
|
60
|
-
),
|
|
61
|
-
)
|
|
62
|
-
.get(
|
|
63
|
-
"/minimal/:position",
|
|
64
|
-
...app.ssr((c) => {
|
|
65
|
-
const requested = c.req.param("position");
|
|
66
|
-
const preferences = preferencePositions.find((position) => position === requested) ?? false;
|
|
67
|
-
return () =>
|
|
68
|
-
createComponent(MinimalLayout, {
|
|
69
|
-
c: c as unknown as MinimalLayoutContextArg,
|
|
70
|
-
preferences,
|
|
71
|
-
children: "Minimal content",
|
|
72
|
-
});
|
|
73
|
-
}),
|
|
74
|
-
);
|
|
75
|
-
|
|
76
|
-
describe("Cloud layouts SSR", () => {
|
|
77
|
-
test("admin shell is viewport-bound and delegates scrolling only when requested", async () => {
|
|
78
|
-
const ordinary = await (await server.request("/admin")).text();
|
|
79
|
-
const bounded = await (await server.request("/admin?scroll=false")).text();
|
|
80
|
-
for (const html of [ordinary, bounded]) {
|
|
81
|
-
expect(html).toContain("h-dvh overflow-hidden");
|
|
82
|
-
expect(html).toContain("Admin content");
|
|
83
|
-
expect(html).toContain('data-scroll-preserve="admin-sidebar"');
|
|
84
|
-
}
|
|
85
|
-
expect(ordinary).not.toMatch(/k2b-app-workspace__main[^>]+data-scroll="false"/);
|
|
86
|
-
expect(bounded).toMatch(/k2b-app-workspace__main[^>]+data-scroll="false"/);
|
|
87
|
-
expect(bounded).not.toContain("p-[var(--ui-space-shell)]");
|
|
88
|
-
});
|
|
89
|
-
test("keeps anonymous login and preferences visible without rendering the application rail", async () => {
|
|
90
|
-
const response = await server.request("/layout", {
|
|
91
|
-
headers: { Cookie: "theme=dark", "Accept-Language": "de-CH" },
|
|
92
|
-
});
|
|
93
|
-
const html = await response.text();
|
|
94
|
-
|
|
95
|
-
expect(response.status).toBe(200);
|
|
96
|
-
expect(html).toContain('<html lang="de-CH" class="dark"');
|
|
97
|
-
expect(html).toContain("layout-header");
|
|
98
|
-
expect(html).toContain('href="/auth/login"');
|
|
99
|
-
expect(html).toContain("Anmelden");
|
|
100
|
-
expect(html).toContain("Darstellung und Sprache");
|
|
101
|
-
expect(html).toContain("Heller Modus");
|
|
102
|
-
expect(html).toContain("English");
|
|
103
|
-
expect(html).not.toContain("layout-rail-navigation");
|
|
104
|
-
expect(html).not.toContain('data-layout-authenticated="true"');
|
|
105
|
-
expect(html).not.toContain('href="/me"');
|
|
106
|
-
});
|
|
107
|
-
|
|
108
|
-
test("positions minimal preferences in every supported corner without adding Cloud chrome", async () => {
|
|
109
|
-
const expectedMenuPositions = {
|
|
110
|
-
"top-left": "bottom-right",
|
|
111
|
-
"top-right": "bottom-left",
|
|
112
|
-
"bottom-left": "top-right",
|
|
113
|
-
"bottom-right": "top-left",
|
|
114
|
-
} as const;
|
|
115
|
-
|
|
116
|
-
for (const position of preferencePositions) {
|
|
117
|
-
const response = await server.request(`/minimal/${position}`, { headers: { "Accept-Language": "en" } });
|
|
118
|
-
const html = await response.text();
|
|
119
|
-
expect(response.status).toBe(200);
|
|
120
|
-
expect(html).toContain(`minimal-layout-preferences--${position}`);
|
|
121
|
-
expect(html).toContain(`data-position="${expectedMenuPositions[position]}"`);
|
|
122
|
-
expect(html).toContain("Appearance and language");
|
|
123
|
-
expect(html).toContain("Minimal content");
|
|
124
|
-
expect(html).not.toContain("cloud-app-canvas");
|
|
125
|
-
expect(html).not.toContain("layout-header");
|
|
126
|
-
expect(html).not.toContain("layout-rail");
|
|
127
|
-
}
|
|
128
|
-
});
|
|
129
|
-
|
|
130
|
-
test("can disable the minimal preference control completely", async () => {
|
|
131
|
-
const response = await server.request("/minimal/off");
|
|
132
|
-
const html = await response.text();
|
|
133
|
-
|
|
134
|
-
expect(response.status).toBe(200);
|
|
135
|
-
expect(html).toContain("Minimal content");
|
|
136
|
-
expect(html).not.toContain("minimal-layout-preferences");
|
|
137
|
-
expect(html).not.toContain("Appearance and language");
|
|
138
|
-
});
|
|
139
|
-
|
|
140
|
-
test("keeps every corner safe-area aware", async () => {
|
|
141
|
-
const css = await Bun.file(new URL("../styles/utilities-navigation.css", import.meta.url)).text();
|
|
142
|
-
for (const position of preferencePositions) expect(css).toContain(`.minimal-layout-preferences--${position}`);
|
|
143
|
-
expect(css).toContain("env(safe-area-inset-top)");
|
|
144
|
-
expect(css).toContain("env(safe-area-inset-right)");
|
|
145
|
-
expect(css).toContain("env(safe-area-inset-bottom)");
|
|
146
|
-
expect(css).toContain("env(safe-area-inset-left)");
|
|
147
|
-
});
|
|
148
|
-
});
|
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
import { TextInput, useLocale } from "@k2b/ui";
|
|
2
|
-
import { createEffect, createSignal, onMount } from "solid-js";
|
|
3
|
-
import { platformMessages } from "../platform-messages";
|
|
4
|
-
|
|
5
|
-
type SearchBarProps = {
|
|
6
|
-
action?: string;
|
|
7
|
-
value?: string;
|
|
8
|
-
param?: string;
|
|
9
|
-
pageParam?: string;
|
|
10
|
-
placeholder?: string;
|
|
11
|
-
ariaLabel?: string;
|
|
12
|
-
};
|
|
13
|
-
|
|
14
|
-
/** Search bar that filters content via URL query parameter. */
|
|
15
|
-
export default function SearchBar(props: SearchBarProps = {}) {
|
|
16
|
-
const locale = useLocale();
|
|
17
|
-
const t = () => platformMessages.resolve([locale()]).t;
|
|
18
|
-
const param = props.param ?? "search";
|
|
19
|
-
const pageParam = props.pageParam ?? "page";
|
|
20
|
-
const [query, setQuery] = createSignal(props.value ?? "");
|
|
21
|
-
|
|
22
|
-
createEffect(() => {
|
|
23
|
-
if (props.value !== undefined) {
|
|
24
|
-
setQuery(props.value);
|
|
25
|
-
}
|
|
26
|
-
});
|
|
27
|
-
|
|
28
|
-
onMount(() => {
|
|
29
|
-
if (props.value !== undefined) return;
|
|
30
|
-
const fallback = new URLSearchParams(window.location.search).get(param) ?? "";
|
|
31
|
-
setQuery(fallback);
|
|
32
|
-
});
|
|
33
|
-
|
|
34
|
-
const handleSubmit = (e: Event): void => {
|
|
35
|
-
e.preventDefault();
|
|
36
|
-
const current = new URL(window.location.href);
|
|
37
|
-
const url = props.action ? new URL(props.action, window.location.origin) : current;
|
|
38
|
-
const value = query().trim();
|
|
39
|
-
|
|
40
|
-
if (value.length > 0) {
|
|
41
|
-
url.searchParams.set(param, value);
|
|
42
|
-
} else {
|
|
43
|
-
url.searchParams.delete(param);
|
|
44
|
-
}
|
|
45
|
-
url.searchParams.delete(pageParam);
|
|
46
|
-
|
|
47
|
-
window.location.href = url.toString();
|
|
48
|
-
};
|
|
49
|
-
|
|
50
|
-
const handleClear = (): void => {
|
|
51
|
-
const current = new URL(window.location.href);
|
|
52
|
-
const url = props.action ? new URL(props.action, window.location.origin) : current;
|
|
53
|
-
|
|
54
|
-
url.searchParams.delete(param);
|
|
55
|
-
url.searchParams.delete(pageParam);
|
|
56
|
-
|
|
57
|
-
window.location.href = url.toString();
|
|
58
|
-
};
|
|
59
|
-
|
|
60
|
-
return (
|
|
61
|
-
<form onSubmit={handleSubmit} role="search" class="w-full">
|
|
62
|
-
<TextInput
|
|
63
|
-
name={param}
|
|
64
|
-
type="search"
|
|
65
|
-
placeholder={props.placeholder ?? `${t().search}…`}
|
|
66
|
-
aria-label={props.ariaLabel ?? t().search}
|
|
67
|
-
icon="ti ti-search"
|
|
68
|
-
activeIcon="ti ti-search"
|
|
69
|
-
value={query}
|
|
70
|
-
onValueChange={setQuery}
|
|
71
|
-
clearable
|
|
72
|
-
clearLabel={t().clearSearch}
|
|
73
|
-
onClear={handleClear}
|
|
74
|
-
/>
|
|
75
|
-
<button type="submit" class="hidden">
|
|
76
|
-
{t().search}
|
|
77
|
-
</button>
|
|
78
|
-
</form>
|
|
79
|
-
);
|
|
80
|
-
}
|