diff --git a/src/Analysim.Web/ClientApp/package-lock.json b/src/Analysim.Web/ClientApp/package-lock.json index 361c055d..e82d36b6 100644 --- a/src/Analysim.Web/ClientApp/package-lock.json +++ b/src/Analysim.Web/ClientApp/package-lock.json @@ -15757,13 +15757,15 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-1.0.1.tgz", "integrity": "sha512-f1G1WGDXEU/RN1TWAxBPQgQudtLnLQPyiWdtypkPC+mVYNKFKH/HYXSxH4MVNqwF8M0eDsoiU7HumJHCg/L/jg==", - "dev": true + "dev": true, + "requires": {} }, "@csstools/selector-specificity": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.0.1.tgz", "integrity": "sha512-aG20vknL4/YjQF9BSV7ts4EWm/yrjagAN7OWBNmlbEOUiu0llj4OGrFoOKK3g2vey4/p2omKCoHrWtPxSwV3HA==", - "dev": true + "dev": true, + "requires": {} }, "@discoveryjs/json-ext": { "version": "0.5.7", @@ -15932,7 +15934,8 @@ "version": "14.0.3", "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-14.0.3.tgz", "integrity": "sha512-PwvgCeY7mbijazovpA0ggeo81A3yzwOb8AfVD3yfGT15Z2qnEVyL+05Tj6ttRTngceF3gsERamFcB6lRKdcjdw==", - "dev": true + "dev": true, + "requires": {} }, "@nodelib/fs.scandir": { "version": "2.1.5", @@ -16834,7 +16837,8 @@ "version": "1.8.0", "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", - "dev": true + "dev": true, + "requires": {} }, "acorn-walk": { "version": "7.2.0", @@ -17234,7 +17238,8 @@ "bootstrap": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.6.2.tgz", - "integrity": "sha512-51Bbp/Uxr9aTuy6ca/8FbFloBUJZLHwnhTcnjIeRn2suQWsWzcuJhGjKDB5eppVte/8oCdOL3VuwxvZDUggwGQ==" + "integrity": "sha512-51Bbp/Uxr9aTuy6ca/8FbFloBUJZLHwnhTcnjIeRn2suQWsWzcuJhGjKDB5eppVte/8oCdOL3VuwxvZDUggwGQ==", + "requires": {} }, "bootstrap-icons": { "version": "1.11.3", @@ -17921,7 +17926,8 @@ "version": "6.0.3", "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz", "integrity": "sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==", - "dev": true + "dev": true, + "requires": {} }, "css-select": { "version": "4.3.0", @@ -19682,7 +19688,8 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "dev": true + "dev": true, + "requires": {} }, "ieee754": { "version": "1.2.1", @@ -20487,7 +20494,8 @@ "ws": { "version": "7.5.9", "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", - "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==" + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "requires": {} } } }, @@ -20711,7 +20719,8 @@ "version": "1.7.0", "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-1.7.0.tgz", "integrity": "sha512-pzum1TL7j90DTE86eFt48/s12hqwQuiD+e5aXx2Dc9wDEn2LfGq6RoAxEZZjFiN0RDSCOnosEKRZWxbQ+iMpQQ==", - "dev": true + "dev": true, + "requires": {} }, "karma-source-map-support": { "version": "1.4.0", @@ -21108,7 +21117,8 @@ "marked-highlight": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/marked-highlight/-/marked-highlight-2.1.3.tgz", - "integrity": "sha512-t35JWm2u8HanOJ+gSJBAYQ0Jgr3vy+gl7ORAXN8bSEQFHl5FYXH0A7YXVMrfhmKaSuBSy6LidXECn3U9Qv/dHA==" + "integrity": "sha512-t35JWm2u8HanOJ+gSJBAYQ0Jgr3vy+gl7ORAXN8bSEQFHl5FYXH0A7YXVMrfhmKaSuBSy6LidXECn3U9Qv/dHA==", + "requires": {} }, "media-typer": { "version": "0.3.0", @@ -22270,13 +22280,15 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", - "dev": true + "dev": true, + "requires": {} }, "postcss-gap-properties": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-3.0.3.tgz", "integrity": "sha512-rPPZRLPmEKgLk/KlXMqRaNkYTUpE7YC+bOIQFN5xcu1Vp11Y4faIXv6/Jpft6FMnl6YRxZqDZG0qQOW80stzxQ==", - "dev": true + "dev": true, + "requires": {} }, "postcss-image-set-function": { "version": "4.0.6", @@ -22302,7 +22314,8 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-4.0.1.tgz", "integrity": "sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==", - "dev": true + "dev": true, + "requires": {} }, "postcss-lab-function": { "version": "4.2.0", @@ -22329,19 +22342,22 @@ "version": "5.0.4", "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.4.tgz", "integrity": "sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==", - "dev": true + "dev": true, + "requires": {} }, "postcss-media-minmax": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz", "integrity": "sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==", - "dev": true + "dev": true, + "requires": {} }, "postcss-modules-extract-imports": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", - "dev": true + "dev": true, + "requires": {} }, "postcss-modules-local-by-default": { "version": "4.0.5", @@ -22392,13 +22408,15 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.3.tgz", "integrity": "sha512-CxZwoWup9KXzQeeIxtgOciQ00tDtnylYIlJBBODqkgS/PU2jISuWOL/mYLHmZb9ZhZiCaNKsCRiLp22dZUtNsg==", - "dev": true + "dev": true, + "requires": {} }, "postcss-page-break": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", - "dev": true + "dev": true, + "requires": {} }, "postcss-place": { "version": "7.0.4", @@ -22475,7 +22493,8 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", - "dev": true + "dev": true, + "requires": {} }, "postcss-selector-not": { "version": "5.0.0", @@ -23036,7 +23055,8 @@ "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true + "dev": true, + "requires": {} }, "json-schema-traverse": { "version": "0.4.1", @@ -23588,7 +23608,8 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-4.0.0.tgz", "integrity": "sha512-1V4WqhhZZgjVAVJyt7TdDPZoPBPNHbekX4fWnCJL1yQukhCeZhJySUL+gL9y6sNdN95uEOS83Y55SqHcP7MzLA==", - "dev": true + "dev": true, + "requires": {} }, "stylus": { "version": "0.57.0", @@ -23748,7 +23769,8 @@ "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true + "dev": true, + "requires": {} }, "json-schema-traverse": { "version": "0.4.1", @@ -24168,7 +24190,8 @@ "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true + "dev": true, + "requires": {} }, "json-schema-traverse": { "version": "0.4.1", @@ -24268,7 +24291,8 @@ "version": "8.8.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.8.0.tgz", "integrity": "sha512-JDAgSYQ1ksuwqfChJusw1LSJ8BizJ2e/vVu5Lxjq3YvNJNlROv1ui4i+c/kUUrPheBvQl4c5UbERhTwKa6QBJQ==", - "dev": true + "dev": true, + "requires": {} } } }, @@ -24409,7 +24433,8 @@ "version": "8.2.3", "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz", "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==", - "dev": true + "dev": true, + "requires": {} }, "xml-name-validator": { "version": "3.0.0", diff --git a/src/Analysim.Web/ClientApp/src/app/dashboard/dashboard-following/dashboard-following.component.scss b/src/Analysim.Web/ClientApp/src/app/dashboard/dashboard-following/dashboard-following.component.scss index 19d0c4ec..bd447b93 100644 --- a/src/Analysim.Web/ClientApp/src/app/dashboard/dashboard-following/dashboard-following.component.scss +++ b/src/Analysim.Web/ClientApp/src/app/dashboard/dashboard-following/dashboard-following.component.scss @@ -1,7 +1,134 @@ .card-header { background-color: var(--background-color-tertiary); + border-bottom: 1px solid var(--border-color); + padding: var(--space-3) var(--space-4); + font-weight: 600; + font-size: var(--fs-16); + color: var(--c-text-0); } -.nav-item:hover { +.nav-item { cursor: pointer; -} \ No newline at end of file + + .nav-link { + color: var(--c-text-500); + border: none; + border-bottom: 2px solid transparent; + padding: var(--space-2) var(--space-3); + font-size: var(--fs-14); + font-weight: 500; + transition: var(--motion-fast); + + &:hover { + color: var(--c-text-0); + border-bottom-color: var(--c-accent-600); + } + + &.active { + color: var(--c-accent-600); + border-bottom-color: var(--c-accent-600); + background: transparent; + } + } +} + +.nav-tabs-content { + padding: var(--space-2) 0; + + .list-unstyled { + list-style: none; + padding: 0; + margin: 0; + + li { + padding: var(--space-2) 0; + + &:not(:last-child) { + border-bottom: 1px solid rgba(0, 0, 0, 0.05); + } + + a { + color: var(--c-link); + text-decoration: none; + transition: var(--motion-fast); + display: flex; + align-items: center; + padding: var(--space-2) var(--space-2); + border-radius: var(--radius-1); + margin: calc(var(--space-2) * -1); + font-size: var(--fs-14); + + i { + margin-right: var(--space-2); + width: 14px; + text-align: center; + } + + &:hover { + color: var(--c-link-hover); + background: rgba(37, 109, 133, 0.05); + } + } + + .d-flex { + justify-content: center; + padding: var(--space-4) 0; + + .spinner-border { + width: 2rem; + height: 2rem; + border-color: var(--c-accent-600); + border-right-color: transparent; + } + + p { + color: var(--c-text-500); + font-size: var(--fs-14); + margin: 0; + } + } + } + } +} + +/* Input styling */ +.form { + .input-group { + margin-bottom: 0; + + .form-control { + border: 1px solid var(--border-color); + border-radius: var(--radius-1); + padding: var(--space-2) var(--space-3); + font-size: var(--fs-14); + transition: var(--motion-fast); + + &:focus { + border-color: var(--c-accent-600); + box-shadow: 0 0 0 3px rgba(37, 109, 133, 0.1); + } + + &::placeholder { + color: var(--c-text-500); + } + } + + .input-group-append { + margin-left: -1px; + + .input-group-text { + border: 1px solid var(--border-color); + background: white; + color: var(--c-text-500); + cursor: pointer; + transition: var(--motion-fast); + padding: var(--space-2) var(--space-3); + border-left: none; + + &:hover { + color: var(--c-accent-600); + } + } + } + } +} diff --git a/src/Analysim.Web/ClientApp/src/app/dashboard/dashboard-quickstart/dashboard-quickstart.component.scss b/src/Analysim.Web/ClientApp/src/app/dashboard/dashboard-quickstart/dashboard-quickstart.component.scss index 33e51056..a613a3c0 100644 --- a/src/Analysim.Web/ClientApp/src/app/dashboard/dashboard-quickstart/dashboard-quickstart.component.scss +++ b/src/Analysim.Web/ClientApp/src/app/dashboard/dashboard-quickstart/dashboard-quickstart.component.scss @@ -1,13 +1,122 @@ .card-header { background-color: var(--background-color-tertiary); + border-bottom: 1px solid var(--border-color); } .btn-sm { - background-color: var(--button-background-color); - color: var(--primary-color); - border:none; + background-color: var(--c-accent-600); + color: white; + border: none; + padding: var(--space-1) var(--space-3); + border-radius: var(--radius-1); + font-weight: 500; + cursor: pointer; + transition: var(--motion-fast); + white-space: nowrap; + + &:hover { + background-color: var(--c-brand-800); + } } -.nav-item:hover { +.nav-item { cursor: pointer; -} \ No newline at end of file + + &:hover .nav-link { + border-bottom-color: var(--c-accent-600); + } +} + +.nav-tabs-content { + padding: var(--space-2) 0; + + .list-unstyled { + list-style: none; + padding: 0; + margin: 0; + + li { + padding: var(--space-2) 0; + + &:not(:last-child) { + border-bottom: 1px solid rgba(0, 0, 0, 0.05); + } + + a { + color: var(--c-link); + text-decoration: none; + transition: var(--motion-fast); + display: flex; + align-items: center; + padding: var(--space-2) var(--space-2); + border-radius: var(--radius-1); + margin: calc(var(--space-2) * -1); + + i { + margin-right: var(--space-2); + width: 14px; + text-align: center; + } + + &:hover { + color: var(--c-link-hover); + background: rgba(37, 109, 133, 0.05); + } + } + + .d-flex { + justify-content: center; + padding: var(--space-4) 0; + + .spinner-border { + width: 2rem; + height: 2rem; + border-color: var(--c-accent-600); + border-right-color: transparent; + } + + p { + color: var(--c-text-500); + } + } + } + } +} + +/* Input styling */ +.form { + .input-group { + margin-bottom: 0; + + .form-control { + border: 1px solid var(--border-color); + border-radius: var(--radius-1); + padding: var(--space-2) var(--space-3); + font-size: var(--fs-14); + transition: var(--motion-fast); + + &:focus { + border-color: var(--c-accent-600); + box-shadow: 0 0 0 3px rgba(37, 109, 133, 0.1); + } + } + + .input-group-append { + margin-left: -1px; + + .input-group-text { + border: 1px solid var(--border-color); + background: white; + color: var(--c-text-500); + cursor: pointer; + transition: var(--motion-fast); + padding: var(--space-2) var(--space-3); + border-left: none; + + &:hover { + color: var(--c-accent-600); + } + } + } + } +} diff --git a/src/Analysim.Web/ClientApp/src/app/dashboard/dashboard-social/dashboard-social.component.scss b/src/Analysim.Web/ClientApp/src/app/dashboard/dashboard-social/dashboard-social.component.scss index 19d0c4ec..4eaa7329 100644 --- a/src/Analysim.Web/ClientApp/src/app/dashboard/dashboard-social/dashboard-social.component.scss +++ b/src/Analysim.Web/ClientApp/src/app/dashboard/dashboard-social/dashboard-social.component.scss @@ -1,7 +1,66 @@ -.card-header { - background-color: var(--background-color-tertiary); +.card { + border: 1px solid var(--border-color); + border-radius: 8px; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.08); + transition: all var(--motion-fast); + background: white; + height: 100%; + + &:hover { + box-shadow: 0 4px 12px rgba(37, 109, 133, 0.12); + border-color: var(--c-accent-600); + } + + .card-header { + background-color: var(--background-color-tertiary); + border-bottom: 1px solid var(--border-color); + padding: var(--space-3) var(--space-4); + font-weight: 600; + font-size: var(--fs-16); + color: var(--c-text-0); + } + + .list-group { + list-style: none; + padding: 0; + margin: 0; + border: none; + + .list-group-item { + border: none; + padding: 0; + background: transparent; + + &:not(:last-child) { + border-bottom: 1px solid rgba(0, 0, 0, 0.05); + } + + &.d-flex { + justify-content: center; + padding: var(--space-4); + + p { + color: var(--c-text-500); + font-size: var(--fs-14); + margin: 0; + } + } + } + + .list-group-flush { + margin: 0; + + .list-group-item { + padding: var(--space-3) var(--space-4); + + &:last-child { + border-bottom: none; + } + } + } + } } .nav-item:hover { cursor: pointer; -} \ No newline at end of file +} diff --git a/src/Analysim.Web/ClientApp/src/app/dashboard/dashboard.component.html b/src/Analysim.Web/ClientApp/src/app/dashboard/dashboard.component.html index df8e1baa..954b1314 100644 --- a/src/Analysim.Web/ClientApp/src/app/dashboard/dashboard.component.html +++ b/src/Analysim.Web/ClientApp/src/app/dashboard/dashboard.component.html @@ -1,29 +1,24 @@ -
+
-
-
+
+ +
- -
-
-
- -
-
-
-
- -
-
-
- -
- -
+
+ +
-
- -
+
+
+ +
+
+
+ +
+ +
+
diff --git a/src/Analysim.Web/ClientApp/src/app/dashboard/dashboard.component.scss b/src/Analysim.Web/ClientApp/src/app/dashboard/dashboard.component.scss index e69de29b..591dd25b 100644 --- a/src/Analysim.Web/ClientApp/src/app/dashboard/dashboard.component.scss +++ b/src/Analysim.Web/ClientApp/src/app/dashboard/dashboard.component.scss @@ -0,0 +1,335 @@ +::ng-deep .dashboard-container { + padding: var(--space-5); + background: linear-gradient(135deg, rgba(37, 109, 133, 0.03) 0%, rgba(2, 43, 91, 0.02) 100%); + min-height: calc(100vh - 200px); + + .row { + row-gap: var(--space-4); + } + + .col-md-4, + .col-md-8 { + padding-left: var(--space-3); + padding-right: var(--space-3); + } + + /* Card styling */ + .card { + border: 1px solid var(--border-color); + border-radius: 8px; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.08); + transition: all var(--motion-fast); + background: white; + overflow: hidden; + + &:hover { + box-shadow: 0 4px 12px rgba(37, 109, 133, 0.12); + border-color: var(--c-accent-600); + } + + .card-header { + background-color: var(--background-color-tertiary); + border-bottom: 1px solid var(--border-color); + padding: var(--space-4); + font-weight: 600; + font-size: var(--fs-16); + color: var(--c-text-0); + display: flex; + align-items: center; + justify-content: space-between; + + span { + margin: 0; + } + } + + .card-body { + padding: var(--space-4); + + .card-block { + margin-bottom: var(--space-4); + + &:last-child { + margin-bottom: 0; + } + } + + .form { + .input-group { + margin-bottom: var(--space-2); + + .form-control { + border: 1px solid var(--border-color); + border-radius: var(--radius-1); + padding: var(--space-2) var(--space-3); + font-size: var(--fs-14); + transition: var(--motion-fast); + + &:focus { + border-color: var(--c-accent-600); + box-shadow: 0 0 0 3px rgba(37, 109, 133, 0.1); + } + + &::placeholder { + color: var(--c-text-500); + } + } + + .input-group-append { + .input-group-text { + border: 1px solid var(--border-color); + background: white; + color: var(--c-text-500); + cursor: pointer; + transition: var(--motion-fast); + + &:hover { + color: var(--c-accent-600); + } + } + } + } + } + + /* Nav tabs styling */ + .nav-tabs { + border-bottom: 2px solid var(--border-color); + gap: var(--space-2); + margin-bottom: var(--space-3); + + .nav-item { + .nav-link { + color: var(--c-text-500); + border: none; + border-bottom: 2px solid transparent; + padding: var(--space-2) var(--space-3); + font-size: var(--fs-14); + font-weight: 500; + transition: var(--motion-fast); + cursor: pointer; + + &:hover { + color: var(--c-text-0); + border-bottom-color: var(--c-accent-600); + } + + &.active { + color: var(--c-accent-600); + border-bottom-color: var(--c-accent-600); + background: transparent; + } + + &.disabled { + color: var(--c-text-500); + opacity: 0.5; + cursor: not-allowed; + } + } + } + } + + /* List styling */ + .nav-tabs-content { + padding: var(--space-2) 0; + + .list-unstyled { + list-style: none; + padding: 0; + margin: 0; + + li { + padding: var(--space-2) 0; + border-bottom: 1px solid rgba(0, 0, 0, 0.05); + + &:last-child { + border-bottom: none; + } + + a { + display: flex; + align-items: center; + color: var(--c-link); + text-decoration: none; + font-size: var(--fs-14); + transition: var(--motion-fast); + padding: var(--space-2); + border-radius: var(--radius-1); + margin: calc(var(--space-2) * -1); + + i { + margin-right: var(--space-2); + width: 16px; + text-align: center; + } + + &:hover { + color: var(--c-link-hover); + background: rgba(37, 109, 133, 0.05); + + } + } + + .d-flex { + justify-content: center; + padding: var(--space-4) 0; + + .spinner-border { + width: 2rem; + height: 2rem; + border-color: var(--c-accent-600); + border-right-color: transparent; + } + + p { + color: var(--c-text-500); + font-size: var(--fs-14); + } + } + } + } + } + } + } + + /* Button styling */ + .btn-sm { + background-color: var(--c-accent-600); + color: white; + border: none; + padding: var(--space-1) var(--space-3); + border-radius: var(--radius-1); + font-size: var(--fs-14); + font-weight: 500; + cursor: pointer; + transition: var(--motion-fast); + + &:hover { + background-color: var(--c-brand-800); + box-shadow: 0 2px 8px rgba(37, 109, 133, 0.2); + } + + &:active { + transform: translateY(1px); + } + } +} + +/* Mobile responsiveness */ +@media (max-width: 768px) { + ::ng-deep .dashboard-container { + padding: var(--space-4); + + .col-md-4, + .col-md-8 { + padding-left: var(--space-2); + padding-right: var(--space-2); + } + + .container-fluid { + padding: 0; + } + + .row { + margin-left: calc(var(--space-2) * -1); + margin-right: calc(var(--space-2) * -1); + } + + .card { + .card-header { + flex-direction: column; + align-items: flex-start; + gap: var(--space-2); + + span { + width: 100%; + } + + .btn-sm { + width: 100%; + } + } + + .card-body { + padding: var(--space-3); + + .form { + .input-group { + .input-group-append { + margin-left: -1px; + + .input-group-text { + border-left: none; + } + } + } + } + + .nav-tabs { + gap: 0; + + .nav-item { + flex: 1; + + .nav-link { + padding: var(--space-2) var(--space-1); + text-align: center; + border-bottom: 2px solid var(--border-color); + border-radius: 0; + + &.active { + border-bottom-color: var(--c-accent-600); + } + } + } + } + + .nav-tabs-content { + .list-unstyled { + li { + padding: var(--space-1) 0; + + a { + padding: var(--space-1); + margin: 0; + font-size: var(--fs-13); + } + } + } + } + } + } + } +} + +@media (max-width: 576px) { + ::ng-deep .dashboard-container { + padding: var(--space-3); + + .col-md-4, + .col-md-8 { + padding-left: 0; + padding-right: 0; + } + + .card { + .card-body { + padding: var(--space-2); + + .card-block { + margin-bottom: var(--space-2); + } + + .nav-tabs { + margin-bottom: var(--space-2); + + .nav-item { + .nav-link { + padding: var(--space-1) var(--space-2); + font-size: var(--fs-13); + } + } + } + } + } + } +} diff --git a/src/Analysim.Web/ClientApp/src/app/projects/project-file-explorer/csvdata-browser/csvdata-browser.component.html b/src/Analysim.Web/ClientApp/src/app/projects/project-file-explorer/csvdata-browser/csvdata-browser.component.html index b0fa151f..5cdf7e3f 100644 --- a/src/Analysim.Web/ClientApp/src/app/projects/project-file-explorer/csvdata-browser/csvdata-browser.component.html +++ b/src/Analysim.Web/ClientApp/src/app/projects/project-file-explorer/csvdata-browser/csvdata-browser.component.html @@ -1,107 +1,127 @@ -
- +
+
+ - -
- - + +
+
+
+ + - - - - - -
+ + + + + +
-
- - {{item}} - {{item}} - +
+ + {{item}} + {{item}} + - -
- + +
+
+
+
- - - - - - + + + + + + - -
- {{column}} - - - -
- - -
+ +
+ {{column}} +
+ + + +
+
+ + +
- - - - - - {{ item[col] }} - - + + + + + + + {{ item[col] }} + + + -
+ -
- +
@@ -111,4 +131,4 @@ [data]="(!selectedData || selectedData.length===0) ? tableData : selectedData" [columnDataTypes]="columnDataTypes"> - \ No newline at end of file + diff --git a/src/Analysim.Web/ClientApp/src/app/projects/project-file-explorer/csvdata-browser/csvdata-browser.component.scss b/src/Analysim.Web/ClientApp/src/app/projects/project-file-explorer/csvdata-browser/csvdata-browser.component.scss index 7976b6e5..106534f8 100644 --- a/src/Analysim.Web/ClientApp/src/app/projects/project-file-explorer/csvdata-browser/csvdata-browser.component.scss +++ b/src/Analysim.Web/ClientApp/src/app/projects/project-file-explorer/csvdata-browser/csvdata-browser.component.scss @@ -3,63 +3,355 @@ height: 100%; } +.csv-container { + display: flex; + flex-direction: column; + height: 100%; + padding: var(--space-3); + background: white; +} + .data-table-card { height: 100%; display: flex; flex-direction: column; + border: 1px solid var(--border-color); + border-radius: 8px; + overflow: hidden; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.08); +} + +/* Table controls */ +.table-controls { + padding: var(--space-4); + border-bottom: 1px solid var(--border-color); + background: var(--background-color-tertiary); } -/* Caption rows */ .table-header { display: flex; - align-items: center; - justify-content: space-between; - gap: var(--space-2); - margin-bottom: var(--space-3); + flex-direction: column; + gap: var(--space-3); + + .header-filters { + display: flex; + align-items: center; + gap: var(--space-2); + flex-wrap: wrap; + } + + .header-actions { + display: flex; + align-items: center; + gap: var(--space-2); + flex-wrap: wrap; + justify-content: flex-end; + } } -.table-tools { - display: flex; +/* Button styling */ +.btn { + padding: var(--space-2) var(--space-3); + font-size: var(--fs-14); + font-weight: 500; + border-radius: var(--radius-1); + transition: var(--motion-fast); + border: 1px solid transparent; + cursor: pointer; + display: inline-flex; align-items: center; - justify-content: space-between; - gap: var(--space-2); + gap: var(--space-1); + + &:disabled { + opacity: var(--opacity-disabled); + cursor: not-allowed; + } + + &:not(:disabled):hover { + transform: translateY(-1px); + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); + } + + &:not(:disabled):active { + transform: translateY(0); + } +} + +.btn-primary { + background-color: var(--c-accent-600); + color: white; + border-color: var(--c-accent-600); + + &:not(:disabled):hover { + background-color: var(--c-brand-800); + border-color: var(--c-brand-800); + } } -/* Make the search input behave */ +.btn-outline-secondary { + background-color: white; + color: var(--c-text-500); + border-color: var(--border-color); + + &:not(:disabled):hover { + background-color: var(--background-color-tertiary); + border-color: var(--c-accent-600); + color: var(--c-accent-600); + } +} + +.btn-success { + background-color: var(--c-success-600); + color: white; + border-color: var(--c-success-600); + + &:not(:disabled):hover { + background-color: darken(#28a745, 10%); + border-color: darken(#28a745, 10%); + } +} + +.btn-sm { + padding: var(--space-1) var(--space-2); + font-size: var(--fs-13); +} + +/* Search input styling */ .table-search { - width: min(380px, 100%); + position: relative; + flex: 1; + min-width: 200px; + max-width: 100%; + + i { + left: var(--space-3); + } + + .search-input { + width: 100%; + padding-left: var(--space-4); + padding: var(--space-2) var(--space-3); + border: 1px solid var(--border-color); + border-radius: var(--radius-1); + font-size: var(--fs-14); + transition: var(--motion-fast); + + &:focus { + border-color: var(--c-accent-600); + box-shadow: 0 0 0 3px rgba(37, 109, 133, 0.1); + outline: none; + } + + &::placeholder { + color: var(--c-text-500); + } + } } -.table-search input { - width: 100%; +/* Column selector styling */ +.column-selector { + min-width: 180px; + + ::ng-deep { + .p-multiselect { + border: 1px solid var(--border-color); + border-radius: var(--radius-1); + padding: var(--space-2) var(--space-3); + + &:hover { + border-color: var(--c-accent-600); + } + + &.p-focus { + border-color: var(--c-accent-600); + box-shadow: 0 0 0 3px rgba(37, 109, 133, 0.1); + } + } + } } -/* Icon spacing inside our Bootstrap button */ -.table-header .btn i { - margin-right: var(--space-1); +/* PrimeNG Table overrides */ +::ng-deep { + .csv-datatable { + border: none; + + .p-datatable-thead > tr > th { + background-color: var(--background-color-tertiary); + border-color: var(--border-color); + padding: var(--space-3); + font-weight: 600; + font-size: var(--fs-14); + color: var(--c-text-0); + } + + .p-datatable-tbody > tr { + border-color: var(--border-color); + + > td { + padding: var(--space-2) var(--space-3); + border-color: var(--border-color); + font-size: var(--fs-14); + } + + &:hover { + background-color: rgba(37, 109, 133, 0.03); + } + } + + .p-datatable-thead > tr > th { + &.checkbox-col { + width: 3rem; + text-align: center; + } + + &.data-header { + .header-content { + display: flex; + align-items: center; + justify-content: space-between; + gap: var(--space-2); + + .column-name { + flex: 1; + word-break: break-word; + } + + .header-icons { + display: flex; + align-items: center; + gap: var(--space-1); + flex-shrink: 0; + } + } + } + } + + .p-datatable-tbody > tr > td { + &.checkbox-col { + width: 3rem; + text-align: center; + } + + &.data-cell { + .cell-content { + word-break: break-word; + max-width: 200px; + } + } + } + + /* Paginator styling */ + .p-paginator { + border-top: 1px solid var(--border-color); + background-color: var(--background-color-tertiary); + padding: var(--space-3); + + .p-paginator-current { + font-size: var(--fs-14); + } + } + + /* Filter styling */ + .p-column-filter { + display: flex; + align-items: center; + + .p-column-filter-menu-icon { + color: var(--c-text-500); + } + + &:hover { + .p-column-filter-menu-icon { + color: var(--c-accent-600); + } + } + } + } } -/* Footer export row */ -.export-row { +/* Table footer */ +.table-footer { width: 100%; display: flex; justify-content: center; - padding: var(--space-3); + padding: var(--space-4); + border-top: 1px solid var(--border-color); + background-color: #fafafa; + gap: var(--space-2); } -/* Responsive stacking */ +/* Mobile responsiveness */ @media (max-width: 768px) { - .table-header, - .table-tools { - flex-direction: column; - align-items: stretch; + .csv-container { + padding: var(--space-2); } - .table-search { - width: 100%; + .table-controls { + padding: var(--space-3); } - .table-tools .btn { - width: 100%; + .table-header { + gap: var(--space-2); + + .header-filters { + flex-direction: column; + + .btn, + .table-search { + width: 100%; + } + + .table-search { + max-width: 100%; + min-width: auto; + } + } + + .header-actions { + flex-direction: column; + + .column-selector, + .btn { + width: 100%; + } + } + } + + ::ng-deep { + .csv-datatable { + font-size: var(--fs-13); + + .p-datatable-thead > tr > th { + padding: var(--space-2); + } + + .p-datatable-tbody > tr > td { + padding: var(--space-2); + + &.data-cell { + .cell-content { + max-width: 100px; + } + } + } + + .p-paginator { + padding: var(--space-2); + flex-wrap: wrap; + + .p-paginator-current { + font-size: var(--fs-13); + } + } + } + } + + .table-footer { + padding: var(--space-3); + + .btn { + width: 100%; + } } } + diff --git a/src/Analysim.Web/ClientApp/src/app/projects/project-file-explorer/project-file-explorer.component.html b/src/Analysim.Web/ClientApp/src/app/projects/project-file-explorer/project-file-explorer.component.html index 37c8da48..6b8e2f6c 100644 --- a/src/Analysim.Web/ClientApp/src/app/projects/project-file-explorer/project-file-explorer.component.html +++ b/src/Analysim.Web/ClientApp/src/app/projects/project-file-explorer/project-file-explorer.component.html @@ -131,6 +131,29 @@
+
+
+ + + +
+
+