@krak-stack/registry 0.1.31 → 0.1.33

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 (49) hide show
  1. package/README.md +21 -0
  2. package/dist/components/ui/code-block.d.ts +8 -6
  3. package/dist/components/ui/code-block.js +40 -19
  4. package/dist/components/ui/copy-button.d.ts +9 -6
  5. package/dist/components/ui/copy-button.js +15 -8
  6. package/dist/components/ui/data-table.d.ts +9 -5
  7. package/dist/components/ui/data-table.js +74 -479
  8. package/dist/components/ui/editing-locale-switcher.d.ts +8 -4
  9. package/dist/components/ui/editing-locale-switcher.js +20 -448
  10. package/dist/components/ui/effect-form.d.ts +39 -10
  11. package/dist/components/ui/effect-form.js +141 -527
  12. package/dist/components/ui/error-component.d.ts +4 -2
  13. package/dist/components/ui/error-component.js +24 -450
  14. package/dist/components/ui/file-picker.d.ts +4 -2
  15. package/dist/components/ui/file-picker.js +25 -452
  16. package/dist/components/ui/form.d.ts +123 -71
  17. package/dist/components/ui/form.js +81 -474
  18. package/dist/components/ui/google-map.d.ts +2 -1
  19. package/dist/components/ui/google-map.js +4 -439
  20. package/dist/components/ui/icon-input.d.ts +50 -1
  21. package/dist/components/ui/icon-input.js +30 -446
  22. package/dist/components/ui/loading.d.ts +7 -1
  23. package/dist/components/ui/loading.js +4 -438
  24. package/dist/components/ui/locale-switcher.d.ts +8 -4
  25. package/dist/components/ui/locale-switcher.js +29 -453
  26. package/dist/components/ui/pagination.d.ts +5 -3
  27. package/dist/components/ui/pagination.js +5 -439
  28. package/dist/components/ui/search-menu.d.ts +4 -2
  29. package/dist/components/ui/search-menu.js +6 -440
  30. package/dist/components/ui/theme-switcher.d.ts +5 -3
  31. package/dist/components/ui/theme-switcher.js +6 -440
  32. package/dist/components/ui/virtualized-combobox.d.ts +4 -2
  33. package/dist/components/ui/virtualized-combobox.js +11 -443
  34. package/dist/lib/docs.d.ts +2 -0
  35. package/dist/lib/docs.js +86 -481
  36. package/dist/lib/docs.server.js +0 -21
  37. package/dist/lib/documentation-toolkit.js +0 -21
  38. package/dist/lib/markdown/content.d.ts +4 -5
  39. package/dist/services/agent/client/index.js +75 -463
  40. package/dist/services/agent/client/widget.d.ts +6 -3
  41. package/dist/services/notification/client/index.js +8 -440
  42. package/dist/services/notification/client/notification-menu.d.ts +6 -3
  43. package/dist/services/notification/public.js +8 -440
  44. package/dist/services/opentelemetry/api.d.ts +5 -0
  45. package/dist/services/opentelemetry/api.js +44 -0
  46. package/dist/services/opentelemetry/browser.d.ts +10 -0
  47. package/dist/services/opentelemetry/browser.js +59 -0
  48. package/package.json +9 -1
  49. package/dist/paraglide/runtime.d.ts +0 -978
package/README.md CHANGED
@@ -20,6 +20,8 @@ import {
20
20
  } from "@krak-stack/registry/httpapi-toolkit";
21
21
  import { ApiClient } from "@krak-stack/registry/httpapi/client";
22
22
  import { HttpApiSpec } from "@krak-stack/registry/httpapi/helpers";
23
+ import { HttpApiOtlp } from "@krak-stack/registry/opentelemetry/api";
24
+ import { BrowserOtlp } from "@krak-stack/registry/opentelemetry/browser";
23
25
  import { createDocsSource, makeDocs } from "@krak-stack/registry/docs";
24
26
  import { loadMdxDocsDirectory } from "@krak-stack/registry/docs/server";
