@teja-app/ui 0.0.13 → 0.0.14

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 (33) hide show
  1. package/dist/index.cjs +5 -0
  2. package/dist/index.cjs.map +1 -1
  3. package/dist/index.d.ts +1 -0
  4. package/dist/index.d.ts.map +1 -1
  5. package/dist/index.js +6 -1
  6. package/dist/index.js.map +1 -1
  7. package/dist/instrumentation/context.d.ts +9 -0
  8. package/dist/instrumentation/context.d.ts.map +1 -0
  9. package/dist/instrumentation/index.cjs +8 -0
  10. package/dist/instrumentation/index.cjs.map +1 -0
  11. package/dist/instrumentation/index.d.ts +10 -0
  12. package/dist/instrumentation/index.d.ts.map +1 -0
  13. package/dist/instrumentation/index.js +8 -0
  14. package/dist/instrumentation/index.js.map +1 -0
  15. package/dist/instrumentation/tracker.d.ts +28 -0
  16. package/dist/instrumentation/tracker.d.ts.map +1 -0
  17. package/dist/instrumentation/useInstrumentedClick.d.ts +31 -0
  18. package/dist/instrumentation/useInstrumentedClick.d.ts.map +1 -0
  19. package/dist/theme/components/AIComposeButton.d.ts +2 -0
  20. package/dist/theme/components/AIComposeButton.d.ts.map +1 -1
  21. package/dist/theme/components/Button.d.ts +2 -0
  22. package/dist/theme/components/Button.d.ts.map +1 -1
  23. package/dist/theme/components/IconButton.d.ts +2 -0
  24. package/dist/theme/components/IconButton.d.ts.map +1 -1
  25. package/dist/theme/index.cjs +26 -2
  26. package/dist/theme/index.cjs.map +1 -1
  27. package/dist/theme/index.js +26 -2
  28. package/dist/theme/index.js.map +1 -1
  29. package/dist/useInstrumentedClick-B7QAnoBt.js +68 -0
  30. package/dist/useInstrumentedClick-B7QAnoBt.js.map +1 -0
  31. package/dist/useInstrumentedClick-COxikkTF.cjs +67 -0
  32. package/dist/useInstrumentedClick-COxikkTF.cjs.map +1 -0
  33. package/package.json +6 -1
