@motiadev/workbench 0.0.1 → 0.0.3

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 (183) hide show
  1. package/dist/index.d.ts +10 -0
  2. package/dist/index.d.ts.map +1 -0
  3. package/dist/index.js +8 -0
  4. package/dist/middleware.d.ts +3 -0
  5. package/dist/middleware.d.ts.map +1 -0
  6. package/dist/middleware.js +47 -0
  7. package/dist/src/components/app-sidebar.d.ts +2 -0
  8. package/dist/src/components/app-sidebar.d.ts.map +1 -0
  9. package/dist/src/components/app-sidebar.js +13 -0
  10. package/dist/src/components/log-console.d.ts +2 -0
  11. package/dist/src/components/log-console.d.ts.map +1 -0
  12. package/dist/src/components/log-console.js +20 -0
  13. package/dist/src/components/log-level-badge.d.ts +4 -0
  14. package/dist/src/components/log-level-badge.d.ts.map +1 -0
  15. package/dist/src/components/log-level-badge.js +11 -0
  16. package/dist/src/components/ui/badge.d.ts +10 -0
  17. package/dist/src/components/ui/badge.d.ts.map +1 -0
  18. package/dist/src/components/ui/badge.js +23 -0
  19. package/dist/src/components/ui/button.d.ts +12 -0
  20. package/dist/src/components/ui/button.d.ts.map +1 -0
  21. package/dist/src/components/ui/button.js +34 -0
  22. package/dist/src/components/ui/collapsible.d.ts +6 -0
  23. package/dist/src/components/ui/collapsible.d.ts.map +1 -0
  24. package/dist/src/components/ui/collapsible.js +5 -0
  25. package/dist/src/components/ui/dialog.d.ts +20 -0
  26. package/dist/src/components/ui/dialog.d.ts.map +1 -0
  27. package/dist/src/components/ui/dialog.js +22 -0
  28. package/dist/src/components/ui/input.d.ts +4 -0
  29. package/dist/src/components/ui/input.d.ts.map +1 -0
  30. package/dist/src/components/ui/input.js +8 -0
  31. package/dist/src/components/ui/label.d.ts +6 -0
  32. package/dist/src/components/ui/label.d.ts.map +1 -0
  33. package/dist/src/components/ui/label.js +10 -0
  34. package/dist/src/components/ui/select.d.ts +14 -0
  35. package/dist/src/components/ui/select.d.ts.map +1 -0
  36. package/dist/src/components/ui/select.js +26 -0
  37. package/dist/src/components/ui/separator.d.ts +5 -0
  38. package/dist/src/components/ui/separator.d.ts.map +1 -0
  39. package/dist/src/components/ui/separator.js +8 -0
  40. package/dist/src/components/ui/sheet.d.ts +26 -0
  41. package/dist/src/components/ui/sheet.d.ts.map +1 -0
  42. package/dist/src/components/ui/sheet.js +36 -0
  43. package/dist/src/components/ui/sidebar.d.ts +67 -0
  44. package/dist/src/components/ui/sidebar.d.ts.map +1 -0
  45. package/dist/src/components/ui/sidebar.js +221 -0
  46. package/dist/src/components/ui/skeleton.d.ts +3 -0
  47. package/dist/src/components/ui/skeleton.d.ts.map +1 -0
  48. package/dist/src/components/ui/skeleton.js +6 -0
  49. package/dist/src/components/ui/switch.d.ts +5 -0
  50. package/dist/src/components/ui/switch.d.ts.map +1 -0
  51. package/dist/src/components/ui/switch.js +7 -0
  52. package/dist/src/components/ui/table.d.ts +11 -0
  53. package/dist/src/components/ui/table.d.ts.map +1 -0
  54. package/dist/src/components/ui/table.js +20 -0
  55. package/dist/src/components/ui/textarea.d.ts +4 -0
  56. package/dist/src/components/ui/textarea.d.ts.map +1 -0
  57. package/dist/src/components/ui/textarea.js +8 -0
  58. package/dist/src/components/ui/tooltip.d.ts +8 -0
  59. package/dist/src/components/ui/tooltip.d.ts.map +1 -0
  60. package/dist/src/components/ui/tooltip.js +11 -0
  61. package/dist/src/hooks/use-list-flows.d.ts +10 -0
  62. package/dist/src/hooks/use-list-flows.d.ts.map +1 -0
  63. package/dist/src/hooks/use-list-flows.js +12 -0
  64. package/dist/src/hooks/use-log-listener.d.ts +6 -0
  65. package/dist/src/hooks/use-log-listener.d.ts.map +1 -0
  66. package/dist/src/hooks/use-log-listener.js +22 -0
  67. package/dist/src/hooks/use-mobile.d.ts +2 -0
  68. package/dist/src/hooks/use-mobile.d.ts.map +1 -0
  69. package/dist/src/hooks/use-mobile.js +15 -0
  70. package/dist/src/lib/utils.d.ts +3 -0
  71. package/dist/src/lib/utils.d.ts.map +1 -0
  72. package/dist/src/lib/utils.js +5 -0
  73. package/dist/src/main.d.ts +9 -0
  74. package/dist/src/main.d.ts.map +1 -0
  75. package/dist/src/main.js +15 -0
  76. package/dist/src/publicComponents/api-node.d.ts +8 -0
  77. package/dist/src/publicComponents/api-node.d.ts.map +1 -0
  78. package/dist/src/publicComponents/api-node.js +7 -0
  79. package/dist/src/publicComponents/base-handle.d.ts +8 -0
  80. package/dist/src/publicComponents/base-handle.d.ts.map +1 -0
  81. package/dist/src/publicComponents/base-handle.js +7 -0
  82. package/dist/src/publicComponents/base-node.d.ts +16 -0
  83. package/dist/src/publicComponents/base-node.d.ts.map +1 -0
  84. package/dist/src/publicComponents/base-node.js +20 -0
  85. package/dist/src/publicComponents/emits.d.ts +5 -0
  86. package/dist/src/publicComponents/emits.d.ts.map +1 -0
  87. package/dist/src/publicComponents/emits.js +6 -0
  88. package/dist/src/publicComponents/event-node.d.ts +9 -0
  89. package/dist/src/publicComponents/event-node.d.ts.map +1 -0
  90. package/dist/src/publicComponents/event-node.js +9 -0
  91. package/dist/src/publicComponents/node-props.d.ts +12 -0
  92. package/dist/src/publicComponents/node-props.d.ts.map +1 -0
  93. package/dist/src/publicComponents/node-props.js +1 -0
  94. package/dist/src/publicComponents/noop-node.d.ts +8 -0
  95. package/dist/src/publicComponents/noop-node.d.ts.map +1 -0
  96. package/dist/src/publicComponents/noop-node.js +5 -0
  97. package/dist/src/publicComponents/subscribe.d.ts +5 -0
  98. package/dist/src/publicComponents/subscribe.d.ts.map +1 -0
  99. package/dist/src/publicComponents/subscribe.js +5 -0
  100. package/dist/src/route-wrapper.d.ts +4 -0
  101. package/dist/src/route-wrapper.d.ts.map +1 -0
  102. package/dist/src/route-wrapper.js +4 -0
  103. package/dist/src/routeTree.gen.d.ts +53 -0
  104. package/dist/src/routeTree.gen.d.ts.map +1 -0
  105. package/dist/src/routeTree.gen.js +45 -0
  106. package/dist/src/routes/__root.d.ts +2 -0
  107. package/dist/src/routes/__root.d.ts.map +1 -0
  108. package/dist/src/routes/__root.js +15 -0
  109. package/dist/src/routes/flow/$id.d.ts +4 -0
  110. package/dist/src/routes/flow/$id.d.ts.map +1 -0
  111. package/dist/src/routes/flow/$id.js +15 -0
  112. package/dist/src/routes/index.d.ts +2 -0
  113. package/dist/src/routes/index.d.ts.map +1 -0
  114. package/dist/src/routes/index.js +8 -0
  115. package/dist/src/stores/use-logs.d.ts +15 -0
  116. package/dist/src/stores/use-logs.d.ts.map +1 -0
  117. package/dist/src/stores/use-logs.js +6 -0
  118. package/dist/src/views/flow/arrow-head.d.ts +8 -0
  119. package/dist/src/views/flow/arrow-head.d.ts.map +1 -0
  120. package/dist/src/views/flow/arrow-head.js +2 -0
  121. package/dist/src/views/flow/base-edge.d.ts +4 -0
  122. package/dist/src/views/flow/base-edge.d.ts.map +1 -0
  123. package/dist/src/views/flow/base-edge.js +22 -0
  124. package/dist/src/views/flow/flow-loader.d.ts +2 -0
  125. package/dist/src/views/flow/flow-loader.d.ts.map +1 -0
  126. package/dist/src/views/flow/flow-loader.js +4 -0
  127. package/dist/src/views/flow/flow-view.d.ts +8 -0
  128. package/dist/src/views/flow/flow-view.d.ts.map +1 -0
  129. package/dist/src/views/flow/flow-view.js +40 -0
  130. package/dist/src/views/flow/hooks/use-get-flow-state.d.ts +40 -0
  131. package/dist/src/views/flow/hooks/use-get-flow-state.d.ts.map +1 -0
  132. package/dist/src/views/flow/hooks/use-get-flow-state.js +48 -0
  133. package/dist/src/views/flow/hooks/use-organize-nodes.d.ts +4 -0
  134. package/dist/src/views/flow/hooks/use-organize-nodes.d.ts.map +1 -0
  135. package/dist/src/views/flow/hooks/use-organize-nodes.js +43 -0
  136. package/dist/src/views/flow/legend.d.ts +4 -0
  137. package/dist/src/views/flow/legend.d.ts.map +1 -0
  138. package/dist/src/views/flow/legend.js +41 -0
  139. package/dist/src/views/flow/node-organizer.d.ts +6 -0
  140. package/dist/src/views/flow/node-organizer.d.ts.map +1 -0
  141. package/dist/src/views/flow/node-organizer.js +51 -0
  142. package/dist/src/views/flow/nodes/api-flow-node.d.ts +5 -0
  143. package/dist/src/views/flow/nodes/api-flow-node.d.ts.map +1 -0
  144. package/dist/src/views/flow/nodes/api-flow-node.js +5 -0
  145. package/dist/src/views/flow/nodes/event-flow-node.d.ts +3 -0
  146. package/dist/src/views/flow/nodes/event-flow-node.d.ts.map +1 -0
  147. package/dist/src/views/flow/nodes/event-flow-node.js +5 -0
  148. package/dist/src/views/flow/nodes/json-schema-form.d.ts +9 -0
  149. package/dist/src/views/flow/nodes/json-schema-form.d.ts.map +1 -0
  150. package/dist/src/views/flow/nodes/json-schema-form.js +35 -0
  151. package/dist/src/views/flow/nodes/language-indicator.d.ts +8 -0
  152. package/dist/src/views/flow/nodes/language-indicator.d.ts.map +1 -0
  153. package/dist/src/views/flow/nodes/language-indicator.js +25 -0
  154. package/dist/src/views/flow/nodes/nodes.types.d.ts +37 -0
  155. package/dist/src/views/flow/nodes/nodes.types.d.ts.map +1 -0
  156. package/dist/src/views/flow/nodes/nodes.types.js +1 -0
  157. package/dist/src/views/flow/nodes/noop-flow-node.d.ts +5 -0
  158. package/dist/src/views/flow/nodes/noop-flow-node.d.ts.map +1 -0
  159. package/dist/src/views/flow/nodes/noop-flow-node.js +5 -0
  160. package/dist/tailwind.config.d.ts +4 -0
  161. package/dist/tailwind.config.d.ts.map +1 -0
  162. package/dist/tailwind.config.js +77 -0
  163. package/dist/tsconfig.app.tsbuildinfo +1 -0
  164. package/dist/tsconfig.node.tsbuildinfo +1 -0
  165. package/dist/vite.config.d.ts +11 -0
  166. package/dist/vite.config.d.ts.map +1 -0
  167. package/dist/vite.config.js +18 -0
  168. package/middleware.ts +3 -2
  169. package/package.json +5 -3
  170. package/postcss.config.js +1 -1
  171. package/src/views/flow/base-edge.tsx +7 -20
  172. package/src/views/flow/flow-view.tsx +1 -1
  173. package/src/views/flow/hooks/use-get-flow-state.tsx +18 -34
  174. package/src/views/flow/legend.tsx +45 -8
  175. package/src/views/flow/nodes/nodes.types.ts +4 -4
  176. package/tsconfig.app.json +7 -5
  177. package/tsconfig.json +1 -0
  178. package/tsconfig.node.json +15 -5
  179. package/vite.config.ts +3 -3
  180. package/dist/.empty +0 -0
  181. package/dist/assets/index-DGmArPOa.css +0 -1
  182. package/dist/assets/index-hQsWtfVb.js +0 -182
  183. package/dist/index.html +0 -20
