@tuongaz/seeflow 0.1.21 → 0.1.23

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.
@@ -0,0 +1,5 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="#34d399" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round">
2
+ <rect width="8" height="8" x="3" y="3" rx="2"/>
3
+ <path d="M7 11v4a2 2 0 0 0 2 2h4"/>
4
+ <rect width="8" height="8" x="13" y="13" rx="2"/>
5
+ </svg>
Binary file
Binary file
Binary file
@@ -0,0 +1,8 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="512" height="512" viewBox="0 0 512 512">
2
+ <rect width="512" height="512" rx="60" ry="60" fill="#09090b"/>
3
+ <g transform="translate(76 76) scale(15)" fill="none" stroke="#34d399" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round">
4
+ <rect width="8" height="8" x="3" y="3" rx="2"/>
5
+ <path d="M7 11v4a2 2 0 0 0 2 2h4"/>
6
+ <rect width="8" height="8" x="13" y="13" rx="2"/>
7
+ </g>
8
+ </svg>
@@ -3,9 +3,13 @@
3
3
  <head>
4
4
  <meta charset="UTF-8" />
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <link rel="icon" href="/favicon.svg" type="image/svg+xml" />
7
+ <link rel="manifest" href="/manifest.webmanifest" />
8
+ <meta name="theme-color" content="#09090b" />
9
+ <meta name="apple-mobile-web-app-capable" content="yes" />
6
10
  <title>SeeFlow Studio</title>
7
- <script type="module" crossorigin src="/assets/index-D8TJ7bQw.js"></script>
8
- <link rel="stylesheet" crossorigin href="/assets/index-BzDHuLRt.css">
11
+ <script type="module" crossorigin src="/assets/index-6hNSFrBS.js"></script>
12
+ <link rel="stylesheet" crossorigin href="/assets/index-C-j0WAKO.css">
9
13
  </head>
10
14
  <body>
11
15
  <div id="root"></div>
@@ -0,0 +1,30 @@
1
+ {
2
+ "name": "SeeFlow Studio",
3
+ "short_name": "SeeFlow",
4
+ "description": "Architecture diagrams that actually run.",
5
+ "start_url": "/",
6
+ "scope": "/",
7
+ "display": "standalone",
8
+ "background_color": "#09090b",
9
+ "theme_color": "#09090b",
10
+ "icons": [
11
+ {
12
+ "src": "/icon-192.png",
13
+ "sizes": "192x192",
14
+ "type": "image/png",
15
+ "purpose": "any"
16
+ },
17
+ {
18
+ "src": "/icon-512.png",
19
+ "sizes": "512x512",
20
+ "type": "image/png",
21
+ "purpose": "any"
22
+ },
23
+ {
24
+ "src": "/icon-maskable-512.png",
25
+ "sizes": "512x512",
26
+ "type": "image/png",
27
+ "purpose": "maskable"
28
+ }
29
+ ]
30
+ }
@@ -12,7 +12,10 @@
12
12
  "data": {
13
13
  "shape": "user",
14
14
  "name": "Customer",
15
- "description": "Web / Mobile / Partner"
15
+ "description": "Web / Mobile / Partner",
16
+ "fontSize": 15,
17
+ "borderColor": "green",
18
+ "borderSize": 1
16
19
  }
17
20
  },
18
21
  {
@@ -37,7 +40,10 @@
37
40
  "run"
38
41
  ],
39
42
  "scriptPath": "scripts/play.ts"
40
- }
43
+ },
44
+ "fontSize": 15,
45
+ "borderColor": "green",
46
+ "borderSize": 1
41
47
  }
42
48
  },
43
49
  {
@@ -54,7 +60,10 @@
54
60
  "kind": "request"
55
61
  },
56
62
  "description": "JWT issuance + OAuth2 / OIDC.",
57
- "detail": "## Auth Service\n\n- Password login (bcrypt), OAuth2 (Google, Apple), magic-link\n- Access token: 15-min TTL, RS256 signed\n- Refresh token: 30-day TTL in Redis\n\n### Events\n- `auth.login` on success\n- `auth.token_refreshed` on refresh"
63
+ "detail": "## Auth Service\n\n- Password login (bcrypt), OAuth2 (Google, Apple), magic-link\n- Access token: 15-min TTL, RS256 signed\n- Refresh token: 30-day TTL in Redis\n\n### Events\n- `auth.login` on success\n- `auth.token_refreshed` on refresh",
64
+ "fontSize": 15,
65
+ "borderColor": "green",
66
+ "borderSize": 1
58
67
  }
59
68
  },
60
69
  {
@@ -71,7 +80,10 @@
71
80
  "kind": "request"
72
81
  },
73
82
  "description": "SKUs, variants, pricing, full-text search.",
74
- "detail": "## Product Catalog\n\nSingle source of truth for products and search.\n\n- Products, variants, tiered pricing (B2B / B2C / promo)\n- Elasticsearch full-text search with BM25 ranking\n- Faceted filtering (brand, price, rating, availability)\n\n### Events\n- `product.updated` → re-indexes search"
83
+ "detail": "## Product Catalog\n\nSingle source of truth for products and search.\n\n- Products, variants, tiered pricing (B2B / B2C / promo)\n- Elasticsearch full-text search with BM25 ranking\n- Faceted filtering (brand, price, rating, availability)\n\n### Events\n- `product.updated` → re-indexes search",
84
+ "fontSize": 15,
85
+ "borderColor": "green",
86
+ "borderSize": 1
75
87
  }
76
88
  },
77
89
  {
@@ -96,7 +108,10 @@
96
108
  "run"
97
109
  ],
98
110
  "scriptPath": "scripts/play.ts"
99
- }
111
+ },
112
+ "fontSize": 15,
113
+ "borderColor": "green",
114
+ "borderSize": 1
100
115
  }
101
116
  },
102
117
  {
@@ -121,7 +136,10 @@
121
136
  "run"
122
137
  ],
123
138
  "scriptPath": "scripts/play.ts"
124
- }
139
+ },
140
+ "fontSize": 15,
141
+ "borderColor": "green",
142
+ "borderSize": 1
125
143
  }
126
144
  },
127
145
  {
@@ -138,7 +156,10 @@
138
156
  "kind": "event"
139
157
  },
140
158
  "description": "Stripe + PayPal gateway integration.",
141
- "detail": "## Payment Service\n\nCharges the customer and records the transaction.\n\n### Triggered by\n- `order.created`\n\n### Steps\n1. Retrieve saved payment method\n2. Authorise charge via Stripe\n3. Capture funds\n4. Persist charge record\n\n### Events Emitted\n- `payment.captured` → Notification Service\n- `payment.failed` → Notification Service"
159
+ "detail": "## Payment Service\n\nCharges the customer and records the transaction.\n\n### Triggered by\n- `order.created`\n\n### Steps\n1. Retrieve saved payment method\n2. Authorise charge via Stripe\n3. Capture funds\n4. Persist charge record\n\n### Events Emitted\n- `payment.captured` → Notification Service\n- `payment.failed` → Notification Service",
160
+ "fontSize": 15,
161
+ "borderColor": "green",
162
+ "borderSize": 1
142
163
  }
143
164
  },
144
165
  {
@@ -155,7 +176,10 @@
155
176
  "kind": "event"
156
177
  },
157
178
  "description": "Email + SMS + push via AWS SES / SNS.",
158
- "detail": "## Notification Service\n\nDelivers transactional messages.\n\n### Channels\n- **Email** — AWS SES with DKIM/DMARC\n- **SMS** — Twilio for OTP and shipping alerts\n- **Push** — Firebase Cloud Messaging\n\n### Triggered by\n- `payment.captured` — order confirmation\n- `payment.failed` — retry prompt\n- `order.cancelled` — refund notification"
179
+ "detail": "## Notification Service\n\nDelivers transactional messages.\n\n### Channels\n- **Email** — AWS SES with DKIM/DMARC\n- **SMS** — Twilio for OTP and shipping alerts\n- **Push** — Firebase Cloud Messaging\n\n### Triggered by\n- `payment.captured` — order confirmation\n- `payment.failed` — retry prompt\n- `order.cancelled` — refund notification",
180
+ "fontSize": 15,
181
+ "borderColor": "green",
182
+ "borderSize": 1
159
183
  }
