@lobb-js/studio 0.39.0 → 0.40.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -16,13 +16,25 @@
16
16
  collectionName,
17
17
  }: Props = $props();
18
18
 
19
- // Count rules, not top-level fields: a single field with two
20
- // operators ({age: {$gte, $lte}}) is two rules, not one. Unmanaged
21
- // $and / $or carriers count as one rule each (legacy filter shape).
22
- function countRules(f: Record<string, any>): number {
19
+ // Tracks whether the filter has any rules applied. Filter pushes
20
+ // this back up so we can shrink the popover when empty — the
21
+ // loaded width feels hollow against the empty-state icon.
22
+ let filterIsEmpty = $state(true);
23
+
24
+ // Count rules across the whole filter tree. A single field with two
25
+ // operators ({age: {$gte, $lte}}) is two rules. Nested $and / $or
26
+ // arrays (groups) recurse into their children so a group with three
27
+ // rules contributes three, not one.
28
+ function countRules(f: any): number {
29
+ if (f == null || typeof f !== "object") return 0;
23
30
  let n = 0;
24
- for (const [key, value] of Object.entries(f ?? {})) {
25
- if (key.startsWith("$")) { n += 1; continue; }
31
+ for (const [key, value] of Object.entries(f)) {
32
+ if (key === "$and" || key === "$or") {
33
+ if (Array.isArray(value)) {
34
+ for (const child of value) n += countRules(child);
35
+ }
36
+ continue;
37
+ }
26
38
  if (value && typeof value === "object" && !Array.isArray(value)) {
27
39
  n += Object.keys(value).length;
28
40
  } else {
@@ -51,7 +63,13 @@
51
63
  {/if}
52
64
  {/if}
53
65
  </Popover.Trigger>
54
- <Popover.Content class="w-screen max-w-[36rem] p-0">
55
- <Filter bind:filter {collectionName} />
66
+ <Popover.Content
67
+ class="
68
+ w-screen p-0
69
+ transition-[max-width] duration-150
70
+ {filterIsEmpty ? 'max-w-xs' : 'max-w-[36rem]'}
71
+ "
72
+ >
73
+ <Filter bind:filter {collectionName} bind:isEmpty={filterIsEmpty} />
56
74
  </Popover.Content>
57
75
  </Popover.Root>