@@ -1,22 +1,9 @@
1
- import {
2
- BaseEdge as BaseReactFlowEdge,
3
- EdgeProps,
4
- getSmoothStepPath,
5
- } from '@xyflow/react'
1
+ import { BaseEdge as BaseReactFlowEdge, EdgeProps, getSmoothStepPath } from '@xyflow/react'
6
2
  import React from 'react'
7
3
 
8
4
  export const BaseEdge: React.FC<EdgeProps> = (props) => {
9
- const {
10
- sourceX,
11
- sourceY,
12
- targetX,
13
- targetY,
14
- sourcePosition,
15
- targetPosition,
16
- } = props
5
+ const { sourceX, sourceY, targetX, targetY, sourcePosition, targetPosition, data } = props
17
6
 
18
- // getSmoothStepPath returns an array: [edgePath, labelX, labelY, etc.]
19
- // We just need edgePath here.
20
7
  const [edgePath] = getSmoothStepPath({
21
8
  sourceX,
22
9
  sourceY,
@@ -24,21 +11,21 @@ export const BaseEdge: React.FC<EdgeProps> = (props) => {
24
11
  targetY,
25
12
  sourcePosition,
26
13
  targetPosition,
27
- borderRadius: 20, // <— Tweak this for roundness
28
- offset: 10, // <— How far the line extends before curving
14
+ borderRadius: 20,
15
+ offset: 10,
29
16
  })
30
17
 
31
18
  return (
32
19
  <BaseReactFlowEdge
33
20
  path={edgePath}
34
21
  style={{
35
- stroke: 'rgba(100, 100, 100)',
22
+ stroke: data?.variant === 'virtual' ? 'rgb(147, 169, 197)' : 'rgb(133, 176, 132)',
36
23
  strokeWidth: 0.5,
37
24
  shapeRendering: 'geometricPrecision',
38
25
  fill: 'none',
39
- mixBlendMode: 'screen', // or 'screen'
26
+ mixBlendMode: 'screen',
40
27
  }}
41
28
  className="edge-animated"
42
29
  />
43
30
  )
44
- }
31
+ }
@@ -1,4 +1,4 @@
1
- import { Background, BackgroundVariant, ReactFlow, Node } from '@xyflow/react'
1
+ import { Background, BackgroundVariant, ReactFlow } from '@xyflow/react'
2
2
  import '@xyflow/react/dist/style.css'
3
3
  import { BaseEdge } from './base-edge'
4
4
  import { ArrowHead } from './arrow-head'
@@ -5,7 +5,7 @@ import { ApiFlowNode } from '../nodes/api-flow-node'
5
5
  import { NoopFlowNode } from '../nodes/noop-flow-node'
6
6
  import { EventFlowNode } from '../nodes/event-flow-node'
7
7
 
8
- type Emit = string | { type: string; label?: string; conditional?: boolean }
8
+ type Emit = string | { type: string; label?: string }
9
9
 