@@ -0,0 +1,68 @@
1
+ import { useContext, createContext, useCallback } from "react";
2
+ import { jsx } from "react/jsx-runtime";
3
+ const noopTracker = {
4
+ startSpan: () => ({ setAttribute: () => {
5
+ }, end: () => {
6
+ } }),
7
+ track: () => {
8
+ }
9
+ };
10
+ const TrackerContext = createContext(noopTracker);
11
+ function TrackerProvider({ tracker, children }) {
12
+ return /* @__PURE__ */ jsx(TrackerContext.Provider, { value: tracker, children });
13
+ }
14
+ function useTracker() {
15
+ return useContext(TrackerContext);
16
+ }
17
+ const SPAN_NAME = "ui.button.click";
18
+ function useInstrumentedClick(onClick, meta) {
19
+ const tracker = useTracker();
20
+ const { telemetryId, testId, kind, variant } = meta;
21
+ const wrapped = useCallback(
22
+ (e) => {
23
+ if (onClick === void 0) return;
24
+ const componentName = telemetryId ?? testId ?? `${kind}:${variant ?? "default"}`;
25
+ const span = tracker.startSpan(SPAN_NAME, {
26
+ "component.name": componentName,
27
+ "ui.component.kind": kind,
28
+ "ui.variant": variant ?? "default"
29
+ });
30
+ const start = typeof performance !== "undefined" ? performance.now() : Date.now();
31
+ let result;
32
+ try {
33
+ result = onClick(e);
34
+ } catch (err) {
35
+ span.setAttribute("ui.handler.async", false);
36
+ span.end("error", err);
37
+ throw err;
38
+ }
39
+ if (result !== null && typeof result === "object" && typeof result.then === "function") {
40
+ span.setAttribute("ui.handler.async", true);
41
+ result.then(
42
+ () => {
43
+ const end = typeof performance !== "undefined" ? performance.now() : Date.now();
44
+ span.setAttribute("ui.handler.duration_ms", end - start);
45
+ span.end("success");
46
+ },
47
+ (err) => {
48
+ const end = typeof performance !== "undefined" ? performance.now() : Date.now();
49
+ span.setAttribute("ui.handler.duration_ms", end - start);
50
+ span.end("error", err);
51
+ }
52
+ );
53
+ } else {
54
+ span.setAttribute("ui.handler.async", false);
55
+ span.end("success");
56
+ }
57
+ },
58
+ [tracker, onClick, telemetryId, testId, kind, variant]
59
+ );
60
+ return onClick === void 0 ? void 0 : wrapped;
61
+ }
62
+ export {
63
+ TrackerProvider as T,
64
+ useTracker as a,
65
+ noopTracker as n,
66
+ useInstrumentedClick as u
67
+ };
68
+ //# sourceMappingURL=useInstrumentedClick-B7QAnoBt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useInstrumentedClick-B7QAnoBt.js","sources":["../src/instrumentation/tracker.ts","../src/instrumentation/context.tsx","../src/instrumentation/useInstrumentedClick.ts"],"sourcesContent":["/**\n * Tracker facade — the FROZEN telemetry contract teja-ui exposes (W3 §7.5).\n *\n * teja-ui carries NO OpenTelemetry / Sentry / PostHog dependency. Consuming\n * apps inject a concrete `Tracker` via `<TrackerProvider>`; when no provider is\n * mounted the components fall back to `noopTracker`, so an un-instrumented host\n * sees ZERO behavior change. The app-side adapter (`frontend/src/lib/telemetry/\n * uiTracker.ts`) is the only place that knows about the real sink.\n */\n\n/** A single in-flight UI span (e.g. one button click). */\nexport interface SpanHandle {\n setAttribute(key: string, value: string | number | boolean): void;\n /**\n * End the span. `outcome` records how the handler settled; `error` is the\n * thrown/rejected value when `outcome === \"error\"` (recorded as an exception\n * by the adapter, never swallowed by the hook).\n */\n end(outcome: 'success' | 'error' | 'abandoned', error?: unknown): void;\n}\n\nexport interface Tracker {\n /** Start a span. Attributes are flat primitives so any sink can serialize them. */\n startSpan(\n name: string,\n attrs: Record<string, string | number | boolean>,\n ): SpanHandle;\n /** Fire-and-forget discrete event (no duration). */\n track(event: string, attrs?: Record<string, string | number | boolean>): void;\n}\n\n/** No-op implementation: the default when no provider is mounted. */\nexport const noopTracker: Tracker = {\n startSpan: () => ({ setAttribute: () => {}, end: () => {} }),\n track: () => {},\n};\n","import { createContext, useContext, type ReactNode } from 'react';\n\nimport { noopTracker, type Tracker } from './tracker';\n\n/**\n * TrackerProvider / useTracker (W3 §7.5).\n *\n * The context default is `noopTracker`, so `useTracker()` is always safe to\n * call even with no provider mounted — instrumented components degrade to\n * zero-cost no-ops rather than throwing.\n */\nconst TrackerContext = createContext<Tracker>(noopTracker);\n\nexport interface TrackerProviderProps {\n tracker: Tracker;\n children: ReactNode;\n}\n\nexport function TrackerProvider({ tracker, children }: TrackerProviderProps) {\n return (\n <TrackerContext.Provider value={tracker}>\n {children}\n </TrackerContext.Provider>\n );\n}\n\nexport function useTracker(): Tracker {\n return useContext(TrackerContext);\n}\n","import { useCallback, type SyntheticEvent } from 'react';\n\nimport { useTracker } from './context';\n\n/**\n * useInstrumentedClick (W3 §7.6).\n *\n * Wraps a click handler in a `ui.button.click` span. The span's lifecycle\n * follows the handler:\n * - sync handler → span ends `success` immediately (`ui.handler.async=false`)\n * - async handler → span ends when the returned promise settles\n * (`success`/`error`), recording `ui.handler.duration_ms`.\n *\n * Error semantics — the hook observes, never alters control flow:\n * - sync throw → span ends `error`, then the error is RE-THROWN so the\n * caller's try/catch / React error boundary still sees it.\n * - async reject → span ends `error`; the rejection is left ON the original\n * promise so the caller's own `.catch`/awaiter still receives it. The hook\n * attaches a passive observer (it does not consume the rejection).\n *\n * Tracker comes from `useTracker()`, so an unmounted provider = noop = zero\n * behavior change.\n */\nexport interface InstrumentedClickMeta {\n /** Semantic id, e.g. \"onboarding.step1.next\". Highest-priority component.name. */\n telemetryId?: string;\n /** Fallback identity (the component's data-testid). */\n testId?: string;\n /** \"Button\" | \"IconButton\" | \"AIComposeButton\". */\n kind: string;\n variant?: string;\n}\n\nconst SPAN_NAME = 'ui.button.click';\n\nexport function useInstrumentedClick<E extends SyntheticEvent>(\n onClick: ((e: E) => void | Promise<void>) | undefined,\n meta: InstrumentedClickMeta,\n): ((e: E) => void) | undefined {\n const tracker = useTracker();\n const { telemetryId, testId, kind, variant } = meta;\n\n const wrapped = useCallback(\n (e: E) => {\n // Guarded by the return below; the no-op branch is never wired up.\n if (onClick === undefined) return;\n const componentName =\n telemetryId ?? testId ?? `${kind}:${variant ?? 'default'}`;\n const span = tracker.startSpan(SPAN_NAME, {\n 'component.name': componentName,\n 'ui.component.kind': kind,\n 'ui.variant': variant ?? 'default',\n });\n const start =\n typeof performance !== 'undefined' ? performance.now() : Date.now();\n\n let result: void | Promise<void>;\n try {\n result = onClick(e);\n } catch (err) {\n span.setAttribute('ui.handler.async', false);\n span.end('error', err);\n throw err;\n }\n\n if (\n result !== null &&\n typeof result === 'object' &&\n typeof (result as Promise<void>).then === 'function'\n ) {\n span.setAttribute('ui.handler.async', true);\n (result as Promise<void>).then(\n () => {\n const end =\n typeof performance !== 'undefined'\n ? performance.now()\n : Date.now();\n span.setAttribute('ui.handler.duration_ms', end - start);\n span.end('success');\n },\n (err: unknown) => {\n const end =\n typeof performance !== 'undefined'\n ? performance.now()\n : Date.now();\n span.setAttribute('ui.handler.duration_ms', end - start);\n span.end('error', err);\n // Passive observation only: this handler is attached for telemetry\n // and does NOT alter the caller's control flow. The caller's own\n // promise chain (e.g. a mutation's onError, or an awaiter's catch)\n // still receives the rejection independently, because both\n // consumers observe the same promise. We do not re-throw here —\n // doing so would fabricate a NEW, uncatchable unhandled rejection\n // detached from the caller.\n },\n );\n } else {\n span.setAttribute('ui.handler.async', false);\n span.end('success');\n }\n },\n [tracker, onClick, telemetryId, testId, kind, variant],\n );\n\n return onClick === undefined ? undefined : wrapped;\n}\n"],"names":[],"mappings":";;AAgCO,MAAM,cAAuB;AAAA,EAClC,WAAW,OAAO,EAAE,cAAc,MAAM;AAAA,EAAC,GAAG,KAAK,MAAM;AAAA,EAAC;EACxD,OAAO,MAAM;AAAA,EAAC;AAChB;ACxBA,MAAM,iBAAiB,cAAuB,WAAW;AAOlD,SAAS,gBAAgB,EAAE,SAAS,YAAkC;AAC3E,6BACG,eAAe,UAAf,EAAwB,OAAO,SAC7B,UACH;AAEJ;AAEO,SAAS,aAAsB;AACpC,SAAO,WAAW,cAAc;AAClC;ACKA,MAAM,YAAY;AAEX,SAAS,qBACd,SACA,MAC8B;AAC9B,QAAM,UAAU,WAAA;AAChB,QAAM,EAAE,aAAa,QAAQ,MAAM,YAAY;AAE/C,QAAM,UAAU;AAAA,IACd,CAAC,MAAS;AAER,UAAI,YAAY,OAAW;AAC3B,YAAM,gBACJ,eAAe,UAAU,GAAG,IAAI,IAAI,WAAW,SAAS;AAC1D,YAAM,OAAO,QAAQ,UAAU,WAAW;AAAA,QACxC,kBAAkB;AAAA,QAClB,qBAAqB;AAAA,QACrB,cAAc,WAAW;AAAA,MAAA,CAC1B;AACD,YAAM,QACJ,OAAO,gBAAgB,cAAc,YAAY,IAAA,IAAQ,KAAK,IAAA;AAEhE,UAAI;AACJ,UAAI;AACF,iBAAS,QAAQ,CAAC;AAAA,MACpB,SAAS,KAAK;AACZ,aAAK,aAAa,oBAAoB,KAAK;AAC3C,aAAK,IAAI,SAAS,GAAG;AACrB,cAAM;AAAA,MACR;AAEA,UACE,WAAW,QACX,OAAO,WAAW,YAClB,OAAQ,OAAyB,SAAS,YAC1C;AACA,aAAK,aAAa,oBAAoB,IAAI;AACzC,eAAyB;AAAA,UACxB,MAAM;AACJ,kBAAM,MACJ,OAAO,gBAAgB,cACnB,YAAY,IAAA,IACZ,KAAK,IAAA;AACX,iBAAK,aAAa,0BAA0B,MAAM,KAAK;AACvD,iBAAK,IAAI,SAAS;AAAA,UACpB;AAAA,UACA,CAAC,QAAiB;AAChB,kBAAM,MACJ,OAAO,gBAAgB,cACnB,YAAY,IAAA,IACZ,KAAK,IAAA;AACX,iBAAK,aAAa,0BAA0B,MAAM,KAAK;AACvD,iBAAK,IAAI,SAAS,GAAG;AAAA,UAQvB;AAAA,QAAA;AAAA,MAEJ,OAAO;AACL,aAAK,aAAa,oBAAoB,KAAK;AAC3C,aAAK,IAAI,SAAS;AAAA,MACpB;AAAA,IACF;AAAA,IACA,CAAC,SAAS,SAAS,aAAa,QAAQ,MAAM,OAAO;AAAA,EAAA;AAGvD,SAAO,YAAY,SAAY,SAAY;AAC7C;"}
@@ -0,0 +1,67 @@
1
+ "use strict";
2
+ const React = require("react");
3
+ const jsxRuntime = require("react/jsx-runtime");
4
+ const noopTracker = {
5
+ startSpan: () => ({ setAttribute: () => {
6
+ }, end: () => {
7
+ } }),
8
+ track: () => {
9
+ }
10
+ };
11
+ const TrackerContext = React.createContext(noopTracker);
12
+ function TrackerProvider({ tracker, children }) {
13
+ return /* @__PURE__ */ jsxRuntime.jsx(TrackerContext.Provider, { value: tracker, children });
14
+ }
15
+ function useTracker() {
16
+ return React.useContext(TrackerContext);
17
+ }
18
+ const SPAN_NAME = "ui.button.click";
19
+ function useInstrumentedClick(onClick, meta) {
20
+ const tracker = useTracker();
21
+ const { telemetryId, testId, kind, variant } = meta;
22
+ const wrapped = React.useCallback(
23
+ (e) => {
24
+ if (onClick === void 0) return;
25
+ const componentName = telemetryId ?? testId ?? `${kind}:${variant ?? "default"}`;
26
+ const span = tracker.startSpan(SPAN_NAME, {
27
+ "component.name": componentName,
28
+ "ui.component.kind": kind,
29
+ "ui.variant": variant ?? "default"
30
+ });
31
+ const start = typeof performance !== "undefined" ? performance.now() : Date.now();
32
+ let result;
33
+ try {
34
+ result = onClick(e);
35
+ } catch (err) {
36
+ span.setAttribute("ui.handler.async", false);
37
+ span.end("error", err);
38
+ throw err;
39
+ }
40
+ if (result !== null && typeof result === "object" && typeof result.then === "function") {
41
+ span.setAttribute("ui.handler.async", true);
42
+ result.then(
43
+ () => {
44
+ const end = typeof performance !== "undefined" ? performance.now() : Date.now();
45
+ span.setAttribute("ui.handler.duration_ms", end - start);
46
+ span.end("success");
47
+ },
48
+ (err) => {
49
+ const end = typeof performance !== "undefined" ? performance.now() : Date.now();
50
+ span.setAttribute("ui.handler.duration_ms", end - start);
51
+ span.end("error", err);
52
+ }
53
+ );
54
+ } else {
55
+ span.setAttribute("ui.handler.async", false);
56
+ span.end("success");
57
+ }
58
+ },
59
+ [tracker, onClick, telemetryId, testId, kind, variant]
60
+ );
61
+ return onClick === void 0 ? void 0 : wrapped;
62
+ }
63
+ exports.TrackerProvider = TrackerProvider;
64
+ exports.noopTracker = noopTracker;
65
+ exports.useInstrumentedClick = useInstrumentedClick;
66
+ exports.useTracker = useTracker;
67
+ //# sourceMappingURL=useInstrumentedClick-COxikkTF.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useInstrumentedClick-COxikkTF.cjs","sources":["../src/instrumentation/tracker.ts","../src/instrumentation/context.tsx","../src/instrumentation/useInstrumentedClick.ts"],"sourcesContent":["/**\n * Tracker facade — the FROZEN telemetry contract teja-ui exposes (W3 §7.5).\n *\n * teja-ui carries NO OpenTelemetry / Sentry / PostHog dependency. Consuming\n * apps inject a concrete `Tracker` via `<TrackerProvider>`; when no provider is\n * mounted the components fall back to `noopTracker`, so an un-instrumented host\n * sees ZERO behavior change. The app-side adapter (`frontend/src/lib/telemetry/\n * uiTracker.ts`) is the only place that knows about the real sink.\n */\n\n/** A single in-flight UI span (e.g. one button click). */\nexport interface SpanHandle {\n setAttribute(key: string, value: string | number | boolean): void;\n /**\n * End the span. `outcome` records how the handler settled; `error` is the\n * thrown/rejected value when `outcome === \"error\"` (recorded as an exception\n * by the adapter, never swallowed by the hook).\n */\n end(outcome: 'success' | 'error' | 'abandoned', error?: unknown): void;\n}\n\nexport interface Tracker {\n /** Start a span. Attributes are flat primitives so any sink can serialize them. */\n startSpan(\n name: string,\n attrs: Record<string, string | number | boolean>,\n ): SpanHandle;\n /** Fire-and-forget discrete event (no duration). */\n track(event: string, attrs?: Record<string, string | number | boolean>): void;\n}\n\n/** No-op implementation: the default when no provider is mounted. */\nexport const noopTracker: Tracker = {\n startSpan: () => ({ setAttribute: () => {}, end: () => {} }),\n track: () => {},\n};\n","import { createContext, useContext, type ReactNode } from 'react';\n\nimport { noopTracker, type Tracker } from './tracker';\n\n/**\n * TrackerProvider / useTracker (W3 §7.5).\n *\n * The context default is `noopTracker`, so `useTracker()` is always safe to\n * call even with no provider mounted — instrumented components degrade to\n * zero-cost no-ops rather than throwing.\n */\nconst TrackerContext = createContext<Tracker>(noopTracker);\n\nexport interface TrackerProviderProps {\n tracker: Tracker;\n children: ReactNode;\n}\n\nexport function TrackerProvider({ tracker, children }: TrackerProviderProps) {\n return (\n <TrackerContext.Provider value={tracker}>\n {children}\n </TrackerContext.Provider>\n );\n}\n\nexport function useTracker(): Tracker {\n return useContext(TrackerContext);\n}\n","import { useCallback, type SyntheticEvent } from 'react';\n\nimport { useTracker } from './context';\n\n/**\n * useInstrumentedClick (W3 §7.6).\n *\n * Wraps a click handler in a `ui.button.click` span. The span's lifecycle\n * follows the handler:\n * - sync handler → span ends `success` immediately (`ui.handler.async=false`)\n * - async handler → span ends when the returned promise settles\n * (`success`/`error`), recording `ui.handler.duration_ms`.\n *\n * Error semantics — the hook observes, never alters control flow:\n * - sync throw → span ends `error`, then the error is RE-THROWN so the\n * caller's try/catch / React error boundary still sees it.\n * - async reject → span ends `error`; the rejection is left ON the original\n * promise so the caller's own `.catch`/awaiter still receives it. The hook\n * attaches a passive observer (it does not consume the rejection).\n *\n * Tracker comes from `useTracker()`, so an unmounted provider = noop = zero\n * behavior change.\n */\nexport interface InstrumentedClickMeta {\n /** Semantic id, e.g. \"onboarding.step1.next\". Highest-priority component.name. */\n telemetryId?: string;\n /** Fallback identity (the component's data-testid). */\n testId?: string;\n /** \"Button\" | \"IconButton\" | \"AIComposeButton\". */\n kind: string;\n variant?: string;\n}\n\nconst SPAN_NAME = 'ui.button.click';\n\nexport function useInstrumentedClick<E extends SyntheticEvent>(\n onClick: ((e: E) => void | Promise<void>) | undefined,\n meta: InstrumentedClickMeta,\n): ((e: E) => void) | undefined {\n const tracker = useTracker();\n const { telemetryId, testId, kind, variant } = meta;\n\n const wrapped = useCallback(\n (e: E) => {\n // Guarded by the return below; the no-op branch is never wired up.\n if (onClick === undefined) return;\n const componentName =\n telemetryId ?? testId ?? `${kind}:${variant ?? 'default'}`;\n const span = tracker.startSpan(SPAN_NAME, {\n 'component.name': componentName,\n 'ui.component.kind': kind,\n 'ui.variant': variant ?? 'default',\n });\n const start =\n typeof performance !== 'undefined' ? performance.now() : Date.now();\n\n let result: void | Promise<void>;\n try {\n result = onClick(e);\n } catch (err) {\n span.setAttribute('ui.handler.async', false);\n span.end('error', err);\n throw err;\n }\n\n if (\n result !== null &&\n typeof result === 'object' &&\n typeof (result as Promise<void>).then === 'function'\n ) {\n span.setAttribute('ui.handler.async', true);\n (result as Promise<void>).then(\n () => {\n const end =\n typeof performance !== 'undefined'\n ? performance.now()\n : Date.now();\n span.setAttribute('ui.handler.duration_ms', end - start);\n span.end('success');\n },\n (err: unknown) => {\n const end =\n typeof performance !== 'undefined'\n ? performance.now()\n : Date.now();\n span.setAttribute('ui.handler.duration_ms', end - start);\n span.end('error', err);\n // Passive observation only: this handler is attached for telemetry\n // and does NOT alter the caller's control flow. The caller's own\n // promise chain (e.g. a mutation's onError, or an awaiter's catch)\n // still receives the rejection independently, because both\n // consumers observe the same promise. We do not re-throw here —\n // doing so would fabricate a NEW, uncatchable unhandled rejection\n // detached from the caller.\n },\n );\n } else {\n span.setAttribute('ui.handler.async', false);\n span.end('success');\n }\n },\n [tracker, onClick, telemetryId, testId, kind, variant],\n );\n\n return onClick === undefined ? undefined : wrapped;\n}\n"],"names":["createContext","useContext","useCallback"],"mappings":";;;AAgCO,MAAM,cAAuB;AAAA,EAClC,WAAW,OAAO,EAAE,cAAc,MAAM;AAAA,EAAC,GAAG,KAAK,MAAM;AAAA,EAAC;EACxD,OAAO,MAAM;AAAA,EAAC;AAChB;ACxBA,MAAM,iBAAiBA,MAAAA,cAAuB,WAAW;AAOlD,SAAS,gBAAgB,EAAE,SAAS,YAAkC;AAC3E,wCACG,eAAe,UAAf,EAAwB,OAAO,SAC7B,UACH;AAEJ;AAEO,SAAS,aAAsB;AACpC,SAAOC,MAAAA,WAAW,cAAc;AAClC;ACKA,MAAM,YAAY;AAEX,SAAS,qBACd,SACA,MAC8B;AAC9B,QAAM,UAAU,WAAA;AAChB,QAAM,EAAE,aAAa,QAAQ,MAAM,YAAY;AAE/C,QAAM,UAAUC,MAAAA;AAAAA,IACd,CAAC,MAAS;AAER,UAAI,YAAY,OAAW;AAC3B,YAAM,gBACJ,eAAe,UAAU,GAAG,IAAI,IAAI,WAAW,SAAS;AAC1D,YAAM,OAAO,QAAQ,UAAU,WAAW;AAAA,QACxC,kBAAkB;AAAA,QAClB,qBAAqB;AAAA,QACrB,cAAc,WAAW;AAAA,MAAA,CAC1B;AACD,YAAM,QACJ,OAAO,gBAAgB,cAAc,YAAY,IAAA,IAAQ,KAAK,IAAA;AAEhE,UAAI;AACJ,UAAI;AACF,iBAAS,QAAQ,CAAC;AAAA,MACpB,SAAS,KAAK;AACZ,aAAK,aAAa,oBAAoB,KAAK;AAC3C,aAAK,IAAI,SAAS,GAAG;AACrB,cAAM;AAAA,MACR;AAEA,UACE,WAAW,QACX,OAAO,WAAW,YAClB,OAAQ,OAAyB,SAAS,YAC1C;AACA,aAAK,aAAa,oBAAoB,IAAI;AACzC,eAAyB;AAAA,UACxB,MAAM;AACJ,kBAAM,MACJ,OAAO,gBAAgB,cACnB,YAAY,IAAA,IACZ,KAAK,IAAA;AACX,iBAAK,aAAa,0BAA0B,MAAM,KAAK;AACvD,iBAAK,IAAI,SAAS;AAAA,UACpB;AAAA,UACA,CAAC,QAAiB;AAChB,kBAAM,MACJ,OAAO,gBAAgB,cACnB,YAAY,IAAA,IACZ,KAAK,IAAA;AACX,iBAAK,aAAa,0BAA0B,MAAM,KAAK;AACvD,iBAAK,IAAI,SAAS,GAAG;AAAA,UAQvB;AAAA,QAAA;AAAA,MAEJ,OAAO;AACL,aAAK,aAAa,oBAAoB,KAAK;AAC3C,aAAK,IAAI,SAAS;AAAA,MACpB;AAAA,IACF;AAAA,IACA,CAAC,SAAS,SAAS,aAAa,QAAQ,MAAM,OAAO;AAAA,EAAA;AAGvD,SAAO,YAAY,SAAY,SAAY;AAC7C;;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@teja-app/ui",
3
- "version": "0.0.13",
3
+ "version": "0.0.14",
4
4
  "description": "Shared UI component library for Teja applications",
5
5
  "author": "Teja App",
6
6
  "license": "MIT",
@@ -39,6 +39,11 @@
39
39
  "import": "./dist/theme/index.js",
40
40
  "require": "./dist/theme/index.cjs"
41
41
  },
42
+ "./instrumentation": {
43
+ "types": "./dist/instrumentation/index.d.ts",
44
+ "import": "./dist/instrumentation/index.js",
45
+ "require": "./dist/instrumentation/index.cjs"
46
+ },
42
47
  "./styles.css": "./dist/ui.css"
43
48
  },
44
49
  "files": [