@lobb-js/studio 0.48.0 → 0.49.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.
Files changed (63) hide show
  1. package/dist/components/detailView/detailView.svelte +12 -62
  2. package/dist/components/detailView/detailView.svelte.d.ts +1 -1
  3. package/dist/components/detailView/fieldInput.svelte +161 -288
  4. package/dist/components/detailView/fieldInput.svelte.d.ts +1 -1
  5. package/dist/components/detailView/fields/BoolField.svelte +42 -0
  6. package/dist/components/detailView/fields/BoolField.svelte.d.ts +13 -0
  7. package/dist/components/detailView/fields/CodeField.svelte +30 -0
  8. package/dist/components/detailView/fields/CodeField.svelte.d.ts +13 -0
  9. package/dist/components/detailView/fields/CustomInputField.svelte +50 -0
  10. package/dist/components/detailView/fields/CustomInputField.svelte.d.ts +18 -0
  11. package/dist/components/detailView/fields/DateField.svelte +47 -0
  12. package/dist/components/detailView/fields/DateField.svelte.d.ts +14 -0
  13. package/dist/components/detailView/fields/EmbeddedField.svelte +139 -0
  14. package/dist/components/detailView/fields/EmbeddedField.svelte.d.ts +13 -0
  15. package/dist/components/detailView/fields/EmbeddedPolymorphicField.svelte +197 -0
  16. package/dist/components/detailView/fields/EmbeddedPolymorphicField.svelte.d.ts +13 -0
  17. package/dist/components/detailView/fields/EnumField.svelte +70 -0
  18. package/dist/components/detailView/fields/EnumField.svelte.d.ts +17 -0
  19. package/dist/components/detailView/fields/FieldWrapper.svelte +68 -0
  20. package/dist/components/detailView/fields/FieldWrapper.svelte.d.ts +18 -0
  21. package/dist/components/detailView/fields/ForeignKeyField.svelte +78 -0
  22. package/dist/components/detailView/fields/ForeignKeyField.svelte.d.ts +17 -0
  23. package/dist/components/detailView/fields/IdField.svelte +21 -0
  24. package/dist/components/detailView/fields/IdField.svelte.d.ts +12 -0
  25. package/dist/components/detailView/fields/NumberField.svelte +38 -0
  26. package/dist/components/detailView/fields/NumberField.svelte.d.ts +16 -0
  27. package/dist/components/detailView/fields/PasswordField.svelte +29 -0
  28. package/dist/components/detailView/fields/PasswordField.svelte.d.ts +12 -0
  29. package/dist/components/detailView/fields/PolymorphicField.svelte +51 -0
  30. package/dist/components/detailView/fields/PolymorphicField.svelte.d.ts +16 -0
  31. package/dist/components/detailView/fields/RichTextField.svelte +30 -0
  32. package/dist/components/detailView/fields/RichTextField.svelte.d.ts +13 -0
  33. package/dist/components/detailView/fields/StringField.svelte +35 -0
  34. package/dist/components/detailView/fields/StringField.svelte.d.ts +14 -0
  35. package/dist/components/detailView/fields/TextField.svelte +35 -0
  36. package/dist/components/detailView/fields/TextField.svelte.d.ts +14 -0
  37. package/dist/components/foreingKeyInput.svelte +1 -1
  38. package/dist/components/polymorphicInput.svelte +1 -1
  39. package/dist/extensions/extension.types.d.ts +3 -1
  40. package/dist/extensions/extensionUtils.js +2 -0
  41. package/package.json +7 -6
  42. package/src/lib/components/detailView/detailView.svelte +12 -62
  43. package/src/lib/components/detailView/fieldInput.svelte +161 -288
  44. package/src/lib/components/detailView/fields/BoolField.svelte +42 -0
  45. package/src/lib/components/detailView/fields/CodeField.svelte +30 -0
  46. package/src/lib/components/detailView/fields/CustomInputField.svelte +50 -0
  47. package/src/lib/components/detailView/fields/DateField.svelte +47 -0
  48. package/src/lib/components/detailView/fields/EmbeddedField.svelte +139 -0
  49. package/src/lib/components/detailView/fields/EmbeddedPolymorphicField.svelte +197 -0
  50. package/src/lib/components/detailView/fields/EnumField.svelte +70 -0
  51. package/src/lib/components/detailView/fields/FieldWrapper.svelte +68 -0
  52. package/src/lib/components/detailView/fields/ForeignKeyField.svelte +78 -0
  53. package/src/lib/components/detailView/fields/IdField.svelte +21 -0
  54. package/src/lib/components/detailView/fields/NumberField.svelte +38 -0
  55. package/src/lib/components/detailView/fields/PasswordField.svelte +29 -0
  56. package/src/lib/components/detailView/fields/PolymorphicField.svelte +51 -0
  57. package/src/lib/components/detailView/fields/RichTextField.svelte +30 -0
  58. package/src/lib/components/detailView/fields/StringField.svelte +35 -0
  59. package/src/lib/components/detailView/fields/TextField.svelte +35 -0
  60. package/src/lib/components/foreingKeyInput.svelte +1 -1
  61. package/src/lib/components/polymorphicInput.svelte +1 -1
  62. package/src/lib/extensions/extension.types.ts +2 -1
  63. package/src/lib/extensions/extensionUtils.ts +2 -0