10
10
  type FlowStep = {
11
11
  id: string
@@ -14,7 +14,8 @@ type FlowStep = {
14
14
  description?: string
15
15
  subscribes?: string[]
16
16
  emits: Emit[]
17
- action: 'webhook'
17
+ virtualEmits?: Emit[]
18
+ action?: 'webhook'
18
19
  webhookUrl?: string
19
20
  language?: string
20
21
  nodeComponentPath?: string
@@ -24,6 +25,14 @@ export type FlowResponse = {
24
25
  id: string
25
26
  name: string
26
27
  steps: FlowStep[]
28
+ edges: FlowEdge[]
29
+ }
30
+
31
+ type FlowEdge = {
32
+ id: string
33
+ source: string
34
+ target: string
35
+ data: EdgeData
27
36
  }
28
37
 
29
38
  type FlowState = {
@@ -39,6 +48,7 @@ async function importFlow(flow: FlowResponse): Promise<FlowState> {
39
48
  noop: NoopFlowNode,
40
49
  }
41
50
 
51
+ // Load custom node components if they exist
42
52
  for (const step of flow.steps) {
43
53
  if (step.nodeComponentPath) {
44
54
  const module = await import(/* @vite-ignore */ step.nodeComponentPath)
@@ -46,7 +56,7 @@ async function importFlow(flow: FlowResponse): Promise<FlowState> {
46
56
  }
47
57
  }
48
58
 
49
- // we need to check all subscribes and emits to connect the nodes using edges
59
+ // Create nodes from steps
50
60
  const nodes: Node<NodeData>[] = flow.steps.map((step) => ({
51
61
  id: step.id,
52
62
  type: step.nodeComponentPath ? step.nodeComponentPath : step.type,
@@ -55,37 +65,11 @@ async function importFlow(flow: FlowResponse): Promise<FlowState> {
55
65
  language: step.language,
56
66
  }))
57
67
 
58
- const edges: Edge<EdgeData>[] = []
59
-
60
- // For each node that emits events
61
- flow.steps.forEach((sourceNode) => {
62
- const emits = sourceNode.emits || []
63
-
64
- // Check all other nodes that subscribe to those events
65
- flow.steps.forEach((targetNode) => {
66
- const subscribes = targetNode.subscribes || []
67
-
68
- // For each matching emit->subscribe, create an edge
69
- emits.forEach((emit) => {
70
- const emitType = typeof emit === 'string' ? emit : emit.type
71
-
72
- if (subscribes.includes(emitType)) {
73
- const label = typeof emit !== 'string' ? emit.label : undefined
74
- const variant = typeof emit !== 'string' && emit.conditional ? 'conditional' : 'default'
75
- const data: EdgeData = { variant, label }
76
-
77
- edges.push({
78
- id: `${sourceNode.id}-${targetNode.id}`,
79
- type: 'base',
80
- source: sourceNode.id,
81
- target: targetNode.id,
82
- label,
83
- data,
84
- })
85
- }
86
- })
87
- })
88
- })
68
+ // Use the edges provided by the API, adding required ReactFlow properties
69
+ const edges: Edge<EdgeData>[] = flow.edges.map((edge) => ({
70
+ ...edge,
71
+ type: 'base',
72
+ }))
89
73
 
90
74
  return { nodes, edges, nodeTypes }
91
75
  }
@@ -4,35 +4,60 @@ export const Legend = ({ onHover }: { onHover: (type: string | null) => void })
4
4
  label: 'Event (Core)',
5
5
  type: 'event',
6
6
  bgColor: 'bg-green-950/40',
7
- description: 'Core logic components that process events',
7
+ description: 'Core logic components that process events.',
8
8
  },
9
9
  {
10
10
  label: 'API',
11
11
  type: 'api',
12
12
  bgColor: 'bg-blue-950/40',
13
- description: 'HTTP endpoints that trigger flows',
13
+ description: 'HTTP endpoints that trigger flows.',
14
14
  },
15
15
  {
16
16
  label: 'Noop (Non-Operation)',
17
17
  type: 'noop',
18
18
  bgColor: 'bg-zinc-950/40',
19
- description: 'Placeholder nodes for external processes',
19
+ description: 'Placeholder nodes for external processes.',
20
+ },
21
+ ]
22
+
23
+ const edgeLegendItems = [
24
+ {
25
+ label: 'Event Edge',
26
+ color: 'rgb(133, 176, 132)', // Solid green line
27
+ description: 'Represents an event emitted and subscribed by steps.',
28
+ dashed: true,
29
+ },
30
+ {
31
+ label: 'Virtual Edge',
32
+ color: 'rgb(147, 169, 197)', // Dotted blue line
33
+ description: 'Represents virtual connections.',
34
+ dashed: true,
20
35
  },
21
36
  ]
22
37
 
23
38
  const renderSwatch = (bgColor: string) => (
24
39
  <div className="relative group">
25
- {/* Border gradient container */}
26
40
  <div className="absolute -inset-[1px] rounded bg-gradient-to-r from-white/20 to-white/10" />
27
-
28
- {/* Main swatch */}
29
41
  <div className={`relative ${bgColor} w-8 h-8 rounded border border-white/10`} />
30
-
31
- {/* Stacked effect */}
32
42
  <div className="absolute inset-0 -z-10 translate-y-0.5 translate-x-0.5 bg-black/20 rounded border border-white/5" />
33
43
  </div>
34
44
  )
35
45
 
46
+ const renderEdgeSwatch = (color: string, dashed: boolean) => (
47
+ <svg width="48" height="10" viewBox="0 0 48 10" xmlns="http://www.w3.org/2000/svg">
48
+ <line
49
+ x1="0"
50
+ y1="5"
51
+ x2="48"
52
+ y2="5"
53
+ stroke={color}
54
+ strokeWidth=".8"
55
+ strokeDasharray={dashed ? '4 3' : 'none'} // Match the dashed or solid style
56
+ strokeLinecap="round" // Rounded edges
57
+ />
58
+ </svg>
59
+ )
60
+
36
61
  return (
37
62
  <div className="absolute right-4 top-4 font-mono rounded-lg border border-white/20 p-4 z-10 shadow-xl">
38
63
  <div className="text-sm text-white mb-3 font-semibold">Flow Legend</div>
@@ -54,6 +79,18 @@ export const Legend = ({ onHover }: { onHover: (type: string | null) => void })
54
79
  </div>
55
80
  ))}
56
81
  </div>
82
+ <div className="text-sm text-white mt-4 mb-3 font-semibold">Edge Legend</div>
83
+ <div className="flex flex-col gap-3">
84
+ {edgeLegendItems.map((item) => (
85
+ <div key={item.label} className="flex items-start gap-3">
86
+ {renderEdgeSwatch(item.color, item.dashed)}
87
+ <div className="flex-1">
88
+ <div className="text-white text-xs font-medium">{item.label}</div>
89
+ <div className="text-white/60 text-xs mt-0.5">{item.description}</div>
90
+ </div>
91
+ </div>
92
+ ))}
93
+ </div>
57
94
  </div>
58
95
  )
59
96
  }
@@ -5,7 +5,7 @@ export type EventNodeData = {
5
5
  name: string
6
6
  description?: string
7
7
  subscribes: string[]
8
- emits: Array<string | { type: string; label?: string; conditional?: boolean }>
8
+ emits: Array<string | { type: string; label?: string }>
9
9
  language?: string
10
10
  }
11
11
 
@@ -21,16 +21,16 @@ export type ApiNodeData = {
21
21
  type: string
22
22
  name: string
23
23
  description?: string
24
- emits: Array<string | { type: string; label?: string; conditional?: boolean }>
24
+ emits: Array<string | { type: string; label?: string }>
25
25
  subscribes?: string[]
26
- action: 'webhook'
27
26
  webhookUrl?: string
28
27
  bodySchema?: JSONSchema7
29
28
  }
30
29
 
31
30
  export type NodeData = EventNodeData | ApiNodeData | NoopNodeData
32
31
 
32
+ // ducplicate of packages/core/src/flows-endpoint.ts
33
33
  export type EdgeData = {
34
34
  label?: string
35
- variant: 'default' | 'conditional'
35
+ variant: 'event' | 'virtual'
36
36
  }
package/tsconfig.app.json CHANGED
@@ -10,15 +10,17 @@
10
10
  "useDefineForClassFields": true,
11
11
  "lib": ["ES2020", "DOM", "DOM.Iterable"],
12
12
  "module": "ESNext",
13
+ "moduleResolution": "Bundler",
13
14
  "skipLibCheck": true,
15
+ "esModuleInterop": true,
14
16
 
15
- /* Bundler mode */
16
- "moduleResolution": "bundler",
17
- "allowImportingTsExtensions": true,
17
+ "composite": true,
18
+ "declaration": true,
19
+ "declarationMap": true,
18
20
  "isolatedModules": true,
19
21
  "moduleDetection": "force",
20
- "noEmit": true,
21
22
  "jsx": "react-jsx",
23
+ "outDir": "dist",
22
24
 
23
25
  /* Linting */
24
26
  "strict": true,
@@ -26,5 +28,5 @@
26
28
  "noUnusedParameters": true,
27
29
  "noFallthroughCasesInSwitch": true
28
30
  },
29
- "include": ["src"]
31
+ "include": ["src", "index.tsx"]
30
32
  }
package/tsconfig.json CHANGED
@@ -6,6 +6,7 @@
6
6
  ],
7
7
  "compilerOptions": {
8
8
  "baseUrl": ".",
9
+ "outDir": "dist",
9
10
  "paths": {
10
11
  "@/*": ["./src/*"]
11
12
  }
@@ -2,15 +2,25 @@
2
2
  "compilerOptions": {
3
3
  "target": "ES2022",
4
4
  "lib": ["ES2023"],
5
- "module": "ESNext",
5
+ "module": "NodeNext",
6
6
  "skipLibCheck": true,
7
7
 
8
+ /* Module Resolution */
9
+ "moduleResolution": "NodeNext",
10
+ "allowSyntheticDefaultImports": true,
11
+ "esModuleInterop": true,
12
+ "resolveJsonModule": true,
13
+
8
14
  /* Bundler mode */
9
- "moduleResolution": "bundler",
10
- "allowImportingTsExtensions": true,
15
+ "composite": true,
16
+ "declaration": true,
17
+ "declarationMap": true,
11
18
  "isolatedModules": true,
12
19
  "moduleDetection": "force",
13
- "noEmit": true,
20
+ "outDir": "dist",
21
+
22
+ /* Interop Flags */
23
+ "forceConsistentCasingInFileNames": true,
14
24
 
15
25
  /* Linting */
16
26
  "strict": true,
@@ -18,5 +28,5 @@
18
28
  "noUnusedParameters": true,
19
29
  "noFallthroughCasesInSwitch": true
20
30
  },
21
- "include": ["vite.config.ts"]
31
+ "include": ["vite.config.ts", "middleware.ts", "tailwind.config.ts"]
22
32
  }
