@party-stack/ontology-devtools 0.6.2 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +195 -0
- package/lib/DisclosureSummary.d.ts +7 -0
- package/lib/DisclosureSummary.d.ts.map +1 -0
- package/lib/DisclosureSummary.js +20 -0
- package/lib/DisclosureSummary.js.map +1 -0
- package/lib/NativeQueryCode.d.ts +7 -0
- package/lib/NativeQueryCode.d.ts.map +1 -0
- package/lib/NativeQueryCode.js +35 -0
- package/lib/NativeQueryCode.js.map +1 -0
- package/lib/OntologyDevtools.d.ts +11 -50
- package/lib/OntologyDevtools.d.ts.map +1 -1
- package/lib/OntologyDevtools.js +310 -626
- package/lib/OntologyDevtools.js.map +1 -1
- package/lib/OntologyIcons.d.ts +14 -0
- package/lib/OntologyIcons.d.ts.map +1 -0
- package/lib/OntologyIcons.js +22 -0
- package/lib/OntologyIcons.js.map +1 -0
- package/lib/PanelBoundary.d.ts +10 -0
- package/lib/PanelBoundary.d.ts.map +1 -0
- package/lib/PanelBoundary.js +67 -0
- package/lib/PanelBoundary.js.map +1 -0
- package/lib/Pinned.d.ts +14 -0
- package/lib/Pinned.d.ts.map +1 -0
- package/lib/Pinned.js +142 -0
- package/lib/Pinned.js.map +1 -0
- package/lib/PinnedFamily.d.ts +13 -0
- package/lib/PinnedFamily.d.ts.map +1 -0
- package/lib/PinnedFamily.js +105 -0
- package/lib/PinnedFamily.js.map +1 -0
- package/lib/Queries.d.ts +12 -0
- package/lib/Queries.d.ts.map +1 -0
- package/lib/Queries.js +147 -0
- package/lib/Queries.js.map +1 -0
- package/lib/QueryOwners.d.ts +7 -0
- package/lib/QueryOwners.d.ts.map +1 -0
- package/lib/QueryOwners.js +46 -0
- package/lib/QueryOwners.js.map +1 -0
- package/lib/QueryPills.d.ts +17 -0
- package/lib/QueryPills.d.ts.map +1 -0
- package/lib/QueryPills.js +37 -0
- package/lib/QueryPills.js.map +1 -0
- package/lib/QueryPushdown.d.ts +26 -0
- package/lib/QueryPushdown.d.ts.map +1 -0
- package/lib/QueryPushdown.js +380 -0
- package/lib/QueryPushdown.js.map +1 -0
- package/lib/QueryTokens.d.ts +25 -0
- package/lib/QueryTokens.d.ts.map +1 -0
- package/lib/QueryTokens.js +49 -0
- package/lib/QueryTokens.js.map +1 -0
- package/lib/QueryView.d.ts +37 -0
- package/lib/QueryView.d.ts.map +1 -0
- package/lib/QueryView.js +547 -0
- package/lib/QueryView.js.map +1 -0
- package/lib/SchemaView.d.ts +8 -0
- package/lib/SchemaView.d.ts.map +1 -0
- package/lib/SchemaView.js +213 -0
- package/lib/SchemaView.js.map +1 -0
- package/lib/Storage.d.ts +17 -0
- package/lib/Storage.d.ts.map +1 -0
- package/lib/Storage.js +205 -0
- package/lib/Storage.js.map +1 -0
- package/lib/Tracing.d.ts +7 -0
- package/lib/Tracing.d.ts.map +1 -0
- package/lib/Tracing.js +344 -0
- package/lib/Tracing.js.map +1 -0
- package/lib/attribution/Highlight.d.ts +9 -0
- package/lib/attribution/Highlight.d.ts.map +1 -0
- package/lib/attribution/Highlight.js +73 -0
- package/lib/attribution/Highlight.js.map +1 -0
- package/lib/attribution/index.d.ts +12 -0
- package/lib/attribution/index.d.ts.map +1 -0
- package/lib/attribution/index.js +31 -0
- package/lib/attribution/index.js.map +1 -0
- package/lib/attribution/registry.d.ts +16 -0
- package/lib/attribution/registry.d.ts.map +1 -0
- package/lib/attribution/registry.js +31 -0
- package/lib/attribution/registry.js.map +1 -0
- package/lib/attribution/tanstack.d.ts +11 -0
- package/lib/attribution/tanstack.d.ts.map +1 -0
- package/lib/attribution/tanstack.js +81 -0
- package/lib/attribution/tanstack.js.map +1 -0
- package/lib/chrome.d.ts +9 -0
- package/lib/chrome.d.ts.map +1 -0
- package/lib/chrome.js +41 -0
- package/lib/chrome.js.map +1 -0
- package/lib/diagnostics.d.ts +15 -0
- package/lib/diagnostics.d.ts.map +1 -0
- package/lib/diagnostics.js +31 -0
- package/lib/diagnostics.js.map +1 -0
- package/lib/index.d.ts +4 -2
- package/lib/index.js +3 -1
- package/lib/plugin.d.ts +11 -0
- package/lib/plugin.d.ts.map +1 -0
- package/lib/plugin.js +62 -0
- package/lib/plugin.js.map +1 -0
- package/lib/queryIR.d.ts +9 -0
- package/lib/queryIR.d.ts.map +1 -0
- package/lib/queryIR.js +69 -0
- package/lib/queryIR.js.map +1 -0
- package/lib/replicationActivity.d.ts +52 -0
- package/lib/replicationActivity.d.ts.map +1 -0
- package/lib/replicationActivity.js +54 -0
- package/lib/replicationActivity.js.map +1 -0
- package/lib/schemaLayout.d.ts +35 -0
- package/lib/schemaLayout.d.ts.map +1 -0
- package/lib/schemaLayout.js +75 -0
- package/lib/schemaLayout.js.map +1 -0
- package/lib/styles.js +6 -0
- package/lib/styles.js.map +1 -0
- package/lib/traceTimeline.d.ts +15 -0
- package/lib/traceTimeline.d.ts.map +1 -0
- package/lib/traceTimeline.js +36 -0
- package/lib/traceTimeline.js.map +1 -0
- package/lib/traceWaterfall.d.ts +25 -0
- package/lib/traceWaterfall.d.ts.map +1 -0
- package/lib/traceWaterfall.js +70 -0
- package/lib/traceWaterfall.js.map +1 -0
- package/lib/typeDisplayName.d.ts +5 -0
- package/lib/typeDisplayName.d.ts.map +1 -0
- package/lib/typeDisplayName.js +28 -0
- package/lib/typeDisplayName.js.map +1 -0
- package/lib/types.d.ts +17 -0
- package/lib/types.d.ts.map +1 -0
- package/lib/types.js +1 -0
- package/lib/vite/index.d.ts +18 -0
- package/lib/vite/index.d.ts.map +1 -0
- package/lib/vite/index.js +148 -0
- package/lib/vite/index.js.map +1 -0
- package/package.json +25 -8
- package/lib/styles.css +0 -2
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
//#region src/typeDisplayName.ts
|
|
2
|
+
function typeDisplayName(type) {
|
|
3
|
+
switch (type.kind) {
|
|
4
|
+
case "ref": return type.value.name;
|
|
5
|
+
case "optional": return `${typeDisplayName(type.value.type)} (optional)`;
|
|
6
|
+
case "list": return `List of ${typeDisplayName(type.value.elementType)}`;
|
|
7
|
+
case "map": return `Map of ${typeDisplayName(type.value.valueType)}`;
|
|
8
|
+
case "objectReference": return `${type.value.objectType} reference`;
|
|
9
|
+
case "string": return "String";
|
|
10
|
+
case "boolean": return "Boolean";
|
|
11
|
+
case "integer": return "Integer";
|
|
12
|
+
case "float": return "Float";
|
|
13
|
+
case "double": return "Double";
|
|
14
|
+
case "date": return "Date";
|
|
15
|
+
case "timestamp": return "Timestamp";
|
|
16
|
+
case "geopoint": return "Geopoint";
|
|
17
|
+
case "struct": return "Struct";
|
|
18
|
+
case "union": return "Union";
|
|
19
|
+
case "result": return "Result";
|
|
20
|
+
case "encrypted": return `Encrypted ${typeDisplayName(type.value.type)}`;
|
|
21
|
+
case "attachment": return "Attachment";
|
|
22
|
+
case "unknown": return "Unknown";
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
//#endregion
|
|
26
|
+
export { typeDisplayName };
|
|
27
|
+
|
|
28
|
+
//# sourceMappingURL=typeDisplayName.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typeDisplayName.js","names":[],"sources":["../src/typeDisplayName.ts"],"sourcesContent":["import type { TypeDef } from \"@party-stack/ontology\";\n\nexport function typeDisplayName(type: TypeDef): string {\n switch (type.kind) {\n case \"ref\":\n return type.value.name;\n case \"optional\":\n return `${typeDisplayName(type.value.type)} (optional)`;\n case \"list\":\n return `List of ${typeDisplayName(type.value.elementType)}`;\n case \"map\":\n return `Map of ${typeDisplayName(type.value.valueType)}`;\n case \"objectReference\":\n return `${type.value.objectType} reference`;\n case \"string\":\n return \"String\";\n case \"boolean\":\n return \"Boolean\";\n case \"integer\":\n return \"Integer\";\n case \"float\":\n return \"Float\";\n case \"double\":\n return \"Double\";\n case \"date\":\n return \"Date\";\n case \"timestamp\":\n return \"Timestamp\";\n case \"geopoint\":\n return \"Geopoint\";\n case \"struct\":\n return \"Struct\";\n case \"union\":\n return \"Union\";\n case \"result\":\n return \"Result\";\n case \"encrypted\":\n return `Encrypted ${typeDisplayName(type.value.type)}`;\n case \"attachment\":\n return \"Attachment\";\n case \"unknown\":\n return \"Unknown\";\n }\n}\n"],"mappings":";AAEA,SAAgB,gBAAgB,MAAuB;CACnD,QAAQ,KAAK,MAAb;EACI,KAAK,OACD,OAAO,KAAK,MAAM;EACtB,KAAK,YACD,OAAO,GAAG,gBAAgB,KAAK,MAAM,IAAI,EAAE;EAC/C,KAAK,QACD,OAAO,WAAW,gBAAgB,KAAK,MAAM,WAAW;EAC5D,KAAK,OACD,OAAO,UAAU,gBAAgB,KAAK,MAAM,SAAS;EACzD,KAAK,mBACD,OAAO,GAAG,KAAK,MAAM,WAAW;EACpC,KAAK,UACD,OAAO;EACX,KAAK,WACD,OAAO;EACX,KAAK,WACD,OAAO;EACX,KAAK,SACD,OAAO;EACX,KAAK,UACD,OAAO;EACX,KAAK,QACD,OAAO;EACX,KAAK,aACD,OAAO;EACX,KAAK,YACD,OAAO;EACX,KAAK,UACD,OAAO;EACX,KAAK,SACD,OAAO;EACX,KAAK,UACD,OAAO;EACX,KAAK,aACD,OAAO,aAAa,gBAAgB,KAAK,MAAM,IAAI;EACvD,KAAK,cACD,OAAO;EACX,KAAK,WACD,OAAO;CACf;AACJ"}
|
package/lib/types.d.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { LiveOntology, OntologyDefinition } from "@party-stack/ontology";
|
|
2
|
+
import { TanStackDevtoolsReactPlugin } from "@tanstack/react-devtools";
|
|
3
|
+
//#region src/types.d.ts
|
|
4
|
+
export interface OntologyDevtoolsPanelProps<Ontology extends OntologyDefinition = OntologyDefinition, MetaOntology extends OntologyDefinition = OntologyDefinition> {
|
|
5
|
+
ontology: LiveOntology<Ontology>;
|
|
6
|
+
metaOntology?: LiveOntology<MetaOntology>;
|
|
7
|
+
theme?: "light" | "dark";
|
|
8
|
+
}
|
|
9
|
+
export interface OntologyDevtoolsPluginOptions<Ontology extends OntologyDefinition = OntologyDefinition, MetaOntology extends OntologyDefinition = OntologyDefinition> {
|
|
10
|
+
ontology: LiveOntology<Ontology>;
|
|
11
|
+
id?: string;
|
|
12
|
+
metaOntology?: LiveOntology<MetaOntology>;
|
|
13
|
+
name?: TanStackDevtoolsReactPlugin["name"];
|
|
14
|
+
defaultOpen?: boolean;
|
|
15
|
+
}
|
|
16
|
+
//#endregion
|
|
17
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","names":[],"sources":["../src/types.ts"],"mappings":";;;iBAGiB,2BACb,iBAAiB,qBAAqB,oBACtC,qBAAqB,qBAAqB;EAE1C,UAAU,aAAa;EACvB,eAAe,aAAa;EAC5B;;iBAGa,8BACb,iBAAiB,qBAAqB,oBACtC,qBAAqB,qBAAqB;EAE1C,UAAU,aAAa;EACvB;EACA,eAAe,aAAa;EAC5B,OAAO;EACP"}
|
package/lib/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { Plugin } from "vite-plus";
|
|
2
|
+
//#region src/vite/index.d.ts
|
|
3
|
+
export declare function transformDemandAttribution(code: string, filename: string): Promise<{
|
|
4
|
+
code: string;
|
|
5
|
+
map: {
|
|
6
|
+
version: number;
|
|
7
|
+
sources: string[];
|
|
8
|
+
names: string[];
|
|
9
|
+
sourceRoot?: string | undefined;
|
|
10
|
+
sourcesContent?: string[] | undefined;
|
|
11
|
+
mappings: string;
|
|
12
|
+
file: string;
|
|
13
|
+
} | null | undefined;
|
|
14
|
+
} | null>;
|
|
15
|
+
/** Opt-in, development-only instrumentation; production source is left untouched. */
|
|
16
|
+
export declare function demandAttribution(): Plugin;
|
|
17
|
+
//#endregion
|
|
18
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../../src/vite/index.ts"],"mappings":";;wBAkBsB,2BAA2B,cAAc,mBAAgB;;;;;;;;;;;;;wBAqL/D,qBAAqB"}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import { transformAsync, types } from "@babel/core";
|
|
2
|
+
//#region src/vite/index.ts
|
|
3
|
+
const queryHooks = /* @__PURE__ */ new Map([
|
|
4
|
+
["@tanstack/react-db", /* @__PURE__ */ new Set([
|
|
5
|
+
"useLiveQuery",
|
|
6
|
+
"useLiveInfiniteQuery",
|
|
7
|
+
"useLiveSuspenseQuery"
|
|
8
|
+
])],
|
|
9
|
+
["@party-stack/ontology-react", /* @__PURE__ */ new Set([
|
|
10
|
+
"useFragment",
|
|
11
|
+
"useListFragment",
|
|
12
|
+
"useLiveSuspenseQuery"
|
|
13
|
+
])],
|
|
14
|
+
["@party-stack/db-fragments/react", /* @__PURE__ */ new Set([
|
|
15
|
+
"useFragment",
|
|
16
|
+
"useListFragment",
|
|
17
|
+
"useLiveSuspenseQuery"
|
|
18
|
+
])]
|
|
19
|
+
]);
|
|
20
|
+
const marker = "party-stack-demand-attribution";
|
|
21
|
+
function componentName(path) {
|
|
22
|
+
if ((path.isFunctionDeclaration() || path.isFunctionExpression()) && path.node.id) return path.node.id.name;
|
|
23
|
+
const parent = path.parentPath;
|
|
24
|
+
return parent.isVariableDeclarator() && types.isIdentifier(parent.node.id) ? parent.node.id.name : void 0;
|
|
25
|
+
}
|
|
26
|
+
async function transformDemandAttribution(code, filename) {
|
|
27
|
+
if (code.includes(marker) || ![...queryHooks.keys()].some((source) => code.includes(source))) return null;
|
|
28
|
+
let modified = false;
|
|
29
|
+
const instrumentation = () => {
|
|
30
|
+
const owners = /* @__PURE__ */ new Map();
|
|
31
|
+
let ownerHook;
|
|
32
|
+
let queryHook;
|
|
33
|
+
let fragmentHook;
|
|
34
|
+
let hasQueries = false;
|
|
35
|
+
let hasFragments = false;
|
|
36
|
+
return { visitor: {
|
|
37
|
+
Program: {
|
|
38
|
+
enter(path) {
|
|
39
|
+
const fresh = (base) => {
|
|
40
|
+
let name = base, suffix = 0;
|
|
41
|
+
while (path.scope.hasBinding(name)) name = `${base}${++suffix}`;
|
|
42
|
+
return types.identifier(name);
|
|
43
|
+
};
|
|
44
|
+
ownerHook = fresh("usePartyStackDemandOwner");
|
|
45
|
+
queryHook = fresh("usePartyStackDemandQuery");
|
|
46
|
+
fragmentHook = fresh("usePartyStackDemandFragment");
|
|
47
|
+
},
|
|
48
|
+
exit(path) {
|
|
49
|
+
if (!owners.size) return;
|
|
50
|
+
for (const entry of owners.values()) {
|
|
51
|
+
if (!types.isBlockStatement(entry.path.node.body)) entry.path.node.body = types.blockStatement([types.returnStatement(entry.path.node.body)]);
|
|
52
|
+
entry.path.node.body.body.unshift(types.variableDeclaration("const", [types.variableDeclarator(entry.owner, types.callExpression(ownerHook, [types.stringLiteral(entry.name), types.stringLiteral(`${filename}:${entry.path.node.loc?.start.line ?? 1}`)]))]));
|
|
53
|
+
if (entry.fragments.length) entry.path.node.body.body.splice(1, 0, types.variableDeclaration("let", entry.fragments.map((id) => types.variableDeclarator(types.cloneNode(id)))));
|
|
54
|
+
entry.path.traverse({ JSXOpeningElement(element) {
|
|
55
|
+
if (!types.isJSXIdentifier(element.node.name) || !/^[a-z]/u.test(element.node.name.name)) return;
|
|
56
|
+
let ancestor = element.getFunctionParent();
|
|
57
|
+
while (ancestor && !owners.has(ancestor.node)) ancestor = ancestor.getFunctionParent();
|
|
58
|
+
if (ancestor?.node !== entry.path.node) return;
|
|
59
|
+
if (element.node.attributes.some((attr) => types.isJSXAttribute(attr) && types.isJSXIdentifier(attr.name, { name: "data-ps-demand-owner" }))) return;
|
|
60
|
+
element.node.attributes.push(types.jsxAttribute(types.jsxIdentifier("data-ps-demand-owner"), types.jsxExpressionContainer(types.memberExpression(types.cloneNode(entry.owner), types.identifier("id")))));
|
|
61
|
+
} });
|
|
62
|
+
}
|
|
63
|
+
path.unshiftContainer("body", types.importDeclaration([
|
|
64
|
+
types.importSpecifier(ownerHook, types.identifier("useDemandOwner")),
|
|
65
|
+
...hasQueries ? [types.importSpecifier(queryHook, types.identifier("useDemandQuery"))] : [],
|
|
66
|
+
...hasFragments ? [types.importSpecifier(fragmentHook, types.identifier("useDemandFragment"))] : []
|
|
67
|
+
], types.stringLiteral("@party-stack/ontology-devtools/attribution")));
|
|
68
|
+
path.addComment("leading", marker);
|
|
69
|
+
modified = true;
|
|
70
|
+
}
|
|
71
|
+
},
|
|
72
|
+
CallExpression(path) {
|
|
73
|
+
const callee = path.get("callee");
|
|
74
|
+
if (!callee.isIdentifier()) return;
|
|
75
|
+
const binding = callee.scope.getBinding(callee.node.name);
|
|
76
|
+
if (!binding?.path.isImportSpecifier()) return;
|
|
77
|
+
const imported = binding.path.node.imported;
|
|
78
|
+
const name = types.isIdentifier(imported) ? imported.name : imported.value;
|
|
79
|
+
if (!binding.path.parentPath.isImportDeclaration() || !queryHooks.get(binding.path.parentPath.node.source.value)?.has(name)) return;
|
|
80
|
+
const parent = path.getFunctionParent();
|
|
81
|
+
if (!parent || !(parent.isFunctionDeclaration() || parent.isFunctionExpression() || parent.isArrowFunctionExpression())) return;
|
|
82
|
+
const nameOfComponent = componentName(parent);
|
|
83
|
+
if (!nameOfComponent || !/^[A-Z]/u.test(nameOfComponent)) return;
|
|
84
|
+
const fragment = name === "useFragment" ? path.node.arguments[0] : void 0;
|
|
85
|
+
if (name === "useFragment" && !types.isExpression(fragment)) return;
|
|
86
|
+
let entry = owners.get(parent.node);
|
|
87
|
+
if (!entry) {
|
|
88
|
+
entry = {
|
|
89
|
+
path: parent,
|
|
90
|
+
name: nameOfComponent,
|
|
91
|
+
owner: parent.scope.generateUidIdentifier("demandOwner"),
|
|
92
|
+
fragments: []
|
|
93
|
+
};
|
|
94
|
+
owners.set(parent.node, entry);
|
|
95
|
+
}
|
|
96
|
+
if (types.isExpression(fragment)) {
|
|
97
|
+
const input = parent.scope.generateUidIdentifier("demandFragment");
|
|
98
|
+
entry.fragments.push(input);
|
|
99
|
+
path.node.arguments[0] = types.assignmentExpression("=", types.cloneNode(input), fragment);
|
|
100
|
+
hasFragments = true;
|
|
101
|
+
path.replaceWith(types.callExpression(fragmentHook, [
|
|
102
|
+
types.cloneNode(entry.owner),
|
|
103
|
+
path.node,
|
|
104
|
+
types.cloneNode(input)
|
|
105
|
+
]));
|
|
106
|
+
} else {
|
|
107
|
+
hasQueries = true;
|
|
108
|
+
path.replaceWith(types.callExpression(queryHook, [types.cloneNode(entry.owner), path.node]));
|
|
109
|
+
}
|
|
110
|
+
path.skip();
|
|
111
|
+
}
|
|
112
|
+
} };
|
|
113
|
+
};
|
|
114
|
+
const result = await transformAsync(code, {
|
|
115
|
+
filename,
|
|
116
|
+
configFile: false,
|
|
117
|
+
babelrc: false,
|
|
118
|
+
parserOpts: { plugins: ["typescript", "jsx"] },
|
|
119
|
+
plugins: [instrumentation],
|
|
120
|
+
sourceMaps: true,
|
|
121
|
+
sourceFileName: filename
|
|
122
|
+
});
|
|
123
|
+
return modified && result?.code ? {
|
|
124
|
+
code: result.code,
|
|
125
|
+
map: result.map
|
|
126
|
+
} : null;
|
|
127
|
+
}
|
|
128
|
+
/** Opt-in, development-only instrumentation; production source is left untouched. */
|
|
129
|
+
function demandAttribution() {
|
|
130
|
+
let root = "";
|
|
131
|
+
return {
|
|
132
|
+
name: "party-stack:demand-attribution",
|
|
133
|
+
apply: "serve",
|
|
134
|
+
enforce: "pre",
|
|
135
|
+
configResolved(config) {
|
|
136
|
+
root = `${config.root}/`;
|
|
137
|
+
},
|
|
138
|
+
async transform(code, id) {
|
|
139
|
+
const file = id.split("?")[0];
|
|
140
|
+
if (!/\.[jt]sx$/u.test(file) || file.includes("/node_modules/") || file.includes("/ontology-devtools/") || /\.(test|spec)\./u.test(file)) return;
|
|
141
|
+
return transformDemandAttribution(code, file.startsWith(root) ? file.slice(root.length) : file);
|
|
142
|
+
}
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
//#endregion
|
|
146
|
+
export { demandAttribution, transformDemandAttribution };
|
|
147
|
+
|
|
148
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":["t"],"sources":["../../src/vite/index.ts"],"sourcesContent":["import { transformAsync, types as t, type NodePath, type PluginObj } from \"@babel/core\";\nimport type { Plugin } from \"vite-plus\";\n\nconst queryHooks = new Map([\n [\"@tanstack/react-db\", new Set([\"useLiveQuery\", \"useLiveInfiniteQuery\", \"useLiveSuspenseQuery\"])],\n [\"@party-stack/ontology-react\", new Set([\"useFragment\", \"useListFragment\", \"useLiveSuspenseQuery\"])],\n [\"@party-stack/db-fragments/react\", new Set([\"useFragment\", \"useListFragment\", \"useLiveSuspenseQuery\"])],\n]);\nconst marker = \"party-stack-demand-attribution\";\ntype ComponentPath = NodePath<t.FunctionDeclaration | t.FunctionExpression | t.ArrowFunctionExpression>;\n\nfunction componentName(path: ComponentPath): string | undefined {\n if ((path.isFunctionDeclaration() || path.isFunctionExpression()) && path.node.id)\n return path.node.id.name;\n const parent = path.parentPath;\n return parent.isVariableDeclarator() && t.isIdentifier(parent.node.id) ? parent.node.id.name : undefined;\n}\n\nexport async function transformDemandAttribution(code: string, filename: string) {\n if (code.includes(marker) || ![...queryHooks.keys()].some((source) => code.includes(source))) return null;\n let modified = false;\n const instrumentation = (): PluginObj => {\n const owners = new Map<\n t.Node,\n { path: ComponentPath; name: string; owner: t.Identifier; fragments: t.Identifier[] }\n >();\n let ownerHook: t.Identifier;\n let queryHook: t.Identifier;\n let fragmentHook: t.Identifier;\n let hasQueries = false;\n let hasFragments = false;\n return {\n visitor: {\n Program: {\n enter(path) {\n const fresh = (base: string) => {\n let name = base,\n suffix = 0;\n while (path.scope.hasBinding(name)) name = `${base}${++suffix}`;\n return t.identifier(name);\n };\n ownerHook = fresh(\"usePartyStackDemandOwner\");\n queryHook = fresh(\"usePartyStackDemandQuery\");\n fragmentHook = fresh(\"usePartyStackDemandFragment\");\n },\n exit(path) {\n if (!owners.size) return;\n for (const entry of owners.values()) {\n if (!t.isBlockStatement(entry.path.node.body))\n entry.path.node.body = t.blockStatement([\n t.returnStatement(entry.path.node.body),\n ]);\n entry.path.node.body.body.unshift(\n t.variableDeclaration(\"const\", [\n t.variableDeclarator(\n entry.owner,\n t.callExpression(ownerHook, [\n t.stringLiteral(entry.name),\n t.stringLiteral(\n `${filename}:${entry.path.node.loc?.start.line ?? 1}`\n ),\n ])\n ),\n ])\n );\n if (entry.fragments.length)\n entry.path.node.body.body.splice(\n 1,\n 0,\n t.variableDeclaration(\n \"let\",\n entry.fragments.map((id) => t.variableDeclarator(t.cloneNode(id)))\n )\n );\n entry.path.traverse({\n JSXOpeningElement(element) {\n if (\n !t.isJSXIdentifier(element.node.name) ||\n !/^[a-z]/u.test(element.node.name.name)\n )\n return;\n let ancestor = element.getFunctionParent();\n while (ancestor && !owners.has(ancestor.node))\n ancestor = ancestor.getFunctionParent();\n if (ancestor?.node !== entry.path.node) return;\n if (\n element.node.attributes.some(\n (attr) =>\n t.isJSXAttribute(attr) &&\n t.isJSXIdentifier(attr.name, { name: \"data-ps-demand-owner\" })\n )\n )\n return;\n element.node.attributes.push(\n t.jsxAttribute(\n t.jsxIdentifier(\"data-ps-demand-owner\"),\n t.jsxExpressionContainer(\n t.memberExpression(\n t.cloneNode(entry.owner),\n t.identifier(\"id\")\n )\n )\n )\n );\n },\n });\n }\n path.unshiftContainer(\n \"body\",\n t.importDeclaration(\n [\n t.importSpecifier(ownerHook, t.identifier(\"useDemandOwner\")),\n ...(hasQueries\n ? [t.importSpecifier(queryHook, t.identifier(\"useDemandQuery\"))]\n : []),\n ...(hasFragments\n ? [t.importSpecifier(fragmentHook, t.identifier(\"useDemandFragment\"))]\n : []),\n ],\n t.stringLiteral(\"@party-stack/ontology-devtools/attribution\")\n )\n );\n path.addComment(\"leading\", marker);\n modified = true;\n },\n },\n CallExpression(path) {\n const callee = path.get(\"callee\");\n if (!callee.isIdentifier()) return;\n const binding = callee.scope.getBinding(callee.node.name);\n if (!binding?.path.isImportSpecifier()) return;\n const imported = binding.path.node.imported;\n const name = t.isIdentifier(imported) ? imported.name : imported.value;\n if (\n !binding.path.parentPath.isImportDeclaration() ||\n !queryHooks.get(binding.path.parentPath.node.source.value)?.has(name)\n )\n return;\n const parent = path.getFunctionParent();\n if (\n !parent ||\n !(\n parent.isFunctionDeclaration() ||\n parent.isFunctionExpression() ||\n parent.isArrowFunctionExpression()\n )\n )\n return;\n const nameOfComponent = componentName(parent);\n if (!nameOfComponent || !/^[A-Z]/u.test(nameOfComponent)) return;\n const fragment = name === \"useFragment\" ? path.node.arguments[0] : undefined;\n if (name === \"useFragment\" && !t.isExpression(fragment)) return;\n let entry = owners.get(parent.node);\n if (!entry) {\n entry = {\n path: parent,\n name: nameOfComponent,\n owner: parent.scope.generateUidIdentifier(\"demandOwner\"),\n fragments: [],\n };\n owners.set(parent.node, entry);\n }\n if (t.isExpression(fragment)) {\n // Evaluate the caller's input once, in its original position.\n // The selected row itself can be undefined or contain a\n // property named collection, so attribution uses this input.\n const input = parent.scope.generateUidIdentifier(\"demandFragment\");\n entry.fragments.push(input);\n path.node.arguments[0] = t.assignmentExpression(\"=\", t.cloneNode(input), fragment);\n hasFragments = true;\n path.replaceWith(\n t.callExpression(fragmentHook, [\n t.cloneNode(entry.owner),\n path.node,\n t.cloneNode(input),\n ])\n );\n } else {\n hasQueries = true;\n path.replaceWith(t.callExpression(queryHook, [t.cloneNode(entry.owner), path.node]));\n }\n path.skip();\n },\n },\n };\n };\n const result = await transformAsync(code, {\n filename,\n configFile: false,\n babelrc: false,\n parserOpts: { plugins: [\"typescript\", \"jsx\"] },\n plugins: [instrumentation],\n sourceMaps: true,\n sourceFileName: filename,\n });\n return modified && result?.code ? { code: result.code, map: result.map } : null;\n}\n\n/** Opt-in, development-only instrumentation; production source is left untouched. */\nexport function demandAttribution(): Plugin {\n let root = \"\";\n return {\n name: \"party-stack:demand-attribution\",\n apply: \"serve\",\n enforce: \"pre\",\n configResolved(config) {\n root = `${config.root}/`;\n },\n async transform(code, id) {\n const file = id.split(\"?\")[0]!;\n if (\n !/\\.[jt]sx$/u.test(file) ||\n file.includes(\"/node_modules/\") ||\n file.includes(\"/ontology-devtools/\") ||\n /\\.(test|spec)\\./u.test(file)\n )\n return;\n return transformDemandAttribution(code, file.startsWith(root) ? file.slice(root.length) : file);\n },\n };\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,45 +1,62 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@party-stack/ontology-devtools",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.7.0",
|
|
4
4
|
"files": [
|
|
5
5
|
"lib"
|
|
6
6
|
],
|
|
7
7
|
"type": "module",
|
|
8
8
|
"exports": {
|
|
9
|
+
"./vite": {
|
|
10
|
+
"types": "./lib/vite/index.d.ts",
|
|
11
|
+
"default": "./lib/vite/index.js"
|
|
12
|
+
},
|
|
13
|
+
"./attribution": {
|
|
14
|
+
"types": "./lib/attribution/index.d.ts",
|
|
15
|
+
"default": "./lib/attribution/index.js"
|
|
16
|
+
},
|
|
9
17
|
".": {
|
|
10
18
|
"types": "./lib/index.d.ts",
|
|
11
19
|
"default": "./lib/index.js"
|
|
12
20
|
}
|
|
13
21
|
},
|
|
14
22
|
"dependencies": {
|
|
23
|
+
"@babel/core": "^7.29.7",
|
|
15
24
|
"@base-ui/react": "^1.8.0",
|
|
16
25
|
"@dagrejs/dagre": "^3.1.1",
|
|
17
26
|
"@number-flow/react": "^0.6.2",
|
|
18
27
|
"@tanstack/devtools-utils": "^0.6.0",
|
|
19
28
|
"@tanstack/react-table": "^9.2.8",
|
|
20
|
-
"
|
|
29
|
+
"@xyflow/react": "^12.12.0",
|
|
30
|
+
"highlight.js": "^11.12.0",
|
|
31
|
+
"lucide-react": "^1.69.0",
|
|
32
|
+
"@party-stack/design-system": "0.1.0",
|
|
21
33
|
"@party-stack/icons": "0.2.1",
|
|
22
34
|
"@party-stack/icons-lucide": "0.2.1",
|
|
23
|
-
"@party-stack/ontology": "0.
|
|
35
|
+
"@party-stack/ontology": "0.21.0",
|
|
36
|
+
"@party-stack/runtime": "0.5.0"
|
|
24
37
|
},
|
|
25
38
|
"devDependencies": {
|
|
26
39
|
"@tailwindcss/postcss": "^4.1.17",
|
|
27
|
-
"@tanstack/db": "0.
|
|
28
|
-
"@tanstack/react-db": "0.
|
|
40
|
+
"@tanstack/db": "1.0.0-rc.1.4",
|
|
41
|
+
"@tanstack/react-db": "1.0.0-rc.1.4",
|
|
29
42
|
"@tanstack/react-devtools": "^0.10.9",
|
|
43
|
+
"@types/babel__core": "^7.20.5",
|
|
30
44
|
"@types/react": "^19.3.0",
|
|
31
45
|
"@types/react-dom": "^19.3.0",
|
|
46
|
+
"effect": "^4.0.5",
|
|
32
47
|
"postcss-import": "^17.0.0",
|
|
33
48
|
"react": "^19.3.0",
|
|
34
49
|
"react-dom": "^19.3.0",
|
|
35
50
|
"tailwindcss": "^4.1.17",
|
|
36
51
|
"typescript": "~7.0.2",
|
|
52
|
+
"vite": "npm:@voidzero-dev/vite-plus-core@1.2.0",
|
|
37
53
|
"vite-plus": "1.2.0",
|
|
38
|
-
"@party-stack/build-config": "0.
|
|
54
|
+
"@party-stack/build-config": "0.2.0",
|
|
55
|
+
"@party-stack/ontology-backend": "0.2.0"
|
|
39
56
|
},
|
|
40
57
|
"peerDependencies": {
|
|
41
|
-
"@tanstack/db": "0.
|
|
42
|
-
"@tanstack/react-db": "0.
|
|
58
|
+
"@tanstack/db": "1.0.0-rc.1.4",
|
|
59
|
+
"@tanstack/react-db": "1.0.0-rc.1.4",
|
|
43
60
|
"@tanstack/react-devtools": "^0.10.9",
|
|
44
61
|
"react": "^19.2.0",
|
|
45
62
|
"react-dom": "^19.2.0"
|
package/lib/styles.css
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
/*! tailwindcss v4.1.17 | 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-border-spacing-x:0;--tw-border-spacing-y:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction: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-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial}}}@layer theme{:root,:host{--ps-font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--ps-font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--ps-color-red-300:oklch(80.8% .114 19.571);--ps-color-red-500:oklch(63.7% .237 25.331);--ps-color-sky-300:oklch(82.8% .111 230.318);--ps-color-sky-400:oklch(74.6% .16 232.661);--ps-color-sky-500:oklch(68.5% .169 237.323);--ps-color-sky-950:oklch(29.3% .066 243.157);--ps-color-rose-300:oklch(81% .117 11.638);--ps-color-rose-400:oklch(71.2% .194 13.428);--ps-color-rose-500:oklch(64.5% .246 16.439);--ps-color-zinc-200:oklch(92% .004 286.32);--ps-color-zinc-300:oklch(87.1% .006 286.286);--ps-color-zinc-400:oklch(70.5% .015 286.067);--ps-color-zinc-500:oklch(55.2% .016 285.938);--ps-color-zinc-600:oklch(44.2% .017 285.786);--ps-color-zinc-700:oklch(37% .013 285.805);--ps-color-zinc-900:oklch(21% .006 285.885);--ps-color-zinc-950:oklch(14.1% .005 285.823);--ps-color-stone-50:oklch(98.5% .001 106.423);--ps-color-stone-200:oklch(92.3% .003 48.717);--ps-color-stone-300:oklch(86.9% .005 56.366);--ps-color-stone-600:oklch(44.4% .011 73.639);--ps-color-stone-800:oklch(26.8% .007 34.298);--ps-color-black:#000;--ps-color-white:#fff;--ps-spacing:.25rem;--ps-container-4xl:56rem;--ps-text-xs:.75rem;--ps-text-xs--line-height:calc(1/.75);--ps-text-sm:.875rem;--ps-text-sm--line-height:calc(1.25/.875);--ps-text-lg:1.125rem;--ps-text-lg--line-height:calc(1.75/1.125);--ps-font-weight-medium:500;--ps-font-weight-semibold:600;--ps-font-weight-bold:700;--ps-tracking-wide:.025em;--ps-tracking-wider:.05em;--ps-radius-md:.375rem;--ps-radius-lg:.5rem;--ps-radius-xl:.75rem;--ps-radius-2xl:1rem;--ps-blur-sm:8px;--ps-default-transition-duration:.15s;--ps-default-transition-timing-function:cubic-bezier(.4,0,.2,1)}}@layer components{.ps-devtools,.ps-devtools *,.ps-devtools :before,.ps-devtools :after{box-sizing:border-box}.ps-object-table-scroll{overscroll-behavior:none;scrollbar-color:#71717a #18181b;scrollbar-width:thin}.ps-object-table-header{z-index:30;backface-visibility:hidden;position:sticky;top:0;transform:translateZ(0)}.ps-object-table-scroll::-webkit-scrollbar{width:10px;height:10px}.ps-object-table-scroll::-webkit-scrollbar-track{background:#18181b}.ps-object-table-scroll::-webkit-scrollbar-thumb{background:#71717a;border:2px solid #18181b;border-radius:999px}.ps-object-table-scroll::-webkit-scrollbar-thumb:hover{background:#a1a1aa}.ps-theme-light .ps-object-table-scroll{scrollbar-color:#a8a29e #f5f5f4}.ps-theme-light .ps-object-table-scroll::-webkit-scrollbar-track{background:#f5f5f4}.ps-theme-light .ps-object-table-scroll::-webkit-scrollbar-thumb{background:#a8a29e;border-color:#f5f5f4}.ps-theme-light .ps-object-table-scroll::-webkit-scrollbar-thumb:hover{background:#78716c}.ps-outbox-root{width:100%;min-width:0;height:100%;min-height:0}.ps-outbox{box-sizing:border-box;overscroll-behavior:contain;color:#e7e5e4;background:radial-gradient(circle at 8% 0,#e83b321f,#0000 30%),linear-gradient(145deg,#171717 0%,#111113 100%);width:100%;min-width:0;height:100%;min-height:0;padding:20px 22px;font:13px/1.45 Inter,ui-sans-serif,system-ui,sans-serif;overflow:hidden auto}.ps-outbox *{box-sizing:border-box}.ps-outbox-header{align-items:center;gap:16px;margin-bottom:20px;display:flex}.ps-outbox-heading{align-items:center;gap:11px;display:flex}.ps-outbox-mark{color:#fb7185;background:#ffffff0f;border:1px solid #ffffff1a;border-radius:10px;width:30px;height:30px;padding:5px;box-shadow:0 8px 24px #0000003d}.ps-outbox-mark svg{width:100%;height:100%;display:block}.ps-outbox-title-row{align-items:center;gap:8px;display:flex}.ps-outbox-title{color:#fafaf9;letter-spacing:-.015em;margin:0;font-size:17px;font-weight:700}.ps-outbox-subtitle{color:#a8a29e;margin:2px 0 0;font-size:12px}.ps-outbox-count{color:#d6d3d1;text-align:center;font-variant-numeric:tabular-nums;background:#27272abf;border:1px solid #3f3f46;border-radius:999px;justify-content:center;align-items:center;min-width:25px;padding:2px 7px;font-size:11px;display:inline-flex}.ps-outbox-track{overscroll-behavior-x:contain;scrollbar-width:thin;scrollbar-color:#52525b transparent;scroll-snap-type:x proximity;align-items:flex-start;width:100%;padding:4px 2px 16px;display:flex;overflow-x:auto}.ps-outbox-step{flex:none;align-items:flex-start;display:flex}.ps-outbox-node{scroll-snap-align:start;flex:0 0 clamp(250px,31vw,330px);min-width:0}.ps-outbox-connector{background:linear-gradient(90deg,#3f3f46,#52525b);border-radius:999px;flex:0 0 52px;align-self:flex-start;height:2px;margin:30px 8px 0;position:relative}.ps-outbox-connector:before{z-index:1;content:"";border-top:2px solid #71717a;border-right:2px solid #71717a;width:7px;height:7px;position:absolute;top:-3px;right:0;transform:rotate(45deg)}.ps-outbox-card{background:linear-gradient(155deg,#2d2d32f5,#1f1f23f5);border:1px solid #36363b;border-radius:14px;min-height:190px;padding:15px;position:relative;overflow:hidden;box-shadow:0 14px 36px #0003}.ps-outbox-card:before{content:"";background:#38bdf8;width:3px;position:absolute;inset:0 auto 0 0}.ps-card-executing:before{background:#f59e0b}.ps-card-failed:before{background:#ef4444}.ps-outbox-card-header{justify-content:space-between;align-items:center;gap:12px;display:flex}.ps-outbox-name{color:#fafaf9;text-overflow:ellipsis;white-space:nowrap;min-width:0;font-size:14px;font-weight:680;overflow:hidden}.ps-outbox-status{letter-spacing:.03em;border:1px solid;border-radius:999px;flex:none;align-items:center;gap:5px;padding:3px 8px;font-size:10px;font-weight:700;display:inline-flex}.ps-status-dot{background:currentColor;border-radius:999px;width:5px;height:5px}.ps-status-queued{color:#7dd3fc;background:#0c4a6e73}.ps-status-executing{color:#fcd34d;background:#78350f6b}.ps-status-failed{color:#fca5a5;background:#7f1d1d6b}.ps-outbox-meta{color:#a8a29e;flex-wrap:wrap;gap:6px 13px;margin-top:10px;font-size:11px;display:flex}.ps-outbox-meta strong{color:#d6d3d1;font-weight:600}.ps-outbox-meta-divider{opacity:.65;background:currentColor;border-radius:999px;align-self:center;width:3px;height:3px}.ps-outbox-permanent{color:#fca5a5}.ps-outbox-time{cursor:help;font-variant-numeric:tabular-nums}.ps-outbox-error{color:#fecaca;white-space:pre-wrap;background:#450a0a8c;border:1px solid #ef444459;border-radius:8px;margin-top:11px;padding:8px 10px;font-size:11px}.ps-outbox-details{color:#a8a29e;margin-top:11px;font-size:11px}.ps-outbox-details summary{cursor:pointer;-webkit-user-select:none;user-select:none;transition:color .12s}.ps-outbox-details summary:hover{color:#e7e5e4}.ps-outbox-details pre{color:#d4d4d8;background:#09090bb3;border:1px solid #303036;border-radius:8px;max-height:150px;margin:8px 0 0;padding:10px;font:11px/1.5 ui-monospace,SFMono-Regular,monospace;overflow:auto}.ps-outbox-actions{gap:7px;margin-top:13px;display:flex}.ps-button{appearance:none;font:inherit;cursor:pointer;border:1px solid #0000;border-radius:7px;align-items:center;gap:5px;padding:5px 10px;font-weight:600;transition:background .12s,border-color .12s,opacity .12s;display:inline-flex}.ps-button svg{width:13px;height:13px}.ps-button:disabled{cursor:not-allowed;opacity:.4}.ps-button-primary{color:#e0f2fe;background:#075985b3;border-color:#075985}.ps-button-primary:not(:disabled):hover{background:#0369a1}.ps-button-danger{color:#fca5a5;background:#450a0a29;border-color:#7f1d1d}.ps-button-danger:not(:disabled):hover{background:#7f1d1db3}.ps-outbox-action-error{color:#fca5a5;margin-top:8px;font-size:12px}.ps-outbox-empty{color:#a8a29e;text-align:center;background:#27272a4d;border:1px dashed #3f3f46;border-radius:14px;place-items:center;min-height:150px;padding:28px 16px;display:grid}.ps-outbox-empty-mark{color:#86efac;background:#1c2920;border:1px solid #3f3f46;border-radius:999px;place-items:center;width:34px;height:34px;margin:0 auto 9px;display:grid}.ps-outbox-empty-mark svg{width:17px;height:17px}.ps-outbox-empty strong{color:#e7e5e4;margin-bottom:2px;display:block}.ps-theme-light .ps-outbox{color:#292524;background:radial-gradient(circle at 8% 0,#e83b321a,#0000 30%),linear-gradient(145deg,#fafaf9 0%,#f5f5f4 100%)}.ps-theme-light .ps-outbox-mark{color:#dc2626;background:#ffffffd1;border-color:#e7e5e4;box-shadow:0 8px 22px #2925241a}.ps-theme-light .ps-outbox-title,.ps-theme-light .ps-outbox-name,.ps-theme-light .ps-outbox-empty strong{color:#1c1917}.ps-theme-light .ps-outbox-subtitle,.ps-theme-light .ps-outbox-meta,.ps-theme-light .ps-outbox-details{color:#78716c}.ps-theme-light .ps-outbox-meta strong{color:#44403c}.ps-theme-light .ps-outbox-count{color:#57534e;background:#fffc;border-color:#d6d3d1}.ps-theme-light .ps-outbox-card{background:linear-gradient(155deg,#fffffffa,#f5f5f4fa);border-color:#d6d3d1;box-shadow:0 14px 34px #2925241a}.ps-theme-light .ps-outbox-connector{background:#d6d3d1}.ps-theme-light .ps-outbox-details summary:hover{color:#292524}.ps-theme-light .ps-outbox-details pre{color:#44403c;background:#ffffffdb;border-color:#e7e5e4}.ps-theme-light .ps-outbox-empty{color:#78716c;background:#ffffff8c;border-color:#d6d3d1}.ps-theme-light .ps-outbox-empty-mark{color:#15803d;background:#f0fdf4;border-color:#bbf7d0}.ps-theme-light .ps-button-primary{color:#075985;background:#e0f2fe;border-color:#7dd3fc}.ps-theme-light .ps-button-primary:not(:disabled):hover{background:#bae6fd}.ps-theme-light .ps-button-danger{color:#b91c1c;background:#fff7f7;border-color:#fecaca}.ps-theme-light .ps-button-danger:not(:disabled):hover{background:#fee2e2}}@layer utilities{.ps\:pointer-events-none{pointer-events:none}.ps\:invisible{visibility:hidden}.ps\:sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.ps\:absolute{position:absolute}.ps\:fixed{position:fixed}.ps\:relative{position:relative}.ps\:sticky{position:sticky}.ps\:inset-0{inset:calc(var(--ps-spacing)*0)}.ps\:inset-y-0{inset-block:calc(var(--ps-spacing)*0)}.ps\:top-0{top:calc(var(--ps-spacing)*0)}.ps\:top-4{top:calc(var(--ps-spacing)*4)}.ps\:right-0{right:calc(var(--ps-spacing)*0)}.ps\:right-4{right:calc(var(--ps-spacing)*4)}.ps\:left-0{left:calc(var(--ps-spacing)*0)}.ps\:z-20{z-index:20}.ps\:z-50{z-index:50}.ps\:z-\[100001\]{z-index:100001}.ps\:z-\[100002\]{z-index:100002}.ps\:z-\[100003\]{z-index:100003}.ps\:m-0{margin:calc(var(--ps-spacing)*0)}.ps\:m-4{margin:calc(var(--ps-spacing)*4)}.ps\:mt-0{margin-top:calc(var(--ps-spacing)*0)}.ps\:mt-0\.5{margin-top:calc(var(--ps-spacing)*.5)}.ps\:mb-0{margin-bottom:calc(var(--ps-spacing)*0)}.ps\:mb-2{margin-bottom:calc(var(--ps-spacing)*2)}.ps\:ml-1\.5{margin-left:calc(var(--ps-spacing)*1.5)}.ps\:ml-auto{margin-left:auto}.ps\:block{display:block}.ps\:flex{display:flex}.ps\:grid{display:grid}.ps\:inline-flex{display:inline-flex}.ps\:size-3{width:calc(var(--ps-spacing)*3);height:calc(var(--ps-spacing)*3)}.ps\:size-3\.5{width:calc(var(--ps-spacing)*3.5);height:calc(var(--ps-spacing)*3.5)}.ps\:size-4{width:calc(var(--ps-spacing)*4);height:calc(var(--ps-spacing)*4)}.ps\:size-5{width:calc(var(--ps-spacing)*5);height:calc(var(--ps-spacing)*5)}.ps\:size-10{width:calc(var(--ps-spacing)*10);height:calc(var(--ps-spacing)*10)}.ps\:size-full{width:100%;height:100%}.ps\:h-44{height:calc(var(--ps-spacing)*44)}.ps\:h-full{height:100%}.ps\:max-h-28{max-height:calc(var(--ps-spacing)*28)}.ps\:max-h-\[80vh\]{max-height:80vh}.ps\:max-h-full{max-height:100%}.ps\:min-h-0{min-height:calc(var(--ps-spacing)*0)}.ps\:min-h-40{min-height:calc(var(--ps-spacing)*40)}.ps\:min-h-full{min-height:100%}.ps\:w-0\.5{width:calc(var(--ps-spacing)*.5)}.ps\:w-1{width:calc(var(--ps-spacing)*1)}.ps\:w-44{width:calc(var(--ps-spacing)*44)}.ps\:w-\[230px\]{width:230px}.ps\:w-full{width:100%}.ps\:max-w-4xl{max-width:var(--ps-container-4xl)}.ps\:max-w-40{max-width:calc(var(--ps-spacing)*40)}.ps\:max-w-64{max-width:calc(var(--ps-spacing)*64)}.ps\:max-w-72{max-width:calc(var(--ps-spacing)*72)}.ps\:max-w-80{max-width:calc(var(--ps-spacing)*80)}.ps\:max-w-\[80vw\]{max-width:80vw}.ps\:min-w-0{min-width:calc(var(--ps-spacing)*0)}.ps\:min-w-5{min-width:calc(var(--ps-spacing)*5)}.ps\:min-w-48{min-width:calc(var(--ps-spacing)*48)}.ps\:flex-1{flex:1}.ps\:flex-none{flex:none}.ps\:table-fixed{table-layout:fixed}.ps\:border-separate{border-collapse:separate}.ps\:border-spacing-0{--tw-border-spacing-x:calc(var(--ps-spacing)*0);--tw-border-spacing-y:calc(var(--ps-spacing)*0);border-spacing:var(--tw-border-spacing-x)var(--tw-border-spacing-y)}.ps\:cursor-col-resize{cursor:col-resize}.ps\:cursor-default{cursor:default}.ps\:cursor-grab{cursor:grab}.ps\:touch-none{touch-action:none}.ps\:flex-col{flex-direction:column}.ps\:place-items-center{place-items:center}.ps\:items-center{align-items:center}.ps\:justify-between{justify-content:space-between}.ps\:justify-center{justify-content:center}.ps\:gap-1{gap:calc(var(--ps-spacing)*1)}.ps\:gap-1\.5{gap:calc(var(--ps-spacing)*1.5)}.ps\:gap-2{gap:calc(var(--ps-spacing)*2)}.ps\:gap-3{gap:calc(var(--ps-spacing)*3)}.ps\:truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.ps\:overflow-auto{overflow:auto}.ps\:overflow-hidden{overflow:hidden}.ps\:overflow-visible{overflow:visible}.ps\:overflow-y-auto{overflow-y:auto}.ps\:rounded{border-radius:.25rem}.ps\:rounded-2xl{border-radius:var(--ps-radius-2xl)}.ps\:rounded-full{border-radius:3.40282e38px}.ps\:rounded-lg{border-radius:var(--ps-radius-lg)}.ps\:rounded-md{border-radius:var(--ps-radius-md)}.ps\:rounded-xl{border-radius:var(--ps-radius-xl)}.ps\:border{border-style:var(--tw-border-style);border-width:1px}.ps\:border-0{border-style:var(--tw-border-style);border-width:0}.ps\:border-x-0{border-inline-style:var(--tw-border-style);border-inline-width:0}.ps\:border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.ps\:border-t-0{border-top-style:var(--tw-border-style);border-top-width:0}.ps\:border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.ps\:border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.ps\:border-b-2{border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.ps\:border-dashed{--tw-border-style:dashed;border-style:dashed}.ps\:border-transparent{border-color:#0000}.ps\:border-zinc-500\/15{border-color:var(--ps-color-zinc-500)}@supports (color:color-mix(in lab, red, red)){.ps\:border-zinc-500\/15{border-color:color-mix(in oklab,var(--ps-color-zinc-500)15%,transparent)}}.ps\:border-zinc-500\/20{border-color:var(--ps-color-zinc-500)}@supports (color:color-mix(in lab, red, red)){.ps\:border-zinc-500\/20{border-color:color-mix(in oklab,var(--ps-color-zinc-500)20%,transparent)}}.ps\:border-zinc-500\/30{border-color:var(--ps-color-zinc-500)}@supports (color:color-mix(in lab, red, red)){.ps\:border-zinc-500\/30{border-color:color-mix(in oklab,var(--ps-color-zinc-500)30%,transparent)}}.ps\:border-zinc-500\/40{border-color:var(--ps-color-zinc-500)}@supports (color:color-mix(in lab, red, red)){.ps\:border-zinc-500\/40{border-color:color-mix(in oklab,var(--ps-color-zinc-500)40%,transparent)}}.ps\:border-zinc-600{border-color:var(--ps-color-zinc-600)}.ps\:border-zinc-700{border-color:var(--ps-color-zinc-700)}.ps\:bg-black\/75{background-color:var(--ps-color-black)}@supports (color:color-mix(in lab, red, red)){.ps\:bg-black\/75{background-color:color-mix(in oklab,var(--ps-color-black)75%,transparent)}}.ps\:bg-red-500\/20{background-color:var(--ps-color-red-500)}@supports (color:color-mix(in lab, red, red)){.ps\:bg-red-500\/20{background-color:color-mix(in oklab,var(--ps-color-red-500)20%,transparent)}}.ps\:bg-rose-400{background-color:var(--ps-color-rose-400)}.ps\:bg-rose-500\/15{background-color:var(--ps-color-rose-500)}@supports (color:color-mix(in lab, red, red)){.ps\:bg-rose-500\/15{background-color:color-mix(in oklab,var(--ps-color-rose-500)15%,transparent)}}.ps\:bg-sky-500\/20{background-color:var(--ps-color-sky-500)}@supports (color:color-mix(in lab, red, red)){.ps\:bg-sky-500\/20{background-color:color-mix(in oklab,var(--ps-color-sky-500)20%,transparent)}}.ps\:bg-stone-50{background-color:var(--ps-color-stone-50)}.ps\:bg-transparent{background-color:#0000}.ps\:bg-zinc-500\/10{background-color:var(--ps-color-zinc-500)}@supports (color:color-mix(in lab, red, red)){.ps\:bg-zinc-500\/10{background-color:color-mix(in oklab,var(--ps-color-zinc-500)10%,transparent)}}.ps\:bg-zinc-500\/15{background-color:var(--ps-color-zinc-500)}@supports (color:color-mix(in lab, red, red)){.ps\:bg-zinc-500\/15{background-color:color-mix(in oklab,var(--ps-color-zinc-500)15%,transparent)}}.ps\:bg-zinc-900,.ps\:bg-zinc-900\/95{background-color:var(--ps-color-zinc-900)}@supports (color:color-mix(in lab, red, red)){.ps\:bg-zinc-900\/95{background-color:color-mix(in oklab,var(--ps-color-zinc-900)95%,transparent)}}.ps\:bg-zinc-950,.ps\:bg-zinc-950\/25{background-color:var(--ps-color-zinc-950)}@supports (color:color-mix(in lab, red, red)){.ps\:bg-zinc-950\/25{background-color:color-mix(in oklab,var(--ps-color-zinc-950)25%,transparent)}}.ps\:bg-zinc-950\/90{background-color:var(--ps-color-zinc-950)}@supports (color:color-mix(in lab, red, red)){.ps\:bg-zinc-950\/90{background-color:color-mix(in oklab,var(--ps-color-zinc-950)90%,transparent)}}.ps\:bg-zinc-950\/95{background-color:var(--ps-color-zinc-950)}@supports (color:color-mix(in lab, red, red)){.ps\:bg-zinc-950\/95{background-color:color-mix(in oklab,var(--ps-color-zinc-950)95%,transparent)}}.ps\:fill-none{fill:none}.ps\:fill-rose-400{fill:var(--ps-color-rose-400)}.ps\:fill-sky-950{fill:var(--ps-color-sky-950)}.ps\:fill-zinc-300{fill:var(--ps-color-zinc-300)}.ps\:fill-zinc-700{fill:var(--ps-color-zinc-700)}.ps\:fill-zinc-900{fill:var(--ps-color-zinc-900)}.ps\:stroke-rose-400\/80{stroke:var(--ps-color-rose-400)}@supports (color:color-mix(in lab, red, red)){.ps\:stroke-rose-400\/80{stroke:color-mix(in oklab,var(--ps-color-rose-400)80%,transparent)}}.ps\:stroke-zinc-600{stroke:var(--ps-color-zinc-600)}.ps\:stroke-zinc-700{stroke:var(--ps-color-zinc-700)}.ps\:object-contain{object-fit:contain}.ps\:object-cover{object-fit:cover}.ps\:p-0{padding:calc(var(--ps-spacing)*0)}.ps\:p-1\.5{padding:calc(var(--ps-spacing)*1.5)}.ps\:p-3{padding:calc(var(--ps-spacing)*3)}.ps\:p-5{padding:calc(var(--ps-spacing)*5)}.ps\:p-8{padding:calc(var(--ps-spacing)*8)}.ps\:px-1\.5{padding-inline:calc(var(--ps-spacing)*1.5)}.ps\:px-2{padding-inline:calc(var(--ps-spacing)*2)}.ps\:px-2\.5{padding-inline:calc(var(--ps-spacing)*2.5)}.ps\:px-3{padding-inline:calc(var(--ps-spacing)*3)}.ps\:px-3\.5{padding-inline:calc(var(--ps-spacing)*3.5)}.ps\:px-4{padding-inline:calc(var(--ps-spacing)*4)}.ps\:py-0\.5{padding-block:calc(var(--ps-spacing)*.5)}.ps\:py-1{padding-block:calc(var(--ps-spacing)*1)}.ps\:py-1\.5{padding-block:calc(var(--ps-spacing)*1.5)}.ps\:py-2{padding-block:calc(var(--ps-spacing)*2)}.ps\:py-3{padding-block:calc(var(--ps-spacing)*3)}.ps\:pt-2{padding-top:calc(var(--ps-spacing)*2)}.ps\:pb-1{padding-bottom:calc(var(--ps-spacing)*1)}.ps\:text-center{text-align:center}.ps\:text-left{text-align:left}.ps\:font-mono{font-family:var(--ps-font-mono)}.ps\:font-sans{font-family:var(--ps-font-sans)}.ps\:text-lg{font-size:var(--ps-text-lg);line-height:var(--tw-leading,var(--ps-text-lg--line-height))}.ps\:text-sm{font-size:var(--ps-text-sm);line-height:var(--tw-leading,var(--ps-text-sm--line-height))}.ps\:text-xs{font-size:var(--ps-text-xs);line-height:var(--tw-leading,var(--ps-text-xs--line-height))}.ps\:text-\[9px\]{font-size:9px}.ps\:text-\[10px\]{font-size:10px}.ps\:text-\[11px\]{font-size:11px}.ps\:text-\[13px\]{font-size:13px}.ps\:leading-none{--tw-leading:1;line-height:1}.ps\:font-bold{--tw-font-weight:var(--ps-font-weight-bold);font-weight:var(--ps-font-weight-bold)}.ps\:font-medium{--tw-font-weight:var(--ps-font-weight-medium);font-weight:var(--ps-font-weight-medium)}.ps\:font-semibold{--tw-font-weight:var(--ps-font-weight-semibold);font-weight:var(--ps-font-weight-semibold)}.ps\:tracking-\[0\.14em\]{--tw-tracking:.14em;letter-spacing:.14em}.ps\:tracking-wide{--tw-tracking:var(--ps-tracking-wide);letter-spacing:var(--ps-tracking-wide)}.ps\:tracking-wider{--tw-tracking:var(--ps-tracking-wider);letter-spacing:var(--ps-tracking-wider)}.ps\:whitespace-nowrap{white-space:nowrap}.ps\:text-inherit{color:inherit}.ps\:text-red-300{color:var(--ps-color-red-300)}.ps\:text-rose-400{color:var(--ps-color-rose-400)}.ps\:text-sky-300{color:var(--ps-color-sky-300)}.ps\:text-sky-400{color:var(--ps-color-sky-400)}.ps\:text-stone-200{color:var(--ps-color-stone-200)}.ps\:text-stone-800{color:var(--ps-color-stone-800)}.ps\:text-white{color:var(--ps-color-white)}.ps\:text-zinc-200{color:var(--ps-color-zinc-200)}.ps\:text-zinc-400{color:var(--ps-color-zinc-400)}.ps\:text-zinc-500{color:var(--ps-color-zinc-500)}.ps\:text-zinc-600{color:var(--ps-color-zinc-600)}.ps\:uppercase{text-transform:uppercase}.ps\:tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,)var(--tw-slashed-zero,)var(--tw-numeric-figure,)var(--tw-numeric-spacing,)var(--tw-numeric-fraction,)}.ps\:underline{text-decoration-line:underline}.ps\:decoration-dotted{text-decoration-style:dotted}.ps\:underline-offset-4{text-underline-offset:4px}.ps\:shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ps\:shadow-\[0_0_0_1px_rgba\(251\,113\,133\,0\.18\)\]{--tw-shadow:0 0 0 1px var(--tw-shadow-color,#fb71852e);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ps\:shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a),0 8px 10px -6px 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)}.ps\:backdrop-blur{--tw-backdrop-blur:blur(8px);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.ps\:backdrop-blur-sm{--tw-backdrop-blur:blur(var(--ps-blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.ps\: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(--ps-default-transition-timing-function));transition-duration:var(--tw-duration,var(--ps-default-transition-duration))}.ps\:will-change-transform{will-change:transform}.ps\:outline-none{--tw-outline-style:none;outline-style:none}@media (hover:hover){.ps\:hover\:border-rose-400:hover{border-color:var(--ps-color-rose-400)}.ps\:hover\:border-zinc-500\/60:hover{border-color:var(--ps-color-zinc-500)}@supports (color:color-mix(in lab, red, red)){.ps\:hover\:border-zinc-500\/60:hover{border-color:color-mix(in oklab,var(--ps-color-zinc-500)60%,transparent)}}.ps\:hover\:bg-rose-400\/70:hover{background-color:var(--ps-color-rose-400)}@supports (color:color-mix(in lab, red, red)){.ps\:hover\:bg-rose-400\/70:hover{background-color:color-mix(in oklab,var(--ps-color-rose-400)70%,transparent)}}.ps\:hover\:bg-zinc-500\/8:hover{background-color:var(--ps-color-zinc-500)}@supports (color:color-mix(in lab, red, red)){.ps\:hover\:bg-zinc-500\/8:hover{background-color:color-mix(in oklab,var(--ps-color-zinc-500)8%,transparent)}}.ps\:hover\:bg-zinc-500\/10:hover{background-color:var(--ps-color-zinc-500)}@supports (color:color-mix(in lab, red, red)){.ps\:hover\:bg-zinc-500\/10:hover{background-color:color-mix(in oklab,var(--ps-color-zinc-500)10%,transparent)}}.ps\:hover\:text-current:hover{color:currentColor}.ps\:hover\:text-rose-300:hover{color:var(--ps-color-rose-300)}.ps\:hover\:text-rose-400:hover{color:var(--ps-color-rose-400)}}.ps\:focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.ps\:focus-visible\:bg-rose-400\/70:focus-visible{background-color:var(--ps-color-rose-400)}@supports (color:color-mix(in lab, red, red)){.ps\:focus-visible\:bg-rose-400\/70:focus-visible{background-color:color-mix(in oklab,var(--ps-color-rose-400)70%,transparent)}}.ps\:active\:cursor-grabbing:active{cursor:grabbing}.ps\:disabled\:opacity-40:disabled{opacity:.4}.ps\:disabled\:opacity-50:disabled{opacity:.5}:where(.ps-theme-light) .ps\:in-\[\.ps-theme-light\]\:bg-stone-50\/95{background-color:var(--ps-color-stone-50)}@supports (color:color-mix(in lab, red, red)){:where(.ps-theme-light) .ps\:in-\[\.ps-theme-light\]\:bg-stone-50\/95{background-color:color-mix(in oklab,var(--ps-color-stone-50)95%,transparent)}}:where(.ps-theme-light) .ps\:in-\[\.ps-theme-light\]\:bg-white\/45{background-color:var(--ps-color-white)}@supports (color:color-mix(in lab, red, red)){:where(.ps-theme-light) .ps\:in-\[\.ps-theme-light\]\:bg-white\/45{background-color:color-mix(in oklab,var(--ps-color-white)45%,transparent)}}:where(.ps-theme-light) .ps\:in-\[\.ps-theme-light\]\:bg-white\/95{background-color:var(--ps-color-white)}@supports (color:color-mix(in lab, red, red)){:where(.ps-theme-light) .ps\:in-\[\.ps-theme-light\]\:bg-white\/95{background-color:color-mix(in oklab,var(--ps-color-white)95%,transparent)}}:where(.ps-theme-light) .ps\:in-\[\.ps-theme-light\]\:fill-stone-600{fill:var(--ps-color-stone-600)}:where(.ps-theme-light) .ps\:in-\[\.ps-theme-light\]\:fill-white{fill:var(--ps-color-white)}:where(.ps-theme-light) .ps\:in-\[\.ps-theme-light\]\:stroke-stone-300{stroke:var(--ps-color-stone-300)}.ps\:data-\[active\]\:border-rose-400[data-active]{border-color:var(--ps-color-rose-400)}.ps\:data-\[active\]\:font-semibold[data-active]{--tw-font-weight:var(--ps-font-weight-semibold);font-weight:var(--ps-font-weight-semibold)}.ps\:data-\[active\]\:text-rose-400[data-active]{color:var(--ps-color-rose-400)}.ps\:data-\[highlighted\]\:bg-zinc-700\/70[data-highlighted]{background-color:var(--ps-color-zinc-700)}@supports (color:color-mix(in lab, red, red)){.ps\:data-\[highlighted\]\:bg-zinc-700\/70[data-highlighted]{background-color:color-mix(in oklab,var(--ps-color-zinc-700)70%,transparent)}}}@property --tw-border-spacing-x{syntax:"<length>";inherits:false;initial-value:0}@property --tw-border-spacing-y{syntax:"<length>";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-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{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-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}
|