160
184
  },
161
185
  {
@@ -168,7 +192,10 @@
168
192
  "data": {
169
193
  "shape": "database",
170
194
  "name": "PostgreSQL",
171
- "description": "Orders, users, products — primary OLTP store"
195
+ "description": "Orders, users, products — primary OLTP store",
196
+ "fontSize": 15,
197
+ "borderColor": "green",
198
+ "borderSize": 1
172
199
  }
173
200
  }
174
201
  ],
@@ -247,4 +274,3 @@
247
274
  }
248
275
  ]
249
276
  }
250
-
@@ -5,55 +5,92 @@
5
5
  {
6
6
  "id": "post-orders",
7
7
  "type": "playNode",
8
- "position": { "x": 50, "y": 200 },
8
+ "position": {
9
+ "x": -181.96549037838943,
10
+ "y": 138.95644990042385
11
+ },
9
12
  "data": {
10
13
  "name": "POST /orders",
11
14
  "kind": "service",
12
- "stateSource": { "kind": "request" },
15
+ "stateSource": {
16
+ "kind": "request"
17
+ },
13
18
  "description": "Creates order, kicks off the pipeline.",
14
19
  "detail": "## POST /orders\n\nEntry point for the order pipeline. Accepts a customer ID and list of line items, creates an order record, and publishes the `order.created` event to kick off downstream processing.\n\n### Request\n```json\n{\n \"customerId\": \"cust_123\",\n \"items\": [{ \"sku\": \"WIDGET-1\", \"qty\": 2 }]\n}\n```\n\n### Response\n```json\n{ \"orderId\": \"ord_1234567890\" }\n```\n\n### Emits\n- `order.created` → Inventory Service",
15
20
  "playAction": {
16
21
  "kind": "script",
17
22
  "interpreter": "bun",
18
- "args": ["run"],
23
+ "args": [
24
+ "run"
25
+ ],
19
26
  "scriptPath": "scripts/play.ts"
20
- }
27
+ },
28
+ "fontSize": 15,
29
+ "borderColor": "green",
30
+ "borderSize": 1
21
31
  }
22
32
  },
23
33
  {
24
34
  "id": "inventory-service",
25
35
  "type": "stateNode",
26
- "position": { "x": 350, "y": 200 },
36
+ "position": {
37
+ "x": 66.21484197841792,
38
+ "y": -126.31035925520507
39
+ },
27
40
  "data": {
28
41
  "name": "Inventory Service",
29
42
  "kind": "worker",
30
- "stateSource": { "kind": "event" },
43
+ "stateSource": {
44
+ "kind": "event"
45
+ },
31
46
  "description": "Reserves stock.",
32
- "detail": "## Inventory Service\n\nListens for `order.created` and attempts to reserve the requested stock in the warehouse. Checks available quantity, places a hold on the items, and records the warehouse location.\n\n### Triggered by\n- `order.created`\n\n### Logic\n1. Look up each SKU in the warehouse\n2. Verify sufficient quantity is available\n3. Place a reservation hold\n4. Record the fulfilling warehouse ID\n\n### Emits\n- `stock.reserved` → Payment Service\n\n### Payload\n```json\n{\n \"reserved\": true,\n \"warehouseId\": \"wh_sydney\"\n}\n```"
47
+ "detail": "## Inventory Service\n\nListens for `order.created` and attempts to reserve the requested stock in the warehouse. Checks available quantity, places a hold on the items, and records the warehouse location.\n\n### Triggered by\n- `order.created`\n\n### Logic\n1. Look up each SKU in the warehouse\n2. Verify sufficient quantity is available\n3. Place a reservation hold\n4. Record the fulfilling warehouse ID\n\n### Emits\n- `stock.reserved` → Payment Service\n\n### Payload\n```json\n{\n \"reserved\": true,\n \"warehouseId\": \"wh_sydney\"\n}\n```",
48
+ "icon": "a-arrow-down-icon",
49
+ "width": 201,
50
+ "height": 118,
51
+ "fontSize": 15,
52
+ "borderColor": "green",
53
+ "borderSize": 1
33
54
  }
34
55
  },
35
56
  {
36
57
  "id": "payment-service",
37
58
  "type": "stateNode",
38
- "position": { "x": 650, "y": 200 },
59
+ "position": {
60
+ "x": 469.1422114437386,
61
+ "y": 206.48855752663212
62
+ },
39
63
  "data": {
40
64
  "name": "Payment Service",
41
65
  "kind": "worker",
42
- "stateSource": { "kind": "event" },
66
+ "stateSource": {
67
+ "kind": "event"
68
+ },
43
69
  "description": "Charges card.",
44
- "detail": "## Payment Service\n\nListens for `stock.reserved` and charges the customer's card on file. Integrates with the payment gateway to authorise and capture funds for the order total.\n\n### Triggered by\n- `stock.reserved`\n\n### Logic\n1. Retrieve customer's saved payment method\n2. Calculate order total (items + tax + shipping)\n3. Authorise charge with payment gateway\n4. Capture funds and record the charge ID\n\n### Emits\n- `payment.captured` → Fulfillment Service\n\n### Payload\n```json\n{\n \"chargeId\": \"ch_1234567890\",\n \"amount\": 4999\n}\n```"
70
+ "detail": "## Payment Service\n\nListens for `stock.reserved` and charges the customer's card on file. Integrates with the payment gateway to authorise and capture funds for the order total.\n\n### Triggered by\n- `stock.reserved`\n\n### Logic\n1. Retrieve customer's saved payment method\n2. Calculate order total (items + tax + shipping)\n3. Authorise charge with payment gateway\n4. Capture funds and record the charge ID\n\n### Emits\n- `payment.captured` → Fulfillment Service\n\n### Payload\n```json\n{\n \"chargeId\": \"ch_1234567890\",\n \"amount\": 4999\n}\n```",
71
+ "borderSize": 1,
72
+ "fontSize": 15,
73
+ "borderColor": "green"
45
74
  }
46
75
  },
47
76
  {
48
77
  "id": "fulfillment-service",
49
78
  "type": "stateNode",
50
- "position": { "x": 950, "y": 200 },
79
+ "position": {
80
+ "x": 747.51321046746,
81
+ "y": -37.78865629343234
82
+ },
51
83
  "data": {
52
84
  "name": "Fulfillment Service",
53
85
  "kind": "worker",
54
- "stateSource": { "kind": "event" },
86
+ "stateSource": {
87
+ "kind": "event"
88
+ },
55
89
  "description": "Enqueues shipment.",
56
- "detail": "## Fulfillment Service\n\nListens for `payment.captured` and enqueues a shipment job for the warehouse to pick, pack, and dispatch the order. Assigns a tracking ID and notifies the customer.\n\n### Triggered by\n- `payment.captured`\n\n### Logic\n1. Convert the stock reservation into a pick list\n2. Assign a carrier and service level\n3. Generate a shipment ID and tracking number\n4. Push the job to the warehouse queue\n5. Send dispatch confirmation to the customer\n\n### Payload\n```json\n{\n \"shipmentId\": \"shp_1234567890\",\n \"orderId\": \"ord_1234567890\"\n}\n```"
90
+ "detail": "## Fulfillment Service\n\nListens for `payment.captured` and enqueues a shipment job for the warehouse to pick, pack, and dispatch the order. Assigns a tracking ID and notifies the customer.\n\n### Triggered by\n- `payment.captured`\n\n### Logic\n1. Convert the stock reservation into a pick list\n2. Assign a carrier and service level\n3. Generate a shipment ID and tracking number\n4. Push the job to the warehouse queue\n5. Send dispatch confirmation to the customer\n\n### Payload\n```json\n{\n \"shipmentId\": \"shp_1234567890\",\n \"orderId\": \"ord_1234567890\"\n}\n```",
91
+ "fontSize": 15,
92
+ "borderColor": "green",
93
+ "borderSize": 1
57
94
  }
58
95
  }
