@jini-ai/ui 0.4.8 → 0.5.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 (44) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/dist/features/charts/browser.d.ts +39 -0
  3. package/dist/features/charts/browser.js +142 -0
  4. package/dist/features/charts/contract.d.ts +223 -0
  5. package/dist/features/charts/contract.js +21 -0
  6. package/dist/features/charts/index.d.ts +5 -0
  7. package/dist/features/charts/index.js +5 -0
  8. package/dist/features/charts/react.d.ts +27 -0
  9. package/dist/features/charts/react.js +73 -0
  10. package/dist/features/charts/registry.d.ts +35 -0
  11. package/dist/features/charts/registry.js +36 -0
  12. package/dist/features/charts/table.d.ts +14 -0
  13. package/dist/features/charts/table.js +60 -0
  14. package/dist/features/charts/wire.d.ts +88 -0
  15. package/dist/features/charts/wire.js +38 -0
  16. package/dist/features/interactive-ui/index.d.ts +3 -18
  17. package/dist/features/interactive-ui/index.js +12 -6
  18. package/dist/features/interactive-ui/interactive-ui.css +1 -1
  19. package/dist/features/interactive-ui/manifests.d.ts +3 -3
  20. package/dist/features/interactive-ui/manifests.js +6 -6
  21. package/dist/features/interactive-ui/registry.d.ts +12 -10
  22. package/dist/features/interactive-ui/registry.js +8 -6
  23. package/dist/styles/variables.css +1 -1
  24. package/package.json +25 -12
  25. package/dist/features/interactive-ui/providers/recharts/bar-chart.d.ts +0 -8
  26. package/dist/features/interactive-ui/providers/recharts/bar-chart.js +0 -12
  27. package/dist/features/interactive-ui/providers/recharts/bar-chart.manifest.d.ts +0 -21
  28. package/dist/features/interactive-ui/providers/recharts/bar-chart.manifest.js +0 -18
  29. package/dist/features/interactive-ui/providers/recharts/chart-config.d.ts +0 -40
  30. package/dist/features/interactive-ui/providers/recharts/chart-config.js +0 -32
  31. package/dist/features/interactive-ui/providers/recharts/chart-tokens.d.ts +0 -49
  32. package/dist/features/interactive-ui/providers/recharts/chart-tokens.js +0 -39
  33. package/dist/features/interactive-ui/providers/recharts/chart.d.ts +0 -31
  34. package/dist/features/interactive-ui/providers/recharts/chart.js +0 -34
  35. package/dist/features/interactive-ui/providers/recharts/index.d.ts +0 -7
  36. package/dist/features/interactive-ui/providers/recharts/index.js +0 -7
  37. package/dist/features/interactive-ui/providers/recharts/line-chart.d.ts +0 -8
  38. package/dist/features/interactive-ui/providers/recharts/line-chart.js +0 -14
  39. package/dist/features/interactive-ui/providers/recharts/line-chart.manifest.d.ts +0 -20
  40. package/dist/features/interactive-ui/providers/recharts/line-chart.manifest.js +0 -17
  41. package/dist/features/interactive-ui/providers/recharts/pie-chart.d.ts +0 -10
  42. package/dist/features/interactive-ui/providers/recharts/pie-chart.js +0 -12
  43. package/dist/features/interactive-ui/providers/recharts/pie-chart.manifest.d.ts +0 -41
  44. package/dist/features/interactive-ui/providers/recharts/pie-chart.manifest.js +0 -15
@@ -0,0 +1,60 @@
1
+ /** Vanilla fallback using the existing native table classes and numeric-column decision owner. */
2
+ import { getNumericColumnKeys } from '../interactive-ui/table-data.js';
3
+ /** Apply only chart tokens; a provider cannot use theme input to style unrelated host chrome. */
4
+ export function applyChartTheme({ element, theme }, _options = {}) {
5
+ for (const key of Array.from(element.style))
6
+ if (key.startsWith('--jini-chart-'))
7
+ element.style.removeProperty(key);
8
+ for (const [key, value] of Object.entries(theme.tokens ?? {})) {
9
+ if (/^--jini-chart-[a-z0-9-]+$/.test(key))
10
+ element.style.setProperty(key, value);
11
+ }
12
+ element.dataset.chartTheme = theme.mode;
13
+ element.classList.toggle('dark', theme.mode === 'dark');
14
+ }
15
+ /** Keep every row/key, including data from unsupported kinds. textContent supplies escaping;
16
+ * never feed agent data to innerHTML. Shared table CSS is already loaded at the admin boundary.
17
+ */
18
+ export function renderChartTable({ element, spec }, _options = {}) {
19
+ const doc = element.ownerDocument;
20
+ const keys = [...new Set([
21
+ ...(spec.categoryKey ? [spec.categoryKey] : []), ...spec.series.map(({ key }) => key), ...spec.data.flatMap(Object.keys),
22
+ ])];
23
+ const columns = keys.map((key) => ({ key, label: spec.series.find((series) => series.key === key)?.label ?? key }));
24
+ const numeric = getNumericColumnKeys({ columns, rows: spec.data });
25
+ const scroll = doc.createElement('div');
26
+ scroll.className = 'jini-data-table-scroll';
27
+ const table = doc.createElement('table');
28
+ table.className = 'jini-data-table';
29
+ const caption = table.createCaption();
30
+ caption.textContent = spec.title ?? 'Chart data';
31
+ const header = table.createTHead().insertRow();
32
+ for (const { key, label } of columns) {
33
+ const cell = doc.createElement('th');
34
+ cell.scope = 'col';
35
+ cell.textContent = label;
36
+ cell.dataset.numeric = String(numeric.has(key));
37
+ header.append(cell);
38
+ }
39
+ const body = table.createTBody();
40
+ for (const row of spec.data) {
41
+ const tr = body.insertRow();
42
+ for (const { key } of columns) {
43
+ const cell = tr.insertCell();
44
+ const value = row[key];
45
+ cell.textContent = value == null ? '' : typeof value === 'object' ? JSON.stringify(value) : String(value);
46
+ cell.dataset.numeric = String(numeric.has(key));
47
+ }
48
+ }
49
+ if (spec.data.length === 0) {
50
+ const cell = body.insertRow().insertCell();
51
+ cell.colSpan = Math.max(1, columns.length);
52
+ cell.className = 'jini-data-table-empty';
53
+ cell.textContent = 'No results.';
54
+ }
55
+ scroll.append(table);
56
+ element.className = 'jini-data-table-frame';
57
+ element.dataset.tableProvider = 'native';
58
+ element.replaceChildren(scroll);
59
+ }
60
+ //# sourceMappingURL=table.js.map
@@ -0,0 +1,88 @@
1
+ /** The existing wire schemas remain core-owned, even when no chart plugin is enabled. */
2
+ import { z } from 'zod';
3
+ import type { InteractiveComponentManifest } from '../interactive-ui/types.js';
4
+ import { type ChartSpec } from './contract.js';
5
+ /** Same passthrough/record reasoning as native data-table: A2UI action bindings and extra row data
6
+ * belong to the wire protocol, not a renderer. Retain their established shapes during extraction. */
7
+ export declare const rechartsBarChartPropsSchema: z.ZodObject<{
8
+ data: z.ZodArray<z.ZodRecord<z.ZodString, z.ZodUnknown>, "many">;
9
+ categoryKey: z.ZodString;
10
+ valueKey: z.ZodString;
11
+ color: z.ZodOptional<z.ZodString>;
12
+ }, "passthrough", z.ZodTypeAny, z.objectOutputType<{
13
+ data: z.ZodArray<z.ZodRecord<z.ZodString, z.ZodUnknown>, "many">;
14
+ categoryKey: z.ZodString;
15
+ valueKey: z.ZodString;
16
+ color: z.ZodOptional<z.ZodString>;
17
+ }, z.ZodTypeAny, "passthrough">, z.objectInputType<{
18
+ data: z.ZodArray<z.ZodRecord<z.ZodString, z.ZodUnknown>, "many">;
19
+ categoryKey: z.ZodString;
20
+ valueKey: z.ZodString;
21
+ color: z.ZodOptional<z.ZodString>;
22
+ }, z.ZodTypeAny, "passthrough">>;
23
+ export declare const rechartsLineChartPropsSchema: z.ZodObject<{
24
+ data: z.ZodArray<z.ZodRecord<z.ZodString, z.ZodUnknown>, "many">;
25
+ categoryKey: z.ZodString;
26
+ valueKey: z.ZodString;
27
+ color: z.ZodOptional<z.ZodString>;
28
+ }, "passthrough", z.ZodTypeAny, z.objectOutputType<{
29
+ data: z.ZodArray<z.ZodRecord<z.ZodString, z.ZodUnknown>, "many">;
30
+ categoryKey: z.ZodString;
31
+ valueKey: z.ZodString;
32
+ color: z.ZodOptional<z.ZodString>;
33
+ }, z.ZodTypeAny, "passthrough">, z.objectInputType<{
34
+ data: z.ZodArray<z.ZodRecord<z.ZodString, z.ZodUnknown>, "many">;
35
+ categoryKey: z.ZodString;
36
+ valueKey: z.ZodString;
37
+ color: z.ZodOptional<z.ZodString>;
38
+ }, z.ZodTypeAny, "passthrough">>;
39
+ export declare const rechartsPieChartPropsSchema: z.ZodObject<{
40
+ data: z.ZodArray<z.ZodObject<{
41
+ name: z.ZodString;
42
+ value: z.ZodNumber;
43
+ }, "passthrough", z.ZodTypeAny, z.objectOutputType<{
44
+ name: z.ZodString;
45
+ value: z.ZodNumber;
46
+ }, z.ZodTypeAny, "passthrough">, z.objectInputType<{
47
+ name: z.ZodString;
48
+ value: z.ZodNumber;
49
+ }, z.ZodTypeAny, "passthrough">>, "many">;
50
+ color: z.ZodOptional<z.ZodString>;
51
+ }, "passthrough", z.ZodTypeAny, z.objectOutputType<{
52
+ data: z.ZodArray<z.ZodObject<{
53
+ name: z.ZodString;
54
+ value: z.ZodNumber;
55
+ }, "passthrough", z.ZodTypeAny, z.objectOutputType<{
56
+ name: z.ZodString;
57
+ value: z.ZodNumber;
58
+ }, z.ZodTypeAny, "passthrough">, z.objectInputType<{
59
+ name: z.ZodString;
60
+ value: z.ZodNumber;
61
+ }, z.ZodTypeAny, "passthrough">>, "many">;
62
+ color: z.ZodOptional<z.ZodString>;
63
+ }, z.ZodTypeAny, "passthrough">, z.objectInputType<{
64
+ data: z.ZodArray<z.ZodObject<{
65
+ name: z.ZodString;
66
+ value: z.ZodNumber;
67
+ }, "passthrough", z.ZodTypeAny, z.objectOutputType<{
68
+ name: z.ZodString;
69
+ value: z.ZodNumber;
70
+ }, z.ZodTypeAny, "passthrough">, z.objectInputType<{
71
+ name: z.ZodString;
72
+ value: z.ZodNumber;
73
+ }, z.ZodTypeAny, "passthrough">>, "many">;
74
+ color: z.ZodOptional<z.ZodString>;
75
+ }, z.ZodTypeAny, "passthrough">>;
76
+ export declare const rechartsBarChartManifest: InteractiveComponentManifest;
77
+ export declare const rechartsLineChartManifest: InteractiveComponentManifest;
78
+ export declare const rechartsPieChartManifest: InteractiveComponentManifest;
79
+ export declare const chartWireManifests: readonly [InteractiveComponentManifest, InteractiveComponentManifest, InteractiveComponentManifest];
80
+ /** Convert validated legacy props to the neutral contract; optional provider overrides stay data.
81
+ * @example legacyChartSpec({ kind: 'pie', props: { data: [{ name: 'A', value: 2 }] } })
82
+ * @throws ZodError for an invalid wire shape or nonserializable row data.
83
+ */
84
+ export declare function legacyChartSpec({ kind, props }: {
85
+ kind: 'bar' | 'line' | 'pie';
86
+ props: Record<string, unknown>;
87
+ }, _options?: Record<string, never>): ChartSpec;
88
+ //# sourceMappingURL=wire.d.ts.map
@@ -0,0 +1,38 @@
1
+ /** The existing wire schemas remain core-owned, even when no chart plugin is enabled. */
2
+ import { z } from 'zod';
3
+ import { chartSpecSchema } from './contract.js';
4
+ /** Same passthrough/record reasoning as native data-table: A2UI action bindings and extra row data
5
+ * belong to the wire protocol, not a renderer. Retain their established shapes during extraction. */
6
+ export const rechartsBarChartPropsSchema = z.object({
7
+ data: z.array(z.record(z.unknown())).min(1), categoryKey: z.string(), valueKey: z.string(), color: z.string().optional(),
8
+ }).passthrough();
9
+ export const rechartsLineChartPropsSchema = rechartsBarChartPropsSchema;
10
+ export const rechartsPieChartPropsSchema = z.object({
11
+ data: z.array(z.object({ name: z.string(), value: z.number() }).passthrough()).min(1), color: z.string().optional(),
12
+ }).passthrough();
13
+ export const rechartsBarChartManifest = {
14
+ id: 'recharts.bar-chart', provider: 'core.table', capabilities: ['chart', 'bar-chart', 'graph'],
15
+ propsSchema: rechartsBarChartPropsSchema, description: 'Bar chart: one categorical axis and one numeric value per bar. Uses an enabled chart provider or a styled data table.',
16
+ };
17
+ export const rechartsLineChartManifest = {
18
+ id: 'recharts.line-chart', provider: 'core.table', capabilities: ['chart', 'line-chart', 'graph'],
19
+ propsSchema: rechartsLineChartPropsSchema, description: 'Line chart: one categorical axis and one numeric value per point. Uses an enabled chart provider or a styled data table.',
20
+ };
21
+ export const rechartsPieChartManifest = {
22
+ id: 'recharts.pie-chart', provider: 'core.table', capabilities: ['chart', 'pie-chart', 'graph'],
23
+ propsSchema: rechartsPieChartPropsSchema, description: 'Pie chart: named, weighted slices. Uses an enabled chart provider or a styled data table.',
24
+ };
25
+ export const chartWireManifests = [rechartsBarChartManifest, rechartsLineChartManifest, rechartsPieChartManifest];
26
+ /** Convert validated legacy props to the neutral contract; optional provider overrides stay data.
27
+ * @example legacyChartSpec({ kind: 'pie', props: { data: [{ name: 'A', value: 2 }] } })
28
+ * @throws ZodError for an invalid wire shape or nonserializable row data.
29
+ */
30
+ export function legacyChartSpec({ kind, props }, _options = {}) {
31
+ const parsed = (kind === 'pie' ? rechartsPieChartPropsSchema : rechartsBarChartPropsSchema).parse(props);
32
+ return chartSpecSchema.parse({
33
+ kind, data: parsed.data, categoryKey: kind === 'pie' ? 'name' : parsed.categoryKey,
34
+ series: [{ key: kind === 'pie' ? 'value' : parsed.valueKey, ...(parsed.color !== undefined ? { color: parsed.color } : {}) }],
35
+ ...(typeof parsed.provider === 'string' ? { provider: parsed.provider } : {}),
36
+ });
37
+ }
38
+ //# sourceMappingURL=wire.js.map
@@ -2,22 +2,7 @@ export type { InteractiveComponentManifest } from './types.js';
2
2
  export { InteractiveUiRegistry, type InteractiveComponentEntry } from './registry.js';
