diff --git a/web/apps/labelstudio/src/pages/CreateProject/Import/Import.jsx b/web/apps/labelstudio/src/pages/CreateProject/Import/Import.jsx index 3dc9c7450f57..97737eb9be70 100644 --- a/web/apps/labelstudio/src/pages/CreateProject/Import/Import.jsx +++ b/web/apps/labelstudio/src/pages/CreateProject/Import/Import.jsx @@ -493,19 +493,28 @@ export const ImportPage = ({ {ff.isFF(ff.FF_JSON_PREVIEW) && (
{projectConfigured ? ( - + {sampleConfig.data ? ( - +
+ +
) : sampleConfig.isLoading ? (
) : sampleConfig.isError ? ( -
Unable to load sample data
+
+ Something went wrong, the sample data could not be loaded. +
) : null}
) : ( diff --git a/web/apps/labelstudio/src/pages/CreateProject/Import/Import.scss b/web/apps/labelstudio/src/pages/CreateProject/Import/Import.scss index fff29f709ac0..7c91b43498fb 100644 --- a/web/apps/labelstudio/src/pages/CreateProject/Import/Import.scss +++ b/web/apps/labelstudio/src/pages/CreateProject/Import/Import.scss @@ -1,3 +1,34 @@ +// Custom scrollbar styling mixin +@mixin custom-scrollbar { + scrollbar-color: var(--color-neutral-border-bold) transparent; + scrollbar-width: thin; + + &::-webkit-scrollbar { + width: 6px; + height: 6px; + background-color: var(--color-neutral-surface); + } + + &::-webkit-scrollbar-track { + background: var(--color-neutral-surface); + border-radius: 3px; + } + + &::-webkit-scrollbar-thumb { + background: var(--color-neutral-border-bold); + border-radius: 3px; + transition: background-color 0.2s ease; + + &:hover { + background: var(--color-neutral-border-boldest); + } + } + + &::-webkit-scrollbar-corner { + background: var(--color-neutral-surface); + } +} + .upload_page { flex: 1; min-height: 0; @@ -75,6 +106,8 @@ } & > main { + @include custom-scrollbar; + flex: 1; overflow-y: auto; background: linear-gradient(var(--color-neutral-background) 30%, rgb(255 255 255 / 0%)), linear-gradient(rgb(0 0 0 / 10%), var(--color-neutral-background) 100%); @@ -123,6 +156,22 @@ background: rgb(255 255 255 / 50%); } + &__code-wrapper { + padding: 0 var(--spacing-base) var(--spacing-base); + height: calc(100% - var(--spacing-tight)); + + & > div { + @include custom-scrollbar; + + height: 100%; + overflow-y: auto; + font-size: var(--font-size-14); + color: var(--color-neutral-content-subtle); + box-shadow: inset 0 2px 8px rgba(var(--color-neutral-shadow-raw) / 12%); + border: 1px solid var(--color-neutral-border); + } + } + &__upload-button { display: flex; align-items: center; @@ -186,7 +235,8 @@ .dropzone { padding: 0 32px 32px; margin: 0; - min-height: 100%; + min-height: 600px; + height: 100%; position: relative; display: flex; diff --git a/web/libs/ui/src/lib/code-block/code-block.tsx b/web/libs/ui/src/lib/code-block/code-block.tsx index abe75b36b75b..a0a92e3aba3c 100644 --- a/web/libs/ui/src/lib/code-block/code-block.tsx +++ b/web/libs/ui/src/lib/code-block/code-block.tsx @@ -1,5 +1,6 @@ export function CodeBlock({ code, + className, }: { title?: string; description?: string; @@ -7,6 +8,8 @@ export function CodeBlock({ className?: string; }) { return ( -
{code.trim()}
+
+ {code.trim()} +
); } diff --git a/web/libs/ui/src/lib/simple-card/index.tsx b/web/libs/ui/src/lib/simple-card/index.tsx index f7df2c3e211a..92099096776f 100644 --- a/web/libs/ui/src/lib/simple-card/index.tsx +++ b/web/libs/ui/src/lib/simple-card/index.tsx @@ -6,21 +6,34 @@ export function SimpleCard({ children, title, description, + flushContent = false, + flushHeader = false, + headerClassName, + contentClassName, className: cls, ...rest }: PropsWithChildren< { title: ReactNode; description?: ReactNode; + flushContent?: boolean; + flushHeader?: boolean; + headerClassName?: string; + contentClassName?: string; } & Omit, "title"> >) { const className = cn("bg-transparent", cls); const hasHeaderContent = Boolean(title || description); - const contentClass = cn("p-4", { "pt-0": hasHeaderContent }); + const headerClass = cn(flushHeader ? "p-0" : "p-4 pb-2", headerClassName); + const contentClass = cn( + flushContent ? "p-0" : "p-4", + { "pt-0": hasHeaderContent && !flushContent }, + contentClassName, + ); return ( {hasHeaderContent && ( - + {title && {title}} {description && {description}}