mirror of
https://github.com/hanzoai/s3.git
synced 2026-10-30 14:59:09 +00:00
hanzoai/s3 was an AGPL-3.0 MinIO fork whose network-copyleft blocks embedding
and reselling as a managed service. Replace it wholesale with a fork of
SeaweedFS (github.com/seaweedfs/seaweedfs, Apache-2.0, Go) which ships a
built-in S3 gateway + Filer.
- License: AGPL-3.0 -> Apache-2.0 (upstream LICENSE kept verbatim, incl.
"Copyright 2025 Chris Lu"); NOTICE added crediting SeaweedFS. No AGPL/BUSL/
SSPL/GPL or enterprise ("ee") files remain.
- Module: go.mod path set to github.com/hanzoai/s3 with a self-replace
(replace github.com/seaweedfs/seaweedfs => ./) so the ~1800 internal Go files
keep their upstream import paths with zero churn. Internal identifiers and
import paths are intentionally NOT renamed.
- CLI rebrand: the binary is built as `s3` (was `weed`); root usage, per-command
help/usage/flag strings, shell autocomplete program name, and the product name
in CLI output now read "Hanzo S3" / `s3`. Users never see `weed`.
(e.g. `s3 server`, `s3 filer`, `s3 master`, `s3 volume`, `s3 s3`, `s3 mount`.)
- Build: `make` (or `go build -o s3 ./weed`) builds the `s3` binary green;
`cmd/weed-db` and `cmd/weed-sql` also build; `go vet ./weed/command/` clean.
- README/LLM.md rewritten for Hanzo S3; AGENTS.md/CLAUDE.md symlinks preserved.
- Dropped a 33MB prebuilt Mach-O `stress` binary upstream had committed; `.gitignore`
updated to ignore the `s3` build output.
338 lines
5.6 KiB
CSS
338 lines
5.6 KiB
CSS
/* SeaweedFS Dashboard Custom Styles */
|
|
|
|
:root {
|
|
--navbar-height: 56px;
|
|
}
|
|
|
|
/* Link colors - muted */
|
|
a {
|
|
color: #5b7c99;
|
|
}
|
|
|
|
a:hover {
|
|
color: #4a6a88;
|
|
}
|
|
|
|
/* Sidebar Styles */
|
|
.sidebar {
|
|
position: fixed;
|
|
top: var(--navbar-height);
|
|
bottom: 0;
|
|
left: 0;
|
|
z-index: 100;
|
|
padding: 48px 0 0;
|
|
box-shadow: inset -1px 0 0 rgba(0, 0, 0, .1);
|
|
overflow-y: auto;
|
|
}
|
|
|
|
.sidebar-heading {
|
|
font-size: .75rem;
|
|
text-transform: uppercase;
|
|
}
|
|
|
|
.sidebar .nav-link {
|
|
font-weight: 500;
|
|
color: #333;
|
|
}
|
|
|
|
.sidebar .nav-link:hover {
|
|
color: #5b7c99;
|
|
}
|
|
|
|
.sidebar .nav-link.active {
|
|
color: #5b7c99;
|
|
}
|
|
|
|
.sidebar .nav-link:hover .feather,
|
|
.sidebar .nav-link.active .feather {
|
|
color: inherit;
|
|
}
|
|
|
|
/* Main content area */
|
|
main {
|
|
margin-left: 240px;
|
|
}
|
|
|
|
@media (max-width: 767.98px) {
|
|
.sidebar {
|
|
top: var(--navbar-height);
|
|
padding-top: 0;
|
|
width: 240px;
|
|
background-color: #f8f9fa !important;
|
|
z-index: 1050;
|
|
}
|
|
.sidebar.show ~ .sidebar-backdrop {
|
|
display: block;
|
|
}
|
|
main {
|
|
margin-left: 0;
|
|
}
|
|
}
|
|
|
|
/* Sidebar backdrop for mobile overlay */
|
|
.sidebar-backdrop {
|
|
display: none;
|
|
position: fixed;
|
|
top: var(--navbar-height);
|
|
left: 0;
|
|
right: 0;
|
|
bottom: 0;
|
|
background-color: rgba(0, 0, 0, 0.5);
|
|
z-index: 1040;
|
|
}
|
|
|
|
/* Custom card styles */
|
|
.border-left-primary {
|
|
border-left: 0.25rem solid #6b8caf !important;
|
|
}
|
|
|
|
.border-left-success {
|
|
border-left: 0.25rem solid #5a8a72 !important;
|
|
}
|
|
|
|
.border-left-info {
|
|
border-left: 0.25rem solid #6a9aaa !important;
|
|
}
|
|
|
|
.border-left-warning {
|
|
border-left: 0.25rem solid #b8995e !important;
|
|
}
|
|
|
|
.border-left-danger {
|
|
border-left: 0.25rem solid #a5615c !important;
|
|
}
|
|
|
|
/* Status badges */
|
|
.badge {
|
|
font-size: 0.875em;
|
|
}
|
|
|
|
/* Muted badge colors - override Bootstrap defaults */
|
|
.badge.bg-primary,
|
|
.bg-primary {
|
|
background-color: #6b8caf !important;
|
|
}
|
|
|
|
.badge.bg-success,
|
|
.bg-success {
|
|
background-color: #5a8a72 !important;
|
|
}
|
|
|
|
.badge.bg-info,
|
|
.bg-info {
|
|
background-color: #6a9aaa !important;
|
|
}
|
|
|
|
.badge.bg-warning,
|
|
.bg-warning {
|
|
background-color: #b8995e !important;
|
|
}
|
|
|
|
.badge.bg-danger,
|
|
.bg-danger {
|
|
background-color: #a5615c !important;
|
|
}
|
|
|
|
.badge.bg-secondary,
|
|
.bg-secondary {
|
|
background-color: #7a7d85 !important;
|
|
}
|
|
|
|
/* Muted card background colors for text-bg-* utility classes */
|
|
.text-bg-primary,
|
|
.card.text-bg-primary {
|
|
background-color: #6b8caf !important;
|
|
color: #fff !important;
|
|
}
|
|
|
|
.text-bg-success,
|
|
.card.text-bg-success {
|
|
background-color: #5a8a72 !important;
|
|
color: #fff !important;
|
|
}
|
|
|
|
.text-bg-info,
|
|
.card.text-bg-info {
|
|
background-color: #6a9aaa !important;
|
|
color: #fff !important;
|
|
}
|
|
|
|
.text-bg-warning,
|
|
.card.text-bg-warning {
|
|
background-color: #b8995e !important;
|
|
color: #fff !important;
|
|
}
|
|
|
|
.text-bg-danger,
|
|
.card.text-bg-danger {
|
|
background-color: #a5615c !important;
|
|
color: #fff !important;
|
|
}
|
|
|
|
/* Muted text color utilities */
|
|
.text-primary {
|
|
color: #6b8caf !important;
|
|
}
|
|
|
|
.text-success {
|
|
color: #5a8a72 !important;
|
|
}
|
|
|
|
.text-info {
|
|
color: #6a9aaa !important;
|
|
}
|
|
|
|
.text-warning {
|
|
color: #b8995e !important;
|
|
}
|
|
|
|
.text-danger {
|
|
color: #a5615c !important;
|
|
}
|
|
|
|
/* Progress bars */
|
|
.progress {
|
|
background-color: #f8f9fc;
|
|
border: 1px solid #e3e6f0;
|
|
}
|
|
|
|
.progress-bar {
|
|
font-size: 0.75rem;
|
|
font-weight: 700;
|
|
color: #fff;
|
|
text-align: center;
|
|
}
|
|
|
|
/* Tables */
|
|
.table {
|
|
color: #5a5c69;
|
|
}
|
|
|
|
.table thead th {
|
|
vertical-align: bottom;
|
|
border-bottom: 1px solid #e3e6f0;
|
|
font-weight: 700;
|
|
color: #5a5c69;
|
|
background-color: #f8f9fc;
|
|
}
|
|
|
|
.table-bordered {
|
|
border: 1px solid #e3e6f0;
|
|
}
|
|
|
|
.table-bordered th,
|
|
.table-bordered td {
|
|
border: 1px solid #e3e6f0;
|
|
}
|
|
|
|
/* Cards */
|
|
.card {
|
|
box-shadow: 0 0.15rem 1.75rem 0 rgba(58, 59, 69, 0.15) !important;
|
|
border: 1px solid #e3e6f0;
|
|
}
|
|
|
|
.card-header {
|
|
background-color: #f8f9fc;
|
|
border-bottom: 1px solid #e3e6f0;
|
|
}
|
|
|
|
/* Buttons */
|
|
.btn-primary {
|
|
background-color: #6b8caf;
|
|
border-color: #6b8caf;
|
|
}
|
|
|
|
.btn-primary:hover {
|
|
background-color: #5b7c99;
|
|
border-color: #5b7c99;
|
|
}
|
|
|
|
/* Text utilities */
|
|
.text-gray-800 {
|
|
color: #5a5c69 !important;
|
|
}
|
|
|
|
.text-gray-300 {
|
|
color: #dddfeb !important;
|
|
}
|
|
|
|
/* Animation for HTMX updates */
|
|
.htmx-indicator {
|
|
opacity: 0;
|
|
transition: opacity 500ms ease-in;
|
|
}
|
|
|
|
.htmx-request .htmx-indicator {
|
|
opacity: 1;
|
|
}
|
|
|
|
.htmx-request.htmx-indicator {
|
|
opacity: 1;
|
|
}
|
|
|
|
/* Loading spinner */
|
|
.spinner-border-sm {
|
|
width: 1rem;
|
|
height: 1rem;
|
|
}
|
|
|
|
/* Custom utilities */
|
|
.bg-gradient-primary {
|
|
background: linear-gradient(180deg, #6b8caf 10%, #5b7c99 100%);
|
|
}
|
|
|
|
.shadow {
|
|
box-shadow: 0 0.15rem 1.75rem 0 rgba(58, 59, 69, 0.15) !important;
|
|
}
|
|
|
|
/* Navbar user icon color */
|
|
.navbar-toggler .fa-user {
|
|
color: rgba(255, 255, 255, 0.75);
|
|
}
|
|
|
|
/* Collapsible menu styles */
|
|
.nav-link[data-bs-toggle="collapse"] {
|
|
position: relative;
|
|
}
|
|
|
|
.nav-link[data-bs-toggle="collapse"] .fa-chevron-down {
|
|
transition: transform 0.2s ease;
|
|
}
|
|
|
|
.nav-link[data-bs-toggle="collapse"][aria-expanded="true"] .fa-chevron-down {
|
|
transform: rotate(180deg);
|
|
}
|
|
|
|
.nav-link[data-bs-toggle="collapse"]:not(.collapsed) {
|
|
color: #5b7c99;
|
|
}
|
|
|
|
.nav-link[data-bs-toggle="collapse"]:not(.collapsed) .fa-chevron-down {
|
|
color: #5b7c99;
|
|
}
|
|
|
|
/* Submenu styles */
|
|
.nav .nav {
|
|
border-left: 1px solid #e3e6f0;
|
|
margin-left: 0.5rem;
|
|
}
|
|
|
|
.nav .nav .nav-link {
|
|
font-size: 0.875rem;
|
|
padding-left: 1rem;
|
|
}
|
|
|
|
.nav .nav .nav-link:hover {
|
|
background-color: #f8f9fc;
|
|
}
|
|
|
|
/* Responsive adjustments */
|
|
@media (max-width: 576px) {
|
|
.card-body {
|
|
padding: 1rem;
|
|
}
|
|
|
|
.h5 {
|
|
font-size: 1rem;
|
|
}
|
|
} |