diff --git a/.gitignore b/.gitignore index fc55024..969bbc7 100644 --- a/.gitignore +++ b/.gitignore @@ -1,9 +1,25 @@ -node_modules -*.log* +# Nuxt dev/build outputs +.output .nuxt .nitro .cache -.output -.env dist -sw.* + +# Node dependencies +node_modules + +# Logs +*.log + +# Misc +.DS_Store +.fleet +.idea + +# Local env files +.env +.env.* +!.env.example + +# Uploads directory +public/uploads/ diff --git a/README.md b/README.md index 8430b76..7f452fe 100644 --- a/README.md +++ b/README.md @@ -40,4 +40,6 @@ npm run preview ``` Checkout the [deployment documentation](https://v3.nuxtjs.org/guide/deploy/presets) for more information. -# Niise +# corradAF + +This is the base project for corradAF. diff --git a/app.vue b/app.vue index bdbe209..f27c589 100644 --- a/app.vue +++ b/app.vue @@ -1,7 +1,20 @@ diff --git a/assets/css/menu-levels.css b/assets/css/menu-levels.css new file mode 100644 index 0000000..6b324be --- /dev/null +++ b/assets/css/menu-levels.css @@ -0,0 +1,119 @@ +/* Multi-level menu styling */ +.multi-level-menu { + border-left: 2px solid rgba(var(--color-primary), 0.3); +} + +/* Common styles for all menu levels */ +.navigation-item-wrapper a { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + display: flex; + align-items: center; +} + +/* Long menu text handling */ +.navigation-item-wrapper span { + text-overflow: ellipsis; + overflow: hidden; +} + +/* Show full text on hover */ +.navigation-item-wrapper a:hover span { + white-space: normal; + overflow: visible; + position: relative; + z-index: 10; +} + +/* Enhanced tooltip effect for very long menu items */ +.deepest-menu-item a:hover span { + background-color: rgba(var(--sidebar-menu), 0.95); + border-radius: 4px; + padding: 4px 8px; + box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2); + max-width: 300px; +} + +/* Level-specific styles */ +.second-level-menu { + font-weight: 500; + padding-left: 0.25rem; +} + +.second-level-menu .mx-3, +.second-level-menu .mx-4 { + color: rgba(255, 255, 255, 0.95); + max-width: 200px; +} + +.third-level-menu { + font-style: italic; + padding-left: 0.5rem; +} + +.third-level-menu .mx-3, +.third-level-menu .mx-4 { + color: rgba(255, 255, 255, 0.9); + font-size: 0.95rem; + max-width: 180px; +} + +.deepest-menu-item { + padding-left: 0.75rem; + border-left: 2px solid rgba(var(--color-primary), 0.6); +} + +.deepest-menu-item .mx-3, +.deepest-menu-item .mx-4 { + color: rgba(255, 255, 255, 0.85); + font-size: 0.9rem; + max-width: 160px; +} + +/* Add visual indicators for each level */ +.second-level-menu a::before, +.third-level-menu a::before, +.deepest-menu-item a::before { + content: ''; + display: inline-block; + width: 6px; + height: 6px; + margin-right: 8px; + border-radius: 50%; + flex-shrink: 0; +} + +.second-level-menu a::before { + background-color: rgba(var(--color-primary), 0.8); +} + +.third-level-menu a::before { + background-color: rgba(var(--color-accent), 0.8); + width: 5px; + height: 5px; +} + +.deepest-menu-item a::before { + background-color: rgba(var(--color-secondary), 0.8); + width: 4px; + height: 4px; +} + +/* Resonsive adjustments for different screen sizes */ +@media (max-width: 1200px) { + .second-level-menu .mx-3, + .second-level-menu .mx-4, + .third-level-menu .mx-3, + .third-level-menu .mx-4, + .deepest-menu-item .mx-3, + .deepest-menu-item .mx-4 { + max-width: 140px; + } +} + +@media (max-width: 992px) { + .navigation-item-wrapper span { + max-width: 120px; + } +} \ No newline at end of file diff --git a/assets/img/logo/niise-logo.svg b/assets/img/logo/corradAF-logo.svg similarity index 100% rename from assets/img/logo/niise-logo.svg rename to assets/img/logo/corradAF-logo.svg diff --git a/assets/img/logo/lzs-logo.png b/assets/img/logo/lzs-logo.png new file mode 100644 index 0000000..904a2e3 Binary files /dev/null and b/assets/img/logo/lzs-logo.png differ diff --git a/assets/style/css/base/theme.css b/assets/style/css/base/theme.css index 3ea26c4..a6c095c 100644 --- a/assets/style/css/base/theme.css +++ b/assets/style/css/base/theme.css @@ -79,7 +79,7 @@ html[data-theme="biru"] { --color-accent: 255, 204, 0; --color-success: 46, 204, 113; --color-info: 52, 152, 219; - --color-warning: 241, 196, 15; + --color-warning: 246, 141, 32; --color-danger: 231, 76, 60; --text-color: 0, 0, 0; --border-color: 200, 200, 200; @@ -117,7 +117,7 @@ html[data-theme="merah"] { --color-accent: 255, 255, 153; --color-success: 46, 204, 113; --color-info: 52, 152, 219; - --color-warning: 241, 196, 15; + --color-warning: 246, 141, 32; --color-danger: 231, 76, 60; --text-color: 0, 0, 0; --border-color: 200, 200, 200; @@ -155,7 +155,7 @@ html[data-theme="ungu"] { --color-accent: 255, 215, 0; --color-success: 46, 204, 113; --color-info: 52, 152, 219; - --color-warning: 241, 196, 15; + --color-warning: 246, 141, 32; --color-danger: 231, 76, 60; --text-color: 0, 0, 0; --border-color: 200, 200, 200; @@ -193,7 +193,7 @@ html[data-theme="oren"] { --color-accent: 0, 128, 128; --color-success: 46, 204, 113; --color-info: 52, 152, 219; - --color-warning: 241, 196, 15; + --color-warning: 246, 141, 32; --color-danger: 231, 76, 60; --text-color: 0, 0, 0; --border-color: 200, 200, 200; @@ -224,3 +224,45 @@ html[data-theme="oren"] { --tab-radius: 0.5rem; --tw-shadow: #e5eaf2; } + +html[data-theme="LZS"] { + --color-primary: 0, 90, 173; /* #005AAD - Blue */ + --color-secondary: 141, 199, 61; /* #8DC73D - Green */ + --color-accent: 255, 242, 0; /* #FFF200 - Yellow */ + --color-success: 141, 199, 61; /* Using the green for success */ + --color-info: 0, 90, 173; /* Using the blue for info */ + --color-warning: 246, 141, 32; /* Using consistent orange for warning */ + --color-danger: 229, 83, 69; /* Keeping original red for danger */ + --text-color: 0, 0, 0; /* Black text */ + --border-color: 220, 220, 220; /* Light gray for borders */ + --bg-1: 245, 250, 255; /* Very light blue background */ + --bg-2: 255, 255, 255; /* White background */ + --sidebar: 0, 58, 112; /* Darker blue for sidebar - #003A70 */ + --sidebar-menu: 0, 40, 77; /* Even darker blue for sidebar menu - #00284D */ + --sidebar-text: 255, 255, 255; /* White text for sidebar */ + --header: 0, 90, 173; /* Blue header - #005AAD */ + --header-text: 255, 255, 255; /* White text for header */ + --scroll-color: 180, 180, 180; /* Gray scrollbar */ + --scroll-hover-color: 150, 150, 150; /* Darker gray on hover */ + --fk-border-color: 220, 220, 220; /* Light gray for form borders */ + --fk-placeholder-color: 150, 150, 150; /* Gray for placeholders */ + --box-shadow: rgba(0, 90, 173, 0.1) 0px 1px 2px, + rgba(0, 90, 173, 0.08) 0px 0px 2px; /* Blue-tinted shadow */ + --cp-bg: 255, 255, 255; /* White background */ + --rounded-box: 0.5rem; + --rounded-btn: 0.5rem; + --rounded-badge: 1.9rem; + --animation-btn: 0.25s; + --animation-input: 0.2s; + --btn-text-case: uppercase; + --btn-focus-scale: 0.95; + --padding-btn: 0.625rem 1.5rem; + --border-btn: 1px; + --tab-border: 1px; + --tab-radius: 0.5rem; + /* Yellow accents in specific UI elements */ + --active-menu-bg: 255, 242, 0, 0.1; /* Subtle yellow background for active menu items */ + --active-menu-border: 255, 242, 0; /* Yellow border for active menu items */ + --focus-ring: 255, 242, 0, 0.5; /* Yellow focus ring */ + --tw-shadow: #e5eaf2; +} diff --git a/assets/style/css/component/button.css b/assets/style/css/component/button.css index 6b7ead2..b783216 100644 --- a/assets/style/css/component/button.css +++ b/assets/style/css/component/button.css @@ -1,41 +1,89 @@ /* RS Button */ .button { @apply w-fit rounded-lg flex justify-center items-center h-fit; + transition: all 0.2s ease; + position: relative; + overflow: hidden; } +/* Enhanced hover effect with slight 3D transition */ .button[class*="button-"]:hover { - background-image: linear-gradient(rgb(0 0 0/10%) 0 0); + transform: translateY(-2px); + box-shadow: 0 4px 8px rgba(0, 0, 0, 0.15); +} + +.button[class*="button-"]:active { + transform: translateY(0px); + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); } .button[class*="button-"]:disabled { opacity: 0.3; cursor: not-allowed; + transform: none; + box-shadow: none; } +/* Primary Button - Blue with yellow accent */ .button.button-primary { @apply bg-primary text-white; + box-shadow: 0 2px 4px rgba(var(--color-primary), 0.3), + inset 0 1px 0 rgba(255, 255, 255, 0.2); + border: 1px solid rgba(var(--color-primary), 0.8); +} + +.button.button-primary:hover::after { + content: ""; + position: absolute; + bottom: 0; + left: 0; + right: 0; + height: 3px; + background-color: rgb(var(--active-menu-border)); + animation: slide-in 0.3s ease forwards; +} + +@keyframes slide-in { + 0% { transform: scaleX(0); opacity: 0; } + 100% { transform: scaleX(1); opacity: 1; } } .button.button-secondary { @apply bg-secondary text-white; + box-shadow: 0 2px 4px rgba(var(--color-secondary), 0.3), + inset 0 1px 0 rgba(255, 255, 255, 0.2); + border: 1px solid rgba(var(--color-secondary), 0.8); } .button.button-success { @apply bg-success text-white; + box-shadow: 0 2px 4px rgba(var(--color-success), 0.3), + inset 0 1px 0 rgba(255, 255, 255, 0.2); + border: 1px solid rgba(var(--color-success), 0.8); } .button.button-info { @apply bg-info text-white; + box-shadow: 0 2px 4px rgba(var(--color-info), 0.3), + inset 0 1px 0 rgba(255, 255, 255, 0.2); + border: 1px solid rgba(var(--color-info), 0.8); } .button.button-warning { @apply bg-warning text-white; + box-shadow: 0 2px 4px rgba(var(--color-warning), 0.3), + inset 0 1px 0 rgba(255, 255, 255, 0.2); + border: 1px solid rgba(var(--color-warning), 0.8); } .button.button-danger { @apply bg-danger text-white; + box-shadow: 0 2px 4px rgba(var(--color-danger), 0.3), + inset 0 1px 0 rgba(255, 255, 255, 0.2); + border: 1px solid rgba(var(--color-danger), 0.8); } +/* Updated outline buttons */ .button[class*="outline-"]:disabled { opacity: 0.3; cursor: not-allowed; @@ -43,50 +91,68 @@ .button.outline-primary { @apply border border-primary text-primary; + box-shadow: 0 1px 3px rgba(var(--color-primary), 0.1); } .button.outline-primary:hover { @apply bg-primary/5; + box-shadow: 0 3px 6px rgba(var(--color-primary), 0.2); + transform: translateY(-1px); } .button.outline-secondary { @apply border border-secondary text-secondary; + box-shadow: 0 1px 3px rgba(var(--color-secondary), 0.1); } .button.outline-secondary:hover { @apply bg-secondary/5; + box-shadow: 0 3px 6px rgba(var(--color-secondary), 0.2); + transform: translateY(-1px); } .button.outline-success { @apply border border-success text-success; + box-shadow: 0 1px 3px rgba(var(--color-success), 0.1); } .button.outline-success:hover { @apply bg-success/5; + box-shadow: 0 3px 6px rgba(var(--color-success), 0.2); + transform: translateY(-1px); } .button.outline-info { @apply border border-info text-info; + box-shadow: 0 1px 3px rgba(var(--color-info), 0.1); } .button.outline-info:hover { @apply bg-info/5; + box-shadow: 0 3px 6px rgba(var(--color-info), 0.2); + transform: translateY(-1px); } .button.outline-warning { @apply border border-warning text-warning; + box-shadow: 0 1px 3px rgba(var(--color-warning), 0.1); } .button.outline-warning:hover { @apply bg-warning/5; + box-shadow: 0 3px 6px rgba(var(--color-warning), 0.2); + transform: translateY(-1px); } .button.outline-danger { @apply border border-danger text-danger; + box-shadow: 0 1px 3px rgba(var(--color-danger), 0.1); } .button.outline-danger:hover { @apply bg-danger/5; + box-shadow: 0 3px 6px rgba(var(--color-danger), 0.2); + transform: translateY(-1px); } .button[class*="text-"]:disabled { @@ -96,63 +162,162 @@ .button.texts-primary { @apply text-primary; + position: relative; } .button.texts-primary:hover { @apply bg-primary/10; } +.button.texts-primary:after { + content: ''; + position: absolute; + width: 0; + height: 2px; + bottom: 0; + left: 0; + background-color: rgb(var(--color-primary)); + transition: width 0.3s ease; +} + +.button.texts-primary:hover:after { + width: 100%; +} + .button.texts-secondary { @apply text-secondary; + position: relative; } .button.texts-secondary:hover { @apply bg-secondary/10; } +.button.texts-secondary:after { + content: ''; + position: absolute; + width: 0; + height: 2px; + bottom: 0; + left: 0; + background-color: rgb(var(--color-secondary)); + transition: width 0.3s ease; +} + +.button.texts-secondary:hover:after { + width: 100%; +} + .button.texts-success { @apply text-success; + position: relative; } .button.texts-success:hover { @apply bg-success/10; } +.button.texts-success:after { + content: ''; + position: absolute; + width: 0; + height: 2px; + bottom: 0; + left: 0; + background-color: rgb(var(--color-success)); + transition: width 0.3s ease; +} + +.button.texts-success:hover:after { + width: 100%; +} + .button.texts-info { @apply text-info; + position: relative; } .button.texts-info:hover { @apply bg-info/10; } +.button.texts-info:after { + content: ''; + position: absolute; + width: 0; + height: 2px; + bottom: 0; + left: 0; + background-color: rgb(var(--color-info)); + transition: width 0.3s ease; +} + +.button.texts-info:hover:after { + width: 100%; +} + .button.texts-warning { @apply text-warning; + position: relative; } .button.texts-warning:hover { @apply bg-warning/10; } +.button.texts-warning:after { + content: ''; + position: absolute; + width: 0; + height: 2px; + bottom: 0; + left: 0; + background-color: rgb(var(--color-warning)); + transition: width 0.3s ease; +} + +.button.texts-warning:hover:after { + width: 100%; +} + .button.texts-danger { @apply text-danger; + position: relative; } .button.texts-danger:hover { @apply bg-danger/10; } +.button.texts-danger:after { + content: ''; + position: absolute; + width: 0; + height: 2px; + bottom: 0; + left: 0; + background-color: rgb(var(--color-danger)); + transition: width 0.3s ease; +} + +.button.texts-danger:hover:after { + width: 100%; +} + .button-sm { @apply text-xs; padding: var(--padding-btn); + line-height: 1.4; } .button-md { @apply text-sm; padding: var(--padding-btn); + line-height: 1.5; } .button-lg { @apply text-base; padding: var(--padding-btn); + line-height: 1.6; } diff --git a/assets/style/css/component/card.css b/assets/style/css/component/card.css index 064e3d2..398055e 100644 --- a/assets/style/css/component/card.css +++ b/assets/style/css/component/card.css @@ -7,13 +7,18 @@ } .card .card-header { - @apply text-xl p-5 font-medium; + @apply text-xl px-6 py-4 font-medium; + line-height: 1.5; + border-bottom: 1px solid rgb(var(--border-color)); } .card .card-body { - @apply px-5 pb-5; + @apply px-6 py-5; + line-height: 1.6; } .card .card-footer { - @apply px-5 pb-5; + @apply px-6 py-4; + line-height: 1.5; + border-top: 1px solid rgb(var(--border-color)); } diff --git a/assets/style/css/example-theme.css b/assets/style/css/example-theme.css new file mode 100644 index 0000000..5fb0932 --- /dev/null +++ b/assets/style/css/example-theme.css @@ -0,0 +1,65 @@ +/* Example Custom Theme for corradAF Base Project */ +/* This file demonstrates how custom themes should be structured */ +/* Define your custom theme variables here */ +/* For example: +:root { + --primary-color: #yourColor; +} +*/ + +:root { + /* Custom color variables */ + --color-primary: 46, 125, 50; /* Green theme */ + --color-secondary: 117, 117, 117; + --color-success: 76, 175, 80; + --color-info: 33, 150, 243; + --color-warning: 255, 152, 0; + --color-danger: 244, 67, 54; + + /* Custom background colors */ + --bg-primary: 245, 245, 245; + --bg-secondary: 255, 255, 255; +} + +/* Dark theme overrides */ +.dark { + --bg-primary: 18, 18, 18; + --bg-secondary: 30, 30, 30; +} + +/* Custom component styles */ +.btn-primary { + background-color: rgb(var(--color-primary)); + border-color: rgb(var(--color-primary)); +} + +.btn-primary:hover { + background-color: rgba(var(--color-primary), 0.8); + border-color: rgba(var(--color-primary), 0.8); +} + +/* Header customizations */ +.w-header { + background: linear-gradient(135deg, rgb(var(--color-primary)), rgba(var(--color-primary), 0.8)); + color: white; +} + +/* Sidebar customizations */ +.vertical-menu { + background-color: rgb(var(--bg-secondary)); + border-right: 1px solid rgba(var(--color-primary), 0.1); +} + +/* Card customizations */ +.card { + background-color: rgb(var(--bg-secondary)); + border: 1px solid rgba(var(--color-primary), 0.1); + box-shadow: 0 2px 4px rgba(var(--color-primary), 0.1); +} + +/* Example of responsive design */ +@media (max-width: 768px) { + .w-header { + background: rgb(var(--color-primary)); + } +} \ No newline at end of file diff --git a/assets/style/scss/custom/layout/vertical.scss b/assets/style/scss/custom/layout/vertical.scss index 50b8c47..cedeba6 100644 --- a/assets/style/scss/custom/layout/vertical.scss +++ b/assets/style/scss/custom/layout/vertical.scss @@ -105,3 +105,62 @@ $xlarge: 1280px; } } } + +// Custom styles for LZS theme +html[data-theme="LZS"] { + .v-layout { + .active-menu { + position: relative; + transition: all 0.2s ease; + + // Yellow glow on active menu items + &:after { + content: ""; + position: absolute; + left: 0; + top: 0; + height: 100%; + width: 4px; + background-color: rgb(var(--active-menu-border)); + } + + // Icon color for active menu + svg { + color: rgb(var(--active-menu-border)); + } + } + + // Form focus states with yellow accent + input:focus, textarea:focus, select:focus { + outline: 2px solid rgba(var(--focus-ring)); + outline-offset: 2px; + } + + // Button hover with yellow accent + .btn-primary:hover, button.bg-primary:hover { + box-shadow: 0 0 0 2px rgba(var(--active-menu-border), 0.3); + } + + // Card headers with subtle yellow accent + .rs-card { + .card-header { + border-bottom: 1px solid rgba(var(--border-color)); + + h2, h3, h4 { + position: relative; + + &:before { + content: ""; + position: absolute; + left: -10px; + top: 50%; + transform: translateY(-50%); + height: 60%; + width: 3px; + background-color: rgb(var(--active-menu-border)); + } + } + } + } + } +} diff --git a/assets/style/scss/main.scss b/assets/style/scss/main.scss index 0ccae1d..39d59d8 100644 --- a/assets/style/scss/main.scss +++ b/assets/style/scss/main.scss @@ -2,18 +2,20 @@ Notes: This file is the main entry point for the SCSS stylesheet. ================================================================================*/ -@import url("https://fonts.googleapis.com/css2?family=Roboto:wght@300..700&display=swap"); +/* Import DM Sans font from Google Fonts */ +@import url("https://fonts.googleapis.com/css2?family=DM+Sans:ital,wght@0,400;0,500;0,700;1,400;1,500;1,700&display=swap"); + html, body { height: 100%; } #__nuxt { - font-family: "Roboto", sans-serif; + font-family: "DM Sans", sans-serif; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; font-weight: 400; - letter-spacing: 0.5px; + letter-spacing: -0.5px; /* Changed from -2px to -0.5px for better readability */ font-size: 14px; } diff --git a/components/FontSizeStepper.vue b/components/FontSizeStepper.vue new file mode 100644 index 0000000..86146a0 --- /dev/null +++ b/components/FontSizeStepper.vue @@ -0,0 +1,78 @@ + + + \ No newline at end of file diff --git a/components/Loading.vue b/components/Loading.vue index 3890013..0d3b1fd 100644 --- a/components/Loading.vue +++ b/components/Loading.vue @@ -1,4 +1,6 @@