From d6f002f2e7c7a76abbee66e81dfe468455248b7f Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Sun, 19 Feb 2023 12:51:59 +0100 Subject: [PATCH] feat(apps): add custom css for apps --- frontend/package-lock.json | 11 ++ frontend/package.json | 1 + frontend/src/global.d.ts | 1 + .../apps/components/buttons/AppButton.svelte | 13 +- .../components/dataDisplay/AppText.svelte | 19 ++- .../components/textInputs/AppTextInput.svelte | 1 + .../components/apps/editor/AppEditor.svelte | 68 +++++++--- .../apps/editor/AppEditorHeader.svelte | 1 + .../components/apps/editor/AppPreview.svelte | 2 +- .../components/apps/editor/Component.svelte | 62 ++++++--- .../components/apps/editor/GridEditor.svelte | 8 +- .../editor/componentsPanel/CssSettings.svelte | 125 ++++++++++++++++++ .../apps/editor/componentsPanel/store.ts | 6 +- .../settingsPanel/ComponentPanel.svelte | 14 ++ frontend/src/lib/components/apps/types.ts | 5 + .../components/common/button/Button.svelte | 16 +-- .../lib/components/common/tabs/Tabs.svelte | 16 ++- .../(logged)/apps/get/[...path]/+page.svelte | 7 +- .../[workspace]/[...secret]/+page.svelte | 7 +- frontend/tailwind.config.cjs | 47 ++++--- 20 files changed, 346 insertions(+), 84 deletions(-) create mode 100644 frontend/src/lib/components/apps/editor/componentsPanel/CssSettings.svelte diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 8b3400f1c3..21304b422e 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -27,6 +27,7 @@ "svelte-chartjs": "^3.1.0", "svelte-portal": "^2.2.0", "svelte-select": "^5.0.2", + "tailwind-merge": "^1.9.1", "vscode-ws-jsonrpc": "^2.0.1" }, "devDependencies": { @@ -6467,6 +6468,11 @@ "dev": true, "peer": true }, + "node_modules/tailwind-merge": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-1.9.1.tgz", + "integrity": "sha512-ED9MkiUHlmfh58EC1xHRqXcH1IQyRtmDP0AmXlugYkP2tvfu7ejtjFEHJLJt93mQ7ZJkcqSIgm9M394bq5vOJg==" + }, "node_modules/tailwindcss": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.2.3.tgz", @@ -11691,6 +11697,11 @@ } } }, + "tailwind-merge": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-1.9.1.tgz", + "integrity": "sha512-ED9MkiUHlmfh58EC1xHRqXcH1IQyRtmDP0AmXlugYkP2tvfu7ejtjFEHJLJt93mQ7ZJkcqSIgm9M394bq5vOJg==" + }, "tailwindcss": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.2.3.tgz", diff --git a/frontend/package.json b/frontend/package.json index ce75ee7391..2f60d4f2fb 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -79,6 +79,7 @@ "svelte-chartjs": "^3.1.0", "svelte-portal": "^2.2.0", "svelte-select": "^5.0.2", + "tailwind-merge": "^1.9.1", "vscode-ws-jsonrpc": "^2.0.1" }, "peerDependencies": { diff --git a/frontend/src/global.d.ts b/frontend/src/global.d.ts index e6cd83aeb2..31b4bdc6ee 100644 --- a/frontend/src/global.d.ts +++ b/frontend/src/global.d.ts @@ -57,6 +57,7 @@ declare module 'svelte-grid' { Props, { pointerup: CustomEvent<{ id: string }> + mount: CustomEvent<> }, Slots > { } diff --git a/frontend/src/lib/components/apps/components/buttons/AppButton.svelte b/frontend/src/lib/components/apps/components/buttons/AppButton.svelte index 0fb4f9d295..09f3d7cd70 100644 --- a/frontend/src/lib/components/apps/components/buttons/AppButton.svelte +++ b/frontend/src/lib/components/apps/components/buttons/AppButton.svelte @@ -1,6 +1,6 @@ - @@ -68,7 +72,16 @@ {:else}
- + {String(result)} {#if copyButton && result} diff --git a/frontend/src/lib/components/apps/components/textInputs/AppTextInput.svelte b/frontend/src/lib/components/apps/components/textInputs/AppTextInput.svelte index 6b22e2a045..2a19e212de 100644 --- a/frontend/src/lib/components/apps/components/textInputs/AppTextInput.svelte +++ b/frontend/src/lib/components/apps/components/textInputs/AppTextInput.svelte @@ -36,6 +36,7 @@ { e?.stopPropagation() window.dispatchEvent(new Event('pointerup')) diff --git a/frontend/src/lib/components/apps/editor/AppEditor.svelte b/frontend/src/lib/components/apps/editor/AppEditor.svelte index 78400156b6..74f8f92445 100644 --- a/frontend/src/lib/components/apps/editor/AppEditor.svelte +++ b/frontend/src/lib/components/apps/editor/AppEditor.svelte @@ -1,6 +1,7 @@ @@ -1469,15 +1499,17 @@ // e?.stopPropagation() // } }} - class={classNames( - 'border h-full bg-white', - selected && $mode !== 'preview' ? 'border-blue-500' : 'border-white', + class={twMerge( + 'h-full bg-white/40', + selected && $mode !== 'preview' ? 'border border-blue-500' : '', !selected && $mode !== 'preview' && !component.card ? 'border-gray-100' : '', $mode !== 'preview' && !$connectingInput.opened ? 'hover:border-blue-500' : '', component.softWrap ? '' : 'overflow-auto', $mode != 'preview' ? 'cursor-pointer' : '', - 'relative z-auto' + 'relative z-auto', + $app.css?.['app']?.['component']?.class )} + style={$app.css?.['app']?.['component']?.style} > {#if component.type === 'displaycomponent'} -
+
+ import Toggle from '$lib/components/Toggle.svelte' + import Tooltip from '$lib/components/Tooltip.svelte' + import { faAngleDown } from '@fortawesome/free-solid-svg-icons' + import { LayoutDashboardIcon } from 'lucide-svelte' + import { getContext } from 'svelte' + import Icon from 'svelte-awesome' + import { slide } from 'svelte/transition' + import type { AppEditorContext } from '../../types' + import { components, type AppComponent } from '../Component.svelte' + import { isOpenStoreCss } from './store' + + const { app } = getContext('AppEditorContext') + + function switchTab(detail: any): void { + throw new Error('Function not implemented.') + } + + const entries: { type: 'app' | AppComponent['type']; name: string; icon: any; ids: string[] }[] = + [ + { + type: 'app' as 'app' | AppComponent['type'], + name: 'App', + icon: LayoutDashboardIcon, + ids: ['viewer', 'grid', 'component'] + } + ].concat( + Object.entries(components).map((c) => ({ + type: c[1].data.type as 'app' | AppComponent['type'], + name: c[1].name, + icon: c[1].icon, + ids: c[1].cssIds ?? [] + })) + ) + let isCustom: Record = Object.fromEntries( + Object.keys(entries).map((k) => [k, false]) + ) + if (Object.keys($isOpenStoreCss).length == 0) { + $isOpenStoreCss = Object.fromEntries(Object.keys(entries).map((k) => [k, false])) + } + + let newCss = $app.css ?? {} + entries.forEach((e) => { + if (!newCss[e.type]) { + isCustom[e.type] = true + newCss[e.type] = {} + } + e.ids.forEach((id) => { + if (!newCss[e.type][id]) { + newCss[e.type][id] = { style: '', class: '' } + } + }) + e.ids + .map((id) => newCss[e.type][id].class != '' || newCss[e.type][id].style != '') + .forEach((c) => { + if (c) { + isCustom[e.type] = true + } + }) + }) + //@ts-ignore + $app.css = newCss + + +
+ switchTab(e.detail)} + options={{ + right: 'As JSON' + }} + /> +
+ + Arguments can be edited either using the wizard, or by editing their JSON Schema, + see docs + +
+
+ +
+ {#each entries as { type, name, icon, ids }} + {#if ids.length > 0} +
+ + {#if $isOpenStoreCss[type]} +
+ {#each ids as id} +
+
{id}
+ {#if $app?.css?.[type]?.[id]} + style + (isCustom[type] = true)} + bind:value={$app.css[type][id].style} + /> + class + (isCustom[type] = true)} + bind:value={$app.css[type][id].class} + /> + {/if} +
+ {/each} +
+ {/if} +
+ {/if} + {/each} +
diff --git a/frontend/src/lib/components/apps/editor/componentsPanel/store.ts b/frontend/src/lib/components/apps/editor/componentsPanel/store.ts index e44d58457a..eb4b94cb19 100644 --- a/frontend/src/lib/components/apps/editor/componentsPanel/store.ts +++ b/frontend/src/lib/components/apps/editor/componentsPanel/store.ts @@ -12,10 +12,12 @@ export const isOpenStore = { let newItems = {} items.forEach(item => newItems = { ...newItems, ...item }) store.update(last => ({ ...newItems, ...last })) - + }, toggle: (id: string) => { store.update(last => ({ ...last, [id]: !last[id] })) }, reset: () => store.set({}) -} \ No newline at end of file +} + +export const isOpenStoreCss = writable>({}) \ No newline at end of file diff --git a/frontend/src/lib/components/apps/editor/settingsPanel/ComponentPanel.svelte b/frontend/src/lib/components/apps/editor/settingsPanel/ComponentPanel.svelte index f938e08c76..1a692a3d8f 100644 --- a/frontend/src/lib/components/apps/editor/settingsPanel/ComponentPanel.svelte +++ b/frontend/src/lib/components/apps/editor/settingsPanel/ComponentPanel.svelte @@ -168,6 +168,20 @@ {/if} + {#if Object.keys(component.customCss ?? {}).length > 0} + + {#each Object.entries(component.customCss ?? {}) as [key, value]} +
+
{key}
+ style + + class + +
+ {/each} +
+ {/if} +