@liqvid/studio 1.0.0-alpha.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 (129) hide show
  1. package/LICENSE +9 -0
  2. package/dist/esm/LiqvidDevToolsProvider.js +49 -0
  3. package/dist/esm/api/contract.mjs +48 -0
  4. package/dist/esm/api/project-meta.mjs +33 -0
  5. package/dist/esm/api/recording.mjs +156 -0
  6. package/dist/esm/api/root.mjs +4 -0
  7. package/dist/esm/api/static-file.mjs +82 -0
  8. package/dist/esm/api/types.mjs +1 -0
  9. package/dist/esm/client.mjs +98 -0
  10. package/dist/esm/conventions.mjs +3 -0
  11. package/dist/esm/index.mjs +20 -0
  12. package/dist/esm/initialize.mjs +50 -0
  13. package/dist/esm/jobs/watch-assets.mjs +99 -0
  14. package/dist/esm/jobs/watch-project-files.mjs +216 -0
  15. package/dist/esm/next/api.mjs +48 -0
  16. package/dist/esm/next/page.js +15 -0
  17. package/dist/esm/pages/NewProjectButton.js +62 -0
  18. package/dist/esm/pages/RebuildButton.js +24 -0
  19. package/dist/esm/pages/root-actions.js +151 -0
  20. package/dist/esm/pages/root.js +25 -0
  21. package/dist/esm/pages/root.module.css +326 -0
  22. package/dist/esm/palette.css +279 -0
  23. package/dist/esm/providers/hosting/github-pages.mjs +10 -0
  24. package/dist/esm/providers/hosting/liqvid-studio.mjs +8 -0
  25. package/dist/esm/providers/hosting/s3.mjs +9 -0
  26. package/dist/esm/providers/hosting/sftp.mjs +22 -0
  27. package/dist/esm/providers/index.mjs +10 -0
  28. package/dist/esm/providers/social/bluesky.mjs +8 -0
  29. package/dist/esm/providers/social/facebook.mjs +8 -0
  30. package/dist/esm/providers/social/instagram.mjs +8 -0
  31. package/dist/esm/providers/social/twitter.mjs +7 -0
  32. package/dist/esm/providers/social/youtube.mjs +7 -0
  33. package/dist/esm/providers/types.mjs +1 -0
  34. package/dist/esm/publish.mjs +37 -0
  35. package/dist/esm/recording/RecordingControl.js +110 -0
  36. package/dist/esm/recording/RecordingControl.module.css +0 -0
  37. package/dist/esm/recording/RecordingDialog.js +114 -0
  38. package/dist/esm/recording/RecordingDialog.module.css +194 -0
  39. package/dist/esm/schemas/liqvid-config.mjs +32 -0
  40. package/dist/esm/schemas/project.mjs +27 -0
  41. package/dist/esm/schemas/recording-meta.mjs +11 -0
  42. package/dist/esm/types/assets.mjs +1 -0
  43. package/dist/esm/types.mjs +12 -0
  44. package/dist/esm/ui/Dialog.js +71 -0
  45. package/dist/esm/ui/DockableDialog.js +131 -0
  46. package/dist/esm/ui/DockableDialog.module.css +63 -0
  47. package/dist/esm/ui/RadioTabs.js +13 -0
  48. package/dist/esm/ui/RadioTabs.module.css +54 -0
  49. package/dist/esm/ui/Tabs.js +29 -0
  50. package/dist/esm/ui/Tabs.module.css +31 -0
  51. package/dist/esm/ui/Toast.js +64 -0
  52. package/dist/esm/ui/Toast.module.css +50 -0
  53. package/dist/esm/ui/Toaster.js +13 -0
  54. package/dist/esm/ui/Toaster.module.css +9 -0
  55. package/dist/esm/ui/test.js +14 -0
  56. package/dist/esm/utils/dom.mjs +6 -0
  57. package/dist/esm/utils/fs.mjs +94 -0
  58. package/dist/esm/utils/misc.mjs +15 -0
  59. package/dist/esm/utils/react.mjs +8 -0
  60. package/dist/esm/utils/rsync.mjs +57 -0
  61. package/dist/templates/project.json.hbs +5 -0
  62. package/dist/templates/projects/code/page.tsx.hbs +23 -0
  63. package/dist/templates/projects/code/src/assets.ts.hbs +9 -0
  64. package/dist/templates/projects/code/src/client.tsx.hbs +22 -0
  65. package/dist/templates/projects/code/src/helpers.ts.hbs +21 -0
  66. package/dist/templates/projects/code/src/highlights.ts.hbs +3 -0
  67. package/dist/templates/projects/code/src/markers.ts.hbs +13 -0
  68. package/dist/templates/projects/code/src/project.ts.hbs +23 -0
  69. package/dist/templates/projects/code/template.json +3 -0
  70. package/dist/templates/projects/default/page.tsx.hbs +23 -0
  71. package/dist/templates/projects/default/src/assets.ts.hbs +9 -0
  72. package/dist/templates/projects/default/src/client.tsx.hbs +22 -0
  73. package/dist/templates/projects/default/src/helpers.ts.hbs +21 -0
  74. package/dist/templates/projects/default/src/highlights.ts.hbs +3 -0
  75. package/dist/templates/projects/default/src/markers.ts.hbs +13 -0
  76. package/dist/templates/projects/default/src/project.ts.hbs +23 -0
  77. package/dist/templates/projects/default/template.json +4 -0
  78. package/dist/templates/types.ts.hbs +20 -0
  79. package/dist/types/LiqvidDevToolsProvider.d.ts +12 -0
  80. package/dist/types/api/contract.d.mts +66 -0
  81. package/dist/types/api/project-meta.d.mts +1 -0
  82. package/dist/types/api/recording.d.mts +5 -0
  83. package/dist/types/api/root.d.mts +1 -0
  84. package/dist/types/api/static-file.d.mts +6 -0
  85. package/dist/types/api/types.d.mts +1 -0
  86. package/dist/types/client.d.mts +43 -0
  87. package/dist/types/conventions.d.mts +3 -0
  88. package/dist/types/index.d.mts +19 -0
  89. package/dist/types/initialize.d.mts +14 -0
  90. package/dist/types/jobs/watch-assets.d.mts +18 -0
  91. package/dist/types/jobs/watch-project-files.d.mts +4 -0
  92. package/dist/types/next/api.d.mts +14 -0
  93. package/dist/types/next/page.d.ts +4 -0
  94. package/dist/types/pages/NewProjectButton.d.ts +1 -0
  95. package/dist/types/pages/RebuildButton.d.ts +1 -0
  96. package/dist/types/pages/root-actions.d.ts +29 -0
  97. package/dist/types/pages/root.d.ts +1 -0
  98. package/dist/types/providers/hosting/github-pages.d.mts +11 -0
  99. package/dist/types/providers/hosting/liqvid-studio.d.mts +10 -0
  100. package/dist/types/providers/hosting/s3.d.mts +11 -0
  101. package/dist/types/providers/hosting/sftp.d.mts +13 -0
  102. package/dist/types/providers/index.d.mts +10 -0
  103. package/dist/types/providers/social/bluesky.d.mts +10 -0
  104. package/dist/types/providers/social/facebook.d.mts +10 -0
  105. package/dist/types/providers/social/instagram.d.mts +10 -0
  106. package/dist/types/providers/social/twitter.d.mts +9 -0
  107. package/dist/types/providers/social/youtube.d.mts +9 -0
  108. package/dist/types/providers/types.d.mts +9 -0
  109. package/dist/types/publish.d.mts +1 -0
  110. package/dist/types/recording/RecordingControl.d.ts +16 -0
  111. package/dist/types/recording/RecordingDialog.d.ts +10 -0
  112. package/dist/types/schemas/liqvid-config.d.mts +51 -0
  113. package/dist/types/schemas/project.d.mts +51 -0
  114. package/dist/types/schemas/recording-meta.d.mts +17 -0
  115. package/dist/types/types/assets.d.mts +3 -0
  116. package/dist/types/types.d.mts +20 -0
  117. package/dist/types/ui/Dialog.d.ts +31 -0
  118. package/dist/types/ui/DockableDialog.d.ts +25 -0
  119. package/dist/types/ui/RadioTabs.d.ts +18 -0
  120. package/dist/types/ui/Tabs.d.ts +9 -0
  121. package/dist/types/ui/Toast.d.ts +23 -0
  122. package/dist/types/ui/Toaster.d.ts +6 -0
  123. package/dist/types/ui/test.d.ts +9 -0
  124. package/dist/types/utils/dom.d.mts +3 -0
  125. package/dist/types/utils/fs.d.mts +32 -0
  126. package/dist/types/utils/misc.d.mts +4 -0
  127. package/dist/types/utils/react.d.mts +5 -0
  128. package/dist/types/utils/rsync.d.mts +10 -0
  129. package/package.json +94 -0
