@k2b/cloud 0.33.0 → 0.35.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/package.json +3 -3
- package/src/_internal/app-presentation.ts +40 -11
- package/src/_internal/define-app.ts +1 -0
- package/src/_internal/registry.ts +10 -1
- package/src/_internal/widget-declarations.ts +16 -3
- package/src/_internal/widget-settings.ts +93 -0
- package/src/ai/capabilities.ts +130 -16
- package/src/ai/firecrawl-tools.ts +3 -30
- package/src/ai/resource-refs.ts +35 -3
- package/src/ai/system-prompt.ts +3 -2
- package/src/api/index.ts +2 -0
- package/src/api/mcp.ts +48 -17
- package/src/api/pwa.ts +7 -2
- package/src/api/resource-links.ts +43 -0
- package/src/api/widgets.ts +163 -82
- package/src/browser/CloudResourceSearch.tsx +6 -6
- package/src/browser/command-shortcuts.ts +2 -11
- package/src/browser/resource-picker.tsx +1 -0
- package/src/browser/resource-search.ts +7 -2
- package/src/browser/widgets.ts +23 -5
- package/src/capabilities/testing.ts +13 -1
- package/src/cli/capabilities.ts +61 -17
- package/src/cli/index.ts +2 -0
- package/src/cli/resource-links.ts +13 -0
- package/src/contracts/app.ts +7 -1
- package/src/contracts/capabilities.ts +25 -5
- package/src/contracts/registry.ts +3 -1
- package/src/contracts/resource-href.ts +7 -0
- package/src/contracts/widgets.ts +80 -6
- package/src/desktop/index.ts +3 -2
- package/src/desktop/solid.tsx +7 -5
- package/src/server/widget-request.ts +34 -5
- package/src/services/app-approval.ts +4 -2
- package/src/services/approvals/index.ts +40 -11
- package/src/services/approvals/list.ts +1 -0
- package/src/services/approvals/migrate.ts +10 -0
- package/src/services/network-security.ts +33 -9
- package/src/services/pdf/markdown.ts +11 -7
- package/src/services/pwa-devices.ts +68 -15
- package/src/shared/app-presentation.ts +49 -1
- package/src/shared/index.ts +1 -0
- package/src/shared/markdown/callout-sanitizer.ts +37 -0
- package/src/shared/markdown/index.ts +8 -2
- package/src/shared/network-address.ts +46 -45
- package/src/ssr/Layout.tsx +3 -15
- package/src/ssr/LayoutHelp.browser-harness.tsx +43 -0
- package/src/ssr/LayoutHelp.tsx +320 -183
- package/src/ssr/LayoutHelpTrigger.tsx +1 -3
- package/src/ssr/LayoutPreferences.tsx +15 -5
- package/src/ssr/MinimalLayoutPreferences.island.tsx +3 -9
- package/src/ssr/MobileProfileActions.tsx +3 -8
- package/src/ssr/ProfilePreferences.tsx +8 -10
- package/src/ssr/ShellRuntime.island.tsx +1 -5
- package/src/ssr/ThemeCycleButton.tsx +46 -0
- package/src/ssr/app-appearance.ts +6 -1
- package/src/ssr/layout-help-url.ts +39 -0
- package/src/ssr/platform-messages.ts +0 -8
- package/src/ssr/preference-controller.ts +53 -19
- package/src/ssr/profile-actions.ts +12 -16
- package/src/ssr/profile-preferences-messages.ts +4 -2
- package/src/ssr/rail-navigation.ts +3 -0
- package/src/ssr/shell-data.tsx +2 -2
- package/src/styles/effects.css +13 -3
- package/src/styles/global.css +47 -12
- package/src/styles/input.css +0 -8
- package/src/styles/tokens.css +0 -2
- package/src/styles/utilities-navigation.css +10 -13
- package/src/ssr/GlobalSearchHelpDialog.tsx +0 -104
|
@@ -883,19 +883,6 @@
|
|
|
883
883
|
transition: opacity 120ms ease-out;
|
|
884
884
|
}
|
|
885
885
|
|
|
886
|
-
.layout-profile-preferences__appearance {
|
|
887
|
-
padding: 0.125rem 0.125rem 0.25rem;
|
|
888
|
-
}
|
|
889
|
-
|
|
890
|
-
.layout-profile-preferences__appearance .k2b-segmented-control {
|
|
891
|
-
width: 100%;
|
|
892
|
-
}
|
|
893
|
-
|
|
894
|
-
/* Content-sized segments: "Automatisch" needs more room than "Hell" in the narrow panel. */
|
|
895
|
-
.layout-profile-preferences__appearance .k2b-segmented-control__option {
|
|
896
|
-
flex: 1 1 auto;
|
|
897
|
-
}
|
|
898
|
-
|
|
899
886
|
.dark .layout-profile-preferences__panel {
|
|
900
887
|
color: var(--color-zinc-300);
|
|
901
888
|
}
|
|
@@ -945,6 +932,16 @@
|
|
|
945
932
|
}
|
|
946
933
|
}
|
|
947
934
|
|
|
935
|
+
/* Reserves the width of the longest appearance label, so cycling never resizes the button. */
|
|
936
|
+
.cloud-theme-cycle__label { display: inline-grid; justify-items: start; }
|
|
937
|
+
.cloud-theme-cycle__label::before { content: attr(data-reserve-a); }
|
|
938
|
+
.cloud-theme-cycle__label::after { content: attr(data-reserve-b); }
|
|
939
|
+
.cloud-theme-cycle__label::before, .cloud-theme-cycle__label::after { height: 0; overflow: hidden; visibility: hidden; }
|
|
940
|
+
|
|
941
|
+
@media (width < 48rem) {
|
|
942
|
+
.cloud-theme-cycle__label[data-compact] { display: none; }
|
|
943
|
+
}
|
|
944
|
+
|
|
948
945
|
/* MinimalLayout stacks the page content and its footer in a column at least
|
|
949
946
|
one viewport tall, so the footer ends a short page and follows a long one.
|
|
950
947
|
Content that should fill the remaining height grows with flex-1. */
|
|
@@ -1,104 +0,0 @@
|
|
|
1
|
-
import { prompts, ScrollArea, useLocale } from "@k2b/ui";
|
|
2
|
-
import { createMemo, For, Show } from "solid-js";
|
|
3
|
-
import { platformMessages } from "./platform-messages";
|
|
4
|
-
|
|
5
|
-
export type GlobalSearchHelpApp = {
|
|
6
|
-
appId: string;
|
|
7
|
-
appName: string;
|
|
8
|
-
appIcon: string;
|
|
9
|
-
tags: string[];
|
|
10
|
-
help?: string;
|
|
11
|
-
tagHelp?: Array<{ tag: string; help: string }>;
|
|
12
|
-
};
|
|
13
|
-
|
|
14
|
-
type GlobalSearchHelpDialogProps = { apps: GlobalSearchHelpApp[] };
|
|
15
|
-
|
|
16
|
-
export default function GlobalSearchHelpDialog(props: GlobalSearchHelpDialogProps) {
|
|
17
|
-
const locale = useLocale();
|
|
18
|
-
const t = () => platformMessages.resolve([locale()]).t;
|
|
19
|
-
const apps = createMemo(() =>
|
|
20
|
-
props.apps
|
|
21
|
-
.filter((app) => app.tags.length > 0)
|
|
22
|
-
.map((app) => ({
|
|
23
|
-
...app,
|
|
24
|
-
help: app.help?.trim() || undefined,
|
|
25
|
-
tags: [...new Set(app.tags.map((tag) => tag.toLowerCase()))].sort(),
|
|
26
|
-
tagHelp: [...new Map((app.tagHelp ?? []).map((entry) => [entry.tag.trim().toLowerCase(), entry.help.trim()])).entries()]
|
|
27
|
-
.filter(([tag, help]) => tag.length > 0 && help.length > 0)
|
|
28
|
-
.map(([tag, help]) => ({ tag, help })),
|
|
29
|
-
}))
|
|
30
|
-
.sort((a, b) => a.appName.localeCompare(b.appName)),
|
|
31
|
-
);
|
|
32
|
-
|
|
33
|
-
return (
|
|
34
|
-
<div class="flex max-h-[min(42rem,var(--ui-dialog-available-height))] min-h-0 flex-col gap-4 text-zinc-900 dark:text-zinc-100">
|
|
35
|
-
<div class="flex items-start justify-between gap-3">
|
|
36
|
-
<div>
|
|
37
|
-
<p class="text-sm text-dimmed">{t().searchTagsDescription({ tag: "#tag" })}</p>
|
|
38
|
-
</div>
|
|
39
|
-
</div>
|
|
40
|
-
|
|
41
|
-
<ScrollArea class="min-h-0 flex-1 pr-1">
|
|
42
|
-
<div class="flex flex-col gap-2">
|
|
43
|
-
<For each={apps()}>
|
|
44
|
-
{(app) => (
|
|
45
|
-
<section class="rounded-lg ring-1 ring-inset ring-zinc-200 dark:ring-zinc-800 p-3 bg-zinc-50/50 dark:bg-zinc-900/35">
|
|
46
|
-
<header class="flex items-center gap-2 text-sm">
|
|
47
|
-
<i class={app.appIcon} />
|
|
48
|
-
<span>{app.appName}</span>
|
|
49
|
-
</header>
|
|
50
|
-
<Show when={app.help}>
|
|
51
|
-
<p class="mt-1 text-xs text-dimmed">{app.help}</p>
|
|
52
|
-
</Show>
|
|
53
|
-
<Show
|
|
54
|
-
when={(app.tagHelp?.length ?? 0) > 0}
|
|
55
|
-
fallback={
|
|
56
|
-
<p class="mt-1 text-xs text-dimmed">
|
|
57
|
-
{t().tags}:{" "}
|
|
58
|
-
<For each={app.tags}>
|
|
59
|
-
{(tag, index) => (
|
|
60
|
-
<>
|
|
61
|
-
<code>#{tag}</code>
|
|
62
|
-
<Show when={index() < app.tags.length - 1}>, </Show>
|
|
63
|
-
</>
|
|
64
|
-
)}
|
|
65
|
-
</For>
|
|
66
|
-
</p>
|
|
67
|
-
}
|
|
68
|
-
>
|
|
69
|
-
<div class="mt-2 space-y-1 text-xs">
|
|
70
|
-
<For each={app.tagHelp}>
|
|
71
|
-
{(entry) => (
|
|
72
|
-
<div class="grid grid-cols-[6rem_minmax(0,1fr)] gap-2">
|
|
73
|
-
<code>#{entry.tag}</code>
|
|
74
|
-
<span class="text-dimmed">{entry.help}</span>
|
|
75
|
-
</div>
|
|
76
|
-
)}
|
|
77
|
-
</For>
|
|
78
|
-
</div>
|
|
79
|
-
</Show>
|
|
80
|
-
</section>
|
|
81
|
-
)}
|
|
82
|
-
</For>
|
|
83
|
-
<Show when={apps().length === 0}>
|
|
84
|
-
<div class="rounded-lg ring-1 ring-inset ring-zinc-200 dark:ring-zinc-800 p-3 text-xs text-dimmed bg-zinc-50/50 dark:bg-zinc-900/35">
|
|
85
|
-
{t().noAppSearchTags}
|
|
86
|
-
</div>
|
|
87
|
-
</Show>
|
|
88
|
-
</div>
|
|
89
|
-
</ScrollArea>
|
|
90
|
-
</div>
|
|
91
|
-
);
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
export const openGlobalSearchHelpDialog = (
|
|
95
|
-
apps: GlobalSearchHelpApp[],
|
|
96
|
-
locale = typeof document === "undefined" ? "en" : document.documentElement.lang || "en",
|
|
97
|
-
) => {
|
|
98
|
-
const t = platformMessages.resolve([locale]).t;
|
|
99
|
-
void prompts.dialog<void>(() => <GlobalSearchHelpDialog apps={apps} />, {
|
|
100
|
-
title: t.searchTags,
|
|
101
|
-
icon: "ti ti-help-circle",
|
|
102
|
-
size: "large",
|
|
103
|
-
});
|
|
104
|
-
};
|