@orochibraru/ui 1.0.0 → 1.0.1
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 +84 -3
- package/dist/components/blocks/accent-toggle.svelte +7 -3
- package/dist/components/blocks/accent-toggle.svelte.d.ts +1 -1
- package/dist/components/blocks/bottom-nav.svelte +1 -1
- package/dist/components/blocks/command-palette.svelte +268 -0
- package/dist/components/blocks/command-palette.svelte.d.ts +37 -0
- package/dist/components/blocks/error-page.svelte +23 -7
- package/dist/components/blocks/error-page.svelte.d.ts +4 -0
- package/dist/components/blocks/fab.svelte +1 -1
- package/dist/components/blocks/install-prompt.svelte +14 -8
- package/dist/components/blocks/install-prompt.svelte.d.ts +2 -1
- package/dist/components/blocks/music-player/labelled-slider.svelte +3 -12
- package/dist/components/blocks/music-player/labelled-slider.svelte.d.ts +1 -2
- package/dist/components/blocks/music-player.svelte +13 -12
- package/dist/components/blocks/otp-field.svelte +77 -33
- package/dist/components/blocks/otp-field.svelte.d.ts +7 -0
- package/dist/components/blocks/password-input.svelte +56 -16
- package/dist/components/blocks/password-input.svelte.d.ts +3 -0
- package/dist/components/blocks/stepper/stepper-phone-header.svelte +93 -0
- package/dist/components/blocks/stepper/stepper-phone-header.svelte.d.ts +13 -0
- package/dist/components/blocks/stepper.svelte +175 -0
- package/dist/components/blocks/stepper.svelte.d.ts +30 -0
- package/dist/components/blocks/time-range-picker.svelte +229 -0
- package/dist/components/blocks/time-range-picker.svelte.d.ts +33 -0
- package/dist/components/blocks/time-series-chart/data-table.svelte +43 -0
- package/dist/components/blocks/time-series-chart/data-table.svelte.d.ts +15 -0
- package/dist/components/blocks/time-series-chart/legend.svelte +23 -0
- package/dist/components/blocks/time-series-chart/legend.svelte.d.ts +10 -0
- package/dist/components/blocks/time-series-chart/marks.svelte +118 -0
- package/dist/components/blocks/time-series-chart/marks.svelte.d.ts +29 -0
- package/dist/components/blocks/time-series-chart/messages.d.ts +13 -0
- package/dist/components/blocks/time-series-chart/messages.js +12 -0
- package/dist/components/blocks/time-series-chart/readout.svelte +44 -0
- package/dist/components/blocks/time-series-chart/readout.svelte.d.ts +15 -0
- package/dist/components/blocks/time-series-chart/scale.d.ts +24 -0
- package/dist/components/blocks/time-series-chart/scale.js +136 -0
- package/dist/components/blocks/time-series-chart/time.d.ts +7 -0
- package/dist/components/blocks/time-series-chart/time.js +96 -0
- package/dist/components/blocks/time-series-chart.svelte +492 -0
- package/dist/components/blocks/time-series-chart.svelte.d.ts +18 -0
- package/dist/components/blocks/top-loading-bar.svelte +1 -1
- package/dist/components/blocks/video-player/center-controls.svelte +7 -7
- package/dist/components/blocks/video-player/control-bar.svelte +41 -35
- package/dist/components/blocks/video-player/control-button.svelte +1 -1
- package/dist/components/blocks/video-player/option-menu.svelte +1 -1
- package/dist/components/blocks/video-player/scrub-bar.svelte +39 -12
- package/dist/components/blocks/video-player/scrub-bar.svelte.d.ts +2 -0
- package/dist/components/blocks/video-player.svelte +2 -2
- package/dist/components/kit/accordion.svelte +70 -0
- package/dist/components/kit/accordion.svelte.d.ts +37 -0
- package/dist/components/kit/avatar-group.svelte +84 -0
- package/dist/components/kit/avatar-group.svelte.d.ts +14 -0
- package/dist/components/kit/bar-list.svelte +104 -0
- package/dist/components/kit/bar-list.svelte.d.ts +22 -0
- package/dist/components/kit/breadcrumbs.svelte +102 -0
- package/dist/components/kit/breadcrumbs.svelte.d.ts +14 -0
- package/dist/components/kit/checkbox-list.svelte +98 -0
- package/dist/components/kit/checkbox-list.svelte.d.ts +15 -0
- package/dist/components/kit/checkbox.svelte +84 -0
- package/dist/components/kit/checkbox.svelte.d.ts +8 -0
- package/dist/components/kit/confirm-dialog.svelte +127 -0
- package/dist/components/kit/confirm-dialog.svelte.d.ts +19 -0
- package/dist/components/kit/data-table.svelte +280 -0
- package/dist/components/kit/data-table.svelte.d.ts +46 -0
- package/dist/components/kit/date-field.svelte +210 -0
- package/dist/components/kit/date-field.svelte.d.ts +14 -0
- package/dist/components/kit/field-frame.svelte +71 -0
- package/dist/components/kit/field-frame.svelte.d.ts +26 -0
- package/dist/components/kit/fieldset-frame.svelte +69 -0
- package/dist/components/kit/fieldset-frame.svelte.d.ts +14 -0
- package/dist/components/kit/file-dropzone/files.d.ts +14 -0
- package/dist/components/kit/file-dropzone/files.js +69 -0
- package/dist/components/kit/file-dropzone.svelte +253 -0
- package/dist/components/kit/file-dropzone.svelte.d.ts +25 -0
- package/dist/components/kit/form.svelte +335 -0
- package/dist/components/kit/form.svelte.d.ts +61 -0
- package/dist/components/kit/input.svelte +73 -0
- package/dist/components/kit/input.svelte.d.ts +9 -0
- package/dist/components/kit/menu.svelte +163 -0
- package/dist/components/kit/menu.svelte.d.ts +28 -0
- package/dist/components/kit/pagination.svelte +134 -0
- package/dist/components/kit/pagination.svelte.d.ts +17 -0
- package/dist/components/kit/radio-list.svelte +131 -0
- package/dist/components/kit/radio-list.svelte.d.ts +15 -0
- package/dist/components/kit/segmented-control/segment.svelte +47 -0
- package/dist/components/kit/segmented-control/segment.svelte.d.ts +11 -0
- package/dist/components/kit/segmented-control.svelte +70 -0
- package/dist/components/kit/segmented-control.svelte.d.ts +16 -0
- package/dist/components/kit/select.svelte +244 -0
- package/dist/components/kit/select.svelte.d.ts +26 -0
- package/dist/components/kit/status-badge.svelte +54 -0
- package/dist/components/kit/status-badge.svelte.d.ts +31 -0
- package/dist/components/kit/switch.svelte +84 -0
- package/dist/components/kit/switch.svelte.d.ts +8 -0
- package/dist/components/kit/tabs.svelte +86 -0
- package/dist/components/kit/tabs.svelte.d.ts +20 -0
- package/dist/components/kit/textarea.svelte +92 -0
- package/dist/components/kit/textarea.svelte.d.ts +11 -0
- package/dist/components/ui/drawer/drawer-content.svelte +1 -1
- package/dist/components/ui/input-group/input-group-input.svelte.d.ts +1 -1
- package/dist/components/ui/sidebar/sidebar-input.svelte.d.ts +1 -1
- package/dist/components/ui/sonner/sonner.svelte +2 -4
- package/dist/mcp-content.json +1 -1
- package/dist/mcp.js +11 -11
- package/dist/server/hooks.d.ts +9 -0
- package/dist/server/hooks.js +41 -0
- package/dist/server/logger.d.ts +39 -0
- package/dist/server/logger.js +144 -0
- package/dist/server/telemetry.d.ts +23 -0
- package/dist/server/telemetry.js +82 -0
- package/dist/theme.css +18 -6
- package/package.json +40 -1
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Handle, HandleServerError } from "@sveltejs/kit/hooks";
|
|
2
|
+
import type { Logger } from "./logger.js";
|
|
3
|
+
/** A `handle` writing one log line per request, skipping assets, data requests and the paths in `quietPaths`. */
|
|
4
|
+
export declare function requestLog(logger: Logger, quietPaths?: string[]): Handle;
|
|
5
|
+
/**
|
|
6
|
+
* A `handleError` for unexpected errors: logs them, records them on the request's span, and returns an `errorId`
|
|
7
|
+
* (the trace id when tracing is on) that the error page shows, so a user's report leads to the trace.
|
|
8
|
+
*/
|
|
9
|
+
export declare function unexpectedErrors(logger: Logger, message?: string): HandleServerError;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { SpanStatusCode, trace } from "@opentelemetry/api";
|
|
2
|
+
const defaultQuietPaths = [
|
|
3
|
+
"/_app/",
|
|
4
|
+
"/.well-known/",
|
|
5
|
+
"/api/health",
|
|
6
|
+
"/favicon",
|
|
7
|
+
"/sw.js",
|
|
8
|
+
"/workbox-",
|
|
9
|
+
];
|
|
10
|
+
/** A `handle` writing one log line per request, skipping assets, data requests and the paths in `quietPaths`. */
|
|
11
|
+
export function requestLog(logger, quietPaths = defaultQuietPaths) {
|
|
12
|
+
return async ({ event, resolve }) => {
|
|
13
|
+
const startedAt = performance.now();
|
|
14
|
+
const response = await resolve(event);
|
|
15
|
+
const path = event.url.pathname;
|
|
16
|
+
if (!path.endsWith("/__data.json") &&
|
|
17
|
+
!quietPaths.some((quiet) => path.startsWith(quiet))) {
|
|
18
|
+
logger.request({
|
|
19
|
+
method: event.request.method,
|
|
20
|
+
path,
|
|
21
|
+
status: response.status,
|
|
22
|
+
durationMs: Math.round(performance.now() - startedAt),
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
return response;
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* A `handleError` for unexpected errors: logs them, records them on the request's span, and returns an `errorId`
|
|
30
|
+
* (the trace id when tracing is on) that the error page shows, so a user's report leads to the trace.
|
|
31
|
+
*/
|
|
32
|
+
export function unexpectedErrors(logger, message = "Something went wrong.") {
|
|
33
|
+
return ({ error, event }) => {
|
|
34
|
+
const span = trace.getActiveSpan();
|
|
35
|
+
span?.recordException(error instanceof Error ? error : String(error));
|
|
36
|
+
span?.setStatus({ code: SpanStatusCode.ERROR });
|
|
37
|
+
const errorId = span?.spanContext().traceId ?? crypto.randomUUID();
|
|
38
|
+
logger.error("Unhandled error", { errorId, method: event.request.method, path: event.url.pathname }, error);
|
|
39
|
+
return { errorId, message };
|
|
40
|
+
};
|
|
41
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
export type LogLevel = "trace" | "debug" | "info" | "warn" | "error";
|
|
2
|
+
export type LogFormat = "console" | "json";
|
|
3
|
+
export interface LogSettings {
|
|
4
|
+
level: LogLevel;
|
|
5
|
+
format: LogFormat;
|
|
6
|
+
}
|
|
7
|
+
export interface RequestLine {
|
|
8
|
+
method: string;
|
|
9
|
+
path: string;
|
|
10
|
+
status: number;
|
|
11
|
+
durationMs: number;
|
|
12
|
+
}
|
|
13
|
+
/** Sets the level and format every logger writes with; until then they come from `LOG_LEVEL` and `LOG_FORMAT`. */
|
|
14
|
+
export declare function configureLogging(next: Partial<LogSettings>): void;
|
|
15
|
+
/**
|
|
16
|
+
* Writes scoped log lines, as coloured text or JSON lines, at or above the configured level. JSON lines carry the
|
|
17
|
+
* active OpenTelemetry trace and span ids, so a log line can be found from its trace and back.
|
|
18
|
+
*/
|
|
19
|
+
export declare class Logger {
|
|
20
|
+
#private;
|
|
21
|
+
/** Creates a logger whose lines are tagged with `scope`. */
|
|
22
|
+
constructor(scope: string);
|
|
23
|
+
/** Writes a trace line. */
|
|
24
|
+
trace(message: string, ...params: unknown[]): void;
|
|
25
|
+
/** Writes a debug line. */
|
|
26
|
+
debug(message: string, ...params: unknown[]): void;
|
|
27
|
+
/** Writes an info line. */
|
|
28
|
+
info(message: string, ...params: unknown[]): void;
|
|
29
|
+
/** Writes a warning line to stderr. */
|
|
30
|
+
warn(message: string, ...params: unknown[]): void;
|
|
31
|
+
/** Writes an error line to stderr; an `Error` param is serialised with its stack. */
|
|
32
|
+
error(message: string, ...params: unknown[]): void;
|
|
33
|
+
/** Writes one line for a finished HTTP request, at error level for a 4xx or 5xx other than 404. */
|
|
34
|
+
request(line: RequestLine): void;
|
|
35
|
+
/** Writes `lines` framed in hashtags so they stand out in console output; JSON format logs them as one line. */
|
|
36
|
+
banner(level: LogLevel, lines: string[]): void;
|
|
37
|
+
/** Writes `text` as is at info level in console output, for a boot logo; JSON format skips it. */
|
|
38
|
+
art(text: string): void;
|
|
39
|
+
}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import { inspect, styleText } from "node:util";
|
|
2
|
+
import { trace } from "@opentelemetry/api";
|
|
3
|
+
const levelOrder = ["trace", "debug", "info", "warn", "error"];
|
|
4
|
+
const levelColors = {
|
|
5
|
+
trace: "gray",
|
|
6
|
+
debug: "cyan",
|
|
7
|
+
info: "blue",
|
|
8
|
+
warn: "yellow",
|
|
9
|
+
error: "red",
|
|
10
|
+
};
|
|
11
|
+
function isLevel(value) {
|
|
12
|
+
return levelOrder.includes(value);
|
|
13
|
+
}
|
|
14
|
+
let settings = {
|
|
15
|
+
level: isLevel(process.env.LOG_LEVEL) ? process.env.LOG_LEVEL : "info",
|
|
16
|
+
format: process.env.LOG_FORMAT === "json" ? "json" : "console",
|
|
17
|
+
};
|
|
18
|
+
/** Sets the level and format every logger writes with; until then they come from `LOG_LEVEL` and `LOG_FORMAT`. */
|
|
19
|
+
export function configureLogging(next) {
|
|
20
|
+
settings = { ...settings, ...next };
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Writes scoped log lines, as coloured text or JSON lines, at or above the configured level. JSON lines carry the
|
|
24
|
+
* active OpenTelemetry trace and span ids, so a log line can be found from its trace and back.
|
|
25
|
+
*/
|
|
26
|
+
export class Logger {
|
|
27
|
+
#scope;
|
|
28
|
+
/** Creates a logger whose lines are tagged with `scope`. */
|
|
29
|
+
constructor(scope) {
|
|
30
|
+
this.#scope = scope;
|
|
31
|
+
}
|
|
32
|
+
/** Writes a trace line. */
|
|
33
|
+
trace(message, ...params) {
|
|
34
|
+
this.#write("trace", message, params);
|
|
35
|
+
}
|
|
36
|
+
/** Writes a debug line. */
|
|
37
|
+
debug(message, ...params) {
|
|
38
|
+
this.#write("debug", message, params);
|
|
39
|
+
}
|
|
40
|
+
/** Writes an info line. */
|
|
41
|
+
info(message, ...params) {
|
|
42
|
+
this.#write("info", message, params);
|
|
43
|
+
}
|
|
44
|
+
/** Writes a warning line to stderr. */
|
|
45
|
+
warn(message, ...params) {
|
|
46
|
+
this.#write("warn", message, params);
|
|
47
|
+
}
|
|
48
|
+
/** Writes an error line to stderr; an `Error` param is serialised with its stack. */
|
|
49
|
+
error(message, ...params) {
|
|
50
|
+
this.#write("error", message, params);
|
|
51
|
+
}
|
|
52
|
+
/** Writes one line for a finished HTTP request, at error level for a 4xx or 5xx other than 404. */
|
|
53
|
+
request(line) {
|
|
54
|
+
const level = line.status >= 400 && line.status !== 404 ? "error" : "info";
|
|
55
|
+
if (settings.format === "json") {
|
|
56
|
+
this.#write(level, "request", [{ ...line }]);
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
const summary = [
|
|
60
|
+
styleText("bold", line.method),
|
|
61
|
+
line.path,
|
|
62
|
+
styleText(this.#statusColor(line.status), String(line.status)),
|
|
63
|
+
styleText("gray", `${line.durationMs}ms`),
|
|
64
|
+
].join(" ");
|
|
65
|
+
this.#write(level, summary, []);
|
|
66
|
+
}
|
|
67
|
+
/** Writes `lines` framed in hashtags so they stand out in console output; JSON format logs them as one line. */
|
|
68
|
+
banner(level, lines) {
|
|
69
|
+
if (settings.format === "json") {
|
|
70
|
+
this.#write(level, lines.join(" "), []);
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
const width = Math.max(...lines.map((line) => line.length)) + 6;
|
|
74
|
+
const edge = "#".repeat(width);
|
|
75
|
+
const blank = `#${" ".repeat(width - 2)}#`;
|
|
76
|
+
this.#write(level, [
|
|
77
|
+
"",
|
|
78
|
+
edge,
|
|
79
|
+
blank,
|
|
80
|
+
...lines.map((line) => `# ${line.padEnd(width - 6)} #`),
|
|
81
|
+
blank,
|
|
82
|
+
edge,
|
|
83
|
+
].join("\n"), []);
|
|
84
|
+
}
|
|
85
|
+
/** Writes `text` as is at info level in console output, for a boot logo; JSON format skips it. */
|
|
86
|
+
art(text) {
|
|
87
|
+
if (settings.format === "console") {
|
|
88
|
+
this.#write("info", text, []);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
/** The colour of an HTTP status in console output. */
|
|
92
|
+
#statusColor(status) {
|
|
93
|
+
if (status >= 500) {
|
|
94
|
+
return "red";
|
|
95
|
+
}
|
|
96
|
+
return status >= 400 ? "yellow" : "green";
|
|
97
|
+
}
|
|
98
|
+
/** Writes one line at `level` when the configured level lets it through. */
|
|
99
|
+
#write(level, message, params) {
|
|
100
|
+
if (levelOrder.indexOf(level) < levelOrder.indexOf(settings.level)) {
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
const output = level === "warn" || level === "error" ? console.error : console.log;
|
|
104
|
+
if (settings.format === "json") {
|
|
105
|
+
output(JSON.stringify(this.#jsonLine(level, message, params)));
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
output(styleText("gray", new Date().toISOString().slice(11, 23)), styleText(levelColors[level], level.toUpperCase().padEnd(5)), styleText("magenta", `[${this.#scope}]`), message, ...params.map((param) => typeof param === "string"
|
|
109
|
+
? param
|
|
110
|
+
: inspect(param, { colors: true, depth: 5 })));
|
|
111
|
+
}
|
|
112
|
+
/** The JSON fields of a line: the active trace, an `Error` param serialised, plain objects merged in, anything else under `params`. */
|
|
113
|
+
#jsonLine(level, message, params) {
|
|
114
|
+
const fields = {};
|
|
115
|
+
const rest = [];
|
|
116
|
+
for (const param of params) {
|
|
117
|
+
if (param instanceof Error) {
|
|
118
|
+
fields.error = {
|
|
119
|
+
name: param.name,
|
|
120
|
+
message: param.message,
|
|
121
|
+
stack: param.stack,
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
else if (typeof param === "object" &&
|
|
125
|
+
param !== null &&
|
|
126
|
+
Object.getPrototypeOf(param) === Object.prototype) {
|
|
127
|
+
Object.assign(fields, param);
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
rest.push(param);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
const span = trace.getActiveSpan()?.spanContext();
|
|
134
|
+
return {
|
|
135
|
+
time: new Date().toISOString(),
|
|
136
|
+
level,
|
|
137
|
+
scope: this.#scope,
|
|
138
|
+
message,
|
|
139
|
+
...(span && { trace_id: span.traceId, span_id: span.spanId }),
|
|
140
|
+
...fields,
|
|
141
|
+
...(rest.length > 0 && { params: rest }),
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { type Span } from "@opentelemetry/api";
|
|
2
|
+
export interface TelemetryOptions {
|
|
3
|
+
serviceName: string;
|
|
4
|
+
serviceVersion?: string;
|
|
5
|
+
/** The OTLP base URL, like `http://collector:4318`; tracing stays off without one. */
|
|
6
|
+
endpoint?: string;
|
|
7
|
+
resourceAttributes?: Record<string, string>;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* OpenTelemetry tracing over OTLP for a SvelteKit server: start it from `instrumentation.server.ts` and turn on
|
|
11
|
+
* `tracing: { server: true }` in the kit options, and SvelteKit's own spans for handle, load and actions are exported
|
|
12
|
+
* with the app's.
|
|
13
|
+
*/
|
|
14
|
+
export declare class Telemetry {
|
|
15
|
+
#private;
|
|
16
|
+
constructor(options: TelemetryOptions);
|
|
17
|
+
/** Registers the global tracer provider; logs and does nothing without an endpoint. Returns whether tracing is on. */
|
|
18
|
+
start(): boolean;
|
|
19
|
+
/** Runs `work` inside a span named `name`, marking the span failed and rethrowing when `work` throws. */
|
|
20
|
+
withSpan<Result>(name: string, attributes: Record<string, string | number | boolean>, work: (span: Span) => Promise<Result>): Promise<Result>;
|
|
21
|
+
/** Exports the pending spans and stops tracing; never throws, for a shutdown hook. */
|
|
22
|
+
flush(): Promise<void>;
|
|
23
|
+
}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { context, diag, DiagLogLevel, SpanStatusCode, trace, } from "@opentelemetry/api";
|
|
2
|
+
import { AsyncLocalStorageContextManager } from "@opentelemetry/context-async-hooks";
|
|
3
|
+
import { OTLPTraceExporter } from "@opentelemetry/exporter-trace-otlp-proto";
|
|
4
|
+
import { defaultResource, resourceFromAttributes, } from "@opentelemetry/resources";
|
|
5
|
+
import { BatchSpanProcessor, TracerProvider } from "@opentelemetry/sdk-trace";
|
|
6
|
+
import { Logger } from "./logger.js";
|
|
7
|
+
const logger = new Logger("Telemetry");
|
|
8
|
+
/**
|
|
9
|
+
* OpenTelemetry tracing over OTLP for a SvelteKit server: start it from `instrumentation.server.ts` and turn on
|
|
10
|
+
* `tracing: { server: true }` in the kit options, and SvelteKit's own spans for handle, load and actions are exported
|
|
11
|
+
* with the app's.
|
|
12
|
+
*/
|
|
13
|
+
export class Telemetry {
|
|
14
|
+
#options;
|
|
15
|
+
#provider;
|
|
16
|
+
constructor(options) {
|
|
17
|
+
this.#options = options;
|
|
18
|
+
}
|
|
19
|
+
/** Registers the global tracer provider; logs and does nothing without an endpoint. Returns whether tracing is on. */
|
|
20
|
+
start() {
|
|
21
|
+
const { endpoint, serviceName, serviceVersion, resourceAttributes } = this.#options;
|
|
22
|
+
if (!endpoint) {
|
|
23
|
+
logger.info("Tracing off: no OTLP endpoint", { serviceName });
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
const forward = (message, ...args) => logger.warn(message, ...args);
|
|
27
|
+
diag.setLogger({
|
|
28
|
+
error: forward,
|
|
29
|
+
warn: forward,
|
|
30
|
+
info: forward,
|
|
31
|
+
debug: forward,
|
|
32
|
+
verbose: forward,
|
|
33
|
+
}, DiagLogLevel.WARN);
|
|
34
|
+
context.setGlobalContextManager(new AsyncLocalStorageContextManager().enable());
|
|
35
|
+
this.#provider = new TracerProvider({
|
|
36
|
+
resource: defaultResource().merge(resourceFromAttributes({
|
|
37
|
+
...resourceAttributes,
|
|
38
|
+
"service.name": serviceName,
|
|
39
|
+
...(serviceVersion && { "service.version": serviceVersion }),
|
|
40
|
+
})),
|
|
41
|
+
spanProcessors: [
|
|
42
|
+
new BatchSpanProcessor({
|
|
43
|
+
exporter: new OTLPTraceExporter({
|
|
44
|
+
url: `${endpoint.replace(/\/+$/, "")}/v1/traces`,
|
|
45
|
+
}),
|
|
46
|
+
}),
|
|
47
|
+
],
|
|
48
|
+
});
|
|
49
|
+
trace.setGlobalTracerProvider(this.#provider);
|
|
50
|
+
logger.info("Tracing on", { endpoint, serviceName });
|
|
51
|
+
return true;
|
|
52
|
+
}
|
|
53
|
+
/** Runs `work` inside a span named `name`, marking the span failed and rethrowing when `work` throws. */
|
|
54
|
+
withSpan(name, attributes, work) {
|
|
55
|
+
return trace
|
|
56
|
+
.getTracer(this.#options.serviceName)
|
|
57
|
+
.startActiveSpan(name, { attributes }, async (span) => {
|
|
58
|
+
try {
|
|
59
|
+
return await work(span);
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
span.recordException(error instanceof Error ? error : String(error));
|
|
63
|
+
span.setStatus({
|
|
64
|
+
code: SpanStatusCode.ERROR,
|
|
65
|
+
message: error instanceof Error ? error.message : String(error),
|
|
66
|
+
});
|
|
67
|
+
throw error;
|
|
68
|
+
}
|
|
69
|
+
finally {
|
|
70
|
+
span.end();
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
/** Exports the pending spans and stops tracing; never throws, for a shutdown hook. */
|
|
75
|
+
async flush() {
|
|
76
|
+
await this.#provider?.shutdown().catch(() => { });
|
|
77
|
+
trace.disable();
|
|
78
|
+
context.disable();
|
|
79
|
+
diag.disable();
|
|
80
|
+
this.#provider = undefined;
|
|
81
|
+
}
|
|
82
|
+
}
|
package/dist/theme.css
CHANGED
|
@@ -13,8 +13,18 @@
|
|
|
13
13
|
@custom-variant data-vertical (&:where([data-orientation="vertical"]));
|
|
14
14
|
|
|
15
15
|
:root {
|
|
16
|
-
--
|
|
17
|
-
--
|
|
16
|
+
--safe-top: max(env(safe-area-inset-top), var(--emulated-safe-top, 0px));
|
|
17
|
+
--safe-bottom: max(
|
|
18
|
+
env(safe-area-inset-bottom),
|
|
19
|
+
var(--emulated-safe-bottom, 0px)
|
|
20
|
+
);
|
|
21
|
+
--safe-left: max(env(safe-area-inset-left), var(--emulated-safe-left, 0px));
|
|
22
|
+
--safe-right: max(
|
|
23
|
+
env(safe-area-inset-right),
|
|
24
|
+
var(--emulated-safe-right, 0px)
|
|
25
|
+
);
|
|
26
|
+
--hue: 8;
|
|
27
|
+
--primary-chroma: 0.15;
|
|
18
28
|
--app-font: ui-sans-serif, system-ui, sans-serif;
|
|
19
29
|
--display-font: var(--app-font);
|
|
20
30
|
--radius: 1rem;
|
|
@@ -108,12 +118,14 @@
|
|
|
108
118
|
);
|
|
109
119
|
}
|
|
110
120
|
|
|
121
|
+
:root:not([data-accent]),
|
|
111
122
|
[data-accent="bordeaux"] {
|
|
112
123
|
--hue: 8;
|
|
113
124
|
--primary-chroma: 0.15;
|
|
114
125
|
--primary: oklch(0.44 0.15 8);
|
|
115
126
|
}
|
|
116
127
|
|
|
128
|
+
.dark:not([data-accent]),
|
|
117
129
|
.dark[data-accent="bordeaux"] {
|
|
118
130
|
--primary: oklch(0.62 0.17 12);
|
|
119
131
|
}
|
|
@@ -228,10 +240,10 @@
|
|
|
228
240
|
--color-sidebar-border: var(--sidebar-border);
|
|
229
241
|
--color-sidebar-ring: var(--sidebar-ring);
|
|
230
242
|
--color-chrome: var(--chrome);
|
|
231
|
-
--spacing-safe-top:
|
|
232
|
-
--spacing-safe-bottom:
|
|
233
|
-
--spacing-safe-left:
|
|
234
|
-
--spacing-safe-right:
|
|
243
|
+
--spacing-safe-top: var(--safe-top);
|
|
244
|
+
--spacing-safe-bottom: var(--safe-bottom);
|
|
245
|
+
--spacing-safe-left: var(--safe-left);
|
|
246
|
+
--spacing-safe-right: var(--safe-right);
|
|
235
247
|
}
|
|
236
248
|
|
|
237
249
|
@layer base {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@orochibraru/ui",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.1",
|
|
4
4
|
"description": "Svelte 5 components and theme shared by OpenCount, LocalAssistant, Homerun, Sergio's, Nuvio Web and Penombre.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -38,6 +38,18 @@
|
|
|
38
38
|
"types": "./dist/password.d.ts",
|
|
39
39
|
"default": "./dist/password.js"
|
|
40
40
|
},
|
|
41
|
+
"./server/logger": {
|
|
42
|
+
"types": "./dist/server/logger.d.ts",
|
|
43
|
+
"default": "./dist/server/logger.js"
|
|
44
|
+
},
|
|
45
|
+
"./server/telemetry": {
|
|
46
|
+
"types": "./dist/server/telemetry.d.ts",
|
|
47
|
+
"default": "./dist/server/telemetry.js"
|
|
48
|
+
},
|
|
49
|
+
"./server/hooks": {
|
|
50
|
+
"types": "./dist/server/hooks.d.ts",
|
|
51
|
+
"default": "./dist/server/hooks.js"
|
|
52
|
+
},
|
|
41
53
|
"./haptics": {
|
|
42
54
|
"types": "./dist/haptics.d.ts",
|
|
43
55
|
"default": "./dist/haptics.js"
|
|
@@ -46,6 +58,10 @@
|
|
|
46
58
|
"types": "./dist/page-title.svelte.d.ts",
|
|
47
59
|
"svelte": "./dist/page-title.svelte.js"
|
|
48
60
|
},
|
|
61
|
+
"./components/*": {
|
|
62
|
+
"types": "./dist/components/kit/*.svelte.d.ts",
|
|
63
|
+
"svelte": "./dist/components/kit/*.svelte"
|
|
64
|
+
},
|
|
49
65
|
"./blocks/*": {
|
|
50
66
|
"types": "./dist/components/blocks/*.svelte.d.ts",
|
|
51
67
|
"svelte": "./dist/components/blocks/*.svelte"
|
|
@@ -72,13 +88,32 @@
|
|
|
72
88
|
"prepare": "svelte-kit sync || true && prek install --allow-missing-config || true"
|
|
73
89
|
},
|
|
74
90
|
"peerDependencies": {
|
|
91
|
+
"@opentelemetry/context-async-hooks": "^3.0.0",
|
|
92
|
+
"@opentelemetry/exporter-trace-otlp-proto": "^0.300.0",
|
|
93
|
+
"@opentelemetry/resources": "^3.0.0",
|
|
94
|
+
"@opentelemetry/sdk-trace": "^3.0.0",
|
|
75
95
|
"@sveltejs/kit": "^3.0.0",
|
|
76
96
|
"svelte": "^5.57.0",
|
|
77
97
|
"tailwindcss": "^4.3.0"
|
|
78
98
|
},
|
|
99
|
+
"peerDependenciesMeta": {
|
|
100
|
+
"@opentelemetry/context-async-hooks": {
|
|
101
|
+
"optional": true
|
|
102
|
+
},
|
|
103
|
+
"@opentelemetry/exporter-trace-otlp-proto": {
|
|
104
|
+
"optional": true
|
|
105
|
+
},
|
|
106
|
+
"@opentelemetry/resources": {
|
|
107
|
+
"optional": true
|
|
108
|
+
},
|
|
109
|
+
"@opentelemetry/sdk-trace": {
|
|
110
|
+
"optional": true
|
|
111
|
+
}
|
|
112
|
+
},
|
|
79
113
|
"dependencies": {
|
|
80
114
|
"@internationalized/date": "^3.12.4",
|
|
81
115
|
"@lucide/svelte": "^1.64.0",
|
|
116
|
+
"@opentelemetry/api": "^1.10.0",
|
|
82
117
|
"bits-ui": "^2.20.2",
|
|
83
118
|
"cn": "^0.5.0",
|
|
84
119
|
"mode-watcher": "^1.1.0",
|
|
@@ -92,6 +127,10 @@
|
|
|
92
127
|
"@happy-dom/global-registrator": "21.0.4",
|
|
93
128
|
"@j178/prek": "0.5.7",
|
|
94
129
|
"@modelcontextprotocol/sdk": "1.32.2",
|
|
130
|
+
"@opentelemetry/context-async-hooks": "3.0.0",
|
|
131
|
+
"@opentelemetry/exporter-trace-otlp-proto": "0.300.0",
|
|
132
|
+
"@opentelemetry/resources": "3.0.0",
|
|
133
|
+
"@opentelemetry/sdk-trace": "3.0.0",
|
|
95
134
|
"@sveltejs/adapter-bun": "1.0.0",
|
|
96
135
|
"@sveltejs/kit": "3.1.0",
|
|
97
136
|
"@sveltejs/package": "3.0.1",
|