@@ -0,0 +1,10 @@
1
+ import { z } from "zod";
2
+ import type { SocialProvider } from "../types.mts";
3
+ export declare const ProviderConfigInstagram: z.ZodObject<{
4
+ username: z.ZodString;
5
+ }, z.core.$strip>;
6
+ export type ProviderConfigInstagram = z.infer<typeof ProviderConfigInstagram>;
7
+ export declare class InstagramProvider implements SocialProvider {
8
+ constructor(_options: ProviderConfigInstagram);
9
+ publish(): Promise<void>;
10
+ }
@@ -0,0 +1,9 @@
1
+ import { z } from "zod";
2
+ import type { SocialProvider } from "../types.mts";
3
+ export declare const ProviderConfigTwitter: z.ZodObject<{
4
+ username: z.ZodString;
5
+ }, z.core.$strip>;
6
+ export type ProviderConfigTwitter = z.infer<typeof ProviderConfigTwitter>;
7
+ export declare class TwitterProvider implements SocialProvider {
8
+ publish(): Promise<void>;
9
+ }
@@ -0,0 +1,9 @@
1
+ import { z } from "zod";
2
+ import type { SocialProvider } from "../types.mts";
3
+ export declare const ProviderConfigYouTube: z.ZodObject<{
4
+ username: z.ZodString;
5
+ }, z.core.$strip>;
6
+ export type ProviderConfigYouTube = z.infer<typeof ProviderConfigYouTube>;
7
+ export declare class YouTubeProvider implements SocialProvider {
8
+ publish(): Promise<void>;
9
+ }
@@ -0,0 +1,9 @@
1
+ export interface HostingProvider {
2
+ publishContent(localDir: string): Promise<void>;
3
+ }
4
+ export interface MediaHostingProvider extends HostingProvider {
5
+ publishMedia(localDir: string): Promise<void>;
6
+ }
7
+ export interface SocialProvider {
8
+ publish(): Promise<void>;
9
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,16 @@
1
+ export interface RecordingControlProps {
2
+ shortcuts?: {
3
+ /** Shortcut to toggle the Recording panel */
4
+ toggle?: string;
5
+ /** Shortcut to discard recording */
6
+ discard?: string;
7
+ /** Shortcut to pause recording */
8
+ pause?: string;
9
+ /** Shortcut to start/stop recording */
10
+ startStop?: string;
11
+ };
12
+ }
13
+ /**
14
+ * Liqvid recording control.
15
+ */
16
+ export declare function RecordingControl({ shortcuts }: RecordingControlProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,10 @@
1
+ import type { RecordingMeta } from "../schemas/recording-meta.mts";
2
+ import type { RecordingControlProps } from "./RecordingControl";
3
+ export interface RecordingDialogProps {
4
+ shortcuts?: RecordingControlProps["shortcuts"];
5
+ onShortcutChange?: (key: keyof NonNullable<RecordingControlProps["shortcuts"]>, value: string) => void;
6
+ }
7
+ export declare function RecordingDialog({ shortcuts, onShortcutChange, }: RecordingDialogProps): import("react/jsx-runtime").JSX.Element;
8
+ export declare function RecordingRow({ recording: r }: {
9
+ recording: RecordingMeta;
10
+ }): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,51 @@
1
+ import { z } from "zod";
2
+ export declare const LiqvidConfig: z.ZodObject<{
3
+ $schema: z.ZodString;
4
+ backend: z.ZodObject<{
5
+ content: z.ZodEnum<{
6
+ githubPages: "githubPages";
7
+ liqvidStudio: "liqvidStudio";
8
+ s3: "s3";
9
+ sftp: "sftp";
10
+ }>;
11
+ media: z.ZodEnum<{
12
+ liqvidStudio: "liqvidStudio";
13
+ s3: "s3";
14
+ sftp: "sftp";
15
+ }>;
16
+ }, z.core.$strip>;
17
+ providers: z.ZodObject<{
18
+ bluesky: z.ZodOptional<z.ZodObject<{
19
+ username: z.ZodString;
20
+ }, z.core.$strip>>;
21
+ facebook: z.ZodOptional<z.ZodObject<{
22
+ username: z.ZodString;
23
+ }, z.core.$strip>>;
24
+ instagram: z.ZodOptional<z.ZodObject<{
25
+ username: z.ZodString;
26
+ }, z.core.$strip>>;
27
+ twitter: z.ZodOptional<z.ZodObject<{
28
+ username: z.ZodString;
29
+ }, z.core.$strip>>;
30
+ youtube: z.ZodOptional<z.ZodObject<{
31
+ username: z.ZodString;
32
+ }, z.core.$strip>>;
33
+ githubPages: z.ZodOptional<z.ZodObject<{
34
+ repository: z.ZodString;
35
+ root: z.ZodOptional<z.ZodBoolean>;
36
+ username: z.ZodString;
37
+ }, z.core.$strip>>;
38
+ liqvidStudio: z.ZodOptional<z.ZodObject<{
39
+ username: z.ZodString;
40
+ }, z.core.$strip>>;
41
+ s3: z.ZodOptional<z.ZodObject<{
42
+ bucket: z.ZodString;
43
+ prefix: z.ZodOptional<z.ZodString>;
44
+ }, z.core.$strip>>;
45
+ sftp: z.ZodOptional<z.ZodObject<{
46
+ host: z.ZodString;
47
+ path: z.ZodString;
48
+ }, z.core.$strip>>;
49
+ }, z.core.$strip>;
50
+ }, z.core.$strip>;
51
+ export type LiqvidConfig = z.infer<typeof LiqvidConfig>;
@@ -0,0 +1,51 @@
1
+ import type { Duration } from "@liqvid/duration";
2
+ import { z } from "zod";
3
+ export declare const AspectRatio: z.ZodObject<{
4
+ height: z.ZodNumber;
5
+ width: z.ZodNumber;
6
+ }, z.core.$strip>;
7
+ export type AspectRatio = z.infer<typeof AspectRatio>;
8
+ export declare const AspectRatioSpecifier: z.ZodUnion<readonly [z.ZodTemplateLiteral<`${number}:${number}`>, z.ZodTuple<[z.ZodNumber, z.ZodNumber], null>, z.ZodObject<{
9
+ height: z.ZodNumber;
10
+ width: z.ZodNumber;
11
+ }, z.core.$strip>]>;
12
+ export type AspectRatioSpecifier = z.infer<typeof AspectRatioSpecifier>;
13
+ /**
14
+ * project.json files
15
+ */
16
+ export declare const ProjectJson: z.ZodObject<{
17
+ aspectRatio: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodTemplateLiteral<`${number}:${number}`>, z.ZodTuple<[z.ZodNumber, z.ZodNumber], null>, z.ZodObject<{
18
+ height: z.ZodNumber;
19
+ width: z.ZodNumber;
20
+ }, z.core.$strip>]>>>;
21
+ name: z.ZodString;
22
+ }, z.core.$strip>;
23
+ export type ProjectJson = z.infer<typeof ProjectJson>;
24
+ /**
25
+ * auto-generated project-meta.json files
26
+ */
27
+ export declare const AutoGenProjectMeta: z.ZodObject<{
28
+ duration: z.ZodObject<{
29
+ d: z.ZodOptional<z.ZodNumber>;
30
+ days: z.ZodOptional<z.ZodNumber>;
31
+ h: z.ZodOptional<z.ZodNumber>;
32
+ hours: z.ZodOptional<z.ZodNumber>;
33
+ ms: z.ZodOptional<z.ZodNumber>;
34
+ milliseconds: z.ZodOptional<z.ZodNumber>;
35
+ m: z.ZodOptional<z.ZodNumber>;
36
+ minutes: z.ZodOptional<z.ZodNumber>;
37
+ s: z.ZodOptional<z.ZodNumber>;
38
+ seconds: z.ZodOptional<z.ZodNumber>;
39
+ w: z.ZodOptional<z.ZodNumber>;
40
+ weeks: z.ZodOptional<z.ZodNumber>;
41
+ }, z.core.$strip>;
42
+ }, z.core.$strip>;
43
+ export type AutoGenProjectMeta = z.infer<typeof AutoGenProjectMeta>;
44
+ export interface ProjectMeta {
45
+ aspectRatio: AspectRatio;
46
+ duration: Duration;
47
+ name: string;
48
+ openGraph: boolean;
49
+ path: string;
50
+ twitter: boolean;
51
+ }
@@ -0,0 +1,17 @@
1
+ import { z } from "zod";
2
+ export declare const RecordingMetaFile: z.ZodObject<{
3
+ created: z.ZodISODateTime;
4
+ duration: z.ZodObject<{
5
+ milliseconds: z.ZodNumber;
6
+ }, z.core.$strip>;
7
+ }, z.core.$strip>;
8
+ export type RecordingMetaFile = z.infer<typeof RecordingMetaFile>;
9
+ export declare const RecordingMeta: z.ZodObject<{
10
+ created: z.ZodISODateTime;
11
+ duration: z.ZodObject<{
12
+ milliseconds: z.ZodNumber;
13
+ }, z.core.$strip>;
14
+ name: z.ZodString;
15
+ plugins: z.ZodArray<z.ZodString>;
16
+ }, z.core.$strip>;
17
+ export type RecordingMeta = z.infer<typeof RecordingMeta>;
@@ -0,0 +1,3 @@
1
+ export interface Directory {
2
+ [key: string]: Directory | null;
3
+ }
@@ -0,0 +1,20 @@
1
+ import type { Directory } from "./types/assets.mts";
2
+ export interface ProjectFile {
3
+ filename: string;
4
+ mime: string;
5
+ version?: string;
6
+ }
7
+ export type FileNames<D extends Directory> = {
8
+ [key in string & keyof D]: D[key] extends Directory ? `${key}/` | `${key}/${FileNames<D[key]>}` : key;
9
+ }[string & keyof D];
10
+ type Files<T extends string> = T extends `${string}/` ? never : T;
11
+ type Dirs<T extends string> = T extends `${infer Head}/${infer Tail}` ? Head | `${Head}/${Dirs<Tail>}` : never;
12
+ type StripPrefix<T extends string, S extends string> = T extends `${S}${infer Tail}` ? Tail : never;
13
+ export declare class DirectoryHelper<DS extends string> {
14
+ private dirname;
15
+ constructor(dirname?: string);
16
+ dir<D extends Dirs<DS>>(dirname: D): DirectoryHelper<Exclude<StripPrefix<DS, `${D}/`>, "">>;
17
+ file(filename: Files<DS>, version?: string): string;
18
+ }
19
+ export type Awaitable<T> = T | Promise<T>;
20
+ export {};
@@ -0,0 +1,31 @@
1
+ import { Dialog } from "@base-ui/react/dialog";
2
+ import type { ReactNode } from "react";
3
+ interface DialogApi {
4
+ /** Close the dialog. */
5
+ close: () => unknown;
6
+ /** Whether we are actually contained in a dialog. */
7
+ isDialog: boolean;
8
+ /** Whether the dialog is currently open */
9
+ isOpen: boolean;
10
+ }
11
+ export declare function useDialogApi(): DialogApi;
12
+ interface DialogRootProps {
13
+ children?: ReactNode;
14
+ defaultOpen?: boolean;
15
+ onOpenChange?: (open: boolean) => void;
16
+ open?: boolean;
17
+ }
18
+ export declare function DialogRoot({ children, defaultOpen, onOpenChange, open: controlledOpen, }: DialogRootProps): import("react/jsx-runtime").JSX.Element;
19
+ interface DialogCloseProps extends Omit<React.ComponentProps<typeof Dialog.Close>, "render"> {
20
+ asChild?: boolean;
21
+ }
22
+ export declare function DialogClose({ asChild, children, className, ...props }: DialogCloseProps): import("react/jsx-runtime").JSX.Element;
23
+ export declare function DialogContent({ className, ...props }: React.ComponentProps<typeof Dialog.Popup>): import("react/jsx-runtime").JSX.Element;
24
+ export declare function DialogPortal(props: React.ComponentProps<typeof Dialog.Portal>): import("react/jsx-runtime").JSX.Element;
25
+ export declare function DialogOverlay({ className, ...props }: React.ComponentProps<typeof Dialog.Backdrop>): import("react/jsx-runtime").JSX.Element;
26
+ export declare function DialogTitle({ className, ...props }: React.ComponentProps<typeof Dialog.Title>): import("react/jsx-runtime").JSX.Element;
27
+ interface DialogTriggerProps extends Omit<React.ComponentProps<typeof Dialog.Trigger>, "render"> {
28
+ asChild?: boolean;
29
+ }
30
+ export declare function DialogTrigger({ asChild, children, className, ...props }: DialogTriggerProps): import("react/jsx-runtime").JSX.Element;
31
+ export {};
@@ -0,0 +1,25 @@
1
+ declare function Root({ children, name, shortcut, }: {
2
+ children?: React.ReactNode;
3
+ name?: string;
4
+ shortcut?: string;
5
+ }): import("react/jsx-runtime").JSX.Element;
6
+ declare function Trigger({ asChild, children, }: {
7
+ asChild?: boolean;
8
+ children?: React.ReactNode;
9
+ }): import("react/jsx-runtime").JSX.Element;
10
+ declare function Content({ asChild, className, ...props }: {
11
+ asChild?: boolean;
12
+ } & React.HTMLAttributes<HTMLElement>): import("react/jsx-runtime").JSX.Element;
13
+ declare function Header({ asChild, className, ...props }: {
14
+ asChild?: boolean;
15
+ } & React.HTMLAttributes<HTMLElement>): import("react/jsx-runtime").JSX.Element;
16
+ declare function Dialog({ className, ...props }: React.HTMLAttributes<HTMLElement>): import("react/jsx-runtime").JSX.Element;
17
+ export declare const DockableDialog: {
18
+ Content: typeof Content;
19
+ Dialog: typeof Dialog;
20
+ Header: typeof Header;
21
+ Portal: import("react").ForwardRefExoticComponent<import("@radix-ui/react-portal").PortalProps & import("react").RefAttributes<HTMLDivElement>>;
22
+ Root: typeof Root;
23
+ Trigger: typeof Trigger;
24
+ };
25
+ export {};
@@ -0,0 +1,18 @@
1
+ import { Radio } from "@base-ui/react/radio";
2
+ import type { Icon } from "@phosphor-icons/react";
3
+ import type { ReactNode } from "react";
4
+ interface RadioTabsProps<T extends string> {
5
+ children?: ReactNode;
6
+ className?: string;
7
+ onValueChange: (value: T) => void;
8
+ value: T;
9
+ }
10
+ declare function RadioTabs<T extends string>({ className, value, onValueChange, ...props }: RadioTabsProps<T>): import("react/jsx-runtime").JSX.Element;
11
+ interface RadioTabsItemProps extends React.ComponentProps<typeof Radio.Root> {
12
+ /** Phosphor icon component to display in the tab */
13
+ icon: Icon;
14
+ /** Icon size (default: 18) */
15
+ iconSize?: number;
16
+ }
17
+ declare function RadioTabsItem({ className, icon: IconComponent, iconSize, title, value, ...props }: RadioTabsItemProps): import("react/jsx-runtime").JSX.Element;
18
+ export { RadioTabs, RadioTabsItem };
@@ -0,0 +1,9 @@
1
+ import { Tabs as TabsPrimitive } from "@base-ui/react/tabs";
2
+ declare function Tabs({ className, ...props }: React.ComponentProps<typeof TabsPrimitive.Root>): import("react/jsx-runtime").JSX.Element;
3
+ declare function TabsList({ className, ...props }: React.ComponentProps<typeof TabsPrimitive.List>): import("react/jsx-runtime").JSX.Element;
4
+ declare function TabsTrigger({ className, ...props }: React.ComponentProps<typeof TabsPrimitive.Tab>): import("react/jsx-runtime").JSX.Element;
5
+ interface TabsContentProps extends Omit<React.ComponentProps<typeof TabsPrimitive.Panel>, "render"> {
6
+ asChild?: boolean;
7
+ }
8
+ declare function TabsContent({ asChild, children, className, ...props }: TabsContentProps): import("react/jsx-runtime").JSX.Element;
9
+ export { Tabs, TabsList, TabsTrigger, TabsContent };
@@ -0,0 +1,23 @@
1
+ import type { PluginContext } from "@liqvid/studio-plugin-api";
2
+ export type ToastProps = Parameters<PluginContext["makeToast"]>[0] & {
3
+ className?: string;
4
+ ref?: React.Ref<HTMLElement>;
5
+ };
6
+ export type ToastPropsWithTime = ToastProps & {
7
+ time: number;
8
+ };
9
+ export declare function Toast({ className, message, ref, title, type: toastType, }: ToastProps): import("react/jsx-runtime").JSX.Element;
10
+ interface AnimationConfig {
11
+ keyframes: Keyframe[] | PropertyIndexedKeyframes;
12
+ options: KeyframeAnimationOptions;
13
+ }
14
+ /**
15
+ * Animation for hiding a toast notification.
16
+ * @see {@link https://www.figma.com/file/zdML9fFY9V0Oah28S0Msd3?node-id=3384:30299#314140994 Figma discussion}
17
+ */
18
+ export declare const hideToast: AnimationConfig;
19
+ /**
20
+ * Animation for showing a toast notification.
21
+ */
22
+ export declare const appearToast: AnimationConfig;
23
+ export {};
@@ -0,0 +1,6 @@
1
+ import { type ToastProps } from "./Toast.tsx";
2
+ export declare function Toaster({ toasts, }: {
3
+ toasts: (ToastProps & {
4
+ time: number;
5
+ })[];
6
+ }): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,9 @@
1
+ interface DialogContext {
2
+ min: number;
3
+ }
4
+ declare const DialogContext: import("react").Context<DialogContext>;
5
+ export declare function useDialog(): DialogContext;
6
+ export declare function DialogProvider({ children }: {
7
+ children?: React.ReactNode;
8
+ }): import("react/jsx-runtime").JSX.Element;
9
+ export {};
@@ -0,0 +1,3 @@
1
+ import type { Result } from "have-fun";
2
+ import type { z } from "zod";
3
+ export declare function fetchJson<T extends z.ZodType>(Model: T, input: RequestInfo | URL, init?: RequestInit): Promise<Result<z.core.output<T>, z.ZodError<z.core.output<T>> | SyntaxError>>;
@@ -0,0 +1,32 @@
1
+ import { Maybe, type Result } from "have-fun";
2
+ import type { z } from "zod";
3
+ import type { Awaitable } from "../types.mts";
4
+ export declare function loadJson<T extends z.ZodType>(Model: T, filename: string): Promise<Result<z.core.output<T>, z.ZodError<z.core.output<T>> | SyntaxError | NodeJS.ErrnoException>>;
5
+ export declare function findUpwards(dirname: string, callback: (dir: string) => boolean | Promise<boolean>): Promise<string | null>;
6
+ /** Callback to process a file */
7
+ export type WalkingCallback = (file: {
8
+ basename: string;
9
+ dirname: string;
10
+ filename: string;
11
+ }) => Awaitable<void>;
12
+ /** Walk a directory recursively */
13
+ export declare function walkDir(
14
+ /** Directory to walk */
15
+ dir: string,
16
+ /** Callback to run for each file */
17
+ callback: WalkingCallback,
18
+ /** Callback to decide whether to descend into a directory */
19
+ shouldProcessDir?: (dir: {
20
+ basename: string;
21
+ dirname: string;
22
+ }) => Awaitable<boolean>): Promise<void>;
23
+ /** Synchronously walk a directory recursively */
24
+ export declare function walkDirSync(
25
+ /** Directory to walk */
26
+ dir: string,
27
+ /** Callback to call for each file */
28
+ callback: (path: string) => void): void;
29
+ /**
30
+ * Get the path to the Biome executable, if available
31
+ */
32
+ export declare function getBiomePath(dirname: string): Promise<Maybe<string>>;
@@ -0,0 +1,4 @@
1
+ /**
2
+ * Debounce function calls, grouped by a key.
3
+ */
4
+ export declare function debounce(callback: () => void, key: string, debounceMs?: number): void;
@@ -0,0 +1,5 @@
1
+ export declare function useToggle(defaultValue?: boolean): {
2
+ set: React.Dispatch<React.SetStateAction<boolean>>;
3
+ toggle: () => void;
4
+ value: boolean;
5
+ };
@@ -0,0 +1,10 @@
1
+ export interface RsyncOptions {
2
+ localDir: string;
3
+ remoteDir: string;
4
+ host: string;
5
+ username?: string;
6
+ password?: string;
7
+ port?: number;
8
+ recursive?: boolean;
9
+ }
10
+ export declare function rsyncRemoteDirectory(options: RsyncOptions): Promise<void>;
package/package.json ADDED
@@ -0,0 +1,94 @@
1
+ {
2
+ "name": "@liqvid/studio",
3
+ "version": "1.0.0-alpha.0",
4
+ "description": "Production suite for Liqvid videos",
5
+ "exports": {
6
+ ".": {
7
+ "import": "./dist/esm/index.mjs",
8
+ "types": "./dist/types/index.d.mts"
9
+ },
10
+ "./next/api": {
11
+ "import": "./dist/esm/next/api.mjs",
12
+ "types": "./dist/types/next/api.d.mts"
13
+ },
14
+ "./next/page": {
15
+ "import": "./dist/esm/next/page.js",
16
+ "types": "./dist/types/next/page.d.ts"
17
+ }
18
+ },
19
+ "typesVersions": {
20
+ "*": {
21
+ "*": [
22
+ "./dist/types/*.d.ts"
23
+ ]
24
+ }
25
+ },
26
+ "files": [
27
+ "dist/*"
28
+ ],
29
+ "repository": {
30
+ "type": "git",
31
+ "url": "git+https://github.com/liqvidjs/liqvid.git"
32
+ },
33
+ "author": "Yuri Sulyma <yuri@liqvidjs.org>",
34
+ "license": "MIT",
35
+ "bugs": {
36
+ "url": "https://github.com/liqvidjs/liqvid/issues"
37
+ },
38
+ "homepage": "https://github.com/liqvidjs/liqvid/tree/main/packages/studio#readme",
39
+ "dependencies": {
40
+ "@base-ui/react": "^1.2.0",
41
+ "@phosphor-icons/react": "^2.1.10",
42
+ "@radix-ui/react-portal": "1.1.10",
43
+ "chalk": "5.6.2",
44
+ "classnames": "^2.5.1",
45
+ "execa": "^9.6.1",
46
+ "handlebars": "^4.7.8",
47
+ "have-fun": "^0.0.2",
48
+ "http-status-codes": "^2.3.0",
49
+ "lodash.debounce": "^4.0.8",
50
+ "serve": "^14.2.6",
51
+ "zod": "4.1.13",
52
+ "@liqvid/duration": "^1.3.0",
53
+ "@liqvid/assets": "^1.0.0",
54
+ "@liqvid/color-scheme": "^1.0.0-alpha.0",
55
+ "@liqvid/cli": "^2.0.0-alpha.0",
56
+ "@liqvid/event-emitter": "^1.0.0-alpha.0",
57
+ "@liqvid/hydration": "^1.0.0-alpha.0",
58
+ "@liqvid/keymap": "^2.0.0-alpha.0",
59
+ "@liqvid/utils": "^2.0.0-alpha.0",
60
+ "@liqvid/studio-plugin-api": "^1.0.0-alpha.0",
61
+ "@liqvid/recording": "^1.0.0-alpha.0",
62
+ "@liqvid/ssr": "^0.0.2"
63
+ },
64
+ "devDependencies": {
65
+ "@biomejs/biome": "2.4.4",
66
+ "@types/node": "^24",
67
+ "@types/react": "^19",
68
+ "@types/react-dom": "^19",
69
+ "concurrently": "^9.2.1",
70
+ "next": "16.1.6",
71
+ "react": "^19.2.4",
72
+ "react-dom": "^19.2.4",
73
+ "typescript": "^5.9"
74
+ },
75
+ "peerDependencies": {
76
+ "react": ">=18"
77
+ },
78
+ "sideEffects": false,
79
+ "type": "module",
80
+ "scripts": {
81
+ "build": "pnpm build:clean ; pnpm build:js ; pnpm build:hbs ; pnpm build:css ; pnpm build:postclean",
82
+ "build:clean": "rm -rf dist",
83
+ "build:css": "rsync --include='*.css' --include='*/' --exclude='*' --recursive ./src/ ./dist/esm",
84
+ "build:hbs": "cp -R templates dist",
85
+ "build:js": "tsc",
86
+ "build:postclean": "rm -f dist/tsconfig.tsbuildinfo",
87
+ "generate:schemas": "node --disable-warning=ExperimentalWarning --experimental-strip-types scripts/generate-schemas.mts",
88
+ "lint": "biome check --fix",
89
+ "watch": "concurrently \"pnpm watch:css\" \"pnpm watch:hbs\" \"pnpm watch:tsc\"",
90
+ "watch:css": "watch -n1 pnpm build:css",
91
+ "watch:hbs": "watch -n1 pnpm build:hbs",
92
+ "watch:tsc": "tsc --watch"
93
+ }
94
+ }