Dark mode v0 (#1893)

* feat(frontend): wip

* wip

* wip

* wip

* wip

* add toggle

* correctly handle monaco theme

* wip

* wip

* wip

* wip

* wip

* feat(frontend): Dark mode v0

* feat(frontend): Adap AI gen poppup

* feat(frontend): Adap script metadata labels

* feat(frontend): Fix unreadable texts

* feat(frontend): Fix unreadable texts

* feat(frontend): Fix unreadable texts

* feat(frontend): Fix ressource picker

* feat(frontend): Fix unreadable texts

* feat(frontend): Fix unreadable texts

* feat(frontend): Fix unreadable texts

* feat(frontend): Add theme toggle in the login page

* feat(frontend): Fix unreadable texts

* feat(frontend): Fix language selection

* feat(frontend): Fix FlowStatusViewer colors

* feat(frontend): Fix divide colors

* feat(frontend): Fix flow graph buttons

* feat(frontend): add theme toggle in login modal

* feat(frontend): small ui fix

* feat(frontend): fix graph dark mode toggle
This commit is contained in:
Faton Ramadani
2023-07-25 10:43:04 +02:00
committed by GitHub
parent d99709ae70
commit 8fa9e3ca4c
229 changed files with 1418 additions and 947 deletions
+7
View File
@@ -4,6 +4,13 @@
@tailwind utilities;
@layer base {
*,
::before,
::after {
@apply dark:border-gray-600;
}
@font-face {
font-family: 'Inter';
src: url('/Inter-Variable.ttf');
@@ -71,7 +71,7 @@
<TestConnection {resource_type} {args} />
</div>
{:else}
<p class="italic text-gray-500 text-xs mb-4"
<p class="italic text-tertiary text-xs mb-4"
>No corresponding resource type found in your workspace for {resource_type}. Define the value in
JSON directly</p
>
@@ -323,7 +323,7 @@
<Button
size="sm"
variant="border"
color={key === resource_type ? 'blue' : 'dark'}
color={key === resource_type ? 'blue' : 'light'}
btnClasses={key === resource_type ? '!border-2 !bg-blue-50/75' : 'm-[1px]'}
on:click={() => {
manual = false
@@ -387,7 +387,7 @@
<Button
size="sm"
variant="border"
color={key === resource_type ? 'blue' : 'dark'}
color={key === resource_type ? 'blue' : 'light'}
btnClasses={key === resource_type ? '!border-2 !bg-blue-50/75' : 'm-[1px]'}
on:click={() => {
manual = true
@@ -453,7 +453,7 @@
kind="resource"
/>
{#if apiTokenApps[resource_type] || !manual}
<ul class="mt-10 bg-white">
<ul class="mt-10">
<li>
1. A secret variable containing the {apiTokenApps[resource_type]?.key ?? 'token'}
<span class="font-bold">{truncateRev(value, 5, '*****')}</span>
+2 -2
View File
@@ -42,7 +42,7 @@
</Drawer>
{#if value == undefined || value == null}
<span class="text-gray-600">null</span>
<span class="text-tertiary">null</span>
{:else if value == '<function call>'}
{'<function call>'}<Tooltip
>The arg was none and the default argument of the script is a function call, hence the actual
@@ -71,7 +71,7 @@
<div class="relative">
{#if JSON.stringify(value).length > 120}
<button
class="text-xs absolute top-0 right-4 text-gray-500"
class="text-xs absolute top-0 right-4 text-tertiary"
on:click={() => {
jsonViewerContent = value
jsonViewer.toggleDrawer()
+5 -5
View File
@@ -185,7 +185,7 @@
<FieldHeader prettify={prettifyHeader} {label} {required} {type} {contentEncoding} {format} />
{/if}
{#if editableSchema}
<label class="text-gray-700">
<label class="text-secondary">
Description
<textarea
class="mb-1"
@@ -229,7 +229,7 @@
{/if}
{#if description}
<div class="text-sm italic pb-1">
<div class="text-sm italic pb-1 text-secondary">
{description}
</div>
{/if}
@@ -312,7 +312,7 @@
{/if}
<button
transition:fade|local={{ duration: 100 }}
class="rounded-full p-1 bg-white/60 duration-200 hover:bg-gray-200 ml-2"
class="rounded-full p-1 bg-surface-secondary duration-200 hover:bg-surface-hover ml-2"
aria-label="Clear"
on:click={() => {
value.splice(i, 1)
@@ -450,7 +450,7 @@
{/if}
</div>
{#if variableEditor}
<div class="text-sm text-gray-600">
<div class="text-sm text-tertiary-inverse">
{#if value && typeof value == 'string' && value?.startsWith('$var:')}
Linked to variable <button
class="text-blue-500 underline"
@@ -465,7 +465,7 @@
<slot name="actions" />
</div>
{#if !compact || (error && error != '')}
<div class="text-right text-xs text-red-600">
<div class="text-right text-xs text-red-600 dark:text-red-400">
{#if error === ''}
&nbsp;
{:else}
@@ -43,7 +43,7 @@
</select>
{#if Array.isArray(itemsType?.enum)}
<div class="pt-1" />
<label for="input" class="mb-2 text-gray-700 text-xs">
<label for="input" class="mb-2 text-secondary text-xs">
Enums
<div class="flex flex-col gap-1">
{#each itemsType?.enum || [] as e}
+1 -1
View File
@@ -1,7 +1,7 @@
<script lang="ts">
import Tooltip from './Tooltip.svelte'
export let twBgColor = 'bg-blue-200'
export let twTextColor = 'text-gray-700'
export let twTextColor = 'text-secondary'
export let tooltip: string | undefined = undefined
</script>
@@ -1,34 +1,32 @@
<script lang="ts">
import WindmillIcon from './icons/WindmillIcon.svelte'
import Uptodate from './Uptodate.svelte'
import Version from './Version.svelte'
import LoginPageHeader from './LoginPageHeader.svelte'
export let subtitle: string | undefined = undefined
export let title = 'Windmill'
export let disableLogo = false
</script>
<div class="center-center min-h-screen p-4 relative bg-gray-50">
<div class="center-center min-h-screen p-4 relative bg-surface-secondary">
<div class="flex flex-col gap-2 items-center w-full">
{#if !disableLogo}
<div class="hidden lg:block">
<div>
<WindmillIcon height="100px" width="100px" spin="slow" />
</div>
<h2 class="text-center pt-2 text-gray-800">Windmill</h2>
<h2 class="text-center pt-2 text-primary">Windmill</h2>
</div>
{/if}
<div
class="border rounded-md shadow-md bg-white w-full max-w-[640px]
p-4 sm:py-8 sm:px-10 mb-6 md:mb-20 z-10"
class="border rounded-md shadow-md bg-surface w-full max-w-[640px] p-4 sm:py-8 sm:px-10 mb-6 md:mb-20 z-10"
>
<div class="mb-10">
<h1 class="text-center">
<h1 class="text-center text-primary">
{title}
</h1>
{#if subtitle}
<p class="text-sm text-center text-gray-600 mt-2">
<p class="text-sm text-center text-secondary mt-2">
{subtitle}
</p>
{/if}
@@ -37,9 +35,5 @@
</div>
</div>
<div class="absolute top-0 right-0 text-2xs text-gray-600 italic px-3 py-1">
<span class="font-mono flex flex-col">
<div>Windmill <Version /></div><div><Uptodate /></div>
</span>
</div>
<LoginPageHeader />
</div>
@@ -10,7 +10,7 @@
<button
type="submit"
class="mr-6 text-sm underline text-gray-700 inline-flex items-center"
class="mr-6 text-sm underline text-secondary inline-flex items-center"
on:click={() => {
viewOptions = !viewOptions
}}
@@ -7,8 +7,8 @@
</script>
<div>
<div class="text-sm font-semibold"> CLI quick setup </div>
<div class="text-sm text-gray-600" role="alert" id="dynamic-input-help-box">
<div class="text-sm font-semibold">CLI quick setup </div>
<div class="text-sm" role="alert" id="dynamic-input-help-box">
<ul class="pl-0 pt-2 list-decimal list-inside">
<li
>Install the latest wmill CLI from deno.land: <InlineCodeCopy
@@ -15,7 +15,7 @@
<Button
variant="border"
color="light"
btnClasses="text-gray-600 {small ? 'text-xs' : ''} "
btnClasses="text-tertiary {small ? 'text-xs' : ''} "
on:click={() => (open = !open)}
>
{text}&nbsp;<Icon data={open ? faChevronUp : faChevronDown} scale={0.5} />
+5 -5
View File
@@ -295,16 +295,16 @@
<div class="w-full flex flex-col gap-1">
<small class="font-bold">Preview New Cron</small>
<div class="flex p-2 px-4 rounded-md bg-gray-100">
<div class="flex p-2 px-4 rounded-md bg-surface-secondary">
<span>{nschedule}</span>
</div>
</div>
</div>
<div class="mt-4">
<Button color="dark" size="xs" on:click={() => (schedule = nschedule)}
>Set Cron Schedule</Button
>
<Button color="dark" size="xs" on:click={() => (schedule = nschedule)}>
Set Cron Schedule
</Button>
</div>
</CollapseLink>
</div>
@@ -316,7 +316,7 @@
<hr />
<div class="flex flex-col space-y-2">
<small>Estimated upcoming events ({timezone})</small>
<div class="flex flex-col rounded-md p-4 border text-gray-600">
<div class="flex flex-col rounded-md p-4 border text-tertiary bg-surface-secondary">
{#each preview as date}
<div class="flex items-center space-x-2 text-sm">
<span>{dateFormatter(new Date(date))}</span>
@@ -0,0 +1,23 @@
<script lang="ts">
import { onMount, onDestroy } from 'svelte'
import { createEventDispatcher } from 'svelte'
const dispatch = createEventDispatcher()
let observer: MutationObserver
onMount(() => {
observer = new MutationObserver((mutationsList, observer) => {
for (let mutation of mutationsList) {
if (mutation.type === 'attributes' && mutation.attributeName === 'class') {
dispatch('change', document.documentElement.classList.contains('dark'))
}
}
})
observer.observe(document.documentElement, { attributes: true })
})
onDestroy(() => {
observer.disconnect()
})
</script>
@@ -502,7 +502,7 @@
<div class="grid grid-cols-9 justify-center max-w-3xl gap-2">
{#each dependencies ?? [] as { kind, path, include }}
{@const statusPath = computeStatusPath(kind, path)}
<div class="col-span-1 truncate text-gray-700 text-sm">{kind}</div><div
<div class="col-span-1 truncate text-secondary text-sm">{kind}</div><div
class="col-span-5 truncate font-semibold">{path}</div
><div class="col-span-1"><Toggle size="xs" bind:checked={include} /></div><div
class="col-span-1"
@@ -42,7 +42,9 @@
{#if diffContent == undefined}
<Loader2 class="animate-spin" />
{:else}
<pre class="border bg-white p-2"><code>{@html diffContent}</code></pre>
<pre class="border bg-surface-secondary p-2 whitespace-pre-wrap"
><code>{@html diffContent}</code></pre
>
<div class="flex flex-row-reverse gap-2">
<div class="text-red-600">Removed</div>
<div class="text-green-600">Added</div></div
@@ -11,17 +11,6 @@
import 'monaco-editor/esm/vs/basic-languages/sql/sql.contribution'
import 'monaco-editor/esm/vs/language/typescript/monaco.contribution'
meditor.defineTheme('myTheme', {
base: 'vs',
inherit: true,
rules: [],
colors: {
'editorLineNumber.foreground': '#999',
'editorGutter.background': '#F9FAFB'
}
})
meditor.setTheme('myTheme')
const SIDE_BY_SIDE_MIN_WIDTH = 650
export let automaticLayout = true
@@ -125,13 +125,13 @@
<div class="inline-highlight">
{#if result != undefined}
{#if resultKind && resultKind != 'json'}
<div class="mb-2 text-gray-500 text-sm bg-gray-50/20">
<div class="mb-2 text-tertiary text-sm bg-gray-50/20">
as JSON&nbsp;<input class="windmillapp" type="checkbox" bind:checked={forceJson} /></div
>{/if}{#if typeof result == 'object' && Object.keys(result).length > 0}<div
class="mb-2 w-full text-sm relative"
>The result keys are: <b>{truncate(Object.keys(result).join(', '), 50)}</b>
{#if !disableExpand}
<div class="text-gray-500 text-xs absolute top-5.5 right-0">
<div class="text-tertiary text-xs absolute top-5.5 right-0">
<button on:click={jsonViewer.openDrawer}><Expand size={16} /></button>
</div>
{/if}
@@ -179,7 +179,7 @@
Warning
</div>
<p
class="text-gray-600 mb-2 text-left border-2 !border-t-0 rounded-b border-red-400 overflow-auto p-1"
class="text-tertiary mb-2 text-left border-2 !border-t-0 rounded-b border-red-400 overflow-auto p-1"
>Rendering HTML can expose you to <a
href="https://owasp.org/www-community/attacks/xss/"
target="_blank"
@@ -229,7 +229,7 @@
>{#if result.error.name || result.error.message}{result.error.name}: {result.error
.message}{:else}{JSON.stringify(result.error, null, 4)}{/if}</span
>
<pre class="text-sm whitespace-pre-wrap text-gray-900">{result.error.stack ?? ''}</pre>
<pre class="text-sm whitespace-pre-wrap text-primary">{result.error.stack ?? ''}</pre>
{#if lang && editor && diffEditor}
<ScriptFix error={JSON.stringify(result.error)} {lang} {editor} {diffEditor} />
{/if}
@@ -255,7 +255,7 @@
</div>
{:else}
{#if jsonStr.length > 10000}
<div class="text-sm mb-2 text-gray-600">
<div class="text-sm mb-2 text-tertiary">
<a
download="{filename ?? 'result'}.json"
href={workspaceId && jobId
@@ -270,7 +270,7 @@
{/if}
{/if}
{:else}
<div class="text-gray-500 text-sm">No result: {jsonStr}</div>
<div class="text-tertiary text-sm">No result: {jsonStr}</div>
{/if}
</div>
@@ -280,7 +280,7 @@
<DrawerContent title="Expanded Result" on:close={jsonViewer.closeDrawer}>
<svelte:fragment slot="actions">
<a
class="text-sm text-gray-600 mr-2 inline-flex gap-2 items-center py-2 px-2 hover:bg-gray-100 rounded-lg"
class="text-sm text-secondary mr-2 inline-flex gap-2 items-center py-2 px-2 hover:bg-gray-100 rounded-lg"
download="{filename ?? 'result'}.json"
href={workspaceId && jobId
? `/api/w/${workspaceId}/jobs_u/completed/get_result/${jobId}`
@@ -292,7 +292,7 @@
</Button>
</svelte:fragment>
{#if jsonStr.length > 100000}
<div class="text-sm mb-2 text-gray-600">
<div class="text-sm mb-2 text-tertiary">
<a
download="{filename ?? 'result'}.json"
href="data:text/json;charset=utf-8,{encodeURIComponent(jsonStr)}">Download</a
+8 -8
View File
@@ -54,9 +54,9 @@
dispatch('click', { item: item?.eventName })
}
}}
class="block w-full whitespace-nowrap hover:drop-shadow-sm hover:bg-gray-50 hover:bg-opacity-30
px-4 py-2 text-sm text-gray-700 text-left
{item.disabled ? 'bg-gray-200' : ''}
class="block w-full whitespace-nowrap hover:drop-shadow-sm hover:bg-surface-hover hover:bg-opacity-30
px-4 py-2 text-sm text-primary text-left
{item.disabled ? 'bg-surface-disabled' : ''}
{item.separatorTop ? 'border-t' : ''} {item.separatorBottom ? 'border-b' : ''} {item.type ==
'delete'
? 'text-red-500'
@@ -70,7 +70,7 @@
<Icon
data={item.icon}
scale={0.6}
class="inline mr-2 {item.type == 'delete' ? 'text-red-500' : 'text-gray-700'}"
class="inline mr-2 {item.type == 'delete' ? 'text-red-500' : 'text-primary'}"
/>
{/if}
{item.displayName}
@@ -78,7 +78,7 @@
{:else if item.href && !item.disabled}
<a
href={item.href}
class="block w-full px-4 font-semibold text-left py-2 text-sm text-gray-700 hover:drop-shadow-sm hover:bg-gray-50 hover:bg-opacity-30
class="block w-full px-4 font-semibold text-left py-2 text-sm text-secondary hover:drop-shadow-sm hover:bg-gray-50 hover:bg-opacity-30
{item.disabled ? 'bg-gray-200' : ''}"
role="menuitem"
tabindex="-1"
@@ -89,7 +89,7 @@
<Icon
data={item.icon}
scale={0.6}
class="inline mr-2 {item.type == 'delete' ? 'text-red-500' : 'text-gray-700'}"
class="inline mr-2 {item.type == 'delete' ? 'text-red-500' : 'text-secondary'}"
/>
{/if}
{item.displayName}
@@ -98,7 +98,7 @@
<!-- svelte-ignore a11y-click-events-have-key-events -->
<span
class:bg-gray-200={item.disabled}
class="block font-semibold text-left px-4 py-2 text-sm text-gray-700 cursor-auto"
class="block font-semibold text-left px-4 py-2 text-sm text-secondary cursor-auto"
role="menuitem"
tabindex="-1"
id="user-menu-item-{name}-{i}}"
@@ -108,7 +108,7 @@
<Icon
data={item.icon}
scale={0.6}
class="inline mr-2 {item.type == 'delete' ? 'text-red-500' : 'text-gray-700'}"
class="inline mr-2 {item.type == 'delete' ? 'text-red-500' : 'text-secondary'}"
/>
{/if}
{item.displayName}
-11
View File
@@ -28,17 +28,6 @@
import { MonacoBinding } from 'y-monaco'
import { dbSchema } from '$lib/stores'
meditor.defineTheme('myTheme', {
base: 'vs',
inherit: true,
rules: [],
colors: {
'editorLineNumber.foreground': '#999',
'editorGutter.background': '#F9FAFB'
}
})
meditor.setTheme('myTheme')
import {
createHash as randomHash,
editorConfig,
+8 -8
View File
@@ -411,7 +411,7 @@
<Button
title="Add context variable"
color="light"
btnClasses="!font-medium text-gray-600"
btnClasses="!font-medium text-scondary"
on:click={contextualVariablePicker.openDrawer}
size="xs"
spacingSize="md"
@@ -425,7 +425,7 @@
<Button
title="Add variable"
color="light"
btnClasses="!font-medium text-gray-600"
btnClasses="!font-medium text-scondary"
on:click={variablePicker.openDrawer}
size="xs"
spacingSize="md"
@@ -439,7 +439,7 @@
{#if showResourcePicker}
<Button
title="Add resource"
btnClasses="!font-medium text-gray-600"
btnClasses="!font-medium text-scondary"
size="xs"
spacingSize="md"
color="light"
@@ -454,7 +454,7 @@
{#if showResourceTypePicker}
<Button
title="Add resource"
btnClasses="!font-medium text-gray-600"
btnClasses="!font-medium text-scondary"
size="xs"
spacingSize="md"
color="light"
@@ -468,7 +468,7 @@
<Button
title="Reset Content"
btnClasses="!font-medium text-gray-600"
btnClasses="!font-medium text-scondary"
size="xs"
spacingSize="md"
color="light"
@@ -480,7 +480,7 @@
</Button>
<Button
btnClasses="!font-medium text-gray-600"
btnClasses="!font-medium text-scondary"
size="xs"
spacingSize="md"
color="light"
@@ -570,7 +570,7 @@
<div class="flex flex-row items-center gap-2">
{#if scriptPath}
<Button
btnClasses="!font-medium text-gray-600"
btnClasses="!font-medium text-scondary"
size="xs"
spacingSize="md"
color="light"
@@ -584,7 +584,7 @@
{/if}
{#if SCRIPT_EDITOR_SHOW_EXPLORE_OTHER_SCRIPTS}
<Button
btnClasses="!font-medium text-gray-600"
btnClasses="!font-medium text-scondary"
size="xs"
spacingSize="md"
color="light"
@@ -0,0 +1,137 @@
<script lang="ts">
import { editor as meditor } from 'monaco-editor/esm/vs/editor/editor.api'
import { onMount } from 'svelte'
import DarkModeObserver from './DarkModeObserver.svelte'
import github from 'svelte-highlight/styles/github'
import nord from 'svelte-highlight/styles/nord'
meditor.defineTheme('nord', {
base: 'vs-dark',
inherit: true,
rules: [
{
background: '2E3440',
token: ''
},
{
foreground: '616e88',
token: 'comment'
},
{
foreground: 'a3be8c',
token: 'string'
},
{
foreground: 'b48ead',
token: 'constant.numeric'
},
{
foreground: '81a1c1',
token: 'constant.language'
},
{
foreground: '81a1c1',
token: 'keyword'
},
{
foreground: '81a1c1',
token: 'storage'
},
{
foreground: '81a1c1',
token: 'storage.type'
},
{
foreground: '8fbcbb',
token: 'entity.name.class'
},
{
foreground: '8fbcbb',
fontStyle: ' bold',
token: 'entity.other.inherited-class'
},
{
foreground: '88c0d0',
token: 'entity.name.function'
},
{
foreground: '81a1c1',
token: 'entity.name.tag'
},
{
foreground: '8fbcbb',
token: 'entity.other.attribute-name'
},
{
foreground: '88c0d0',
token: 'support.function'
},
{
foreground: 'f8f8f0',
background: 'f92672',
token: 'invalid'
},
{
foreground: 'f8f8f0',
background: 'ae81ff',
token: 'invalid.deprecated'
},
{
foreground: 'b48ead',
token: 'constant.color.other.rgb-value'
},
{
foreground: 'ebcb8b',
token: 'constant.character.escape'
},
{
foreground: '8fbcbb',
token: 'variable.other.constant'
}
],
colors: {
'editor.foreground': '#D8DEE9',
'editor.background': '#2E3440',
'editor.selectionBackground': '#434C5ECC',
'editor.lineHighlightBackground': '#3B4252',
'editorCursor.foreground': '#D8DEE9',
'editorWhitespace.foreground': '#434C5ECC'
}
})
meditor.defineTheme('myTheme', {
base: 'vs',
inherit: true,
rules: [],
colors: {
'editorLineNumber.foreground': '#999',
'editorGutter.background': '#F9FAFB'
}
})
let darkMode: boolean = false
function onThemeChange() {
if (document.documentElement.classList.contains('dark')) {
meditor.setTheme('nord')
darkMode = true
} else {
meditor.setTheme('myTheme')
darkMode = false
}
}
onMount(() => {
onThemeChange()
})
</script>
<DarkModeObserver on:change={onThemeChange} />
<svelte:head>
{#if darkMode}
{@html nord}
{:else}
{@html github}
{/if}
</svelte:head>
@@ -25,11 +25,11 @@
{#if displayType}
{#if format && !format.startsWith('resource')}
<span class="text-xs italic ml-2 text-gray-500 dark:text-indigo-400">
<span class="text-xs italic ml-2 text-tertiary dark:text-indigo-400">
{format}
</span>
{:else}
<span class="text-xs italic ml-2 text-gray-500 dark:text-indigo-400">
<span class="text-xs italic ml-2 text-tertiary dark:text-indigo-400">
{type ?? 'any'}{contentEncoding && contentEncoding != ''
? `, encoding: ${contentEncoding}`
: ''}
@@ -405,7 +405,7 @@
>
<Badge
color="gray"
class="center-center !bg-gray-300 !text-gray-600 !h-[28px] !w-[70px] rounded-r-none"
class="center-center !bg-gray-300 !text-tertiary dark:!bg-gray-700 dark:!text-gray-300 !h-[28px] !w-[70px] rounded-r-none"
>
<Pen size={12} class="mr-2" /> Path
</Badge>
@@ -71,9 +71,7 @@
</Drawer>
<div class="grid grid-cols-3 w-full h-full">
<div
class="{noSide
? 'col-span-3'
: 'sm:col-span-2 col-span-3'} w-full border border-gray-200 max-h-full"
class="{noSide ? 'col-span-3' : 'sm:col-span-2 col-span-3'} w-full border max-h-full"
class:overflow-auto={overflowAuto}
>
<FlowGraph
@@ -91,7 +89,7 @@
>
{#if stepDetail == undefined}
<div>
<p class="font-medium text-gray-600 text-center pt-4 pb-8">
<p class="font-medium text-tertiary text-center pt-4 pb-8">
Click on a step to see its details
</p>
<h3 class="mb-2 font-semibold">Flow Inputs</h3>
@@ -100,10 +98,10 @@
{:else if stepDetail == 'Input'}
<SchemaViewer schema={flow?.schema} />
{:else if stepDetail == 'Result'}
<p class="font-medium text-gray-600 text-center pt-4 pb-8"> End of the flow </p>
<p class="font-medium text-tertiary text-center pt-4 pb-8"> End of the flow </p>
{:else if typeof stepDetail != 'string' && stepDetail.value}
<div class="">
<div class="sticky top-0 bg-white w-full flex items-center py-2">
<div class="sticky top-0 bg-surface w-full flex items-center py-2">
{#if stepDetail.id}
<Badge color="indigo">
{stepDetail.id}
@@ -141,7 +139,7 @@
{/if}
</div>
{#if stepDetail.value.type == 'identity'}
<p class="font-medium text-gray-600 text-center pt-4 pb-8">
<p class="font-medium text-tertiary text-center pt-4 pb-8">
An identity step returns its inputs as outputs
</p>
{:else if stepDetail.value.type == 'rawscript'}
@@ -189,7 +187,7 @@
{/if}
{:else if stepDetail.value.type == 'forloopflow'}
<div>
<p class="font-medium text-gray-600 pb-2"> Iterator expression: </p>
<p class="font-medium text-tertiary pb-2"> Iterator expression: </p>
{#if stepDetail.value.iterator.type == 'static'}
<ObjectViewer json={stepDetail.value.iterator.value} />
{:else}
@@ -199,18 +197,18 @@
{/if}
</div>
{:else if stepDetail.value.type == 'branchall'}
<p class="font-medium text-gray-600 text-center pt-4 pb-8">
<p class="font-medium text-tertiary text-center pt-4 pb-8">
All branches will run, regardless of the inputs
</p>
{:else if stepDetail.value.type == 'branchone'}
<p class="font-medium text-gray-600 text-center pt-4 pb-8">
<p class="font-medium text-tertiary text-center pt-4 pb-8">
Only one branch will run based on a predicate
</p>
{:else if stepDetail.value.type == 'flow'}
<FlowPathViewer noSide path={stepDetail.value.path} />
{/if}
{:else}
<p class="font-medium text-gray-600 text-center pt-4 pb-8">
<p class="font-medium text-tertiary text-center pt-4 pb-8">
Step {stepDetail} selected
</p>
{/if}
@@ -17,8 +17,8 @@
class:border={!noBorder}
class="grid {!col ? 'grid-cols-2' : 'grid-rows-2'} shadow border-gray-400 h-full max-h-screen"
>
<div class="bg-white {col ? '' : 'max-h-80'} h-full p-1 overflow-auto relative">
<span class="text-gray-500">Result</span>
<div class="bg-surface {col ? '' : 'max-h-80'} h-full p-1 overflow-auto relative">
<span class="text-tertiary">Result</span>
{#if result}
<DisplayResult {workspaceId} {jobId} {filename} {result} />
{:else if loading}
+16 -14
View File
@@ -34,24 +34,26 @@
<ScheduleEditor bind:this={scheduleEditor} />
<div class="rounded-md p-3 bg-gray-50 shadow-sm sm:text-sm md:text-base" style="min-height: 150px;">
<div
class="rounded-md p-3 bg-surface-secondary shadow-sm sm:text-sm md:text-base"
style="min-height: 150px;"
>
<JobStatus {job} />
<div>
<Icon class="text-gray-700" data={faClock} scale={SMALL_ICON_SCALE} /><span
class="mx-2 text-2xs text-gray-600"
>
<Icon class="text-secondary" data={faClock} scale={SMALL_ICON_SCALE} />
<span class="mx-2 text-2xs text-secondary">
{#if job['success'] != undefined}
Received job: {displayDate(job.created_at ?? '')}
{:else}
{#key time}
Received job {displayDaysAgo(job.created_at ?? '')}
{/key}
{/if}</span
>
{/if}
</span>
</div>
{#if job && 'started_at' in job && job.started_at}
<div>
<Icon class="text-gray-700" data={faClock} scale={SMALL_ICON_SCALE} /><span class="mx-2">
<Icon class="text-secondary" data={faClock} scale={SMALL_ICON_SCALE} /><span class="mx-2">
{#if job['success'] != undefined}
Started: {displayDate(job.started_at ?? '')}
{:else}
@@ -63,7 +65,7 @@
{/if}
{#if job && job['mem_peak']}
<div>
<Icon class="text-gray-700" data={faMemory} scale={SMALL_ICON_SCALE} /><span class="mx-2">
<Icon class="text-secondary" data={faMemory} scale={SMALL_ICON_SCALE} /><span class="mx-2">
Mem peak: {(job['mem_peak'] / 1024).toPrecision(5)}MB</span
>
</div>
@@ -71,18 +73,18 @@
<div>
{#if job && job.parent_job}
{#if job.is_flow_step}
<Icon class="text-gray-700" data={faBarsStaggered} scale={SMALL_ICON_SCALE} /><span
<Icon class="text-secondary" data={faBarsStaggered} scale={SMALL_ICON_SCALE} /><span
class="mx-2"
>
Step of flow <a href={`/run/${job.parent_job}`}>{job.parent_job}</a></span
>
{:else}
<Icon class="text-gray-700" data={faRobot} scale={SMALL_ICON_SCALE} /><span class="mx-2">
<Icon class="text-secondary" data={faRobot} scale={SMALL_ICON_SCALE} /><span class="mx-2">
Triggered by parent <a href={`/run/${job.parent_job}`}>{job.parent_job}</a></span
>
{/if}
{:else if job && job.schedule_path}
<Icon class="text-gray-700" data={faCalendar} scale={SMALL_ICON_SCALE} />
<Icon class="text-secondary" data={faCalendar} scale={SMALL_ICON_SCALE} />
<span
>Triggered by the schedule: <button
class="break-words text-sm text-blue-600 font-normal"
@@ -97,21 +99,21 @@
{@const isScript = job?.job_kind === 'script'}
{@const viewHref = `${stem}/get/${isScript ? job?.script_hash : job?.script_path}`}
<div>
<Icon class="text-gray-700" data={faScroll} scale={SMALL_ICON_SCALE} /><span class="mx-2">
<Icon class="text-secondary" data={faScroll} scale={SMALL_ICON_SCALE} /><span class="mx-2">
<a href={viewHref}>{isScript ? job?.script_hash : job?.script_path}</a>
</span>
</div>
{/if}
<div>
<Icon class="text-gray-700" data={faUser} scale={SMALL_ICON_SCALE} /><span class="mx-2">
<Icon class="text-secondary" data={faUser} scale={SMALL_ICON_SCALE} /><span class="mx-2">
By {job.created_by}
{#if job.permissioned_as !== `u/${job.created_by}` && job.permissioned_as != job.created_by}but
permissioned as {job.permissioned_as}{/if}
</span>
</div>
</div>
<div class="text-gray-700 text-2xs pt-2">
<div class="text-secondary text-2xs pt-2">
run id: <a href={`/run/${job.id}?workspace=${job.workspace_id}`}>{job.id}</a>
</div>
</div>
@@ -112,14 +112,14 @@
</DrawerContent>
</Drawer>
<div class="flex divide-y flex-col space-y-2 h-screen bg-white px-6 py-2 w-full">
<div class="flex divide-y flex-col space-y-2 h-screen bg-surface px-6 py-2 w-full">
<div class="flex flex-row justify-between w-full items-center gap-x-2">
<div class="w-8">
<button
on:click={() => dispatch('close')}
class="hover:bg-gray-200 bg-gray-100 rounded-full w-8 h-8 flex items-center justify-center transition-all"
class="hover:bg-surface-hover bg-surface-secondary rounded-full w-8 h-8 flex items-center justify-center transition-all"
>
<Icon data={faClose} class="text-gray-500" />
<Icon data={faClose} class="text-secondary" />
</button>
</div>
@@ -194,7 +194,7 @@
{#if jobId}
<FlowStatusViewer bind:flowState={$flowStateStore} {jobId} bind:job />
{:else}
<div class="italic text-gray-500 h-full grow"> Flow status will be displayed here </div>
<div class="italic text-tertiary h-full grow"> Flow status will be displayed here </div>
{/if}
</div>
</div>
@@ -204,16 +204,16 @@
{#if job}
<div class="flow-root w-full space-y-4">
{#if innerModules.length > 0}
<h3 class="text-md leading-6 font-bold text-gray-900 border-b pb-2">Flow result</h3>
<h3 class="text-md leading-6 font-bold text-primay border-b pb-2">Flow result</h3>
{/if}
{#if isListJob}
{#if render}
<div class="w-full h-full border border-gray-600 bg-white p-1">
<div class="w-full h-full border border-gray-600 bg-surface p-1">
<DisplayResult workspaceId={job?.workspace_id} {jobId} result={jobResults} />
</div>
{/if}
{:else if render}
<div class={innerModules.length > 0 ? 'border border-gray-400 shadow p-2' : ''}>
<div class={innerModules.length > 0 ? 'border rounded-md shadow p-2' : ''}>
<FlowPreviewStatus {job} />
{#if `result` in job}
<div class="w-full h-full">
@@ -240,7 +240,7 @@
<div
><span class="inline-flex gap-1"
><Badge color="indigo">{mod.id}</Badge>
<span class="font-medium text-gray-900">
<span class="font-medium text-primary">
{#if !emptyString(rawMod?.summary)}
{rawMod?.summary ?? ''}
{:else if rawMod?.value.type == 'script'}
@@ -269,7 +269,7 @@
{/if}
<div class={selected == 'graph' ? 'hidden' : ''}>
{#if isListJob}
<h3 class="text-md leading-6 font-bold text-gray-600 border-b mb-4">
<h3 class="text-md leading-6 font-bold text-tertiary border-b mb-4">
Embedded flows: ({flowJobIds?.flowJobs.length} items)
</h3>
{#each flowJobIds?.flowJobs ?? [] as loopJobId, j}
@@ -352,23 +352,23 @@
{/each}
{:else if innerModules.length > 0}
<ul class="w-full">
<h3 class="text-md leading-6 font-bold text-gray-900 border-b mb-4 py-2">
<h3 class="text-md leading-6 font-bold text-primary border-b mb-4 py-2">
Step-by-step results
</h3>
{#each innerModules as mod, i}
{#if render}
<div class="line w-8 h-10" />
<h3 class="text-gray-500 mb-2 w-full">
<h3 class="text-tertiary mb-2 w-full">
{#if job?.raw_flow?.modules && i < job?.raw_flow?.modules.length}
Step
<span class="font-medium text-gray-900">
<span class="font-medium text-primary">
{i + 1}
</span>
out of
<span class="font-medium text-gray-900">{job?.raw_flow?.modules.length}</span>
<span class="font-medium text-primary">{job?.raw_flow?.modules.length}</span>
{#if job.raw_flow?.modules[i]?.summary}
: <span class="font-medium text-gray-900">
: <span class="font-medium text-primary">
{job.raw_flow?.modules[i]?.summary ?? ''}
</span>
{/if}
@@ -378,7 +378,7 @@
</h3>
<div class="line w-8 h-10" />
{/if}
<li class="w-full border border-gray-600 p-6 space-y-2 bg-blue-50/50">
<li class="w-full border p-6 space-y-2 bg-blue-50/50 dark:bg-frost-900/50">
{#if [FlowStatusModule.type.IN_PROGRESS, FlowStatusModule.type.SUCCESS, FlowStatusModule.type.FAILURE].includes(mod.type)}
{#if job.raw_flow?.modules[i]?.value.type == 'flow'}
<svelte:self
@@ -422,8 +422,8 @@
{#if render}
{#if job.raw_flow && !isListJob}
<div class="{selected != 'graph' ? 'hidden' : ''} mt-4">
<div class="grid grid-cols-3 border border-gray-300">
<div class="col-span-2 bg-gray-50">
<div class="grid grid-cols-3 border">
<div class="col-span-2 bg-surface-secondary">
<div class="flex flex-col">
{#each Object.values(retry_status) as count}
<span class="text-sm">
@@ -484,7 +484,7 @@
<ModuleStatus type={node.type} scheduled_for={node['scheduled_for']} />
{#if node.job_id}
<div class="truncate"
><div class=" text-gray-900 whitespace-nowrap truncate">
><div class=" text-primary whitespace-nowrap truncate">
<span class="font-bold">Job Id</span>
<a
rel="noreferrer"
@@ -511,12 +511,12 @@
logs={node.logs ?? ''}
/>
{:else}
<p class="p-2 text-gray-600 italic"
<p class="p-2 text-tertiary italic"
>The execution of this node has no information attached to it. The job likely did
not run yet</p
>
{/if}
{:else}<p class="p-2 text-gray-600 italic">Select a node to see its details here</p
{:else}<p class="p-2 text-tertiary italic">Select a node to see its details here</p
>{/if}
</div>
</div>
@@ -28,7 +28,7 @@
}
</script>
<div class="w-full h-full mt-2 text-sm text-gray-600">
<div class="w-full h-full mt-2 text-sm text-tertiary">
<p>Waiting to be resumed</p>
<div>
{#if is_owner}
@@ -86,7 +86,7 @@
{/each}
</ul>
{:else}
<div class="text-gray-700 text-xs italic mb-4">No inputs</div>
<div class="text-secondary text-xs italic mb-4">No inputs</div>
{/if}
<FlowGraphViewer download {noSide} {flow} overflowAuto />
</div>
@@ -147,7 +147,7 @@
<h2>Permissions ({perms?.length ?? 0})</h2>
{#if can_write}
<Alert role="info" title="New permissions may take up to 60s to apply"
><span class="text-xs text-gray-500">Due to permissions cache invalidation</span></Alert
><span class="text-xs text-tertiary">Due to permissions cache invalidation</span></Alert
>
<div class="flex items-center gap-1">
<div>
@@ -341,7 +341,7 @@
</div>
{/if} -->
<!-- {#if managing_folders.length == 0}
<p class="text-gray-600 text-sm">No folder is managing this folder</p>
<p class="text-tertiary text-sm">No folder is managing this folder</p>
{:else}
<TableCustom>
<tr slot="header-row">
@@ -6,9 +6,9 @@
<Popover
><div class="inline-flex gap-1 items-end"
><span class="text-gray-500 text-xs mb-0.5">({members.length})</span>
><span class="text-tertiary text-xs mb-0.5">({members.length})</span>
<div class="max-w-xs truncate"
><span class="text-gray-600 text-xs ">{members?.join(', ')}</span></div
><span class="text-tertiary text-xs">{members?.join(', ')}</span></div
></div
>
<span slot="text">{members?.join(', ')}</span></Popover
@@ -22,7 +22,7 @@
</td>
{/each}
{:else}
<div class="flex flex-col text-xs text-gray-600">
<div class="flex flex-col text-xs text-tertiary">
{#each Object.entries(usage) as [k, v]}
<div>
{k}: {v}
@@ -295,7 +295,7 @@
</div>
{/if}
{#if managing_groups.length == 0}
<p class="text-gray-600 text-sm">No group is managing this group</p>
<p class="text-tertiary text-sm">No group is managing this group</p>
{:else}
<TableCustom>
<tr slot="header-row">
+2 -2
View File
@@ -17,9 +17,9 @@
{#if members}
<Popover
><div class="inline-flex gap-1 items-end"
><span class="text-gray-500 text-xs mb-0.5">({members.length})</span>
><span class="text-tertiary text-xs mb-0.5">({members.length})</span>
<div class="max-w-xs truncate"
><span class="text-gray-600 text-xs ">{members?.join(', ')}</span></div
><span class="text-tertiary text-xs">{members?.join(', ')}</span></div
></div
>
<span slot="text">{members?.join(', ')}</span></Popover
@@ -16,7 +16,7 @@
{name}
{/if}
{#if iconComponent}
<span class="text-gray-700 grayscale">
<span class="text-secondary grayscale">
<svelte:component this={iconComponent} {height} {width} />
</span>
{:else}
@@ -7,7 +7,8 @@
</script>
<!-- svelte-ignore a11y-click-events-have-key-events -->
<pre class="bg-gray-700 text-gray-100 p-2 font-mono text-sm whitespace-pre-wrap my-2 rounded-md"
<pre
class="bg-surface-secondary text-secondary p-2 font-mono text-sm whitespace-pre-wrap my-2 rounded-md"
>{content} <span on:click={() => copyToClipboard(content)} class="cursor-pointer ml-2"
><Icon data={faClipboard} /></span
></pre
@@ -208,24 +208,20 @@
<ToggleButton
tooltip={`Write text or surround javascript with \`\$\{\` and \`\}\`. Use \`results\` to connect to another node\'s output.`}
light
position="left"
value="static"
size="xs2"
small
label={'${}'}
/>
{:else}
<ToggleButton small label="Static" position="left" value="static" size="xs2" />
<ToggleButton small label="Static" value="static" />
{/if}
<ToggleButton
small
light
tooltip="Javascript expression ('flow_input' or 'results')."
position="right"
value="javascript"
icon={Code}
size="xs2"
/>
</ToggleButtonGroup>
</div>
@@ -78,7 +78,7 @@
{/if}
{/each}
{:else}
<div class="text-gray-500 text-sm">No inputs</div>
<div class="text-tertiary text-sm">No inputs</div>
{/if}
</div>
@@ -99,7 +99,7 @@
>
<div
slot="submission"
class="flex flex-row-reverse w-full bg-white border-t border-gray-200 rounded-bl-lg rounded-br-lg"
class="flex flex-row-reverse w-full bg-surface border-t border-gray-200 rounded-bl-lg rounded-br-lg"
>
<Button
variant="border"
@@ -11,7 +11,7 @@
<ul class="mb-1">
{#each entries as [key, val]}
<li class="flex pb-2 last:pb-0">
<span class="font-black text-gray-700 text-xs">{key}:</span>
<span class="font-black text-secondary text-xs">{key}:</span>
{#if val.type == 'static'}
{#if typeof val.value == 'object'}
<ObjectViewer json={val.value} />
@@ -29,5 +29,5 @@
{/each}
</ul>
{:else}
<div class="text-gray-600 text-sm"> No inputs </div>
<div class="text-tertiary text-sm"> No inputs </div>
{/if}
@@ -33,11 +33,11 @@
<div class="flex flex-row gap-2 mb-2 items-end">
<label class="block shrink min-w-0">
<span class="text-gray-700 text-sm">Email</span>
<span class="text-secondary text-sm">Email</span>
<input type="email" placeholder="email" bind:value={$globalEmailInvite} />
</label>
<label class="block shrink min-w-0">
<span class="text-gray-700 text-sm">Password</span>
<span class="text-secondary text-sm">Password</span>
<input bind:value={password} />
</label>
@@ -63,5 +63,5 @@
<div>
<input type="text" placeholder="company (optional)" bind:value={company} />
</div>
<div class="text-xs text-gray-600 grow text-right"> Email will be sent if SMTP configured </div>
<div class="text-xs text-tertiary grow text-right"> Email will be sent if SMTP configured </div>
</div>
+13 -7
View File
@@ -50,7 +50,13 @@
/>
<Drawer bind:this={drawer} size="600px">
<DrawerContent {tooltip} {documentationLink} overflow_y={false} title="Search {itemName}s" on:close={drawer.closeDrawer}>
<DrawerContent
{tooltip}
{documentationLink}
overflow_y={false}
title="Search {itemName}s"
on:close={drawer.closeDrawer}
>
<div class="w-full h-full flex flex-col">
<div class="w-12/12 pb-4">
<input
@@ -65,20 +71,20 @@
<Skeleton layout={[[2], 0.7]} />
{/each}
{:else if !items?.length}
<div class="text-center text-sm text-gray-600 mt-2">
<div class="text-center text-sm text-tertiary mt-2">
{@html noItemMessage}
</div>
{:else if filteredItems?.length}
<div class="border rounded-md divide-y divide-gray-200 w-full overflow-auto pb-12 grow">
<div class="border rounded-md divide-y w-full overflow-auto pb-12 grow">
{#each filteredItems as obj}
<div
class="hover:bg-gray-50 w-full flex items-center p-4 gap-4 first-of-type:!border-t-0
class="hover:bg-surface-hover w-full flex items-center p-4 gap-4 first-of-type:!border-t-0
first-of-type:rounded-t-md last-of-type:rounded-b-md"
>
<div class="inline-flex items-center grow">
<button
class="py-2 px-1 gap-1 flex grow border-gray-300 border-opacity-0
text-black"
text-primary"
on:click={() => {
if (closeOnClick) {
drawer.closeDrawer()
@@ -87,12 +93,12 @@
}}
>
{#if `app` in obj}
<div class="mr-2 text-sm text-left center-center w-30">
<div class="mr-2 text-sm text-left center-center w-30">
<IconedResourceType after={true} silent={false} name={obj['app']} />
</div>
{/if}
{#if `resource_type` in obj}
<div class="mr-2 text-left w-30 center-center text-sm">
<div class="mr-2 text-left w-30 center-center text-sm">
<IconedResourceType after={true} name={obj['resource_type']} />
</div>
{/if}
+4 -4
View File
@@ -46,7 +46,7 @@ ${Object.entries(args)
</script>
<div class="relative">
<div class="text-gray-500 text-xs absolute top-8 right-0">
<div class="text-tertiary text-xs absolute top-8 right-0">
<button
on:click={() => {
jsonStr = JSON.stringify(args, null, 4)
@@ -68,7 +68,7 @@ ${Object.entries(args)
</tr>
{/each}
{:else if args}
<tr><div class="text-gray-600 pt-2 pl-1 text-sm">No arguments</div></tr>
<tr><div class="text-secondary pt-2 pl-1 text-sm">No arguments</div></tr>
{:else}
<tr>
<td>
@@ -88,7 +88,7 @@ ${Object.entries(args)
<DrawerContent title="Expanded Args" on:close={jsonViewer.closeDrawer}>
<svelte:fragment slot="actions">
<a
class="text-sm text-gray-600 mr-2 inline-flex gap-2 items-center py-2 px-2 hover:bg-gray-100 rounded-lg"
class="text-sm text-secondary mr-2 inline-flex gap-2 items-center py-2 px-2 hover:bg-surface-hover rounded-lg"
download="windmill-args.json"
href="data:text/json;charset=utf-8,{encodeURIComponent(jsonStr)}"
>Download <Download size={14} /></a
@@ -101,7 +101,7 @@ ${Object.entries(args)
</Button>
</svelte:fragment>
{#if jsonStr.length > 100000}
<div class="text-sm mb-2 text-gray-600">
<div class="text-sm mb-2 text-tertiary">
<a
download="windmill-args.json"
href="data:text/json;charset=utf-8,{encodeURIComponent(jsonStr)}">Download</a
@@ -238,7 +238,7 @@
{/if}
<button
transition:fade|local={{ duration: 100 }}
class="rounded-full p-1 bg-white/60 duration-200 hover:bg-gray-200 ml-2"
class="rounded-full p-1 bg-surface-secondary duration-200 hover:bg-surface-hover ml-2"
aria-label="Clear"
on:click={() => {
value = value.filter((el) => el != v)
@@ -352,7 +352,7 @@
<slot name="actions" />
</div>
{#if error && error != ''}
<div class="text-right text-xs text-red-600">
<div class="text-right text-xs text-red-600 dark:text-red-400">
{#if error === ''}
&nbsp;
{:else}
+4 -4
View File
@@ -35,7 +35,7 @@
<DrawerContent title="Expanded Logs" on:close={logViewer.closeDrawer}>
<svelte:fragment slot="actions">
<a
class="text-sm text-gray-600 mr-2 inline-flex gap-2 items-center py-2 px-2 hover:bg-gray-100 rounded-lg"
class="text-sm text-secondary mr-2 inline-flex gap-2 items-center py-2 px-2 hover:bg-surface-hover rounded-lg"
download="windmill-logs.json"
href="/api/w/{$workspaceStore}/jobs_u/get_logs/{jobId}">Download <Download size={14} /></a
>
@@ -44,7 +44,7 @@
</Button>
</svelte:fragment>
<div>
<pre class="bg-gray-50 text-xs w-full p-2"
<pre class="bg-surface-secondary text-secondary text-xs w-full p-2"
>{#if content}{content}{:else if isLoading}Waiting for job to start...{:else}No logs are available yet{/if}</pre
>
</div>
@@ -65,12 +65,12 @@
{#if isLoading}
<Loader2 class="animate-spin absolute top-2 left-2" />
{:else if duration}
<span class="absolute text-xs text-gray-500 dark:text-gray-400 top-2 left-2"
<span class="absolute text-xs text-tertiary dark:text-gray-400 top-2 left-2"
>took {duration}ms</span
>
{/if}
{#if mem}
<span class="absolute text-xs text-gray-500 dark:text-gray-400 top-2 left-36"
<span class="absolute text-xs text-tertiary dark:text-gray-400 top-2 left-36"
>mem peak: {(mem / 1024).toPrecision(4)}MB</span
>
{/if}
@@ -0,0 +1,16 @@
<script>
import Uptodate from './Uptodate.svelte'
import Version from './Version.svelte'
import DarkModeToggle from './sidebar/DarkModeToggle.svelte'
</script>
<div class="absolute top-0 right-0 text-2xs text-gray-800 italic px-3 py-1">
<div class="flex flex-row gap-2">
<DarkModeToggle forcedDarkMode={false} />
<div class="font-mono flex-col flex p-2 justify-center">
<Version />
<Uptodate />
</div>
</div>
</div>
+2 -2
View File
@@ -40,7 +40,7 @@
class="fixed right-0 top-0 flex flex-col w-3/4 sm:w-2/3 lg:w-1/2 h-screen border border-gray-300 shadow-xl"
>
{#if open}
<div class="flex flex-row justify-between p-2 bg-white border-b border-gray-200">
<div class="flex flex-row justify-between p-2 bg-surface border-b border-gray-200">
<button
on:click={() => {
open = false
@@ -68,7 +68,7 @@
<div class="flex flex-col bg-gray-50 pt-3 px-6 grow overflow-y-auto">
<slot name="content" />
</div>
<div class="flex flex-col bg-white border-gray-200 p-2">
<div class="flex flex-col bg-surface border-gray-200 p-2">
<div class="flex flex-row justify-between p-2">
<button
on:click={() => {
@@ -114,7 +114,7 @@
isLoading={testIsLoading}
/>
</Pane>
<Pane size={50} minSize={10} class="text-sm text-gray-600">
<Pane size={50} minSize={10} class="text-sm text-tertiary">
{#if testJob != undefined && 'result' in testJob && testJob.result != undefined}
<pre class="overflow-x-auto break-words relative h-full px-2">
<DisplayResult
@@ -14,12 +14,12 @@
Waiting to be resumed by resume events such as approvals
</span>
{:else if type == FlowStatusModule.type.WAITING_FOR_PRIOR_STEPS}
<span class="italic text-gray-600">
<span class="italic text-tertiary">
<Icon data={faHourglassHalf} class="mr-2" />
Waiting for prior steps to complete
</span>
{:else if type == FlowStatusModule.type.WAITING_FOR_EXECUTOR}
<span class="italic text-gray-600">
<span class="italic text-tertiary">
<Icon data={faHourglassHalf} class="mr-2" />
{#if scheduled_for}
Job has been {scheduled_for} and will be executed after that time
@@ -96,9 +96,9 @@
<Drawer bind:this={drawer}>
<DrawerContent title="Move/Rename {initialPath}" on:close={drawer.closeDrawer}>
{#if !own}
<Alert type="warning" title="Not owner"
>Since you do not own this item, you cannot move this item (you can however fork it)</Alert
>
<Alert type="warning" title="Not owner">
Since you do not own this item, you cannot move this item (you can however fork it)
</Alert>
{/if}
<h2 class="border-b pb-1 mt-2 mb-4">Summary</h2>
<input
+1 -1
View File
@@ -32,7 +32,7 @@
<div class="absolute inset-y-0 right-0 flex items-center px-2">
<input class="!hidden js-password-toggle" id="toggle" type="checkbox" />
<label
class="bg-gray-300 hover:bg-gray-400 rounded px-2 py-1 text-sm text-gray-600 font-mono cursor-pointer js-password-label"
class="bg-gray-300 hover:bg-gray-400 rounded px-2 py-1 text-sm text-tertiary font-mono cursor-pointer js-password-label"
for="toggle">show</label
>
</div>
+13 -11
View File
@@ -279,7 +279,7 @@
<div class="flex gap-x-4 shrink">
<!-- svelte-ignore a11y-label-has-associated-control -->
<label class="block">
<span class="text-gray-700 text-sm whitespace-nowrap">&nbsp;</span>
<span class="text-secondary text-sm whitespace-nowrap">&nbsp;</span>
<ToggleButtonGroup
class="mt-0.5"
@@ -320,7 +320,7 @@
</label>
{#if meta.ownerKind === 'user'}
<label class="block shrink min-w-0">
<span class="text-gray-700 text-sm">User</span>
<span class="text-secondary text-sm">User</span>
<input
class="!w-36"
type="text"
@@ -331,13 +331,15 @@
</label>
{:else if meta.ownerKind === 'folder'}
<label class="block grow w-48">
<span class="text-gray-700 text-sm"
>Folder <Tooltip
<span class="text-secondary text-sm">
Folder
<Tooltip
documentationLink="https://www.windmill.dev/docs/core_concepts/groups_and_folders"
>Read and write permissions are given to groups and users at the folder level and
shared by all items inside the folder.</Tooltip
></span
>
>
Read and write permissions are given to groups and users at the folder level and
shared by all items inside the folder.
</Tooltip>
</span>
<div class="flex flex-row items-center gap-1 w-full">
<select class="grow w-full" {disabled} bind:value={meta.owner}>
@@ -375,7 +377,7 @@
{/if}
</div>
<label class="block grow w-full max-w-md">
<span class="text-gray-700 text-sm">
<span class="text-secondary text-sm">
Name
<Required required={true} />
</span>
@@ -402,7 +404,7 @@
<div class="flex justify-start w-full">
<Badge
color="gray"
class="center-center !bg-gray-300 !text-gray-600 !w-[70px] !h-[24px] rounded-r-none"
class="center-center !bg-surface-secondary !text-tertiary !w-[70px] !h-[24px] rounded-r-none border"
>
Full path
</Badge>
@@ -418,7 +420,7 @@
/>
<!-- <span class="font-mono text-sm break-all">{path}</span> -->
</div>
<div class="text-red-600 text-2xs">{error}</div>
<div class="text-red-600 dark:text-red-400 text-2xs">{error}</div>
</div>
</div>
+1 -1
View File
@@ -6,7 +6,7 @@
{#if required}
<span class="text-red-500 dark:text-red-400 text-sm font-normal {$$props.class}">*</span>
{:else if detail || detail != ''}
<span class="text-sm text-gray-500 ml-2 font-normal {$$props.class}"
<span class="text-sm text-tertiary ml-2 font-normal {$$props.class}"
>({detail != '' ? `${detail}` : ''})</span
>
{/if}
@@ -133,13 +133,13 @@
on:close={drawer.closeDrawer}
>
<div>
<div class="flex flex-col gap-3 py-3 text-gray-700">
<div class="flex flex-col gap-3 py-3">
<div>
{#if !can_write}
<div class="m-2">
<Alert type="warning" title="Only read access"
>You only have read access to this resource and cannot edit it</Alert
>
<Alert type="warning" title="Only read access">
You only have read access to this resource and cannot edit it
</Alert>
</div>
{/if}
<Path
@@ -175,10 +175,10 @@
<input type="text" disabled value={rawCode} />
{:else}
{#if !viewJsonSchema}
<p class="italic text-gray-500 text-xs mb-4"
>No corresponding resource type found in your workspace for {selectedResourceType}.
Define the value in JSON directly</p
>
<p class="italic text-secondary text-xs mb-4">
No corresponding resource type found in your workspace for {selectedResourceType}.
Define the value in JSON directly
</p>
{/if}
{#if !emptyString(jsonError)}<span
@@ -2,7 +2,7 @@
import { ResourceService } from '$lib/gen'
import { workspaceStore } from '$lib/stores'
import { faPen, faPlus, faRotateRight } from '@fortawesome/free-solid-svg-icons'
import { createEventDispatcher } from 'svelte'
import { createEventDispatcher, onMount } from 'svelte'
import Icon from 'svelte-awesome'
import Select from './apps/svelte-select/lib/index'
import { SELECT_INPUT_DEFAULT_STYLE } from '../defaults'
@@ -10,6 +10,7 @@
import { Button } from './common'
import ResourceEditor from './ResourceEditor.svelte'
import DbSchemaExplorer from './DBSchemaExplorer.svelte'
import DarkModeObserver from './DarkModeObserver.svelte'
const dispatch = createEventDispatcher()
@@ -54,8 +55,24 @@
let appConnect: AppConnect
let resourceEditor: ResourceEditor
let darkMode: boolean = false
function onThemeChange() {
if (document.documentElement.classList.contains('dark')) {
darkMode = true
} else {
darkMode = false
}
}
onMount(() => {
onThemeChange()
})
</script>
<DarkModeObserver on:change={onThemeChange} />
<AppConnect
on:refresh={async (e) => {
await loadResources(resourceType)
@@ -93,8 +110,11 @@
class="text-clip grow min-w-0"
placeholder="{resourceType ?? 'any'} resource"
inputStyles={SELECT_INPUT_DEFAULT_STYLE.inputStyles}
containerStyles={SELECT_INPUT_DEFAULT_STYLE.containerStyles}
containerStyles={darkMode
? SELECT_INPUT_DEFAULT_STYLE.containerStylesDark
: SELECT_INPUT_DEFAULT_STYLE.containerStyles}
/>
{#if value && value != ''}
<Button variant="border" size="xs" on:click={() => resourceEditor?.initEdit?.(value ?? '')}>
<Icon scale={0.8} data={faPen} /></Button
@@ -107,16 +127,18 @@
size="xs"
on:click={() => appConnect?.open?.(resourceType)}
>
<Icon scale={0.8} data={faPlus} /></Button
>
<Icon scale={0.8} data={faPlus} />
</Button>
<Button
variant="border"
color="light"
size="xs"
on:click={() => {
loadResources(resourceType)
}}><Icon scale={0.8} data={faRotateRight} /></Button
}}
>
<Icon scale={0.8} data={faRotateRight} />
</Button>
</div>
<DbSchemaExplorer {resourceType} pg={value} />
+2 -2
View File
@@ -88,7 +88,7 @@
{/if}
<div class="flex items-center gap-2">
<span class="text-sm text-gray-500">
<span class="text-sm text-tertiary">
{#if runnable}
Edited {displayDaysAgo(runnable.created_at || '')} by {runnable.created_by ||
'unknown'}
@@ -143,7 +143,7 @@
{/key}
{/if}
{:else}
<div class="text-xs text-gray-600">No arguments</div>
<div class="text-xs text-tertiary">No arguments</div>
{/if}
{#if schedulable}
<div class="mt-10" />
@@ -159,7 +159,7 @@
{#if schedules}
{#if schedules.length == 0}
<div class="text-xs text-gray-700 px-2"> No other schedules </div>
<div class="text-xs text-secondary px-2"> No other schedules </div>
{:else}
<div class="flex flex-col divide-y px-2 pt-2">
{#each schedules as schedule}
+10 -10
View File
@@ -166,8 +166,8 @@
{#each savedInputs as i}
<button
class={classNames(
`w-full flex items-center group justify-between gap-4 py-2 px-4 text-left border rounded-md hover:bg-gray-100 transition-all`,
selectedInput === i ? 'border-blue-500 bg-blue-50' : ''
`w-full flex items-center group justify-between gap-4 py-2 px-4 text-left border rounded-md hover:bg-surface-hover transition-all`,
selectedInput === i ? 'border-blue-500 bg-blue-50 dark:bg-blue-900' : ''
)}
on:click={() => {
if (!i.isEditing) {
@@ -189,7 +189,7 @@
}}
class="w-full"
>
<input type="text" bind:value={i.name} class="text-gray-700" />
<input type="text" bind:value={i.name} class="text-secondary" />
</form>
{:else}
<small
@@ -243,13 +243,13 @@
</Button>
</div>
{:else}
<span class="text-xs text-gray-600">By {i.created_by}</span>
<span class="text-xs text-tertiary">By {i.created_by}</span>
{/if}
</div>
</button>
{/each}
{:else}
<div class="text-center text-gray-500">No saved Inputs</div>
<div class="text-center text-tertiary">No saved Inputs</div>
{/if}
</div>
</div>
@@ -264,8 +264,8 @@
{#each previousInputs as i}
<button
class={classNames(
`w-full flex items-center justify-between gap-4 py-2 px-4 text-left border rounded-sm hover:bg-gray-100 transition-a`,
selectedInput === i ? 'border-blue-500 bg-blue-50' : ''
`w-full flex items-center justify-between gap-4 py-2 px-4 text-left border rounded-sm hover:bg-surface-hover transition-a`,
selectedInput === i ? 'border-blue-500 bg-blue-50 dark:bg-blue-900' : ''
)}
on:click={() => {
if (selectedInput === i) {
@@ -293,7 +293,7 @@
<a
target="_blank"
href="/runs/{i.id}"
class="text-right float-right text-gray-600"
class="text-right float-right text-secondary"
title="See run detail in a new tab"
>
<ExternalLink size={16} />
@@ -303,7 +303,7 @@
</button>
{/each}
{:else}
<div class="text-center text-gray-500">No previous Runs</div>
<div class="text-center text-tertiary">No previous Runs</div>
{/if}
</div>
</div>
@@ -320,7 +320,7 @@
<ObjectViewer json={selectedInput?.args} />
</div>
{:else}
<div class="text-center text-gray-500">
<div class="text-center text-tertiary">
Select an Input to preview scripts arguments
</div>
{/if}
@@ -225,7 +225,7 @@
<h2 class="border-b pb-1 mt-8 mb-2">Runnable</h2>
{#if !edit}
<p class="text-xs mb-1 text-gray-600">
<p class="text-xs mb-1 text-tertiary">
Pick a script or flow to be triggered by the schedule<Required required={true} />
</p>
<ScriptPicker
@@ -277,7 +277,7 @@
canRefresh
/>
<div class="flex gap-20 items-start mt-3">
<div class="text-gray-600 text-sm"
<div class="text-tertiary text-sm"
>The following args will be passed to the error handler:
<ul class="mt-1 ml-2">
<li><b>path</b>: The path of the script or flow that errored.</li>
@@ -293,7 +293,7 @@
</tbody>
</TableCustom>
{:else}
<div class="text-gray-700 text-xs italic mt-2">This schema has no arguments.</div>
<div class="text-secondary text-xs italic mt-2">This schema has no arguments.</div>
{/if}
</div>
{:else}
@@ -139,7 +139,7 @@
{/if}
{/each}
{:else if !shouldHideNoInputs}
<div class="text-gray-500 text-sm">No inputs</div>
<div class="text-secondary text-sm">No inputs</div>
{/if}
</div>
@@ -161,18 +161,13 @@
...x
}))}
>
<div
slot="submission"
class="flex flex-row-reverse w-full bg-white border-t border-gray-200 rounded-bl-lg rounded-br-lg"
>
<div slot="submission">
<Button
variant="border"
color="blue"
size="sm"
startIcon={{ icon: faPlus }}
on:click={() => {
variableEditor?.initNew?.()
}}
on:click={() => variableEditor?.initNew?.()}
>
New variable
</Button>
@@ -124,7 +124,7 @@
<div class="flex flex-col gap-6">
<div>
<label class="block">
<div class="mb-1 font-semibold text-gray-700">
<div class="mb-1 font-semibold text-secondary">
Name
<Required required={true} />
</div>
@@ -144,14 +144,14 @@
</div>
<label class="block">
<div class="mb-1 font-semibold text-gray-700">
<div class="mb-1 font-semibold text-secondary">
Description
<Required required={false} />
</div>
<textarea placeholder="Enter a description" rows="3" bind:value={property.description} />
</label>
<div>
<div class="mb-1 font-semibold text-gray-700">Type<Required required={true} /></div>
<div class="mb-1 font-semibold text-secondary">Type<Required required={true} /></div>
<div class="grid sm:grid-cols-3 md:grid-cols-4 gap-x-2 gap-y-1 items-center mb-2 w-full">
{#each ARG_TYPES as argType}
{@const isSelected = argType == property.selectedType}
@@ -216,7 +216,7 @@
</div>
{#if property.selectedType !== 'boolean'}
<div>
<div class="font-semibold text-gray-700 mb-1">Advanced</div>
<div class="font-semibold text-secondary mb-1">Advanced</div>
{#if property.selectedType == 'string'}
<StringTypeNarrowing
bind:format={property.format}
@@ -72,7 +72,7 @@
</TableCustom>
</div>
{:else}
<div class="text-gray-700 text-xs italic m-1">No arguments</div>
<div class="text-secondary text-xs italic m-1">No arguments</div>
{/if}
</TabContent>
<TabContent value="advanced">
@@ -282,7 +282,7 @@
<h2 class="border-b pb-1 mt-10 mb-4">Language</h2>
{#if lockedLanguage}
<div class="text-sm text-gray-600 italic mb-2">
<div class="text-sm text-tertiary italic mb-2">
As a forked script, the language '{script.language}' cannot be modified.
</div>
{/if}
@@ -293,7 +293,7 @@
size="sm"
variant="border"
color={isPicked ? 'blue' : 'light'}
btnClasses={isPicked ? '!border-2 !bg-blue-50/75' : 'm-[1px]'}
btnClasses={isPicked ? '!border-2 !bg-blue-50/75 dark:!bg-frost-900/75' : 'm-[1px]'}
on:click={() => {
template = 'script'
initContent(lang, script.kind, template)
@@ -309,7 +309,9 @@
size="sm"
variant="border"
color={template == 'docker' ? 'blue' : 'light'}
btnClasses={template == 'docker' ? '!border-2 !bg-blue-50/75' : 'm-[1px]'}
btnClasses={template == 'docker'
? '!border-2 !bg-blue-50/75 dark:!bg-frost-900/75'
: 'm-[1px]'}
disabled={lockedLanguage}
on:click={() => {
if (isCloudHosted()) {
@@ -338,7 +340,9 @@
size="sm"
variant="border"
color={template == 'powershell' ? 'blue' : 'light'}
btnClasses={template == 'docker' ? '!border-2 !bg-blue-50/75' : 'm-[1px]'}
btnClasses={template == 'powershell'
? '!border-2 !bg-blue-50/75 dark:!bg-frost-900/75'
: 'm-[1px]'}
disabled={lockedLanguage}
on:click={() => {
template = 'powershell'
@@ -352,7 +356,9 @@
size="xs"
variant="border"
color={script.language == 'bun' ? 'blue' : 'light'}
btnClasses={script.language == 'bun' ? '!border-2 !bg-blue-50/75' : 'm-[1px]'}
btnClasses={script.language == 'bun'
? '!border-2 !bg-blue-50/75 dark:!bg-frost-900/75'
: 'm-[1px]'}
disabled={lockedLanguage}
on:click={() => {
initContent(Script.language.BUN, script.kind, template)
@@ -390,11 +396,11 @@
<h2 class="border-b pb-1 mt-10 mb-4">Concurrency limits</h2>
<div class="flex gap-x-4 shrink">
<label class="block shrink min-w-0">
<span class="text-gray-700 text-sm">Maximum number of runs</span>
<span class="text-secondary text-sm">Maximum number of runs</span>
<input class="!w-55" type="number" bind:value={script.concurrent_limit} />
</label>
<label class="block shrink min-w-0">
<span class="text-gray-700 text-sm">Per time window (seconds)</span>
<span class="text-secondary text-sm">Per time window (seconds)</span>
<input class="!w-18" type="number" bind:value={script.concurrency_time_window_s} />
</label>
</div>
@@ -427,21 +433,23 @@
{/each}
</select>
{:else}
<div class="text-sm text-gray-600 italic mb-2">
<div class="text-sm text-secondary italic mb-2">
No custom worker group defined on this instance
</div>
{/if}
{/if}
</div>
{#if !isCloudHosted()}
<h2 class="border-b pb-1 mt-10 mb-4"
>Custom env variables<Tooltip
documentationLink="https://www.windmill.dev/docs/script_editor/custom_environment_variables"
>Additional static custom env variables to pass to the script.</Tooltip
></h2
>
<h2 class="border-b pb-1 mt-10 mb-4">
Custom env variables
<Tooltip
documentationLink="https://www.windmill.dev/docs/reference#custom-environment-variables"
>
Additional static custom env variables to pass to the script.
</Tooltip>
</h2>
<div class="w-full">
<span class="text-gray-600 text-xs pb-2">Format is: `{'<KEY>=<VALUE>'}`</span>
<span class="text-tertiary text-xs pb-2">Format is: `{'<KEY>=<VALUE>'}`</span>
{#if Array.isArray(script.envs ?? [])}
{#each script.envs ?? [] as v, i}
<div class="flex max-w-md mt-1 w-full items-center">
@@ -509,7 +517,7 @@
>
<Badge
color="gray"
class="center-center !bg-gray-300 !text-gray-600 !h-[28px] !w-[70px] rounded-r-none"
class="center-center !bg-surface-selected !text-tertiary !h-[28px] !w-[70px] rounded-r-none"
>
<Pen size={12} class="mr-2" /> Path
</Badge>
@@ -540,7 +548,7 @@
<Awareness />
{/if}
<div class="flex flex-row gap-x-1 lg:gap-x-4">
<div class="flex flex-row gap-x-1 lg:gap-x-2">
<Button
color="light"
variant="border"
@@ -552,7 +560,7 @@
Metadata
</Button>
<Button
color="dark"
color="light"
variant="border"
size="xs"
on:click={() => {
@@ -602,7 +610,7 @@
size="sm"
variant="border"
color={isPicked ? 'blue' : 'dark'}
btnClasses="font-medium {isPicked ? '!bg-blue-50/75' : ''}"
btnClasses="font-medium {isPicked ? '!bg-blue-50/75 !dark:bg-blue-900/75' : ''}"
on:click={() => {
template = 'script'
script.kind = value
@@ -219,7 +219,7 @@
<div>Have others join by sharing the following url:</div>
<div class="flex gap-2 pr-4">
<input type="text" disabled value={collabUrl()} />
<button on:click={() => copyToClipboard(collabUrl())} class="text-gray-700 ml-2">
<button on:click={() => copyToClipboard(collabUrl())} class="text-secondary ml-2">
<Icon data={faClipboard} />
</button>
</div>
@@ -2,7 +2,7 @@
import { ScriptService, FlowService, Script } from '$lib/gen'
import { hubScripts, workspaceStore } from '$lib/stores'
import { createEventDispatcher } from 'svelte'
import { createEventDispatcher, onMount } from 'svelte'
import Select from './apps/svelte-select/lib/index'
@@ -18,6 +18,7 @@
import { faRotateRight } from '@fortawesome/free-solid-svg-icons'
import Icon from 'svelte-awesome'
import FlowIcon from './home/FlowIcon.svelte'
import DarkModeObserver from './DarkModeObserver.svelte'
export let initialPath: string | undefined = undefined
export let scriptPath: string | undefined = undefined
@@ -62,8 +63,23 @@
}
$: itemKind && $workspaceStore && loadItems()
let darkMode: boolean = false
function onThemeChange() {
if (document.documentElement.classList.contains('dark')) {
darkMode = true
} else {
darkMode = false
}
}
onMount(() => {
onThemeChange()
})
</script>
<DarkModeObserver on:change={onThemeChange} />
<Drawer bind:this={drawerViewer} size="900px">
<DrawerContent title="Script {scriptPath}" on:close={drawerViewer.closeDrawer}>
<HighlightCode {code} language={lang} />
@@ -105,7 +121,9 @@
{items}
placeholder="Pick a {itemKind}"
inputStyles={SELECT_INPUT_DEFAULT_STYLE.inputStyles}
containerStyles={SELECT_INPUT_DEFAULT_STYLE.containerStyles}
containerStyles={darkMode
? SELECT_INPUT_DEFAULT_STYLE.containerStylesDark
: SELECT_INPUT_DEFAULT_STYLE.containerStyles}
portal={false}
/>
{/if}
@@ -61,7 +61,7 @@
{/each}
</div>
{:else}
<div class="text-sm text-gray-500">No items</div>
<div class="text-sm text-tertiary">No items</div>
{/if}
{:else}
<Skeleton layout={[[40], [40], [40], [40], [40]]} />
@@ -76,7 +76,7 @@
<FlowModuleScript path={scriptPath} hash={selectedVersion} />
{/key}
{:else}
<div class="text-sm p-2 text-gray-500">Select a deployment version to see its details</div>
<div class="text-sm p-2 text-tertiary">Select a deployment version to see its details</div>
{/if}
</div>
</Pane>
@@ -23,17 +23,6 @@
import libStdContent from '$lib/es5.d.ts.txt?raw'
import { buildWorkerDefinition } from 'monaco-editor-workers'
meditor.defineTheme('myTheme', {
base: 'vs',
inherit: true,
rules: [],
colors: {
'editorLineNumber.foreground': '#999',
'editorGutter.background': '#F9FAFB'
}
})
meditor.setTheme('myTheme')
languages.typescript.javascriptDefaults.setCompilerOptions({
target: languages.typescript.ScriptTarget.Latest,
allowNonTsExtensions: true,
@@ -77,7 +77,7 @@
<div class="my-2" />
{#if kind == 'pattern'}
<label for="input" class="mb-2 text-gray-700 text-xs">
<label for="input" class="mb-2 text-secondary text-xs">
Pattern (Regex)
<div class="flex flex-row">
<input
@@ -100,7 +100,7 @@
</div>
</label>
{:else if kind == 'enum'}
<label for="input" class="mb-2 text-gray-700 text-xs">
<label for="input" class="mb-2 text-secondary text-xs">
Enums
<div class="flex flex-col gap-1">
{#each enum_ || [] as e}
@@ -50,7 +50,7 @@
<DrawerContent overflow_y={false} title="Superadmin Settings" on:close={closeDrawer}>
<div class="flex flex-col h-full">
<div>
<div class="text-xs pt-1 text-gray-500 flex flex-col">
<div class="text-xs pt-1 text-tertiary flex flex-col">
<div>Windmill <Version /></div><div><Uptodate /></div>
</div>
@@ -65,7 +65,7 @@
</div>
<div class="mt-2 overflow-auto">
<TableCustom>
<tr slot="header-row" class="sticky top-0 bg-white border-b">
<tr slot="header-row" class="sticky top-0 bg-surface border-b">
<th>email</th>
<th>auth</th>
<th>name</th>
@@ -14,7 +14,7 @@
-->
<div class="flex flex-col {$$props.class} min-w-full">
<div class="inline-block min-w-full py-2 align-middle">
<table class="table-custom min-w-full table-auto divide-y divide-gray-300">
<table class="table-custom min-w-full table-auto divide-y">
<thead>
<slot name="header-row" />
</thead>
@@ -22,7 +22,7 @@
</table>
</div>
{#if paginated}
<div class="sticky flex flex-row-reverse text-gray-500 mb-6">
<div class="sticky flex flex-row-reverse text-tertiary mb-6">
<button
class="ml-2 drop-shadow-md {showNext ? 'visible' : 'invisible'}"
on:click={() => dispatch('next')}
@@ -13,13 +13,13 @@
<div class="mt-2 flex flex-col {$$props.class}">
<div class="inline-block min-w-full align-middle">
<table class="min-w-full divide-y divide-gray-300 table-auto">
<table class="min-w-full divide-y table-auto">
<thead>
<tr class={twTextSize}>
{#if headers}
{#each headers as header, i}
<th
class="py-3.5 text-left text-sm font-semibold text-gray-900 capitalize {i == 0
class="py-3.5 text-left text-sm font-semibold text-primary capitalize {i == 0
? 'sm:pl-6 md:pl-0 pl-4 pr-3'
: 'px-3 '}">{header}</th
>
@@ -27,13 +27,13 @@
{/if}
</tr>
</thead>
<tbody class="divide-y divide-gray-200">
<tbody class="divide-y">
{#if data && keys && data.length > 0}
{#each data as row}
<tr>
{#each keys as key, i}
<td
class="py-2 text-sm text-gray-700 break-words {i == 0
class="py-2 text-sm text-secondary break-words {i == 0
? 'pl-4 pr-3 sm:pl-6 md:pl-0 font-semibold'
: 'px-3'} {twTextSize}"
>
@@ -52,7 +52,7 @@
</div>
</div>
{#if paginated}
<div class="flex flex-row-reverse text-gray-500">
<div class="flex flex-row-reverse text-tertiary">
<button
on:click={() => {
dispatch('next')
@@ -369,17 +369,6 @@
languages.setLanguageConfiguration('template', conf)
meditor.defineTheme('myTheme', {
base: 'vs',
inherit: true,
rules: [],
colors: {
'editorLineNumber.foreground': '#999',
'editorGutter.background': '#F9FAFB'
}
})
meditor.setTheme('myTheme')
let divEl: HTMLDivElement | null = null
let editor: meditor.IStandaloneCodeEditor
let model: meditor.ITextModel
+7 -5
View File
@@ -24,7 +24,7 @@
</script>
<div
class="pointer-events-auto w-full max-w-sm overflow-hidden bg-white shadow-lg ring-1 ring-black ring-opacity-5 border"
class="pointer-events-auto w-full max-w-sm overflow-hidden bg-surface shadow-lg ring-1 ring-black ring-opacity-5 border"
>
<div class="p-2 min-h-[60px] flex flex-col">
<div class="flex items-start w-full">
@@ -36,9 +36,11 @@
{/if}
</div>
<div class="ml-3 flex-1 w-0">
<p class="text-sm text-gray-500">{message}</p>
<p class="text-sm text-secondary">{message}</p>
{#if errorMessage}
<p class="text-sm text-gray-500 border bg-gray-50 p-2 w-full overflow-auto mt-2">
<p
class="text-sm text-secondary border bg-surface-secondary p-2 w-full overflow-auto mt-2"
>
{errorMessage}
</p>
{/if}
@@ -48,7 +50,7 @@
<button
type="button"
on:click={handleClose}
class="inline-flex rounded-md bg-white text-gray-400 hover:text-gray-500 focus:outline-none"
class="inline-flex rounded-md bg-surface-secondary text-gray-400 hover:text-tertiary focus:outline-none"
>
<span class="sr-only">Close</span>
<svg class="h-5 w-5" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true">
@@ -66,7 +68,7 @@
action.callback()
toast.pop(toastId)
}}
class="text-sm !text-black"
class="text-sm !text-primary"
>
{action.label}
</Button>
+3 -3
View File
@@ -31,7 +31,7 @@
<span
class={twMerge(
'mr-2 font-medium duration-50',
disabled ? 'text-gray-500' : 'text-gray-900',
disabled ? 'text-disabled' : 'text-primary',
size === 'xs' ? 'text-xs' : 'text-sm',
textClass
)}
@@ -57,7 +57,7 @@
/>
<div
class={classNames(
"transition-all bg-gray-200 rounded-full peer peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:bg-white after:border-white after:border after:rounded-full after:transition-all ",
"transition-all bg-surface-selected rounded-full peer peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:bg-white after:border-white after:border after:rounded-full after:transition-all ",
color == 'red' ? 'peer-checked:bg-red-600' : 'peer-checked:bg-blue-600',
size === 'sm'
? 'w-11 h-6 after:top-0.5 after:left-[2px] after:h-5 after:w-5'
@@ -69,7 +69,7 @@
<span
class={twMerge(
'ml-2 font-medium duration-50',
disabled ? 'text-gray-500' : 'text-gray-900',
disabled ? 'text-disabled' : 'text-primary',
size === 'xs' ? 'text-xs' : 'text-sm',
textClass
)}
@@ -1,17 +1,14 @@
<script lang="ts">
import { faBuilding } from '@fortawesome/free-solid-svg-icons'
import { ToggleButton, ToggleButtonGroup } from './common'
import { WindmillIcon } from './icons'
import ToggleButtonGroup from './common/toggleButton-v2/ToggleButtonGroup.svelte'
import ToggleButton from './common/toggleButton-v2/ToggleButton.svelte'
import { Building } from 'lucide-svelte'
export let selected: 'hub' | 'workspace' = 'hub'
</script>
<div class="max-w-min">
<ToggleButtonGroup bind:selected>
<ToggleButton position="left" value="hub" size="sm">
<WindmillIcon white={selected == 'hub'} height="16px" width="16px" /><div class="mr-1" />Hub
</ToggleButton>
<ToggleButton position="right" value="workspace" size="sm" startIcon={{ icon: faBuilding }}>
Workspace
</ToggleButton>
<ToggleButton value="hub" icon={WindmillIcon} label="Hub" />
<ToggleButton value="workspace" icon={Building} label="Workspace" />
</ToggleButtonGroup>
</div>
+2 -2
View File
@@ -15,8 +15,8 @@
<Popover notClickable {placement} class={wrapperClass}>
<Icon
class="{light
? 'text-gray-400 hover:text-gray-500'
: ' text-gray-500 hover:text-gray-600'} cursor-pointer transition-all font-thin flex h-4 p-0.5 w-4 justify-center items-center {$$props.class}"
? 'text-gray-400 dark:text-gray-200 hover:text-tertiary dark:hover:text-gray-300'
: ' text-tertiary dark:text-gray-300 hover:text-tertiary dark:hover:text-gray-400'} cursor-pointer transition-all font-thin flex h-4 p-0.5 w-4 justify-center items-center {$$props.class}"
data={faInfoCircle}
{scale}
/>
+2 -2
View File
@@ -24,6 +24,6 @@
How to update?<br />
- docker: `docker compose up`<br />-
<a href="https://github.com/windmill-labs/windmill-helm-charts#install">helm</a>
</Tooltip></span
>
</Tooltip>
</span>
{/if}
@@ -92,7 +92,7 @@
<DrawerContent title="User Settings" on:close={closeDrawer}>
<div class="flex flex-col h-full">
<div>
<div class="text-xs pt-1 pb-2 text-gray-500 flex-col flex">
<div class="text-xs pt-1 pb-2 text-tertiary flex-col flex">
Windmill <Version />
</div>
@@ -104,8 +104,8 @@
{/if}
<div class="flex flex-col gap-2 w-full">
<div class="mt-4">
<label class="block w-60 mb-2 text-gray-500">
<div class="text-gray-700">email</div>
<label class="block w-60 mb-2 text-tertiary">
<div class="text-secondary">email</div>
<input
type="text"
disabled
@@ -115,7 +115,7 @@
</label>
{#if login_type == 'password'}
<label class="block w-120">
<div class="text-gray-700">password</div>
<div class="text-secondary">password</div>
<input
type="password"
bind:value={newPassword}
@@ -162,7 +162,7 @@
</Button>
</div>
</div>
<div class="text-2xs text-gray-500 italic pb-6">
<div class="text-2xs text-tertiary italic pb-6">
Authentify to the Windmill API with access tokens.
</div>
@@ -186,7 +186,7 @@
<div
class="{displayCreateToken
? ''
: 'hidden'} py-3 px-3 border rounded-md mb-6 bg-gray-50 min-w-min"
: 'hidden'} py-3 px-3 border rounded-md mb-6 bg-surface-secondary min-w-min"
>
<h3 class="pb-3 font-semibold">Add a new token</h3>
{#if scopes != undefined}
@@ -207,13 +207,13 @@
<div class="flex flex-row flex-wrap gap-x-2 w-full justify-between">
<div class="flex flex-col">
<label for="label"
>Label <span class="text-xs text-gray-500">(optional)</span></label
>Label <span class="text-xs text-tertiary">(optional)</span></label
>
<input type="text" bind:value={newTokenLabel} />
</div>
<div class="flex flex-col">
<label for="expires"
>Expires In &nbsp;<span class="text-xs text-gray-500">(optional)</span>
>Expires In &nbsp;<span class="text-xs text-tertiary">(optional)</span>
</label>
<select bind:value={newTokenExpiration}>
<option value={undefined}>No expiration</option>
@@ -257,7 +257,7 @@
{/each}
{:else if tokens && tokens.length === 0}
<tr class="px-6"
><td class="text-gray-700 italic text-xs"> There are no tokens yet</td></tr
><td class="text-secondary italic text-xs"> There are no tokens yet</td></tr
>
{:else}
<tr> Loading...</tr>
@@ -5,7 +5,7 @@
import { userStore, workspaceStore } from '$lib/stores'
import Required from './Required.svelte'
import Tooltip from './Tooltip.svelte'
import { Button, ToggleButton, ToggleButtonGroup } from './common'
import { Button } from './common'
import Drawer from './common/drawer/Drawer.svelte'
import DrawerContent from './common/drawer/DrawerContent.svelte'
import Alert from './common/alert/Alert.svelte'
@@ -15,6 +15,8 @@
import SimpleEditor from './SimpleEditor.svelte'
import { sendUserToast } from '$lib/toast'
import { canWrite, isOwner } from '$lib/utils'
import ToggleButtonGroup from './common/toggleButton-v2/ToggleButtonGroup.svelte'
import ToggleButton from './common/toggleButton-v2/ToggleButton.svelte'
const dispatch = createEventDispatcher()
@@ -144,7 +146,7 @@
>
</div>
{/if}
<span class="font-semibold text-gray-700">Path</span>
<span class="font-semibold text-secondary">Path</span>
<Path
disabled={initialPath != '' && !isOwner(initialPath, $userStore, $workspaceStore)}
bind:error={pathError}
@@ -173,10 +175,10 @@
<div>
<div class="mb-1">
<span class="font-semibold text-gray-700">Variable value</span>
<span class="text-sm text-gray-500 mr-4"
>({variable.value.length}/{MAX_VARIABLE_LENGTH} characters)</span
>
<span class="font-semibold text-secondary">Variable value</span>
<span class="text-sm text-tertiary mr-4">
({variable.value.length}/{MAX_VARIABLE_LENGTH} characters)
</span>
{#if edit && variable.is_secret}<Button
variant="border"
size="xs"
@@ -184,7 +186,12 @@
>Load secret value<Tooltip>Will generate an audit log</Tooltip></Button
>{/if}
</div>
<div class="flex flex-row">
<div class="flex flex-col gap-2">
<ToggleButtonGroup bind:selected={editorKind}>
<ToggleButton value="plain" label="Plain" />
<ToggleButton value="json" label="Json" />
<ToggleButton value="yaml" label="YAML" />
</ToggleButtonGroup>
{#if editorKind == 'plain'}
<textarea
disabled={!can_write}
@@ -215,18 +222,12 @@
/>
</div>
{/if}
<ToggleButtonGroup col bind:selected={editorKind}>
<ToggleButton light position="center" value="plain" size="xs">Plain</ToggleButton>
<ToggleButton light position="center" value="json" size="xs">Json</ToggleButton>
<ToggleButton light position="center" value="yaml" size="xs">YAML</ToggleButton>
</ToggleButtonGroup>
</div>
</div>
<!-- {/if} -->
<div>
<div class="mb-1 font-semibold text-gray-700">
<div class="mb-1 font-semibold text-secondary">
Description
<Required required={false} />
</div>
+3 -1
View File
@@ -10,4 +10,6 @@
}
</script>
{version}
<div class="text-secondary text-xs">
{version}
</div>
@@ -20,7 +20,7 @@
{#if ips}
<div class="mt-2" />
<Alert size="xs" type="info" title="IPs to whitelist">
<span class="text-gray-600">If necessary, the workers IPs to whitelist are:</span>
<span class="text-tertiary">If necessary, the workers IPs to whitelist are:</span>
{ips.join(', ')}
</Alert>
{/if}
@@ -11,7 +11,7 @@
<div class="w-full h-full">
<div
out:fade|local={{ duration: 50 }}
class="absolute inset-0 center-center flex-col bg-white text-gray-600 border"
class="absolute inset-0 center-center flex-col bg-white text-tertiary border"
>
<Loader2 class="animate-spin" size={16} />
<span class="text-xs mt-1">Loading</span>
@@ -8,7 +8,7 @@
<div class="flex gap-2 flex-col">
<div>This component is expecting a connected input: </div>
<div>
<code class="bg-gray-50 border text-gray-600">{input.connection?.path} </code>
<code class="bg-gray-50 border text-tertiary">{input.connection?.path} </code>
</div>
</div>
{/if}
@@ -107,7 +107,7 @@
selectedStyle={css?.selectedTab?.style}
disabled={resolvedDisabledTabs[index]}
>
<span class="font-semibold">{res}</span>
<span class="font-semibold text-primary">{res}</span>
</Tab>
{/each}
</Tabs>
@@ -243,7 +243,7 @@
$focusedGrid = undefined
}}
class={twMerge(
'bg-gray-100 h-full w-full relative',
'bg-white h-full w-full relative',
$appStore.css?.['app']?.['viewer']?.class
)}
style={$appStore.css?.['app']?.['viewer']?.style}
@@ -308,7 +308,7 @@
<SettingsPanel />
<SecondaryMenu />
{:else}
<div class="min-w-[150px] text-sm text-gray-500 text-center py-8 px-2">
<div class="min-w-[150px] text-sm text-secondary text-center py-8 px-2">
Select a component to see the settings&nbsp;for&nbsp;it
</div>
{/if}
@@ -106,12 +106,12 @@
<svelte:window on:hashchange={hashchange} on:resize={resizeWindow} />
<div class="relative">
<div class="relative h-full">
<div id="app-editor-top-level-drawer" />
<div id="app-editor-select" />
<div
class="{$$props.class} {lockedClasses} {width} h-full {app.fullscreen
class="{$$props.class} {lockedClasses} {width} light h-full bg-white {app.fullscreen
? ''
: 'max-w-6xl'} mx-auto"
>
@@ -47,7 +47,7 @@
{/each}
</div>
{:else}
<div class="text-sm text-gray-500">No items</div>
<div class="text-sm text-tertiary">No items</div>
{/if}
</div>
</PanelSection>
@@ -73,7 +73,7 @@
<Skeleton layout={[[40]]} />
{/if}
{:else}
<div class="text-sm p-2 text-gray-500">Select a deployment version to see its details</div>
<div class="text-sm p-2 text-tertiary">Select a deployment version to see its details</div>
{/if}
</div>
</Pane>
@@ -47,15 +47,15 @@
<div
class="w-full sticky top-0 flex justify-between border-b {$connectingInput?.opened
? ''
: 'bg-gray-50 '} px-4 py-1 items-center gap-4"
: 'bg-surface'} px-4 py-1 items-center gap-4"
style="z-index: 1000;"
>
<h2 class="truncate">{$summary}</h2>
{#if !$connectingInput.opened}
<RecomputeAllComponents />
{/if}
<div class="flex text-2xs text-gray-600 gap-8 items-center">
<div class="py-2 pr-2 text-gray-600 flex gap-1 items-center">
<div class="flex text-2xs gap-8 items-center">
<div class="py-2 pr-2 text-secondary flex gap-1 items-center">
Hide bar on view
<Toggle size="xs" bind:checked={$app.norefreshbar} />
</div>
@@ -121,7 +121,7 @@
<ButtonDropdown hasPadding={true}>
<svelte:fragment slot="label">
<span
class={classNames('text-xs min-w-[2rem]', interval ? 'text-blue-500' : 'text-gray-600')}
class={classNames('text-xs min-w-[2rem]', interval ? 'text-blue-500' : 'text-tertiary')}
>
{interval ? `${interval / 1000}s` : 'once'}
</span>
@@ -139,7 +139,7 @@
>
<div
class={classNames(
'!text-gray-600 text-left px-4 py-2 gap-2 cursor-pointer hover:bg-gray-100 !text-xs font-semibold'
'!text-tertiary text-left px-4 py-2 gap-2 cursor-pointer hover:bg-gray-100 !text-xs font-semibold'
)}
>
{#if index === 0}
@@ -39,7 +39,7 @@
>
<div
class={classNames(
'!text-gray-600 text-left px-4 py-2 gap-2 cursor-pointer hover:bg-gray-100 !text-xs font-semibold'
'!text-tertiary text-left px-4 py-2 gap-2 cursor-pointer hover:bg-gray-100 !text-xs font-semibold'
)}
>
{#if index === tabs.length - 1}
@@ -66,7 +66,7 @@
}))
</script>
<section class="p-2 sticky bg-white w-full z-10 top-0">
<section class="p-2 sticky w-full z-10 top-0">
<ClearableInput bind:value={search} placeholder="Search components..." />
</section>
@@ -75,7 +75,7 @@
<div
in:fade|local={{ duration: 50, delay: 50 }}
out:fade|local={{ duration: 50 }}
class="absolute left-0 top-0 w-full text-sm text-gray-500 text-center py-6 px-2"
class="absolute left-0 top-0 w-full text-sm text-tertiary text-center py-6 px-2"
>
No components found
</div>
@@ -92,11 +92,11 @@
on:click={() => addComponent(item)}
title={componentsRecord[item].name}
class="transition-all border w-20 shadow-sm h-16 p-2 flex flex-col gap-2 items-center
justify-center bg-white rounded-md hover:bg-blue-50 duration-200 hover:border-blue-500"
justify-center bg-surface rounded-md hover:bg-blue-50 dark:hover:bg-blue-900 duration-200 hover:border-blue-500"
>
<svelte:component this={componentsRecord[item].icon} class="text-gray-600" />
<svelte:component this={componentsRecord[item].icon} class="text-primary" />
</button>
<div class="text-xs text-center flex-wrap text-gray-600 mt-1">
<div class="text-xs text-center flex-wrap text-secondary mt-1">
{componentsRecord[item].name}
</div>
</div>
@@ -108,14 +108,14 @@
on:click={() => addPresetComponent(presetItem)}
title={presetsRecord[presetItem].name}
class="transition-all border w-20 shadow-sm h-16 p-2 flex flex-col gap-2 items-center
justify-center bg-white rounded-md hover:bg-blue-50 duration-200 hover:border-blue-500"
justify-center bg-surface rounded-md hover:bg-blue-50 dark:hover:bg-blue-900 duration-200 hover:border-blue-500"
>
<svelte:component
this={presetsRecord[presetItem].icon}
class="text-gray-600"
class="text-secondary"
/>
</button>
<div class="text-xs text-center flex-wrap text-gray-600 mt-1">
<div class="text-xs text-center flex-wrap text-secondary mt-1">
{presetsRecord[presetItem].name}
</div>
</div>
@@ -30,20 +30,20 @@
</script>
<div
class="sticky top-0 z-20 text-lg bg-gray-100 font-semibold lowercase leading-none [font-variant:small-caps] text-gray-700 px-3 pb-1 mt-4 mb-1"
class="sticky top-0 z-20 text-lg bg-surface-secondary font-semibold lowercase leading-none [font-variant:small-caps] text-secondary px-3 pb-1 mt-4 mb-1"
>
{addWhitespaceBeforeCapitals(name)}
</div>
{#if value}
<div class="px-3">
{#if tooltip}
<div class="text-gray-600 text-2xs py-2">{tooltip}</div>
<div class="text-tertiary text-2xs py-2">{tooltip}</div>
{/if}
{#if value.style !== undefined || forceStyle}
<div class="pb-2">
<!-- svelte-ignore a11y-label-has-associated-control -->
<label class="block">
<div class="text-sm font-medium text-gray-600 pb-0.5"> Plain CSS </div>
<div class="text-sm font-medium text-tertiary pb-0.5"> Plain CSS </div>
<div class="flex gap-1">
<div class="relative grow">
<ClearableInput
@@ -91,7 +91,7 @@
{#if value.class !== undefined || forceClass}
<!-- svelte-ignore a11y-label-has-associated-control -->
<label class="block">
<div class="text-sm font-medium text-gray-600 pb-0.5">
<div class="text-sm font-medium text-tertiary pb-0.5">
Tailwind classes<Tooltip documentationLink="https://tailwindcss.com/"
>Use any tailwind classes to style your component</Tooltip
></div
@@ -69,7 +69,7 @@
let search = ''
</script>
<!-- <div class="w-full text-lg font-semibold text-center text-gray-600 p-2">Global Styling</div> -->
<!-- <div class="w-full text-lg font-semibold text-center text-tertiary p-2">Global Styling</div> -->
<Tabs selected="ui" on:selected={(e) => switchTab(e.detail === 'json')} class="h-full">
<Tab value="ui" size="xs" class="w-1/2">
<div class="m-1 center-center">
@@ -30,8 +30,8 @@
{#if prefix !== undefined}
<button
on:click|preventDefault={() => isOpenStore.toggle(storeTitle)}
class="w-full flex justify-between items-center text-gray-700 px-2 py-1
rounded-sm duration-200 hover:bg-gray-100 {toggleClasses}"
class="w-full flex justify-between items-center text-secondary px-2 py-1
rounded-sm duration-200 hover:bg-surface-hover {toggleClasses}"
>
<h1 class="text-sm font-semibold text-left">
<slot name="title">
@@ -46,7 +46,7 @@
</div>
{/if}
{:else}
<h1 class="text-sm font-semibold text-left px-2 py-1 text-gray-600">
<h1 class="text-sm font-semibold text-left px-2 py-1 text-secondary">
<slot name="title">
{title}
</slot>
@@ -188,7 +188,7 @@
{isOpen[prefix] ? '!bg-gray-100 hover:!bg-gray-200' : ''}"
>
<svelte:fragment slot="title">
<span class="font-semibold text-gray-600 capitalize">
<span class="font-semibold text-tertiary capitalize">
{group}
</span>
</svelte:fragment>
@@ -200,7 +200,7 @@
} = styleStore.getProp(p)}
{#if prop !== undefined && index !== undefined}
<div class="pb-2 pt-1">
<div class="text-sm font-medium text-gray-600 pb-0.5">
<div class="text-sm font-medium text-tertiary pb-0.5">
{formatKebabCase(prop.key)}
</div>
<div class="flex items-center gap-1">
@@ -49,7 +49,7 @@
<div class={inline && type !== StylePropertyType.color ? '' : 'w-full'}>
{#if prop.value['title']}
<div class="font-medium text-xs text-gray-500">
<div class="font-medium text-xs text-tertiary">
{prop.value['title']}
</div>
{/if}
@@ -47,8 +47,8 @@
pureViewer={!$connectingInput.opened}
/>
{:else if $search.length > 0}
<div class="text-xs pl-2 text-gray-600">No results</div>
<div class="text-xs pl-2 text-tertiary">No results</div>
{:else}
<div class="text-xs pl-2 text-gray-600">No outputs</div>
<div class="text-xs pl-2 text-tertiary">No outputs</div>
{/if}
{/if}
@@ -20,18 +20,20 @@
<PanelSection noPadding titlePadding="px-2 pt-2" title="Outputs">
<div
class={classNames(
'bg-white w-full h-full z-30',
$connectingInput.opened ? 'border-blue-500 border-t-2 border-r-2 bg-blue-50/50 z-50' : ''
'bg-surface w-full h-full z-30',
$connectingInput.opened
? 'border-blue-500 border-t-2 border-r-2 bg-blue-50/50 dark:bg-frost-900/50 z-50'
: ''
)}
>
<div class="min-w-[150px]">
<div class="sticky z-10 top-0 left-0 w-full bg-white p-1.5">
<div class="sticky z-10 top-0 left-0 w-full p-1.5">
<ClearableInput bind:value={$search} placeholder="Search outputs..." />
</div>
<div class="flex flex-col gap-4">
<div>
<span class="text-xs font-semibold text-gray-800 p-2">State & Context</span>
<span class="text-xs font-semibold text-secondary p-2">State & Context</span>
<OutputHeader selectable={false} id={'ctx'} name={'App Context'} first color="blue">
<ComponentOutputViewer
@@ -60,13 +62,13 @@
</div>
<div>
<span class="text-xs font-semibold text-gray-800 p-2">Components</span>
<span class="text-xs font-semibold text-secondary p-2">Components</span>
{#each $app.grid as gridItem, index (gridItem.id)}
<ComponentOutput {gridItem} first={index === 0} />
{/each}
</div>
<div>
<span class="text-xs font-semibold text-gray-800 p-2">Background runnables</span>
<span class="text-xs font-semibold text-secondary p-2">Background runnables</span>
<BackgroundScriptsOutput />
</div>
</div>
@@ -76,7 +76,7 @@
/>
{/each}
{:else}
<div class="text-xs text-gray-500 border-y border-l p-1">No components</div>
<div class="text-xs text-tertiary border-y border-l p-1">No components</div>
{/if}
</div>
{/if}

Some files were not shown because too many files have changed in this diff Show More