3
3
  export { nativeDataTableManifest, nativeDataTablePropsSchema, DataTable as NativeDataTable } from './providers/native/index.js';
4
4
  export { shadcnDataTableManifest, shadcnDataTablePropsSchema, DataTable as ShadcnDataTable, shadcnButtonManifest, shadcnButtonPropsSchema, ActionButton, shadcnCheckboxManifest, shadcnCheckboxPropsSchema, CheckboxField, shadcnRadioGroupManifest, shadcnRadioGroupPropsSchema, RadioGroupField, shadcnTextInputManifest, shadcnTextInputPropsSchema, TextInputField, shadcnSelectManifest, shadcnSelectPropsSchema, SelectField, shadcnCardManifest, shadcnCardPropsSchema, ContentCard, } from './providers/shadcn/index.js';
5
- export { rechartsBarChartManifest, rechartsBarChartPropsSchema, BarChart, rechartsLineChartManifest, rechartsLineChartPropsSchema, LineChart, rechartsPieChartManifest, rechartsPieChartPropsSchema, PieChart, } from './providers/recharts/index.js';
6
- import { InteractiveUiRegistry } from './registry.js';
7
- /**
8
- * Every provider currently registered, shadcn preferred over the dependency-free native fallback
9
- * for `data-table`/`table` — the same order `manifests.ts`'s `ALL_MANIFESTS` declares, so a
10
- * search result's rank and this registry's fallback order never disagree. A future provider
11
- * that only *some* consumers want (e.g. one with a heavier runtime dependency) should be added
12
- * with `.register()` by that consumer instead of appearing here unconditionally.
13
- *
14
- * Each `Component` is cast to `ComponentType<Record<string, unknown>>` — same reasoning as
15
- * `a2ui/catalog.ts`'s `ComponentSpec.propsSchema` doc: a concrete component's actual prop type is
16
- * narrower than a bare record (required `columns`/`rows`), and TypeScript is correctly
17
- * contravariant about that mismatch. The registry's own `propsSchema` (validated before a host
18
- * ever spreads wire props into one of these) is what actually guarantees the shape at the
19
- * boundary that matters — this cast doesn't weaken that, it only widens a type this file cannot
20
- * make TypeScript accept structurally.
21
- */
22
- export declare const DEFAULT_INTERACTIVE_UI_REGISTRY: InteractiveUiRegistry;
5
+ export { rechartsBarChartManifest, rechartsBarChartPropsSchema, rechartsLineChartManifest, rechartsLineChartPropsSchema, rechartsPieChartManifest, rechartsPieChartPropsSchema, } from '../charts/wire.js';
6
+ import { InteractiveUiRegistry, type InteractiveComponentEntry } from './registry.js';
7
+ export declare const DEFAULT_INTERACTIVE_UI_REGISTRY: InteractiveUiRegistry<InteractiveComponentEntry<Record<string, unknown>>>;
23
8
  //# sourceMappingURL=index.d.ts.map
@@ -1,11 +1,13 @@
1
1
  export { InteractiveUiRegistry } from './registry.js';
2
2
  export { nativeDataTableManifest, nativeDataTablePropsSchema, DataTable as NativeDataTable } from './providers/native/index.js';
3
3
  export { shadcnDataTableManifest, shadcnDataTablePropsSchema, DataTable as ShadcnDataTable, shadcnButtonManifest, shadcnButtonPropsSchema, ActionButton, shadcnCheckboxManifest, shadcnCheckboxPropsSchema, CheckboxField, shadcnRadioGroupManifest, shadcnRadioGroupPropsSchema, RadioGroupField, shadcnTextInputManifest, shadcnTextInputPropsSchema, TextInputField, shadcnSelectManifest, shadcnSelectPropsSchema, SelectField, shadcnCardManifest, shadcnCardPropsSchema, ContentCard, } from './providers/shadcn/index.js';
4
- export { rechartsBarChartManifest, rechartsBarChartPropsSchema, BarChart, rechartsLineChartManifest, rechartsLineChartPropsSchema, LineChart, rechartsPieChartManifest, rechartsPieChartPropsSchema, PieChart, } from './providers/recharts/index.js';
4
+ export { rechartsBarChartManifest, rechartsBarChartPropsSchema, rechartsLineChartManifest, rechartsLineChartPropsSchema, rechartsPieChartManifest, rechartsPieChartPropsSchema, } from '../charts/wire.js';
5
5
  import { InteractiveUiRegistry } from './registry.js';
6
6
  import { nativeDataTableManifest, DataTable as NativeDataTable } from './providers/native/index.js';
7
7
  import { shadcnDataTableManifest, DataTable as ShadcnDataTable, shadcnButtonManifest, ActionButton, shadcnCheckboxManifest, CheckboxField, shadcnRadioGroupManifest, RadioGroupField, shadcnTextInputManifest, TextInputField, shadcnSelectManifest, SelectField, shadcnCardManifest, ContentCard, } from './providers/shadcn/index.js';
8
- import { rechartsBarChartManifest, BarChart, rechartsLineChartManifest, LineChart, rechartsPieChartManifest, PieChart, } from './providers/recharts/index.js';
8
+ import { createChartProviderRegistry } from '../charts/registry.js';
9
+ import { createChartInteractiveRegistry } from '../charts/react.js';
10
+ import { chartWireManifests } from '../charts/wire.js';
9
11
  /**
10
12
  * Every provider currently registered, shadcn preferred over the dependency-free native fallback
11
13
  * for `data-table`/`table` — the same order `manifests.ts`'s `ALL_MANIFESTS` declares, so a
@@ -21,7 +23,7 @@ import { rechartsBarChartManifest, BarChart, rechartsLineChartManifest, LineChar
21
23
  * boundary that matters — this cast doesn't weaken that, it only widens a type this file cannot
22
24
  * make TypeScript accept structurally.
23
25
  */
