mantenimento-app 2.2.9 → 2.3.2
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/README.md +97 -34
- package/app.js +541 -85
- package/backend/server.js +346 -23
- package/frontend/public/app.js +541 -85
- package/frontend/public/autologin.html +40 -0
- package/frontend/public/index.html +29 -6
- package/frontend/public/styles.css +270 -51
- package/frontend/public/supabase-config.js +4 -11
- package/package.json +5 -1
- package/scripts/auth-url-check.mjs +166 -0
- package/scripts/create-url-login-token.mjs +52 -0
- package/scripts/manage-donor-users.mjs +229 -0
- package/scripts/sql/grant-donor.sql +22 -0
- package/scripts/sql/revoke-donor.sql +19 -0
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="it">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8" />
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
|
+
<title>AutoLogin Redirect - Mantenimento App</title>
|
|
7
|
+
<meta name="robots" content="noindex,nofollow" />
|
|
8
|
+
</head>
|
|
9
|
+
<body>
|
|
10
|
+
<noscript>JavaScript richiesto per il redirect di autologin.</noscript>
|
|
11
|
+
<script>
|
|
12
|
+
(function () {
|
|
13
|
+
try {
|
|
14
|
+
const current = new URL(window.location.href);
|
|
15
|
+
const query = new URLSearchParams(current.search);
|
|
16
|
+
|
|
17
|
+
if (!query.has('autologin')) {
|
|
18
|
+
query.set('autologin', '1');
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
if ((!query.has('authToken') || !String(query.get('authToken') || '').trim()) && current.hash) {
|
|
22
|
+
const hashParams = new URLSearchParams(String(current.hash || '').replace(/^#/, ''));
|
|
23
|
+
const hashToken = String(hashParams.get('authToken') || '').trim();
|
|
24
|
+
if (hashToken) {
|
|
25
|
+
query.set('authToken', hashToken);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const target = new URL('./', current);
|
|
30
|
+
target.search = query.toString();
|
|
31
|
+
target.hash = '';
|
|
32
|
+
|
|
33
|
+
window.location.replace(target.toString());
|
|
34
|
+
} catch (_) {
|
|
35
|
+
window.location.replace('./');
|
|
36
|
+
}
|
|
37
|
+
})();
|
|
38
|
+
</script>
|
|
39
|
+
</body>
|
|
40
|
+
</html>
|
|
@@ -102,8 +102,8 @@
|
|
|
102
102
|
<button class="top-actions-trigger" type="button" aria-expanded="false" aria-controls="topActionsMenu">Azioni rapide</button>
|
|
103
103
|
<div class="top-actions-menu" id="topActionsMenu" aria-label="Azioni applicazione">
|
|
104
104
|
<button class="btn-secondary" id="btnReset" type="button">Reset valori</button>
|
|
105
|
-
<button class="btn-secondary" id="btnExportJson" type="button">Esporta JSON
|
|
106
|
-
<button class="btn-secondary" id="btnImportJson" type="button">Carica JSON
|
|
105
|
+
<button class="btn-secondary" id="btnExportJson" type="button">Esporta JSON</button>
|
|
106
|
+
<button class="btn-secondary" id="btnImportJson" type="button">Carica JSON</button>
|
|
107
107
|
<button class="btn-secondary" id="btnPdf" type="button">Genera e scarica PDF</button>
|
|
108
108
|
<input id="fileJson" type="file" accept="application/json,.json" style="display:none" />
|
|
109
109
|
</div>
|
|
@@ -364,17 +364,23 @@
|
|
|
364
364
|
</label>
|
|
365
365
|
<input id="primaCasaMutuoImporto" type="number" min="0" step="50" value="0" />
|
|
366
366
|
</div>
|
|
367
|
-
<div class="field">
|
|
367
|
+
<div class="field" style="display: none;">
|
|
368
|
+
<label for="primaCasaValoreLocativo" class="label-row"><span id="lblPrimaCasaValoreLocativo">Casa (valore locativo) ({currency})</span>
|
|
369
|
+
<span class="hint" id="hintPrimaCasaValoreLocativo" title="Valore locativo mensile della casa assegnata, usato per valorizzare il beneficio economico implicito.">i</span>
|
|
370
|
+
</label>
|
|
371
|
+
<input id="primaCasaValoreLocativo" type="number" min="0" step="50" value="1000" />
|
|
372
|
+
</div>
|
|
373
|
+
<div class="field" style="display: none;">
|
|
368
374
|
<label for="primaCasaAssegnataA" class="label-row"><span id="lblPrimaCasaAssegnataA">Casa assegnata a</span>
|
|
369
375
|
<span class="hint" id="hintPrimaCasaAssegnataA" title="Seleziona il coniuge a cui e ceduta la prima casa.">i</span>
|
|
370
376
|
</label>
|
|
371
377
|
<select id="primaCasaAssegnataA">
|
|
372
378
|
<option value="">Nessuna cessione</option>
|
|
373
|
-
<option value="1">Coniuge 1</option>
|
|
379
|
+
<option value="1" selected>Coniuge 1</option>
|
|
374
380
|
<option value="2">Coniuge 2</option>
|
|
375
381
|
</select>
|
|
376
382
|
</div>
|
|
377
|
-
<div class="field">
|
|
383
|
+
<div class="field" style="display: none;">
|
|
378
384
|
<div class="mortgage-split-slider" id="primaCasaMutuoSliderWrap">
|
|
379
385
|
<div class="mortgage-split-side mortgage-split-side-left" id="primaCasaSplitLeft">
|
|
380
386
|
<div class="mortgage-split-name" id="primaCasaSplitLeftName">Coniuge 1</div>
|
|
@@ -596,11 +602,28 @@
|
|
|
596
602
|
<button class="coffee-float-btn" title="Offrimi un caffè!">☕</button>
|
|
597
603
|
</div>
|
|
598
604
|
|
|
605
|
+
<div id="exportModeModal" class="export-mode-modal is-hidden" aria-hidden="true">
|
|
606
|
+
<div class="export-mode-modal-backdrop" data-export-modal-close="1"></div>
|
|
607
|
+
<div class="export-mode-modal-dialog" role="dialog" aria-modal="true" aria-labelledby="exportModeModalTitle">
|
|
608
|
+
<h3 id="exportModeModalTitle">Esportazione JSON</h3>
|
|
609
|
+
<p id="exportModeModalWarning">Per impostazione predefinita il file viene cifrato e puo essere importato solo dallo stesso utente KeyLock.</p>
|
|
610
|
+
<label class="export-mode-checkbox">
|
|
611
|
+
<input type="checkbox" id="chkExportPlainJson" />
|
|
612
|
+
<span id="lblExportPlainJson">Esporta JSON non cifrato (compatibile con altri utenti)</span>
|
|
613
|
+
</label>
|
|
614
|
+
<p id="exportModeModalRisk" class="export-mode-risk">Conferma esplicita richiesta: il file non cifrato puo essere letto da chiunque.</p>
|
|
615
|
+
<div class="export-mode-actions">
|
|
616
|
+
<button type="button" class="btn-secondary" id="btnCancelExportMode">Annulla</button>
|
|
617
|
+
<button type="button" class="btn-secondary" id="btnConfirmExportMode">Conferma export</button>
|
|
618
|
+
</div>
|
|
619
|
+
</div>
|
|
620
|
+
</div>
|
|
621
|
+
|
|
599
622
|
<script src="supabase-config.js"></script>
|
|
600
623
|
<script src="supabase.min.js"></script>
|
|
601
624
|
<script src="fabric.min.js"></script>
|
|
602
625
|
<script src="html2pdf.bundle.min.js"></script>
|
|
603
|
-
<script src="app.js?v=2.2
|
|
626
|
+
<script src="app.js?v=2.3.2"></script>
|
|
604
627
|
</body>
|
|
605
628
|
</html>
|
|
606
629
|
|
|
@@ -884,68 +884,138 @@
|
|
|
884
884
|
color: #184a44;
|
|
885
885
|
}
|
|
886
886
|
|
|
887
|
+
.extra-box-first-home {
|
|
888
|
+
background: linear-gradient(135deg, #ffffff 0%, #f0fffe 50%, #f5faff 100%);
|
|
889
|
+
border: 1px solid rgba(27, 141, 127, 0.15);
|
|
890
|
+
box-shadow: 0 2px 8px rgba(27, 141, 127, 0.08), inset 0 1px 0 rgba(255, 255, 255, 0.8);
|
|
891
|
+
}
|
|
892
|
+
|
|
893
|
+
.extra-box-first-home .extra-box-title::before {
|
|
894
|
+
content: '🏠 ';
|
|
895
|
+
margin-right: 4px;
|
|
896
|
+
}
|
|
897
|
+
|
|
887
898
|
.extra-box-first-home .extra-grid {
|
|
888
899
|
gap: 8px 10px;
|
|
889
900
|
}
|
|
890
901
|
|
|
891
902
|
.mortgage-split-slider {
|
|
892
|
-
margin-top:
|
|
893
|
-
border:
|
|
894
|
-
border-radius:
|
|
903
|
+
margin-top: 12px;
|
|
904
|
+
border: 1.5px solid rgba(27, 141, 127, 0.2);
|
|
905
|
+
border-radius: 16px;
|
|
895
906
|
background:
|
|
896
|
-
radial-gradient(120% 160% at 0% 0%, rgba(229, 247, 242, 0.
|
|
897
|
-
radial-gradient(120% 160% at 100% 0%, rgba(255, 241, 214, 0.
|
|
898
|
-
linear-gradient(180deg, #
|
|
899
|
-
padding:
|
|
907
|
+
radial-gradient(120% 160% at 0% 0%, rgba(229, 247, 242, 0.6), transparent 58%),
|
|
908
|
+
radial-gradient(120% 160% at 100% 0%, rgba(255, 241, 214, 0.6), transparent 58%),
|
|
909
|
+
linear-gradient(180deg, #fafffe, #f2f8f7);
|
|
910
|
+
padding: 14px;
|
|
900
911
|
display: grid;
|
|
901
912
|
grid-template-columns: minmax(0, 1fr) minmax(180px, 2fr) minmax(0, 1fr);
|
|
902
|
-
gap:
|
|
913
|
+
gap: 10px;
|
|
903
914
|
align-items: center;
|
|
904
|
-
|
|
915
|
+
box-shadow: 0 4px 12px rgba(27, 141, 127, 0.1), inset 0 1px 0 rgba(255, 255, 255, 0.6);
|
|
916
|
+
transition: all 0.3s cubic-bezier(0.34, 1.56, 0.64, 1);
|
|
917
|
+
}
|
|
918
|
+
|
|
919
|
+
.mortgage-split-slider:hover {
|
|
920
|
+
box-shadow: 0 8px 20px rgba(27, 141, 127, 0.15), inset 0 1px 0 rgba(255, 255, 255, 0.8);
|
|
921
|
+
border-color: rgba(27, 141, 127, 0.3);
|
|
905
922
|
}
|
|
906
923
|
|
|
907
924
|
.mortgage-split-slider.is-disabled {
|
|
908
|
-
opacity: 0.
|
|
925
|
+
opacity: 0.55;
|
|
926
|
+
filter: grayscale(0.4);
|
|
909
927
|
}
|
|
910
928
|
|
|
911
929
|
.mortgage-split-side {
|
|
912
|
-
border:
|
|
913
|
-
border-radius:
|
|
914
|
-
padding:
|
|
915
|
-
background: linear-gradient(
|
|
916
|
-
min-height:
|
|
930
|
+
border: 1.5px solid rgba(27, 141, 127, 0.15);
|
|
931
|
+
border-radius: 14px;
|
|
932
|
+
padding: 12px;
|
|
933
|
+
background: linear-gradient(135deg, #ffffff 0%, #f5fbf9 100%);
|
|
934
|
+
min-height: 62px;
|
|
917
935
|
display: grid;
|
|
918
936
|
align-content: center;
|
|
919
|
-
gap:
|
|
920
|
-
box-shadow: 0
|
|
937
|
+
gap: 4px;
|
|
938
|
+
box-shadow: 0 2px 6px rgba(27, 141, 127, 0.08), inset 0 1px 2px rgba(255, 255, 255, 0.7);
|
|
939
|
+
transition: all 0.28s cubic-bezier(0.34, 1.56, 0.64, 1);
|
|
940
|
+
position: relative;
|
|
941
|
+
overflow: hidden;
|
|
942
|
+
}
|
|
943
|
+
|
|
944
|
+
.mortgage-split-side::before {
|
|
945
|
+
content: '';
|
|
946
|
+
position: absolute;
|
|
947
|
+
top: 0;
|
|
948
|
+
left: 0;
|
|
949
|
+
right: 0;
|
|
950
|
+
bottom: 0;
|
|
951
|
+
background: radial-gradient(120% 200% at 50% 0%, rgba(255, 255, 255, 0.4), transparent 70%);
|
|
952
|
+
pointer-events: none;
|
|
953
|
+
opacity: 0;
|
|
954
|
+
transition: opacity 0.28s ease;
|
|
955
|
+
}
|
|
956
|
+
|
|
957
|
+
.mortgage-split-side:hover {
|
|
958
|
+
transform: translateY(-2px);
|
|
959
|
+
box-shadow: 0 6px 16px rgba(27, 141, 127, 0.12), inset 0 1px 2px rgba(255, 255, 255, 0.9);
|
|
960
|
+
border-color: rgba(27, 141, 127, 0.25);
|
|
961
|
+
}
|
|
962
|
+
|
|
963
|
+
.mortgage-split-side:hover::before {
|
|
964
|
+
opacity: 1;
|
|
921
965
|
}
|
|
922
966
|
|
|
923
967
|
.mortgage-split-side-left {
|
|
924
|
-
box-shadow: inset 3px 0 0 #1b8d7f;
|
|
968
|
+
box-shadow: 0 2px 6px rgba(27, 141, 127, 0.08), inset 0 1px 2px rgba(255, 255, 255, 0.7), inset 3px 0 0 #1b8d7f;
|
|
969
|
+
background: linear-gradient(135deg, #effaf8 0%, #e5f5f1 100%);
|
|
970
|
+
}
|
|
971
|
+
|
|
972
|
+
.mortgage-split-side-left:hover {
|
|
973
|
+
box-shadow: 0 6px 16px rgba(27, 141, 127, 0.12), inset 0 1px 2px rgba(255, 255, 255, 0.9), inset 3px 0 0 #1b8d7f;
|
|
974
|
+
background: linear-gradient(135deg, #f0faf8 0%, #e8f7f4 100%);
|
|
925
975
|
}
|
|
926
976
|
|
|
927
977
|
.mortgage-split-side-right {
|
|
928
|
-
box-shadow: inset -3px 0 0 #d89a35;
|
|
978
|
+
box-shadow: 0 2px 6px rgba(27, 141, 127, 0.08), inset 0 1px 2px rgba(255, 255, 255, 0.7), inset -3px 0 0 #d89a35;
|
|
929
979
|
text-align: right;
|
|
980
|
+
background: linear-gradient(135deg, #fef9f1 0%, #fdf5e8 100%);
|
|
981
|
+
}
|
|
982
|
+
|
|
983
|
+
.mortgage-split-side-right:hover {
|
|
984
|
+
box-shadow: 0 6px 16px rgba(27, 141, 127, 0.12), inset 0 1px 2px rgba(255, 255, 255, 0.9), inset -3px 0 0 #d89a35;
|
|
985
|
+
background: linear-gradient(135deg, #fefaf4 0%, #fef7ed 100%);
|
|
930
986
|
}
|
|
931
987
|
|
|
932
988
|
.mortgage-split-name {
|
|
933
|
-
font-size: 0.
|
|
989
|
+
font-size: 0.73rem;
|
|
934
990
|
font-weight: 800;
|
|
935
|
-
color: #
|
|
991
|
+
color: #1a3a36;
|
|
936
992
|
overflow-wrap: anywhere;
|
|
993
|
+
letter-spacing: 0.3px;
|
|
994
|
+
text-shadow: 0 1px 2px rgba(255, 255, 255, 0.5);
|
|
937
995
|
}
|
|
938
996
|
|
|
939
997
|
.mortgage-split-amount {
|
|
940
|
-
font-size: 0.
|
|
998
|
+
font-size: 0.95rem;
|
|
941
999
|
font-weight: 900;
|
|
942
|
-
color: #
|
|
943
|
-
letter-spacing: 0.
|
|
1000
|
+
color: #0b4440;
|
|
1001
|
+
letter-spacing: 0.3px;
|
|
1002
|
+
background: linear-gradient(135deg, #0f6659, #1b8d7f);
|
|
1003
|
+
-webkit-background-clip: text;
|
|
1004
|
+
-webkit-text-fill-color: transparent;
|
|
1005
|
+
background-clip: text;
|
|
1006
|
+
filter: drop-shadow(0 1px 2px rgba(27, 141, 127, 0.2));
|
|
1007
|
+
}
|
|
1008
|
+
|
|
1009
|
+
.mortgage-split-side-right .mortgage-split-amount {
|
|
1010
|
+
background: linear-gradient(135deg, #c86d28, #d89a35);
|
|
1011
|
+
-webkit-background-clip: text;
|
|
1012
|
+
-webkit-text-fill-color: transparent;
|
|
1013
|
+
background-clip: text;
|
|
944
1014
|
}
|
|
945
1015
|
|
|
946
1016
|
.mortgage-split-range-wrap {
|
|
947
1017
|
position: relative;
|
|
948
|
-
padding:
|
|
1018
|
+
padding: 20px 0 8px;
|
|
949
1019
|
--split-left: 50%;
|
|
950
1020
|
}
|
|
951
1021
|
|
|
@@ -953,58 +1023,141 @@
|
|
|
953
1023
|
-webkit-appearance: none;
|
|
954
1024
|
appearance: none;
|
|
955
1025
|
width: 100%;
|
|
956
|
-
height:
|
|
1026
|
+
height: 10px;
|
|
957
1027
|
border-radius: 999px;
|
|
958
1028
|
background: linear-gradient(90deg,
|
|
959
|
-
#
|
|
960
|
-
#
|
|
961
|
-
#
|
|
962
|
-
#
|
|
1029
|
+
#16a396 0%,
|
|
1030
|
+
#3db5a0 20%,
|
|
1031
|
+
#6cbba8 var(--split-left),
|
|
1032
|
+
#ddb05a var(--split-left),
|
|
1033
|
+
#d89a35 80%,
|
|
1034
|
+
#c27f1d 100%);
|
|
963
1035
|
outline: none;
|
|
964
1036
|
margin: 0;
|
|
965
|
-
transition: background 0.
|
|
1037
|
+
transition: background 0.2s ease;
|
|
1038
|
+
box-shadow: 0 2px 4px rgba(22, 163, 150, 0.2), inset 0 1px 1px rgba(255, 255, 255, 0.3);
|
|
1039
|
+
}
|
|
1040
|
+
|
|
1041
|
+
.mortgage-split-range-wrap input[type="range"]:hover {
|
|
1042
|
+
box-shadow: 0 3px 8px rgba(22, 163, 150, 0.3), inset 0 1px 1px rgba(255, 255, 255, 0.4);
|
|
966
1043
|
}
|
|
967
1044
|
|
|
968
1045
|
.mortgage-split-range-wrap input[type="range"]::-webkit-slider-thumb {
|
|
969
1046
|
-webkit-appearance: none;
|
|
970
1047
|
appearance: none;
|
|
971
|
-
width:
|
|
972
|
-
height:
|
|
1048
|
+
width: 26px;
|
|
1049
|
+
height: 26px;
|
|
973
1050
|
border-radius: 50%;
|
|
974
|
-
border:
|
|
975
|
-
background: radial-gradient(circle at
|
|
976
|
-
box-shadow: 0
|
|
977
|
-
cursor:
|
|
1051
|
+
border: 3px solid #ffffff;
|
|
1052
|
+
background: radial-gradient(circle at 30% 25%, #ffffff 0%, #f0faf8 30%, #16a396 100%);
|
|
1053
|
+
box-shadow: 0 4px 12px rgba(13, 70, 64, 0.4), 0 0 0 1px rgba(27, 141, 127, 0.15);
|
|
1054
|
+
cursor: grab;
|
|
1055
|
+
transition: all 0.2s ease;
|
|
1056
|
+
}
|
|
1057
|
+
|
|
1058
|
+
.mortgage-split-range-wrap input[type="range"]::-webkit-slider-thumb:hover {
|
|
1059
|
+
width: 28px;
|
|
1060
|
+
height: 28px;
|
|
1061
|
+
box-shadow: 0 6px 16px rgba(13, 70, 64, 0.5), 0 0 0 2px rgba(27, 141, 127, 0.2);
|
|
1062
|
+
}
|
|
1063
|
+
|
|
1064
|
+
.mortgage-split-range-wrap input[type="range"]::-webkit-slider-thumb:active {
|
|
1065
|
+
cursor: grabbing;
|
|
978
1066
|
}
|
|
979
1067
|
|
|
980
1068
|
.mortgage-split-range-wrap input[type="range"]::-moz-range-thumb {
|
|
981
|
-
width:
|
|
982
|
-
height:
|
|
1069
|
+
width: 26px;
|
|
1070
|
+
height: 26px;
|
|
983
1071
|
border-radius: 50%;
|
|
984
|
-
border:
|
|
985
|
-
background: radial-gradient(circle at
|
|
986
|
-
box-shadow: 0
|
|
987
|
-
cursor:
|
|
1072
|
+
border: 3px solid #ffffff;
|
|
1073
|
+
background: radial-gradient(circle at 30% 25%, #ffffff 0%, #f0faf8 30%, #16a396 100%);
|
|
1074
|
+
box-shadow: 0 4px 12px rgba(13, 70, 64, 0.4), 0 0 0 1px rgba(27, 141, 127, 0.15);
|
|
1075
|
+
cursor: grab;
|
|
1076
|
+
transition: all 0.2s ease;
|
|
1077
|
+
}
|
|
1078
|
+
|
|
1079
|
+
.mortgage-split-range-wrap input[type="range"]::-moz-range-thumb:hover {
|
|
1080
|
+
width: 28px;
|
|
1081
|
+
height: 28px;
|
|
1082
|
+
box-shadow: 0 6px 16px rgba(13, 70, 64, 0.5), 0 0 0 2px rgba(27, 141, 127, 0.2);
|
|
988
1083
|
}
|
|
989
1084
|
|
|
990
1085
|
.mortgage-split-center {
|
|
991
1086
|
position: absolute;
|
|
992
|
-
top:
|
|
993
|
-
left:
|
|
1087
|
+
top: 2px;
|
|
1088
|
+
left: var(--split-left);
|
|
994
1089
|
transform: translateX(-50%);
|
|
995
|
-
font-size: 0.
|
|
1090
|
+
font-size: 0.73rem;
|
|
996
1091
|
font-weight: 900;
|
|
997
|
-
color: #
|
|
998
|
-
background: #ffffff;
|
|
999
|
-
border:
|
|
1092
|
+
color: #0f544d;
|
|
1093
|
+
background: linear-gradient(135deg, #ffffff, #f5fbf9);
|
|
1094
|
+
border: 1.5px solid rgba(27, 141, 127, 0.2);
|
|
1000
1095
|
border-radius: 999px;
|
|
1001
|
-
padding:
|
|
1096
|
+
padding: 2px 9px;
|
|
1002
1097
|
white-space: nowrap;
|
|
1098
|
+
box-shadow: 0 2px 6px rgba(27, 141, 127, 0.15), inset 0 1px 2px rgba(255, 255, 255, 0.6);
|
|
1099
|
+
transition: all 0.2s ease;
|
|
1100
|
+
letter-spacing: 0.2px;
|
|
1003
1101
|
}
|
|
1004
1102
|
|
|
1005
1103
|
#primaCasaMutuoSplitInfo {
|
|
1006
|
-
margin-top:
|
|
1104
|
+
margin-top: 6px;
|
|
1007
1105
|
font-size: 0.77rem;
|
|
1106
|
+
color: #2a5350;
|
|
1107
|
+
font-weight: 600;
|
|
1108
|
+
letter-spacing: 0.1px;
|
|
1109
|
+
}
|
|
1110
|
+
|
|
1111
|
+
/* Premium first home mortgage section */
|
|
1112
|
+
.extra-box-first-home .field {
|
|
1113
|
+
gap: 6px;
|
|
1114
|
+
}
|
|
1115
|
+
|
|
1116
|
+
.extra-box-first-home .field label {
|
|
1117
|
+
font-weight: 600;
|
|
1118
|
+
color: #1a3a36;
|
|
1119
|
+
}
|
|
1120
|
+
|
|
1121
|
+
.extra-box-first-home input[type="number"],
|
|
1122
|
+
.extra-box-first-home input[type="text"],
|
|
1123
|
+
.extra-box-first-home select {
|
|
1124
|
+
border: 1.5px solid rgba(27, 141, 127, 0.2);
|
|
1125
|
+
background: linear-gradient(135deg, #ffffff 0%, #f5fbf9 100%);
|
|
1126
|
+
box-shadow: 0 2px 4px rgba(27, 141, 127, 0.06), inset 0 1px 1px rgba(255, 255, 255, 0.5);
|
|
1127
|
+
transition: all 0.25s cubic-bezier(0.34, 1.56, 0.64, 1);
|
|
1128
|
+
}
|
|
1129
|
+
|
|
1130
|
+
.extra-box-first-home input[type="number"]:hover,
|
|
1131
|
+
.extra-box-first-home input[type="text"]:hover,
|
|
1132
|
+
.extra-box-first-home select:hover {
|
|
1133
|
+
border-color: rgba(27, 141, 127, 0.35);
|
|
1134
|
+
box-shadow: 0 4px 10px rgba(27, 141, 127, 0.12), inset 0 1px 1px rgba(255, 255, 255, 0.6);
|
|
1135
|
+
}
|
|
1136
|
+
|
|
1137
|
+
.extra-box-first-home input[type="number"]:focus,
|
|
1138
|
+
.extra-box-first-home input[type="text"]:focus,
|
|
1139
|
+
.extra-box-first-home select:focus {
|
|
1140
|
+
outline: none;
|
|
1141
|
+
border-color: #16a396;
|
|
1142
|
+
box-shadow: 0 0 0 3px rgba(22, 163, 150, 0.15), inset 0 1px 1px rgba(255, 255, 255, 0.6);
|
|
1143
|
+
background: linear-gradient(135deg, #f5fdfc 0%, #f0fcfa 100%);
|
|
1144
|
+
}
|
|
1145
|
+
|
|
1146
|
+
.extra-box-first-home input[type="checkbox"] {
|
|
1147
|
+
width: 18px;
|
|
1148
|
+
height: 18px;
|
|
1149
|
+
cursor: pointer;
|
|
1150
|
+
accent-color: #16a396;
|
|
1151
|
+
transition: all 0.2s ease;
|
|
1152
|
+
}
|
|
1153
|
+
|
|
1154
|
+
.extra-box-first-home input[type="checkbox"]:hover {
|
|
1155
|
+
filter: brightness(1.1);
|
|
1156
|
+
}
|
|
1157
|
+
|
|
1158
|
+
.extra-box-first-home input[type="checkbox"]:focus-visible {
|
|
1159
|
+
outline: 2px solid #16a396;
|
|
1160
|
+
outline-offset: 2px;
|
|
1008
1161
|
}
|
|
1009
1162
|
|
|
1010
1163
|
.label-row {
|
|
@@ -3345,4 +3498,70 @@
|
|
|
3345
3498
|
border: 1px solid #cfcfcf;
|
|
3346
3499
|
background: #fff;
|
|
3347
3500
|
}
|
|
3501
|
+
}
|
|
3502
|
+
|
|
3503
|
+
.export-mode-modal {
|
|
3504
|
+
position: fixed;
|
|
3505
|
+
inset: 0;
|
|
3506
|
+
z-index: 9999;
|
|
3507
|
+
display: flex;
|
|
3508
|
+
align-items: center;
|
|
3509
|
+
justify-content: center;
|
|
3510
|
+
padding: 16px;
|
|
3511
|
+
}
|
|
3512
|
+
|
|
3513
|
+
.export-mode-modal.is-hidden {
|
|
3514
|
+
display: none;
|
|
3515
|
+
}
|
|
3516
|
+
|
|
3517
|
+
.export-mode-modal-backdrop {
|
|
3518
|
+
position: absolute;
|
|
3519
|
+
inset: 0;
|
|
3520
|
+
background: rgba(22, 42, 42, 0.48);
|
|
3521
|
+
}
|
|
3522
|
+
|
|
3523
|
+
.export-mode-modal-dialog {
|
|
3524
|
+
position: relative;
|
|
3525
|
+
width: min(540px, 100%);
|
|
3526
|
+
border-radius: var(--radius);
|
|
3527
|
+
border: 1px solid var(--line);
|
|
3528
|
+
background: var(--panel);
|
|
3529
|
+
box-shadow: var(--shadow);
|
|
3530
|
+
padding: 18px;
|
|
3531
|
+
z-index: 1;
|
|
3532
|
+
}
|
|
3533
|
+
|
|
3534
|
+
.export-mode-modal-dialog h3 {
|
|
3535
|
+
margin: 0 0 10px;
|
|
3536
|
+
font-size: 1.05rem;
|
|
3537
|
+
}
|
|
3538
|
+
|
|
3539
|
+
.export-mode-modal-dialog p {
|
|
3540
|
+
margin: 0 0 10px;
|
|
3541
|
+
color: var(--muted);
|
|
3542
|
+
}
|
|
3543
|
+
|
|
3544
|
+
.export-mode-checkbox {
|
|
3545
|
+
display: flex;
|
|
3546
|
+
align-items: flex-start;
|
|
3547
|
+
gap: 8px;
|
|
3548
|
+
margin: 12px 0 8px;
|
|
3549
|
+
color: var(--ink);
|
|
3550
|
+
font-weight: 600;
|
|
3551
|
+
}
|
|
3552
|
+
|
|
3553
|
+
.export-mode-checkbox input {
|
|
3554
|
+
margin-top: 2px;
|
|
3555
|
+
}
|
|
3556
|
+
|
|
3557
|
+
.export-mode-risk {
|
|
3558
|
+
color: var(--warn) !important;
|
|
3559
|
+
font-size: 0.92rem;
|
|
3560
|
+
}
|
|
3561
|
+
|
|
3562
|
+
.export-mode-actions {
|
|
3563
|
+
margin-top: 14px;
|
|
3564
|
+
display: flex;
|
|
3565
|
+
justify-content: flex-end;
|
|
3566
|
+
gap: 8px;
|
|
3348
3567
|
}
|
|
@@ -3,17 +3,10 @@
|
|
|
3
3
|
window.KEYLOCK_SUPABASE_URL = "https://xyluwvzuogdsgzyganqp.supabase.co";
|
|
4
4
|
window.KEYLOCK_SUPABASE_ANON_KEY = "sb_publishable_f6_mJK6kgHKTjUMY7V9YJg_i6QCzG3g";
|
|
5
5
|
|
|
6
|
-
//
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
// https://favagit.github.io/mantenimento-app/?env=prod
|
|
6
|
+
// Default backend used when no ?env / ?apiBase override is provided.
|
|
7
|
+
window.KEYLOCK_CALC_API_BASE = "https://mantenimento-app.onrender.com";
|
|
8
|
+
|
|
10
9
|
window.KEYLOCK_CALC_API_ENVS = {
|
|
11
10
|
dev: "",
|
|
12
|
-
prod: ""
|
|
13
|
-
};
|
|
14
|
-
|
|
15
|
-
// Optional frontend variants (used by ?frontend=dev on the published app).
|
|
16
|
-
// The dev URL can point to the feature branch static preview.
|
|
17
|
-
window.KEYLOCK_FRONTEND_VARIANT_ENVS = {
|
|
18
|
-
dev: "https://raw.githack.com/FaVaGit/mantenimento-app/feature/v2-scenario-lab/frontend/public/index.html"
|
|
11
|
+
prod: "https://mantenimento-app.onrender.com"
|
|
19
12
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mantenimento-app",
|
|
3
|
-
"version": "2.2
|
|
3
|
+
"version": "2.3.2",
|
|
4
4
|
"description": "Frontend + backend architecture for the mantenimento calculator",
|
|
5
5
|
"type": "commonjs",
|
|
6
6
|
"main": "backend/calculate-model.js",
|
|
@@ -14,6 +14,10 @@
|
|
|
14
14
|
"dev": "node scripts/dev-server.mjs",
|
|
15
15
|
"dev:watch": "node scripts/build-frontend.mjs --watch",
|
|
16
16
|
"build:frontend": "node scripts/build-frontend.mjs",
|
|
17
|
+
"auth:url-token": "node scripts/create-url-login-token.mjs",
|
|
18
|
+
"auth:url-check": "node scripts/auth-url-check.mjs",
|
|
19
|
+
"donor:grant": "node scripts/manage-donor-users.mjs --mode=grant",
|
|
20
|
+
"donor:revoke": "node scripts/manage-donor-users.mjs --mode=revoke",
|
|
17
21
|
"start": "npm run build:frontend && node backend/server.js"
|
|
18
22
|
},
|
|
19
23
|
"keywords": [
|