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.
@@ -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 cifrato</button>
106
- <button class="btn-secondary" id="btnImportJson" type="button">Carica JSON cifrato</button>
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&egrave;!">&#9749;</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.9"></script>
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: 2px;
893
- border: 1px solid #b9d6cf;
894
- border-radius: 12px;
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.8), transparent 58%),
897
- radial-gradient(120% 160% at 100% 0%, rgba(255, 241, 214, 0.8), transparent 58%),
898
- linear-gradient(180deg, #fafdfc, #eef7f5);
899
- padding: 8px;
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: 6px;
913
+ gap: 10px;
903
914
  align-items: center;
904
- transition: opacity 0.2s ease;
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.58;
925
+ opacity: 0.55;
926
+ filter: grayscale(0.4);
909
927
  }
910
928
 
911
929
  .mortgage-split-side {
912
- border: 1px solid #c6ded8;
913
- border-radius: 12px;
914
- padding: 8px;
915
- background: linear-gradient(180deg, #ffffff, #f3faf8);
916
- min-height: 58px;
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: 3px;
920
- box-shadow: 0 1px 3px rgba(17, 74, 68, 0.08);
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.72rem;
989
+ font-size: 0.73rem;
934
990
  font-weight: 800;
935
- color: #2a4a46;
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.9rem;
998
+ font-size: 0.95rem;
941
999
  font-weight: 900;
942
- color: #124f48;
943
- letter-spacing: 0.2px;
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: 14px 0 6px;
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: 8px;
1026
+ height: 10px;
957
1027
  border-radius: 999px;
958
1028
  background: linear-gradient(90deg,
959
- #2b9d8e 0%,
960
- #6cb9a9 var(--split-left),
961
- #dfb264 var(--split-left),
962
- #cb8a2d 100%);
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.16s ease;
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: 22px;
972
- height: 22px;
1048
+ width: 26px;
1049
+ height: 26px;
973
1050
  border-radius: 50%;
974
- border: 2px solid #ffffff;
975
- background: radial-gradient(circle at 35% 30%, #ffffff 0%, #e8f8f5 42%, #177a6f 100%);
976
- box-shadow: 0 3px 9px rgba(13, 70, 64, 0.35);
977
- cursor: pointer;
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: 22px;
982
- height: 22px;
1069
+ width: 26px;
1070
+ height: 26px;
983
1071
  border-radius: 50%;
984
- border: 2px solid #ffffff;
985
- background: radial-gradient(circle at 35% 30%, #ffffff 0%, #e8f8f5 42%, #177a6f 100%);
986
- box-shadow: 0 3px 9px rgba(13, 70, 64, 0.35);
987
- cursor: pointer;
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: -1px;
993
- left: 50%;
1087
+ top: 2px;
1088
+ left: var(--split-left);
994
1089
  transform: translateX(-50%);
995
- font-size: 0.7rem;
1090
+ font-size: 0.73rem;
996
1091
  font-weight: 900;
997
- color: #114c45;
998
- background: #ffffff;
999
- border: 1px solid #b8d5ce;
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: 1px 7px;
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: 3px;
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
- // Optional named backends for the published frontend.
7
- // Example usage:
8
- // https://favagit.github.io/mantenimento-app/?env=dev
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.9",
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": [