@lobb-js/studio 0.7.2 → 0.8.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 (164) hide show
  1. package/package.json +2 -1
  2. package/src/App.svelte +5 -0
  3. package/src/app.css +124 -0
  4. package/src/lib/components/LlmButton.svelte +137 -0
  5. package/src/lib/components/Studio.svelte +129 -0
  6. package/src/lib/components/alertView.svelte +20 -0
  7. package/src/lib/components/breadCrumbs.svelte +60 -0
  8. package/src/lib/components/codeEditor.svelte +152 -0
  9. package/src/lib/components/combobox.svelte +92 -0
  10. package/src/lib/components/confirmationDialog/confirmationDialog.svelte +33 -0
  11. package/src/lib/components/confirmationDialog/store.svelte.ts +28 -0
  12. package/src/lib/components/createManyButton.svelte +109 -0
  13. package/src/lib/components/dataTable/childRecords.svelte +142 -0
  14. package/src/lib/components/dataTable/dataTable.svelte +225 -0
  15. package/src/lib/components/dataTable/fieldCell.svelte +77 -0
  16. package/src/lib/components/dataTable/filter.svelte +284 -0
  17. package/src/lib/components/dataTable/filterButton.svelte +39 -0
  18. package/src/lib/components/dataTable/footer.svelte +84 -0
  19. package/src/lib/components/dataTable/header.svelte +155 -0
  20. package/src/lib/components/dataTable/sort.svelte +173 -0
  21. package/src/lib/components/dataTable/sortButton.svelte +36 -0
  22. package/src/lib/components/dataTable/table.svelte +337 -0
  23. package/src/lib/components/dataTable/utils.ts +127 -0
  24. package/src/lib/components/detailView/create/children.svelte +70 -0
  25. package/src/lib/components/detailView/create/createDetailView.svelte +228 -0
  26. package/src/lib/components/detailView/create/createDetailViewButton.svelte +37 -0
  27. package/src/lib/components/detailView/create/createManyView.svelte +252 -0
  28. package/src/lib/components/detailView/create/subRecords.svelte +50 -0
  29. package/src/lib/components/detailView/detailViewForm.svelte +104 -0
  30. package/src/lib/components/detailView/fieldCustomInput.svelte +26 -0
  31. package/src/lib/components/detailView/fieldInput.svelte +258 -0
  32. package/src/lib/components/detailView/fieldInputReplacement.svelte +199 -0
  33. package/src/lib/components/detailView/store.svelte.ts +59 -0
  34. package/src/lib/components/detailView/update/children.svelte +96 -0
  35. package/src/lib/components/detailView/update/updateDetailView.svelte +176 -0
  36. package/src/lib/components/detailView/update/updateDetailViewButton.svelte +56 -0
  37. package/src/lib/components/detailView/utils.ts +176 -0
  38. package/src/lib/components/diffViewer.svelte +105 -0
  39. package/src/lib/components/drawer.svelte +28 -0
  40. package/src/lib/components/extensionsComponents.svelte +33 -0
  41. package/src/lib/components/foreingKeyInput.svelte +80 -0
  42. package/src/lib/components/header.svelte +45 -0
  43. package/src/lib/components/loadingTypesForMonacoEditor.ts +36 -0
  44. package/src/lib/components/miniSidebar.svelte +226 -0
  45. package/src/lib/components/rangeCalendarButton.svelte +257 -0
  46. package/src/lib/components/richTextEditor.svelte +284 -0
  47. package/src/lib/components/routes/collections/collection.svelte +57 -0
  48. package/src/lib/components/routes/collections/collections.svelte +45 -0
  49. package/src/lib/components/routes/data_model/dataModel.svelte +40 -0
  50. package/src/lib/components/routes/data_model/flow.css +22 -0
  51. package/src/lib/components/routes/data_model/flow.svelte +84 -0
  52. package/src/lib/components/routes/data_model/syncManager.svelte +94 -0
  53. package/src/lib/components/routes/data_model/utils.ts +35 -0
  54. package/src/lib/components/routes/extensions/extension.svelte +19 -0
  55. package/src/lib/components/routes/home.svelte +40 -0
  56. package/src/lib/components/routes/workflows/workflows.svelte +136 -0
  57. package/src/lib/components/selectRecord.svelte +130 -0
  58. package/src/lib/components/setServerPage.svelte +50 -0
  59. package/src/lib/components/sidebar/index.ts +4 -0
  60. package/src/lib/components/sidebar/sidebar.svelte +149 -0
  61. package/src/lib/components/sidebar/sidebarElements.svelte +144 -0
  62. package/src/lib/components/sidebar/sidebarTrigger.svelte +33 -0
  63. package/src/lib/components/singletone.svelte +71 -0
  64. package/src/lib/components/ui/accordion/accordion-content.svelte +22 -0
  65. package/src/lib/components/ui/accordion/accordion-item.svelte +12 -0
  66. package/src/lib/components/ui/accordion/accordion-trigger.svelte +31 -0
  67. package/src/lib/components/ui/accordion/index.ts +17 -0
  68. package/src/lib/components/ui/alert/alert-description.svelte +16 -0
  69. package/src/lib/components/ui/alert/alert-title.svelte +24 -0
  70. package/src/lib/components/ui/alert/alert.svelte +39 -0
  71. package/src/lib/components/ui/alert/index.ts +14 -0
  72. package/src/lib/components/ui/alert-dialog/alert-dialog-action.svelte +13 -0
  73. package/src/lib/components/ui/alert-dialog/alert-dialog-cancel.svelte +17 -0
  74. package/src/lib/components/ui/alert-dialog/alert-dialog-content.svelte +26 -0
  75. package/src/lib/components/ui/alert-dialog/alert-dialog-description.svelte +16 -0
  76. package/src/lib/components/ui/alert-dialog/alert-dialog-footer.svelte +20 -0
  77. package/src/lib/components/ui/alert-dialog/alert-dialog-header.svelte +20 -0
  78. package/src/lib/components/ui/alert-dialog/alert-dialog-overlay.svelte +19 -0
  79. package/src/lib/components/ui/alert-dialog/alert-dialog-title.svelte +18 -0
  80. package/src/lib/components/ui/alert-dialog/index.ts +40 -0
  81. package/src/lib/components/ui/breadcrumb/breadcrumb-ellipsis.svelte +23 -0
  82. package/src/lib/components/ui/breadcrumb/breadcrumb-item.svelte +16 -0
  83. package/src/lib/components/ui/breadcrumb/breadcrumb-link.svelte +31 -0
  84. package/src/lib/components/ui/breadcrumb/breadcrumb-list.svelte +23 -0
  85. package/src/lib/components/ui/breadcrumb/breadcrumb-page.svelte +23 -0
  86. package/src/lib/components/ui/breadcrumb/breadcrumb-separator.svelte +27 -0
  87. package/src/lib/components/ui/breadcrumb/breadcrumb.svelte +15 -0
  88. package/src/lib/components/ui/breadcrumb/index.ts +25 -0
  89. package/src/lib/components/ui/button/button.svelte +110 -0
  90. package/src/lib/components/ui/button/index.ts +17 -0
  91. package/src/lib/components/ui/checkbox/checkbox.svelte +35 -0
  92. package/src/lib/components/ui/checkbox/index.ts +6 -0
  93. package/src/lib/components/ui/command/command-dialog.svelte +35 -0
  94. package/src/lib/components/ui/command/command-empty.svelte +12 -0
  95. package/src/lib/components/ui/command/command-group.svelte +31 -0
  96. package/src/lib/components/ui/command/command-input.svelte +25 -0
  97. package/src/lib/components/ui/command/command-item.svelte +19 -0
  98. package/src/lib/components/ui/command/command-link-item.svelte +19 -0
  99. package/src/lib/components/ui/command/command-list.svelte +16 -0
  100. package/src/lib/components/ui/command/command-separator.svelte +12 -0
  101. package/src/lib/components/ui/command/command-shortcut.svelte +20 -0
  102. package/src/lib/components/ui/command/command.svelte +21 -0
  103. package/src/lib/components/ui/command/index.ts +40 -0
  104. package/src/lib/components/ui/dialog/dialog-content.svelte +38 -0
  105. package/src/lib/components/ui/dialog/dialog-description.svelte +16 -0
  106. package/src/lib/components/ui/dialog/dialog-footer.svelte +20 -0
  107. package/src/lib/components/ui/dialog/dialog-header.svelte +20 -0
  108. package/src/lib/components/ui/dialog/dialog-overlay.svelte +19 -0
  109. package/src/lib/components/ui/dialog/dialog-title.svelte +16 -0
  110. package/src/lib/components/ui/dialog/index.ts +37 -0
  111. package/src/lib/components/ui/input/index.ts +7 -0
  112. package/src/lib/components/ui/input/input.svelte +46 -0
  113. package/src/lib/components/ui/label/index.ts +7 -0
  114. package/src/lib/components/ui/label/label.svelte +19 -0
  115. package/src/lib/components/ui/popover/index.ts +17 -0
  116. package/src/lib/components/ui/popover/popover-content.svelte +28 -0
  117. package/src/lib/components/ui/range-calendar/index.ts +30 -0
  118. package/src/lib/components/ui/range-calendar/range-calendar-cell.svelte +19 -0
  119. package/src/lib/components/ui/range-calendar/range-calendar-day.svelte +35 -0
  120. package/src/lib/components/ui/range-calendar/range-calendar-grid-body.svelte +12 -0
  121. package/src/lib/components/ui/range-calendar/range-calendar-grid-head.svelte +12 -0
  122. package/src/lib/components/ui/range-calendar/range-calendar-grid-row.svelte +12 -0
  123. package/src/lib/components/ui/range-calendar/range-calendar-grid.svelte +16 -0
  124. package/src/lib/components/ui/range-calendar/range-calendar-head-cell.svelte +16 -0
  125. package/src/lib/components/ui/range-calendar/range-calendar-header.svelte +16 -0
  126. package/src/lib/components/ui/range-calendar/range-calendar-heading.svelte +16 -0
  127. package/src/lib/components/ui/range-calendar/range-calendar-months.svelte +20 -0
  128. package/src/lib/components/ui/range-calendar/range-calendar-next-button.svelte +27 -0
  129. package/src/lib/components/ui/range-calendar/range-calendar-prev-button.svelte +27 -0
  130. package/src/lib/components/ui/range-calendar/range-calendar.svelte +57 -0
  131. package/src/lib/components/ui/select/index.ts +34 -0
  132. package/src/lib/components/ui/select/select-content.svelte +38 -0
  133. package/src/lib/components/ui/select/select-group-heading.svelte +16 -0
  134. package/src/lib/components/ui/select/select-item.svelte +37 -0
  135. package/src/lib/components/ui/select/select-scroll-down-button.svelte +19 -0
  136. package/src/lib/components/ui/select/select-scroll-up-button.svelte +19 -0
  137. package/src/lib/components/ui/select/select-separator.svelte +13 -0
  138. package/src/lib/components/ui/select/select-trigger.svelte +24 -0
  139. package/src/lib/components/ui/separator/index.ts +7 -0
  140. package/src/lib/components/ui/separator/separator.svelte +22 -0
  141. package/src/lib/components/ui/skeleton/index.ts +7 -0
  142. package/src/lib/components/ui/skeleton/skeleton.svelte +22 -0
  143. package/src/lib/components/ui/sonner/index.ts +1 -0
  144. package/src/lib/components/ui/sonner/sonner.svelte +20 -0
  145. package/src/lib/components/ui/switch/index.ts +7 -0
  146. package/src/lib/components/ui/switch/switch.svelte +27 -0
  147. package/src/lib/components/ui/textarea/index.ts +7 -0
  148. package/src/lib/components/ui/textarea/textarea.svelte +22 -0
  149. package/src/lib/components/ui/tooltip/index.ts +18 -0
  150. package/src/lib/components/ui/tooltip/tooltip-content.svelte +21 -0
  151. package/src/lib/components/workflowEditor.svelte +188 -0
  152. package/src/lib/context.ts +22 -0
  153. package/src/lib/eventSystem.ts +40 -0
  154. package/src/lib/extensions/extension.types.ts +92 -0
  155. package/src/lib/extensions/extensionUtils.ts +156 -0
  156. package/src/lib/index.ts +24 -0
  157. package/src/lib/store.svelte.ts +13 -0
  158. package/src/lib/store.types.ts +28 -0
  159. package/src/lib/utils.ts +68 -0
  160. package/src/main.ts +18 -0
  161. package/src/stories/detailView/detailViewForm.stories.svelte +79 -0
  162. package/src/vite-env.d.ts +2 -0
  163. package/vite-plugins/index.js +2 -0
  164. package/vite-plugins/lobb-proxy.js +36 -0
