@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.
Files changed (315) hide show
  1. package/README.md +2 -2
  2. package/package.json +30 -17
  3. package/scripts/browser-performance.ts +14 -0
  4. package/scripts/build-pdf-renderer.ts +39 -0
  5. package/scripts/build.ts +15 -35
  6. package/scripts/preload.ts +9 -12
  7. package/scripts/sync-recovery-smoke.ts +2 -1
  8. package/src/_internal/app-presentation.ts +14 -2
  9. package/src/_internal/capabilities.ts +108 -7
  10. package/src/_internal/capability-streams.ts +81 -0
  11. package/src/_internal/define-app.ts +62 -36
  12. package/src/_internal/heartbeat.ts +4 -0
  13. package/src/_internal/help-catalog.ts +27 -172
  14. package/src/_internal/help.ts +13 -76
  15. package/src/_internal/page-responses.ts +2 -0
  16. package/src/_internal/postgres-application-name.ts +30 -0
  17. package/src/_internal/process-identity.ts +15 -0
  18. package/src/_internal/process-sync.ts +1 -1
  19. package/src/_internal/registry-validation.ts +29 -25
  20. package/src/_internal/registry.ts +2 -53
  21. package/src/_internal/runtime-context.ts +5 -16
  22. package/src/_internal/server-timing.ts +13 -0
  23. package/src/_internal/status-preserving-ssr.ts +18 -6
  24. package/src/_internal/web-vitals-asset.ts +10 -0
  25. package/src/access/PermissionEditor.tsx +14 -153
  26. package/src/access/PrincipalPicker.tsx +104 -0
  27. package/src/access/ui.ts +2 -0
  28. package/src/ai/admin.ts +14 -13
  29. package/src/ai/assistant-models.ts +12 -1
  30. package/src/ai/audio-format.ts +34 -0
  31. package/src/ai/audio-tool.ts +90 -0
  32. package/src/ai/browser-code-contracts.ts +79 -0
  33. package/src/ai/browser.ts +2 -0
  34. package/src/ai/capabilities.ts +55 -36
  35. package/src/ai/capability-execution.ts +47 -12
  36. package/src/ai/chat/blocks.tsx +157 -95
  37. package/src/ai/chat/capability-result.ts +15 -0
  38. package/src/ai/chat/capability-table.tsx +2 -10
  39. package/src/ai/chat/composer-adapter.ts +48 -3
  40. package/src/ai/chat/message-actions.tsx +8 -7
  41. package/src/ai/chat/message-utils.ts +12 -1
  42. package/src/ai/chat/messages.ts +2 -0
  43. package/src/ai/chat/presentation.tsx +19 -48
  44. package/src/ai/chat/primitives.tsx +43 -1
  45. package/src/ai/chat/tool-disclosure.tsx +17 -2
  46. package/src/ai/chat/tool-groups.ts +52 -0
  47. package/src/ai/chat-quotas.ts +25 -0
  48. package/src/ai/chat-task-contracts.ts +9 -1
  49. package/src/ai/chat-tasks.ts +276 -43
  50. package/src/ai/client/controller.ts +110 -33
  51. package/src/ai/client/file-source.ts +12 -6
  52. package/src/ai/client/live-connection.ts +1 -0
  53. package/src/ai/client/projection.ts +22 -11
  54. package/src/ai/client/transport.ts +4 -0
  55. package/src/ai/code-capability-routes.ts +110 -0
  56. package/src/ai/code-capability-transport.ts +38 -0
  57. package/src/ai/code-mode-skill.ts +114 -0
  58. package/src/ai/code-runtime-tools.ts +166 -0
  59. package/src/ai/code-source-contracts.ts +202 -0
  60. package/src/ai/code-source-tools.ts +145 -0
  61. package/src/ai/compaction.ts +27 -6
  62. package/src/ai/data-analysis-skill.ts +10 -0
  63. package/src/ai/default-tools.ts +25 -2
  64. package/src/ai/dictation-runtime.ts +171 -0
  65. package/src/ai/dictations.ts +188 -0
  66. package/src/ai/draft-content.ts +34 -0
  67. package/src/ai/enrich.ts +6 -0
  68. package/src/ai/executor.ts +191 -31
  69. package/src/ai/file-content-version.ts +22 -0
  70. package/src/ai/file-context.ts +2 -1
  71. package/src/ai/file-media-type.ts +12 -0
  72. package/src/ai/file-reference-contracts.ts +15 -0
  73. package/src/ai/file-tools.ts +2 -1
  74. package/src/ai/files-store.ts +174 -71
  75. package/src/ai/fixtures/vision-encrypted.pdf +0 -0
  76. package/src/ai/grids-skill.ts +40 -10
  77. package/src/ai/http.ts +15 -8
  78. package/src/ai/index.ts +26 -2
  79. package/src/ai/inference-calls.ts +198 -0
  80. package/src/ai/live-events.ts +5 -1
  81. package/src/ai/memory-learning.ts +60 -28
  82. package/src/ai/message-queue.ts +167 -0
  83. package/src/ai/migrate.ts +187 -11
  84. package/src/ai/model-pricing.ts +43 -0
  85. package/src/ai/pdf-render-worker.ts +74 -0
  86. package/src/ai/pdf-render.fixture.ts +28 -0
  87. package/src/ai/pdf-render.ts +77 -0
  88. package/src/ai/projects-routes.ts +3 -3
  89. package/src/ai/projects.ts +20 -6
  90. package/src/ai/protocol.ts +3 -0
  91. package/src/ai/provider.ts +1 -8
  92. package/src/ai/quota-provider.ts +191 -0
  93. package/src/ai/quota-report.ts +152 -0
  94. package/src/ai/quotas-migrate.ts +45 -0
  95. package/src/ai/quotas.ts +168 -0
  96. package/src/ai/routes.ts +215 -11
  97. package/src/ai/run-timeout.ts +10 -0
  98. package/src/ai/runtime-tools.ts +3 -0
  99. package/src/ai/runtime.ts +55 -16
  100. package/src/ai/settings.ts +36 -8
  101. package/src/ai/short-id.ts +2 -2
  102. package/src/ai/skill-catalog.ts +0 -10
  103. package/src/ai/skill-search.ts +47 -0
  104. package/src/ai/skill-seeds.ts +105 -20
  105. package/src/ai/skill-tool.ts +16 -5
  106. package/src/ai/skills-routes.ts +32 -4
  107. package/src/ai/skills.ts +324 -155
  108. package/src/ai/store.ts +373 -191
  109. package/src/ai/stream.ts +5 -0
  110. package/src/ai/structured-runs.ts +4 -3
  111. package/src/ai/structured.ts +8 -1
  112. package/src/ai/system-prompt.ts +12 -2
  113. package/src/ai/timeline.ts +2 -5
  114. package/src/ai/todo-contracts.ts +20 -0
  115. package/src/ai/todo-tool.ts +16 -0
  116. package/src/ai/tool-audit.ts +30 -40
  117. package/src/ai/tools.ts +6 -0
  118. package/src/ai/transcription.ts +202 -0
  119. package/src/ai/turn-timing.ts +114 -0
  120. package/src/ai/types.ts +58 -10
  121. package/src/ai/ui.tsx +2 -0
  122. package/src/ai/usage.ts +118 -118
  123. package/src/ai/vision-tool.ts +39 -10
  124. package/src/api/admin-ai-projects.ts +2 -2
  125. package/src/api/admin-ai-quotas.ts +74 -0
  126. package/src/api/admin-ai-skills.ts +48 -5
  127. package/src/api/admin-ai-usage.ts +2 -2
  128. package/src/api/admin-core-settings.ts +25 -0
  129. package/src/api/admin-identity.ts +91 -51
  130. package/src/api/admin-rail.ts +58 -0
  131. package/src/api/announcements.ts +14 -0
  132. package/src/api/capabilities.ts +292 -43
  133. package/src/api/capability-streams.ts +262 -0
  134. package/src/api/help.ts +8 -44
  135. package/src/api/index.ts +6 -0
  136. package/src/api/mcp.ts +44 -26
  137. package/src/api/me-web-vitals.ts +35 -0
  138. package/src/api/me.ts +2 -0
  139. package/src/api/search/schemas.ts +26 -15
  140. package/src/api/search.bench.ts +1 -1
  141. package/src/api/search.ts +54 -17
  142. package/src/browser/CloudResourceSearch.tsx +640 -702
  143. package/src/browser/app-approval-vault.ts +19 -7
  144. package/src/browser/command-bridge.ts +109 -0
  145. package/src/browser/command-shortcuts.ts +76 -0
  146. package/src/browser/commands.ts +66 -0
  147. package/src/browser/navigation-search.ts +48 -0
  148. package/src/browser/notifications.ts +1 -1
  149. package/src/browser/resource-picker.tsx +5 -18
  150. package/src/browser/resource-search-dialog.ts +9 -0
  151. package/src/browser/resource-search-input.ts +46 -0
  152. package/src/browser/resource-search-messages.ts +76 -40
  153. package/src/browser/resource-search.ts +7 -0
  154. package/src/browser/search-bridge.ts +102 -0
  155. package/src/browser/search-commands.ts +59 -0
  156. package/src/browser/search.ts +13 -0
  157. package/src/browser/spotlight-position.ts +208 -0
  158. package/src/browser/testing.ts +5 -0
  159. package/src/browser/web-vitals.ts +25 -0
  160. package/src/capabilities/claims.ts +179 -0
  161. package/src/capabilities/client.ts +34 -0
  162. package/src/capabilities/command-link.ts +16 -0
  163. package/src/capabilities/executions.ts +298 -0
  164. package/src/capabilities/migrate.ts +81 -0
  165. package/src/capabilities/server.ts +114 -34
  166. package/src/capabilities/stream-body.ts +16 -0
  167. package/src/capabilities/streams.ts +28 -0
  168. package/src/cli/admin/ai-quotas.ts +161 -0
  169. package/src/cli/admin/ai-skills.ts +64 -0
  170. package/src/cli/admin/ai-usage.ts +53 -30
  171. package/src/cli/admin/app-credentials.ts +79 -0
  172. package/src/cli/admin/data.ts +17 -0
  173. package/src/cli/admin/index.ts +9 -0
  174. package/src/cli/capabilities.ts +29 -0
  175. package/src/cli/capability-streams.ts +25 -0
  176. package/src/cli/index.ts +3 -2
  177. package/src/config/env.ts +11 -8
  178. package/src/contracts/app.ts +23 -3
  179. package/src/contracts/capabilities.ts +68 -5
  180. package/src/contracts/capability-streams.ts +46 -0
  181. package/src/contracts/commands.ts +49 -0
  182. package/src/contracts/index.ts +6 -1
  183. package/src/contracts/rail-admin.ts +38 -0
  184. package/src/contracts/rail-preferences.ts +16 -0
  185. package/src/contracts/registry.ts +3 -27
  186. package/src/contracts/settings-types.ts +1 -1
  187. package/src/contracts/shared.ts +9 -5
  188. package/src/contracts/web-vitals.ts +27 -0
  189. package/src/desktop/solid.tsx +3 -3
  190. package/src/index.ts +0 -4
  191. package/src/server/index.ts +3 -0
  192. package/src/server/middleware/auth.ts +3 -2
  193. package/src/server/middleware/route-template.ts +9 -3
  194. package/src/server/middleware/runtime.ts +2 -1
  195. package/src/server/middleware/settings.ts +17 -11
  196. package/src/server/services/access-revision.ts +10 -0
  197. package/src/server/services/access.ts +1 -1
  198. package/src/server/services/index.ts +1 -0
  199. package/src/services/account-category-policy.ts +9 -0
  200. package/src/services/account-lifecycle/audit.ts +1 -1
  201. package/src/services/accounts/app.ts +12 -2
  202. package/src/services/accounts/email-write.ts +23 -0
  203. package/src/services/accounts/groups.ts +15 -4
  204. package/src/services/accounts/identities.ts +249 -0
  205. package/src/services/accounts/identity-reconciliation.ts +87 -0
  206. package/src/services/accounts/ipa-data.ts +2 -2
  207. package/src/services/accounts/local-groups.ts +2 -2
  208. package/src/services/accounts/posix.ts +45 -29
  209. package/src/services/accounts/users.ts +2 -2
  210. package/src/services/announcements/index.ts +69 -8
  211. package/src/services/audit/index.ts +1 -1
  212. package/src/services/cache-fill.ts +35 -0
  213. package/src/services/help/index.ts +109 -0
  214. package/src/services/help/maintenance.ts +25 -0
  215. package/src/services/help/store.ts +180 -0
  216. package/src/services/help/types.ts +46 -0
  217. package/src/services/identity/invocation-actor.ts +2 -2
  218. package/src/services/identity/key-config.ts +2 -1
  219. package/src/services/identity/key-ring.ts +1 -1
  220. package/src/services/index.ts +15 -0
  221. package/src/services/ipa/users.ts +268 -221
  222. package/src/services/legal-consent.ts +1 -1
  223. package/src/services/logging/index.ts +15 -13
  224. package/src/services/logging/trace.ts +2 -1
  225. package/src/services/logging/web-vitals.ts +81 -0
  226. package/src/services/mandates/index.ts +18 -4
  227. package/src/services/mandates/policy.ts +65 -2
  228. package/src/services/notifications/batches.ts +124 -57
  229. package/src/services/notifications/browser.ts +12 -0
  230. package/src/services/notifications/index.ts +0 -2
  231. package/src/services/notifications/platform.ts +0 -4
  232. package/src/services/oauth-tokens.ts +3 -3
  233. package/src/services/pdf/gotenberg.ts +107 -84
  234. package/src/services/pdf/index.ts +3 -0
  235. package/src/services/providers/local/users.ts +25 -16
  236. package/src/services/public-http.ts +101 -0
  237. package/src/services/rail-shortcuts.ts +95 -0
  238. package/src/services/rail-snapshot.ts +53 -0
  239. package/src/services/request-cache-redis.ts +28 -0
  240. package/src/services/session/index.ts +15 -2
  241. package/src/services/session/user.ts +62 -37
  242. package/src/services/settings/core-settings.ts +21 -28
  243. package/src/services/settings/defaults.ts +5 -0
  244. package/src/services/settings/store.ts +58 -84
  245. package/src/shared/ai-costs.ts +42 -0
  246. package/src/shared/ai-platform-prompt.ts +1 -1
  247. package/src/shared/ai-quotas.ts +136 -0
  248. package/src/shared/ai-usage.ts +6 -16
  249. package/src/shared/app-presentation.ts +21 -15
  250. package/src/shared/capability-messages.ts +14 -0
  251. package/src/shared/help.ts +6 -42
  252. package/src/shared/index.ts +6 -0
  253. package/src/ssr/AdminLayout.tsx +7 -5
  254. package/src/ssr/AdminSidebar.tsx +29 -15
  255. package/src/ssr/AppLaunchpad.island.tsx +24 -137
  256. package/src/ssr/AppLaunchpadPanel.tsx +181 -0
  257. package/src/ssr/BrowserPushRegistration.island.tsx +12 -0
  258. package/src/ssr/GlobalSearchDialog.tsx +167 -20
  259. package/src/ssr/GlobalSearchTrigger.island.tsx +33 -22
  260. package/src/ssr/Layout.tsx +17 -6
  261. package/src/ssr/LayoutBreadcrumbs.island.tsx +3 -5
  262. package/src/ssr/LayoutFooter.tsx +1 -1
  263. package/src/ssr/LayoutHeader.tsx +46 -14
  264. package/src/ssr/LayoutHelp.tsx +23 -22
  265. package/src/ssr/{HotkeysHelpRail.island.tsx → LayoutHelpTrigger.island.tsx} +18 -12
  266. package/src/ssr/LayoutRail.tsx +17 -9
  267. package/src/ssr/MobileNavigation.tsx +71 -0
  268. package/src/ssr/MobileProfileActions.tsx +49 -0
  269. package/src/ssr/ProfilePreferences.island.tsx +3 -36
  270. package/src/ssr/RailApps.island.tsx +2 -2
  271. package/src/ssr/RailEditor.tsx +17 -2
  272. package/src/ssr/WorkspaceNavigation.island.tsx +7 -0
  273. package/src/ssr/WorkspaceNavigationProvider.tsx +16 -0
  274. package/src/ssr/admin-navigation.ts +7 -1
  275. package/src/ssr/help.ts +29 -0
  276. package/src/ssr/islands/SearchBar.tsx +67 -0
  277. package/src/ssr/islands/index.ts +3 -1
  278. package/src/ssr/layout-context.ts +2 -2
  279. package/src/ssr/layout-help-search.ts +15 -0
  280. package/src/ssr/mobile-menu-history.ts +70 -0
  281. package/src/ssr/platform-messages.ts +16 -8
  282. package/src/ssr/profile-actions.ts +42 -0
  283. package/src/ssr/rail-context.ts +8 -4
  284. package/src/ssr/rail-messages.ts +2 -0
  285. package/src/ssr/rail-navigation.ts +3 -3
  286. package/src/ssr/workspace-navigation.ts +75 -0
  287. package/src/styles/effects.css +6 -6
  288. package/src/styles/global.css +54 -0
  289. package/src/styles/input.css +43 -41
  290. package/src/styles/resource-search.css +505 -0
  291. package/src/styles/utilities-feedback.css +13 -0
  292. package/src/styles/utilities-layout.css +1 -5
  293. package/src/styles/utilities-navigation.css +3 -39
  294. package/src/types/ambient.d.ts +5 -0
  295. package/src/workflows/ai/runtime.ts +5 -1
  296. package/src/workflows/ai/store.ts +2 -0
  297. package/src/workflows/ai-actions.ts +16 -13
  298. package/src/workflows/definition.ts +10 -5
  299. package/src/workflows/store/actions.ts +44 -20
  300. package/src/workflows/store/index.ts +2 -0
  301. package/src/workflows/store/runs.ts +36 -0
  302. package/src/workflows/store/worker-pool.ts +55 -0
  303. package/src/workflows/store/worker-runtime.ts +90 -0
  304. package/scripts/app-favicon.test.ts +0 -49
  305. package/src/ai/chat/blocks.render.test.tsx +0 -1108
  306. package/src/ai/kit-skill.ts +0 -22
  307. package/src/ai/usage-migrate.ts +0 -81
  308. package/src/browser/CloudResourceSearch.behavior.test.tsx +0 -74
  309. package/src/browser/notification-target.ts +0 -27
  310. package/src/contracts/notification-live.ts +0 -66
  311. package/src/services/notifications/live.ts +0 -50
  312. package/src/ssr/BrowserNotifications.island.tsx +0 -135
  313. package/src/ssr/GlobalSearchDialog.behavior.test.tsx +0 -96
  314. package/src/ssr/Layout.render.test.tsx +0 -148
  315. 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
- }