@necrolab/dashboard 0.5.12 → 0.5.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.playwright-mcp/verification-accounts-desktop.png +0 -0
- package/.playwright-mcp/verification-tasks-desktop.png +0 -0
- package/.playwright-mcp/verification-tasks-mobile.png +0 -0
- package/README.md +21 -0
- package/docs/plans/2026-02-08-tailwind-consolidation-results.md +476 -0
- package/docs/plans/2026-02-08-tailwind-consolidation.md +2416 -0
- package/package.json +1 -1
- package/src/App.vue +2 -163
- package/src/assets/css/components/buttons.scss +43 -95
- package/src/assets/css/components/forms.scss +10 -28
- package/src/assets/css/components/search-groups.scss +80 -0
- package/src/assets/css/components/tables.scss +0 -8
- package/src/assets/css/main.scss +2 -43
- package/src/components/Editors/Account/Account.vue +14 -220
- package/src/components/Editors/Account/AccountCreator.vue +0 -4
- package/src/components/Editors/Account/AccountView.vue +0 -1
- package/src/components/Editors/Account/CreateAccount.vue +36 -107
- package/src/components/Editors/Profile/CreateProfile.vue +46 -135
- package/src/components/Editors/Profile/Profile.vue +10 -213
- package/src/components/Editors/Profile/ProfileView.vue +0 -1
- package/src/components/Filter/Filter.vue +14 -17
- package/src/components/Filter/FilterPreview.vue +0 -6
- package/src/components/Table/Row.vue +1 -1
- package/src/components/Table/Table.vue +2 -16
- package/src/components/Tasks/CreateTaskAXS.vue +45 -104
- package/src/components/Tasks/CreateTaskTM.vue +58 -96
- package/src/components/Tasks/Task.vue +22 -209
- package/src/components/Tasks/TaskView.vue +5 -4
- package/src/components/Tasks/ViewTask.vue +201 -214
- package/src/components/icons/Copy.vue +6 -0
- package/src/components/icons/index.js +3 -1
- package/src/components/ui/ActionButtonGroup.vue +70 -0
- package/src/components/ui/FormField.vue +74 -0
- package/src/components/ui/InfoRow.vue +98 -0
- package/src/components/ui/Modal.vue +6 -47
- package/src/components/ui/Navbar.vue +15 -43
- package/src/components/ui/ReconnectIndicator.vue +4 -4
- package/src/components/ui/SectionCard.vue +24 -0
- package/src/components/ui/Splash.vue +1 -6
- package/src/components/ui/StatusBadge.vue +37 -0
- package/src/components/ui/controls/CountryChooser.vue +14 -58
- package/src/components/ui/controls/atomic/Dropdown.vue +16 -24
- package/src/components/ui/controls/atomic/MultiDropdown.vue +7 -1
- package/src/components/ui/controls/atomic/Switch.vue +13 -29
- package/src/composables/useCopyToClipboard.js +25 -0
- package/src/composables/useRowSelection.js +48 -0
- package/src/views/Accounts.vue +0 -81
- package/src/views/Console.vue +4 -21
- package/src/views/Editor.vue +48 -138
- package/src/views/FilterBuilder.vue +0 -23
- package/src/views/Login.vue +14 -63
- package/src/views/Profiles.vue +0 -82
- package/src/views/Tasks.vue +3 -24
- package/tailwind.config.js +47 -5
package/package.json
CHANGED
package/src/App.vue
CHANGED
|
@@ -1,15 +1,5 @@
|
|
|
1
1
|
<template>
|
|
2
|
-
<div class="layout">
|
|
3
|
-
<!-- iPhone Landscape Lock Overlay -->
|
|
4
|
-
<div v-if="!isIpadOS() && isIOS()" class="iphone-landscape-lock">
|
|
5
|
-
<div class="rotate-message">
|
|
6
|
-
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor" class="rotate-icon">
|
|
7
|
-
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15" />
|
|
8
|
-
</svg>
|
|
9
|
-
<p class="rotate-text">Please rotate your device to portrait mode</p>
|
|
10
|
-
</div>
|
|
11
|
-
</div>
|
|
12
|
-
|
|
2
|
+
<div class="layout min-h-screen h-screen">
|
|
13
3
|
<transition name="fade">
|
|
14
4
|
<Splash v-if="isLoading" />
|
|
15
5
|
</transition>
|
|
@@ -60,10 +50,7 @@
|
|
|
60
50
|
<component
|
|
61
51
|
:is="Component"
|
|
62
52
|
:key="route.path"
|
|
63
|
-
|
|
64
|
-
'component-container pb-2 mt-0 lg:mt-4 ios-wrapper',
|
|
65
|
-
{ 'w-full': landscapeIos }
|
|
66
|
-
]" />
|
|
53
|
+
class="component-container w-full mx-auto px-3 xs:px-3 md:px-2 lg:px-6 xl:px-10 pb-2 mt-0 lg:mt-4 ios-wrapper" />
|
|
67
54
|
</transition>
|
|
68
55
|
</router-view>
|
|
69
56
|
</div>
|
|
@@ -84,7 +71,6 @@ const ui = useUIStore();
|
|
|
84
71
|
const router = useRouter();
|
|
85
72
|
const isLoading = ref(false);
|
|
86
73
|
const spinner = storeToRefs(ui).showSpinner;
|
|
87
|
-
const landscapeIos = ref(false);
|
|
88
74
|
|
|
89
75
|
function isIOS() {
|
|
90
76
|
if (/iPad|iPhone|iPod/.test(navigator.platform)) {
|
|
@@ -98,33 +84,6 @@ function isIpadOS() {
|
|
|
98
84
|
return navigator.maxTouchPoints && navigator.maxTouchPoints > 2 && /MacIntel/.test(navigator.platform);
|
|
99
85
|
}
|
|
100
86
|
|
|
101
|
-
// Lock iPhone (not iPad) to portrait orientation only
|
|
102
|
-
function lockOrientationToPortrait() {
|
|
103
|
-
if (isIOS() && !isIpadOS()) {
|
|
104
|
-
// Try to lock orientation using Screen Orientation API
|
|
105
|
-
if (screen.orientation && screen.orientation.lock) {
|
|
106
|
-
screen.orientation.lock('portrait').catch(() => {
|
|
107
|
-
// Silently fail if not supported or in browser (vs PWA)
|
|
108
|
-
});
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
// Also prevent landscape handling
|
|
112
|
-
const preventLandscape = () => {
|
|
113
|
-
if (window.innerWidth > window.innerHeight) {
|
|
114
|
-
// Force dimensions to portrait if somehow in landscape
|
|
115
|
-
document.documentElement.style.setProperty('width', window.innerHeight + 'px');
|
|
116
|
-
document.documentElement.style.setProperty('height', window.innerWidth + 'px');
|
|
117
|
-
}
|
|
118
|
-
};
|
|
119
|
-
|
|
120
|
-
window.addEventListener('orientationchange', preventLandscape);
|
|
121
|
-
window.addEventListener('resize', preventLandscape);
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
// Run orientation lock on mount
|
|
126
|
-
lockOrientationToPortrait();
|
|
127
|
-
|
|
128
87
|
// Prevent pinch-to-zoom gestures
|
|
129
88
|
let lastTouchDistance = 0;
|
|
130
89
|
|
|
@@ -162,28 +121,6 @@ document.addEventListener('touchend', (e) => {
|
|
|
162
121
|
lastTouchEnd = now;
|
|
163
122
|
}, { passive: false });
|
|
164
123
|
|
|
165
|
-
// Handle orientation changes for iOS devices
|
|
166
|
-
const handleOrientationChange = () => {
|
|
167
|
-
if (isIOS()) {
|
|
168
|
-
if (isIpadOS()) {
|
|
169
|
-
// For iPad, we want to allow proper viewport resizing
|
|
170
|
-
landscapeIos.value = window.matchMedia("(orientation: landscape)").matches;
|
|
171
|
-
document.documentElement.style.setProperty("width", "100%", "important");
|
|
172
|
-
document.body.style.setProperty("width", "100%", "important");
|
|
173
|
-
} else {
|
|
174
|
-
// For iPhone, maintain the current behavior
|
|
175
|
-
landscapeIos.value = window.matchMedia("(orientation: landscape)").matches;
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
};
|
|
179
|
-
|
|
180
|
-
// Initial orientation check
|
|
181
|
-
handleOrientationChange();
|
|
182
|
-
|
|
183
|
-
// Listen for orientation changes
|
|
184
|
-
window.matchMedia("(orientation: portrait)").addEventListener("change", handleOrientationChange);
|
|
185
|
-
window.matchMedia("(orientation: landscape)").addEventListener("change", handleOrientationChange);
|
|
186
|
-
|
|
187
124
|
if (!window.location.href.includes(":5173")) ui.startSpinner("Loading...");
|
|
188
125
|
|
|
189
126
|
// Ensure notch handling runs when Vue app mounts
|
|
@@ -673,33 +610,6 @@ watch(
|
|
|
673
610
|
const layout = computed(() => router.currentRoute.value.meta.layout);
|
|
674
611
|
</script>
|
|
675
612
|
<style lang="scss">
|
|
676
|
-
// Ultra bulletproof scroll prevention and zoom prevention
|
|
677
|
-
html,
|
|
678
|
-
body {
|
|
679
|
-
overflow: hidden !important;
|
|
680
|
-
overscroll-behavior: none !important;
|
|
681
|
-
width: 100% !important;
|
|
682
|
-
height: 100% !important;
|
|
683
|
-
touch-action: none !important;
|
|
684
|
-
// Prevent zoom on desktop
|
|
685
|
-
zoom: 1;
|
|
686
|
-
-moz-transform: scale(1);
|
|
687
|
-
-moz-transform-origin: 0 0;
|
|
688
|
-
}
|
|
689
|
-
|
|
690
|
-
#app {
|
|
691
|
-
overflow: hidden !important;
|
|
692
|
-
overscroll-behavior: none !important;
|
|
693
|
-
width: 100% !important;
|
|
694
|
-
height: 100vh !important;
|
|
695
|
-
touch-action: none !important;
|
|
696
|
-
}
|
|
697
|
-
|
|
698
|
-
// Prevent zoom but allow scrolling on specific elements
|
|
699
|
-
* {
|
|
700
|
-
touch-action: manipulation !important;
|
|
701
|
-
}
|
|
702
|
-
|
|
703
613
|
// Override for scrollable containers - allow proper touch scrolling
|
|
704
614
|
.table-component,
|
|
705
615
|
.stop-pan,
|
|
@@ -728,73 +638,6 @@ body {
|
|
|
728
638
|
z-index: 1;
|
|
729
639
|
}
|
|
730
640
|
|
|
731
|
-
.layout {
|
|
732
|
-
@apply flex flex-col;
|
|
733
|
-
min-height: 90vh;
|
|
734
|
-
overflow: hidden !important;
|
|
735
|
-
height: 100vh !important;
|
|
736
|
-
}
|
|
737
|
-
|
|
738
|
-
// iPhone landscape lock overlay
|
|
739
|
-
.iphone-landscape-lock {
|
|
740
|
-
position: fixed;
|
|
741
|
-
inset: 0;
|
|
742
|
-
background: oklch(0.1822 0 0);
|
|
743
|
-
z-index: 99999;
|
|
744
|
-
align-items: center;
|
|
745
|
-
justify-content: center;
|
|
746
|
-
display: flex;
|
|
747
|
-
opacity: 1;
|
|
748
|
-
transition: opacity 0.1s ease-out;
|
|
749
|
-
|
|
750
|
-
// Hide in portrait mode
|
|
751
|
-
@media (max-device-width: 430px) and (orientation: portrait) {
|
|
752
|
-
opacity: 0;
|
|
753
|
-
pointer-events: none;
|
|
754
|
-
}
|
|
755
|
-
|
|
756
|
-
// Show immediately in landscape
|
|
757
|
-
@media (max-device-width: 430px) and (orientation: landscape) {
|
|
758
|
-
opacity: 1;
|
|
759
|
-
pointer-events: all;
|
|
760
|
-
}
|
|
761
|
-
|
|
762
|
-
// Hide completely on iPad and desktop
|
|
763
|
-
@media (min-device-width: 431px) {
|
|
764
|
-
display: none;
|
|
765
|
-
}
|
|
766
|
-
|
|
767
|
-
.rotate-message {
|
|
768
|
-
text-align: center;
|
|
769
|
-
padding: 2rem;
|
|
770
|
-
|
|
771
|
-
.rotate-icon {
|
|
772
|
-
width: 64px;
|
|
773
|
-
height: 64px;
|
|
774
|
-
margin: 0 auto 1rem;
|
|
775
|
-
color: oklch(0.72 0.15 145);
|
|
776
|
-
animation: rotate-pulse 2s ease-in-out infinite;
|
|
777
|
-
}
|
|
778
|
-
|
|
779
|
-
.rotate-text {
|
|
780
|
-
color: oklch(0.9 0 0);
|
|
781
|
-
font-size: 1.125rem;
|
|
782
|
-
font-weight: 500;
|
|
783
|
-
}
|
|
784
|
-
}
|
|
785
|
-
}
|
|
786
|
-
|
|
787
|
-
@keyframes rotate-pulse {
|
|
788
|
-
0%, 100% {
|
|
789
|
-
transform: rotate(0deg) scale(1);
|
|
790
|
-
opacity: 1;
|
|
791
|
-
}
|
|
792
|
-
50% {
|
|
793
|
-
transform: rotate(90deg) scale(1.1);
|
|
794
|
-
opacity: 0.8;
|
|
795
|
-
}
|
|
796
|
-
}
|
|
797
|
-
|
|
798
641
|
.router-wrapper {
|
|
799
642
|
@apply pt-5;
|
|
800
643
|
transition: margin 0.25s;
|
|
@@ -805,10 +648,6 @@ body {
|
|
|
805
648
|
transition: margin 0.25s;
|
|
806
649
|
}
|
|
807
650
|
|
|
808
|
-
.component-container {
|
|
809
|
-
@apply w-full mx-auto px-4 xs:px-4 md:px-2 lg:px-6 xl:px-10;
|
|
810
|
-
}
|
|
811
|
-
|
|
812
651
|
// Page navigation transitions
|
|
813
652
|
.page-transition-enter-active {
|
|
814
653
|
transition: all 0.2s cubic-bezier(0.25, 0.46, 0.45, 0.94);
|
|
@@ -5,65 +5,50 @@
|
|
|
5
5
|
/* Primary Button - Solid green with clean shadow */
|
|
6
6
|
.btn-primary {
|
|
7
7
|
@apply font-medium transition-all duration-150;
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
border-radius: 0.375rem;
|
|
12
|
-
box-shadow: 0 1px 2px oklch(0 0 0 / 0.1);
|
|
13
|
-
border: 2px solid oklch(0.72 0.15 145);
|
|
8
|
+
@apply bg-accent-green text-white;
|
|
9
|
+
@apply px-4 py-2 rounded-md;
|
|
10
|
+
@apply shadow-sm border-2 border-accent-green;
|
|
14
11
|
|
|
15
12
|
&:hover {
|
|
16
|
-
|
|
17
|
-
border-color: oklch(0.68 0.15 145);
|
|
13
|
+
@apply bg-green-400 border-green-400;
|
|
18
14
|
}
|
|
19
15
|
|
|
20
16
|
&:active {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
outline: 1px solid oklch(0.72 0.15 145);
|
|
24
|
-
outline-offset: 0;
|
|
17
|
+
@apply bg-green-500 border-accent-green;
|
|
18
|
+
@apply outline outline-1 outline-accent-green outline-offset-0;
|
|
25
19
|
}
|
|
26
20
|
}
|
|
27
21
|
|
|
28
22
|
/* Secondary Button - Transparent with green border, fills on hover */
|
|
29
23
|
.btn-secondary {
|
|
30
24
|
@apply font-medium transition-all duration-150;
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
border-radius: 0.375rem;
|
|
35
|
-
border: 2px solid oklch(0.72 0.15 145);
|
|
25
|
+
@apply bg-transparent text-accent-green;
|
|
26
|
+
@apply px-4 py-2 rounded-md;
|
|
27
|
+
@apply border-2 border-accent-green;
|
|
36
28
|
|
|
37
29
|
&:hover {
|
|
38
|
-
|
|
39
|
-
color: oklch(1 0 0);
|
|
40
|
-
border-color: oklch(0.72 0.15 145);
|
|
30
|
+
@apply bg-accent-green text-white border-accent-green;
|
|
41
31
|
}
|
|
42
32
|
|
|
43
33
|
&:active {
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
outline: 1px solid oklch(0.72 0.15 145);
|
|
47
|
-
outline-offset: 0;
|
|
34
|
+
@apply bg-green-400 border-accent-green;
|
|
35
|
+
@apply outline outline-1 outline-accent-green outline-offset-0;
|
|
48
36
|
}
|
|
49
37
|
}
|
|
50
38
|
|
|
51
39
|
/* Ghost Button - No border, muted text, subtle hover */
|
|
52
40
|
.btn-ghost {
|
|
53
41
|
@apply font-medium transition-all duration-150;
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
border-radius: 0.375rem;
|
|
58
|
-
border: none;
|
|
42
|
+
@apply bg-transparent text-light-400;
|
|
43
|
+
@apply px-4 py-2 rounded-md;
|
|
44
|
+
@apply border-none;
|
|
59
45
|
|
|
60
46
|
&:hover {
|
|
61
|
-
|
|
62
|
-
color: oklch(0.90 0 0);
|
|
47
|
+
@apply bg-dark-450 text-light-300;
|
|
63
48
|
}
|
|
64
49
|
|
|
65
50
|
&:active {
|
|
66
|
-
|
|
51
|
+
@apply bg-dark-350;
|
|
67
52
|
}
|
|
68
53
|
}
|
|
69
54
|
|
|
@@ -71,114 +56,85 @@
|
|
|
71
56
|
.btn-danger,
|
|
72
57
|
.btn-destructive {
|
|
73
58
|
@apply font-medium transition-all duration-150;
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
border-radius: 0.375rem;
|
|
78
|
-
box-shadow: 0 1px 2px oklch(0 0 0 / 0.1);
|
|
79
|
-
border: none;
|
|
59
|
+
@apply bg-error-500 text-white;
|
|
60
|
+
@apply px-4 py-2 rounded-md;
|
|
61
|
+
@apply shadow-sm border-none;
|
|
80
62
|
|
|
81
63
|
&:hover {
|
|
82
|
-
|
|
64
|
+
@apply bg-error-400;
|
|
83
65
|
}
|
|
84
66
|
|
|
85
67
|
&:active {
|
|
86
|
-
|
|
68
|
+
@apply bg-red-500;
|
|
87
69
|
}
|
|
88
70
|
}
|
|
89
71
|
|
|
90
72
|
/* Icon Button - Clean hover states */
|
|
91
73
|
.btn-icon {
|
|
92
74
|
@apply flex items-center justify-center transition-all duration-150;
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
color: oklch(0.82 0 0);
|
|
97
|
-
border: none;
|
|
75
|
+
@apply p-1 rounded-md;
|
|
76
|
+
@apply bg-transparent text-light-400;
|
|
77
|
+
@apply border-none;
|
|
98
78
|
|
|
99
79
|
&:hover {
|
|
100
|
-
|
|
101
|
-
color: oklch(1 0 0);
|
|
80
|
+
@apply bg-dark-450 text-white;
|
|
102
81
|
}
|
|
103
82
|
|
|
104
83
|
&:active {
|
|
105
|
-
|
|
84
|
+
@apply bg-dark-350;
|
|
106
85
|
}
|
|
107
86
|
}
|
|
108
87
|
|
|
109
88
|
/* Action Button - Similar to secondary but with specific sizing */
|
|
110
89
|
.btn-action {
|
|
111
90
|
@apply font-medium flex items-center justify-center gap-x-2 transition-all duration-150;
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
border-radius: 0.375rem;
|
|
117
|
-
border: 2px solid oklch(0.72 0.15 145);
|
|
118
|
-
font-size: 0.75rem;
|
|
91
|
+
@apply bg-transparent text-accent-green;
|
|
92
|
+
@apply px-4 h-10 rounded-md;
|
|
93
|
+
@apply border-2 border-accent-green;
|
|
94
|
+
@apply text-xs;
|
|
119
95
|
|
|
120
96
|
&:hover {
|
|
121
|
-
|
|
122
|
-
color: oklch(1 0 0);
|
|
123
|
-
border-color: oklch(0.72 0.15 145);
|
|
97
|
+
@apply bg-accent-green text-white border-accent-green;
|
|
124
98
|
}
|
|
125
99
|
|
|
126
100
|
&:active {
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
outline: 1px solid oklch(0.72 0.15 145);
|
|
130
|
-
outline-offset: 0;
|
|
101
|
+
@apply bg-green-400 border-accent-green;
|
|
102
|
+
@apply outline outline-1 outline-accent-green outline-offset-0;
|
|
131
103
|
}
|
|
132
104
|
}
|
|
133
105
|
|
|
134
106
|
/* Default Button - Base styling */
|
|
135
107
|
.button-default {
|
|
136
108
|
@apply font-medium transition-all duration-150 flex items-center justify-center gap-x-2;
|
|
137
|
-
|
|
138
|
-
border-radius: 0.5rem;
|
|
139
|
-
color: oklch(1 0 0);
|
|
140
|
-
border: 2px solid oklch(0.2809 0 0);
|
|
141
|
-
font-size: 0.875rem;
|
|
142
|
-
padding: 0 1.5rem;
|
|
143
|
-
width: 12rem;
|
|
109
|
+
@apply h-14 rounded-lg text-white border-2 border-dark-600 text-sm px-6 w-48;
|
|
144
110
|
|
|
145
111
|
svg {
|
|
146
|
-
|
|
147
|
-
height: 16px;
|
|
148
|
-
flex-shrink: 0;
|
|
112
|
+
@apply w-4 h-4 flex-shrink-0;
|
|
149
113
|
}
|
|
150
114
|
|
|
151
115
|
@media (max-width: 768px) {
|
|
152
|
-
|
|
153
|
-
font-size: 0.875rem;
|
|
154
|
-
font-weight: 500;
|
|
155
|
-
width: 100%;
|
|
156
|
-
max-width: 100%;
|
|
116
|
+
@apply h-12 text-sm font-medium w-full max-w-full;
|
|
157
117
|
|
|
158
118
|
svg {
|
|
159
|
-
|
|
160
|
-
height: 16px;
|
|
119
|
+
@apply w-4 h-4;
|
|
161
120
|
}
|
|
162
121
|
}
|
|
163
122
|
|
|
164
123
|
@media (max-width: 480px) {
|
|
165
|
-
|
|
166
|
-
font-size: 0.9375rem;
|
|
124
|
+
@apply h-[3.25rem] text-[0.9375rem];
|
|
167
125
|
|
|
168
126
|
svg {
|
|
169
|
-
|
|
170
|
-
height: 16px;
|
|
127
|
+
@apply w-4 h-4;
|
|
171
128
|
}
|
|
172
129
|
}
|
|
173
130
|
|
|
174
131
|
&:hover {
|
|
175
|
-
border-
|
|
132
|
+
@apply border-accent-green;
|
|
176
133
|
}
|
|
177
134
|
|
|
178
135
|
&:active, &:focus {
|
|
179
|
-
border-
|
|
180
|
-
outline
|
|
181
|
-
outline-offset: 0;
|
|
136
|
+
@apply border-accent-green;
|
|
137
|
+
@apply outline outline-1 outline-accent-green outline-offset-0;
|
|
182
138
|
}
|
|
183
139
|
}
|
|
184
140
|
|
|
@@ -206,11 +162,3 @@
|
|
|
206
162
|
border-radius: 8px;
|
|
207
163
|
}
|
|
208
164
|
}
|
|
209
|
-
|
|
210
|
-
@screen mobile-landscape {
|
|
211
|
-
.btn-action {
|
|
212
|
-
@apply text-base px-8 h-14;
|
|
213
|
-
min-height: 56px;
|
|
214
|
-
font-weight: 600;
|
|
215
|
-
}
|
|
216
|
-
}
|
|
@@ -3,20 +3,18 @@
|
|
|
3
3
|
========================================================================== */
|
|
4
4
|
|
|
5
5
|
.input-default {
|
|
6
|
-
@apply flex items-center bg-clip-padding
|
|
6
|
+
@apply relative box-border flex h-10 items-center border-2 bg-clip-padding px-3 py-2;
|
|
7
7
|
background: oklch(0.19 0 0);
|
|
8
8
|
border-color: oklch(0.26 0 0);
|
|
9
9
|
border-radius: 0.5rem;
|
|
10
10
|
transition: border-color 0.15s ease;
|
|
11
11
|
|
|
12
12
|
&:hover {
|
|
13
|
-
border-color: oklch(0.
|
|
13
|
+
border-color: oklch(0.3 0 0);
|
|
14
14
|
}
|
|
15
15
|
|
|
16
16
|
&:focus-within {
|
|
17
17
|
border-color: oklch(0.72 0.15 145);
|
|
18
|
-
outline: 1px solid oklch(0.72 0.15 145);
|
|
19
|
-
outline-offset: 0;
|
|
20
18
|
}
|
|
21
19
|
|
|
22
20
|
input {
|
|
@@ -29,7 +27,7 @@
|
|
|
29
27
|
}
|
|
30
28
|
|
|
31
29
|
&::placeholder {
|
|
32
|
-
color: oklch(0.
|
|
30
|
+
color: oklch(0.5 0 0);
|
|
33
31
|
}
|
|
34
32
|
|
|
35
33
|
// Hide default number input spinners - use custom .input-incrementer instead
|
|
@@ -45,7 +43,8 @@
|
|
|
45
43
|
}
|
|
46
44
|
|
|
47
45
|
.input-incrementer {
|
|
48
|
-
@apply flex flex-col
|
|
46
|
+
@apply flex flex-col gap-0.5;
|
|
47
|
+
margin-left: 0.5rem;
|
|
49
48
|
|
|
50
49
|
button {
|
|
51
50
|
@apply w-6 h-4 flex items-center justify-center text-white transition-all duration-200 rounded-sm;
|
|
@@ -67,19 +66,10 @@
|
|
|
67
66
|
transform: translateY(0);
|
|
68
67
|
}
|
|
69
68
|
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
&:last-child {
|
|
75
|
-
border-radius: 2px 2px 4px 4px;
|
|
69
|
+
svg {
|
|
70
|
+
@apply h-3 w-3;
|
|
76
71
|
}
|
|
77
72
|
}
|
|
78
|
-
|
|
79
|
-
svg {
|
|
80
|
-
@apply w-2.5 h-2.5;
|
|
81
|
-
filter: drop-shadow(0 1px 1px oklch(0 0 0 / 0.3));
|
|
82
|
-
}
|
|
83
73
|
}
|
|
84
74
|
}
|
|
85
75
|
|
|
@@ -88,7 +78,7 @@
|
|
|
88
78
|
}
|
|
89
79
|
|
|
90
80
|
.input-wrapper label {
|
|
91
|
-
@apply
|
|
81
|
+
@apply mb-2 block font-medium text-white;
|
|
92
82
|
font-size: 16px;
|
|
93
83
|
}
|
|
94
84
|
|
|
@@ -104,7 +94,7 @@
|
|
|
104
94
|
}
|
|
105
95
|
|
|
106
96
|
.ant-select {
|
|
107
|
-
@apply flex items-center bg-clip-padding
|
|
97
|
+
@apply relative box-border flex h-10 items-center border-2 bg-clip-padding px-1 py-1 !important;
|
|
108
98
|
background: oklch(0.19 0 0); /* Input background */
|
|
109
99
|
border-color: oklch(0.26 0 0); /* Default border */
|
|
110
100
|
border-radius: 0.375rem; /* Consistent with buttons */
|
|
@@ -112,7 +102,7 @@
|
|
|
112
102
|
transition: border-color 0.15s ease;
|
|
113
103
|
|
|
114
104
|
&:hover {
|
|
115
|
-
border-color: oklch(0.
|
|
105
|
+
border-color: oklch(0.3 0 0); /* Hover border */
|
|
116
106
|
}
|
|
117
107
|
|
|
118
108
|
&.ant-select-focused {
|
|
@@ -201,14 +191,6 @@
|
|
|
201
191
|
input {
|
|
202
192
|
font-size: 12px;
|
|
203
193
|
}
|
|
204
|
-
|
|
205
|
-
.input-incrementer button {
|
|
206
|
-
@apply w-5 h-3;
|
|
207
|
-
|
|
208
|
-
svg {
|
|
209
|
-
@apply w-2 h-2;
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
194
|
}
|
|
213
195
|
|
|
214
196
|
.input-wrapper label {
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/* ==========================================================================
|
|
2
|
+
UNIFIED SEARCH GROUP COMPONENTS
|
|
3
|
+
Shared styling for the combined search/filter/dropdown input groups
|
|
4
|
+
used on Accounts and Profiles pages.
|
|
5
|
+
========================================================================== */
|
|
6
|
+
|
|
7
|
+
.unified-search-group {
|
|
8
|
+
border: 2px solid oklch(0.2809 0 0);
|
|
9
|
+
border-radius: 0.5rem;
|
|
10
|
+
overflow: hidden;
|
|
11
|
+
background: oklch(0.2603 0 0);
|
|
12
|
+
transition: all 0.15s ease;
|
|
13
|
+
display: flex;
|
|
14
|
+
|
|
15
|
+
.tag-toggle,
|
|
16
|
+
.dropdown,
|
|
17
|
+
input {
|
|
18
|
+
border: none !important;
|
|
19
|
+
border-width: 0 !important;
|
|
20
|
+
border-radius: 0 !important;
|
|
21
|
+
height: 40px !important;
|
|
22
|
+
background: transparent !important;
|
|
23
|
+
box-shadow: none !important;
|
|
24
|
+
min-width: fit-content !important;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
.tag-toggle {
|
|
28
|
+
padding: 0;
|
|
29
|
+
border: 0 solid transparent !important;
|
|
30
|
+
border-top: 0 !important;
|
|
31
|
+
border-bottom: 0 !important;
|
|
32
|
+
border-left: 0 !important;
|
|
33
|
+
border-right: 0 !important;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
.tag-toggle button {
|
|
37
|
+
font-size: 0.875rem;
|
|
38
|
+
padding: 0.5rem 0.75rem;
|
|
39
|
+
min-width: fit-content;
|
|
40
|
+
border: 0 solid transparent !important;
|
|
41
|
+
border-top: 0 !important;
|
|
42
|
+
border-bottom: 0 !important;
|
|
43
|
+
border-left: 0 !important;
|
|
44
|
+
border-right: 0 !important;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
.dropdown {
|
|
48
|
+
width: 120px !important;
|
|
49
|
+
min-width: 120px !important;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
.dropdown-display {
|
|
53
|
+
padding: 0 0.75rem;
|
|
54
|
+
font-size: 0.875rem;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
input {
|
|
58
|
+
padding-left: 0.75rem;
|
|
59
|
+
padding-right: 0.75rem;
|
|
60
|
+
flex: 1;
|
|
61
|
+
|
|
62
|
+
&::placeholder {
|
|
63
|
+
color: oklch(0.50 0 0);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
&:focus {
|
|
67
|
+
outline: none !important;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
&:hover {
|
|
72
|
+
border-color: oklch(0.30 0 0);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
&:focus-within {
|
|
76
|
+
border-color: oklch(0.72 0.15 145);
|
|
77
|
+
outline: 1px solid oklch(0.72 0.15 145);
|
|
78
|
+
outline-offset: 0;
|
|
79
|
+
}
|
|
80
|
+
}
|