@@ -0,0 +1,13 @@
1
+ import { LobbClient } from '@lobb-js/sdk';
2
+ import { toast } from 'svelte-sonner';
3
+
4
+ export function createLobb(url: string) {
5
+ const client = new LobbClient(url);
6
+ client.onResponse(async (response) => {
7
+ if (response.status >= 400) {
8
+ const body = await response.json();
9
+ toast.error(body.message);
10
+ }
11
+ });
12
+ return client;
13
+ }
@@ -0,0 +1,28 @@
1
+ import type { Extension } from "../extensions/extension.types";
2
+
3
+ interface Collection {
4
+ category: string;
5
+ owner: string;
6
+ fields: Record<string, any>;
7
+ singleton: boolean;
8
+ }
9
+ type Collections = Record<string, Collection>;
10
+
11
+ interface Meta {
12
+ version: string;
13
+ relations: Array<any>;
14
+ collections: Collections;
15
+ extensions: Record<string, any>;
16
+ filter: any;
17
+ events: any[];
18
+ event_context_type: string;
19
+ studio_workflows: any[];
20
+ }
21
+
22
+ export interface CTX {
23
+ studioVersion?: string;
24
+ lobbUrl: string | null;
25
+ extensions: Record<string, Extension>;
26
+ meta: Meta;
27
+ currentUrl: URL;
28
+ }
@@ -0,0 +1,68 @@
1
+ import { clsx, type ClassValue } from "clsx";
2
+ import { twMerge } from "tailwind-merge";
3
+
4
+ import { MediaQuery } from 'svelte/reactivity';
5
+ import type { CTX } from "./store.types";
6
+
7
+ export function cn(...inputs: ClassValue[]) {
8
+ return twMerge(clsx(inputs));
9
+ }
10
+
11
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
12
+ export type WithoutChild<T> = T extends { child?: any } ? Omit<T, "child"> : T;
13
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
14
+ export type WithoutChildren<T> = T extends { children?: any } ? Omit<T, "children"> : T;
15
+ export type WithoutChildrenOrChild<T> = WithoutChildren<WithoutChild<T>>;
16
+ export type WithElementRef<T, U extends HTMLElement = HTMLElement> = T & { ref?: U | null };
17
+
18
+
19
+ export const mediaQueries = {
20
+ sm: new MediaQuery('min-width: 640px'),
21
+ md: new MediaQuery('min-width: 768px'),
22
+ lg: new MediaQuery('min-width: 1024px'),
23
+ xl: new MediaQuery('min-width: 1280px'),
24
+ '2xl': new MediaQuery('min-width: 1536px'),
25
+ }
26
+
27
+ export function getFieldRelation(ctx: CTX, collectionName: string, fieldName: string) {
28
+ const relations = ctx.meta.relations;
29
+ for (let index = 0; index < relations.length; index++) {
30
+ const relation = relations[index];
31
+ if (relation.from.collection === collectionName && relation.from.field === fieldName) {
32
+ return relation;
33
+ }
34
+ }
35
+ return null;
36
+ };
37
+
38
+ export function recordHasChildrean(ctx: CTX, collectionName: string) {
39
+ for (let index = 0; index < ctx.meta.relations.length; index++) {
40
+ const relation = ctx.meta.relations[index];
41
+ if (relation.to.collection === collectionName) {
42
+ return true;
43
+ }
44
+ }
45
+ return false;
46
+ };
47
+
48
+ export function calculateDrawerWidth() {
49
+ const backgroundDrawerButtons = document.querySelectorAll(".backgroundDrawerButton");
50
+ const drawersCount = Array.from(backgroundDrawerButtons).length;
51
+ const width = 672 - (30 * drawersCount);
52
+ return width;
53
+ };
54
+
55
+ export function getChangedProperties(oldObj: Record<string, any>, newObj: Record<string, any>) {
56
+ const changes: Record<string, any> = {};
57
+ for (const key of Object.keys(newObj)) {
58
+ if (oldObj[key] !== newObj[key]) {
59
+ changes[key] = newObj[key];
60
+ }
61
+ }
62
+ return changes;
63
+ }
64
+
65
+ export function parseFunction(functionString: string) {
66
+ const functionObj = new Function("return " + functionString)();
67
+ return functionObj;
68
+ };
package/src/main.ts ADDED
@@ -0,0 +1,18 @@
1
+ import "./app.css";
2
+
3
+ import { mount } from 'svelte'
4
+ import App from './App.svelte'
5
+
6
+ declare global {
7
+ interface Window {
8
+ APP_ENV: {
9
+ LOBB_URL: string
10
+ }
11
+ }
12
+ }
13
+
14
+ const app = mount(App, {
15
+ target: document.getElementById('app')!,
16
+ })
17
+
18
+ export default app
@@ -0,0 +1,79 @@
1
+ <script lang="ts" module>
2
+ import "../../app.css";
3
+
4
+ import DetailViewForm from '$lib/components/detailView/detailViewForm.svelte';
5
+ import { defineMeta } from '@storybook/addon-svelte-csf';
6
+ import { Calendar, Edit, Key } from "lucide-svelte";
7
+
8
+ const { Story } = defineMeta({
9
+ title: 'lobb/detailViewForm',
10
+ component: DetailViewForm,
11
+ args: {
12
+ value: {
13
+ name: "Malik",
14
+ age: 26,
15
+ bio: "This is a sample biography",
16
+ gender: "male",
17
+ birthDate: "1997-01-01",
18
+ appointmentTime: "14:30",
19
+ appointmentDateTime: "2025-10-31T15:00",
20
+ newsletter: true,
21
+ },
22
+ fields: [
23
+ {
24
+ key: "name",
25
+ label: "Name",
26
+ type: "input",
27
+ placeholder: "Enter your name",
28
+ icon: Key,
29
+ errorMessages: ["Name is required"],
30
+ },
31
+ {
32
+ key: "age",
33
+ label: "Age",
34
+ type: "input",
35
+ inputType: "number",
36
+ inputStep: 1,
37
+ icon: Edit,
38
+ },
39
+ {
40
+ key: "bio",
41
+ label: "Biography",
42
+ type: "textarea",
43
+ placeholder: "Tell us about yourself",
44
+ },
45
+ {
46
+ key: "gender",
47
+ label: "Gender",
48
+ type: "select",
49
+ options: ["male", "female", "other"],
50
+ placeholder: "Select gender",
51
+ },
52
+ {
53
+ key: "birthDate",
54
+ label: "Birth Date",
55
+ type: "date",
56
+ icon: Calendar,
57
+ },
58
+ {
59
+ key: "appointmentTime",
60
+ label: "Appointment Time",
61
+ type: "time",
62
+ },
63
+ {
64
+ key: "appointmentDateTime",
65
+ label: "Appointment Date & Time",
66
+ type: "datetime",
67
+ },
68
+ {
69
+ key: "newsletter",
70
+ label: "Subscribe to newsletter",
71
+ type: "switch",
72
+ },
73
+ ]
74
+ }
75
+ });
76
+ </script>
77
+
78
+ <!-- More on writing stories with args: https://storybook.js.org/docs/writing-stories/args -->
79
+ <Story name="Primary" />
@@ -0,0 +1,2 @@
1
+ /// <reference types="svelte" />
2
+ /// <reference types="vite/client" />
@@ -1,11 +1,13 @@
1
1
  import { contextualLibAlias } from "./contextual-lib-alias.js";