59
96
  ],
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tuongaz/seeflow",
3
- "version": "0.1.21",
3
+ "version": "0.1.23",
4
4
  "description": "Local studio that hosts file-defined demos as React Flow canvases wired to a running app via REST + SSE + Zod schema.",
5
5
  "keywords": [
6
6
  "seeflow",
package/src/operations.ts CHANGED
@@ -74,6 +74,10 @@ export const NodePatchBodySchema = z
74
74
  cornerRadius: z.number().min(0).optional(),
75
75
  width: z.number().positive().optional(),
76
76
  height: z.number().positive().optional(),
77
+ // htmlNode-only: when true, the renderer measures content and React Flow
78
+ // sizes the wrapper around it. mergeNodeUpdates enforces the invariant
79
+ // that autoSize:true never coexists with persisted width/height.
80
+ autoSize: z.boolean().optional(),
77
81
  shape: z.enum(['rectangle', 'ellipse', 'sticky', 'text']).optional(),
78
82
  // iconNode-only: stroke color token. Lands at data.color; DemoSchema's
79
83
  // post-merge reparse gates that this is only valid on an iconNode.
@@ -117,6 +121,7 @@ const NODE_DATA_PATCH_KEYS = [
117
121
  'cornerRadius',
118
122
  'width',
119
123
  'height',
124
+ 'autoSize',
120
125
  'shape',
121
126
  'color',
122
127
  'strokeWidth',
@@ -163,6 +168,35 @@ export const mergeNodeUpdates = (node: Record<string, unknown>, updates: NodePat
163
168
  data[key] = updates[key];
164
169
  touchedData = true;
165
170
  }
171
+
172
+ // htmlNode-only invariant enforcement:
173
+ // autoSize === true ⊻ (width and height set).
174
+ // autoSize: true is the dominant signal — it strips width/height even if
175
+ // the same patch tried to write them. Writing width/height implicitly
176
+ // flips autoSize to false.
177
+ if (node.type === 'htmlNode') {
178
+ // The autoSize invariant requires `width`/`height` to be ABSENT from the
179
+ // serialized JSON when autoSize is true — not present with value
180
+ // `undefined` (which would serialize as a stray `"width": null` or get
181
+ // dropped inconsistently across the wire). `delete` is the right tool
182
+ // here; the rest of the function is hot on read, not write.
183
+ if (updates.autoSize === true) {
184
+ if ('width' in data) {
185
+ // biome-ignore lint/performance/noDelete: invariant requires key absence on serialize
186
+ delete data.width;
187
+ touchedData = true;
188
+ }
189
+ if ('height' in data) {
190
+ // biome-ignore lint/performance/noDelete: invariant requires key absence on serialize
191
+ delete data.height;
192
+ touchedData = true;
193
+ }
194
+ } else if (updates.width !== undefined || updates.height !== undefined) {
195
+ data.autoSize = false;
196
+ touchedData = true;
197
+ }
198
+ }
199
+
166
200
  if (touchedData) {
167
201
  node.data = data;
168
202
  }
package/src/schema.ts CHANGED
@@ -228,7 +228,7 @@ const ImageNodeSchema = z.object({
228
228
  // written yet) and would otherwise reject the whole demo. The US-014 renderer
229
229
  // renders a `PlaceholderCard` instead — so a missing htmlPath WARNS (via the
230
230
  // placeholder visual) without ERRORING (without failing demo parse).
231
- const HtmlNodeDataSchema = z.object({
231
+ export const HtmlNodeDataSchema = z.object({
232
232
  htmlPath: z.string().min(1).refine(isCleanRelativePath, {
233
233
  message: 'htmlPath must be a relative path under .seeflow/ (no absolute / traversal)',
234
234
  }),
@@ -236,6 +236,13 @@ const HtmlNodeDataSchema = z.object({
236
236
  // Decorative caption glyph. Lucide icon name (kebab-case) resolved by the
237
237
  // canvas <Icon> primitive; rendered inline with the caption when set.
238
238
  icon: z.string().optional(),
239
+ // When true (or absent), the renderer measures the HTML content and React
240
+ // Flow sizes the wrapper around it (capped at 800×600 by the renderer's
241
+ // measuring container styles). The studio adapter (`mergeNodeUpdates`)
242
+ // enforces the invariant that `autoSize === true` and persisted
243
+ // `width`/`height` never coexist: writing width/height flips autoSize to
244
+ // false; writing autoSize: true strips width/height.
245
+ autoSize: z.boolean().optional(),
239
246
  ...NodeVisualBaseShape,
240
247
  ...NodeDescriptionBaseShape,
241
248
  });
@@ -1 +0,0 @@
1
- @import"https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500;600&display=swap";.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: rgba(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: rgba(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-props, var(--xy-background-color, 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__arrowhead polyline{stroke:var(--xy-edge-stroke, var(--xy-edge-stroke-default))}.react-flow__arrowhead polyline.arrowclosed{fill:var(--xy-edge-stroke, var(--xy-edge-stroke-default))}.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__pane.selection .react-flow__panel{pointer-events:none}.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.top.center,.react-flow__panel.bottom.center{left:50%;transform:translate(-15px) translate(-50%)}.react-flow__panel.left{left:0}.react-flow__panel.right{right:0}.react-flow__panel.left.center,.react-flow__panel.right.center{top:50%;transform:translateY(-15px) translateY(-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__controls.horizontal .react-flow__controls-button{border-bottom:none;border-right:1px solid var( --xy-controls-button-border-color-props, var(--xy-controls-button-border-color, var(--xy-controls-button-border-color-default)) )}.react-flow__controls.horizontal .react-flow__controls-button:last-child{border-right: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:5px;height:5px;border:1px solid #fff;border-radius:1px;background-color:var(--xy-resize-background-color, var(--xy-resize-background-color-default));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))}*,:after,:before{--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:rgba(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:rgba(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: }/*! tailwindcss v3.4.19 | MIT License | https://tailwindcss.com*/*,:after,:before{box-sizing:border-box;border:0 solid #e5e7eb}:after,:before{--tw-content:""}:host,html{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}code,kbd,pre,samp{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}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}[role=button],button{cursor:pointer}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}.sf-pointer-events-none{pointer-events:none}.sf-pointer-events-auto{pointer-events:auto}.sf-fixed{position:fixed}.sf-absolute{position:absolute}.sf-relative{position:relative}.sf-inset-0{top:0;right:0;bottom:0;left:0}.sf-inset-x-0{left:0;right:0}.sf-inset-y-0{top:0;bottom:0}.-sf-bottom-5{bottom:-1.25rem}.-sf-right-2{right:-.5rem}.-sf-top-2{top:-.5rem}.sf-bottom-0{bottom:0}.sf-left-0{left:0}.sf-left-\[50\%\]{left:50%}.sf-right-0{right:0}.sf-right-4{right:1rem}.sf-top-0{top:0}.sf-top-4{top:1rem}.sf-top-\[50\%\]{top:50%}.sf-top-full{top:100%}.sf-z-10{z-index:10}.sf-z-50{z-index:50}.-sf-mx-1{margin-left:-.25rem;margin-right:-.25rem}.sf-mx-0\.5{margin-left:.125rem;margin-right:.125rem}.sf-my-1{margin-top:.25rem;margin-bottom:.25rem}.sf-my-2{margin-top:.5rem;margin-bottom:.5rem}.sf-mb-0\.5{margin-bottom:.125rem}.sf-mb-1{margin-bottom:.25rem}.sf-mb-2{margin-bottom:.5rem}.sf-ml-auto{margin-left:auto}.sf-mr-2{margin-right:.5rem}.sf-mt-0{margin-top:0}.sf-mt-1{margin-top:.25rem}.sf-mt-2{margin-top:.5rem}.sf-block{display:block}.sf-inline-block{display:inline-block}.sf-flex{display:flex}.sf-inline-flex{display:inline-flex}.sf-grid{display:grid}.sf-hidden{display:none}.sf-h-1\.5{height:.375rem}.sf-h-11{height:2.75rem}.sf-h-2{height:.5rem}.sf-h-2\.5{height:.625rem}.sf-h-3{height:.75rem}.sf-h-3\.5{height:.875rem}.sf-h-4{height:1rem}.sf-h-5{height:1.25rem}.sf-h-7{height:1.75rem}.sf-h-8{height:2rem}.sf-h-9{height:2.25rem}.sf-h-full{height:100%}.sf-h-px{height:1px}.sf-max-h-\[300px\]{max-height:300px}.sf-min-h-0{min-height:0}.sf-w-1\.5{width:.375rem}.sf-w-12{width:3rem}.sf-w-16{width:4rem}.sf-w-2{width:.5rem}.sf-w-2\.5{width:.625rem}.sf-w-20{width:5rem}.sf-w-3{width:.75rem}.sf-w-3\.5{width:.875rem}.sf-w-3\/4{width:75%}.sf-w-4{width:1rem}.sf-w-48{width:12rem}.sf-w-5{width:1.25rem}.sf-w-56{width:14rem}.sf-w-6{width:1.5rem}.sf-w-7{width:1.75rem}.sf-w-72{width:18rem}.sf-w-8{width:2rem}.sf-w-9{width:2.25rem}.sf-w-\[340px\]{width:340px}.sf-w-auto{width:auto}.sf-w-full{width:100%}.sf-w-px{width:1px}.sf-min-w-0{min-width:0}.sf-min-w-8{min-width:2rem}.sf-min-w-\[10rem\]{min-width:10rem}.sf-max-w-full{max-width:100%}.sf-max-w-lg{max-width:32rem}.sf-flex-1{flex:1 1 0%}.sf-shrink-0{flex-shrink:0}.sf-grow{flex-grow:1}.sf-border-collapse{border-collapse:collapse}.sf-translate-x-\[-50\%\]{--tw-translate-x:-50%}.sf-translate-x-\[-50\%\],.sf-translate-y-\[-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))}.sf-translate-y-\[-50\%\]{--tw-translate-y:-50%}.-sf-rotate-1{--tw-rotate:-1deg;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 sf-pulse{50%{opacity:.5}}.sf-animate-pulse{animation:sf-pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes sf-spin{to{transform:rotate(1turn)}}.sf-animate-spin{animation:sf-spin 1s linear infinite}.sf-cursor-col-resize{cursor:col-resize}.sf-cursor-default{cursor:default}.sf-cursor-pointer{cursor:pointer}.sf-cursor-text{cursor:text}.sf-touch-none{touch-action:none}.sf-select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.sf-list-decimal{list-style-type:decimal}.sf-list-disc{list-style-type:disc}.sf-grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.sf-grid-cols-\[auto_1fr\]{grid-template-columns:auto 1fr}.sf-flex-col{flex-direction:column}.sf-flex-col-reverse{flex-direction:column-reverse}.sf-flex-wrap{flex-wrap:wrap}.sf-items-start{align-items:flex-start}.sf-items-center{align-items:center}.sf-items-stretch{align-items:stretch}.sf-justify-center{justify-content:center}.sf-justify-between{justify-content:space-between}.sf-gap-0\.5{gap:.125rem}.sf-gap-1{gap:.25rem}.sf-gap-1\.5{gap:.375rem}.sf-gap-2{gap:.5rem}.sf-gap-3{gap:.75rem}.sf-gap-4{gap:1rem}.sf-gap-x-3{-moz-column-gap:.75rem;column-gap:.75rem}.sf-gap-y-1{row-gap:.25rem}.sf-space-y-1\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.375rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem*var(--tw-space-y-reverse))}.sf-space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.sf-self-stretch{align-self:stretch}.sf-overflow-auto{overflow:auto}.sf-overflow-hidden{overflow:hidden}.sf-overflow-x-auto{overflow-x:auto}.sf-overflow-y-auto{overflow-y:auto}.sf-overflow-x-hidden{overflow-x:hidden}.sf-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sf-whitespace-normal{white-space:normal}.sf-whitespace-nowrap{white-space:nowrap}.sf-whitespace-pre-wrap{white-space:pre-wrap}.sf-break-words{overflow-wrap:break-word}.sf-break-all{word-break:break-all}.sf-rounded{border-radius:.25rem}.sf-rounded-full{border-radius:9999px}.sf-rounded-lg{border-radius:var(--radius)}.sf-rounded-md{border-radius:calc(var(--radius) - 2px)}.sf-rounded-sm{border-radius:calc(var(--radius) - 4px)}.sf-border{border-width:1px}.sf-border-2{border-width:2px}.sf-border-\[3px\]{border-width:3px}.sf-border-b{border-bottom-width:1px}.sf-border-l{border-left-width:1px}.sf-border-l-2{border-left-width:2px}.sf-border-r{border-right-width:1px}.sf-border-t{border-top-width:1px}.sf-border-dashed{border-style:dashed}.sf-border-border{border-color:hsl(var(--border))}.sf-border-border\/40{border-color:hsl(var(--border)/.4)}.sf-border-input{border-color:hsl(var(--input))}.sf-border-muted-foreground\/30{border-color:hsl(var(--muted-foreground)/.3)}.sf-border-muted-foreground\/40{border-color:hsl(var(--muted-foreground)/.4)}.sf-border-primary\/30{border-color:hsl(var(--primary)/.3)}.sf-border-primary\/60{border-color:hsl(var(--primary)/.6)}.sf-border-rose-500{--tw-border-opacity:1;border-color:rgb(244 63 94/var(--tw-border-opacity,1))}.sf-bg-amber-400{--tw-bg-opacity:1;background-color:rgb(251 191 36/var(--tw-bg-opacity,1))}.sf-bg-amber-950\/50{background-color:#451a0380}.sf-bg-background{background-color:hsl(var(--background))}.sf-bg-background\/90{background-color:hsl(var(--background)/.9)}.sf-bg-background\/95{background-color:hsl(var(--background)/.95)}.sf-bg-black\/80{background-color:#000c}.sf-bg-border{background-color:hsl(var(--border))}.sf-bg-border\/70{background-color:hsl(var(--border)/.7)}.sf-bg-card{background-color:hsl(var(--card))}.sf-bg-destructive{background-color:hsl(var(--destructive))}.sf-bg-emerald-400{--tw-bg-opacity:1;background-color:rgb(52 211 153/var(--tw-bg-opacity,1))}.sf-bg-emerald-950\/50{background-color:#022c2280}.sf-bg-foreground{background-color:hsl(var(--foreground))}.sf-bg-muted{background-color:hsl(var(--muted))}.sf-bg-muted\/30{background-color:hsl(var(--muted)/.3)}.sf-bg-muted\/40{background-color:hsl(var(--muted)/.4)}.sf-bg-muted\/60{background-color:hsl(var(--muted)/.6)}.sf-bg-popover{background-color:hsl(var(--popover))}.sf-bg-primary{background-color:hsl(var(--primary))}.sf-bg-primary\/10{background-color:hsl(var(--primary)/.1)}.sf-bg-rose-400{--tw-bg-opacity:1;background-color:rgb(251 113 133/var(--tw-bg-opacity,1))}.sf-bg-rose-950\/50{background-color:#4c051980}.sf-bg-secondary{background-color:hsl(var(--secondary))}.sf-bg-slate-400{--tw-bg-opacity:1;background-color:rgb(148 163 184/var(--tw-bg-opacity,1))}.sf-bg-transparent{background-color:transparent}.sf-object-contain{-o-object-fit:contain;object-fit:contain}.sf-p-0{padding:0}.sf-p-0\.5{padding:.125rem}.sf-p-1{padding:.25rem}.sf-p-2{padding:.5rem}.sf-p-3{padding:.75rem}.sf-p-4{padding:1rem}.sf-p-6{padding:1.5rem}.sf-px-1{padding-left:.25rem;padding-right:.25rem}.sf-px-1\.5{padding-left:.375rem;padding-right:.375rem}.sf-px-2{padding-left:.5rem;padding-right:.5rem}.sf-px-3{padding-left:.75rem;padding-right:.75rem}.sf-px-4{padding-left:1rem;padding-right:1rem}.sf-px-8{padding-left:2rem;padding-right:2rem}.sf-py-0{padding-top:0;padding-bottom:0}.sf-py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.sf-py-1{padding-top:.25rem;padding-bottom:.25rem}.sf-py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.sf-py-2{padding-top:.5rem;padding-bottom:.5rem}.sf-py-3{padding-top:.75rem;padding-bottom:.75rem}.sf-py-6{padding-top:1.5rem;padding-bottom:1.5rem}.sf-pb-1{padding-bottom:.25rem}.sf-pl-3{padding-left:.75rem}.sf-pl-4{padding-left:1rem}.sf-text-left{text-align:left}.sf-text-center{text-align:center}.sf-text-right{text-align:right}.sf-font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.sf-text-\[10px\]{font-size:10px}.sf-text-\[11px\]{font-size:11px}.sf-text-\[16px\]{font-size:16px}.sf-text-\[18px\]{font-size:18px}.sf-text-\[22px\]{font-size:22px}.sf-text-\[9px\]{font-size:9px}.sf-text-base{font-size:1rem;line-height:1.5rem}.sf-text-lg{font-size:1.125rem;line-height:1.75rem}.sf-text-sm{font-size:.875rem;line-height:1.25rem}.sf-text-xs{font-size:.75rem;line-height:1rem}.sf-font-bold{font-weight:700}.sf-font-medium{font-weight:500}.sf-font-normal{font-weight:400}.sf-font-semibold{font-weight:600}.sf-uppercase{text-transform:uppercase}.sf-italic{font-style:italic}.sf-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)}.sf-leading-none{line-height:1}.sf-leading-relaxed{line-height:1.625}.sf-leading-snug{line-height:1.375}.sf-leading-tight{line-height:1.25}.sf-tracking-tight{letter-spacing:-.025em}.sf-tracking-wide{letter-spacing:.025em}.sf-tracking-widest{letter-spacing:.1em}.sf-text-amber-300{--tw-text-opacity:1;color:rgb(252 211 77/var(--tw-text-opacity,1))}.sf-text-background{color:hsl(var(--background))}.sf-text-destructive{color:hsl(var(--destructive))}.sf-text-destructive-foreground{color:hsl(var(--destructive-foreground))}.sf-text-emerald-300{--tw-text-opacity:1;color:rgb(110 231 183/var(--tw-text-opacity,1))}.sf-text-foreground{color:hsl(var(--foreground))}.sf-text-muted-foreground{color:hsl(var(--muted-foreground))}.sf-text-muted-foreground\/40{color:hsl(var(--muted-foreground)/.4)}.sf-text-muted-foreground\/50{color:hsl(var(--muted-foreground)/.5)}.sf-text-muted-foreground\/60{color:hsl(var(--muted-foreground)/.6)}.sf-text-popover-foreground{color:hsl(var(--popover-foreground))}.sf-text-primary{color:hsl(var(--primary))}.sf-text-primary-foreground{color:hsl(var(--primary-foreground))}.sf-text-rose-300{--tw-text-opacity:1;color:rgb(253 164 175/var(--tw-text-opacity,1))}.sf-text-secondary-foreground{color:hsl(var(--secondary-foreground))}.sf-underline{text-decoration-line:underline}.sf-underline-offset-2{text-underline-offset:2px}.sf-underline-offset-4{text-underline-offset:4px}.\!sf-opacity-100{opacity:1!important}.sf-opacity-0{opacity:0}.sf-opacity-50{opacity:.5}.sf-opacity-60{opacity:.6}.sf-opacity-70{opacity:.7}.sf-shadow-lg{--tw-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -4px rgba(0,0,0,.1);--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color)}.sf-shadow-lg,.sf-shadow-md{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.sf-shadow-md{--tw-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1);--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color)}.sf-shadow-sm{--tw-shadow:0 1px 2px 0 rgba(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)}.sf-outline-none{outline:2px solid transparent;outline-offset:2px}.sf-ring-1{--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)}.sf-ring-1,.sf-ring-2{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.sf-ring-2{--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)}.sf-ring-border{--tw-ring-color:hsl(var(--border))}.sf-ring-ring{--tw-ring-color:hsl(var(--ring))}.sf-ring-offset-2{--tw-ring-offset-width:2px}.sf-ring-offset-background{--tw-ring-offset-color:hsl(var(--background))}.sf-ring-offset-popover{--tw-ring-offset-color:hsl(var(--popover))}.sf-drop-shadow-sm{--tw-drop-shadow:drop-shadow(0 1px 1px rgba(0,0,0,.05));filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.sf-backdrop-blur{--tw-backdrop-blur:blur(8px)}.sf-backdrop-blur,.sf-backdrop-blur-\[14px\]{-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)}.sf-backdrop-blur-\[14px\]{--tw-backdrop-blur:blur(14px)}.sf-transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.sf-transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.sf-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}.sf-transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.sf-transition-shadow{transition-property:box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.sf-duration-200{transition-duration:.2s}.sf-ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}@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))}}.sf-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}.sf-fade-in-0{--tw-enter-opacity:0}.sf-zoom-in-95{--tw-enter-scale:.95}.sf-duration-200{animation-duration:.2s}.sf-ease-in-out{animation-timing-function:cubic-bezier(.4,0,.2,1)}.seeflow-canvas-root{--background:240 10% 3.9%;--foreground:0 0% 98%;--card:240 5.9% 10.6%;--card-foreground:0 0% 98%;--popover:240 5.9% 10.6%;--popover-foreground:0 0% 98%;--primary:160 84% 39.4%;--primary-foreground:162 89% 10%;--secondary:240 6% 13%;--secondary-foreground:0 0% 98%;--muted:240 7% 12%;--muted-foreground:240 4.4% 64.9%;--accent:240 3.7% 15.9%;--accent-foreground:0 0% 98%;--destructive:0 84.2% 60.2%;--destructive-foreground:0 0% 98%;--border:240 3.7% 15.9%;--input:240 3.7% 26.1%;--ring:160 84% 39.4%;--radius:.5rem;--bg-canvas:#0a0a0c;--emerald-glow:rgba(16,185,129,.35);--shadow-card:0 4px 12px -2px rgba(0,0,0,.5);--shadow-window:0 30px 80px -20px rgba(0,0,0,.6),0 0 60px -20px var(--emerald-glow);--shadow-glow-ok:0 0 30px -4px rgba(16,185,129,.45);--shadow-glow-pending:0 0 30px -4px rgba(245,158,11,.45);--ring-selected:0 0 0 3px rgba(16,185,129,.22),0 0 40px -6px rgba(16,185,129,.55);--amber:#f59e0b;--amber-hi:#fbbf24;--danger:#ef4444;--font-mono:"JetBrains Mono",ui-monospace,SFMono-Regular,monospace;--seeflow-handle-fill:hsl(var(--background));--seeflow-handle-border-color:hsl(var(--primary)/.6);--seeflow-handle-border-width:calc(1px/var(--rf-zoom, 1));--seeflow-handle-size:calc(17px/var(--rf-zoom, 1));font-family:Inter,ui-sans-serif,system-ui,sans-serif;color:hsl(var(--foreground))}.seeflow-canvas-root .seeflow-no-scrollbar{scrollbar-width:none}.seeflow-canvas-root .seeflow-no-scrollbar::-webkit-scrollbar{display:none}@keyframes seeflow-ping-fast{0%{transform:scale(1);opacity:1}75%,to{transform:scale(1.6);opacity:0}}.seeflow-canvas-root .animate-ping-fast{animation:seeflow-ping-fast .7s cubic-bezier(0,0,.2,1)}@keyframes seeflow-node-pulse{0%,to{box-shadow:0 0 #f59e0b66}50%{box-shadow:0 0 0 6px #f59e0b00}}.seeflow-canvas-root .seeflow-node-pulse{animation:seeflow-node-pulse 1.4s ease-in-out infinite}@keyframes inline-edit-shake{0%,to{transform:translate(0)}20%,60%{transform:translate(-3px)}40%,80%{transform:translate(3px)}}.seeflow-canvas-root .inline-edit-shake{animation:inline-edit-shake .32s ease-in-out}.seeflow-canvas-root .inline-edit-empty:before{content:attr(data-placeholder);color:hsl(var(--muted-foreground));opacity:.5;font-style:italic;pointer-events:none}.seeflow-canvas-root .react-flow__node,.seeflow-canvas-root .react-flow__node *{cursor:default}.seeflow-canvas-root .react-flow__node [contenteditable=true]{cursor:text}.seeflow-canvas-root button:not(:disabled){cursor:pointer}.seeflow-canvas-root button:disabled{cursor:not-allowed}.seeflow-canvas-root .react-flow .react-flow__pane.selection,.seeflow-canvas-root .react-flow__node button:not([data-testid=play-button]){cursor:default}.seeflow-canvas-root .react-flow .react-flow__pane.draggable{cursor:grab}.seeflow-canvas-root .react-flow .react-flow__pane.dragging{cursor:grabbing}.seeflow-canvas-root .react-flow__node.connectingfrom{opacity:.85}.seeflow-canvas-root .react-flow__node .react-flow__handle{background:var(--seeflow-handle-fill)!important;border:var(--seeflow-handle-border-width) solid var(--seeflow-handle-border-color)!important;width:var(--seeflow-handle-size)!important;height:var(--seeflow-handle-size)!important}.seeflow-canvas-root .react-flow__handle:after{content:"";position:absolute;top:-10px;right:-10px;bottom:-10px;left:-10px;border-radius:50%}.seeflow-canvas-root .react-flow__node.selected:not(.react-flow__node-group),.seeflow-canvas-root .react-flow__node[data-connect-source=true]:not(.react-flow__node-group){z-index:1000!important}.seeflow-canvas-root .react-flow__node .react-flow__handle,.seeflow-canvas-root .react-flow__node .react-flow__handle:after{cursor:default}.seeflow-canvas-root .react-flow__edgeupdater{fill:transparent;stroke:transparent;opacity:1;pointer-events:all;cursor:default}.seeflow-canvas-root .react-flow__edge,.seeflow-canvas-root .react-flow__edge .react-flow__edge-path,.seeflow-canvas-root .react-flow__edge.selectable{cursor:default}.seeflow-canvas-root .seeflow-connector-endpoint-dot{position:absolute;width:var(--seeflow-handle-size);height:var(--seeflow-handle-size);background:var(--seeflow-handle-fill);border:var(--seeflow-handle-border-width) solid var(--seeflow-handle-border-color);border-radius:50%;pointer-events:none;z-index:2000}.seeflow-canvas-root .react-flow.seeflow-connecting .react-flow__node:not([data-connect-source=true]) .react-flow__handle{opacity:0!important}.seeflow-canvas-root .react-flow.seeflow-connecting .react-flow__node-group[data-connect-target=true],.seeflow-canvas-root .react-flow.seeflow-connecting .react-flow__node[data-connect-target=true]>div{border-color:hsl(var(--muted-foreground))!important;border-style:dashed!important}.seeflow-canvas-root .react-flow__node.selected:after{content:"";position:absolute;inset:calc(-8px/var(--rf-zoom, 1));border:calc(1px/var(--rf-zoom, 1)) dashed hsl(var(--primary)/.6);border-radius:0;pointer-events:none;z-index:-1}.seeflow-canvas-root .react-flow__nodesselection-rect{background:transparent;border:none}.seeflow-canvas-root .react-flow__node-group{border:1px dashed hsl(var(--border));background:transparent;border-radius:4px}.seeflow-canvas-root .react-flow__node-group.selected{border-color:transparent}.seeflow-canvas-root .react-flow__node-group.selected:after{z-index:0}.seeflow-canvas-root .react-flow__node[data-gated-child=true]{pointer-events:none}.seeflow-canvas-root .react-flow__node-group:has(>[data-testid=group-node][data-active=true]){border:2px solid hsl(var(--primary));background:hsl(var(--primary)/.04)}.seeflow-canvas-root .react-flow__node-group .react-flow__node-group-label{position:absolute;top:0;left:0;right:0;display:flex;align-items:center;padding:4px 8px;font-size:12px;font-weight:500;color:hsl(var(--muted-foreground));background:transparent;pointer-events:auto;z-index:2;-webkit-user-select:none;-moz-user-select:none;user-select:none}.seeflow-canvas-root .react-flow__node-group .react-flow__node-group-label[data-editing=true]{-webkit-user-select:text;-moz-user-select:text;user-select:text}.seeflow-canvas-root .react-flow__node.selected .react-flow__handle-top{transform:translate(-50%,-50%) translateY(calc(-8px/var(--rf-zoom, 1)))}.seeflow-canvas-root .react-flow__node.selected .react-flow__handle-bottom{transform:translate(-50%,50%) translateY(calc(8px/var(--rf-zoom, 1)))}.seeflow-canvas-root .react-flow__node.selected .react-flow__handle-left{transform:translate(-50%,-50%) translate(calc(-8px/var(--rf-zoom, 1)))}.seeflow-canvas-root .react-flow__node.selected .react-flow__handle-right{transform:translate(50%,-50%) translate(calc(8px/var(--rf-zoom, 1)))}.seeflow-canvas-root .react-flow__node.selected .react-flow__resize-control.handle.top.left{transform:translate(calc(-8px/var(--rf-zoom, 1)),calc(-8px/var(--rf-zoom, 1)))}.seeflow-canvas-root .react-flow__node.selected .react-flow__resize-control.handle.top.right{transform:translate(calc(8px/var(--rf-zoom, 1)),calc(-8px/var(--rf-zoom, 1)))}.seeflow-canvas-root .react-flow__node.selected .react-flow__resize-control.handle.bottom.left{transform:translate(calc(-8px/var(--rf-zoom, 1)),calc(8px/var(--rf-zoom, 1)))}.seeflow-canvas-root .react-flow__node.selected .react-flow__resize-control.handle.bottom.right{transform:translate(calc(8px/var(--rf-zoom, 1)),calc(8px/var(--rf-zoom, 1)))}.seeflow-canvas-root .react-flow__controls{background:hsl(var(--card));border:1px solid hsl(var(--border));border-radius:var(--radius);box-shadow:var(--shadow-card)}.seeflow-canvas-root .react-flow__controls-button{background:hsl(var(--secondary));color:hsl(var(--foreground));border-bottom:1px solid hsl(var(--border))}.seeflow-canvas-root .react-flow__controls-button:hover{background:hsl(var(--accent))}.seeflow-canvas-root .react-flow__controls-button:disabled{opacity:.4;cursor:not-allowed}.seeflow-canvas-root .react-flow__controls-button svg{fill:currentColor}.placeholder\:sf-text-muted-foreground::-moz-placeholder{color:hsl(var(--muted-foreground))}.placeholder\:sf-text-muted-foreground::placeholder{color:hsl(var(--muted-foreground))}.first\:sf-pt-0:first-child{padding-top:0}.last\:sf-mb-0:last-child{margin-bottom:0}.last\:sf-pb-0:last-child{padding-bottom:0}.hover\:sf-scale-110:hover{--tw-scale-x:1.1;--tw-scale-y:1.1;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))}.hover\:sf-border-primary:hover{border-color:hsl(var(--primary))}.hover\:sf-bg-accent:hover{background-color:hsl(var(--accent))}.hover\:sf-bg-border:hover{background-color:hsl(var(--border))}.hover\:sf-bg-destructive\/90:hover{background-color:hsl(var(--destructive)/.9)}.hover\:sf-bg-emerald-400:hover{--tw-bg-opacity:1;background-color:rgb(52 211 153/var(--tw-bg-opacity,1))}.hover\:sf-bg-muted:hover{background-color:hsl(var(--muted))}.hover\:sf-bg-muted\/50:hover{background-color:hsl(var(--muted)/.5)}.hover\:sf-bg-primary:hover{background-color:hsl(var(--primary))}.hover\:sf-bg-secondary:hover{background-color:hsl(var(--secondary))}.hover\:sf-bg-secondary\/80:hover{background-color:hsl(var(--secondary)/.8)}.hover\:sf-text-accent-foreground:hover{color:hsl(var(--accent-foreground))}.hover\:sf-text-foreground:hover{color:hsl(var(--foreground))}.hover\:sf-text-primary-foreground:hover{color:hsl(var(--primary-foreground))}.hover\:sf-underline:hover{text-decoration-line:underline}.hover\:sf-opacity-100:hover{opacity:1}.hover\:sf-opacity-80:hover{opacity:.8}.focus\:sf-bg-accent:focus{background-color:hsl(var(--accent))}.focus\:sf-bg-muted:focus{background-color:hsl(var(--muted))}.focus\:sf-text-accent-foreground:focus{color:hsl(var(--accent-foreground))}.focus\:sf-outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:sf-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\:sf-ring-ring:focus{--tw-ring-color:hsl(var(--ring))}.focus\:sf-ring-offset-2:focus{--tw-ring-offset-width:2px}.focus-visible\:sf-bg-primary:focus-visible{background-color:hsl(var(--primary))}.focus-visible\:sf-text-primary-foreground:focus-visible{color:hsl(var(--primary-foreground))}.focus-visible\:sf-outline-none:focus-visible{outline:2px solid transparent;outline-offset:2px}.focus-visible\:sf-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\:sf-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\:sf-ring-ring:focus-visible{--tw-ring-color:hsl(var(--ring))}.focus-visible\:sf-ring-offset-1:focus-visible{--tw-ring-offset-width:1px}.focus-visible\:sf-ring-offset-2:focus-visible{--tw-ring-offset-width:2px}.disabled\:sf-pointer-events-none:disabled{pointer-events:none}.disabled\:sf-cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:sf-opacity-50:disabled,.sf-group\/canvas:hover .group-hover\/canvas\:sf-opacity-50{opacity:.5}.aria-selected\:sf-bg-muted[aria-selected=true]{background-color:hsl(var(--muted))}.aria-selected\:sf-text-foreground[aria-selected=true]{color:hsl(var(--foreground))}.data-\[disabled\=\'true\'\]\:sf-pointer-events-none[data-disabled=true],.data-\[disabled\]\:sf-pointer-events-none[data-disabled]{pointer-events:none}.data-\[highlighted\]\:sf-bg-accent[data-highlighted]{background-color:hsl(var(--accent))}.data-\[state\=active\]\:sf-bg-background[data-state=active]{background-color:hsl(var(--background))}.data-\[highlighted\]\:sf-text-accent-foreground[data-highlighted]{color:hsl(var(--accent-foreground))}.data-\[state\=active\]\:sf-text-foreground[data-state=active]{color:hsl(var(--foreground))}.data-\[disabled\=\'true\'\]\:sf-opacity-50[data-disabled=true],.data-\[disabled\]\:sf-opacity-50[data-disabled]{opacity:.5}.data-\[state\=active\]\:sf-shadow-sm[data-state=active]{--tw-shadow:0 1px 2px 0 rgba(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)}.data-\[state\=closed\]\:sf-duration-300[data-state=closed]{transition-duration:.3s}.data-\[state\=open\]\:sf-duration-500[data-state=open]{transition-duration:.5s}.data-\[state\=open\]\:sf-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\]\:sf-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\]\:sf-fade-out-0[data-state=closed]{--tw-exit-opacity:0}.data-\[state\=open\]\:sf-fade-in-0[data-state=open]{--tw-enter-opacity:0}.data-\[state\=closed\]\:sf-zoom-out-95[data-state=closed]{--tw-exit-scale:.95}.data-\[state\=open\]\:sf-zoom-in-95[data-state=open]{--tw-enter-scale:.95}.data-\[side\=bottom\]\:sf-slide-in-from-top-2[data-side=bottom]{--tw-enter-translate-y:-.5rem}.data-\[side\=left\]\:sf-slide-in-from-right-2[data-side=left]{--tw-enter-translate-x:.5rem}.data-\[side\=right\]\:sf-slide-in-from-left-2[data-side=right]{--tw-enter-translate-x:-.5rem}.data-\[side\=top\]\:sf-slide-in-from-bottom-2[data-side=top]{--tw-enter-translate-y:.5rem}.data-\[state\=closed\]\:sf-slide-out-to-bottom[data-state=closed]{--tw-exit-translate-y:100%}.data-\[state\=closed\]\:sf-slide-out-to-left[data-state=closed]{--tw-exit-translate-x:-100%}.data-\[state\=closed\]\:sf-slide-out-to-left-1\/2[data-state=closed]{--tw-exit-translate-x:-50%}.data-\[state\=closed\]\:sf-slide-out-to-right[data-state=closed]{--tw-exit-translate-x:100%}.data-\[state\=closed\]\:sf-slide-out-to-top[data-state=closed]{--tw-exit-translate-y:-100%}.data-\[state\=closed\]\:sf-slide-out-to-top-\[48\%\][data-state=closed]{--tw-exit-translate-y:-48%}.data-\[state\=open\]\:sf-slide-in-from-bottom[data-state=open]{--tw-enter-translate-y:100%}.data-\[state\=open\]\:sf-slide-in-from-left[data-state=open]{--tw-enter-translate-x:-100%}.data-\[state\=open\]\:sf-slide-in-from-left-1\/2[data-state=open]{--tw-enter-translate-x:-50%}.data-\[state\=open\]\:sf-slide-in-from-right[data-state=open]{--tw-enter-translate-x:100%}.data-\[state\=open\]\:sf-slide-in-from-top[data-state=open]{--tw-enter-translate-y:-100%}.data-\[state\=open\]\:sf-slide-in-from-top-\[48\%\][data-state=open]{--tw-enter-translate-y:-48%}.data-\[state\=closed\]\:sf-duration-300[data-state=closed]{animation-duration:.3s}.data-\[state\=open\]\:sf-duration-500[data-state=open]{animation-duration:.5s}@media (min-width:640px){.sm\:sf-block{display:block}.sm\:\!sf-w-\[var\(--detail-panel-w\)\]{width:var(--detail-panel-w)!important}.sm\:\!sf-max-w-\[var\(--detail-panel-w\)\]{max-width:var(--detail-panel-w)!important}.sm\:sf-max-w-sm{max-width:24rem}.sm\:sf-flex-row{flex-direction:row}.sm\:sf-justify-end{justify-content:flex-end}.sm\:sf-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*(1 - var(--tw-space-x-reverse)))}.sm\:sf-rounded-lg{border-radius:var(--radius)}.sm\:sf-text-left{text-align:left}}.\[\&_\[cmdk-group-heading\]\]\:sf-px-2 [cmdk-group-heading]{padding-left:.5rem;padding-right:.5rem}.\[\&_\[cmdk-group-heading\]\]\:sf-py-1\.5 [cmdk-group-heading]{padding-top:.375rem;padding-bottom:.375rem}.\[\&_\[cmdk-group-heading\]\]\:sf-text-xs [cmdk-group-heading]{font-size:.75rem;line-height:1rem}.\[\&_\[cmdk-group-heading\]\]\:sf-font-medium [cmdk-group-heading]{font-weight:500}.\[\&_\[cmdk-group-heading\]\]\:sf-text-muted-foreground [cmdk-group-heading]{color:hsl(var(--muted-foreground))}.\[\&_\[cmdk-group\]\:not\(\[hidden\]\)_\~\[cmdk-group\]\]\:sf-pt-0 [cmdk-group]:not([hidden])~[cmdk-group]{padding-top:0}.\[\&_\[cmdk-group\]\]\:sf-px-2 [cmdk-group]{padding-left:.5rem;padding-right:.5rem}.\[\&_\[cmdk-input-wrapper\]_svg\]\:sf-h-5 [cmdk-input-wrapper] svg{height:1.25rem}.\[\&_\[cmdk-input-wrapper\]_svg\]\:sf-w-5 [cmdk-input-wrapper] svg{width:1.25rem}.\[\&_\[cmdk-input\]\]\:sf-h-12 [cmdk-input]{height:3rem}.\[\&_\[cmdk-item\]\]\:sf-px-2 [cmdk-item]{padding-left:.5rem;padding-right:.5rem}.\[\&_\[cmdk-item\]\]\:sf-py-3 [cmdk-item]{padding-top:.75rem;padding-bottom:.75rem}.\[\&_\[cmdk-item\]_svg\]\:sf-h-5 [cmdk-item] svg{height:1.25rem}.\[\&_\[cmdk-item\]_svg\]\:sf-w-5 [cmdk-item] svg{width:1.25rem}*,: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: 240 10% 3.9%;--foreground: 0 0% 98%;--card: 240 5.9% 10.6%;--card-foreground: 0 0% 98%;--popover: 240 5.9% 10.6%;--popover-foreground: 0 0% 98%;--primary: 160 84% 39.4%;--primary-foreground: 162 89% 10%;--secondary: 240 6% 13%;--secondary-foreground: 0 0% 98%;--muted: 240 7% 12%;--muted-foreground: 240 4.4% 64.9%;--accent: 240 3.7% 15.9%;--accent-foreground: 0 0% 98%;--destructive: 0 84.2% 60.2%;--destructive-foreground: 0 0% 98%;--border: 240 3.7% 15.9%;--input: 240 3.7% 26.1%;--ring: 160 84% 39.4%;--radius: .5rem}*{border-color:hsl(var(--border))}body{background-color:hsl(var(--background));color:hsl(var(--foreground));background-image:radial-gradient(rgba(255,255,255,.025) 1px,transparent 1px);background-size:32px 32px}html,body,#root{height:100%;margin:0}.container{width:100%;margin-right:auto;margin-left:auto;padding-right:2rem;padding-left:2rem}@media (min-width: 1400px){.container{max-width:1400px}}.pointer-events-auto{pointer-events:auto}.visible{visibility:visible}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-x-0{left:0;right:0}.bottom-4{bottom:1rem}.left-0{left:0}.left-\[50\%\]{left:50%}.right-0{right:0}.right-3{right:.75rem}.top-0{top:0}.top-3{top:.75rem}.top-\[20\%\]{top:20%}.z-10{z-index:10}.z-20{z-index:20}.z-50{z-index:50}.mx-auto{margin-left:auto;margin-right:auto}.ml-3{margin-left:.75rem}.block{display:block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.hidden{display:none}.h-12{height:3rem}.h-3\.5{height:.875rem}.h-4{height:1rem}.h-6{height:1.5rem}.h-8{height:2rem}.h-full{height:100%}.max-h-\[50vh\]{max-height:50vh}.min-h-0{min-height:0px}.w-12{width:3rem}.w-3\.5{width:.875rem}.w-4{width:1rem}.w-6{width:1.5rem}.w-8{width:2rem}.w-\[320px\]{width:320px}.w-\[480px\]{width:480px}.w-fit{width:-moz-fit-content;width:fit-content}.w-full{width:100%}.min-w-0{min-width:0px}.max-w-2xl{max-width:42rem}.max-w-\[180px\]{max-width:180px}.max-w-\[80\%\]{max-width:80%}.max-w-\[90vw\]{max-width:90vw}.max-w-lg{max-width:32rem}.flex-1{flex:1 1 0%}.shrink-0{flex-shrink:0}.translate-x-\[-50\%\]{--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))}.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 spin{to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.resize{resize:both}.flex-col{flex-direction:column}.items-start{align-items:flex-start}.items-center{align-items:center}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-0\.5{gap:.125rem}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-6{gap:1.5rem}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.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-y-auto{overflow-y:auto}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rounded{border-radius:.25rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:var(--radius)}.rounded-md{border-radius:calc(var(--radius) - 2px)}.border{border-width:1px}.border-b{border-bottom-width:1px}.border-b-0{border-bottom-width:0px}.border-border{border-color:hsl(var(--border))}.border-destructive\/30{border-color:hsl(var(--destructive) / .3)}.border-rose-500\/40{border-color:#f43f5e66}.border-rose-500\/50{border-color:#f43f5e80}.bg-background{background-color:hsl(var(--background))}.bg-background\/95{background-color:hsl(var(--background) / .95)}.bg-card{background-color:hsl(var(--card))}.bg-destructive\/10{background-color:hsl(var(--destructive) / .1)}.bg-muted{background-color:hsl(var(--muted))}.bg-rose-50{--tw-bg-opacity: 1;background-color:rgb(255 241 242 / var(--tw-bg-opacity, 1))}.bg-transparent{background-color:transparent}.p-0{padding:0}.p-0\.5{padding:.125rem}.p-6{padding:1.5rem}.p-8{padding:2rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.pb-1{padding-bottom:.25rem}.pt-2{padding-top:.5rem}.pt-8{padding-top:2rem}.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-2xl{font-size:1.5rem;line-height:2rem}.text-\[11px\]{font-size:11px}.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}.uppercase{text-transform:uppercase}.tracking-tight{letter-spacing:-.025em}.tracking-wide{letter-spacing:.025em}.text-destructive{color:hsl(var(--destructive))}.text-emerald-400{--tw-text-opacity: 1;color:rgb(52 211 153 / var(--tw-text-opacity, 1))}.text-foreground{color:hsl(var(--foreground))}.text-muted-foreground{color:hsl(var(--muted-foreground))}.text-muted-foreground\/50{color:hsl(var(--muted-foreground) / .5)}.text-rose-900{--tw-text-opacity: 1;color:rgb(136 19 55 / var(--tw-text-opacity, 1))}.underline{text-decoration-line:underline}.underline-offset-2{text-underline-offset:2px}.opacity-0{opacity:0}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.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-md{--tw-shadow: 0 4px 6px -1px rgb(0 0 0 / .1), 0 2px 4px -2px rgb(0 0 0 / .1);--tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px 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-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{--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(3px + 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)}.ring-offset-background{--tw-ring-offset-color: hsl(var(--background))}.blur{--tw-blur: blur(8px);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.invert{--tw-invert: invert(100%);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.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)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;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}.duration-200{transition-duration:.2s}@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))}}.duration-200{animation-duration:.2s}.running{animation-play-state:running}.placeholder\:text-muted-foreground::-moz-placeholder{color:hsl(var(--muted-foreground))}.placeholder\:text-muted-foreground::placeholder{color:hsl(var(--muted-foreground))}.hover\:border-input:hover{border-color:hsl(var(--input))}.hover\:bg-accent:hover{background-color:hsl(var(--accent))}.hover\:bg-muted:hover{background-color:hsl(var(--muted))}.hover\:text-accent-foreground:hover{color:hsl(var(--accent-foreground))}.hover\:text-destructive:hover{color:hsl(var(--destructive))}.focus\:border-ring:focus{border-color:hsl(var(--ring))}.focus-visible\:opacity-100:focus-visible{opacity:1}.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-offset-2:focus-visible{--tw-ring-offset-width: 2px}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}.group:hover .group-hover\:opacity-100{opacity:1}.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}.dark\:bg-rose-950\/40:is(.dark *){background-color:#4c051966}.dark\:bg-rose-950\/60:is(.dark *){background-color:#4c051999}.dark\:text-rose-100:is(.dark *){--tw-text-opacity: 1;color:rgb(255 228 230 / var(--tw-text-opacity, 1))}@media (min-width: 640px){.sm\:max-w-md{max-width:28rem}.sm\:rounded-lg{border-radius:var(--radius)}}