24
- export const DEFAULT_INTERACTIVE_UI_REGISTRY = new InteractiveUiRegistry({ entries: [
26
+ const nonChartRegistry = new InteractiveUiRegistry({ entries: [
25
27
  { ...shadcnDataTableManifest, Component: ShadcnDataTable },
26
28
  { ...nativeDataTableManifest, Component: NativeDataTable },
27
29
  { ...shadcnButtonManifest, Component: ActionButton },
@@ -30,8 +32,12 @@ export const DEFAULT_INTERACTIVE_UI_REGISTRY = new InteractiveUiRegistry({ entri
30
32
  { ...shadcnTextInputManifest, Component: TextInputField },
31
33
  { ...shadcnSelectManifest, Component: SelectField },
32
34
  { ...shadcnCardManifest, Component: ContentCard },
33
- { ...rechartsBarChartManifest, Component: BarChart },
34
- { ...rechartsLineChartManifest, Component: LineChart },
35
- { ...rechartsPieChartManifest, Component: PieChart },
35
+ ] });
36
+ // Charts retain their wire IDs and validation while an unconfigured host renders the core table.
37
+ // Runtime providers belong to the host's admitted boot snapshot, never to the default registry.
38
+ const chartHosts = createChartInteractiveRegistry({ registry: nonChartRegistry, providers: createChartProviderRegistry({ providers: [] }) });
39
+ export const DEFAULT_INTERACTIVE_UI_REGISTRY = new InteractiveUiRegistry({ entries: [
40
+ ...nonChartRegistry.list(),
41
+ ...chartWireManifests.map(({ id }) => chartHosts.resolveById({ id })),
36
42
  ] });
37
43
  //# sourceMappingURL=index.js.map
@@ -1,2 +1,2 @@
1
1
  /*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */
2
- @layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-space-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0}}}:root,[data-admin-theme],[data-color-scheme=light]{color-scheme:light;--jini-bg:var(--jini-theme-light-bg,#fff);--jini-surface:var(--jini-theme-light-surface,#f5f5f5);--jini-text:var(--jini-theme-light-text,#202020);--jini-muted:var(--jini-theme-light-muted,#666);--jini-border:var(--jini-theme-light-border,#d9d9d9);--jini-primary:var(--jini-theme-light-primary,#363636);--jini-primary-ink:var(--jini-theme-light-primary-ink,#fff);--jini-danger:var(--jini-theme-light-danger,#b42318);--jini-success:var(--jini-theme-light-success,#18763b);--jini-warning:var(--jini-theme-light-warning,#845800)}[data-color-scheme=dark]{color-scheme:dark;--jini-bg:var(--jini-theme-dark-bg,#171717);--jini-surface:var(--jini-theme-dark-surface,#242424);--jini-text:var(--jini-theme-dark-text,#f0f0f0);--jini-muted:var(--jini-theme-dark-muted,#b3b3b3);--jini-border:var(--jini-theme-dark-border,#454545);--jini-primary:var(--jini-theme-dark-primary,#e0e0e0);--jini-primary-ink:var(--jini-theme-dark-primary-ink,#202020);--jini-danger:var(--jini-theme-dark-danger,#ff8b80);--jini-success:var(--jini-theme-dark-success,#79d69b);--jini-warning:var(--jini-theme-dark-warning,#ebc36b)}:root,[data-color-scheme=light],[data-theme=light]{--jini-chart-default-1:oklch(55.29% .1129 43.4);--jini-chart-default-2:oklch(50% .11 240);--jini-chart-default-3:oklch(64% .13 88);--jini-chart-default-4:oklch(58% .15 350);--jini-chart-default-5:oklch(50% .11 155);--jini-chart-default-6:oklch(48% .12 295)}[data-color-scheme=dark],[data-theme=dark]{--jini-chart-default-1:oklch(62% .11 44);--jini-chart-default-2:oklch(64% .11 240);--jini-chart-default-3:oklch(66% .13 88);--jini-chart-default-4:oklch(65% .14 350);--jini-chart-default-5:oklch(56% .12 155);--jini-chart-default-6:oklch(64% .12 295)}:root{--jini-font-body:system-ui, sans-serif;--jini-font-heading:system-ui, sans-serif;--jini-font-mono:ui-monospace, monospace;--jini-radius:8px;--jini-density:1}:root,[data-admin-theme],[data-color-scheme]{--jini-bg-panel:var(--jini-surface);--jini-bg-subtle:var(--jini-surface)}@supports (color:color-mix(in lab, red, red)){:root,[data-admin-theme],[data-color-scheme]{--jini-bg-subtle:color-mix(in srgb, var(--jini-surface) 75%, var(--jini-bg))}}:root,[data-admin-theme],[data-color-scheme]{--jini-bg-elevated:var(--jini-surface);--jini-border-soft:var(--jini-border);--jini-border-strong:var(--jini-border)}@supports (color:color-mix(in lab, red, red)){:root,[data-admin-theme],[data-color-scheme]{--jini-border-strong:color-mix(in srgb, var(--jini-border) 75%, var(--jini-text))}}:root,[data-admin-theme],[data-color-scheme]{--jini-backdrop:var(--jini-text)}@supports (color:color-mix(in lab, red, red)){:root,[data-admin-theme],[data-color-scheme]{--jini-backdrop:color-mix(in srgb, var(--jini-text) 42%, transparent)}}:root,[data-admin-theme],[data-color-scheme]{--jini-text-strong:var(--jini-text);--jini-text-secondary:var(--jini-text)}@supports (color:color-mix(in lab, red, red)){:root,[data-admin-theme],[data-color-scheme]{--jini-text-secondary:color-mix(in srgb, var(--jini-text) 80%, var(--jini-bg))}}:root,[data-admin-theme],[data-color-scheme]{--jini-text-muted:var(--jini-muted);--jini-text-faint:var(--jini-muted)}@supports (color:color-mix(in lab, red, red)){:root,[data-admin-theme],[data-color-scheme]{--jini-text-faint:color-mix(in srgb, var(--jini-muted) 75%, var(--jini-bg))}}:root,[data-admin-theme],[data-color-scheme]{--jini-text-disabled:var(--jini-muted)}@supports (color:color-mix(in lab, red, red)){:root,[data-admin-theme],[data-color-scheme]{--jini-text-disabled:color-mix(in srgb, var(--jini-muted) 60%, var(--jini-bg))}}:root,[data-admin-theme],[data-color-scheme]{--jini-accent:var(--jini-primary);--jini-accent-hover:var(--jini-primary)}@supports (color:color-mix(in lab, red, red)){:root,[data-admin-theme],[data-color-scheme]{--jini-accent-hover:color-mix(in srgb, var(--jini-primary) 88%, var(--jini-text))}}:root,[data-admin-theme],[data-color-scheme]{--jini-accent-strong:var(--jini-primary)}@supports (color:color-mix(in lab, red, red)){:root,[data-admin-theme],[data-color-scheme]{--jini-accent-strong:color-mix(in srgb, var(--jini-primary) 85%, var(--jini-bg))}}:root,[data-admin-theme],[data-color-scheme]{--jini-accent-ink:var(--jini-primary-ink);--jini-accent-soft:var(--jini-primary)}@supports (color:color-mix(in lab, red, red)){:root,[data-admin-theme],[data-color-scheme]{--jini-accent-soft:color-mix(in srgb, var(--jini-primary) 10%, transparent)}}:root,[data-admin-theme],[data-color-scheme]{--jini-accent-ring:var(--jini-primary)}@supports (color:color-mix(in lab, red, red)){:root,[data-admin-theme],[data-color-scheme]{--jini-accent-ring:color-mix(in srgb, var(--jini-primary) 22%, transparent)}}:root,[data-admin-theme],[data-color-scheme]{--jini-neutral-accent:var(--jini-text);--jini-neutral-accent-hover:var(--jini-muted);--jini-neutral-accent-ink:var(--jini-bg);--jini-neutral-accent-text:var(--jini-text);--jini-neutral-accent-soft:var(--jini-text)}@supports (color:color-mix(in lab, red, red)){:root,[data-admin-theme],[data-color-scheme]{--jini-neutral-accent-soft:color-mix(in srgb, var(--jini-text) 7%, transparent)}}:root,[data-admin-theme],[data-color-scheme]{--jini-neutral-accent-ring:var(--jini-text)}@supports (color:color-mix(in lab, red, red)){:root,[data-admin-theme],[data-color-scheme]{--jini-neutral-accent-ring:color-mix(in srgb, var(--jini-text) 16%, transparent)}}:root,[data-admin-theme],[data-color-scheme]{--jini-link:var(--jini-primary);--jini-link-ink:var(--jini-primary-ink);--jini-success-bg:var(--jini-success)}@supports (color:color-mix(in lab, red, red)){:root,[data-admin-theme],[data-color-scheme]{--jini-success-bg:color-mix(in srgb, var(--jini-success) 12%, var(--jini-bg))}}:root,[data-admin-theme],[data-color-scheme]{--jini-success-solid:var(--jini-success);--jini-success-solid-ink:var(--jini-bg);--jini-danger-bg:var(--jini-danger)}@supports (color:color-mix(in lab, red, red)){:root,[data-admin-theme],[data-color-scheme]{--jini-danger-bg:color-mix(in srgb, var(--jini-danger) 12%, var(--jini-bg))}}:root,[data-admin-theme],[data-color-scheme]{--jini-warning-bg:var(--jini-warning)}@supports (color:color-mix(in lab, red, red)){:root,[data-admin-theme],[data-color-scheme]{--jini-warning-bg:color-mix(in srgb, var(--jini-warning) 12%, var(--jini-bg))}}:root,[data-admin-theme],[data-color-scheme]{--jini-font-ui:var(--jini-font-body);--jini-font-display:var(--jini-font-heading);--jini-shadow-xs:0 1px 0 var(--jini-text)}@supports (color:color-mix(in lab, red, red)){:root,[data-admin-theme],[data-color-scheme]{--jini-shadow-xs:0 1px 0 color-mix(in srgb, var(--jini-text) 4%, transparent)}}:root,[data-admin-theme],[data-color-scheme]{--jini-shadow-sm:0 1px 3px var(--jini-text)}@supports (color:color-mix(in lab, red, red)){:root,[data-admin-theme],[data-color-scheme]{--jini-shadow-sm:0 1px 3px color-mix(in srgb, var(--jini-text) 10%, transparent)}}:root,[data-admin-theme],[data-color-scheme]{--jini-shadow-md:0 6px 24px var(--jini-text)}@supports (color:color-mix(in lab, red, red)){:root,[data-admin-theme],[data-color-scheme]{--jini-shadow-md:0 6px 24px color-mix(in srgb, var(--jini-text) 15%, transparent)}}:root,[data-admin-theme],[data-color-scheme]{--jini-shadow-lg:0 24px 60px var(--jini-text)}@supports (color:color-mix(in lab, red, red)){:root,[data-admin-theme],[data-color-scheme]{--jini-shadow-lg:0 24px 60px color-mix(in srgb, var(--jini-text) 22%, transparent)}}:root,[data-admin-theme],[data-color-scheme]{--jini-radius-xs:calc(var(--jini-radius) * .5);--jini-radius-sm:calc(var(--jini-radius) * .75);--jini-radius-md:calc(var(--jini-radius) * 1.25);--jini-radius-lg:calc(var(--jini-radius) * 1.5);--jini-radius-pill:999px;--jini-space-1:calc(.25rem * var(--jini-density));--jini-space-2:calc(.5rem * var(--jini-density));--jini-space-3:calc(.75rem * var(--jini-density));--jini-space-4:calc(1rem * var(--jini-density));--jini-space-5:calc(1.25rem * var(--jini-density));--jini-space-6:calc(1.5rem * var(--jini-density));--jini-space-7:calc(2rem * var(--jini-density));--jini-space-8:calc(2.5rem * var(--jini-density));--jini-font-size-2xs:.6875rem;--jini-font-size-xs:.75rem;--jini-font-size-sm:.8125rem;--jini-font-size-base:.875rem;--jini-font-size-md:.95rem;--jini-font-size-lg:1.05rem;--jini-font-size-xl:1.65rem;--jini-font-weight-normal:400;--jini-font-weight-medium:500;--jini-font-weight-semibold:600;--jini-font-weight-bold:700;--jini-line-tight:1.25;--jini-line-normal:1.5;--jini-line-relaxed:1.7;--jini-duration-fast:.12s;--jini-duration-base:.2s;--jini-duration-slow:.32s;--jini-ease-out:cubic-bezier(.23, 1, .32, 1);--jini-ease-in-out:cubic-bezier(.4, 0, .2, 1);--jini-transition-base:var(--jini-duration-base) var(--jini-ease-out);--jini-z-dropdown:100;--jini-z-sticky:200;--jini-z-overlay:300;--jini-z-modal:400;--jini-z-toast:500;--jini-modal-padding:24px;--jini-sidebar-width:240px}@layer theme{:root,:host{--spacing:.25rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--font-weight-medium:500;--font-weight-semibold:600;--tracking-tight:-.025em;--radius-sm:.25rem;--radius-md:.375rem;--radius-xl:.75rem;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1)}}@layer base,components;@layer utilities{.invisible{visibility:hidden}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.sticky{position:sticky}.right-2{right:calc(var(--spacing) * 2)}.z-50{z-index:50}.container{width:100%}@media (min-width:40rem){.container{max-width:40rem}}@media (min-width:48rem){.container{max-width:48rem}}@media (min-width:64rem){.container{max-width:64rem}}@media (min-width:80rem){.container{max-width:80rem}}@media (min-width:96rem){.container{max-width:96rem}}.-mx-1{margin-inline:calc(var(--spacing) * -1)}.my-1{margin-block:var(--spacing)}.mt-4{margin-top:calc(var(--spacing) * 4)}.block{display:block}.flex{display:flex}.grid{display:grid}.inline-flex{display:inline-flex}.table{display:table}.table-caption{display:table-caption}.table-cell{display:table-cell}.table-row{display:table-row}.aspect-square{aspect-ratio:1}.h-3\.5{height:calc(var(--spacing) * 3.5)}.h-4{height:calc(var(--spacing) * 4)}.h-8{height:calc(var(--spacing) * 8)}.h-9{height:calc(var(--spacing) * 9)}.h-10{height:calc(var(--spacing) * 10)}.h-\[var\(--radix-select-trigger-height\)\]{height:var(--radix-select-trigger-height)}.h-px{height:1px}.max-h-\[--radix-select-content-available-height\]{max-height:--radix-select-content-available-height}.w-3\.5{width:calc(var(--spacing) * 3.5)}.w-4{width:calc(var(--spacing) * 4)}.w-9{width:calc(var(--spacing) * 9)}.w-full{width:100%}.min-w-\[8rem\]{min-width:8rem}.min-w-\[var\(--radix-select-trigger-width\)\]{min-width:var(--radix-select-trigger-width)}.shrink-0{flex-shrink:0}.caption-bottom{caption-side:bottom}.origin-\[--radix-select-content-transform-origin\]{transform-origin:--radix-select-content-transform-origin}.cursor-default{cursor:default}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.place-content-center{place-content:center}.items-center{align-items:center}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-2{gap:calc(var(--spacing) * 2)}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1.5) * calc(1 - var(--tw-space-y-reverse)))}.overflow-x-auto{overflow-x:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:var(--jini-radius)}.rounded-full{border-radius:3.40282e38px}.rounded-md{border-radius:var(--radius-md)}.rounded-sm{border-radius:var(--radius-sm)}.rounded-xl{border-radius:var(--radius-xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-input{border-color:var(--jini-border)}.border-primary{border-color:var(--jini-primary)}.bg-background{background-color:var(--jini-bg)}.bg-destructive{background-color:var(--jini-danger)}.bg-muted,.bg-muted\/50{background-color:var(--jini-surface)}@supports (color:color-mix(in lab, red, red)){.bg-muted\/50{background-color:color-mix(in oklab, var(--jini-surface) 50%, transparent)}}.bg-primary{background-color:var(--jini-primary)}.bg-secondary{background-color:var(--jini-surface)}.bg-transparent{background-color:#0000}.fill-primary{fill:var(--jini-primary)}.p-1{padding:var(--spacing)}.p-2{padding:calc(var(--spacing) * 2)}.p-6{padding:calc(var(--spacing) * 6)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-8{padding-inline:calc(var(--spacing) * 8)}.py-1{padding-block:var(--spacing)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.pt-0{padding-top:0}.pr-8{padding-right:calc(var(--spacing) * 8)}.pl-2{padding-left:calc(var(--spacing) * 2)}.text-left{text-align:left}.align-middle{vertical-align:middle}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.leading-none{--tw-leading:1;line-height:1}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.whitespace-nowrap{white-space:nowrap}.text-current{color:currentColor}.text-destructive-foreground{color:var(--jini-bg)}.text-foreground{color:var(--jini-text)}.text-input{color:var(--jini-border)}.text-muted-foreground{color:var(--jini-muted)}.text-primary{color:var(--jini-primary)}.text-primary-foreground{color:var(--jini-primary-ink)}.text-secondary-foreground{color:var(--jini-text)}.underline-offset-4{text-underline-offset:4px}.opacity-50{opacity:.5}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-offset-background{--tw-ring-offset-color:var(--jini-bg)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.peer-disabled\:cursor-not-allowed:is(:where(.peer):disabled~*){cursor:not-allowed}.peer-disabled\:opacity-70:is(:where(.peer):disabled~*){opacity:.7}.file\:border-0::file-selector-button{border-style:var(--tw-border-style);border-width:0}.file\:bg-transparent::file-selector-button{background-color:#0000}.file\:text-sm::file-selector-button{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.file\:font-medium::file-selector-button{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.file\:text-foreground::file-selector-button{color:var(--jini-text)}.placeholder\:text-muted-foreground::placeholder{color:var(--jini-muted)}@media (hover:hover){.hover\:bg-accent:hover{background-color:var(--jini-surface)}.hover\:bg-destructive\/90:hover{background-color:var(--jini-danger)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-destructive\/90:hover{background-color:color-mix(in oklab, var(--jini-danger) 90%, transparent)}}.hover\:bg-muted\/50:hover{background-color:var(--jini-surface)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-muted\/50:hover{background-color:color-mix(in oklab, var(--jini-surface) 50%, transparent)}}.hover\:bg-primary\/90:hover{background-color:var(--jini-primary)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-primary\/90:hover{background-color:color-mix(in oklab, var(--jini-primary) 90%, transparent)}}.hover\:bg-secondary\/80:hover{background-color:var(--jini-surface)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-secondary\/80:hover{background-color:color-mix(in oklab, var(--jini-surface) 80%, transparent)}}.hover\:text-accent-foreground:hover{color:var(--jini-text)}.hover\:underline:hover{text-decoration-line:underline}}.focus\:bg-accent:focus{background-color:var(--jini-surface)}.focus\:text-accent-foreground:focus{color:var(--jini-text)}.focus\:ring-1:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus\:ring-ring:focus{--tw-ring-color:var(--jini-primary)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.focus-visible\:ring-1:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus-visible\:ring-ring:focus-visible{--tw-ring-color:var(--jini-primary)}.focus-visible\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}.has-aria-expanded\:bg-muted\/50:has([aria-expanded=true]){background-color:var(--jini-surface)}@supports (color:color-mix(in lab, red, red)){.has-aria-expanded\:bg-muted\/50:has([aria-expanded=true]){background-color:color-mix(in oklab, var(--jini-surface) 50%, transparent)}}.data-\[disabled\]\:pointer-events-none[data-disabled]{pointer-events:none}.data-\[disabled\]\:opacity-50[data-disabled]{opacity:.5}.data-\[placeholder\]\:text-muted-foreground[data-placeholder]{color:var(--jini-muted)}.data-\[side\=bottom\]\:translate-y-1[data-side=bottom]{--tw-translate-y:var(--spacing);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=left\]\:-translate-x-1[data-side=left]{--tw-translate-x:calc(var(--spacing) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=right\]\:translate-x-1[data-side=right]{--tw-translate-x:var(--spacing);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=top\]\:-translate-y-1[data-side=top]{--tw-translate-y:calc(var(--spacing) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[state\=checked\]\:bg-primary[data-state=checked]{background-color:var(--jini-primary)}.data-\[state\=checked\]\:text-primary-foreground[data-state=checked]{color:var(--jini-primary-ink)}.data-\[state\=selected\]\:bg-muted[data-state=selected]{background-color:var(--jini-surface)}@media (min-width:48rem){.md\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}}.\[\&_svg\]\:pointer-events-none svg{pointer-events:none}.\[\&_svg\]\:size-4 svg{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.\[\&_svg\]\:shrink-0 svg{flex-shrink:0}.\[\&_tr\]\:border-b tr{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.\[\&_tr\:last-child\]\:border-0 tr:last-child{border-style:var(--tw-border-style);border-width:0}.\[\&\:has\(\[role\=checkbox\]\)\]\:pr-0:has([role=checkbox]){padding-right:0}.\[\&\>span\]\:line-clamp-1>span{-webkit-line-clamp:1;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.\[\&\>tr\]\:last\:border-b-0>tr:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}}.jini-data-table-frame{border:1px solid var(--jini-border);border-radius:var(--jini-radius);background:var(--jini-bg);min-width:0;max-width:100%;color:var(--jini-text);overflow:hidden}.jini-data-table-scroll,.jini-data-table-frame>[data-slot=table-container]{overscroll-behavior-x:contain;width:100%;max-height:28rem;overflow:auto}.jini-data-table{border-collapse:separate;border-spacing:0;width:100%;font-family:var(--jini-font-body);font-size:var(--jini-font-size-sm);line-height:var(--jini-line-normal);font-variant-numeric:tabular-nums}.jini-data-table th,.jini-data-table td{text-align:left;vertical-align:middle;white-space:nowrap;border-bottom:1px solid var(--jini-border);height:2.5rem;padding:.625rem .875rem}.jini-data-table th{z-index:1;background:var(--jini-surface);color:var(--jini-muted);font-size:var(--jini-font-size-xs);font-weight:var(--jini-font-weight-semibold);position:sticky;top:0}.jini-data-table tbody tr:last-child td{border-bottom:0}.jini-data-table tbody tr:nth-child(2n){background:var(--jini-bg-subtle)}.jini-data-table tbody tr:hover,.jini-data-table tbody tr:focus-visible{background:var(--jini-surface)}.jini-data-table tbody tr[role=button]{cursor:pointer}.jini-data-table [data-numeric=true]{text-align:right}.jini-data-table-sort{width:100%;min-height:1.5rem;color:inherit;font:inherit;text-align:inherit;cursor:pointer;background:0 0;border:0;justify-content:space-between;align-items:center;gap:.625rem;padding:0;display:inline-flex}.jini-data-table [data-numeric=true] .jini-data-table-sort{justify-content:flex-end}.jini-data-table th[aria-sort=ascending],.jini-data-table th[aria-sort=descending],.jini-data-table-sort:hover{color:var(--jini-text)}.jini-data-table td.jini-data-table-empty{height:8rem;color:var(--jini-muted);text-align:center}.jini-data-table-pagination{border-top:1px solid var(--jini-border);color:var(--jini-muted);font-size:var(--jini-font-size-xs);font-variant-numeric:tabular-nums;flex-wrap:wrap;justify-content:space-between;align-items:center;gap:.75rem;padding:.625rem .875rem;display:flex}.jini-data-table-pagination-controls{gap:.5rem;display:flex}.jini-data-table-pagination button{border:1px solid var(--jini-border);border-radius:var(--jini-radius-sm);background:var(--jini-bg);min-height:2rem;color:var(--jini-text);font:inherit;cursor:pointer;padding:.375rem .75rem}.jini-data-table-pagination button:hover:not(:disabled){background:var(--jini-surface)}.jini-data-table-pagination button:disabled{opacity:.5;cursor:default}.jini-data-table-sort:focus-visible,.jini-data-table-pagination button:focus-visible,.jini-data-table tr[role=button]:focus-visible{outline:2px solid var(--jini-primary);outline-offset:-2px}.jini-chart{width:100%;min-width:0;color:var(--jini-chart-text,var(--jini-text));font-family:var(--jini-font-body);margin:0;font-size:.75rem}.jini-chart-caption{clip-path:inset(50%);white-space:nowrap;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.jini-chart .recharts-surface:focus-visible{outline:2px solid var(--jini-chart-1,var(--jini-chart-default-1));outline-offset:3px;border-radius:var(--jini-radius-sm)}.jini-chart-tooltip{border:1px solid var(--jini-chart-grid,var(--jini-border));border-radius:var(--jini-radius-sm);background:var(--jini-chart-surface,var(--jini-bg));min-width:9rem;max-width:min(22rem,80vw);color:var(--jini-chart-text,var(--jini-text));box-shadow:var(--jini-shadow-md);padding:.625rem .75rem;font-size:.75rem;line-height:1.5}.jini-chart-tooltip-label{overflow-wrap:anywhere;margin-bottom:.375rem;font-weight:600}.jini-chart-tooltip-items{gap:.375rem;display:grid}.jini-chart-tooltip-item{align-items:center;gap:.5rem;display:flex}.jini-chart-swatch{border-radius:2px;flex:none;width:.5rem;height:.5rem;display:inline-block}.jini-chart-tooltip-name{color:var(--jini-chart-axis,var(--jini-muted));overflow-wrap:anywhere;flex:1}.jini-chart-tooltip-value,.jini-chart-legend-value{font-variant-numeric:tabular-nums;font-weight:600}.jini-chart-legend{color:var(--jini-chart-axis,var(--jini-muted));flex-wrap:wrap;justify-content:center;gap:.5rem 1rem;margin:.5rem 0 0;padding:0;line-height:1.5;list-style:none;display:flex}.jini-chart-legend-item{overflow-wrap:anywhere;align-items:center;gap:.375rem;min-width:0;max-width:100%;display:inline-flex}.jini-chart-legend-item>span:not(.jini-chart-swatch){min-width:0}.jini-chart-legend-value{color:var(--jini-chart-text,var(--jini-text))}.jini-chart-total{fill:var(--jini-chart-text,var(--jini-text));font-variant-numeric:tabular-nums;letter-spacing:-.04em;pointer-events:none;font-size:1.75rem;font-weight:600}.jini-chart-total-label{fill:var(--jini-chart-axis,var(--jini-muted));letter-spacing:normal;font-size:.75rem;font-weight:400}@media (prefers-reduced-motion:reduce){.jini-chart *,.jini-chart :before,.jini-chart :after{transition:none!important;animation:none!important}}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}
2
+ @layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-space-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0}}}:root,[data-admin-theme],[data-color-scheme=light]{color-scheme:light;--jini-bg:var(--jini-theme-light-bg,#fff);--jini-surface:var(--jini-theme-light-surface,#f5f5f5);--jini-text:var(--jini-theme-light-text,#202020);--jini-muted:var(--jini-theme-light-muted,#666);--jini-border:var(--jini-theme-light-border,#d9d9d9);--jini-primary:var(--jini-theme-light-primary,#363636);--jini-primary-ink:var(--jini-theme-light-primary-ink,#fff);--jini-danger:var(--jini-theme-light-danger,#b42318);--jini-success:var(--jini-theme-light-success,#18763b);--jini-warning:var(--jini-theme-light-warning,#845800)}[data-color-scheme=dark]{color-scheme:dark;--jini-bg:var(--jini-theme-dark-bg,#171717);--jini-surface:var(--jini-theme-dark-surface,#242424);--jini-text:var(--jini-theme-dark-text,#f0f0f0);--jini-muted:var(--jini-theme-dark-muted,#b3b3b3);--jini-border:var(--jini-theme-dark-border,#454545);--jini-primary:var(--jini-theme-dark-primary,#e0e0e0);--jini-primary-ink:var(--jini-theme-dark-primary-ink,#202020);--jini-danger:var(--jini-theme-dark-danger,#ff8b80);--jini-success:var(--jini-theme-dark-success,#79d69b);--jini-warning:var(--jini-theme-dark-warning,#ebc36b)}:root,[data-color-scheme=light],[data-theme=light]{--jini-chart-default-1:oklch(55.29% .1129 43.4);--jini-chart-default-2:oklch(50% .11 240);--jini-chart-default-3:oklch(64% .13 88);--jini-chart-default-4:oklch(58% .15 350);--jini-chart-default-5:oklch(50% .11 155);--jini-chart-default-6:oklch(48% .12 295)}[data-color-scheme=dark],[data-theme=dark]{--jini-chart-default-1:oklch(62% .11 44);--jini-chart-default-2:oklch(64% .11 240);--jini-chart-default-3:oklch(66% .13 88);--jini-chart-default-4:oklch(65% .14 350);--jini-chart-default-5:oklch(56% .12 155);--jini-chart-default-6:oklch(64% .12 295)}:root{--jini-font-body:system-ui, sans-serif;--jini-font-heading:system-ui, sans-serif;--jini-font-mono:ui-monospace, monospace;--jini-radius:8px;--jini-density:1}:root,[data-admin-theme],[data-color-scheme]{--jini-bg-panel:var(--jini-surface);--jini-bg-subtle:var(--jini-surface)}@supports (color:color-mix(in lab, red, red)){:root,[data-admin-theme],[data-color-scheme]{--jini-bg-subtle:color-mix(in srgb, var(--jini-surface) 75%, var(--jini-bg))}}:root,[data-admin-theme],[data-color-scheme]{--jini-bg-elevated:var(--jini-surface);--jini-border-soft:var(--jini-border);--jini-border-strong:var(--jini-border)}@supports (color:color-mix(in lab, red, red)){:root,[data-admin-theme],[data-color-scheme]{--jini-border-strong:color-mix(in srgb, var(--jini-border) 75%, var(--jini-text))}}:root,[data-admin-theme],[data-color-scheme]{--jini-backdrop:var(--jini-text)}@supports (color:color-mix(in lab, red, red)){:root,[data-admin-theme],[data-color-scheme]{--jini-backdrop:color-mix(in srgb, var(--jini-text) 42%, transparent)}}:root,[data-admin-theme],[data-color-scheme]{--jini-text-strong:var(--jini-text);--jini-text-secondary:var(--jini-text)}@supports (color:color-mix(in lab, red, red)){:root,[data-admin-theme],[data-color-scheme]{--jini-text-secondary:color-mix(in srgb, var(--jini-text) 80%, var(--jini-bg))}}:root,[data-admin-theme],[data-color-scheme]{--jini-text-muted:var(--jini-muted);--jini-text-faint:var(--jini-muted)}@supports (color:color-mix(in lab, red, red)){:root,[data-admin-theme],[data-color-scheme]{--jini-text-faint:color-mix(in srgb, var(--jini-muted) 75%, var(--jini-bg))}}:root,[data-admin-theme],[data-color-scheme]{--jini-text-disabled:var(--jini-muted)}@supports (color:color-mix(in lab, red, red)){:root,[data-admin-theme],[data-color-scheme]{--jini-text-disabled:color-mix(in srgb, var(--jini-muted) 60%, var(--jini-bg))}}:root,[data-admin-theme],[data-color-scheme]{--jini-accent:var(--jini-primary);--jini-accent-hover:var(--jini-primary)}@supports (color:color-mix(in lab, red, red)){:root,[data-admin-theme],[data-color-scheme]{--jini-accent-hover:color-mix(in srgb, var(--jini-primary) 88%, var(--jini-text))}}:root,[data-admin-theme],[data-color-scheme]{--jini-accent-strong:var(--jini-primary)}@supports (color:color-mix(in lab, red, red)){:root,[data-admin-theme],[data-color-scheme]{--jini-accent-strong:color-mix(in srgb, var(--jini-primary) 85%, var(--jini-bg))}}:root,[data-admin-theme],[data-color-scheme]{--jini-accent-ink:var(--jini-primary-ink);--jini-accent-soft:var(--jini-primary)}@supports (color:color-mix(in lab, red, red)){:root,[data-admin-theme],[data-color-scheme]{--jini-accent-soft:color-mix(in srgb, var(--jini-primary) 10%, transparent)}}:root,[data-admin-theme],[data-color-scheme]{--jini-accent-ring:var(--jini-primary)}@supports (color:color-mix(in lab, red, red)){:root,[data-admin-theme],[data-color-scheme]{--jini-accent-ring:color-mix(in srgb, var(--jini-primary) 22%, transparent)}}:root,[data-admin-theme],[data-color-scheme]{--jini-neutral-accent:var(--jini-text);--jini-neutral-accent-hover:var(--jini-muted);--jini-neutral-accent-ink:var(--jini-bg);--jini-neutral-accent-text:var(--jini-text);--jini-neutral-accent-soft:var(--jini-text)}@supports (color:color-mix(in lab, red, red)){:root,[data-admin-theme],[data-color-scheme]{--jini-neutral-accent-soft:color-mix(in srgb, var(--jini-text) 7%, transparent)}}:root,[data-admin-theme],[data-color-scheme]{--jini-neutral-accent-ring:var(--jini-text)}@supports (color:color-mix(in lab, red, red)){:root,[data-admin-theme],[data-color-scheme]{--jini-neutral-accent-ring:color-mix(in srgb, var(--jini-text) 16%, transparent)}}:root,[data-admin-theme],[data-color-scheme]{--jini-link:var(--jini-primary);--jini-link-ink:var(--jini-primary-ink);--jini-success-bg:var(--jini-success)}@supports (color:color-mix(in lab, red, red)){:root,[data-admin-theme],[data-color-scheme]{--jini-success-bg:color-mix(in srgb, var(--jini-success) 12%, var(--jini-bg))}}:root,[data-admin-theme],[data-color-scheme]{--jini-success-solid:var(--jini-success);--jini-success-solid-ink:var(--jini-bg);--jini-danger-bg:var(--jini-danger)}@supports (color:color-mix(in lab, red, red)){:root,[data-admin-theme],[data-color-scheme]{--jini-danger-bg:color-mix(in srgb, var(--jini-danger) 12%, var(--jini-bg))}}:root,[data-admin-theme],[data-color-scheme]{--jini-warning-bg:var(--jini-warning)}@supports (color:color-mix(in lab, red, red)){:root,[data-admin-theme],[data-color-scheme]{--jini-warning-bg:color-mix(in srgb, var(--jini-warning) 12%, var(--jini-bg))}}:root,[data-admin-theme],[data-color-scheme]{--jini-font-ui:var(--jini-font-body);--jini-font-display:var(--jini-font-heading);--jini-shadow-xs:0 1px 0 var(--jini-text)}@supports (color:color-mix(in lab, red, red)){:root,[data-admin-theme],[data-color-scheme]{--jini-shadow-xs:0 1px 0 color-mix(in srgb, var(--jini-text) 4%, transparent)}}:root,[data-admin-theme],[data-color-scheme]{--jini-shadow-sm:0 1px 3px var(--jini-text)}@supports (color:color-mix(in lab, red, red)){:root,[data-admin-theme],[data-color-scheme]{--jini-shadow-sm:0 1px 3px color-mix(in srgb, var(--jini-text) 10%, transparent)}}:root,[data-admin-theme],[data-color-scheme]{--jini-shadow-md:0 6px 24px var(--jini-text)}@supports (color:color-mix(in lab, red, red)){:root,[data-admin-theme],[data-color-scheme]{--jini-shadow-md:0 6px 24px color-mix(in srgb, var(--jini-text) 15%, transparent)}}:root,[data-admin-theme],[data-color-scheme]{--jini-shadow-lg:0 24px 60px var(--jini-text)}@supports (color:color-mix(in lab, red, red)){:root,[data-admin-theme],[data-color-scheme]{--jini-shadow-lg:0 24px 60px color-mix(in srgb, var(--jini-text) 22%, transparent)}}:root,[data-admin-theme],[data-color-scheme]{--jini-radius-xs:calc(var(--jini-radius) * .5);--jini-radius-sm:calc(var(--jini-radius) * .75);--jini-radius-md:calc(var(--jini-radius) * 1.25);--jini-radius-lg:calc(var(--jini-radius) * 1.5);--jini-radius-pill:999px;--jini-space-1:calc(.25rem * var(--jini-density));--jini-space-2:calc(.5rem * var(--jini-density));--jini-space-3:calc(.75rem * var(--jini-density));--jini-space-4:calc(1rem * var(--jini-density));--jini-space-5:calc(1.25rem * var(--jini-density));--jini-space-6:calc(1.5rem * var(--jini-density));--jini-space-7:calc(2rem * var(--jini-density));--jini-space-8:calc(2.5rem * var(--jini-density));--jini-font-size-2xs:.6875rem;--jini-font-size-xs:.75rem;--jini-font-size-sm:.8125rem;--jini-font-size-base:.875rem;--jini-font-size-md:.95rem;--jini-font-size-lg:1.05rem;--jini-font-size-xl:1.65rem;--jini-font-weight-normal:400;--jini-font-weight-medium:500;--jini-font-weight-semibold:600;--jini-font-weight-bold:700;--jini-line-tight:1.25;--jini-line-normal:1.5;--jini-line-relaxed:1.7;--jini-duration-fast:.12s;--jini-duration-base:.2s;--jini-duration-slow:.32s;--jini-ease-out:cubic-bezier(.23, 1, .32, 1);--jini-ease-in-out:cubic-bezier(.4, 0, .2, 1);--jini-transition-base:var(--jini-duration-base) var(--jini-ease-out);--jini-z-dropdown:100;--jini-z-sticky:200;--jini-z-overlay:300;--jini-z-modal:400;--jini-z-toast:500;--jini-modal-padding:24px;--jini-sidebar-width:240px}@layer theme{:root,:host{--spacing:.25rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--font-weight-medium:500;--font-weight-semibold:600;--tracking-tight:-.025em;--radius-sm:.25rem;--radius-md:.375rem;--radius-xl:.75rem;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1)}}@layer base,components;@layer utilities{.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.sticky{position:sticky}.right-2{right:calc(var(--spacing) * 2)}.z-50{z-index:50}.container{width:100%}@media (min-width:40rem){.container{max-width:40rem}}@media (min-width:48rem){.container{max-width:48rem}}@media (min-width:64rem){.container{max-width:64rem}}@media (min-width:80rem){.container{max-width:80rem}}@media (min-width:96rem){.container{max-width:96rem}}.-mx-1{margin-inline:calc(var(--spacing) * -1)}.my-1{margin-block:var(--spacing)}.mt-4{margin-top:calc(var(--spacing) * 4)}.block{display:block}.flex{display:flex}.grid{display:grid}.inline-flex{display:inline-flex}.table{display:table}.table-caption{display:table-caption}.table-cell{display:table-cell}.table-row{display:table-row}.aspect-square{aspect-ratio:1}.h-3\.5{height:calc(var(--spacing) * 3.5)}.h-4{height:calc(var(--spacing) * 4)}.h-8{height:calc(var(--spacing) * 8)}.h-9{height:calc(var(--spacing) * 9)}.h-10{height:calc(var(--spacing) * 10)}.h-\[var\(--radix-select-trigger-height\)\]{height:var(--radix-select-trigger-height)}.h-px{height:1px}.max-h-\[--radix-select-content-available-height\]{max-height:--radix-select-content-available-height}.w-3\.5{width:calc(var(--spacing) * 3.5)}.w-4{width:calc(var(--spacing) * 4)}.w-9{width:calc(var(--spacing) * 9)}.w-full{width:100%}.min-w-\[8rem\]{min-width:8rem}.min-w-\[var\(--radix-select-trigger-width\)\]{min-width:var(--radix-select-trigger-width)}.shrink-0{flex-shrink:0}.caption-bottom{caption-side:bottom}.origin-\[--radix-select-content-transform-origin\]{transform-origin:--radix-select-content-transform-origin}.cursor-default{cursor:default}.flex-col{flex-direction:column}.place-content-center{place-content:center}.items-center{align-items:center}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-2{gap:calc(var(--spacing) * 2)}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1.5) * calc(1 - var(--tw-space-y-reverse)))}.overflow-x-auto{overflow-x:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-y-auto{overflow-y:auto}.rounded-full{border-radius:3.40282e38px}.rounded-md{border-radius:var(--radius-md)}.rounded-sm{border-radius:var(--radius-sm)}.rounded-xl{border-radius:var(--radius-xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-input{border-color:var(--jini-border)}.border-primary{border-color:var(--jini-primary)}.bg-background{background-color:var(--jini-bg)}.bg-destructive{background-color:var(--jini-danger)}.bg-muted,.bg-muted\/50{background-color:var(--jini-surface)}@supports (color:color-mix(in lab, red, red)){.bg-muted\/50{background-color:color-mix(in oklab, var(--jini-surface) 50%, transparent)}}.bg-primary{background-color:var(--jini-primary)}.bg-secondary{background-color:var(--jini-surface)}.bg-transparent{background-color:#0000}.fill-primary{fill:var(--jini-primary)}.p-1{padding:var(--spacing)}.p-2{padding:calc(var(--spacing) * 2)}.p-6{padding:calc(var(--spacing) * 6)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-8{padding-inline:calc(var(--spacing) * 8)}.py-1{padding-block:var(--spacing)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.pt-0{padding-top:0}.pr-8{padding-right:calc(var(--spacing) * 8)}.pl-2{padding-left:calc(var(--spacing) * 2)}.text-left{text-align:left}.align-middle{vertical-align:middle}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.leading-none{--tw-leading:1;line-height:1}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.whitespace-nowrap{white-space:nowrap}.text-current{color:currentColor}.text-destructive-foreground{color:var(--jini-bg)}.text-foreground{color:var(--jini-text)}.text-input{color:var(--jini-border)}.text-muted-foreground{color:var(--jini-muted)}.text-primary{color:var(--jini-primary)}.text-primary-foreground{color:var(--jini-primary-ink)}.text-secondary-foreground{color:var(--jini-text)}.underline-offset-4{text-underline-offset:4px}.opacity-50{opacity:.5}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-offset-background{--tw-ring-offset-color:var(--jini-bg)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.peer-disabled\:cursor-not-allowed:is(:where(.peer):disabled~*){cursor:not-allowed}.peer-disabled\:opacity-70:is(:where(.peer):disabled~*){opacity:.7}.file\:border-0::file-selector-button{border-style:var(--tw-border-style);border-width:0}.file\:bg-transparent::file-selector-button{background-color:#0000}.file\:text-sm::file-selector-button{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.file\:font-medium::file-selector-button{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.file\:text-foreground::file-selector-button{color:var(--jini-text)}.placeholder\:text-muted-foreground::placeholder{color:var(--jini-muted)}@media (hover:hover){.hover\:bg-accent:hover{background-color:var(--jini-surface)}.hover\:bg-destructive\/90:hover{background-color:var(--jini-danger)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-destructive\/90:hover{background-color:color-mix(in oklab, var(--jini-danger) 90%, transparent)}}.hover\:bg-muted\/50:hover{background-color:var(--jini-surface)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-muted\/50:hover{background-color:color-mix(in oklab, var(--jini-surface) 50%, transparent)}}.hover\:bg-primary\/90:hover{background-color:var(--jini-primary)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-primary\/90:hover{background-color:color-mix(in oklab, var(--jini-primary) 90%, transparent)}}.hover\:bg-secondary\/80:hover{background-color:var(--jini-surface)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-secondary\/80:hover{background-color:color-mix(in oklab, var(--jini-surface) 80%, transparent)}}.hover\:text-accent-foreground:hover{color:var(--jini-text)}.hover\:underline:hover{text-decoration-line:underline}}.focus\:bg-accent:focus{background-color:var(--jini-surface)}.focus\:text-accent-foreground:focus{color:var(--jini-text)}.focus\:ring-1:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus\:ring-ring:focus{--tw-ring-color:var(--jini-primary)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.focus-visible\:ring-1:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus-visible\:ring-ring:focus-visible{--tw-ring-color:var(--jini-primary)}.focus-visible\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}.has-aria-expanded\:bg-muted\/50:has([aria-expanded=true]){background-color:var(--jini-surface)}@supports (color:color-mix(in lab, red, red)){.has-aria-expanded\:bg-muted\/50:has([aria-expanded=true]){background-color:color-mix(in oklab, var(--jini-surface) 50%, transparent)}}.data-\[disabled\]\:pointer-events-none[data-disabled]{pointer-events:none}.data-\[disabled\]\:opacity-50[data-disabled]{opacity:.5}.data-\[placeholder\]\:text-muted-foreground[data-placeholder]{color:var(--jini-muted)}.data-\[side\=bottom\]\:translate-y-1[data-side=bottom]{--tw-translate-y:var(--spacing);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=left\]\:-translate-x-1[data-side=left]{--tw-translate-x:calc(var(--spacing) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=right\]\:translate-x-1[data-side=right]{--tw-translate-x:var(--spacing);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=top\]\:-translate-y-1[data-side=top]{--tw-translate-y:calc(var(--spacing) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[state\=checked\]\:bg-primary[data-state=checked]{background-color:var(--jini-primary)}.data-\[state\=checked\]\:text-primary-foreground[data-state=checked]{color:var(--jini-primary-ink)}.data-\[state\=selected\]\:bg-muted[data-state=selected]{background-color:var(--jini-surface)}@media (min-width:48rem){.md\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}}.\[\&_svg\]\:pointer-events-none svg{pointer-events:none}.\[\&_svg\]\:size-4 svg{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.\[\&_svg\]\:shrink-0 svg{flex-shrink:0}.\[\&_tr\]\:border-b tr{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.\[\&_tr\:last-child\]\:border-0 tr:last-child{border-style:var(--tw-border-style);border-width:0}.\[\&\:has\(\[role\=checkbox\]\)\]\:pr-0:has([role=checkbox]){padding-right:0}.\[\&\>span\]\:line-clamp-1>span{-webkit-line-clamp:1;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.\[\&\>tr\]\:last\:border-b-0>tr:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}}.jini-data-table-frame{border:1px solid var(--jini-border);border-radius:var(--jini-radius);background:var(--jini-bg);min-width:0;max-width:100%;color:var(--jini-text);overflow:hidden}.jini-data-table-scroll,.jini-data-table-frame>[data-slot=table-container]{overscroll-behavior-x:contain;width:100%;max-height:28rem;overflow:auto}.jini-data-table{border-collapse:separate;border-spacing:0;width:100%;font-family:var(--jini-font-body);font-size:var(--jini-font-size-sm);line-height:var(--jini-line-normal);font-variant-numeric:tabular-nums}.jini-data-table th,.jini-data-table td{text-align:left;vertical-align:middle;white-space:nowrap;border-bottom:1px solid var(--jini-border);height:2.5rem;padding:.625rem .875rem}.jini-data-table th{z-index:1;background:var(--jini-surface);color:var(--jini-muted);font-size:var(--jini-font-size-xs);font-weight:var(--jini-font-weight-semibold);position:sticky;top:0}.jini-data-table tbody tr:last-child td{border-bottom:0}.jini-data-table tbody tr:nth-child(2n){background:var(--jini-bg-subtle)}.jini-data-table tbody tr:hover,.jini-data-table tbody tr:focus-visible{background:var(--jini-surface)}.jini-data-table tbody tr[role=button]{cursor:pointer}.jini-data-table [data-numeric=true]{text-align:right}.jini-data-table-sort{width:100%;min-height:1.5rem;color:inherit;font:inherit;text-align:inherit;cursor:pointer;background:0 0;border:0;justify-content:space-between;align-items:center;gap:.625rem;padding:0;display:inline-flex}.jini-data-table [data-numeric=true] .jini-data-table-sort{justify-content:flex-end}.jini-data-table th[aria-sort=ascending],.jini-data-table th[aria-sort=descending],.jini-data-table-sort:hover{color:var(--jini-text)}.jini-data-table td.jini-data-table-empty{height:8rem;color:var(--jini-muted);text-align:center}.jini-data-table-pagination{border-top:1px solid var(--jini-border);color:var(--jini-muted);font-size:var(--jini-font-size-xs);font-variant-numeric:tabular-nums;flex-wrap:wrap;justify-content:space-between;align-items:center;gap:.75rem;padding:.625rem .875rem;display:flex}.jini-data-table-pagination-controls{gap:.5rem;display:flex}.jini-data-table-pagination button{border:1px solid var(--jini-border);border-radius:var(--jini-radius-sm);background:var(--jini-bg);min-height:2rem;color:var(--jini-text);font:inherit;cursor:pointer;padding:.375rem .75rem}.jini-data-table-pagination button:hover:not(:disabled){background:var(--jini-surface)}.jini-data-table-pagination button:disabled{opacity:.5;cursor:default}.jini-data-table-sort:focus-visible,.jini-data-table-pagination button:focus-visible,.jini-data-table tr[role=button]:focus-visible{outline:2px solid var(--jini-primary);outline-offset:-2px}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}
@@ -12,9 +12,9 @@ export { shadcnRadioGroupManifest, shadcnRadioGroupPropsSchema } from './provide
12
12
  export { shadcnTextInputManifest, shadcnTextInputPropsSchema } from './providers/shadcn/text-input-field.manifest.js';
13
13
  export { shadcnSelectManifest, shadcnSelectPropsSchema } from './providers/shadcn/select-field.manifest.js';
14
14
  export { shadcnCardManifest, shadcnCardPropsSchema } from './providers/shadcn/content-card.manifest.js';
15
- export { rechartsBarChartManifest, rechartsBarChartPropsSchema } from './providers/recharts/bar-chart.manifest.js';
16
- export { rechartsLineChartManifest, rechartsLineChartPropsSchema } from './providers/recharts/line-chart.manifest.js';
17
- export { rechartsPieChartManifest, rechartsPieChartPropsSchema } from './providers/recharts/pie-chart.manifest.js';
15
+ export { rechartsBarChartManifest, rechartsBarChartPropsSchema } from '../charts/wire.js';
16
+ export { rechartsLineChartManifest, rechartsLineChartPropsSchema } from '../charts/wire.js';
17
+ export { rechartsPieChartManifest, rechartsPieChartPropsSchema } from '../charts/wire.js';
18
18
  import type { InteractiveComponentManifest } from './types.js';
19
19
  /** Every registered manifest, for search/describe tooling that needs to list them all. Order is preference order — see `index.ts`'s `DEFAULT_INTERACTIVE_UI_REGISTRY` for where that's load-bearing. */
20
20
  export declare const ALL_MANIFESTS: readonly InteractiveComponentManifest[];
@@ -6,9 +6,9 @@ export { shadcnRadioGroupManifest, shadcnRadioGroupPropsSchema } from './provide
6
6
  export { shadcnTextInputManifest, shadcnTextInputPropsSchema } from './providers/shadcn/text-input-field.manifest.js';
7
7
  export { shadcnSelectManifest, shadcnSelectPropsSchema } from './providers/shadcn/select-field.manifest.js';
8
8
  export { shadcnCardManifest, shadcnCardPropsSchema } from './providers/shadcn/content-card.manifest.js';
9
- export { rechartsBarChartManifest, rechartsBarChartPropsSchema } from './providers/recharts/bar-chart.manifest.js';
10
- export { rechartsLineChartManifest, rechartsLineChartPropsSchema } from './providers/recharts/line-chart.manifest.js';
11
- export { rechartsPieChartManifest, rechartsPieChartPropsSchema } from './providers/recharts/pie-chart.manifest.js';
9
+ export { rechartsBarChartManifest, rechartsBarChartPropsSchema } from '../charts/wire.js';
10
+ export { rechartsLineChartManifest, rechartsLineChartPropsSchema } from '../charts/wire.js';
11
+ export { rechartsPieChartManifest, rechartsPieChartPropsSchema } from '../charts/wire.js';
12
12
  import { nativeDataTableManifest } from './providers/native/data-table.manifest.js';
13
13
  import { shadcnDataTableManifest } from './providers/shadcn/data-table.manifest.js';
14
14
  import { shadcnButtonManifest } from './providers/shadcn/action-button.manifest.js';
@@ -17,9 +17,9 @@ import { shadcnRadioGroupManifest } from './providers/shadcn/radio-group-field.m
17
17
  import { shadcnTextInputManifest } from './providers/shadcn/text-input-field.manifest.js';
18
18
  import { shadcnSelectManifest } from './providers/shadcn/select-field.manifest.js';
19
19
  import { shadcnCardManifest } from './providers/shadcn/content-card.manifest.js';
20
- import { rechartsBarChartManifest } from './providers/recharts/bar-chart.manifest.js';
21
- import { rechartsLineChartManifest } from './providers/recharts/line-chart.manifest.js';
22
- import { rechartsPieChartManifest } from './providers/recharts/pie-chart.manifest.js';
20
+ import { rechartsBarChartManifest } from '../charts/wire.js';
21
+ import { rechartsLineChartManifest } from '../charts/wire.js';
22
+ import { rechartsPieChartManifest } from '../charts/wire.js';
23
23
  /** Every registered manifest, for search/describe tooling that needs to list them all. Order is preference order — see `index.ts`'s `DEFAULT_INTERACTIVE_UI_REGISTRY` for where that's load-bearing. */
24
24
  export const ALL_MANIFESTS = [
25
25
  shadcnDataTableManifest,
@@ -1,8 +1,8 @@
1
1
  import type { ComponentType } from 'react';
2
2
  import type { InteractiveComponentManifest } from './types.js';
3
3
  /**
4
- * The React-aware half — pairs a manifest with the component that actually renders it. Only
5
- * `providers/*\/index.ts` (never `*.manifest.ts`) may produce one of these, so a Node/MCP host
4
+ * The React entry — pairs a manifest with the component that actually renders it. React provider
5
+ * barrels and chart host adapters (never headless manifests) produce these, so a Node/MCP host
6
6
  * can read every manifest in this feature without this file (or React) ever entering its
7
7
  * module graph.
8
8
  */
@@ -13,26 +13,28 @@ export interface InteractiveComponentEntry<Props = Record<string, unknown>> exte
13
13
  readonly actionProp?: string;
14
14
  }
15
15
  /**
16
+ * Generic immutable storage also accepts vanilla-provider metadata; the default entry retains
17
+ * existing React callers. No React runtime is imported by this registry.
16
18
  * Resolves an agent's capability request (`"data table"`) to registered component entries, in
17
19
  * registration order — first entry is the preferred provider, later entries are the fallback
18
20
  * chain (mirrors `@jini-ai/renderers-react`'s `RendererRegistry.resolve`, one capability search
19
21
  * instead of one manifest-match predicate).
20
22
  */
21
- export declare class InteractiveUiRegistry {
23
+ export declare class InteractiveUiRegistry<Entry extends InteractiveComponentManifest = InteractiveComponentEntry> {
22
24
  private readonly entries;
23
25
  constructor({ entries }: {
24
- entries: readonly InteractiveComponentEntry[];
25
- });
26
- list(): readonly InteractiveComponentEntry[];
26
+ entries: readonly NoInfer<Entry>[];
27
+ }, _options?: Record<string, never>);
28
+ list(_input?: Record<string, never>, _options?: Record<string, never>): readonly Entry[];
27
29
  resolveById({ id }: {
28
30
  id: string;
29
- }): InteractiveComponentEntry | null;
31
+ }, _options?: Record<string, never>): Entry | null;
30
32
  resolveByCapability({ capability }: {
31
33
  capability: string;
32
- }): readonly InteractiveComponentEntry[];
34
+ }, _options?: Record<string, never>): readonly Entry[];
33
35
  /** Returns a new registry with `entry` appended (or replacing an existing entry of the same id). */