2
2
  import { lobbWorkspaceOptimize } from "./monorepo-workspace.js";
3
3
  import { lobbExtensionsPlugin } from "./lobb-extensions.js";
4
+ import { lobbProxyPlugin } from "./lobb-proxy.js";
4
5
 
5
6
  export function lobbStudioPlugins() {
6
7
  return [
7
8
  contextualLibAlias(),
8
9
  lobbWorkspaceOptimize(),
9
10
  lobbExtensionsPlugin(),
11
+ lobbProxyPlugin(),
10
12
  ];
11
13
  }
@@ -0,0 +1,36 @@
1
+ import { createLogger } from "vite";
2
+
3
+ export function lobbProxyPlugin() {
4
+ return {
5
+ name: "lobb-proxy",
6
+ apply: "serve",
7
+ config() {
8
+ const port = parseInt(process.env.LOBB_PORT ?? "3000", 10);
9
+ const config = {
10
+ server: {
11
+ printUrls: false,
12
+ proxy: {
13
+ "/api": {
14
+ target: `http://localhost:${port}`,
15
+ changeOrigin: true,
16
+ ws: true,
17
+ },
18
+ },
19
+ },
20
+ };
21
+ if (process.env.LOBB_PORT) {
22
+ // Suppress Vite's startup banner — Lobb prints its own URL instead.
23
+ // ANSI codes are stripped before matching so color doesn't interfere.
24
+ const logger = createLogger();
25
+ const originalInfo = logger.info.bind(logger);
26
+ logger.info = (msg, options) => {
27
+ const plain = msg.replace(/\x1b\[[0-9;]*m/g, "");
28
+ if (plain.includes("ready in") || plain.trim().startsWith("➜")) return;
29
+ originalInfo(msg, options);
30
+ };
31
+ config.customLogger = logger;
32
+ }
33
+ return config;
34
+ },
35
+ };
36
+ }