From 1bb54c0ca1e7b48969ab19fa98af1bad8bbe2184 Mon Sep 17 00:00:00 2001 From: Andras Bacsai <5845193+andrasbacsai@users.noreply.github.com> Date: Mon, 3 Aug 2026 23:55:34 +0200 Subject: [PATCH] feat(ui): scrollable resource tabs and railpack default Add a shared resource-heading-tabs scroller with overflow chevrons, wire it into resource/server navbars, keep links menus outside overflow, and default new git apps to Railpack instead of Nixpacks. --- .../Project/New/GithubPrivateRepository.php | 2 +- .../New/GithubPrivateRepositoryDeployKey.php | 2 +- .../Project/New/GitlabPrivateRepository.php | 2 +- .../Project/New/PublicGitRepository.php | 2 +- resources/css/app.css | 104 +++++++++++ .../components/applications/links.blade.php | 2 +- .../views/components/project/navbar.blade.php | 4 +- .../resource-heading-tabs.blade.php | 167 ++++++++++++++++++ .../views/components/services/links.blade.php | 2 +- .../project/application/general.blade.php | 2 +- .../project/application/heading.blade.php | 40 +++-- .../project/database/heading.blade.php | 28 +-- ...ub-private-repository-deploy-key.blade.php | 2 +- .../new/github-private-repository.blade.php | 2 +- .../new/gitlab-private-repository.blade.php | 2 +- .../new/public-git-repository.blade.php | 2 +- .../project/service/heading.blade.php | 32 ++-- .../views/livewire/server/navbar.blade.php | 29 +-- ...pplicationGeneralBuildpackSelectorTest.php | 10 +- .../NewApplicationBuildpackDefaultsTest.php | 20 ++- .../ResourceHeadingUnifiedNavbarTest.php | 97 ++++++++-- 21 files changed, 452 insertions(+), 101 deletions(-) create mode 100644 resources/views/components/resource-heading-tabs.blade.php diff --git a/app/Livewire/Project/New/GithubPrivateRepository.php b/app/Livewire/Project/New/GithubPrivateRepository.php index 479c2a1f5..925f8d969 100644 --- a/app/Livewire/Project/New/GithubPrivateRepository.php +++ b/app/Livewire/Project/New/GithubPrivateRepository.php @@ -64,7 +64,7 @@ class GithubPrivateRepository extends Component protected int $page = 1; - public $build_pack = 'nixpacks'; + public $build_pack = 'railpack'; public bool $show_is_static = true; diff --git a/app/Livewire/Project/New/GithubPrivateRepositoryDeployKey.php b/app/Livewire/Project/New/GithubPrivateRepositoryDeployKey.php index fb3c0b2c3..502a69bec 100644 --- a/app/Livewire/Project/New/GithubPrivateRepositoryDeployKey.php +++ b/app/Livewire/Project/New/GithubPrivateRepositoryDeployKey.php @@ -47,7 +47,7 @@ class GithubPrivateRepositoryDeployKey extends Component public string $branch; - public $build_pack = 'nixpacks'; + public $build_pack = 'railpack'; public bool $show_is_static = true; diff --git a/app/Livewire/Project/New/GitlabPrivateRepository.php b/app/Livewire/Project/New/GitlabPrivateRepository.php index a0ff15304..3da796a81 100644 --- a/app/Livewire/Project/New/GitlabPrivateRepository.php +++ b/app/Livewire/Project/New/GitlabPrivateRepository.php @@ -57,7 +57,7 @@ class GitlabPrivateRepository extends Component protected int $page = 1; - public $build_pack = 'nixpacks'; + public $build_pack = 'railpack'; public bool $show_is_static = true; diff --git a/app/Livewire/Project/New/PublicGitRepository.php b/app/Livewire/Project/New/PublicGitRepository.php index fdae52f7c..81d65bc85 100644 --- a/app/Livewire/Project/New/PublicGitRepository.php +++ b/app/Livewire/Project/New/PublicGitRepository.php @@ -56,7 +56,7 @@ class PublicGitRepository extends Component public string $git_repository; - public $build_pack = 'nixpacks'; + public $build_pack = 'railpack'; public bool $show_is_static = true; diff --git a/resources/css/app.css b/resources/css/app.css index 5698f307e..2162e9dac 100644 --- a/resources/css/app.css +++ b/resources/css/app.css @@ -1152,6 +1152,110 @@ body.terminal-is-fullscreen .terminal-fullscreen-shell [data-terminal-mobile-too height: 0; } +/* + * Kumo-style overflow controls for resource heading tabs. + * Circular chevrons sit over gradient fades when more tabs are off-screen. + */ +.resource-heading-tabs-scroller { + --resource-heading-tabs-fade: #f5f5f5; /* neutral-100, matches pill track */ +} + +.dark .resource-heading-tabs-scroller { + /* Matches dark:bg-white/[0.035] pill track + panel so fade blends */ + --resource-heading-tabs-fade: color-mix(in srgb, var(--color-panel, #0a0a0a) 96.5%, white); +} + +.resource-heading-tabs-control { + position: absolute; + inset-block: 0; + z-index: 3; + display: flex; + align-items: center; + width: 2.5rem; + margin: 0; + padding: 0; + border: 0; + pointer-events: none; + opacity: 0; + transition: opacity 0.15s ease; +} + +.resource-heading-tabs-control.is-visible { + pointer-events: auto; + opacity: 1; +} + +.resource-heading-tabs-control.is-start { + left: 0; + justify-content: flex-start; + background: linear-gradient( + to right, + var(--resource-heading-tabs-fade) 35%, + color-mix(in srgb, var(--resource-heading-tabs-fade) 85%, transparent) 70%, + transparent + ); +} + +.resource-heading-tabs-control.is-end { + right: 0; + justify-content: flex-end; + background: linear-gradient( + to left, + var(--resource-heading-tabs-fade) 35%, + color-mix(in srgb, var(--resource-heading-tabs-fade) 85%, transparent) 70%, + transparent + ); +} + +.resource-heading-tabs-control-icon { + display: inline-flex; + align-items: center; + justify-content: center; + width: 1.5rem; + height: 1.5rem; + margin-inline: 0.25rem; + border-radius: 9999px; + color: #737373; + background: #ffffff; + box-shadow: + 0 1px 2px rgba(0, 0, 0, 0.06), + 0 0 0 1px rgba(0, 0, 0, 0.08); + transition: + background-color 0.15s ease, + color 0.15s ease, + box-shadow 0.15s ease; +} + +.dark .resource-heading-tabs-control-icon { + color: var(--color-fg-dim, #a3a3a3); + background: var(--color-raised, #171717); + box-shadow: + 0 1px 2px rgba(0, 0, 0, 0.35), + 0 0 0 1px rgba(255, 255, 255, 0.1); +} + +.resource-heading-tabs-control:hover .resource-heading-tabs-control-icon, +.resource-heading-tabs-control:focus-visible .resource-heading-tabs-control-icon { + color: #000000; + background: #ffffff; +} + +.dark .resource-heading-tabs-control:hover .resource-heading-tabs-control-icon, +.dark .resource-heading-tabs-control:focus-visible .resource-heading-tabs-control-icon { + color: var(--color-fg, #fafafa); + background: var(--color-raised, #171717); +} + +.resource-heading-tabs-control:focus { + outline: none; +} + +.resource-heading-tabs-control:focus-visible .resource-heading-tabs-control-icon { + box-shadow: + 0 0 0 2px color-mix(in srgb, var(--color-coollabs, #6b16ed) 45%, transparent), + 0 0 0 1px rgba(0, 0, 0, 0.08); +} + .resource-heading-menus, .resource-heading-actions { overflow: visible; diff --git a/resources/views/components/applications/links.blade.php b/resources/views/components/applications/links.blade.php index d1c5a0835..9fd8cbd6d 100644 --- a/resources/views/components/applications/links.blade.php +++ b/resources/views/components/applications/links.blade.php @@ -22,7 +22,7 @@