25
27
  import {
@@ -42,6 +44,25 @@ import {
42
44
  import { NotificationService } from "@krak-stack/registry/service-notification";
43
45
  ```
44
46
 
47
+ Inject API telemetry and browser proxy routes into the application HTTP layer:
48
+
49
+ ```ts
50
+ const appLayer = appRoutes.pipe(Layer.provideMerge(HttpApiOtlp.layer));
51
+ ```
52
+
53
+ Install browser telemetry globally on the Atom runtime used by the API client:
54
+
55
+ ```ts
56
+ import { Atom } from "effect/unstable/reactivity";
57
+ import { BrowserOtlp } from "@krak-stack/registry/opentelemetry/browser";
58
+
59
+ const apiRuntime = Atom.context();
60
+
61
+ if (!import.meta.env.SSR) {
62
+ apiRuntime.addGlobalLayer(BrowserOtlp.layer({ serviceName: "my-app-web" }));
63
+ }
64
+ ```
65
+
45
66
  `@krak-stack/registry/service-notification` is the source-compatible direct
46
67
  dispatcher. Use the separate `@krak-stack/notifications` package for a durable
47
68
  inbox, package-owned migrations, persisted delivery jobs, retries, workers, and
@@ -1,12 +1,14 @@
1
- type CodeBlockMessages = {
2
- copy?: string;
3
- copied?: string;
4
- copyFailed?: string;
1
+ import { type CopyButtonMessages } from "./copy-button.js";
2
+ export type CodeBlockMessages = CopyButtonMessages & {
3
+ codeDescription: (language: string) => string;
5
4
  };
5
+ export type CodeBlockMessageTranslations = Partial<Record<string, Partial<CodeBlockMessages>>>;
6
+ export declare const codeBlockMessages: (locale?: string, translations?: CodeBlockMessageTranslations) => CodeBlockMessages;
6
7
  type CodeBlockProps = {
7
8
  code: string;
8
9
  language?: string;
9
- messages?: CodeBlockMessages;
10
+ locale?: string;
11
+ messages?: CodeBlockMessageTranslations;
10
12
  };
11
- export declare function CodeBlock({ code, language, messages, }: CodeBlockProps): import("react").JSX.Element;
13
+ export declare function CodeBlock({ code, language, locale, messages, }: CodeBlockProps): import("react").JSX.Element;
12
14
  export {};
@@ -50,11 +50,21 @@ function Button({
50
50
  import { Check, Copy, TriangleAlert } from "lucide-react";
51
51
  import { useEffect, useRef, useState } from "react";
52
52
  import { jsx as jsx2, jsxs } from "react/jsx-runtime";
53
+ var messages = {
54
+ en: { copy: "Copy", copied: "Copied", copyFailed: "Copy failed" },
55
+ fr: { copy: "Copier", copied: "Copié", copyFailed: "Échec de la copie" }
56
+ };
57
+ var copyButtonMessages = (locale = "en", translations) => ({
58
+ ...locale.startsWith("fr") ? messages.fr : messages.en,
59
+ ...translations?.[locale.split("-")[0] ?? locale],
60
+ ...translations?.[locale]
61
+ });
53
62
  function CopyButton({
54
63
  value,
55
64
  valueDescription,
56
65
  copyVariant = "default",
57
- messages,
66
+ locale = "en",
67
+ messages: messages2,
58
68
  onCopied,
59
69
  onCopyError,
60
70
  resetDelay = 1500,
@@ -65,11 +75,7 @@ function CopyButton({
65
75
  }) {
66
76
  const [copyState, setCopyState] = useState("idle");
67
77
  const copyTimeout = useRef(undefined);
68
- const labels = {
69
- copy: messages?.copy ?? "Copy",
70
- copied: messages?.copied ?? "Copied",
71
- copyFailed: messages?.copyFailed ?? "Copy failed"
72
- };
78
+ const labels = copyButtonMessages(locale, messages2);
73
79
  const accessibleLabel = ariaLabel ?? (valueDescription ? `${labels.copy} ${valueDescription}` : labels.copy);
74
80
  const isLarge = copyVariant === "large";
75
81
  const defaultSize = copyVariant === "sm" ? "icon-xs" : isLarge ? "sm" : "icon-sm";
@@ -91,7 +97,7 @@ function CopyButton({
91
97
  onCopied?.();
92
98
  } catch (error) {
93
99
  setCopyState("failed");
94
- onCopyError?.(error instanceof Error ? error : new Error("Copy failed", { cause: error }));
100
+ onCopyError?.(error instanceof Error ? error : new Error(labels.copyFailed, { cause: error }));
95
101
  }
96
102
  resetCopyState();
97
103
  };
@@ -147,21 +153,34 @@ var themeCss = `${createThemeCss({
147
153
  color: inherit;
148
154
  }
149
155
  [data-code-theme] pre.th-code code { font: inherit; }`;
156
+ var messages2 = {
157
+ en: {
158
+ codeDescription: (language) => `${language} code`,
159
+ copy: "Copy",
160
+ copied: "Copied",
161
+ copyFailed: "Copy failed"
162
+ },
163
+ fr: {
164
+ codeDescription: (language) => `code ${language}`,
165
+ copy: "Copier",
166
+ copied: "Copié",
167
+ copyFailed: "Échec de la copie"
168
+ }
169
+ };
170
+ var codeBlockMessages = (locale = "en", translations) => ({
171
+ ...locale.startsWith("fr") ? messages2.fr : messages2.en,
172
+ ...translations?.[locale.split("-")[0] ?? locale],
173
+ ...translations?.[locale]
174
+ });
150
175
  function CodeBlock({
151
176
  code,
152
177
  language = "text",
153
- messages
178
+ locale = "en",
179
+ messages: messages3
154
180
  }) {
155
181
  const normalizedLanguage = language.toLowerCase() || "text";
156
182
  const highlighted = highlight(code, { lang: normalizedLanguage });
157
- const copyMessages = {};
158
- if (messages?.copy !== undefined)
159
- copyMessages.copy = messages.copy;
160
- if (messages?.copied !== undefined)
161
- copyMessages.copied = messages.copied;
162
- if (messages?.copyFailed !== undefined) {
163
- copyMessages.copyFailed = messages.copyFailed;
164
- }
183
+ const labels = codeBlockMessages(locale, messages3);
165
184
  return /* @__PURE__ */ jsxs2("div", {
166
185
  className: "not-prose bg-muted overflow-hidden rounded-md border text-[var(--th-token)]",
167
186
  "data-code-theme": true,
@@ -178,9 +197,10 @@ function CodeBlock({
178
197
  }),
179
198
  /* @__PURE__ */ jsx3(CopyButton, {
180
199
  value: code,
181
- valueDescription: `${highlighted.lang} code`,
200
+ valueDescription: labels.codeDescription(highlighted.lang),
182
201
  variant: "secondary",
183
- messages: copyMessages
202
+ locale,
203
+ messages: { [locale]: labels }
184
204
  })
185
205
  ]
186
206
  }),
@@ -192,5 +212,6 @@ function CodeBlock({
192
212
  });
193
213
  }
194
214
  export {
195
- CodeBlock
215
+ CodeBlock,
216
+ codeBlockMessages
196
217
  };
@@ -1,18 +1,21 @@
1
1
  import { Button } from "./button.js";
2
2
  import type { ComponentProps } from "react";
3
- type CopyButtonMessages = {
4
- copy?: string;
5
- copied?: string;
6
- copyFailed?: string;
3
+ export type CopyButtonMessages = {
4
+ copy: string;
5
+ copied: string;
6
+ copyFailed: string;
7
7
  };
8
+ export type CopyButtonMessageTranslations = Partial<Record<string, Partial<CopyButtonMessages>>>;
9
+ export declare const copyButtonMessages: (locale?: string, translations?: CopyButtonMessageTranslations) => CopyButtonMessages;
8
10
  type CopyButtonProps = Omit<ComponentProps<typeof Button>, "children" | "onClick"> & {
9
11
  value: string;
10
12
  valueDescription?: string;
11
13
  copyVariant?: "default" | "sm" | "large";
12
- messages?: CopyButtonMessages;
14
+ locale?: string;
15
+ messages?: CopyButtonMessageTranslations;
13
16
  onCopied?: () => void;
14
17
  onCopyError?: (error: Error) => void;
15
18
  resetDelay?: number;
16
19
  };
17
- export declare function CopyButton({ value, valueDescription, copyVariant, messages, onCopied, onCopyError, resetDelay, disabled, size, "aria-label": ariaLabel, ...props }: CopyButtonProps): import("react").JSX.Element;
20
+ export declare function CopyButton({ value, valueDescription, copyVariant, locale, messages, onCopied, onCopyError, resetDelay, disabled, size, "aria-label": ariaLabel, ...props }: CopyButtonProps): import("react").JSX.Element;
18
21
  export {};
@@ -50,11 +50,21 @@ function Button({
50
50
  import { Check, Copy, TriangleAlert } from "lucide-react";
51
51
  import { useEffect, useRef, useState } from "react";
52
52
  import { jsx as jsx2, jsxs } from "react/jsx-runtime";
53
+ var messages = {
54
+ en: { copy: "Copy", copied: "Copied", copyFailed: "Copy failed" },
55
+ fr: { copy: "Copier", copied: "Copié", copyFailed: "Échec de la copie" }
56
+ };
57
+ var copyButtonMessages = (locale = "en", translations) => ({
58
+ ...locale.startsWith("fr") ? messages.fr : messages.en,
59
+ ...translations?.[locale.split("-")[0] ?? locale],
60
+ ...translations?.[locale]
61
+ });
53
62
  function CopyButton({
54
63
  value,
55
64
  valueDescription,
56
65
  copyVariant = "default",
57
- messages,
66
+ locale = "en",
67
+ messages: messages2,
58
68
  onCopied,
59
69
  onCopyError,
60
70
  resetDelay = 1500,
@@ -65,11 +75,7 @@ function CopyButton({
65
75
  }) {
66
76
  const [copyState, setCopyState] = useState("idle");
67
77
  const copyTimeout = useRef(undefined);
68
- const labels = {
69
- copy: messages?.copy ?? "Copy",
70
- copied: messages?.copied ?? "Copied",
71
- copyFailed: messages?.copyFailed ?? "Copy failed"
72
- };
78
+ const labels = copyButtonMessages(locale, messages2);
73
79
  const accessibleLabel = ariaLabel ?? (valueDescription ? `${labels.copy} ${valueDescription}` : labels.copy);
74
80
  const isLarge = copyVariant === "large";
75
81
  const defaultSize = copyVariant === "sm" ? "icon-xs" : isLarge ? "sm" : "icon-sm";
@@ -91,7 +97,7 @@ function CopyButton({
91
97
  onCopied?.();
92
98
  } catch (error) {
93
99
  setCopyState("failed");
94
- onCopyError?.(error instanceof Error ? error : new Error("Copy failed", { cause: error }));
100
+ onCopyError?.(error instanceof Error ? error : new Error(labels.copyFailed, { cause: error }));
95
101
  }
96
102
  resetCopyState();
97
103
  };
@@ -125,5 +131,6 @@ function CopyButton({
125
131
  });
126
132
  }
127
133
  export {
128
- CopyButton
134
+ CopyButton,
135
+ copyButtonMessages
129
136
  };
@@ -33,6 +33,8 @@ export interface DataTableListItemContext<TData> {
33
33
  export interface DataTableListOptions {
34
34
  emptyLabel: ReactNode;
35
35
  display?: "list" | "icon";
36
+ locale?: string;
37
+ messages?: DataTableMessageTranslations;
36
38
  visibleCount?: number;
37
39
  }
38
40
  export type DataTableListColumn<TData> = DataTableListOptions & {
@@ -84,7 +86,7 @@ export type DataTableListCellProps = DataTableListCellActionsProps & (EditableDa
84
86
  onRemove?: never;
85
87
  }));
86
88
  export interface DataTableDateOptions {
87
- /** Defaults to the current Paraglide locale. */
89
+ /** Defaults to the DataTable locale, or English outside a DataTable. */
88
90
  locale?: string;
89
91
  /** Defaults to UTC. Calendar-only strings retain their date in every zone. */
90
92
  timeZone?: string;
@@ -275,7 +277,8 @@ export type DataTableMessages = PaginationMessages & {
275
277
  selected: string;
276
278
  };
277
279
  export type DataTableMessageOverrides = Partial<DataTableMessages>;
278
- export declare const dataTableMessages: (overrides?: DataTableMessageOverrides) => {
280
+ export type DataTableMessageTranslations = Partial<Record<string, DataTableMessageOverrides>>;
281
+ export declare const dataTableMessages: (locale?: string, translations?: DataTableMessageTranslations) => {
279
282
  pageSize: string;
280
283
  results: (count: number) => string;
281
284
  selectedOf: (selected: number, total: number) => string;
@@ -356,11 +359,12 @@ export interface DataTableProps<TData extends RowData> {
356
359
  getRowId?: (row: TData) => string;
357
360
  state?: DataTablePublicState;
358
361
  initialState?: Partial<DataTablePublicState>;
362
+ locale?: string;
359
363
  onStateChange?: (state: DataTablePublicState) => void;
360
364
  status?: DataTableStatus;
361
365
  features?: DataTableFeatures<TData>;
362
366
  onRowClicked?: (row: TData) => void;
363
- messages?: DataTableMessageOverrides;
367
+ messages?: DataTableMessageTranslations;
364
368
  }
365
369
  export interface DataTableColumn<TData extends RowData> {
366
370
  id: string;
@@ -386,8 +390,8 @@ export interface DataTableModel<TData extends RowData> {
386
390
  export declare const normalizeDataTableColumns: <TData extends RowData>(columnDefs: readonly DataTableColDef<TData>[], columnSizing?: Readonly<Record<string, number>>) => DataTableColumn<TData>[];
387
391
  export declare const getDataTableWidth: <TData extends RowData>(columns: readonly DataTableColumn<TData>[], utilityColumns?: number) => number;
388
392
  export declare const buildDataTableRows: <TData extends RowData>(rowData: readonly TData[], columns: readonly DataTableColumn<TData>[], getRowId?: (row: TData) => string) => DataTableModelRow<TData>[];
389
- export declare const getDataTableExportValue: <TData extends RowData>(row: DataTableModelRow<TData>, column: DataTableColumn<TData>) => unknown;
390
- export declare const filterDataTableRows: <TData extends RowData>(rows: readonly DataTableModelRow<TData>[], columns: readonly DataTableColumn<TData>[], globalFilter: string) => DataTableModelRow<TData>[];
393
+ export declare const getDataTableExportValue: <TData extends RowData>(row: DataTableModelRow<TData>, column: DataTableColumn<TData>, locale?: string) => unknown;
394
+ export declare const filterDataTableRows: <TData extends RowData>(rows: readonly DataTableModelRow<TData>[], columns: readonly DataTableColumn<TData>[], globalFilter: string, locale?: string) => DataTableModelRow<TData>[];
391
395
  export declare const sortDataTableRows: <TData extends RowData>(rows: readonly DataTableModelRow<TData>[], columns: readonly DataTableColumn<TData>[], sorting: NonNullable<QueryType["sort"]>) => DataTableModelRow<TData>[];
392
396
  export declare const paginateDataTableRows: <TData extends RowData>(rows: readonly DataTableModelRow<TData>[], pagination: Pick<QueryType, "page" | "pageSize">) => DataTableModelRow<TData>[];
393
397
  export declare const reorderDataTableRows: <TData extends RowData>(rows: readonly DataTableModelRow<TData>[], sourceRowId: string, targetRowId: string) => TData[];