diff --git a/FIX_NOTES.md b/FIX_NOTES.md
new file mode 100644
index 00000000..d31575b3
--- /dev/null
+++ b/FIX_NOTES.md
@@ -0,0 +1,22 @@
+# WMS Fix Notes
+
+This build patches only the current uploaded code.
+
+## Fixed
+
+- Duplicate two-factor migration made safe.
+- Primary two-factor migration adds columns one at a time for SQLite safety.
+- Module page slot is wrapped in a visible `.wms-content` main container.
+- Sidebar remains traditional: desktop/tablet icon rail, mobile drawer.
+- Sidebar widened for "Warehouse Management System".
+- Laravel cache folders are included so "Please provide a valid cache path" does not recur after unzip.
+
+## After unzip
+
+```bash
+composer install
+npm install
+php artisan optimize:clear
+php artisan test
+npm run build
+```
diff --git a/artisan b/artisan
old mode 100755
new mode 100644
diff --git a/bootstrap/cache/.gitignore b/bootstrap/cache/.gitignore
old mode 100755
new mode 100644
diff --git a/database/migrations/2025_08_14_170933_add_two_factor_columns_to_users_table.php b/database/migrations/2025_08_14_170933_add_two_factor_columns_to_users_table.php
index 2dc045a5..a8d3d7da 100644
--- a/database/migrations/2025_08_14_170933_add_two_factor_columns_to_users_table.php
+++ b/database/migrations/2025_08_14_170933_add_two_factor_columns_to_users_table.php
@@ -15,19 +15,23 @@ return new class extends Migration
return;
}
- Schema::table('users', function (Blueprint $table): void {
- if (! Schema::hasColumn('users', 'two_factor_secret')) {
+ if (! Schema::hasColumn('users', 'two_factor_secret')) {
+ Schema::table('users', function (Blueprint $table): void {
$table->text('two_factor_secret')->nullable()->after('password');
- }
+ });
+ }
- if (! Schema::hasColumn('users', 'two_factor_recovery_codes')) {
+ if (! Schema::hasColumn('users', 'two_factor_recovery_codes')) {
+ Schema::table('users', function (Blueprint $table): void {
$table->text('two_factor_recovery_codes')->nullable()->after('two_factor_secret');
- }
+ });
+ }
- if (! Schema::hasColumn('users', 'two_factor_confirmed_at')) {
+ if (! Schema::hasColumn('users', 'two_factor_confirmed_at')) {
+ Schema::table('users', function (Blueprint $table): void {
$table->timestamp('two_factor_confirmed_at')->nullable()->after('two_factor_recovery_codes');
- }
- });
+ });
+ }
}
/**
@@ -39,12 +43,12 @@ return new class extends Migration
return;
}
- Schema::table('users', function (Blueprint $table): void {
- foreach (['two_factor_confirmed_at', 'two_factor_recovery_codes', 'two_factor_secret'] as $column) {
- if (Schema::hasColumn('users', $column)) {
+ foreach (['two_factor_confirmed_at', 'two_factor_recovery_codes', 'two_factor_secret'] as $column) {
+ if (Schema::hasColumn('users', $column)) {
+ Schema::table('users', function (Blueprint $table) use ($column): void {
$table->dropColumn($column);
- }
+ });
}
- });
+ }
}
};
diff --git a/database/migrations/2026_06_10_123344_add_two_factor_columns_to_users_table.php b/database/migrations/2026_06_10_123344_add_two_factor_columns_to_users_table.php
index 2dc045a5..7b8972f0 100644
--- a/database/migrations/2026_06_10_123344_add_two_factor_columns_to_users_table.php
+++ b/database/migrations/2026_06_10_123344_add_two_factor_columns_to_users_table.php
@@ -1,50 +1,28 @@
text('two_factor_secret')->nullable()->after('password');
- }
-
- if (! Schema::hasColumn('users', 'two_factor_recovery_codes')) {
- $table->text('two_factor_recovery_codes')->nullable()->after('two_factor_secret');
- }
-
- if (! Schema::hasColumn('users', 'two_factor_confirmed_at')) {
- $table->timestamp('two_factor_confirmed_at')->nullable()->after('two_factor_recovery_codes');
- }
- });
+ //
}
/**
- * Reverse the migrations.
+ * Reverse the migration.
*/
public function down(): void
{
- if (! Schema::hasTable('users')) {
- return;
- }
-
- Schema::table('users', function (Blueprint $table): void {
- foreach (['two_factor_confirmed_at', 'two_factor_recovery_codes', 'two_factor_secret'] as $column) {
- if (Schema::hasColumn('users', $column)) {
- $table->dropColumn($column);
- }
- }
- });
+ //
}
};
diff --git a/public/.htaccess b/public/.htaccess
old mode 100755
new mode 100644
diff --git a/resources/css/app.css b/resources/css/app.css
index d4e35559..fd378106 100644
--- a/resources/css/app.css
+++ b/resources/css/app.css
@@ -81,8 +81,8 @@ select:focus[data-flux-control] {
top: 0;
z-index: 40;
display: flex;
- width: 20rem;
- min-width: 20rem;
+ width: 21.5rem;
+ min-width: 21.5rem;
height: 100vh;
flex-direction: column;
border-right: 1px solid rgb(228 228 231);
@@ -99,8 +99,8 @@ select:focus[data-flux-control] {
display: flex;
align-items: center;
gap: 0.75rem;
- min-height: 4.5rem;
- padding: 0.875rem;
+ min-height: 4.75rem;
+ padding: 0.95rem;
border-bottom: 1px solid rgb(228 228 231);
}
@@ -120,11 +120,11 @@ select:focus[data-flux-control] {
.wms-brand-mark {
display: grid;
- width: 2.35rem;
- height: 2.35rem;
+ width: 2.5rem;
+ height: 2.5rem;
flex: 0 0 auto;
place-items: center;
- border-radius: 0.75rem;
+ border-radius: 0.85rem;
background: linear-gradient(135deg, rgb(15 23 42), rgb(14 116 144));
color: white;
box-shadow: 0 12px 24px rgb(15 23 42 / 0.22);
@@ -143,12 +143,12 @@ select:focus[data-flux-control] {
}
.wms-brand-title {
- max-width: 14rem;
+ max-width: 16rem;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
- font-size: 0.94rem;
- font-weight: 750;
+ font-size: 0.98rem;
+ font-weight: 800;
color: rgb(24 24 27);
}
@@ -157,9 +157,9 @@ select:focus[data-flux-control] {
}
.wms-brand-subtitle {
- margin-top: 0.15rem;
+ margin-top: 0.18rem;
font-size: 0.72rem;
- font-weight: 700;
+ font-weight: 800;
letter-spacing: 0.14em;
color: rgb(8 145 178);
}
@@ -177,8 +177,9 @@ select:focus[data-flux-control] {
}
.wms-sidebar-toggle {
- width: 2rem;
- height: 2rem;
+ width: 2.15rem;
+ height: 2.15rem;
+ flex: 0 0 auto;
font-size: 1.35rem;
font-weight: 800;
line-height: 1;
@@ -205,8 +206,8 @@ select:focus[data-flux-control] {
.wms-mobile-close {
display: none;
- width: 2rem;
- height: 2rem;
+ width: 2.15rem;
+ height: 2.15rem;
font-size: 1.4rem;
line-height: 1;
}
@@ -214,7 +215,7 @@ select:focus[data-flux-control] {
.wms-sidebar-nav {
flex: 1;
overflow-y: auto;
- padding: 0.85rem;
+ padding: 0.9rem;
}
.wms-sidebar-group + .wms-sidebar-group {
@@ -233,13 +234,13 @@ select:focus[data-flux-control] {
.wms-sidebar-link {
position: relative;
display: flex;
- min-height: 2.55rem;
+ min-height: 2.65rem;
align-items: center;
- gap: 0.75rem;
- border-radius: 0.75rem;
- padding: 0.625rem 0.7rem;
+ gap: 0.78rem;
+ border-radius: 0.8rem;
+ padding: 0.65rem 0.75rem;
color: rgb(63 63 70);
- font-size: 0.9rem;
+ font-size: 0.92rem;
font-weight: 650;
text-decoration: none;
transition: background 120ms ease, color 120ms ease;
@@ -270,8 +271,8 @@ select:focus[data-flux-control] {
}
.wms-sidebar-icon {
- width: 1.2rem;
- min-width: 1.2rem;
+ width: 1.25rem;
+ min-width: 1.25rem;
text-align: center;
font-size: 1rem;
}
@@ -280,7 +281,7 @@ select:focus[data-flux-control] {
display: grid;
gap: 0.25rem;
border-top: 1px solid rgb(228 228 231);
- padding: 0.85rem;
+ padding: 0.9rem;
}
.dark .wms-sidebar-footer {
@@ -341,6 +342,17 @@ select:focus[data-flux-control] {
.wms-main-column {
min-width: 0;
flex: 1;
+ display: flex;
+ min-height: 100vh;
+ flex-direction: column;
+ }
+
+ .wms-content {
+ display: block;
+ width: 100%;
+ min-width: 0;
+ flex: 1;
+ padding: 1.5rem;
}
.wms-mobile-header {
@@ -352,8 +364,8 @@ select:focus[data-flux-control] {
}
html[data-wms-sidebar='collapsed'] .wms-sidebar {
- width: 5.25rem;
- min-width: 5.25rem;
+ width: 5.5rem;
+ min-width: 5.5rem;
}
html[data-wms-sidebar='collapsed'] [data-wms-sidebar-label] {
@@ -364,8 +376,8 @@ select:focus[data-flux-control] {
html[data-wms-sidebar='collapsed'] .wms-sidebar-footer,
html[data-wms-sidebar='collapsed'] .wms-sidebar-nav {
align-items: center;
- padding-left: 0.65rem;
- padding-right: 0.65rem;
+ padding-left: 0.7rem;
+ padding-right: 0.7rem;
}
html[data-wms-sidebar='collapsed'] .wms-brand {
@@ -379,8 +391,8 @@ select:focus[data-flux-control] {
html[data-wms-sidebar='collapsed'] .wms-sidebar-link {
justify-content: center;
- padding-left: 0.65rem;
- padding-right: 0.65rem;
+ padding-left: 0.7rem;
+ padding-right: 0.7rem;
}
html[data-wms-sidebar='collapsed'] .wms-toggle-expanded {
@@ -399,8 +411,8 @@ select:focus[data-flux-control] {
.wms-sidebar {
position: fixed;
inset: 0 auto 0 0;
- width: min(21rem, calc(100vw - 2.5rem));
- min-width: min(21rem, calc(100vw - 2.5rem));
+ width: min(21.5rem, calc(100vw - 2.5rem));
+ min-width: min(21.5rem, calc(100vw - 2.5rem));
transform: translateX(-105%);
box-shadow: 22px 0 60px rgb(0 0 0 / 0.24);
}
@@ -419,8 +431,8 @@ select:focus[data-flux-control] {
}
html[data-wms-sidebar='collapsed'] .wms-sidebar {
- width: min(21rem, calc(100vw - 2.5rem));
- min-width: min(21rem, calc(100vw - 2.5rem));
+ width: min(21.5rem, calc(100vw - 2.5rem));
+ min-width: min(21.5rem, calc(100vw - 2.5rem));
}
html[data-wms-sidebar='collapsed'] [data-wms-sidebar-label] {
@@ -429,7 +441,6 @@ select:focus[data-flux-control] {
html[data-wms-sidebar='collapsed'] .wms-brand-copy,
html[data-wms-sidebar='collapsed'] .wms-sidebar-heading,
- html[data-wms-sidebar='collapsed'] .wms-user-card span,
html[data-wms-sidebar='collapsed'] .wms-sidebar-link span {
display: block !important;
}
@@ -482,5 +493,9 @@ select:focus[data-flux-control] {
font-weight: 800;
text-decoration: none;
}
+
+ .wms-content {
+ padding: 1rem;
+ }
}
}
diff --git a/resources/views/layouts/app.blade.php b/resources/views/layouts/app.blade.php
index 037dd1bd..f2e85e61 100644
--- a/resources/views/layouts/app.blade.php
+++ b/resources/views/layouts/app.blade.php
@@ -1,5 +1,3 @@
user()->email); ?>
+user()?->email ?? ''); ?>