@@ -0,0 +1,68 @@
1
+ <script lang="ts">
2
+ import { CircleAlert, CircleHelp } from "lucide-svelte";
3
+ import * as Tooltip from "../../ui/tooltip";
4
+ import type { Snippet } from "svelte";
5
+
6
+ interface FieldHeader {
7
+ text: string;
8
+ icon?: any;
9
+ typeText?: string;
10
+ description?: string;
11
+ }
12
+
13
+ interface Props {
14
+ span?: 1 | 2;
15
+ isDisabled?: boolean;
16
+ disabledClasses?: string;
17
+ errorMessages?: any;
18
+ header?: FieldHeader;
19
+ children: Snippet<[]>;
20
+ }
21
+
22
+ let {
23
+ span = 1,
24
+ isDisabled = false,
25
+ disabledClasses = "pointer-events-none opacity-50",
26
+ errorMessages = [],
27
+ header,
28
+ children,
29
+ }: Props = $props();
30
+ </script>
31
+
32
+ <div class="{span === 2 ? 'col-span-2' : 'col-span-1'} flex flex-col gap-2 {isDisabled ? 'cursor-not-allowed' : ''}">
33
+ {#if header}
34
+ <div class="flex items-center gap-1.5 text-xs">
35
+ <span>{header.text}</span>
36
+ {#if header.icon || header.typeText}
37
+ <span class="flex items-center gap-1 text-[0.7rem] text-muted-foreground">
38
+ {#if header.icon}
39
+ {@const HeaderIcon = header.icon}
40
+ <HeaderIcon size={12} />
41
+ {/if}
42
+ {header.typeText ?? ''}
43
+ </span>
44
+ {/if}
45
+ {#if header.description}
46
+ <Tooltip.Root>
47
+ <Tooltip.Trigger>
48
+ <CircleHelp size={12} class="text-muted-foreground" />
49
+ </Tooltip.Trigger>
50
+ <Tooltip.Content class="max-w-64 text-xs">
51
+ {header.description}
52
+ </Tooltip.Content>
53
+ </Tooltip.Root>
54
+ {/if}
55
+ </div>
56
+ {/if}
57
+ <div class="{isDisabled ? disabledClasses : ''}">
58
+ {@render children()}
59
+ {#if Array.isArray(errorMessages) && errorMessages.length}
60
+ {#each errorMessages as message}
61
+ <div class="flex gap-1 text-destructive mt-1">
62
+ <CircleAlert size="15" class="translate-y-[0.025rem]" />
63
+ <div class="text-[0.7rem]">{message}</div>
64
+ </div>
65
+ {/each}
66
+ {/if}
67
+ </div>
68
+ </div>
@@ -0,0 +1,18 @@
1
+ import type { Snippet } from "svelte";
2
+ interface FieldHeader {
3
+ text: string;
4
+ icon?: any;
5
+ typeText?: string;
6
+ description?: string;
7
+ }
8
+ interface Props {
9
+ span?: 1 | 2;
10
+ isDisabled?: boolean;
11
+ disabledClasses?: string;
12
+ errorMessages?: any;
13
+ header?: FieldHeader;
14
+ children: Snippet<[]>;
15
+ }
16
+ declare const FieldWrapper: import("svelte").Component<Props, {}, "">;
17
+ type FieldWrapper = ReturnType<typeof FieldWrapper>;
18
+ export default FieldWrapper;
@@ -0,0 +1,78 @@
1
+ <script lang="ts">
2
+ import type { Snippet } from "svelte";
3
+ import { getStudioContext } from "../../../context";
4
+ import { getExtensionUtils, loadExtensionComponents } from "../../../extensions/extensionUtils";
5
+ import ForeingKeyInput from "../../foreingKeyInput.svelte";
6
+ import ExtensionsComponents from "../../extensionsComponents.svelte";
7
+ import FieldWrapper from "./FieldWrapper.svelte";
8
+
9
+ const { lobb, ctx } = getStudioContext();
10
+
11
+ interface Props {
12
+ parentCollectionName: string;
13
+ collectionName: string;
14
+ fieldName: string;
15
+ value?: any;
16
+ entry?: Record<string, any>;
17
+ destructive?: boolean;
18
+ changedClass?: string;
19
+ isDisabled?: boolean;
20
+ errorMessages?: any;
21
+ header?: any;
22
+ clearBtn?: Snippet<[]>;
23
+ }
24
+
25
+ let {
26
+ parentCollectionName,
27
+ collectionName,
28
+ fieldName,
29
+ value = $bindable(),
30
+ entry = $bindable(),
31
+ destructive = false,
32
+ isDisabled = false,
33
+ errorMessages = [],
34
+ header,
35
+ clearBtn,
36
+ }: Props = $props();
37
+
38
+ const hasExtension = $derived(
39
+ loadExtensionComponents(ctx, `detailView.fields.foreignKey.${collectionName}`).length > 0
40
+ );
41
+ </script>
42
+
43
+ {#if hasExtension}
44
+ <ExtensionsComponents
45
+ name="detailView.fields.foreignKey.{collectionName}"
46
+ utils={getExtensionUtils(lobb, ctx)}
47
+ {parentCollectionName}
48
+ {collectionName}
49
+ bind:value
50
+ entry={entry!}
51
+ {fieldName}
52
+ {destructive}
53
+ {header}
54
+ {isDisabled}
55
+ {errorMessages}
56
+ {clearBtn}
57
+ />
58
+ {:else}
59
+ <FieldWrapper span={1} {isDisabled} {errorMessages} {header}>
60
+ {#snippet children()}
61
+ <div class="relative">
62
+ {#if clearBtn}
63
+ <div class="absolute right-1 top-1 z-10">
64
+ {@render clearBtn()}
65
+ </div>
66
+ {/if}
67
+ <ForeingKeyInput
68
+ {parentCollectionName}
69
+ {collectionName}
70
+ bind:value
71
+ entry={entry!}
72
+ {fieldName}
73
+ {destructive}
74
+ />
75
+ </div>
76
+ {/snippet}
77
+ </FieldWrapper>
78
+ {/if}
@@ -0,0 +1,17 @@
1
+ import type { Snippet } from "svelte";
2
+ interface Props {
3
+ parentCollectionName: string;
4
+ collectionName: string;
5
+ fieldName: string;
6
+ value?: any;
7
+ entry?: Record<string, any>;
8
+ destructive?: boolean;
9
+ changedClass?: string;
10
+ isDisabled?: boolean;
11
+ errorMessages?: any;
12
+ header?: any;
13
+ clearBtn?: Snippet<[]>;
14
+ }
15
+ declare const ForeignKeyField: import("svelte").Component<Props, {}, "value" | "entry">;
16
+ type ForeignKeyField = ReturnType<typeof ForeignKeyField>;
17
+ export default ForeignKeyField;
@@ -0,0 +1,21 @@
1
+ <script lang="ts">
2
+ import type { Snippet } from "svelte";
3
+ import Input from "../../ui/input/input.svelte";
4
+ import FieldWrapper from "./FieldWrapper.svelte";
5
+
6
+ interface Props {
7
+ value?: any;
8
+ changedClass?: string;
9
+ isDisabled?: boolean;
10
+ errorMessages?: any;
11
+ header?: any;
12
+ clearBtn?: Snippet<[]>;
13
+ }
14
+ let { value = $bindable(), changedClass = '', isDisabled = false, errorMessages = [], header, clearBtn }: Props = $props();
15
+ </script>
16
+
17
+ <FieldWrapper span={1} {isDisabled} {errorMessages} {header}>
18
+ {#snippet children()}
19
+ <Input placeholder="AUTO GENERATED" class="bg-muted text-xs {changedClass}" bind:value />
20
+ {/snippet}
21
+ </FieldWrapper>
@@ -0,0 +1,12 @@
1
+ import type { Snippet } from "svelte";
2
+ interface Props {
3
+ value?: any;
4
+ changedClass?: string;
5
+ isDisabled?: boolean;
6
+ errorMessages?: any;
7
+ header?: any;
8
+ clearBtn?: Snippet<[]>;
9
+ }
10
+ declare const IdField: import("svelte").Component<Props, {}, "value">;
11
+ type IdField = ReturnType<typeof IdField>;
12
+ export default IdField;
@@ -0,0 +1,38 @@
1
+ <script lang="ts">
2
+ import type { Snippet } from "svelte";
3
+ import NumberInput from "../../ui/input/numberInput.svelte";
4
+ import FieldWrapper from "./FieldWrapper.svelte";
5
+
6
+ interface Props {
7
+ value?: any;
8
+ scale?: number;
9
+ groupDigits?: boolean;
10
+ placeholder?: string;
11
+ destructive?: boolean;
12
+ changedClass?: string;
13
+ isDisabled?: boolean;
14
+ errorMessages?: any;
15
+ header?: any;
16
+ clearBtn?: Snippet<[]>;
17
+ }
18
+ let { value = $bindable(), scale = 0, groupDigits = false, placeholder = "NULL", destructive = false, changedClass = '', isDisabled = false, errorMessages = [], header, clearBtn }: Props = $props();
19
+ </script>
20
+
21
+ <FieldWrapper span={1} {isDisabled} {errorMessages} {header}>
22
+ {#snippet children()}
23
+ <div class="relative">
24
+ {#if clearBtn}
25
+ <div class="absolute right-1 inset-y-0 z-10 flex items-center">
26
+ {@render clearBtn()}
27
+ </div>
28
+ {/if}
29
+ <NumberInput
30
+ {placeholder}
31
+ {scale}
32
+ {groupDigits}
33
+ class="bg-muted text-xs pr-9 {changedClass} {destructive ? 'border-destructive' : ''}"
34
+ bind:value
35
+ />
36
+ </div>
37
+ {/snippet}
38
+ </FieldWrapper>
@@ -0,0 +1,16 @@
1
+ import type { Snippet } from "svelte";
2
+ interface Props {
3
+ value?: any;
4
+ scale?: number;
5
+ groupDigits?: boolean;
6
+ placeholder?: string;
7
+ destructive?: boolean;
8
+ changedClass?: string;
9
+ isDisabled?: boolean;
10
+ errorMessages?: any;
11
+ header?: any;
12
+ clearBtn?: Snippet<[]>;
13
+ }
14
+ declare const NumberField: import("svelte").Component<Props, {}, "value">;
15
+ type NumberField = ReturnType<typeof NumberField>;
16
+ export default NumberField;
@@ -0,0 +1,29 @@
1
+ <script lang="ts">
2
+ import type { Snippet } from "svelte";
3
+ import PasswordInput from "../passwordInput.svelte";
4
+ import FieldWrapper from "./FieldWrapper.svelte";
5
+
6
+ interface Props {
7
+ value?: any;
8
+ destructive?: boolean;
9
+ isDisabled?: boolean;
10
+ errorMessages?: any;
11
+ header?: any;
12
+ clearBtn?: Snippet<[]>;
13
+ }
14
+
15
+ let { value = $bindable(), destructive = false, isDisabled = false, errorMessages = [], header, clearBtn }: Props = $props();
16
+ </script>
17
+
18
+ <FieldWrapper span={1} {isDisabled} {errorMessages} {header}>
19
+ {#snippet children()}
20
+ <div class="relative">
21
+ {#if clearBtn}
22
+ <div class="absolute right-1 inset-y-0 z-10 flex items-center">
23
+ {@render clearBtn()}
24
+ </div>
25
+ {/if}
26
+ <PasswordInput bind:value {destructive} />
27
+ </div>
28
+ {/snippet}
29
+ </FieldWrapper>
@@ -0,0 +1,12 @@
1
+ import type { Snippet } from "svelte";
2
+ interface Props {
3
+ value?: any;
4
+ destructive?: boolean;
5
+ isDisabled?: boolean;
6
+ errorMessages?: any;
7
+ header?: any;
8
+ clearBtn?: Snippet<[]>;
9
+ }
10
+ declare const PasswordField: import("svelte").Component<Props, {}, "value">;
11
+ type PasswordField = ReturnType<typeof PasswordField>;
12
+ export default PasswordField;
@@ -0,0 +1,51 @@
1
+ <script lang="ts">
2
+ import type { Snippet } from "svelte";
3
+ import PolymorphicInput from "../../polymorphicInput.svelte";
4
+ import FieldWrapper from "./FieldWrapper.svelte";
5
+
6
+ interface Props {
7
+ collectionField: string;
8
+ idField: string;
9
+ virtualField: string;
10
+ targetCollections: string[];
11
+ entry: Record<string, any>;
12
+ destructive?: boolean;
13
+ isDisabled?: boolean;
14
+ errorMessages?: any;
15
+ header?: any;
16
+ clearBtn?: Snippet<[]>;
17
+ }
18
+
19
+ let {
20
+ collectionField,
21
+ idField,
22
+ virtualField,
23
+ targetCollections,
24
+ entry = $bindable(),
25
+ destructive = false,
26
+ isDisabled = false,
27
+ errorMessages = [],
28
+ header,
29
+ clearBtn,
30
+ }: Props = $props();
31
+ </script>
32
+
33
+ <FieldWrapper span={2} {isDisabled} {errorMessages} {header}>
34
+ {#snippet children()}
35
+ <div class="relative">
36
+ {#if clearBtn}
37
+ <div class="absolute right-1 inset-y-0 z-10 flex items-center">
38
+ {@render clearBtn()}
39
+ </div>
40
+ {/if}
41
+ <PolymorphicInput
42
+ {collectionField}
43
+ {idField}
44
+ {virtualField}
45
+ {targetCollections}
46
+ bind:entry
47
+ {destructive}
48
+ />
49
+ </div>
50
+ {/snippet}
51
+ </FieldWrapper>
@@ -0,0 +1,16 @@
1
+ import type { Snippet } from "svelte";
2
+ interface Props {
3
+ collectionField: string;
4
+ idField: string;
5
+ virtualField: string;
6
+ targetCollections: string[];
7
+ entry: Record<string, any>;
8
+ destructive?: boolean;
9
+ isDisabled?: boolean;
10
+ errorMessages?: any;
11
+ header?: any;
12
+ clearBtn?: Snippet<[]>;
13
+ }
14
+ declare const PolymorphicField: import("svelte").Component<Props, {}, "entry">;
15
+ type PolymorphicField = ReturnType<typeof PolymorphicField>;
16
+ export default PolymorphicField;
@@ -0,0 +1,30 @@
1
+ <script lang="ts">
2
+ import type { Snippet } from "svelte";
3
+ import RichTextEditor from "../../richTextEditor.svelte";
4
+ import FieldWrapper from "./FieldWrapper.svelte";
5
+
6
+ interface Props {
7
+ value?: any;
8
+ field: any;
9
+ destructive?: boolean;
10
+ isDisabled?: boolean;
11
+ errorMessages?: any;
12
+ header?: any;
13
+ clearBtn?: Snippet<[]>;
14
+ }
15
+
16
+ let { value = $bindable(), field, destructive = false, isDisabled = false, errorMessages = [], header, clearBtn }: Props = $props();
17
+ </script>
18
+
19
+ <FieldWrapper span={2} {isDisabled} {errorMessages} {header}>
20
+ {#snippet children()}
21
+ <div class="relative {destructive ? 'rounded-md ring-1 ring-destructive' : ''}">
22
+ {#if clearBtn}
23
+ <div class="absolute right-1 top-1 z-10">
24
+ {@render clearBtn()}
25
+ </div>
26
+ {/if}
27
+ <RichTextEditor name={field.key} bind:value />
28
+ </div>
29
+ {/snippet}
30
+ </FieldWrapper>
@@ -0,0 +1,13 @@
1
+ import type { Snippet } from "svelte";
2
+ interface Props {
3
+ value?: any;
4
+ field: any;
5
+ destructive?: boolean;
6
+ isDisabled?: boolean;
7
+ errorMessages?: any;
8
+ header?: any;
9
+ clearBtn?: Snippet<[]>;
10
+ }
11
+ declare const RichTextField: import("svelte").Component<Props, {}, "value">;
12
+ type RichTextField = ReturnType<typeof RichTextField>;
13
+ export default RichTextField;
@@ -0,0 +1,35 @@
1
+ <script lang="ts">
2
+ import type { Snippet } from "svelte";
3
+ import Input from "../../ui/input/input.svelte";
4
+ import FieldWrapper from "./FieldWrapper.svelte";
5
+
6
+ interface Props {
7
+ value?: any;
8
+ placeholder?: string;
9
+ destructive?: boolean;
10
+ changedClass?: string;
11
+ isDisabled?: boolean;
12
+ errorMessages?: any;
13
+ header?: any;
14
+ clearBtn?: Snippet<[]>;
15
+ }
16
+ let { value = $bindable(), placeholder = "NULL", destructive = false, changedClass = '', isDisabled = false, errorMessages = [], header, clearBtn }: Props = $props();
17
+ </script>
18
+
19
+ <FieldWrapper span={1} {isDisabled} {errorMessages} {header}>
20
+ {#snippet children()}
21
+ <div class="relative">
22
+ {#if clearBtn}
23
+ <div class="absolute right-1 inset-y-0 z-10 flex items-center">
24
+ {@render clearBtn()}
25
+ </div>
26
+ {/if}
27
+ <Input
28
+ {placeholder}
29
+ type="text"
30
+ class="bg-muted text-xs pr-9 {changedClass} {destructive ? 'border-destructive' : ''}"
31
+ bind:value
32
+ />
33
+ </div>
34
+ {/snippet}
35
+ </FieldWrapper>
@@ -0,0 +1,14 @@
1
+ import type { Snippet } from "svelte";
2
+ interface Props {
3
+ value?: any;
4
+ placeholder?: string;
5
+ destructive?: boolean;
6
+ changedClass?: string;
7
+ isDisabled?: boolean;
8
+ errorMessages?: any;
9
+ header?: any;
10
+ clearBtn?: Snippet<[]>;
11
+ }
12
+ declare const StringField: import("svelte").Component<Props, {}, "value">;
13
+ type StringField = ReturnType<typeof StringField>;
14
+ export default StringField;
@@ -0,0 +1,35 @@
1
+ <script lang="ts">
2
+ import type { Snippet } from "svelte";
3
+ import Textarea from "../../ui/textarea/textarea.svelte";
4
+ import FieldWrapper from "./FieldWrapper.svelte";
5
+
6
+ interface Props {
7
+ value?: any;
8
+ placeholder?: string;
9
+ destructive?: boolean;
10
+ changedClass?: string;
11
+ isDisabled?: boolean;
12
+ errorMessages?: any;
13
+ header?: any;
14
+ clearBtn?: Snippet<[]>;
15
+ }
16
+ let { value = $bindable(), placeholder = "NULL", destructive = false, changedClass = '', isDisabled = false, errorMessages = [], header, clearBtn }: Props = $props();
17
+ </script>
18
+
19
+ <FieldWrapper span={2} {isDisabled} {errorMessages} {header}>
20
+ {#snippet children()}
21
+ <div class="relative">
22
+ {#if clearBtn}
23
+ <div class="absolute right-1 top-1 z-10">
24
+ {@render clearBtn()}
25
+ </div>
26
+ {/if}
27
+ <Textarea
28
+ {placeholder}
29
+ rows={5}
30
+ class="bg-muted text-xs pr-9 {changedClass} {destructive ? 'border-destructive' : ''}"
31
+ bind:value
32
+ />
33
+ </div>
34
+ {/snippet}
35
+ </FieldWrapper>
@@ -0,0 +1,14 @@
1
+ import type { Snippet } from "svelte";
2
+ interface Props {
3
+ value?: any;
4
+ placeholder?: string;
5
+ destructive?: boolean;
6
+ changedClass?: string;
7
+ isDisabled?: boolean;
8
+ errorMessages?: any;
9
+ header?: any;
10
+ clearBtn?: Snippet<[]>;
11
+ }
12
+ declare const TextField: import("svelte").Component<Props, {}, "value">;
13
+ type TextField = ReturnType<typeof TextField>;
14
+ export default TextField;
@@ -80,7 +80,7 @@
80
80
  <Input
81
81
  placeholder={isPendingCreate ? "AUTO GENERATED" : isEmpty ? "NULL" : ""}
82
82
  type="number"
83
- class="bg-muted text-xs {bgClass} {destructive ? '!bg-destructive/10 border-destructive' : ''}"
83
+ class="bg-muted text-xs {bgClass} {destructive ? 'border-destructive' : ''}"
84
84
  bind:value={
85
85
  () => hasRealId ? value : "",
86
86
  (v) => { value = (v === "" || v == null) ? null : Number(v); }
@@ -80,7 +80,7 @@
80
80
  }
81
81
  </script>
82
82
 
83
- <div class="flex h-9 w-full items-center gap-1.5 rounded-md border pl-1.5 pr-9 text-xs bg-muted {bgClass} {destructive ? '!bg-destructive/10 border-destructive' : ''}">
83
+ <div class="flex h-9 w-full items-center gap-1.5 rounded-md border pl-1.5 pr-9 text-xs bg-muted {bgClass} {destructive ? 'border-destructive' : ''}">
84
84
  <Popover.Root bind:open={collectionPopoverOpen}>
85
85
  <Popover.Trigger>
86
86
  {#snippet child({ props })}
@@ -17,6 +17,7 @@ import type RangeCalendarButton from "../components/rangeCalendarButton.svelte";
17
17
  import type DataTable from "../components/dataTable/dataTable.svelte";
18
18
  import type Drawer from "../components/drawer.svelte";
19
19
  import type SelectRecord from "../components/selectRecord.svelte";
20
+ import type FieldWrapper from "../components/detailView/fields/FieldWrapper.svelte";
20
21
  import * as Popover from "../components/ui/popover";
21
22
  import * as intlDate from "@internationalized/date";
22
23
  import * as Icons from "lucide-svelte";
@@ -48,6 +49,7 @@ export interface Components {
48
49
  Drawer: typeof Drawer;
49
50
  SelectRecord: typeof SelectRecord;
50
51
  Switch: typeof Switch;
52
+ FieldWrapper: typeof FieldWrapper;
51
53
  }
52
54
  export interface ExtensionUtils {
53
55
  ctx: CTX;
@@ -122,7 +124,7 @@ export interface ExtensionProps {
122
124
  utils: ExtensionUtils;
123
125
  [key: string]: any;
124
126
  }
125
- export type ExtensionComponentKey = `pages.${string}` | `publicPages.${string}` | "studio.listView" | `dvFields.topRight.${string}.${string}` | `detailView.update.subRecords.${string}` | `detailView.create.subRecords.${string}` | `detailView.fields.topRight.${string}.${string}` | "detailView.field.label" | `detailView.fields.foreignKey.${string}` | `listView.entry.children.${string}` | `listView.entry.actions` | `listView.header.actions` | (string & {});
127
+ export type ExtensionComponentKey = `pages.${string}` | `publicPages.${string}` | "studio.listView" | `detailView.update.subRecords.${string}` | `detailView.create.subRecords.${string}` | `detailView.fields.topRight.${string}.${string}` | "detailView.field.label" | `detailView.fields.foreignKey.${string}` | `listView.entry.children.${string}` | `listView.entry.actions` | `listView.header.actions` | (string & {});
126
128
  export type ExtensionComponent = any | {
127
129
  component: any;
128
130
  when: (props: Record<string, any>) => boolean;
@@ -25,6 +25,7 @@ import RangeCalendarButton from "../components/rangeCalendarButton.svelte";
25
25
  import DataTable from "../components/dataTable/dataTable.svelte";
26
26
  import Drawer from "../components/drawer.svelte";
27
27
  import SelectRecord from "../components/selectRecord.svelte";
28
+ import FieldWrapper from "../components/detailView/fields/FieldWrapper.svelte";
28
29
  import { Switch } from "../components/ui/switch";
29
30
  export function getComponents() {
30
31
  return {
@@ -48,6 +49,7 @@ export function getComponents() {
48
49
  Drawer: Drawer,
49
50
  SelectRecord: SelectRecord,
50
51
  Switch: Switch,
52
+ FieldWrapper: FieldWrapper,
51
53
  };
52
54
  }
53
55
  export function getExtensionUtils(lobb, ctx) {
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@lobb-js/studio",
3
3
  "license": "UNLICENSED",
4
- "version": "0.48.0",
4
+ "version": "0.49.0",
5
5
  "type": "module",
6
6
  "publishConfig": {
7
7
  "access": "public"
@@ -37,16 +37,16 @@
37
37
  "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json",
38
38
  "storybook": "storybook dev -p 6006",
39
39
  "build-storybook": "storybook build",
40
- "test": "playwright test",
41
- "test:ui": "playwright test --ui",
40
+ "test": "vitest run tests",
41
+ "test:watch": "vitest tests",
42
42
  "test:unit": "vitest",
43
43
  "test-storybook": "vitest --project=storybook",
44
44
  "prepublishOnly": "./scripts/prepublish.sh",
45
45
  "postpublish": "./scripts/postpublish.sh"
46
46
  },
47
47
  "devDependencies": {
48
- "@lobb-js/core": "^0.40.0",
49
48
  "@chromatic-com/storybook": "^4.1.2",
49
+ "@lobb-js/core": "^0.41.0",
50
50
  "@playwright/test": "^1.60.0",
51
51
  "@storybook/addon-a11y": "^10.0.1",
52
52
  "@storybook/addon-docs": "^10.0.1",
@@ -74,7 +74,8 @@
74
74
  "tw-animate-css": "^1.4.0",
75
75
  "typescript": "~5.9.3",
76
76
  "vite": "^8.0.13",
77
- "vitest": "^4.0.5"
77
+ "vitest": "^4.0.5",
78
+ "vitest-browser-svelte": "^2.1.1"
78
79
  },
79
80
  "peerDependencies": {
80
81
  "svelte": "^5.0.0",
@@ -91,7 +92,7 @@
91
92
  "@codemirror/view": "^6.39.12",
92
93
  "@dagrejs/dagre": "^1.1.5",
93
94
  "@internationalized/date": "^3.12.0",
94
- "@lobb-js/sdk": "^0.4.0",
95
+ "@lobb-js/sdk": "^0.5.0",
95
96
  "@lucide/svelte": "^0.563.1",
96
97
  "@tailwindcss/vite": "^4.3.0",
97
98
  "@tiptap/core": "^3.0.0",