34
36
  register({ entry }: {
35
- entry: InteractiveComponentEntry;
36
- }): InteractiveUiRegistry;
37
+ entry: Entry;
38
+ }, _options?: Record<string, never>): InteractiveUiRegistry<Entry>;
37
39
  }
38
40
  //# sourceMappingURL=registry.d.ts.map
@@ -1,4 +1,6 @@
1
1
  /**
2
+ * Generic immutable storage also accepts vanilla-provider metadata; the default entry retains
3
+ * existing React callers. No React runtime is imported by this registry.
2
4
  * Resolves an agent's capability request (`"data table"`) to registered component entries, in
3
5
  * registration order — first entry is the preferred provider, later entries are the fallback
4
6
  * chain (mirrors `@jini-ai/renderers-react`'s `RendererRegistry.resolve`, one capability search
@@ -6,20 +8,20 @@
6
8
  */
7
9
  export class InteractiveUiRegistry {
8
10
  entries;
9
- constructor({ entries }) {
10
- this.entries = entries;
11
+ constructor({ entries }, _options = {}) {
12
+ this.entries = Object.freeze([...entries]);
11
13
  }
12
- list() {
14
+ list(_input = {}, _options = {}) {
13
15
  return this.entries;
14
16
  }
15
- resolveById({ id }) {
17
+ resolveById({ id }, _options = {}) {
16
18
  return this.entries.find((entry) => entry.id === id) ?? null;
17
19
  }
18
- resolveByCapability({ capability }) {
20
+ resolveByCapability({ capability }, _options = {}) {
19
21
  return this.entries.filter((entry) => entry.capabilities.includes(capability));
20
22
  }
21
23
  /** Returns a new registry with `entry` appended (or replacing an existing entry of the same id). */
22
- register({ entry }) {
24
+ register({ entry }, _options = {}) {
23
25
  const withoutExisting = this.entries.filter((item) => item.id !== entry.id);
24
26
  return new InteractiveUiRegistry({ entries: [...withoutExisting, entry] });
25
27
  }
@@ -28,7 +28,7 @@
28
28
  }
29
29
 
30
30
  /* Default chart palette — what `--jini-chart-1`..`-6` fall back to when a host sets none (see
31
- interactive-ui/providers/recharts/chart-tokens.ts). Separate `-default-` names, so a host's own
31
+ the private charts-recharts/src/chart-tokens.ts). Separate `-default-` names, so a host's own
32
32
  `--jini-chart-N` always wins regardless of cascade order. Series 1 is the warm Claude orange, not
33
33
  the near-black `--jini-primary` ("Claude orange should be the default color", owner, 2026-10-05);
34
34
  2-6 are fixed-order categorical hues at matched lightness. Each mode was run through the dataviz
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jini-ai/ui",
3
- "version": "0.4.8",
3
+ "version": "0.5.0",
4
4
  "description": "Generic, product-neutral React UI primitives and feature domains. Framework-free types, decision rules, catalogs, and host port contracts live behind ./core (no React, no DOM). The Excalidraw and Lexical editors live behind ./sketch-editor and ./lexical-rich-text-editor; the GrapesJS-backed inline HTML editor lives behind ./html-editor.",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
@@ -36,7 +36,10 @@
36
36
  "./tab-strip": "browser",
37
37
  "./admin-widgets.css": "browser",
38
38
  "./theme": "browser",
39
- "./styles/*": "browser"
39
+ "./styles/*": "browser",
40
+ "./charts": "universal",
41
+ "./charts/browser": "browser",
42
+ "./charts/react": "browser"
40
43
  },
41
44
  "isolation": {
42
45
  "entries": {
@@ -158,7 +161,22 @@
158
161
  "import": "./dist/theme/index.js",
159
162
  "default": "./dist/theme/index.js"
160
163
  },
161
- "./styles/*": "./dist/styles/*"
164
+ "./styles/*": "./dist/styles/*",
165
+ "./charts": {
166
+ "types": "./dist/features/charts/index.d.ts",
167
+ "import": "./dist/features/charts/index.js",
168
+ "default": "./dist/features/charts/index.js"
169
+ },
170
+ "./charts/browser": {
171
+ "types": "./dist/features/charts/browser.d.ts",
172
+ "import": "./dist/features/charts/browser.js",
173
+ "default": "./dist/features/charts/browser.js"
174
+ },
175
+ "./charts/react": {
176
+ "types": "./dist/features/charts/react.d.ts",
177
+ "import": "./dist/features/charts/react.js",
178
+ "default": "./dist/features/charts/react.js"
179
+ }
162
180
  },
163
181
  "files": [
164
182
  "dist",
@@ -200,7 +218,6 @@
200
218
  "lexical": "0.36.2",
201
219
  "react": "^19.2.0",
202
220
  "react-dom": "^19.2.0",
203
- "recharts": "^3.10.1",
204
221
  "tailwindcss": "^4.1.16",
205
222
  "class-variance-authority": "^0.7.1",
206
223
  "clsx": "^2.1.1",
@@ -211,12 +228,12 @@
211
228
  "tailwind-merge": "^2.6.0",
212
229
  "zod": "^3.25.76",
213
230
  "@jini-ai/integrations": "^0.4.2",
214
- "@jini-ai/platform": "^0.5.3",
215
- "@jini-ai/core": "^0.4.3",
216
- "@jini-ai/agentic": "^0.4.4"
231
+ "@jini-ai/platform": "^0.5.6",
232
+ "@jini-ai/agentic": "^0.4.4",
233
+ "@jini-ai/core": "^0.4.4"
217
234
  },
218
235
  "dependencies": {
219
- "@jini-ai/core": "^0.4.3"
236
+ "@jini-ai/core": "^0.4.4"
220
237
  },
221
238
  "peerDependencies": {
222
239
  "@jini-ai/integrations": "^0.4.2",
@@ -234,7 +251,6 @@
234
251
  "lexical": "0.36.2",
235
252
  "react": "^18.3.0 || ^19.0.0",
236
253
  "react-dom": "^18.3.0 || ^19.0.0",
237
- "recharts": "^3.10.1",
238
254
  "@jini-ai/platform": "^0.5.3",
239
255
  "@jini-ai/agentic": "^0.4.4",
240
256
  "class-variance-authority": "^0.7.1",
@@ -292,9 +308,6 @@
292
308
  "react-dom": {
293
309
  "optional": true
294
310
  },
295
- "recharts": {
296
- "optional": true
297
- },
298
311
  "@jini-ai/platform": {
299
312
  "optional": true
300
313
  },
@@ -1,8 +0,0 @@
1
- export interface BarChartProps {
2
- readonly data: readonly Record<string, unknown>[];
3
- readonly categoryKey: string;
4
- readonly valueKey: string;
5
- readonly color?: string;
6
- }
7
- export declare function BarChart({ data, categoryKey, valueKey, color }: BarChartProps): import("react").JSX.Element;
8
- //# sourceMappingURL=bar-chart.d.ts.map