refac
@@ -35,16 +35,6 @@ Then open [http://localhost:3000](http://localhost:3000).
|
||||
|
||||
For GPU support, Docker Compose, and more → [Full Docker guide](/getting-started/quick-start)
|
||||
|
||||
</TabItem>
|
||||
<TabItem value="uv" label="uv (Python)">
|
||||
|
||||
```bash
|
||||
curl -LsSf https://astral.sh/uv/install.sh | sh
|
||||
DATA_DIR=~/.open-webui uvx --python 3.11 open-webui@latest serve
|
||||
```
|
||||
|
||||
Then open [http://localhost:8080](http://localhost:8080).
|
||||
|
||||
</TabItem>
|
||||
<TabItem value="pip" label="pip">
|
||||
|
||||
@@ -53,6 +43,16 @@ pip install open-webui
|
||||
open-webui serve
|
||||
```
|
||||
|
||||
Then open [http://localhost:8080](http://localhost:8080).
|
||||
|
||||
</TabItem>
|
||||
<TabItem value="uv" label="uv">
|
||||
|
||||
```bash
|
||||
curl -LsSf https://astral.sh/uv/install.sh | sh
|
||||
DATA_DIR=~/.open-webui uvx --python 3.11 open-webui@latest serve
|
||||
```
|
||||
|
||||
Then open [http://localhost:8080](http://localhost:8080).
|
||||
|
||||
</TabItem>
|
||||
|
||||
@@ -1,28 +0,0 @@
|
||||
import { SidebarBanner } from "@site/src/components/Sponsors/SidebarBanner";
|
||||
import { useEffect, useState } from "react";
|
||||
|
||||
export const SidebarBanners = () => {
|
||||
const items = [
|
||||
{
|
||||
imgSrc: "/sponsors/banners/openwebui-banner.png",
|
||||
mobileImgSrc: "/sponsors/banners/openwebui-banner-mobile.png",
|
||||
url: "https://careers.openwebui.com",
|
||||
name: "Open WebUI",
|
||||
description: "",
|
||||
},
|
||||
];
|
||||
|
||||
// Randomly select an item to display
|
||||
const [selectedItemIdx, setSelectedItemIdx] = useState(
|
||||
Math.floor(Math.random() * items.length)
|
||||
);
|
||||
|
||||
useEffect(() => {
|
||||
// After mounting update every 5 seconds
|
||||
setInterval(() => {
|
||||
setSelectedItemIdx(Math.floor(Math.random() * items.length));
|
||||
}, 10000); // 10000 ms = 10 seconds
|
||||
}, []);
|
||||
|
||||
return <SidebarBanner item={items[selectedItemIdx]} />;
|
||||
};
|
||||
@@ -1,26 +0,0 @@
|
||||
import { marked } from "marked";
|
||||
|
||||
export const SidebarBanner = ({ item }) => {
|
||||
return (
|
||||
<div className="pb-4">
|
||||
<div className="mb-2">
|
||||
<div className="mb-1 text-xs font-medium text-gray-600 underline dark:text-gray-300">
|
||||
Sponsored by {item.name}
|
||||
</div>
|
||||
|
||||
<a href={item.url} target="_blank">
|
||||
<img
|
||||
className="block h-12 w-full rounded-xl object-cover"
|
||||
loading="lazy"
|
||||
alt={item.name}
|
||||
src={item?.mobileImgSrc || item.imgSrc}
|
||||
/>
|
||||
</a>
|
||||
|
||||
<div className="mt-1 line-clamp-2 text-right text-xs font-medium text-gray-600 dark:text-gray-300">
|
||||
<div dangerouslySetInnerHTML={{ __html: marked(item.description) }} />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
@@ -1,62 +0,0 @@
|
||||
import { marked } from "marked";
|
||||
|
||||
export const TopBanner = ({
|
||||
item,
|
||||
bannerClassName = "h-18",
|
||||
label = true,
|
||||
description = true,
|
||||
mobile = true,
|
||||
}) => {
|
||||
return (
|
||||
<div className="w-full">
|
||||
<div className="flex w-full flex-col justify-center">
|
||||
{label && (
|
||||
<div className="mb-1 text-xs font-semibold text-gray-600 underline dark:text-gray-300">
|
||||
Sponsored by {item.name}
|
||||
</div>
|
||||
)}
|
||||
|
||||
<a
|
||||
href={item.url}
|
||||
target="_blank"
|
||||
className="flex w-full items-center justify-center"
|
||||
>
|
||||
{mobile ? (
|
||||
<>
|
||||
<img
|
||||
className={`hidden w-full rounded-xl object-cover md:block ${bannerClassName}`}
|
||||
loading="lazy"
|
||||
alt={item.name}
|
||||
src={item.imgSrc}
|
||||
/>
|
||||
|
||||
<img
|
||||
className={`block w-full rounded-xl object-cover md:hidden ${bannerClassName}`}
|
||||
loading="lazy"
|
||||
alt={item.name}
|
||||
src={item?.mobileImgSrc || item.imgSrc}
|
||||
/>
|
||||
</>
|
||||
) : (
|
||||
<>
|
||||
<img
|
||||
className={`w-full rounded-xl object-cover ${bannerClassName}`}
|
||||
loading="lazy"
|
||||
alt={item.name}
|
||||
src={item.imgSrc}
|
||||
/>
|
||||
</>
|
||||
)}
|
||||
</a>
|
||||
|
||||
{description && (
|
||||
<div className="mt-1 line-clamp-1 text-right text-xs font-semibold text-gray-600 dark:text-gray-300">
|
||||
<div
|
||||
dangerouslySetInnerHTML={{ __html: marked(item.description) }}
|
||||
/>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
@@ -1,5 +1,4 @@
|
||||
import { TopBanner } from "@site/src/components/Sponsors/TopBanner";
|
||||
import { useEffect, useState } from "react";
|
||||
import { useState } from "react";
|
||||
|
||||
export const Testimonals = ({
|
||||
bannerClassName = "h-18",
|
||||
|
||||
@@ -1,50 +0,0 @@
|
||||
import { TopBanner } from "@site/src/components/Sponsors/TopBanner";
|
||||
import { useEffect, useState } from "react";
|
||||
|
||||
export const TopBanners = ({
|
||||
bannerClassName = "h-18",
|
||||
label = true,
|
||||
description = true,
|
||||
mobile = true,
|
||||
}) => {
|
||||
const items = [
|
||||
{
|
||||
imgSrc: "/sponsors/banners/openwebui-banner.png",
|
||||
mobileImgSrc: "/sponsors/banners/openwebui-banner-mobile.png",
|
||||
url: "https://docs.openwebui.com/enterprise",
|
||||
name: "Open WebUI",
|
||||
description:
|
||||
"Upgrade to a licensed plan for enhanced capabilities, including custom theming and branding, and dedicated support.",
|
||||
},
|
||||
{
|
||||
imgSrc: "/sponsors/banners/openwebui-banner.png",
|
||||
mobileImgSrc: "/sponsors/banners/openwebui-banner-mobile.png",
|
||||
url: "https://careers.openwebui.com",
|
||||
name: "Open WebUI",
|
||||
description:
|
||||
"**We are hiring!** Shape the way humanity engages with _intelligence_.",
|
||||
},
|
||||
];
|
||||
|
||||
// Randomly select an item to display
|
||||
const [selectedItemIdx, setSelectedItemIdx] = useState(
|
||||
Math.floor(Math.random() * items.length)
|
||||
);
|
||||
|
||||
useEffect(() => {
|
||||
// After mounting update every 5 seconds
|
||||
setInterval(() => {
|
||||
setSelectedItemIdx(Math.floor(Math.random() * items.length));
|
||||
}, 10000); // 10000 ms = 10 seconds
|
||||
}, []);
|
||||
|
||||
return (
|
||||
<TopBanner
|
||||
bannerClassName={bannerClassName}
|
||||
item={items[selectedItemIdx]}
|
||||
label={label}
|
||||
description={description}
|
||||
mobile={mobile}
|
||||
/>
|
||||
);
|
||||
};
|
||||
@@ -686,18 +686,6 @@ a.footer__link-item:hover {
|
||||
filter: invert(1);
|
||||
}
|
||||
|
||||
.hero--banner {
|
||||
padding: 8px !important;
|
||||
}
|
||||
|
||||
.hero--banner,
|
||||
.hero--banner a {
|
||||
margin: 0;
|
||||
color: #fff;
|
||||
background-color: #111;
|
||||
width: 100%;
|
||||
font-size: 13px;
|
||||
}
|
||||
|
||||
@media screen and (width >=997px) {
|
||||
.hero--container {
|
||||
@@ -733,10 +721,6 @@ a.footer__link-item:hover {
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
.hero--banner a {
|
||||
font-size: 0.8em;
|
||||
}
|
||||
|
||||
.homepage-svg svg {
|
||||
max-width: 120px;
|
||||
margin-left: 15px;
|
||||
|
||||
@@ -3,22 +3,8 @@ import DocSidebar from "@theme-original/DocSidebar";
|
||||
import type DocSidebarType from "@theme/DocSidebar";
|
||||
import type { WrapperProps } from "@docusaurus/types";
|
||||
|
||||
import { SidebarBanners } from "@site/src/components/SidebarBanners";
|
||||
|
||||
type Props = WrapperProps<typeof DocSidebarType>;
|
||||
|
||||
export default function DocSidebarWrapper(props: Props): JSX.Element {
|
||||
return (
|
||||
<>
|
||||
<div className="flex h-full flex-col overflow-auto">
|
||||
<div className="h-fit">
|
||||
<DocSidebar {...props} />
|
||||
</div>
|
||||
|
||||
<div className="mt-3 px-5">
|
||||
<SidebarBanners />
|
||||
</div>
|
||||
</div>
|
||||
</>
|
||||
);
|
||||
return <DocSidebar {...props} />;
|
||||
}
|
||||
|
||||
|
Before Width: | Height: | Size: 1.7 MiB |
|
Before Width: | Height: | Size: 2.2 MiB |
|
Before Width: | Height: | Size: 5.2 KiB |
|
Before Width: | Height: | Size: 7.6 KiB |
|
Before Width: | Height: | Size: 19 KiB |
|
Before Width: | Height: | Size: 24 KiB |
|
Before Width: | Height: | Size: 75 KiB |
|
Before Width: | Height: | Size: 54 KiB |
|
Before Width: | Height: | Size: 625 KiB |
|
Before Width: | Height: | Size: 1.3 MiB |