package/vite.config.ts CHANGED
@@ -1,14 +1,14 @@
1
- import { defineConfig } from 'vite'
2
1
  import react from '@vitejs/plugin-react'
3
2
  import path from 'path'
4
3
  import { TanStackRouterVite } from '@tanstack/router-plugin/vite'
5
4
 
6
5
  // https://vite.dev/config/
7
- export default defineConfig({
6
+ /** @type {import('vite').UserConfig} */
7
+ export default {
8
8
  plugins: [TanStackRouterVite(), react()],
9
9
  resolve: {
10
10
  alias: {
11
11
  '@': path.resolve(__dirname, './src'),
12
12
  },
13
13
  },
14
- })
14
+ }
package/dist/.empty DELETED
File without changes
@@ -1 +0,0 @@
1
- *,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}:root{--background: 0 0% 100%;--foreground: 224 71.4% 4.1%;--card: 0 0% 100%;--card-foreground: 224 71.4% 4.1%;--popover: 0 0% 100%;--popover-foreground: 224 71.4% 4.1%;--primary: 220.9 39.3% 11%;--primary-foreground: 210 20% 98%;--secondary: 220 14.3% 95.9%;--secondary-foreground: 220.9 39.3% 11%;--muted: 220 14.3% 95.9%;--muted-foreground: 220 8.9% 46.1%;--accent: 220 14.3% 95.9%;--accent-foreground: 220.9 39.3% 11%;--destructive: 0 84.2% 60.2%;--destructive-foreground: 210 20% 98%;--border: 220 13% 91%;--input: 220 13% 91%;--ring: 224 71.4% 4.1%;--chart-1: 12 76% 61%;--chart-2: 173 58% 39%;--chart-3: 197 37% 24%;--chart-4: 43 74% 66%;--chart-5: 27 87% 67%;--radius: .5rem;--sidebar-background: 0 0% 98%;--sidebar-foreground: 240 5.3% 26.1%;--sidebar-primary: 240 5.9% 10%;--sidebar-primary-foreground: 0 0% 98%;--sidebar-accent: 240 4.8% 95.9%;--sidebar-accent-foreground: 240 5.9% 10%;--sidebar-border: 220 13% 91%;--sidebar-ring: 217.2 91.2% 59.8%}.dark{--background: 224 71.4% 4.1%;--foreground: 210 20% 98%;--card: 224 71.4% 4.1%;--card-foreground: 210 20% 98%;--popover: 224 71.4% 4.1%;--popover-foreground: 210 20% 98%;--primary: 210 20% 98%;--primary-foreground: 220.9 39.3% 11%;--secondary: 215 27.9% 16.9%;--secondary-foreground: 210 20% 98%;--muted: 215 27.9% 16.9%;--muted-foreground: 217.9 10.6% 64.9%;--accent: 215 27.9% 16.9%;--accent-foreground: 210 20% 98%;--destructive: 0 62.8% 30.6%;--destructive-foreground: 210 20% 98%;--border: 215 27.9% 16.9%;--input: 215 27.9% 16.9%;--ring: 216 12.2% 83.9%;--chart-1: 220 70% 50%;--chart-2: 160 60% 45%;--chart-3: 30 80% 55%;--chart-4: 280 65% 60%;--chart-5: 340 75% 55%;--sidebar-background: 240 5.9% 10%;--sidebar-foreground: 240 4.8% 95.9%;--sidebar-primary: 224.3 76.3% 48%;--sidebar-primary-foreground: 0 0% 100%;--sidebar-accent: 240 3.7% 15.9%;--sidebar-accent-foreground: 240 4.8% 95.9%;--sidebar-border: 240 3.7% 15.9%;--sidebar-ring: 217.2 91.2% 59.8%}*{border-color:hsl(var(--border))}body{background-color:hsl(var(--background));color:hsl(var(--foreground))}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.pointer-events-none{pointer-events:none}.fixed{position:fixed}.absolute{position:absolute}.\!relative{position:relative!important}.relative{position:relative}.inset-0{top:0;right:0;bottom:0;left:0}.inset-x-0{left:0;right:0}.inset-y-0{top:0;bottom:0}.\!left-auto{left:auto!important}.bottom-0{bottom:0}.bottom-\[-13px\]{bottom:-13px}.bottom-\[calc\(50\%\+10px\)\]{bottom:calc(50% + 10px)}.left-0{left:0}.left-\[-32px\]{left:-32px}.left-\[calc\(50\%-20px\)\]{left:calc(50% - 20px)}.right-0{right:0}.right-1{right:.25rem}.right-3{right:.75rem}.right-4{right:1rem}.right-\[-20px\]{right:-20px}.top-0{top:0}.top-1\.5{top:.375rem}.top-3\.5{top:.875rem}.top-4{top:1rem}.top-\[-26px\]{top:-26px}.z-10{z-index:10}.z-20{z-index:20}.z-50{z-index:50}.mx-2{margin-left:.5rem;margin-right:.5rem}.mx-3\.5{margin-left:.875rem;margin-right:.875rem}.mt-2{margin-top:.5rem}.\!flex{display:flex!important}.flex{display:flex}.inline-flex{display:inline-flex}.hidden{display:none}.aspect-square{aspect-ratio:1 / 1}.size-4{width:1rem;height:1rem}.\!h-9{height:2.25rem!important}.h-10{height:2.5rem}.h-12{height:3rem}.h-3{height:.75rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-7{height:1.75rem}.h-8{height:2rem}.h-9{height:2.25rem}.h-\[1px\]{height:1px}.h-full{height:100%}.h-screen{height:100vh}.h-svh{height:100svh}.min-h-0{min-height:0px}.min-h-svh{min-height:100svh}.\!w-9{width:2.25rem!important}.w-3{width:.75rem}.w-3\/4{width:75%}.w-4{width:1rem}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-7{width:1.75rem}.w-9{width:2.25rem}.w-\[--sidebar-width\]{width:var(--sidebar-width)}.w-\[1px\]{width:1px}.w-auto{width:auto}.w-full{width:100%}.w-screen{width:100vw}.min-w-0{min-width:0px}.min-w-5{min-width:1.25rem}.max-w-\[--skeleton-width\]{max-width:var(--skeleton-width)}.flex-1{flex:1 1 0%}.shrink-0{flex-shrink:0}.-translate-x-1\/2{--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-x-px{--tw-translate-x: -1px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-px{--tw-translate-x: 1px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.\!transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}.cursor-pointer{cursor:pointer}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.\!items-center{align-items:center!important}.items-center{align-items:center}.justify-center{justify-content:center}.gap-1{gap:.25rem}.gap-2{gap:.5rem}.gap-4{gap:1rem}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.whitespace-nowrap{white-space:nowrap}.rounded-\[10px\]{border-radius:10px}.rounded-\[14px\]{border-radius:14px}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:var(--radius)}.rounded-md{border-radius:calc(var(--radius) - 2px)}.rounded-sm{border-radius:calc(var(--radius) - 4px)}.\!border-0{border-width:0px!important}.border{border-width:1px}.border-0{border-width:0px}.border-\[2px\]{border-width:2px}.border-b{border-bottom-width:1px}.border-l{border-left-width:1px}.border-r{border-right-width:1px}.border-t{border-top-width:1px}.border-solid{border-style:solid}.border-dashed{border-style:dashed}.border-\[\#b3b3b3\]{--tw-border-opacity: 1;border-color:rgb(179 179 179 / var(--tw-border-opacity, 1))}.border-amber-950{--tw-border-opacity: 1;border-color:rgb(69 26 3 / var(--tw-border-opacity, 1))}.border-input{border-color:hsl(var(--input))}.border-sidebar-border{border-color:hsl(var(--sidebar-border))}.border-sky-900{--tw-border-opacity: 1;border-color:rgb(12 74 110 / var(--tw-border-opacity, 1))}.\!bg-transparent{background-color:transparent!important}.bg-\[\#060911\]{--tw-bg-opacity: 1;background-color:rgb(6 9 17 / var(--tw-bg-opacity, 1))}.bg-amber-300{--tw-bg-opacity: 1;background-color:rgb(252 211 77 / var(--tw-bg-opacity, 1))}.bg-background{background-color:hsl(var(--background))}.bg-black{--tw-bg-opacity: 1;background-color:rgb(0 0 0 / var(--tw-bg-opacity, 1))}.bg-black\/80{background-color:#000c}.bg-border{background-color:hsl(var(--border))}.bg-destructive{background-color:hsl(var(--destructive))}.bg-primary{background-color:hsl(var(--primary))}.bg-primary\/10{background-color:hsl(var(--primary) / .1)}.bg-secondary{background-color:hsl(var(--secondary))}.bg-sidebar{background-color:hsl(var(--sidebar-background))}.bg-sidebar-border{background-color:hsl(var(--sidebar-border))}.bg-sky-500{--tw-bg-opacity: 1;background-color:rgb(14 165 233 / var(--tw-bg-opacity, 1))}.bg-transparent{background-color:transparent}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.p-0{padding:0}.p-1{padding:.25rem}.p-2{padding:.5rem}.p-6{padding:1.5rem}.p-\[1px\]{padding:1px}.px-1{padding-left:.25rem;padding-right:.25rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-8{padding-left:2rem;padding-right:2rem}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.text-left{text-align:left}.text-center{text-align:center}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xs{font-size:.75rem;line-height:1rem}.font-medium{font-weight:500}.font-semibold{font-weight:600}.italic{font-style:italic}.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)}.text-amber-950{--tw-text-opacity: 1;color:rgb(69 26 3 / var(--tw-text-opacity, 1))}.text-black{--tw-text-opacity: 1;color:rgb(0 0 0 / var(--tw-text-opacity, 1))}.text-destructive-foreground{color:hsl(var(--destructive-foreground))}.text-foreground{color:hsl(var(--foreground))}.text-gray-100{--tw-text-opacity: 1;color:rgb(243 244 246 / var(--tw-text-opacity, 1))}.text-gray-500{--tw-text-opacity: 1;color:rgb(107 114 128 / var(--tw-text-opacity, 1))}.text-muted-foreground{color:hsl(var(--muted-foreground))}.text-primary{color:hsl(var(--primary))}.text-primary-foreground{color:hsl(var(--primary-foreground))}.text-secondary-foreground{color:hsl(var(--secondary-foreground))}.text-sidebar-foreground{color:hsl(var(--sidebar-foreground))}.text-sidebar-foreground\/70{color:hsl(var(--sidebar-foreground) / .7)}.text-sky-950{--tw-text-opacity: 1;color:rgb(8 47 73 / var(--tw-text-opacity, 1))}.underline-offset-4{text-underline-offset:4px}.opacity-70{opacity:.7}.shadow{--tw-shadow: 0 1px 3px 0 rgb(0 0 0 / .1), 0 1px 2px -1px rgb(0 0 0 / .1);--tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[0_0_0_1px_hsl\(var\(--sidebar-border\)\)\]{--tw-shadow: 0 0 0 1px hsl(var(--sidebar-border));--tw-shadow-colored: 0 0 0 1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-none{--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.outline-none{outline:2px solid transparent;outline-offset:2px}.outline{outline-style:solid}.ring-sidebar-ring{--tw-ring-color: hsl(var(--sidebar-ring))}.ring-offset-background{--tw-ring-offset-color: hsl(var(--background))}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\[left\,right\,width\]{transition-property:left,right,width;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\[margin\,opa\]{transition-property:margin,opa;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\[width\,height\,padding\]{transition-property:width,height,padding;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\[width\]{transition-property:width;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-200{transition-duration:.2s}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}.ease-linear{transition-timing-function:linear}@keyframes enter{0%{opacity:var(--tw-enter-opacity, 1);transform:translate3d(var(--tw-enter-translate-x, 0),var(--tw-enter-translate-y, 0),0) scale3d(var(--tw-enter-scale, 1),var(--tw-enter-scale, 1),var(--tw-enter-scale, 1)) rotate(var(--tw-enter-rotate, 0))}}@keyframes exit{to{opacity:var(--tw-exit-opacity, 1);transform:translate3d(var(--tw-exit-translate-x, 0),var(--tw-exit-translate-y, 0),0) scale3d(var(--tw-exit-scale, 1),var(--tw-exit-scale, 1),var(--tw-exit-scale, 1)) rotate(var(--tw-exit-rotate, 0))}}.animate-in{animation-name:enter;animation-duration:.15s;--tw-enter-opacity: initial;--tw-enter-scale: initial;--tw-enter-rotate: initial;--tw-enter-translate-x: initial;--tw-enter-translate-y: initial}.fade-in-0{--tw-enter-opacity: 0}.zoom-in-95{--tw-enter-scale: .95}.duration-200{animation-duration:.2s}.ease-in-out{animation-timing-function:cubic-bezier(.4,0,.2,1)}.ease-linear{animation-timing-function:linear}html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td,article,aside,canvas,details,embed,figure,figcaption,footer,header,hgroup,menu,nav,output,ruby,section,summary,time,mark,audio,video{margin:0;padding:0;border:0;font:inherit;vertical-align:baseline}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block}body{line-height:1}ol,ul{list-style:none}blockquote,q{quotes:none}blockquote:before,blockquote:after,q:before,q:after{content:"";content:none}table{border-collapse:collapse;border-spacing:0}:root{font-family:Inter,system-ui,Avenir,Helvetica,Arial,sans-serif;line-height:1.5;font-size:16px;color:#ffffffde;background-color:#242424;width:100%;color-scheme:light dark;font-synthesis:none;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-family:PT Sans,serif;font-optical-sizing:auto}body{margin:0;place-items:center;min-height:100dvh;width:100%}button,textarea{font-family:PT Sans,serif}strong{font-weight:800}body,#root{width:100dvw;height:100dvh}.react-flow__attribution{display:none}.file\:border-0::file-selector-button{border-width:0px}.file\:bg-transparent::file-selector-button{background-color:transparent}.file\:text-sm::file-selector-button{font-size:.875rem;line-height:1.25rem}.file\:font-medium::file-selector-button{font-weight:500}.file\:text-foreground::file-selector-button{color:hsl(var(--foreground))}.placeholder\:text-muted-foreground::-moz-placeholder{color:hsl(var(--muted-foreground))}.placeholder\:text-muted-foreground::placeholder{color:hsl(var(--muted-foreground))}.after\:\!absolute:after{content:var(--tw-content);position:absolute!important}.after\:absolute:after{content:var(--tw-content);position:absolute}.after\:-inset-2:after{content:var(--tw-content);top:-.5rem;right:-.5rem;bottom:-.5rem;left:-.5rem}.after\:inset-y-0:after{content:var(--tw-content);top:0;bottom:0}.after\:\!left-\[15px\]:after{content:var(--tw-content);left:15px!important}.after\:\!top-\[15px\]:after{content:var(--tw-content);top:15px!important}.after\:left-1\/2:after{content:var(--tw-content);left:50%}.after\:\!h-1\.5:after{content:var(--tw-content);height:.375rem!important}.after\:\!w-1\.5:after{content:var(--tw-content);width:.375rem!important}.after\:w-\[2px\]:after{content:var(--tw-content);width:2px}.after\:\!rounded-full:after{content:var(--tw-content);border-radius:9999px!important}.after\:\!bg-white:after{content:var(--tw-content);--tw-bg-opacity: 1 !important;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))!important}.hover\:bg-accent:hover{background-color:hsl(var(--accent))}.hover\:bg-destructive\/90:hover{background-color:hsl(var(--destructive) / .9)}.hover\:bg-primary\/90:hover{background-color:hsl(var(--primary) / .9)}.hover\:bg-secondary\/80:hover{background-color:hsl(var(--secondary) / .8)}.hover\:bg-sidebar-accent:hover{background-color:hsl(var(--sidebar-accent))}.hover\:text-accent-foreground:hover{color:hsl(var(--accent-foreground))}.hover\:text-sidebar-accent-foreground:hover{color:hsl(var(--sidebar-accent-foreground))}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-100:hover{opacity:1}.hover\:shadow-\[0_0_0_1px_hsl\(var\(--sidebar-accent\)\)\]:hover{--tw-shadow: 0 0 0 1px hsl(var(--sidebar-accent));--tw-shadow-colored: 0 0 0 1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.hover\:after\:bg-sidebar-border:hover:after{content:var(--tw-content);background-color:hsl(var(--sidebar-border))}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-2:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-ring:focus{--tw-ring-color: hsl(var(--ring))}.focus\:ring-offset-2:focus{--tw-ring-offset-width: 2px}.focus-visible\:outline-none:focus-visible{outline:2px solid transparent;outline-offset:2px}.focus-visible\:ring-1:focus-visible{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus-visible\:ring-2:focus-visible{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus-visible\:ring-ring:focus-visible{--tw-ring-color: hsl(var(--ring))}.focus-visible\:ring-sidebar-ring:focus-visible{--tw-ring-color: hsl(var(--sidebar-ring))}.active\:bg-sidebar-accent:active{background-color:hsl(var(--sidebar-accent))}.active\:text-sidebar-accent-foreground:active{color:hsl(var(--sidebar-accent-foreground))}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}.group\/menu-item:focus-within .group-focus-within\/menu-item\:opacity-100{opacity:1}.group\/menu-item:hover .group-hover\/menu-item\:opacity-100{opacity:1}.peer\/menu-button:hover~.peer-hover\/menu-button\:text-sidebar-accent-foreground{color:hsl(var(--sidebar-accent-foreground))}.has-\[\[data-variant\=inset\]\]\:bg-sidebar:has([data-variant=inset]){background-color:hsl(var(--sidebar-background))}.group\/menu-item:has([data-sidebar=menu-action]) .group-has-\[\[data-sidebar\=menu-action\]\]\/menu-item\:pr-8{padding-right:2rem}.aria-disabled\:pointer-events-none[aria-disabled=true]{pointer-events:none}.aria-disabled\:opacity-50[aria-disabled=true]{opacity:.5}.data-\[active\=true\]\:bg-sidebar-accent[data-active=true]{background-color:hsl(var(--sidebar-accent))}.data-\[state\=open\]\:bg-secondary[data-state=open]{background-color:hsl(var(--secondary))}.data-\[active\=true\]\:font-medium[data-active=true]{font-weight:500}.data-\[active\=true\]\:text-sidebar-accent-foreground[data-active=true]{color:hsl(var(--sidebar-accent-foreground))}.data-\[state\=open\]\:opacity-100[data-state=open]{opacity:1}.data-\[state\=closed\]\:duration-300[data-state=closed]{transition-duration:.3s}.data-\[state\=open\]\:duration-500[data-state=open]{transition-duration:.5s}.data-\[state\=open\]\:animate-in[data-state=open]{animation-name:enter;animation-duration:.15s;--tw-enter-opacity: initial;--tw-enter-scale: initial;--tw-enter-rotate: initial;--tw-enter-translate-x: initial;--tw-enter-translate-y: initial}.data-\[state\=closed\]\:animate-out[data-state=closed]{animation-name:exit;animation-duration:.15s;--tw-exit-opacity: initial;--tw-exit-scale: initial;--tw-exit-rotate: initial;--tw-exit-translate-x: initial;--tw-exit-translate-y: initial}.data-\[state\=closed\]\:fade-out-0[data-state=closed]{--tw-exit-opacity: 0}.data-\[state\=open\]\:fade-in-0[data-state=open]{--tw-enter-opacity: 0}.data-\[state\=closed\]\:zoom-out-95[data-state=closed]{--tw-exit-scale: .95}.data-\[side\=bottom\]\:slide-in-from-top-2[data-side=bottom]{--tw-enter-translate-y: -.5rem}.data-\[side\=left\]\:slide-in-from-right-2[data-side=left]{--tw-enter-translate-x: .5rem}.data-\[side\=right\]\:slide-in-from-left-2[data-side=right]{--tw-enter-translate-x: -.5rem}.data-\[side\=top\]\:slide-in-from-bottom-2[data-side=top]{--tw-enter-translate-y: .5rem}.data-\[state\=closed\]\:slide-out-to-bottom[data-state=closed]{--tw-exit-translate-y: 100%}.data-\[state\=closed\]\:slide-out-to-left[data-state=closed]{--tw-exit-translate-x: -100%}.data-\[state\=closed\]\:slide-out-to-right[data-state=closed]{--tw-exit-translate-x: 100%}.data-\[state\=closed\]\:slide-out-to-top[data-state=closed]{--tw-exit-translate-y: -100%}.data-\[state\=open\]\:slide-in-from-bottom[data-state=open]{--tw-enter-translate-y: 100%}.data-\[state\=open\]\:slide-in-from-left[data-state=open]{--tw-enter-translate-x: -100%}.data-\[state\=open\]\:slide-in-from-right[data-state=open]{--tw-enter-translate-x: 100%}.data-\[state\=open\]\:slide-in-from-top[data-state=open]{--tw-enter-translate-y: -100%}.data-\[state\=closed\]\:duration-300[data-state=closed]{animation-duration:.3s}.data-\[state\=open\]\:duration-500[data-state=open]{animation-duration:.5s}.data-\[state\=open\]\:hover\:bg-sidebar-accent:hover[data-state=open]{background-color:hsl(var(--sidebar-accent))}.data-\[state\=open\]\:hover\:text-sidebar-accent-foreground:hover[data-state=open]{color:hsl(var(--sidebar-accent-foreground))}.group[data-collapsible=offcanvas] .group-data-\[collapsible\=offcanvas\]\:left-\[calc\(var\(--sidebar-width\)\*-1\)\]{left:calc(var(--sidebar-width) * -1)}.group[data-collapsible=offcanvas] .group-data-\[collapsible\=offcanvas\]\:right-\[calc\(var\(--sidebar-width\)\*-1\)\]{right:calc(var(--sidebar-width) * -1)}.group[data-side=left] .group-data-\[side\=left\]\:-right-4{right:-1rem}.group[data-side=right] .group-data-\[side\=right\]\:left-0{left:0}.group[data-collapsible=icon] .group-data-\[collapsible\=icon\]\:-mt-8{margin-top:-2rem}.group[data-collapsible=icon] .group-data-\[collapsible\=icon\]\:hidden{display:none}.group[data-collapsible=icon] .group-data-\[collapsible\=icon\]\:\!size-8{width:2rem!important;height:2rem!important}.group[data-collapsible=icon] .group-data-\[collapsible\=icon\]\:w-\[--sidebar-width-icon\]{width:var(--sidebar-width-icon)}.group[data-collapsible=icon] .group-data-\[collapsible\=icon\]\:w-\[calc\(var\(--sidebar-width-icon\)_\+_theme\(spacing\.4\)\)\]{width:calc(var(--sidebar-width-icon) + 1rem)}.group[data-collapsible=icon] .group-data-\[collapsible\=icon\]\:w-\[calc\(var\(--sidebar-width-icon\)_\+_theme\(spacing\.4\)_\+2px\)\]{width:calc(var(--sidebar-width-icon) + 1rem + 2px)}.group[data-collapsible=offcanvas] .group-data-\[collapsible\=offcanvas\]\:w-0{width:0px}.group[data-collapsible=offcanvas] .group-data-\[collapsible\=offcanvas\]\:translate-x-0{--tw-translate-x: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.group[data-side=right] .group-data-\[side\=right\]\:rotate-180{--tw-rotate: 180deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.group[data-collapsible=icon] .group-data-\[collapsible\=icon\]\:overflow-hidden{overflow:hidden}.group[data-variant=floating] .group-data-\[variant\=floating\]\:rounded-lg{border-radius:var(--radius)}.group[data-variant=floating] .group-data-\[variant\=floating\]\:border{border-width:1px}.group[data-side=left] .group-data-\[side\=left\]\:border-r{border-right-width:1px}.group[data-side=right] .group-data-\[side\=right\]\:border-l{border-left-width:1px}.group[data-variant=floating] .group-data-\[variant\=floating\]\:border-sidebar-border{border-color:hsl(var(--sidebar-border))}.group[data-collapsible=icon] .group-data-\[collapsible\=icon\]\:\!p-0{padding:0!important}.group[data-collapsible=icon] .group-data-\[collapsible\=icon\]\:\!p-2{padding:.5rem!important}.group[data-collapsible=icon] .group-data-\[collapsible\=icon\]\:opacity-0{opacity:0}.group[data-variant=floating] .group-data-\[variant\=floating\]\:shadow{--tw-shadow: 0 1px 3px 0 rgb(0 0 0 / .1), 0 1px 2px -1px rgb(0 0 0 / .1);--tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.group[data-collapsible=offcanvas] .group-data-\[collapsible\=offcanvas\]\:after\:left-full:after{content:var(--tw-content);left:100%}.group[data-collapsible=offcanvas] .group-data-\[collapsible\=offcanvas\]\:hover\:bg-sidebar:hover{background-color:hsl(var(--sidebar-background))}.peer\/menu-button[data-size=default]~.peer-data-\[size\=default\]\/menu-button\:top-1\.5{top:.375rem}.peer\/menu-button[data-size=lg]~.peer-data-\[size\=lg\]\/menu-button\:top-2\.5{top:.625rem}.peer\/menu-button[data-size=sm]~.peer-data-\[size\=sm\]\/menu-button\:top-1{top:.25rem}.peer[data-variant=inset]~.peer-data-\[variant\=inset\]\:min-h-\[calc\(100svh-theme\(spacing\.4\)\)\]{min-height:calc(100svh - 1rem)}.peer\/menu-button[data-active=true]~.peer-data-\[active\=true\]\/menu-button\:text-sidebar-accent-foreground{color:hsl(var(--sidebar-accent-foreground))}@media (min-width: 640px){.sm\:flex{display:flex}.sm\:max-w-sm{max-width:24rem}.sm\:flex-row{flex-direction:row}.sm\:justify-end{justify-content:flex-end}.sm\:space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(.5rem * var(--tw-space-x-reverse));margin-left:calc(.5rem * calc(1 - var(--tw-space-x-reverse)))}.sm\:text-left{text-align:left}}@media (min-width: 768px){.md\:block{display:block}.md\:flex{display:flex}.md\:text-sm{font-size:.875rem;line-height:1.25rem}.md\:opacity-0{opacity:0}.after\:md\:hidden:after{content:var(--tw-content);display:none}.peer[data-variant=inset]~.md\:peer-data-\[variant\=inset\]\:m-2{margin:.5rem}.peer[data-state=collapsed][data-variant=inset]~.md\:peer-data-\[state\=collapsed\]\:peer-data-\[variant\=inset\]\:ml-2{margin-left:.5rem}.peer[data-variant=inset]~.md\:peer-data-\[variant\=inset\]\:ml-0{margin-left:0}.peer[data-variant=inset]~.md\:peer-data-\[variant\=inset\]\:rounded-xl{border-radius:.75rem}.peer[data-variant=inset]~.md\:peer-data-\[variant\=inset\]\:shadow{--tw-shadow: 0 1px 3px 0 rgb(0 0 0 / .1), 0 1px 2px -1px rgb(0 0 0 / .1);--tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}}.\[\&\>button\]\:hidden>button{display:none}.\[\&\>span\:last-child\]\:truncate>span:last-child{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.\[\&\>svg\]\:size-4>svg{width:1rem;height:1rem}.\[\&\>svg\]\:shrink-0>svg{flex-shrink:0}.\[\&\>svg\]\:text-sidebar-accent-foreground>svg{color:hsl(var(--sidebar-accent-foreground))}.\[\&_svg\]\:pointer-events-none svg{pointer-events:none}.\[\&_svg\]\:size-4 svg{width:1rem;height:1rem}.\[\&_svg\]\:shrink-0 svg{flex-shrink:0}[data-side=left][data-collapsible=offcanvas] .\[\[data-side\=left\]\[data-collapsible\=offcanvas\]_\&\]\:-right-2{right:-.5rem}[data-side=left][data-state=collapsed] .\[\[data-side\=left\]\[data-state\=collapsed\]_\&\]\:cursor-e-resize{cursor:e-resize}[data-side=left] .\[\[data-side\=left\]_\&\]\:cursor-w-resize{cursor:w-resize}[data-side=right][data-collapsible=offcanvas] .\[\[data-side\=right\]\[data-collapsible\=offcanvas\]_\&\]\:-left-2{left:-.5rem}[data-side=right][data-state=collapsed] .\[\[data-side\=right\]\[data-state\=collapsed\]_\&\]\:cursor-w-resize{cursor:w-resize}[data-side=right] .\[\[data-side\=right\]_\&\]\:cursor-e-resize{cursor:e-resize}.react-flow{direction:ltr;--xy-edge-stroke-default: #b1b1b7;--xy-edge-stroke-width-default: 1;--xy-edge-stroke-selected-default: #555;--xy-connectionline-stroke-default: #b1b1b7;--xy-connectionline-stroke-width-default: 1;--xy-attribution-background-color-default: rgba(255, 255, 255, .5);--xy-minimap-background-color-default: #fff;--xy-minimap-mask-background-color-default: rgb(240, 240, 240, .6);--xy-minimap-mask-stroke-color-default: transparent;--xy-minimap-mask-stroke-width-default: 1;--xy-minimap-node-background-color-default: #e2e2e2;--xy-minimap-node-stroke-color-default: transparent;--xy-minimap-node-stroke-width-default: 2;--xy-background-color-default: transparent;--xy-background-pattern-dots-color-default: #91919a;--xy-background-pattern-lines-color-default: #eee;--xy-background-pattern-cross-color-default: #e2e2e2;background-color:var(--xy-background-color, var(--xy-background-color-default));--xy-node-color-default: inherit;--xy-node-border-default: 1px solid #1a192b;--xy-node-background-color-default: #fff;--xy-node-group-background-color-default: rgba(240, 240, 240, .25);--xy-node-boxshadow-hover-default: 0 1px 4px 1px rgba(0, 0, 0, .08);--xy-node-boxshadow-selected-default: 0 0 0 .5px #1a192b;--xy-node-border-radius-default: 3px;--xy-handle-background-color-default: #1a192b;--xy-handle-border-color-default: #fff;--xy-selection-background-color-default: rgba(0, 89, 220, .08);--xy-selection-border-default: 1px dotted rgba(0, 89, 220, .8);--xy-controls-button-background-color-default: #fefefe;--xy-controls-button-background-color-hover-default: #f4f4f4;--xy-controls-button-color-default: inherit;--xy-controls-button-color-hover-default: inherit;--xy-controls-button-border-color-default: #eee;--xy-controls-box-shadow-default: 0 0 2px 1px rgba(0, 0, 0, .08);--xy-edge-label-background-color-default: #ffffff;--xy-edge-label-color-default: inherit;--xy-resize-background-color-default: #3367d9}.react-flow.dark{--xy-edge-stroke-default: #3e3e3e;--xy-edge-stroke-width-default: 1;--xy-edge-stroke-selected-default: #727272;--xy-connectionline-stroke-default: #b1b1b7;--xy-connectionline-stroke-width-default: 1;--xy-attribution-background-color-default: rgba(150, 150, 150, .25);--xy-minimap-background-color-default: #141414;--xy-minimap-mask-background-color-default: rgb(60, 60, 60, .6);--xy-minimap-mask-stroke-color-default: transparent;--xy-minimap-mask-stroke-width-default: 1;--xy-minimap-node-background-color-default: #2b2b2b;--xy-minimap-node-stroke-color-default: transparent;--xy-minimap-node-stroke-width-default: 2;--xy-background-color-default: #141414;--xy-background-pattern-dots-color-default: #777;--xy-background-pattern-lines-color-default: #777;--xy-background-pattern-cross-color-default: #777;--xy-node-color-default: #f8f8f8;--xy-node-border-default: 1px solid #3c3c3c;--xy-node-background-color-default: #1e1e1e;--xy-node-group-background-color-default: rgba(240, 240, 240, .25);--xy-node-boxshadow-hover-default: 0 1px 4px 1px rgba(255, 255, 255, .08);--xy-node-boxshadow-selected-default: 0 0 0 .5px #999;--xy-handle-background-color-default: #bebebe;--xy-handle-border-color-default: #1e1e1e;--xy-selection-background-color-default: rgba(200, 200, 220, .08);--xy-selection-border-default: 1px dotted rgba(200, 200, 220, .8);--xy-controls-button-background-color-default: #2b2b2b;--xy-controls-button-background-color-hover-default: #3e3e3e;--xy-controls-button-color-default: #f8f8f8;--xy-controls-button-color-hover-default: #fff;--xy-controls-button-border-color-default: #5b5b5b;--xy-controls-box-shadow-default: 0 0 2px 1px rgba(0, 0, 0, .08);--xy-edge-label-background-color-default: #141414;--xy-edge-label-color-default: #f8f8f8}.react-flow__background{background-color:var(--xy-background-color, var(--xy-background-color-props, var(--xy-background-color-default)));pointer-events:none;z-index:-1}.react-flow__container{position:absolute;width:100%;height:100%;top:0;left:0}.react-flow__pane{z-index:1}.react-flow__pane.draggable{cursor:grab}.react-flow__pane.dragging{cursor:grabbing}.react-flow__pane.selection{cursor:pointer}.react-flow__viewport{transform-origin:0 0;z-index:2;pointer-events:none}.react-flow__renderer{z-index:4}.react-flow__selection{z-index:6}.react-flow__nodesselection-rect:focus,.react-flow__nodesselection-rect:focus-visible{outline:none}.react-flow__edge-path{stroke:var(--xy-edge-stroke, var(--xy-edge-stroke-default));stroke-width:var(--xy-edge-stroke-width, var(--xy-edge-stroke-width-default));fill:none}.react-flow__connection-path{stroke:var(--xy-connectionline-stroke, var(--xy-connectionline-stroke-default));stroke-width:var(--xy-connectionline-stroke-width, var(--xy-connectionline-stroke-width-default));fill:none}.react-flow .react-flow__edges{position:absolute}.react-flow .react-flow__edges svg{overflow:visible;position:absolute;pointer-events:none}.react-flow__edge{pointer-events:visibleStroke}.react-flow__edge.selectable{cursor:pointer}.react-flow__edge.animated path{stroke-dasharray:5;animation:dashdraw .5s linear infinite}.react-flow__edge.animated path.react-flow__edge-interaction{stroke-dasharray:none;animation:none}.react-flow__edge.inactive{pointer-events:none}.react-flow__edge.selected,.react-flow__edge:focus,.react-flow__edge:focus-visible{outline:none}.react-flow__edge.selected .react-flow__edge-path,.react-flow__edge.selectable:focus .react-flow__edge-path,.react-flow__edge.selectable:focus-visible .react-flow__edge-path{stroke:var(--xy-edge-stroke-selected, var(--xy-edge-stroke-selected-default))}.react-flow__edge-textwrapper{pointer-events:all}.react-flow__edge .react-flow__edge-text{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.react-flow__connection{pointer-events:none}.react-flow__connection .animated{stroke-dasharray:5;animation:dashdraw .5s linear infinite}svg.react-flow__connectionline{z-index:1001;overflow:visible;position:absolute}.react-flow__nodes{pointer-events:none;transform-origin:0 0}.react-flow__node{position:absolute;-webkit-user-select:none;-moz-user-select:none;user-select:none;pointer-events:all;transform-origin:0 0;box-sizing:border-box;cursor:default}.react-flow__node.selectable{cursor:pointer}.react-flow__node.draggable{cursor:grab;pointer-events:all}.react-flow__node.draggable.dragging{cursor:grabbing}.react-flow__nodesselection{z-index:3;transform-origin:left top;pointer-events:none}.react-flow__nodesselection-rect{position:absolute;pointer-events:all;cursor:grab}.react-flow__handle{position:absolute;pointer-events:none;min-width:5px;min-height:5px;width:6px;height:6px;background-color:var(--xy-handle-background-color, var(--xy-handle-background-color-default));border:1px solid var(--xy-handle-border-color, var(--xy-handle-border-color-default));border-radius:100%}.react-flow__handle.connectingfrom{pointer-events:all}.react-flow__handle.connectionindicator{pointer-events:all;cursor:crosshair}.react-flow__handle-bottom{top:auto;left:50%;bottom:0;transform:translate(-50%,50%)}.react-flow__handle-top{top:0;left:50%;transform:translate(-50%,-50%)}.react-flow__handle-left{top:50%;left:0;transform:translate(-50%,-50%)}.react-flow__handle-right{top:50%;right:0;transform:translate(50%,-50%)}.react-flow__edgeupdater{cursor:move;pointer-events:all}.react-flow__panel{position:absolute;z-index:5;margin:15px}.react-flow__panel.top{top:0}.react-flow__panel.bottom{bottom:0}.react-flow__panel.left{left:0}.react-flow__panel.right{right:0}.react-flow__panel.center{left:50%;transform:translate(-50%)}.react-flow__attribution{font-size:10px;background:var(--xy-attribution-background-color, var(--xy-attribution-background-color-default));padding:2px 3px;margin:0}.react-flow__attribution a{text-decoration:none;color:#999}@keyframes dashdraw{0%{stroke-dashoffset:10}}.react-flow__edgelabel-renderer{position:absolute;width:100%;height:100%;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;left:0;top:0}.react-flow__viewport-portal{position:absolute;width:100%;height:100%;left:0;top:0;-webkit-user-select:none;-moz-user-select:none;user-select:none}.react-flow__minimap{background:var( --xy-minimap-background-color-props, var(--xy-minimap-background-color, var(--xy-minimap-background-color-default)) )}.react-flow__minimap-svg{display:block}.react-flow__minimap-mask{fill:var( --xy-minimap-mask-background-color-props, var(--xy-minimap-mask-background-color, var(--xy-minimap-mask-background-color-default)) );stroke:var( --xy-minimap-mask-stroke-color-props, var(--xy-minimap-mask-stroke-color, var(--xy-minimap-mask-stroke-color-default)) );stroke-width:var( --xy-minimap-mask-stroke-width-props, var(--xy-minimap-mask-stroke-width, var(--xy-minimap-mask-stroke-width-default)) )}.react-flow__minimap-node{fill:var( --xy-minimap-node-background-color-props, var(--xy-minimap-node-background-color, var(--xy-minimap-node-background-color-default)) );stroke:var( --xy-minimap-node-stroke-color-props, var(--xy-minimap-node-stroke-color, var(--xy-minimap-node-stroke-color-default)) );stroke-width:var( --xy-minimap-node-stroke-width-props, var(--xy-minimap-node-stroke-width, var(--xy-minimap-node-stroke-width-default)) )}.react-flow__background-pattern.dots{fill:var( --xy-background-pattern-color-props, var(--xy-background-pattern-color, var(--xy-background-pattern-dots-color-default)) )}.react-flow__background-pattern.lines{stroke:var( --xy-background-pattern-color-props, var(--xy-background-pattern-color, var(--xy-background-pattern-lines-color-default)) )}.react-flow__background-pattern.cross{stroke:var( --xy-background-pattern-color-props, var(--xy-background-pattern-color, var(--xy-background-pattern-cross-color-default)) )}.react-flow__controls{display:flex;flex-direction:column;box-shadow:var(--xy-controls-box-shadow, var(--xy-controls-box-shadow-default))}.react-flow__controls.horizontal{flex-direction:row}.react-flow__controls-button{display:flex;justify-content:center;align-items:center;height:26px;width:26px;padding:4px;border:none;background:var(--xy-controls-button-background-color, var(--xy-controls-button-background-color-default));border-bottom:1px solid var( --xy-controls-button-border-color-props, var(--xy-controls-button-border-color, var(--xy-controls-button-border-color-default)) );color:var( --xy-controls-button-color-props, var(--xy-controls-button-color, var(--xy-controls-button-color-default)) );cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none}.react-flow__controls-button svg{width:100%;max-width:12px;max-height:12px;fill:currentColor}.react-flow__edge.updating .react-flow__edge-path{stroke:#777}.react-flow__edge-text{font-size:10px}.react-flow__node.selectable:focus,.react-flow__node.selectable:focus-visible{outline:none}.react-flow__node-input,.react-flow__node-default,.react-flow__node-output,.react-flow__node-group{padding:10px;border-radius:var(--xy-node-border-radius, var(--xy-node-border-radius-default));width:150px;font-size:12px;color:var(--xy-node-color, var(--xy-node-color-default));text-align:center;border:var(--xy-node-border, var(--xy-node-border-default));background-color:var(--xy-node-background-color, var(--xy-node-background-color-default))}.react-flow__node-input.selectable:hover,.react-flow__node-default.selectable:hover,.react-flow__node-output.selectable:hover,.react-flow__node-group.selectable:hover{box-shadow:var(--xy-node-boxshadow-hover, var(--xy-node-boxshadow-hover-default))}.react-flow__node-input.selectable.selected,.react-flow__node-input.selectable:focus,.react-flow__node-input.selectable:focus-visible,.react-flow__node-default.selectable.selected,.react-flow__node-default.selectable:focus,.react-flow__node-default.selectable:focus-visible,.react-flow__node-output.selectable.selected,.react-flow__node-output.selectable:focus,.react-flow__node-output.selectable:focus-visible,.react-flow__node-group.selectable.selected,.react-flow__node-group.selectable:focus,.react-flow__node-group.selectable:focus-visible{box-shadow:var(--xy-node-boxshadow-selected, var(--xy-node-boxshadow-selected-default))}.react-flow__node-group{background-color:var(--xy-node-group-background-color, var(--xy-node-group-background-color-default))}.react-flow__nodesselection-rect,.react-flow__selection{background:var(--xy-selection-background-color, var(--xy-selection-background-color-default));border:var(--xy-selection-border, var(--xy-selection-border-default))}.react-flow__nodesselection-rect:focus,.react-flow__nodesselection-rect:focus-visible,.react-flow__selection:focus,.react-flow__selection:focus-visible{outline:none}.react-flow__controls-button:hover{background:var( --xy-controls-button-background-color-hover-props, var(--xy-controls-button-background-color-hover, var(--xy-controls-button-background-color-hover-default)) );color:var( --xy-controls-button-color-hover-props, var(--xy-controls-button-color-hover, var(--xy-controls-button-color-hover-default)) )}.react-flow__controls-button:disabled{pointer-events:none}.react-flow__controls-button:disabled svg{fill-opacity:.4}.react-flow__controls-button:last-child{border-bottom:none}.react-flow__resize-control{position:absolute}.react-flow__resize-control.left,.react-flow__resize-control.right{cursor:ew-resize}.react-flow__resize-control.top,.react-flow__resize-control.bottom{cursor:ns-resize}.react-flow__resize-control.top.left,.react-flow__resize-control.bottom.right{cursor:nwse-resize}.react-flow__resize-control.bottom.left,.react-flow__resize-control.top.right{cursor:nesw-resize}.react-flow__resize-control.handle{width:4px;height:4px;border:1px solid #fff;border-radius:1px;background-color:var(--xy-resize-background-color, var(--xy-resize-background-color-default));transform:translate(-50%,-50%)}.react-flow__resize-control.handle.left{left:0;top:50%}.react-flow__resize-control.handle.right{left:100%;top:50%}.react-flow__resize-control.handle.top{left:50%;top:0}.react-flow__resize-control.handle.bottom{left:50%;top:100%}.react-flow__resize-control.handle.top.left,.react-flow__resize-control.handle.bottom.left{left:0}.react-flow__resize-control.handle.top.right,.react-flow__resize-control.handle.bottom.right{left:100%}.react-flow__resize-control.line{border-color:var(--xy-resize-background-color, var(--xy-resize-background-color-default));border-width:0;border-style:solid}.react-flow__resize-control.line.left,.react-flow__resize-control.line.right{width:1px;transform:translate(-50%);top:0;height:100%}.react-flow__resize-control.line.left{left:0;border-left-width:1px}.react-flow__resize-control.line.right{left:100%;border-right-width:1px}.react-flow__resize-control.line.top,.react-flow__resize-control.line.bottom{height:1px;transform:translateY(-50%);left:0;width:100%}.react-flow__resize-control.line.top{top:0;border-top-width:1px}.react-flow__resize-control.line.bottom{border-bottom-width:1px;top:100%}.react-flow__edge-textbg{fill:var(--xy-edge-label-background-color, var(--xy-edge-label-background-color-default))}.react-flow__edge-text{fill:var(--xy-edge-label-color, var(--xy-edge-label-color-default))}