trellis-datamodel 0.3.3__py3-none-any.whl → 0.4.0__py3-none-any.whl

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 (31) hide show
  1. trellis_datamodel/adapters/base.py +5 -1
  2. trellis_datamodel/adapters/dbt_core.py +79 -8
  3. trellis_datamodel/config.py +43 -1
  4. trellis_datamodel/routes/__init__.py +2 -0
  5. trellis_datamodel/routes/lineage.py +60 -0
  6. trellis_datamodel/routes/manifest.py +6 -0
  7. trellis_datamodel/server.py +2 -1
  8. trellis_datamodel/services/__init__.py +2 -0
  9. trellis_datamodel/services/lineage.py +427 -0
  10. trellis_datamodel/static/_app/immutable/assets/0.DRr1NRor.css +1 -0
  11. trellis_datamodel/static/_app/immutable/chunks/{CXDUumOQ.js → COKQndWa.js} +1 -1
  12. trellis_datamodel/static/_app/immutable/entry/{app.abCkWeAJ.js → app.BA1wC-Z2.js} +2 -2
  13. trellis_datamodel/static/_app/immutable/entry/start.Cq8bDFFs.js +1 -0
  14. trellis_datamodel/static/_app/immutable/nodes/{1.J_r941Qf.js → 1.CITYWtIe.js} +1 -1
  15. trellis_datamodel/static/_app/immutable/nodes/2.DBgiABuH.js +27 -0
  16. trellis_datamodel/static/_app/version.json +1 -1
  17. trellis_datamodel/static/index.html +6 -6
  18. trellis_datamodel/tests/test_dbt_schema.py +260 -4
  19. trellis_datamodel/tests/test_yaml_handler.py +228 -0
  20. trellis_datamodel/utils/yaml_handler.py +131 -20
  21. {trellis_datamodel-0.3.3.dist-info → trellis_datamodel-0.4.0.dist-info}/METADATA +8 -4
  22. {trellis_datamodel-0.3.3.dist-info → trellis_datamodel-0.4.0.dist-info}/RECORD +28 -25
  23. trellis_datamodel/static/_app/immutable/assets/0.ByDwyx3a.css +0 -1
  24. trellis_datamodel/static/_app/immutable/entry/start.B7CjH6Z7.js +0 -1
  25. trellis_datamodel/static/_app/immutable/nodes/2.WqbMkq6o.js +0 -27
  26. /trellis_datamodel/static/_app/immutable/nodes/{0.bFI_DI3G.js → 0.CXLfbIn-.js} +0 -0
  27. {trellis_datamodel-0.3.3.dist-info → trellis_datamodel-0.4.0.dist-info}/WHEEL +0 -0
  28. {trellis_datamodel-0.3.3.dist-info → trellis_datamodel-0.4.0.dist-info}/entry_points.txt +0 -0
  29. {trellis_datamodel-0.3.3.dist-info → trellis_datamodel-0.4.0.dist-info}/licenses/LICENSE +0 -0
  30. {trellis_datamodel-0.3.3.dist-info → trellis_datamodel-0.4.0.dist-info}/licenses/NOTICE +0 -0
  31. {trellis_datamodel-0.3.3.dist-info → trellis_datamodel-0.4.0.dist-info}/top_level.txt +0 -0
@@ -17,8 +17,9 @@ class YamlHandler:
17
17
  self.yaml.preserve_quotes = True
18
18
  self.yaml.default_flow_style = False
19
19
  self.yaml.width = 4096 # Prevent unwanted line wrapping
20
- # Match the two-space sequence indentation seen in existing dbt yml files
21
- self.yaml.indent(mapping=2, sequence=2, offset=0)
20
+ # Indent sequences 2 spaces under their parent mapping keys (offset=2)
21
+ # sequence=4 is the total indentation for nested sequence items
22
+ self.yaml.indent(mapping=2, sequence=4, offset=2)
22
23
  # Disallow indentless sequences so list items are indented under their parent keys
23
24
  self.yaml.indentless_sequences = False
24
25
 
@@ -102,6 +103,9 @@ class YamlHandler:
102
103
 
103
104
  if "models" not in data:
104
105
  data["models"] = CommentedSeq()
106
+ elif not isinstance(data["models"], CommentedSeq):
107
+ # Normalize plain Python lists to CommentedSeq for consistent formatting
108
+ data["models"] = CommentedSeq(data["models"])
105
109
 
106
110
  model = self.find_model(data, model_name)
107
111
  if not model:
@@ -117,9 +121,7 @@ class YamlHandler:
117
121
  if existing is None or (isinstance(existing, int) and version > existing):
118
122
  model["latest_version"] = version
119
123
 
120
- def ensure_model_version(
121
- self, model: CommentedMap, version: int
122
- ) -> CommentedMap:
124
+ def ensure_model_version(self, model: CommentedMap, version: int) -> CommentedMap:
123
125
  """
124
126
  Ensure a version entry exists within a versioned model.
125
127
 
@@ -169,14 +171,57 @@ class YamlHandler:
169
171
  combined.append(tag)
170
172
  return combined
171
173
 
174
+ def _find_config_insert_position(self, model: CommentedMap) -> Optional[int]:
175
+ """
176
+ Find the best position to insert a config block in a model.
177
+ Places it after description but before columns/versions.
178
+
179
+ Returns:
180
+ Index position for insertion, or None to append at end
181
+ """
182
+ keys = list(model.keys())
183
+
184
+ # Preferred order: name, description, config, columns/versions/...
185
+ # Insert after description if it exists
186
+ if "description" in keys:
187
+ return keys.index("description") + 1
188
+
189
+ # Otherwise insert after name if it exists
190
+ if "name" in keys:
191
+ return keys.index("name") + 1
192
+
193
+ # If we have columns or versions, insert before them
194
+ for key in ["columns", "versions", "latest_version"]:
195
+ if key in keys:
196
+ return keys.index(key)
197
+
198
+ # Default: append at end (return None)
199
+ return None
200
+
172
201
  def update_version_tags(self, version: CommentedMap, tags: List[str]) -> None:
173
202
  """
174
203
  Replace the tags list for a model version using config.tags (dbt convention).
204
+ Skips writing empty tags arrays.
175
205
  """
176
206
  config = version.get("config")
207
+
208
+ # If tags is empty, remove existing tags and don't create new ones
209
+ if not tags:
210
+ if config is not None and "tags" in config:
211
+ del config["tags"]
212
+ return
213
+
214
+ # Create config block if needed, placing it after description but before columns
177
215
  if config is None:
178
- version["config"] = CommentedMap()
216
+ config = CommentedMap()
217
+ # Find the best insertion position
218
+ insert_pos = self._find_config_insert_position(version)
219
+ if insert_pos is not None:
220
+ version.insert(insert_pos, "config", config)
221
+ else:
222
+ version["config"] = config
179
223
  config = version["config"]
224
+
180
225
  config["tags"] = tags
181
226
 
182
227
  def update_model_tags(self, model: CommentedMap, tags: List[str]) -> None:
@@ -184,11 +229,20 @@ class YamlHandler:
184
229
 
185
230
  Priority: 1) existing config.tags, 2) existing top-level tags, 3) config.tags (default)
186
231
  Ensures tags are only in one location to avoid confusion.
232
+ Skips writing empty tags arrays.
187
233
  """
188
234
  config = model.get("config")
189
235
  has_config_tags = config is not None and "tags" in config
190
236
  has_top_level_tags = "tags" in model
191
237
 
238
+ # If tags is empty, remove existing tags and don't create new ones
239
+ if not tags:
240
+ if has_config_tags:
241
+ del config["tags"]
242
+ if has_top_level_tags:
243
+ del model["tags"]
244
+ return
245
+
192
246
  if has_config_tags:
193
247
  # Update in config block (original location)
194
248
  config["tags"] = tags
@@ -201,7 +255,13 @@ class YamlHandler:
201
255
  else:
202
256
  # Default: use config.tags (dbt convention)
203
257
  if config is None:
204
- model["config"] = CommentedMap()
258
+ config = CommentedMap()
259
+ # Find the best insertion position
260
+ insert_pos = self._find_config_insert_position(model)
261
+ if insert_pos is not None:
262
+ model.insert(insert_pos, "config", config)
263
+ else:
264
+ model["config"] = config
205
265
  config = model["config"]
206
266
  config["tags"] = tags
207
267
 
@@ -265,6 +325,40 @@ class YamlHandler:
265
325
  if description:
266
326
  column["description"] = description
267
327
 
328
+ def remove_relationship_test(
329
+ self,
330
+ column: CommentedMap,
331
+ ) -> None:
332
+ """
333
+ Remove any relationship test from a column, keeping other tests.
334
+
335
+ Args:
336
+ column: Column entry
337
+ """
338
+ existing_tests = CommentedSeq()
339
+
340
+ # Collect non-relationship tests only
341
+ for key in ("data_tests", "tests"):
342
+ if key not in column:
343
+ continue
344
+ for test in column.get(key, []):
345
+ if isinstance(test, dict) and "relationships" in test:
346
+ # Skip relationship tests - we're removing them
347
+ continue
348
+ existing_tests.append(test)
349
+
350
+ # Update column with non-relationship tests only
351
+ if len(existing_tests) > 0:
352
+ column["data_tests"] = existing_tests
353
+ else:
354
+ # Remove data_tests key if no tests remain
355
+ if "data_tests" in column:
356
+ del column["data_tests"]
357
+
358
+ # Drop tests key if present to avoid confusion
359
+ if "tests" in column:
360
+ del column["tests"]
361
+
268
362
  def add_relationship_test(
269
363
  self,
270
364
  column: CommentedMap,
@@ -280,22 +374,40 @@ class YamlHandler:
280
374
  target_field: Target field name
281
375
  """
282
376
  existing_tests = CommentedSeq()
377
+ existing_relationship: Optional[CommentedMap] = None
283
378
 
284
- # Collect non-relationship tests from both tests and data_tests keys
379
+ # Collect non-relationship tests and capture existing relationship test (to preserve tags)
285
380
  for key in ("data_tests", "tests"):
286
- if key in column:
287
- for test in column.get(key, []):
288
- if isinstance(test, dict) and "relationships" in test:
289
- continue
290
- existing_tests.append(test)
381
+ if key not in column:
382
+ continue
383
+ for test in column.get(key, []):
384
+ if isinstance(test, dict) and "relationships" in test:
385
+ # Keep the first relationships test we find so we can preserve its metadata (e.g., tags)
386
+ if existing_relationship is None:
387
+ existing_relationship = test
388
+ continue
389
+ existing_tests.append(test)
291
390
 
292
- # Build new relationships test using recommended arguments block
391
+ # Build (or update) relationships test using the recommended arguments block
293
392
  rel_test = CommentedMap()
294
- rel_test["relationships"] = CommentedMap()
295
- rel_test["relationships"]["arguments"] = CommentedMap()
296
- rel_test["relationships"]["arguments"]["to"] = f"ref('{target_model}')"
297
- rel_test["relationships"]["arguments"]["field"] = target_field
298
-
393
+ rel_body = CommentedMap()
394
+
395
+ # Preserve existing tags (or any other metadata except arguments, to, and field) on the relationships block
396
+ # Skip "to" and "field" as they are old-style syntax that should be replaced by the new "arguments" block
397
+ if existing_relationship and isinstance(
398
+ existing_relationship.get("relationships"), dict
399
+ ):
400
+ for key, value in existing_relationship["relationships"].items():
401
+ if key in ("arguments", "to", "field"):
402
+ continue # arguments/to/field will be rebuilt with the new ref/field syntax
403
+ rel_body[key] = value
404
+
405
+ # Always set arguments with the latest reference targets
406
+ rel_body["arguments"] = CommentedMap()
407
+ rel_body["arguments"]["to"] = f"ref('{target_model}')"
408
+ rel_body["arguments"]["field"] = target_field
409
+
410
+ rel_test["relationships"] = rel_body
299
411
  existing_tests.append(rel_test)
300
412
 
301
413
  column["data_tests"] = existing_tests
@@ -362,4 +474,3 @@ class YamlHandler:
362
474
  result.append(col_dict)
363
475
 
364
476
  return result
365
-
@@ -1,9 +1,9 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: trellis-datamodel
3
- Version: 0.3.3
3
+ Version: 0.4.0
4
4
  Summary: Visual data model editor for dbt projects
5
5
  Author: Tim Hiebenthal
6
- Project-URL: Homepage, https://github.com/timhiebenthal/trellis-datamodel
6
+ Project-URL: Homepage, https://app.capacities.io/home/8b7546f6-9028-4209-a383-c4a9ba9be42a
7
7
  Project-URL: Repository, https://github.com/timhiebenthal/trellis-datamodel
8
8
  Project-URL: Issues, https://github.com/timhiebenthal/trellis-datamodel/issues
9
9
  Keywords: dbt,data-modeling,erd,data-engineering,analytics-engineering,visualization,schema
@@ -19,6 +19,7 @@ Description-Content-Type: text/markdown
19
19
  License-File: LICENSE
20
20
  License-File: NOTICE
21
21
  Requires-Dist: dbt-core<2.0,>=1.10.5
22
+ Requires-Dist: dbt-colibri>=0.1.0
22
23
  Requires-Dist: dbt-duckdb>=1.10.0
23
24
  Requires-Dist: fastapi>=0.121.3
24
25
  Requires-Dist: python-dotenv>=1.2.1
@@ -66,9 +67,9 @@ A lightweight, local-first tool to bridge Conceptual Data Modeling, Logical Data
66
67
  - Greenfield: draft entities and fields before writing SQL, then sync to dbt YAML
67
68
  - Brownfield: document your existing data model by loading existing dbt models and utilize relationship tests to infer links
68
69
 
69
- ## Tutorial
70
+ ## Tutorial & Guide
70
71
 
71
- Check out our [Full Tutorial](https://app.capacities.io/home/667ad256-ca68-4dfd-8231-e77d83127dcf) with video clips showing the core features in action.
72
+ Check out our [Full Tutorial](https://app.capacities.io/home/667ad256-ca68-4dfd-8231-e77d83127dcf) with video clips showing the core features in action. Also [General Information](https://app.capacities.io/home/8b7546f6-9028-4209-a383-c4a9ba9be42a) is available.
72
73
 
73
74
  ## Vision
74
75
 
@@ -328,6 +329,9 @@ If you want to collaborate, reach out!
328
329
  - Contributions are welcome! Please read [`CONTRIBUTING.md`](CONTRIBUTING.md) for workflow, testing, and PR guidelines.
329
330
  - All contributors must sign the CLA once per GitHub account. The CLA bot on pull requests will guide you; see [`CLA.md`](CLA.md) for details.
330
331
 
332
+ ## Acknowledgments
333
+ - Thanks to [dbt-colibri](https://github.com/dbt-labs/dbt-colibri) for providing lineage extraction capabilities that enhance trellis's data model visualization features.
334
+
331
335
  ## License
332
336
  - Trellis Datamodel is licensed under the [GNU Affero General Public License v3.0](LICENSE).
333
337
  - See [`NOTICE`](NOTICE) for a summary of copyright and licensing information.
@@ -1,52 +1,55 @@
1
1
  trellis_datamodel/__init__.py,sha256=Dt7IYvh5J6OvE82UJAy5rTG2AC77OJhNFSYIhWYLTxM,234
2
2
  trellis_datamodel/cli.py,sha256=JIeiisSOKMT4lgpBWUqSjAV7b8lfGSbRvEpS7Zx4hZ8,9152
3
- trellis_datamodel/config.py,sha256=BinNsrQoPCrYjOxyBaUFbWH8n-DVqV-nWbal4V9xvi0,8960
4
- trellis_datamodel/server.py,sha256=3pfJP-lZyWD-uBOiMsUYf1KAaHBZDnp0iSu9pwnnsiM,3812
3
+ trellis_datamodel/config.py,sha256=acqcYDXelXKaTHySHTHo-qwhyH07fZvlHZKeGblxoqQ,10645
4
+ trellis_datamodel/server.py,sha256=70pOy7bk-_w41vzCQIosPW_1l8jBsQ02Lc42gQhXl40,3867
5
5
  trellis_datamodel/adapters/__init__.py,sha256=trDbVb4ybX088qRJTGyn9WWbfgF18AI5K5JLgnynNEM,1178
6
- trellis_datamodel/adapters/base.py,sha256=QXo5K6txax3kdQ_IU-mPUw2GxaIloC8D4qvDIqQwwMo,3985
7
- trellis_datamodel/adapters/dbt_core.py,sha256=z4QJ_WabyeB52xhkveTkBwiPfd64Vh74DdiGplSro_Y,38912
6
+ trellis_datamodel/adapters/base.py,sha256=PP7sGJaL90xPBMg8ejp7iH91n71FOAf94r8DE1zKWPk,4322
7
+ trellis_datamodel/adapters/dbt_core.py,sha256=hjrS1dEorT-WlkZMPsoTIBhKgpgtv3O2UTiv0NkzgKM,43253
8
8
  trellis_datamodel/models/__init__.py,sha256=RnidM8TpPXCSEzH_2dCp83dvYuIUZvKRaNMAkwb9d0A,237
9
9
  trellis_datamodel/models/schemas.py,sha256=ZybxrvZTNjlHmPZXmZwLI47XCe67A87bjWkMrW6dYc0,792
10
- trellis_datamodel/routes/__init__.py,sha256=jQNzZ7HsNQY7TO2mzKtYiugdGFJK3bjzR1Q0Hdf6IA0,254
10
+ trellis_datamodel/routes/__init__.py,sha256=NWKG1Depzns5-jDO_ZO-TGgxhu8lijMfXX0g7iHrLRw,322
11
11
  trellis_datamodel/routes/data_model.py,sha256=16ZkgFREcOUiWZ9CO4WFV3cMyoG07sHGW4EpIo_50Mc,7888
12
- trellis_datamodel/routes/manifest.py,sha256=h3OipYG3YhB_6sc6T8dddmyESyfDpLGM6nZuI3A1qfU,3745
12
+ trellis_datamodel/routes/lineage.py,sha256=h-FHtW9xmi8vBQ8uiwI7o6txGeLNGpkFZebhRh0sSDI,1876
13
+ trellis_datamodel/routes/manifest.py,sha256=yKhPYbEEycz-xS2BG7Rv8cVLL2cyfVTzmHffwzgWN2g,4090
13
14
  trellis_datamodel/routes/schema.py,sha256=R0SpYCyOB47j21rrxHW-wgerVLTuBHcGveXjPAsHpa4,5934
14
- trellis_datamodel/static/index.html,sha256=QOIuwukPGNep5DKnORIbJkuW-Yny4RQEjvTiT6MtjgY,1539
15
+ trellis_datamodel/services/__init__.py,sha256=a_lvbwNGeih7jmwCGtosg0gEyS0tbGHS8XN_1oHsuSg,55
16
+ trellis_datamodel/services/lineage.py,sha256=Vf8i3LGo76nKc7y-asTw633VwCfkpBmtrNw5QQRXrxI,13092
17
+ trellis_datamodel/static/index.html,sha256=T17Fcf7_FNdANjEISscNyeZxEtGxVy1hTtktIC9wF5o,1539
15
18
  trellis_datamodel/static/robots.txt,sha256=sDMkMme8vauEywHpQIEdbXeolNePBHD6rw60P45O_Mk,63
16
19
  trellis_datamodel/static/trellis_squared.svg,sha256=DasOXxNP1Joui260Q41jRHVDl8AFO924uxIuUZ0ruiQ,4437
17
20
  trellis_datamodel/static/_app/env.js,sha256=PFiLdc3lIpkAIqcK3hezpttwaPaFrEy4sxoQT34lhwY,19
18
- trellis_datamodel/static/_app/version.json,sha256=oHBhXBBE8KUcg9WiTxdsnkJ6k8A1_dj4IbHyP7X2eK0,27
19
- trellis_datamodel/static/_app/immutable/assets/0.ByDwyx3a.css,sha256=8yT2QXiIzNHAI8_zH9pMmT5h3aQS_SuUp2XbbcpRDAE,44446
21
+ trellis_datamodel/static/_app/version.json,sha256=6Fm9KJr2uCfUtWC3iwPnggMqIEOwE9Yn9Iik3ASTurY,27
22
+ trellis_datamodel/static/_app/immutable/assets/0.DRr1NRor.css,sha256=QZVJrKSiczvlTZDQGQ-2bFyzDX0Wdcqr9tGSd9mWTVo,50953
20
23
  trellis_datamodel/static/_app/immutable/assets/2.DLAp_5AW.css,sha256=OPPaVMy5qAMB22Vd8iMEeV4JUi2fkxrOyC7lU2q_8gs,2427
21
24
  trellis_datamodel/static/_app/immutable/assets/trellis_squared.CTOnsdDx.svg,sha256=DasOXxNP1Joui260Q41jRHVDl8AFO924uxIuUZ0ruiQ,4437
22
25
  trellis_datamodel/static/_app/immutable/chunks/8ZaN1sxc.js,sha256=rr3gzyTLWg9cys7Dh6b5T3X4qQ4v6RKXlTOJoZ32Vag,879
23
26
  trellis_datamodel/static/_app/immutable/chunks/BfBfOTnK.js,sha256=l-n5-4dn7wNxMGWMzIzGgm8Zi-ZnjAWfj6LR29AsvNU,3529
24
27
  trellis_datamodel/static/_app/immutable/chunks/C3yhlRfZ.js,sha256=gi1I9gEP-BVoS62YwFzEDjQhIpnZjR_unKAuf_Xj0PQ,6723
25
28
  trellis_datamodel/static/_app/immutable/chunks/CK3bXPEX.js,sha256=qM7TLFJRzv-a0s0PRGR9LuszQkPyviiMffgOFIqJFMg,528
26
- trellis_datamodel/static/_app/immutable/chunks/CXDUumOQ.js,sha256=BiZnXXhYvtThAEPCn_9yMCeXvXy1m5dX4VwKmbJffv8,25790
29
+ trellis_datamodel/static/_app/immutable/chunks/COKQndWa.js,sha256=7XYQaeS2vosI_IyOwJq3d7sCzblSADlxgXIQINSEOAo,25790
27
30
  trellis_datamodel/static/_app/immutable/chunks/DDNfEvut.js,sha256=ppkSjpmn9aUHoZX7plpSC5cfb21PovQEIsaO13KqN_U,3762
28
31
  trellis_datamodel/static/_app/immutable/chunks/DUdVct7e.js,sha256=Vo4haP8fTNRZONanA2By8eL-XKWKrN9B8pOwoZZBG0Q,1528
29
32
  trellis_datamodel/static/_app/immutable/chunks/QRltG_J6.js,sha256=F98YL7kDW-H0H_T1sBNNx1mW2Fk1VL5j_17S9DRH9G4,4476
30
33
  trellis_datamodel/static/_app/immutable/chunks/zXDdy2c_.js,sha256=pSvAdLV000neo_pcyPrryFfWy5hGC5IMivOBcD6f2yY,23606
31
- trellis_datamodel/static/_app/immutable/entry/app.abCkWeAJ.js,sha256=Byen7_Cxbca4aSY_CMRLepJBxX9TxhRQUXAHkxUk4Vo,5335
32
- trellis_datamodel/static/_app/immutable/entry/start.B7CjH6Z7.js,sha256=jG9Jbt-NVqfy44JjvMPvczoLd4J_ng4yEn_LEeXQfFc,83
33
- trellis_datamodel/static/_app/immutable/nodes/0.bFI_DI3G.js,sha256=iLpCRK8FklQdSre9V76oyXNYhvQOrA1RZqa-Inf5t2Q,825
34
- trellis_datamodel/static/_app/immutable/nodes/1.J_r941Qf.js,sha256=F9ZazdlFz8n668Z8XYFoTfRb-U2MphkBG4T4gxms3DY,551
35
- trellis_datamodel/static/_app/immutable/nodes/2.WqbMkq6o.js,sha256=3EaYaNNnqubSiaW8ykvnM6CQHOeSo0_5zxKtLYvezps,1755720
34
+ trellis_datamodel/static/_app/immutable/entry/app.BA1wC-Z2.js,sha256=5qYBTtir8A6t85fi76JB8FIxGFqA8i73IGZNR0M2-F8,5335
35
+ trellis_datamodel/static/_app/immutable/entry/start.Cq8bDFFs.js,sha256=iXLLOKdDwnWS4uAKvNeeWYiBlruIZEBh_vMM4Iv8cIM,83
36
+ trellis_datamodel/static/_app/immutable/nodes/0.CXLfbIn-.js,sha256=iLpCRK8FklQdSre9V76oyXNYhvQOrA1RZqa-Inf5t2Q,825
37
+ trellis_datamodel/static/_app/immutable/nodes/1.CITYWtIe.js,sha256=xfM7XkaXMP_tmZnAO8wJp7xRfN2qVJtqGAoBcn-ufN0,551
38
+ trellis_datamodel/static/_app/immutable/nodes/2.DBgiABuH.js,sha256=iPShbfMjJDRFbONAfVXfVffU6J1ICZ9PonVPB7LL65I,1801095
36
39
  trellis_datamodel/tests/__init__.py,sha256=-g8SlrF2fxSKyTtaLZ1WIyz5HY4rg433YNuBOWHWwDk,27
37
40
  trellis_datamodel/tests/conftest.py,sha256=hIUYhlWLpKPEjPmM43llWPhOoi0aZXKZVVVSHDS4VT8,4199
38
41
  trellis_datamodel/tests/test_cli.py,sha256=mgY5fxieY14e0L-GieYh2iNquu5-3mFnFOHomW4U6rQ,19543
39
42
  trellis_datamodel/tests/test_data_model.py,sha256=TrJDj2Z5nBrwVtgCfZr12TI0XemjCnu8HaJy_2_Au6E,5545
40
- trellis_datamodel/tests/test_dbt_schema.py,sha256=gGx_ndwDBbTrRlV3ryRldwEUSqDYEwUqScvM9CGyVPA,31932
43
+ trellis_datamodel/tests/test_dbt_schema.py,sha256=xLimv3QwpD_HKJlUh9fhMs0yW37urcJAD3VUtJ_0ukE,43382
41
44
  trellis_datamodel/tests/test_manifest.py,sha256=s1zPHG1VSvJdwvlTXhyBGE670mLTxDClmQiLstShcxY,2445
42
45
  trellis_datamodel/tests/test_server_static.py,sha256=xjoJR5y0_abxp1FeEqwnmhO3toZ3xToP3g1BU-urRxM,1241
43
- trellis_datamodel/tests/test_yaml_handler.py,sha256=figHcuAjm4yu-DOGEdN8PX3DbZknDWlvEKPamUaSNvQ,8212
46
+ trellis_datamodel/tests/test_yaml_handler.py,sha256=SXqJ3hxuccgmM0ii97Vg0vqLNMZum9Ks_605iFL2KE0,16657
44
47
  trellis_datamodel/utils/__init__.py,sha256=BOVV4CxPoeVGVZvoY3UnGh02BwxR5zMVsj31BBKh9CI,24
45
- trellis_datamodel/utils/yaml_handler.py,sha256=7WRqflrFnxwG3gbJa6WlUd8WfyOzNPJqH_dzwADNliM,11733
46
- trellis_datamodel-0.3.3.dist-info/licenses/LICENSE,sha256=sByhRBuUsUbLotLAW4mHrv8Ml3GJ0tUS_hgRXl86IO8,34521
47
- trellis_datamodel-0.3.3.dist-info/licenses/NOTICE,sha256=DM-JSgfVxSad-1sBkIvSbHETFWkeGfdQlVJaFnosERM,197
48
- trellis_datamodel-0.3.3.dist-info/METADATA,sha256=hQGRcMYb13ePWINYMbkzHelyR2-Iry_UtOx2l3W4t88,12120
49
- trellis_datamodel-0.3.3.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
50
- trellis_datamodel-0.3.3.dist-info/entry_points.txt,sha256=0JgXvO1nK8li_d2DLOyqWug1h6UhSl9atQrR2il9tyg,54
51
- trellis_datamodel-0.3.3.dist-info/top_level.txt,sha256=jgc8zyMGzG8hM8ewV5iOjwInaPEEELOmkzF9GEBZ5tI,18
52
- trellis_datamodel-0.3.3.dist-info/RECORD,,
48
+ trellis_datamodel/utils/yaml_handler.py,sha256=1ivKVvnWX94QaeI3VKITWdGhD-jjU2f6ZTaJz5R3e-s,16210
49
+ trellis_datamodel-0.4.0.dist-info/licenses/LICENSE,sha256=sByhRBuUsUbLotLAW4mHrv8Ml3GJ0tUS_hgRXl86IO8,34521
50
+ trellis_datamodel-0.4.0.dist-info/licenses/NOTICE,sha256=DM-JSgfVxSad-1sBkIvSbHETFWkeGfdQlVJaFnosERM,197
51
+ trellis_datamodel-0.4.0.dist-info/METADATA,sha256=V8wK2-C7K_cCCKTeOnv_LBmxNwZPNyFqV3L_yYiqZlE,12481
52
+ trellis_datamodel-0.4.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
53
+ trellis_datamodel-0.4.0.dist-info/entry_points.txt,sha256=0JgXvO1nK8li_d2DLOyqWug1h6UhSl9atQrR2il9tyg,54
54
+ trellis_datamodel-0.4.0.dist-info/top_level.txt,sha256=jgc8zyMGzG8hM8ewV5iOjwInaPEEELOmkzF9GEBZ5tI,18
55
+ trellis_datamodel-0.4.0.dist-info/RECORD,,
@@ -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:#e2e8f0}: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:Inter,sans-serif;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:IBM Plex Mono,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:#94a3b8}input::placeholder,textarea::placeholder{opacity:1;color:#94a3b8}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}body{--tw-bg-opacity: 1;background-color:rgb(248 250 252 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(15 23 42 / var(--tw-text-opacity, 1))}.container{width:100%}@media(min-width:640px){.container{max-width:640px}}@media(min-width:768px){.container{max-width:768px}}@media(min-width:1024px){.container{max-width:1024px}}@media(min-width:1280px){.container{max-width:1280px}}@media(min-width:1536px){.container{max-width:1536px}}.pointer-events-none{pointer-events:none}.pointer-events-auto{pointer-events:auto}.\!visible{visibility:visible!important}.visible{visibility:visible}.collapse{visibility:collapse}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.inset-0{inset:0}.-right-1{right:-.25rem}.-top-1{top:-.25rem}.left-2\.5{left:.625rem}.right-2{right:.5rem}.right-4{right:1rem}.top-1\/2{top:50%}.top-2{top:.5rem}.top-4{top:1rem}.z-10{z-index:10}.z-20{z-index:20}.z-50{z-index:50}.mx-1{margin-left:.25rem;margin-right:.25rem}.mx-4{margin-left:1rem;margin-right:1rem}.mx-auto{margin-left:auto;margin-right:auto}.mb-1{margin-bottom:.25rem}.mb-2{margin-bottom:.5rem}.mb-2\.5{margin-bottom:.625rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-6{margin-bottom:1.5rem}.ml-1{margin-left:.25rem}.ml-2{margin-left:.5rem}.ml-5{margin-left:1.25rem}.ml-\[11px\]{margin-left:11px}.ml-auto{margin-left:auto}.mr-1\.5{margin-right:.375rem}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-10{margin-top:2.5rem}.mt-2{margin-top:.5rem}.mt-2\.5{margin-top:.625rem}.block{display:block}.inline-block{display:inline-block}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.contents{display:contents}.hidden{display:none}.\!h-2{height:.5rem!important}.h-10{height:2.5rem}.h-16{height:4rem}.h-2{height:.5rem}.h-2\.5{height:.625rem}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-8{height:2rem}.h-full{height:100%}.h-screen{height:100vh}.max-h-\[70vh\]{max-height:70vh}.min-h-\[60px\]{min-height:60px}.\!w-2{width:.5rem!important}.w-16{width:4rem}.w-2{width:.5rem}.w-2\.5{width:.625rem}.w-20{width:5rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-4{width:1rem}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-8{width:2rem}.w-full{width:100%}.w-px{width:1px}.min-w-0{min-width:0px}.min-w-\[100px\]{min-width:100px}.max-w-3xl{max-width:48rem}.max-w-md{max-width:28rem}.flex-1{flex:1 1 0%}.flex-shrink{flex-shrink:1}.flex-shrink-0,.shrink-0{flex-shrink:0}.-translate-y-1\/2{--tw-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))}.-rotate-90{--tw-rotate: -90deg;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))}.rotate-0{--tw-rotate: 0deg;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 pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.cursor-grab{cursor:grab}.cursor-grabbing{cursor:grabbing}.cursor-move{cursor:move}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.resize-y{resize:vertical}.resize{resize:both}.appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.space-y-0\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.125rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.125rem * var(--tw-space-y-reverse))}.space-y-1\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.375rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem * var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.75rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-nowrap{white-space:nowrap}.break-all{word-break:break-all}.rounded{border-radius:.25rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-xl{border-radius:.75rem}.rounded-t-lg{border-top-left-radius:.5rem;border-top-right-radius:.5rem}.rounded-t-xl{border-top-left-radius:.75rem;border-top-right-radius:.75rem}.border{border-width:1px}.border-2{border-width:2px}.border-b{border-bottom-width:1px}.border-b-2{border-bottom-width:2px}.border-l{border-left-width:1px}.border-r{border-right-width:1px}.border-t{border-top-width:1px}.border-dashed{border-style:dashed}.border-none{border-style:none}.border-\[\#26A69A\]{--tw-border-opacity: 1;border-color:rgb(38 166 154 / var(--tw-border-opacity, 1))}.border-amber-100{--tw-border-opacity: 1;border-color:rgb(254 243 199 / var(--tw-border-opacity, 1))}.border-amber-200{--tw-border-opacity: 1;border-color:rgb(253 230 138 / var(--tw-border-opacity, 1))}.border-blue-100{--tw-border-opacity: 1;border-color:rgb(219 234 254 / var(--tw-border-opacity, 1))}.border-blue-200{--tw-border-opacity: 1;border-color:rgb(191 219 254 / var(--tw-border-opacity, 1))}.border-danger-100{--tw-border-opacity: 1;border-color:rgb(255 228 230 / var(--tw-border-opacity, 1))}.border-danger-200{--tw-border-opacity: 1;border-color:rgb(254 205 211 / var(--tw-border-opacity, 1))}.border-gray-100{--tw-border-opacity: 1;border-color:rgb(241 245 249 / var(--tw-border-opacity, 1))}.border-gray-200{--tw-border-opacity: 1;border-color:rgb(226 232 240 / var(--tw-border-opacity, 1))}.border-gray-200\/60{border-color:#e2e8f099}.border-gray-300{--tw-border-opacity: 1;border-color:rgb(203 213 225 / var(--tw-border-opacity, 1))}.border-gray-900{--tw-border-opacity: 1;border-color:rgb(15 23 42 / var(--tw-border-opacity, 1))}.border-primary-100{--tw-border-opacity: 1;border-color:rgb(204 251 241 / var(--tw-border-opacity, 1))}.border-primary-500{--tw-border-opacity: 1;border-color:rgb(20 184 166 / var(--tw-border-opacity, 1))}.border-primary-600{--tw-border-opacity: 1;border-color:rgb(13 148 136 / var(--tw-border-opacity, 1))}.border-purple-200{--tw-border-opacity: 1;border-color:rgb(233 213 255 / var(--tw-border-opacity, 1))}.border-slate-200{--tw-border-opacity: 1;border-color:rgb(226 232 240 / var(--tw-border-opacity, 1))}.border-slate-300{--tw-border-opacity: 1;border-color:rgb(203 213 225 / var(--tw-border-opacity, 1))}.border-success-200{--tw-border-opacity: 1;border-color:rgb(167 243 208 / var(--tw-border-opacity, 1))}.border-transparent{border-color:transparent}.\!bg-gray-400{--tw-bg-opacity: 1 !important;background-color:rgb(148 163 184 / var(--tw-bg-opacity, 1))!important}.bg-\[\#0f172a\]{--tw-bg-opacity: 1;background-color:rgb(15 23 42 / var(--tw-bg-opacity, 1))}.bg-amber-50{--tw-bg-opacity: 1;background-color:rgb(255 251 235 / var(--tw-bg-opacity, 1))}.bg-amber-500{--tw-bg-opacity: 1;background-color:rgb(245 158 11 / var(--tw-bg-opacity, 1))}.bg-black{--tw-bg-opacity: 1;background-color:rgb(0 0 0 / var(--tw-bg-opacity, 1))}.bg-black\/40{background-color:#0006}.bg-blue-50{--tw-bg-opacity: 1;background-color:rgb(239 246 255 / var(--tw-bg-opacity, 1))}.bg-danger-50{--tw-bg-opacity: 1;background-color:rgb(255 241 242 / var(--tw-bg-opacity, 1))}.bg-danger-500{--tw-bg-opacity: 1;background-color:rgb(244 63 94 / var(--tw-bg-opacity, 1))}.bg-danger-600{--tw-bg-opacity: 1;background-color:rgb(225 29 72 / var(--tw-bg-opacity, 1))}.bg-gray-100{--tw-bg-opacity: 1;background-color:rgb(241 245 249 / var(--tw-bg-opacity, 1))}.bg-gray-200{--tw-bg-opacity: 1;background-color:rgb(226 232 240 / var(--tw-bg-opacity, 1))}.bg-gray-200\/50{background-color:#e2e8f080}.bg-gray-300{--tw-bg-opacity: 1;background-color:rgb(203 213 225 / var(--tw-bg-opacity, 1))}.bg-gray-300\/80{background-color:#cbd5e1cc}.bg-gray-50{--tw-bg-opacity: 1;background-color:rgb(248 250 252 / var(--tw-bg-opacity, 1))}.bg-gray-50\/50{background-color:#f8fafc80}.bg-primary-50{--tw-bg-opacity: 1;background-color:rgb(240 253 250 / var(--tw-bg-opacity, 1))}.bg-primary-500{--tw-bg-opacity: 1;background-color:rgb(20 184 166 / var(--tw-bg-opacity, 1))}.bg-primary-600{--tw-bg-opacity: 1;background-color:rgb(13 148 136 / var(--tw-bg-opacity, 1))}.bg-purple-50{--tw-bg-opacity: 1;background-color:rgb(250 245 255 / var(--tw-bg-opacity, 1))}.bg-red-600{--tw-bg-opacity: 1;background-color:rgb(220 38 38 / var(--tw-bg-opacity, 1))}.bg-slate-100{--tw-bg-opacity: 1;background-color:rgb(241 245 249 / var(--tw-bg-opacity, 1))}.bg-slate-50{--tw-bg-opacity: 1;background-color:rgb(248 250 252 / var(--tw-bg-opacity, 1))}.bg-success-50{--tw-bg-opacity: 1;background-color:rgb(236 253 245 / var(--tw-bg-opacity, 1))}.bg-success-500{--tw-bg-opacity: 1;background-color:rgb(16 185 129 / 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))}.bg-white\/90{background-color:#ffffffe6}.bg-opacity-50{--tw-bg-opacity: .5}.p-0\.5{padding:.125rem}.p-1{padding:.25rem}.p-1\.5{padding:.375rem}.p-2{padding:.5rem}.p-2\.5{padding:.625rem}.p-3{padding:.75rem}.p-5{padding:1.25rem}.p-6{padding:1.5rem}.p-8{padding:2rem}.px-0{padding-left:0;padding-right:0}.px-1{padding-left:.25rem;padding-right:.25rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.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-5{padding-left:1.25rem;padding-right:1.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.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}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-3\.5{padding-top:.875rem;padding-bottom:.875rem}.py-4{padding-top:1rem;padding-bottom:1rem}.pl-0{padding-left:0}.pl-1{padding-left:.25rem}.pl-2{padding-left:.5rem}.pl-8{padding-left:2rem}.pr-1{padding-right:.25rem}.pr-2{padding-right:.5rem}.pr-8{padding-right:2rem}.pt-1{padding-top:.25rem}.text-left{text-align:left}.text-center{text-align:center}.font-mono{font-family:IBM Plex Mono,monospace}.font-sans{font-family:Inter,sans-serif}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[8px\]{font-size:8px}.text-\[9px\]{font-size:9px}.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-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.lowercase{text-transform:lowercase}.italic{font-style:italic}.leading-tight{line-height:1.25}.tracking-tight{letter-spacing:-.025em}.tracking-wide{letter-spacing:.025em}.tracking-wider{letter-spacing:.05em}.text-amber-800{--tw-text-opacity: 1;color:rgb(146 64 14 / var(--tw-text-opacity, 1))}.text-blue-500{--tw-text-opacity: 1;color:rgb(59 130 246 / var(--tw-text-opacity, 1))}.text-blue-600{--tw-text-opacity: 1;color:rgb(37 99 235 / var(--tw-text-opacity, 1))}.text-blue-700{--tw-text-opacity: 1;color:rgb(29 78 216 / var(--tw-text-opacity, 1))}.text-danger-500{--tw-text-opacity: 1;color:rgb(244 63 94 / var(--tw-text-opacity, 1))}.text-danger-700{--tw-text-opacity: 1;color:rgb(190 18 60 / var(--tw-text-opacity, 1))}.text-danger-800{--tw-text-opacity: 1;color:rgb(159 18 57 / var(--tw-text-opacity, 1))}.text-gray-300{--tw-text-opacity: 1;color:rgb(203 213 225 / var(--tw-text-opacity, 1))}.text-gray-400{--tw-text-opacity: 1;color:rgb(148 163 184 / var(--tw-text-opacity, 1))}.text-gray-500{--tw-text-opacity: 1;color:rgb(100 116 139 / var(--tw-text-opacity, 1))}.text-gray-600{--tw-text-opacity: 1;color:rgb(71 85 105 / var(--tw-text-opacity, 1))}.text-gray-700{--tw-text-opacity: 1;color:rgb(51 65 85 / var(--tw-text-opacity, 1))}.text-gray-800{--tw-text-opacity: 1;color:rgb(30 41 59 / var(--tw-text-opacity, 1))}.text-gray-900{--tw-text-opacity: 1;color:rgb(15 23 42 / var(--tw-text-opacity, 1))}.text-primary-500{--tw-text-opacity: 1;color:rgb(20 184 166 / var(--tw-text-opacity, 1))}.text-primary-600{--tw-text-opacity: 1;color:rgb(13 148 136 / var(--tw-text-opacity, 1))}.text-purple-700{--tw-text-opacity: 1;color:rgb(126 34 206 / var(--tw-text-opacity, 1))}.text-slate-400{--tw-text-opacity: 1;color:rgb(148 163 184 / var(--tw-text-opacity, 1))}.text-slate-500{--tw-text-opacity: 1;color:rgb(100 116 139 / var(--tw-text-opacity, 1))}.text-slate-600{--tw-text-opacity: 1;color:rgb(71 85 105 / var(--tw-text-opacity, 1))}.text-slate-800{--tw-text-opacity: 1;color:rgb(30 41 59 / var(--tw-text-opacity, 1))}.text-success-700{--tw-text-opacity: 1;color:rgb(4 120 87 / var(--tw-text-opacity, 1))}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.opacity-0{opacity:0}.opacity-70{opacity:.7}.opacity-75{opacity:.75}.shadow-2xl{--tw-shadow: 0 25px 50px -12px rgb(0 0 0 / .25);--tw-shadow-colored: 0 25px 50px -12px 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-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)}.shadow-xl{--tw-shadow: 0 20px 25px -5px rgb(0 0 0 / .1), 0 8px 10px -6px rgb(0 0 0 / .1);--tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.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);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-blue-300{--tw-ring-opacity: 1;--tw-ring-color: rgb(147 197 253 / var(--tw-ring-opacity, 1))}.ring-primary-500{--tw-ring-opacity: 1;--tw-ring-color: rgb(20 184 166 / var(--tw-ring-opacity, 1))}.ring-opacity-50{--tw-ring-opacity: .5}.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)}.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-sm{--tw-backdrop-blur: blur(4px);-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-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-150{transition-duration:.15s}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}.svelte-flow__selection,.react-flow__selection,.xy-flow__selection{display:none!important;pointer-events:none!important}.svelte-flow__pane,.svelte-flow__node,.cursor-grab{cursor:default!important}.svelte-flow__pane.dragging,.svelte-flow__node.dragging,.cursor-grabbing,.svelte-flow__pane:active,.svelte-flow__node:active{cursor:move!important}input,textarea,[contenteditable]{cursor:default!important}.placeholder\:text-gray-300::-moz-placeholder{--tw-text-opacity: 1;color:rgb(203 213 225 / var(--tw-text-opacity, 1))}.placeholder\:text-gray-300::placeholder{--tw-text-opacity: 1;color:rgb(203 213 225 / var(--tw-text-opacity, 1))}.last\:border-0:last-child{border-width:0px}.hover\:border-primary-500:hover{--tw-border-opacity: 1;border-color:rgb(20 184 166 / var(--tw-border-opacity, 1))}.hover\:border-primary-600:hover{--tw-border-opacity: 1;border-color:rgb(13 148 136 / var(--tw-border-opacity, 1))}.hover\:bg-blue-50:hover{--tw-bg-opacity: 1;background-color:rgb(239 246 255 / var(--tw-bg-opacity, 1))}.hover\:bg-danger-50:hover{--tw-bg-opacity: 1;background-color:rgb(255 241 242 / var(--tw-bg-opacity, 1))}.hover\:bg-danger-700:hover{--tw-bg-opacity: 1;background-color:rgb(190 18 60 / var(--tw-bg-opacity, 1))}.hover\:bg-gray-100:hover{--tw-bg-opacity: 1;background-color:rgb(241 245 249 / var(--tw-bg-opacity, 1))}.hover\:bg-gray-200:hover{--tw-bg-opacity: 1;background-color:rgb(226 232 240 / var(--tw-bg-opacity, 1))}.hover\:bg-gray-200\/50:hover{background-color:#e2e8f080}.hover\:bg-gray-200\/70:hover{background-color:#e2e8f0b3}.hover\:bg-gray-300:hover{--tw-bg-opacity: 1;background-color:rgb(203 213 225 / var(--tw-bg-opacity, 1))}.hover\:bg-gray-50:hover{--tw-bg-opacity: 1;background-color:rgb(248 250 252 / var(--tw-bg-opacity, 1))}.hover\:bg-primary-50:hover{--tw-bg-opacity: 1;background-color:rgb(240 253 250 / var(--tw-bg-opacity, 1))}.hover\:bg-primary-700:hover{--tw-bg-opacity: 1;background-color:rgb(15 118 110 / var(--tw-bg-opacity, 1))}.hover\:bg-red-700:hover{--tw-bg-opacity: 1;background-color:rgb(185 28 28 / var(--tw-bg-opacity, 1))}.hover\:bg-slate-800:hover{--tw-bg-opacity: 1;background-color:rgb(30 41 59 / var(--tw-bg-opacity, 1))}.hover\:bg-white:hover{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.hover\:text-\[\#26A69A\]:hover{--tw-text-opacity: 1;color:rgb(38 166 154 / var(--tw-text-opacity, 1))}.hover\:text-blue-700:hover{--tw-text-opacity: 1;color:rgb(29 78 216 / var(--tw-text-opacity, 1))}.hover\:text-danger-500:hover{--tw-text-opacity: 1;color:rgb(244 63 94 / var(--tw-text-opacity, 1))}.hover\:text-danger-600:hover{--tw-text-opacity: 1;color:rgb(225 29 72 / var(--tw-text-opacity, 1))}.hover\:text-gray-700:hover{--tw-text-opacity: 1;color:rgb(51 65 85 / var(--tw-text-opacity, 1))}.hover\:text-gray-900:hover{--tw-text-opacity: 1;color:rgb(15 23 42 / var(--tw-text-opacity, 1))}.hover\:text-primary-500:hover{--tw-text-opacity: 1;color:rgb(20 184 166 / var(--tw-text-opacity, 1))}.hover\:text-primary-600:hover{--tw-text-opacity: 1;color:rgb(13 148 136 / var(--tw-text-opacity, 1))}.hover\:text-primary-700:hover{--tw-text-opacity: 1;color:rgb(15 118 110 / var(--tw-text-opacity, 1))}.hover\:shadow-md:hover{--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)}.hover\:shadow-sm:hover{--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)}.focus\:border-\[\#26A69A\]:focus{--tw-border-opacity: 1;border-color:rgb(38 166 154 / var(--tw-border-opacity, 1))}.focus\:bg-white:focus{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-1: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(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\: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-blue-400:focus{--tw-ring-opacity: 1;--tw-ring-color: rgb(96 165 250 / var(--tw-ring-opacity, 1))}.focus\:ring-blue-500:focus{--tw-ring-opacity: 1;--tw-ring-color: rgb(59 130 246 / var(--tw-ring-opacity, 1))}.focus\:ring-danger-500:focus{--tw-ring-opacity: 1;--tw-ring-color: rgb(244 63 94 / var(--tw-ring-opacity, 1))}.focus\:ring-primary-500:focus{--tw-ring-opacity: 1;--tw-ring-color: rgb(20 184 166 / var(--tw-ring-opacity, 1))}.focus\:ring-primary-600:focus{--tw-ring-opacity: 1;--tw-ring-color: rgb(13 148 136 / var(--tw-ring-opacity, 1))}.focus\:ring-red-500:focus{--tw-ring-opacity: 1;--tw-ring-color: rgb(239 68 68 / var(--tw-ring-opacity, 1))}.focus\:ring-offset-2:focus{--tw-ring-offset-width: 2px}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:bg-gray-50:disabled{--tw-bg-opacity: 1;background-color:rgb(248 250 252 / var(--tw-bg-opacity, 1))}.disabled\:text-gray-400:disabled{--tw-text-opacity: 1;color:rgb(148 163 184 / var(--tw-text-opacity, 1))}.disabled\:opacity-50:disabled{opacity:.5}.group:hover .group-hover\:text-primary-600{--tw-text-opacity: 1;color:rgb(13 148 136 / var(--tw-text-opacity, 1))}.group:hover .group-hover\:opacity-100{opacity:1}.svelte-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}.svelte-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}.svelte-flow__background{background-color:var(--xy-background-color-props, var(--xy-background-color, var(--xy-background-color-default)));pointer-events:none;z-index:-1}.svelte-flow__container{position:absolute;width:100%;height:100%;top:0;left:0}.svelte-flow__pane{z-index:1}.svelte-flow__pane.draggable{cursor:grab}.svelte-flow__pane.dragging{cursor:grabbing}.svelte-flow__pane.selection{cursor:pointer}.svelte-flow__viewport{transform-origin:0 0;z-index:2;pointer-events:none}.svelte-flow__renderer{z-index:4}.svelte-flow__selection{z-index:6}.svelte-flow__nodesselection-rect:focus,.svelte-flow__nodesselection-rect:focus-visible{outline:none}.svelte-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}.svelte-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}.svelte-flow .svelte-flow__edges{position:absolute}.svelte-flow .svelte-flow__edges svg{overflow:visible;position:absolute;pointer-events:none}.svelte-flow__edge{pointer-events:visibleStroke}.svelte-flow__edge.selectable{cursor:pointer}.svelte-flow__edge.animated path{stroke-dasharray:5;animation:dashdraw .5s linear infinite}.svelte-flow__edge.animated path.svelte-flow__edge-interaction{stroke-dasharray:none;animation:none}.svelte-flow__edge.inactive{pointer-events:none}.svelte-flow__edge.selected,.svelte-flow__edge:focus,.svelte-flow__edge:focus-visible{outline:none}.svelte-flow__edge.selected .svelte-flow__edge-path,.svelte-flow__edge.selectable:focus .svelte-flow__edge-path,.svelte-flow__edge.selectable:focus-visible .svelte-flow__edge-path{stroke:var(--xy-edge-stroke-selected, var(--xy-edge-stroke-selected-default))}.svelte-flow__edge-textwrapper{pointer-events:all}.svelte-flow__edge .svelte-flow__edge-text{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.svelte-flow__arrowhead polyline{stroke:var(--xy-edge-stroke, var(--xy-edge-stroke-default))}.svelte-flow__arrowhead polyline.arrowclosed{fill:var(--xy-edge-stroke, var(--xy-edge-stroke-default))}.svelte-flow__connection{pointer-events:none}.svelte-flow__connection .animated{stroke-dasharray:5;animation:dashdraw .5s linear infinite}svg.svelte-flow__connectionline{z-index:1001;overflow:visible;position:absolute}.svelte-flow__nodes{pointer-events:none;transform-origin:0 0}.svelte-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}.svelte-flow__node.selectable{cursor:pointer}.svelte-flow__node.draggable{cursor:grab;pointer-events:all}.svelte-flow__node.draggable.dragging{cursor:grabbing}.svelte-flow__nodesselection{z-index:3;transform-origin:left top;pointer-events:none}.svelte-flow__nodesselection-rect{position:absolute;pointer-events:all;cursor:grab}.svelte-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%}.svelte-flow__handle.connectingfrom{pointer-events:all}.svelte-flow__handle.connectionindicator{pointer-events:all;cursor:crosshair}.svelte-flow__handle-bottom{top:auto;left:50%;bottom:0;transform:translate(-50%,50%)}.svelte-flow__handle-top{top:0;left:50%;transform:translate(-50%,-50%)}.svelte-flow__handle-left{top:50%;left:0;transform:translate(-50%,-50%)}.svelte-flow__handle-right{top:50%;right:0;transform:translate(50%,-50%)}.svelte-flow__edgeupdater{cursor:move;pointer-events:all}.svelte-flow__pane.selection .svelte-flow__panel{pointer-events:none}.svelte-flow__panel{position:absolute;z-index:5;margin:15px}.svelte-flow__panel.top{top:0}.svelte-flow__panel.bottom{bottom:0}.svelte-flow__panel.top.center,.svelte-flow__panel.bottom.center{left:50%;transform:translate(-15px) translate(-50%)}.svelte-flow__panel.left{left:0}.svelte-flow__panel.right{right:0}.svelte-flow__panel.left.center,.svelte-flow__panel.right.center{top:50%;transform:translateY(-15px) translateY(-50%)}.svelte-flow__attribution{font-size:10px;background:var(--xy-attribution-background-color, var(--xy-attribution-background-color-default));padding:2px 3px;margin:0}.svelte-flow__attribution a{text-decoration:none;color:#999}@keyframes dashdraw{0%{stroke-dashoffset:10}}.svelte-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}.svelte-flow__viewport-portal{position:absolute;width:100%;height:100%;left:0;top:0;-webkit-user-select:none;-moz-user-select:none;user-select:none}.svelte-flow__minimap{background:var( --xy-minimap-background-color-props, var(--xy-minimap-background-color, var(--xy-minimap-background-color-default)) )}.svelte-flow__minimap-svg{display:block}.svelte-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)) )}.svelte-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)) )}.svelte-flow__background-pattern.dots{fill:var( --xy-background-pattern-color-props, var(--xy-background-pattern-color, var(--xy-background-pattern-dots-color-default)) )}.svelte-flow__background-pattern.lines{stroke:var( --xy-background-pattern-color-props, var(--xy-background-pattern-color, var(--xy-background-pattern-lines-color-default)) )}.svelte-flow__background-pattern.cross{stroke:var( --xy-background-pattern-color-props, var(--xy-background-pattern-color, var(--xy-background-pattern-cross-color-default)) )}.svelte-flow__controls{display:flex;flex-direction:column;box-shadow:var(--xy-controls-box-shadow, var(--xy-controls-box-shadow-default))}.svelte-flow__controls.horizontal{flex-direction:row}.svelte-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}.svelte-flow__controls-button svg{width:100%;max-width:12px;max-height:12px;fill:currentColor}.svelte-flow__edge.updating .svelte-flow__edge-path{stroke:#777}.svelte-flow__edge-text{font-size:10px}.svelte-flow__node.selectable:focus,.svelte-flow__node.selectable:focus-visible{outline:none}.svelte-flow__node-input,.svelte-flow__node-default,.svelte-flow__node-output,.svelte-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))}.svelte-flow__node-input.selectable:hover,.svelte-flow__node-default.selectable:hover,.svelte-flow__node-output.selectable:hover,.svelte-flow__node-group.selectable:hover{box-shadow:var(--xy-node-boxshadow-hover, var(--xy-node-boxshadow-hover-default))}.svelte-flow__node-input.selectable.selected,.svelte-flow__node-input.selectable:focus,.svelte-flow__node-input.selectable:focus-visible,.svelte-flow__node-default.selectable.selected,.svelte-flow__node-default.selectable:focus,.svelte-flow__node-default.selectable:focus-visible,.svelte-flow__node-output.selectable.selected,.svelte-flow__node-output.selectable:focus,.svelte-flow__node-output.selectable:focus-visible,.svelte-flow__node-group.selectable.selected,.svelte-flow__node-group.selectable:focus,.svelte-flow__node-group.selectable:focus-visible{box-shadow:var(--xy-node-boxshadow-selected, var(--xy-node-boxshadow-selected-default))}.svelte-flow__node-group{background-color:var(--xy-node-group-background-color, var(--xy-node-group-background-color-default))}.svelte-flow__nodesselection-rect,.svelte-flow__selection{background:var(--xy-selection-background-color, var(--xy-selection-background-color-default));border:var(--xy-selection-border, var(--xy-selection-border-default))}.svelte-flow__nodesselection-rect:focus,.svelte-flow__nodesselection-rect:focus-visible,.svelte-flow__selection:focus,.svelte-flow__selection:focus-visible{outline:none}.svelte-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)) )}.svelte-flow__controls-button:disabled{pointer-events:none}.svelte-flow__controls-button:disabled svg{fill-opacity:.4}.svelte-flow__controls-button:last-child{border-bottom:none}.svelte-flow__controls.horizontal .svelte-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)) )}.svelte-flow__controls.horizontal .svelte-flow__controls-button:last-child{border-right:none}.svelte-flow__resize-control{position:absolute}.svelte-flow__resize-control.left,.svelte-flow__resize-control.right{cursor:ew-resize}.svelte-flow__resize-control.top,.svelte-flow__resize-control.bottom{cursor:ns-resize}.svelte-flow__resize-control.top.left,.svelte-flow__resize-control.bottom.right{cursor:nwse-resize}.svelte-flow__resize-control.bottom.left,.svelte-flow__resize-control.top.right{cursor:nesw-resize}.svelte-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%}.svelte-flow__resize-control.handle.left{left:0;top:50%}.svelte-flow__resize-control.handle.right{left:100%;top:50%}.svelte-flow__resize-control.handle.top{left:50%;top:0}.svelte-flow__resize-control.handle.bottom{left:50%;top:100%}.svelte-flow__resize-control.handle.top.left,.svelte-flow__resize-control.handle.bottom.left{left:0}.svelte-flow__resize-control.handle.top.right,.svelte-flow__resize-control.handle.bottom.right{left:100%}.svelte-flow__resize-control.line{border-color:var(--xy-resize-background-color, var(--xy-resize-background-color-default));border-width:0;border-style:solid}.svelte-flow__resize-control.line.left,.svelte-flow__resize-control.line.right{width:1px;transform:translate(-50%);top:0;height:100%}.svelte-flow__resize-control.line.left{left:0;border-left-width:1px}.svelte-flow__resize-control.line.right{left:100%;border-right-width:1px}.svelte-flow__resize-control.line.top,.svelte-flow__resize-control.line.bottom{height:1px;transform:translateY(-50%);left:0;width:100%}.svelte-flow__resize-control.line.top{top:0;border-top-width:1px}.svelte-flow__resize-control.line.bottom{border-bottom-width:1px;top:100%}.svelte-flow__edge-label{text-align:center;position:absolute;padding:2px;font-size:10px;color:var(--xy-edge-label-color, var(--xy-edge-label-color-default));background:var(--xy-edge-label-background-color, var(--xy-edge-label-background-color-default))}.svelte-flow__container{-webkit-user-select:none;-moz-user-select:none;user-select:none}
@@ -1 +0,0 @@
1
- import{l as o,a as r}from"../chunks/CXDUumOQ.js";export{o as load_css,r as start};