88 Commits

Author SHA1 Message Date
MarcoE a4e5709be6 Finish v1.2.0 2026-09-18 11:51:17 +02:00
MarcoE b368b8c10e Finish v1.2.0 2026-09-18 11:51:15 +02:00
MarcoE b73a3bc82e -> v1.2.0 (6) 2026-09-18 11:51:10 +02:00
MarcoE 70a0d0f5fa Rimetti i reparti richiudibili e il "+" sul reparto
Le schede di un reparto erano un elenco fisso: con quattro reparti aperti
la pagina diventava un rotolo, e per aggiungere una scheda a un reparto
preciso bisognava passare dal comando generale e ridichiarare il reparto.

La testata del reparto torna a essere un comando: si tocca per richiudere
il gruppo, e la freccia dice da che parte sta. I conteggi salgono nella
testata ("3 schede · 1 da inviare · 1 da completare") invece di stare nel
corpo: un reparto compattato non deve nascondere quello che gli manca.

Accanto torna il "+", che apre la scheda nuova con il reparto gia'
scelto. E' l'unica differenza con il "+" della barra, ed e' quella che
toglie un passaggio a chi sta lavorando su un reparto alla volta.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-17 16:45:50 +02:00
MarcoE b9de075f45 Rimetti codice e indirizzo nella testata dell'ispezione
La testata mostrava il solo nome del punto vendita, con il codice
relegato a sottotitolo e l'indirizzo da nessuna parte. Torna com'era:
"01 - D11-PRIMO PREZZO - TERLIZZI LILLIUM" e sotto la via. Il codice sta
davanti al nome perche' e' quello che si confronta con il documento
cartaceo; il nome serve a riconoscere il negozio, l'indirizzo a essere
sicuri di stare in quello giusto.

Il titolo cosi' e' lungo, quindi la testata passa alla misura compatta e
puo' andare a capo fino a tre righe invece di troncare: un nome tagliato
a meta' non aiuta nessuno.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-17 16:45:50 +02:00
MarcoE c9b3a5034f Togli l'invito a segnalare il dettaglio dell'errore
Il dialog di errore chiedeva al rilevatore di "segnalare il dettaglio qui
sotto": una richiesta che scarica su chi sta lavorando in corsia il
compito di trascrivere una stringa tecnica, senza dirgli a chi. Il
dettaglio resta a video per chi lo deve leggere, ma nessuno gli chiede
piu' di farci qualcosa: quello che serve sapere e' che il lavoro non e'
andato perso e che puo' riprovare.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-17 16:21:14 +02:00
MarcoE 1392b0e6d1 Togli l'azzurro dalla palette
Il marchio e' corallo (#ec4c41), rosso profondo e bianco sporco: azzurro
non ce n'e'. Nell'app invece era il colore piu' diffuso — lo stato "in
corso", la voce attiva della barra, l'avatar, le righe scelte, il
pannello di riepilogo — e non stava per niente: era solo il tono che si
usa quando un colore serve e non si sa quale.

Il ruolo "info" passa alla famiglia dell'ancora navy, cioe' allo stesso
colore del testo forte: lo stato informativo smette di portarsi un colore
proprio e i colori restano ai toni che significano qualcosa (verde
inviato, ambra da completare, rosso da inviare) e all'accento.

Il pannello di riepilogo dell'ispezione era l'unico blocco tinto dell'app
e diventa bianco come ogni altro pannello: dentro, l'unico colore e'
adesso la barra di avanzamento.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-17 15:54:57 +02:00
MarcoE 13d5400104 Il comando della barra si adatta alla schermata
Il tasto al centro perde l'etichetta: non ne ha una sola, perche' quello
che fa lo decide la schermata sotto. Dentro un'ispezione apre le sue
azioni (nuova scheda, concludi, elimina); altrove apre una nuova
ispezione. Il glifo resta lo stesso e resta nello stesso punto: quello
che cambia e' cosa c'e' dietro, non dove mettere il dito.

Le azioni dell'ispezione lasciano quindi la testata, dove stavano dietro
un menu a tre punti, e tornano sotto il pollice.

Il collegamento passa da PageActionsService: la pagina si registra
finche' e' a video e si sfila uscendo, cosi' la barra non tiene in vita
schermate che non ci sono piu'. Chi non registra niente lascia al
comando il suo significato di default — un'ispezione conclusa non
registra, e il tasto non resta li' a non fare nulla.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-17 15:44:55 +02:00
MarcoE 9703fca306 Porta l'azione "nuova ispezione" dentro la barra di navigazione
Il "+" non galleggia piu' sopra la barra e non sta piu' nella testata: e'
la casella centrale della barra, alla stessa altezza delle altre due e
sotto il pollice. La barra guadagna un margine interno, cosi' le voci non
toccano il bordo stondato e la pastiglia d'accento e' concentrica al
guscio invece che incollata sopra.

L'azione vale la stessa cosa in ogni schermata, e senza rete resta al suo
posto spenta: una casella che scompare sposterebbe le altre due sotto il
dito.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-17 15:16:52 +02:00
MarcoE e3c9880d86 Porta l'accento sul bottone di accesso
"Accedi" era navy come l'ancora della struttura. E' l'unica azione della
schermata: porta l'accento come ogni azione primaria dell'app, e il navy resta
al testo e alla cornice.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-17 15:02:08 +02:00
MarcoE 8cfce316fa Compatta i campi di accesso e togli il doppio bordo sul fuoco
Sul fuoco si vedevano due bordi: quello del campo piu' l'anello globale che
l'input riceve per conto suo, con raggio e colore diversi. Dove e' il
contenitore a segnare il fuoco — accesso, ricerca, barcode, gruppi del form —
l'anello sull'input non serve: il fuoco resta visibile dal bordo del campo.

Campi da 74 a 56 punti: padding piu' stretto, riga del valore alta quanto il
testo che contiene. Il bottone che mostra la password sborda nel padding invece
di alzare la riga, cosi' il campo password non e' piu' alto degli altri due e
il bersaglio resta da 44.

"Accedi" disabilitato era navy pieno con testo bianco: sembrava pronto, e il
tocco a vuoto sembrava un guasto. Ora e' chiaramente inerte.

Con la tastiera aperta il marchio finiva tagliato sopra e non si poteva
risalire: il pannello si centra con i margini automatici invece che con
align-items, cosi' lo scroll arriva anche in cima. Via anche la barra di
scorrimento, come nel resto delle schermate.

Verificata sul terminale, a riposo e col campo attivo.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-17 14:07:49 +02:00
MarcoE 4c1ef3d846 Separa di nuovo i campi della schermata di accesso
Il pannello unico diviso da linee e' la forma di un elenco da consultare. Qui
si compilano tre dati diversi uno dopo l'altro, e lo stacco fra un campo e
l'altro serve a dire dove finisce quello che stai scrivendo.

Ogni campo torna a essere una superficie sua, con il bordo che si accende su
quello attivo. Le etichette restano ferme sopra il campo: e' il salto
dell'etichetta al primo tocco che faceva sembrare la schermata un modulo web,
non il fatto che i campi fossero separati.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-17 12:54:51 +02:00
MarcoE 66ed92299b Ridisegna la schermata di accesso
Ogni campo era un riquadro dentro il riquadro, con l'etichetta che saltava
sopra il testo al primo tocco: un modulo web, non una schermata. Ora i tre
campi stanno in un pannello solo diviso da una linea, come le liste del resto
dell'app, e l'etichetta sta ferma sopra il campo.

Lo sfondo passa alla superficie di lavoro, la stessa dello splash e della prima
schermata: l'avvio non cambia colore tre volte. L'errore di accesso usa il
riquadro di avviso gia' in uso dentro l'app invece di uno stile suo.

Non verificata sul terminale: la sessione sul dispositivo e' aperta e non l'ho
chiusa per non far perdere l'accesso.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-17 12:47:36 +02:00
MarcoE 4e61dc011f Rivedi la scelta del punto vendita
La schermata era dichiarata a tutto schermo ma usciva dentro un riquadro con lo
sfondo visibile ai lati: la misura da dialog di conferma si applicava anche ai
dialog FullScreen, perche' nulla la escludeva. Ora le schermate a tutto schermo
riempiono il display.

Ogni punto vendita era un <div> con role="button": adesso e' un bottone vero,
raggiungibile da tastiera e annunciato per quello che e', con il chevron che
dice che porta altrove. L'indirizzo si ferma a due righe: serve a distinguere
due negozi con lo stesso nome, non a essere letto per intero, e teneva l'elenco
lungo da scorrere.

I punti vendita su cui c'e' gia' un'ispezione aperta oggi lo dichiarano: quel
tocco riapre l'ispezione esistente invece di crearne una nuova, ed e' meglio
saperlo prima.

(Il CSS della riga e' entrato nel commit precedente, adiacente a quello delle
azioni di testata.)

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-17 12:47:36 +02:00
MarcoE 2e3a318132 Togli il + dalla barra e porta le azioni nella testata
Il "+" stava incastrato a destra nella barra di navigazione, che per il resto
contiene destinazioni. Cambiava significato da una schermata all'altra senza
mai dichiararlo, e su Ispezioni apriva un menu per far scegliere fra una cosa
sola. Il documento di stile esclude esplicitamente il FAB di serie, e la barra
torna a contenere solo le due destinazioni.

Su Ispezioni l'azione e' un bottone con il suo nome nella testata, e porta
dritta alla scelta del punto vendita senza passaggi intermedi. Lo stato vuoto
offre lo stesso comando invece di spiegare dove trovarlo.

Su Ispezione le azioni sono tre e con pesi diversi: restano in un bottom sheet,
aperto dalla testata. Eliminare un'ispezione ora chiede conferma — prima un
tocco cancellava ispezione e schede senza appello.

Le azioni vivono nella pagina che le esegue, quindi i messaggi che le
rimbalzavano dalla barra (NewSchedaService, CompleteInspectionService) non
hanno piu' mittente e se ne vanno.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-17 12:47:06 +02:00
MarcoE 101b68123c Sostituisci la tendina di reparto e motivo con un bottom sheet
La MudSelect apriva un riquadro bianco che galleggiava sopra le card bianche,
senza titolo, senza sfondo oscurato, con la barra di scorrimento del desktop e
le righe alte quanto una riga di testo. Era la cosa che piu' di tutte faceva
sembrare l'app una pagina web.

Ora il campo e' una riga tappabile che mostra il valore, e la scelta arriva da
un bottom sheet con il titolo del campo e righe da 56 px con il segno tondo
della scelta singola: la stessa forma degli altri selettori dell'app, usabile
in piedi e con i guanti.

Il confronto per capire quale opzione e' quella corrente passa per l'etichetta:
Scheda.Reparto ricostruisce l'oggetto al volo da codice e descrizione, quindi
non e' mai lo stesso oggetto di quelli in elenco e il confronto di riferimento
non avrebbe segnato mai nulla.

Reparto e motivo non passano piu' dalla validazione di MudForm, perche' non
sono piu' input: il controllo degli obbligatori e' esplicito e l'errore si vede
sul gruppo interessato, non solo nel messaggio in cima. Si accende dopo il primo
tentativo di salvataggio, non prima: un form rosso all'apertura accusa l'utente
di un errore che non ha ancora commesso.

La scelta fatta si segna col tono informativo: un bordo corallo intorno a un
riempimento azzurro si leggeva come un errore.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-17 12:46:48 +02:00
MarcoE ac501dc261 Metti l'anello di focus solo sui comandi
La regola valeva per qualunque elemento, e la WebView sposta il fuoco anche su
contenitori non interattivi: dopo la chiusura di un dialog restava un anello
azzurro intorno al titolo della testata, che indicava un bersaglio inesistente.
Ora lo prendono link, bottoni, campi e gli elementi dichiaratamente tappabili.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-17 12:46:28 +02:00
MarcoE 2d7e3c591e Dai una gerarchia ai pesi tipografici
Quasi tutto il testo dell'app stava fra 600 e 800: etichette, valori, indirizzi,
conteggi, voci di elenco. Un grassetto ovunque non segnala niente, e la pagina
Profilo era il caso peggiore — ogni riga gridava come un titolo.

La scala ora ha quattro gradini, documentati nei token:
  400  corpo, metadati, valori descrittivi
  500  etichette di campo, voci di lista, testo dei controlli
  600  stati brevi (badge, voce attiva), nomi in una riga di elenco
  700  titoli, uno solo per blocco

Sopra il 700 non si sale: l'800 dei titoli di card e dell'avatar e' sceso a 700.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-17 12:46:28 +02:00
MarcoE 7099f02b60 Ridai il titolo ai dialog di conferma
MudDialogProvider aveva NoHeader="true" come valore predefinito di tutti i
dialog. MudMessageBox rende il proprio titolo nella testata, quindi quel
valore lo sopprimeva ovunque: davanti a "Elimina" si leggeva solo il testo
delle conseguenze, senza la domanda.

Le schermate a tutto schermo (form scheda, scelta punto vendita, scelta
articoli) chiedono gia' NoHeader per conto loro nelle DialogOptions, quindi
toglierlo dal provider non le tocca.

I titoli ora dicono cosa sta per succedere invece del generico "Attenzione!":
"Eliminare la scheda?", "Uscire dall'account?", "Inviare le schede del
reparto?".

Le scelte in fondo al dialog si dispongono a destra e, sotto i 380 punti,
diventano una colonna a piena larghezza: con etichette lunghe come "Salva come
bozza" i bersagli non si comprimono.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-17 12:45:47 +02:00
MarcoE ca0aaf69b5 Allinea lo splash alla superficie dell'app
Lo splash era rosa (#FDECEA) mentre l'app apre su #E9EDF2: a ogni avvio si
vedeva un lampo di colore prima della prima schermata. Ora e' la stessa
superficie, e il passaggio non si nota.

Il tema dello splash deriva da quello generato da MAUI e chiede le icone di
sistema scure, coerenti con lo sfondo chiaro. Su Android 12+ lo splash e'
disegnato dal sistema, che dell'attributo puo' non tenere conto: sul terminale
di prova le icone restano chiare per la frazione di secondo dello splash.

Marchio da 128 a 112: su 360 punti di larghezza riempiva troppo.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-17 12:45:34 +02:00
MarcoE 52b2994d3b Intercetta il tasto indietro dove passa davvero
Il salvataggio come bozza non e' mai scattato dal tasto indietro: la UI Blazor
non riceveva l'evento, e uscire da un form con modifiche in corso buttava via
il lavoro esattamente come prima che la bozza esistesse.

Il back non arrivava a OnBackPressed per due motivi diversi:
- da AndroidX Activity 1.6 il gesto passa dall'OnBackPressedDispatcher e il
  metodo dell'Activity non viene piu' invocato;
- con la navigazione a tre tasti il back arriva come evento di tastiera e la
  WebView lo intercetta per conto suo, tornando indietro nella propria
  cronologia, prima che Activity o dispatcher lo vedano.

Ora la chiave si ferma in DispatchKeyEvent, che passa prima della gerarchia di
view, e resta un callback sul dispatcher per la navigazione a gesti, dove
evento di tastiera non ce n'e'. Entrambi restano accesi solo finche' la UI ha
davvero qualcosa da dire: altrimenti il back si comporta come sempre.

I gestori diventano una pila, cosi' sopra il form puo' aprirsi un bottom sheet
e il back chiude prima quello senza portarsi via la registrazione sottostante.
ActionSheet si registra da solo mentre e' aperto.

Verificato sull'EDA52: back sul form con modifiche apre "Lavoro non salvato" e
salva la bozza; back sullo sheet chiude solo lo sheet.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-17 12:45:23 +02:00
MarcoE 811d8a86d8 Correzioni alla UI dopo la verifica sul terminale
Prime correzioni fatte guardando l'app su un Honeywell EDA52 (720x1440
@320dpi, cioe' 360 punti logici di larghezza) invece che a occhio.

- Barra di stato: era tinta di corallo da colorPrimaryDark, cioe' l'accento
  usato come decorazione della cornice di sistema. Ora si fonde con lo
  sfondo dell'app, con icone scure (WindowInsetsController).
- Gradino compatto sotto i 380px: la scala di STILE_UI e' tarata su telefoni
  piu' larghi, e a misura piena i titoli si troncavano e in una schermata
  entrava pochissimo lavoro. Le proporzioni restano, cambia la taglia.
  Sui telefoni normali non cambia nulla.
- Icone delle azioni costruttive: usavano il fondo del tono danger, quindi
  "Nuova scheda" e "Aggiungi una foto" erano identiche a "Elimina
  ispezione". Ora usano il tono info. Un --primary-surface non risolveva:
  il primario di SteUP e' gia' un rosso, quindi un suo fondo tenue resta
  indistinguibile da quello danger.
- Testata: il titolo puo' andare su due righe prima di troncare. Il nome del
  punto vendita e' l'ancora del compito, "D11-PRIMO PREZ..." non aiuta.
- Schermata ispezione: il nome del punto vendita non e' piu' ripetuto nel
  pannello di riepilogo, dove era gia' in testata.
- Padding dei gruppi di form e della barra azioni ridotti su schermo stretto.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-17 11:52:31 +02:00
MarcoE 2a0054aa30 Rifacimento della UI secondo STILE_UI.md
Adotta lo stile condiviso delle app Integry: superfici piatte, raggi ampi,
spaziature a scala fissa, gerarchia data dallo spazio prima che dalla
decorazione. La palette storica di SteUP resta intatta; sono stati aggiunti
solo i ruoli che mancavano (workspace, surfaceMuted, divider, inkMuted e le
triplette dei toni semantici).

Fondamenta
- tokens.css: ruoli colore, scale di spazio/raggi/tipografia, curve di
  movimento e scala z-index semantica. Unica fonte di verita': pilotano
  anche le variabili CSS di MudBlazor.
- Inter variabile ospitata in locale (133KB) al posto di Nunito da Google
  Fonts: l'app lavora offline, un font che arriva dalla rete in campo non
  arriva.
- base.css: shell applicativa e comportamenti da app nativa — niente
  selezione testo, niente menu al tocco lungo, niente lampo grigio sul tap,
  niente rimbalzo elastico, niente zoom a doppio tocco, scroll con inerzia.
- mudblazor-overrides.css: MudBlazor appiattito (elevation 0, nessun tint,
  target 44/48, etichette in caso naturale).
- Rimossi Bootstrap (CSS, icone e JS) e i 996 righe di CSS con ambito per
  componente del vecchio sistema: erano tutti inutilizzati.

Struttura
- Navigazione flottante in basso con icona piena sulla voce attiva; da 720px
  diventa colonna laterale. Il MudFabMenu e' sostituito da un bottom sheet:
  stessa funzione, bersagli molto piu' grandi.
- Testata alta col titolo a sinistra, fusa con la pagina.
- Nel form scheda il salvataggio sta in una barra ancorata in fondo, non in
  coda a uno scroll lungo.
- Scelta di punto vendita e articoli a schermo intero con ricerca; la
  selezione multipla usa righe da 56px invece di un menu a tendina.
- Urgenza scelta a pillole invece che da una select.

Stato e riscontro
- StatusBadgeHelper: tono, icona ed etichetta di ogni stato in un punto solo,
  cosi' lo stesso stato si presenta identico ovunque.
- Scheletri al posto degli spinner; l'overlay bloccante dice sempre cosa sta
  facendo; gli stati vuoti suggeriscono la mossa successiva.
- Rimosso il ritardo artificiale di 250ms in InspectionCard, che non
  attendeva nulla.

DESIGN.md riscritto sul nuovo sistema.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-17 11:09:26 +02:00
MarcoE 3a9174f6fc Raddrizza le foto applicando l'orientamento EXIF
La fotocamera di sistema non ruota lo scatto: salva i pixel come li legge
il sensore e annota la rotazione in EXIF. SkiaSharp (SKBitmap.Decode)
ignora quel tag, quindi le foto scattate ruotate finivano storte nelle
miniature e venivano inviate cosi' al server.

- ImageOrientation: applica l'orientamento ai pixel e ricodifica senza tag
  residui, mantenendo il formato di partenza. Immagine gia' dritta: nessuna
  ricodifica, per non perdere qualita' inutilmente. In caso di errore
  restituisce i byte originali, meglio una foto storta che nessuna foto.
- UtilityFile.ConvertToDto: normalizza li', unico punto di passaggio di
  fotocamera e galleria, cosi' miniature, salvataggio locale e upload
  lavorano su pixel gia' dritti. Corretto anche DimensionBytes.
- ImageThumb: applica l'orientamento anche in fase di miniatura, per
  raddrizzare le foto gia' presenti sul dispositivo.

Nessun ritratto forzato: costringere una foto orizzontale in verticale
vorrebbe dire ruotare il contenuto o ritagliarlo, e queste foto sono prove
di ispezione.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-17 10:32:41 +02:00
MarcoE 3b04702665 Decodifica PLU dai barcode CODE128 a 7 cifre
Oltre alle etichette a peso variabile (EAN13/CODE128 a 13 cifre), ora
vengono riconosciuti i CODE128 di 7 cifre che iniziano con '2': si scarta
il prefisso e restano le 6 cifre del PLU, come per DecodeEanPeso.
2026-09-16 18:07:43 +02:00
MarcoE 0174316bb7 Niente errore quando il trigger viene premuto a vuoto
Honeywell emette BarcodeFailureEvent anche solo premendo e rilasciando il
trigger senza inquadrare nulla: e' la normale mancata lettura, non un
guasto. Finiva pero' in OnScanFailed insieme ai guasti veri, quindi ogni
pressione a vuoto fermava il rilevatore con un dialog bloccante contenente
il toString() Java grezzo:

  Scan failure: com.honeywell.aidc.BarcodeFailureEvent[source=...]

Ora l'evento e' ignorato: chi preme il trigger sa gia' di non aver letto
niente, non serve alcun riscontro. OnScanFailed resta riservato ai guasti
reali (ScannerUnavailableException alla Claim, init di AidcManager fallito).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-16 17:57:41 +02:00
MarcoE d076a4b77a Salvataggio come bozza: il lavoro in corso non si perde piu'
Uscendo da una scheda a meta' (tasto indietro del dispositivo o "Annulla")
il lavoro veniva scartato. Il tasto indietro non era nemmeno gestito: non
arriva alla WebView e non c'e' stack di navigazione, quindi mandava l'app
in background con i dati solo in memoria.

Nuovo stato Bozza ("Da completare"): salvata in locale, mai inviabile
finche' non viene conclusa.

- Scheda.Bozza + migration additiva (default false: le schede esistenti
  non cambiano stato).
- SchedaSyncHelper: terzo SyncState, CountBozze(). CountDaInviare()
  esclude le bozze, quindi il badge "da inviare" resta corretto.
- ModalFormScheda: SaveDraft() salva solo in locale senza validazione;
  Save() azzera il flag; Submit() avvisa quando il form e' invalido
  (prima il tocco su "Salva" sembrava non fare nulla se i campi mancanti
  erano fuori schermo); Update() prende preserveActivityId cosi' una
  bozza di scheda gia' inviata mantiene il link al server e al
  completamento lo aggiorna invece di duplicarlo.
- ConfirmUpdateActivity: il pulsante bozza sta su NoText, non CancelText
  (CancelText ritorna null, NoText ritorna false).
- BackButtonService + MainActivity.OnBackPressed: il tasto indietro passa
  dallo stesso percorso di "Annulla". Ignorato mentre e' aperto un dialog
  figlio, per non mostrare il prompt sotto un altro dialog.
- IspezionePage: "Concludi ispezione" si blocca se ci sono bozze,
  "Esporta reparto" le salta, chip "N da completare" per reparto.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-16 13:24:35 +02:00
MarcoE e3942d00cc Fix rilevamento modifiche nella scheda: articoli e allegati
Uscendo dalla scheda il prompt di salvataggio non compariva e il pulsante
"Salva" restava nascosto, perche' IsDirty non vedeva il lavoro fatto:

- gli articoli scelti dalla griglia (OpenSelectArt) non marcavano mai la
  scheda come modificata;
- ValueComparer confronta solo i campi del form, quindi ogni RecalcDirty()
  successivo azzerava il flag alzato con forceTrue da scanner e allegati.
  Non bastava confrontare Articoli: Clone() e' un MemberwiseClone, quindi
  _originalScheda condivide la stessa lista.

Ora il confronto usa uno snapshot dei barcode preso all'apertura piu' un
flag per gli allegati (che vivono in AttachedList fino al salvataggio), e
RecalcDirty() perde forceTrue: non puo' piu' essere azzerato. Le chiamate
su insert/remove degli articoli erano anche fatte prima della modifica
della lista, quindi valutavano lo stato precedente.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-16 13:23:34 +02:00
MarcoE 92b60deac0 Fix tastiera che copre il campo di scrittura
Da Android 15 (API 35+) l'edge-to-edge e' forzato e adjustResize non
ridimensiona piu' la finestra: la tastiera si limita a coprire la
BlazorWebView. Con il layout rigido (html overflow:hidden, #app 100vh,
page/main height:100% overflow:hidden) nemmeno il browser riesce a
portare in vista il campo col focus.

- MainActivity: WindowSoftInputMode AdjustResize|StateHidden e listener
  sugli WindowInsets che applica al content view il padding bottom pari
  all'inset IME (meno quello delle system bars, gia' coperto da
  SafeAreaEdges in MainPage), cosi' il 100vh si ricalcola.
- main.js: su focusin e visualViewport resize porta il campo attivo al
  centro con scrollIntoView, necessario per i contenitori scrollabili.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-16 11:33:36 +02:00
MarcoE 48e55226f3 Finish v1.1.1(5) 2026-07-22 14:50:59 +02:00
MarcoE 963eba1e84 Finish v1.1.1(5) 2026-07-22 14:50:59 +02:00
MarcoE 55c0e539b1 -> v1.1.1 (5) 2026-07-22 14:50:54 +02:00
MarcoE 5ec7468b1c Fix scanner barcode per i plu 2026-07-22 14:50:09 +02:00
MarcoE 74b671586f Fix duplicazione scheda quando si modificava 2026-07-22 13:06:49 +02:00
MarcoE b2c8174d6f Finish v1.1.0(4) 2026-07-14 14:25:56 +02:00
MarcoE ce704fa91b Finish v1.1.0(4) 2026-07-14 14:25:55 +02:00
MarcoE 2fad8557ba -> 1.1.0 (4) 2026-07-14 14:25:48 +02:00
MarcoE a81689bd56 Fix vari 2026-07-14 14:22:26 +02:00
MarcoE 4e13db24f6 Fix: nota descrittiva suggerita ora visibile subito nel campo note
Il MudTextField delle note ha DebounceInterval e non rifletteva una modifica
del Value fatta da codice. Aggiunta una @key sul campo che, incrementata
quando si applica il suggerimento, forza Blazor a ricreare il campo con la
nota selezionata gia impostata: la nota compare subito a video.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-08 16:57:02 +02:00
MarcoE c454474f49 Migliora IspezionePage e form scheda (design review impeccable)
Ispezione:
- Stato sync visibile: badge per-scheda (Da inviare/Inviato) e contatore
  "N da inviare" per reparto (nuovo SchedaSyncHelper)
- Completamento: progresso reale nell'overlay + spunta di successo;
  NON completa se una scheda fallisce (resta editabile, schede "Da inviare")
- Export reparto/completamento blindati: conferma + guardia anti doppio-tap,
  try/finally che libera sempre l'overlay
- Accento corallo unico per l'azione "invia"; target di tocco >=44px;
  empty state; solo il primo pannello espanso di default
- Tasto "Invia" nascosto sulle schede gia inviate
- Messaggio d'errore comprensibile in campo (dettaglio tecnico nei log)
- Fix OnSchedaModified (index >= 0)

Aspetto card:
- SchedaCard e InspectionCard: superficie Carta + hairline border + ombra
  morbida (nuovo token --card-box-shadow); pagina con tinta Grigio Campo
- SchedaCard compattata

Form scheda (ModalFormScheda):
- Tasto Salva/Aggiorna full-width
- Fix "Suggerisci note descrittive": la nota selezionata ora viene inserita
  nel campo (metodo async sul thread UI + OnAfterChangeValue)

StatusEnum: etichette in sentence-case

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-08 16:39:20 +02:00
MarcoE 9f4088eff3 Init claude e impeccable 2026-07-08 15:10:12 +02:00
MarcoE a04ccde2ec Spostato tasto salva 2026-07-06 15:00:38 +02:00
MarcoE a3d27c9ef8 Rimossa richiesta fotocamera - galleria e implementata apertura automatica fotocamera 2026-07-06 09:34:00 +02:00
MarcoE c2ff6bbbe5 Finish v1.0.2(3) 2026-06-17 10:48:45 +02:00
MarcoE 294c2d1dd0 Finish v1.0.2(3) 2026-06-17 10:48:44 +02:00
MarcoE 2a42036c29 -> v1.0.2 (3) 2026-06-17 10:48:37 +02:00
MarcoE 339828004d Aggiunta compatibilità con Honeywell CT40 2026-06-17 10:47:45 +02:00
MarcoE 76ac8f051e Finish v1.0.1(2) 2026-04-23 14:52:11 +02:00
MarcoE a1b4ff664d Finish v1.0.1(2) 2026-04-23 14:52:07 +02:00
MarcoE bc8582d3f5 -> v1.0.1 (2) 2026-04-23 14:51:59 +02:00
MarcoE 38ef7ebd33 Aggiunta compatibilità con Honeywell CT70-X1 2026-04-23 14:49:00 +02:00
MarcoE 98d2dda780 Aggiornamento librerie 2026-04-23 14:45:48 +02:00
MarcoE f09ea026bc Aggiunta cancellazione ispezione 2026-04-23 11:22:13 +02:00
MarcoE c2da0e150d Fix get ispezioni 2026-04-23 10:57:10 +02:00
MarcoE f9e4957ae3 Aggiunta compatibilità con HoneyWell CT40XP 2026-04-23 10:56:32 +02:00
MarcoE 43f17c1410 Fix caricamento apertura 2026-03-19 10:09:05 +01:00
MarcoE 0abe88939b Fix prese tutte le ispezioni legate all'utente 2026-03-05 16:53:05 +01:00
MarcoE e57738a37f Fix chiamata api 2026-03-04 12:59:32 +01:00
MarcoE 21ee5137b0 Creato metodo per la rimozione delle ispezioni più vecchie di 60 giorni 2026-03-04 12:08:57 +01:00
MarcoE 2d938fb210 Fix gestione allegati e creato metodo di esportazione log 2026-03-04 11:51:42 +01:00
MarcoE 3760e38c8d Esportazione immagini anche con ispezione completata 2026-03-03 12:50:17 +01:00
MarcoE e1e0c91db5 Nascosto + in caso l'ispezione è completata 2026-03-02 16:54:14 +01:00
MarcoE 99a5395a1f Vario 2026-03-02 16:12:58 +01:00
MarcoE 8fbeaf8637 Aggiunto messaggio per completamento ispezione 2026-03-02 13:01:19 +01:00
MarcoE 63368748ab Aggiunto blocco per ispezioni non completate più vecchie di 20 giorni 2026-03-02 12:30:34 +01:00
MarcoE ab9578a45f Gestiti salvataggi rest 2026-03-02 10:50:34 +01:00
MarcoE e027d8e5cf Implentata scansione barcode e lista articoli nel form scheda 2026-02-26 15:46:49 +01:00
MarcoE a5e27bcf06 Migliorie grafiche per gli articoli 2026-02-25 11:04:36 +01:00
MarcoE 7fa96eeb09 Implementato sdk honeywell e metodi per lo scanner barcode 2026-02-24 17:49:25 +01:00
MarcoE e8adb76256 Aggiornamento librerie 2026-02-24 12:48:23 +01:00
MarcoE c7fb4a28a4 Gestite immagini allegate 2026-02-24 11:33:36 +01:00
MarcoE a4dece511f Fix grafici 2026-02-23 16:22:55 +01:00
MarcoE aaffaa3a2a Gestite azioni in pagina ispezione 2026-02-23 15:40:59 +01:00
MarcoE efefd3499b Gestite schede nella pagina ispezione e migliorie grafiche 2026-02-23 10:12:36 +01:00
MarcoE b39b7ba751 Gestiti allegati nel form 2026-02-20 15:29:32 +01:00
MarcoE eef5055bfa Migliorie al form schede 2026-02-19 09:52:18 +01:00
MarcoE c6e6480cd2 Aggiornate librerie e migrazione a .net 10 2026-02-18 17:08:56 +01:00
MarcoE 1b36efb176 Gestito appVersion 2026-02-18 12:12:10 +01:00
MarcoE e7357bd78a Implemetato databese locale con EntityFramework 2026-02-17 17:40:33 +01:00
MarcoE 544c9e8237 Gestiti allegati da galleria e fotocamera e aggiunto sentry 2026-02-17 10:23:46 +01:00
MarcoE c1a133c61e Aggiunti nuovi campi al form 2026-02-17 09:47:14 +01:00
MarcoE 69f2dee309 Iniziata implementazione form rilevazione 2026-02-13 17:28:48 +01:00
MarcoE 06cc41ef8b Aggiunte chiamate api per dati utili 2026-02-12 12:59:46 +01:00
MarcoE 5afe4f4745 Aggiunta selezione negozio 2026-02-12 10:43:16 +01:00
MarcoE d8bef12f30 Creata pagina "user" 2026-02-06 18:08:40 +01:00
MarcoE 755f78ef9d Gestito login 2026-02-06 10:04:36 +01:00
MarcoE ecafebae7f Prima configurazione e struttura 2026-02-04 17:31:00 +01:00
MarcoE 1a949051ca Rinominati file progetto 2026-02-04 12:14:03 +01:00
341 changed files with 13302 additions and 7036 deletions
+5
View File
@@ -0,0 +1,5 @@
{
"enabledPlugins": {
"impeccable@impeccable": true
}
}
+3
View File
@@ -1,5 +1,6 @@
# Specific to the EFCore-Blazor sample app
*.db
*.db3
*.db-shm
*.db-wal
@@ -32,6 +33,8 @@ bld/
# Visual Studo 2015 cache/options directory
.vs/
.idea
# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*
-1
View File
@@ -1 +0,0 @@
MyWorkout
-18
View File
@@ -1,18 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="deploymentTargetSelector">
<selectionStates>
<SelectionState runConfigName="MyWorkout.Maui">
<option name="selectionMode" value="DROPDOWN" />
<DropdownSelection timestamp="2024-09-04T08:58:30.256405Z">
<Target type="DEFAULT_BOOT">
<handle>
<DeviceId pluginId="LocalEmulator" identifier="path=C:\Users\GiuseppeS.STUDIO-ML\.android\avd\vs_-_pixel_5_-_api_34.avd" />
</handle>
</Target>
</DropdownSelection>
<DialogSelection />
</SelectionState>
</selectionStates>
</component>
</project>
-8
View File
@@ -1,8 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="UserContentModel">
<attachedFolders />
<explicitIncludes />
<explicitExcludes />
</component>
</project>
@@ -1,10 +0,0 @@
<component name="libraryTable">
<library name="androidx.activity.activity">
<CLASSES>
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/androidx.activity.activity/classes.jar" />
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/androidx.activity.activity/res" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>
@@ -1,10 +0,0 @@
<component name="libraryTable">
<library name="androidx.activity.activity-ktx">
<CLASSES>
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/androidx.activity.activity-ktx/classes.jar" />
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/androidx.activity.activity-ktx/res" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>
@@ -1,9 +0,0 @@
<component name="libraryTable">
<library name="androidx.annotation.annotation">
<CLASSES>
<root url="jar://$PROJECT_DIR$/../../../../../Nuget/xamarin.androidx.annotation/1.6.0.4/jar/androidx.annotation.annotation.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>
@@ -1,10 +0,0 @@
<component name="libraryTable">
<library name="androidx.annotation.annotation-experimental">
<CLASSES>
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/androidx.annotation.annotation-experimental/classes.jar" />
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/androidx.annotation.annotation-experimental/res" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>
@@ -1,9 +0,0 @@
<component name="libraryTable">
<library name="androidx.annotation.annotation-jvm">
<CLASSES>
<root url="jar://$PROJECT_DIR$/../../../../../Nuget/xamarin.androidx.annotation.jvm/1.6.0.2/jar/androidx.annotation.annotation-jvm.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>
@@ -1,10 +0,0 @@
<component name="libraryTable">
<library name="androidx.appcompat.appcompat">
<CLASSES>
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/androidx.appcompat.appcompat/classes.jar" />
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/androidx.appcompat.appcompat/res" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>
@@ -1,10 +0,0 @@
<component name="libraryTable">
<library name="androidx.appcompat.appcompat-resources">
<CLASSES>
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/androidx.appcompat.appcompat-resources/classes.jar" />
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/androidx.appcompat.appcompat-resources/res" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>
@@ -1,9 +0,0 @@
<component name="libraryTable">
<library name="androidx.arch.core.core-common">
<CLASSES>
<root url="jar://$PROJECT_DIR$/../../../../../Nuget/xamarin.androidx.arch.core.common/2.2.0.3/jar/androidx.arch.core.core-common.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>
@@ -1,10 +0,0 @@
<component name="libraryTable">
<library name="androidx.arch.core.core-runtime">
<CLASSES>
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/androidx.arch.core.core-runtime/classes.jar" />
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/androidx.arch.core.core-runtime/res" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>
@@ -1,10 +0,0 @@
<component name="libraryTable">
<library name="androidx.browser.browser">
<CLASSES>
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/androidx.browser.browser/classes.jar" />
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/androidx.browser.browser/res" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>
@@ -1,10 +0,0 @@
<component name="libraryTable">
<library name="androidx.cardview.cardview">
<CLASSES>
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/androidx.cardview.cardview/classes.jar" />
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/androidx.cardview.cardview/res" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>
@@ -1,9 +0,0 @@
<component name="libraryTable">
<library name="androidx.collection.collection">
<CLASSES>
<root url="jar://$PROJECT_DIR$/../../../../../Nuget/xamarin.androidx.collection/1.2.0.9/jar/androidx.collection.collection.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>
@@ -1,9 +0,0 @@
<component name="libraryTable">
<library name="androidx.collection.collection-ktx">
<CLASSES>
<root url="jar://$PROJECT_DIR$/../../../../../Nuget/xamarin.androidx.collection.ktx/1.2.0.9/jar/androidx.collection.collection-ktx.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>
@@ -1,9 +0,0 @@
<component name="libraryTable">
<library name="androidx.concurrent.concurrent-futures">
<CLASSES>
<root url="jar://$PROJECT_DIR$/../../../../../Nuget/xamarin.androidx.concurrent.futures/1.1.0.14/jar/androidx.concurrent.concurrent-futures.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>
@@ -1,10 +0,0 @@
<component name="libraryTable">
<library name="androidx.constraintlayout.constraintlayout">
<CLASSES>
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/androidx.constraintlayout.constraintlayout/classes.jar" />
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/androidx.constraintlayout.constraintlayout/res" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>
@@ -1,9 +0,0 @@
<component name="libraryTable">
<library name="androidx.constraintlayout.constraintlayout-core">
<CLASSES>
<root url="jar://$PROJECT_DIR$/../../../../../Nuget/xamarin.androidx.constraintlayout.core/1.0.4.6/jar/androidx.constraintlayout.constraintlayout-core.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>
@@ -1,10 +0,0 @@
<component name="libraryTable">
<library name="androidx.coordinatorlayout.coordinatorlayout">
<CLASSES>
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/androidx.coordinatorlayout.coordinatorlayout/classes.jar" />
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/androidx.coordinatorlayout.coordinatorlayout/res" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>
@@ -1,10 +0,0 @@
<component name="libraryTable">
<library name="androidx.core.core">
<CLASSES>
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/androidx.core.core/classes.jar" />
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/androidx.core.core/res" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>
@@ -1,10 +0,0 @@
<component name="libraryTable">
<library name="androidx.core.core-ktx">
<CLASSES>
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/androidx.core.core-ktx/classes.jar" />
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/androidx.core.core-ktx/res" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>
@@ -1,9 +0,0 @@
<component name="libraryTable">
<library name="androidx.cursoradapter.cursoradapter">
<CLASSES>
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/androidx.cursoradapter.cursoradapter/classes.jar" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>
@@ -1,9 +0,0 @@
<component name="libraryTable">
<library name="androidx.customview.customview">
<CLASSES>
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/androidx.customview.customview/classes.jar" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>
@@ -1,10 +0,0 @@
<component name="libraryTable">
<library name="androidx.customview.customview-poolingcontainer">
<CLASSES>
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/androidx.customview.customview-poolingcontainer/classes.jar" />
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/androidx.customview.customview-poolingcontainer/res" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>
@@ -1,9 +0,0 @@
<component name="libraryTable">
<library name="androidx.documentfile.documentfile">
<CLASSES>
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/androidx.documentfile.documentfile/classes.jar" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>
@@ -1,10 +0,0 @@
<component name="libraryTable">
<library name="androidx.drawerlayout.drawerlayout">
<CLASSES>
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/androidx.drawerlayout.drawerlayout/classes.jar" />
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/androidx.drawerlayout.drawerlayout/res" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>
@@ -1,9 +0,0 @@
<component name="libraryTable">
<library name="androidx.dynamicanimation.dynamicanimation">
<CLASSES>
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/androidx.dynamicanimation.dynamicanimation/classes.jar" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>
@@ -1,10 +0,0 @@
<component name="libraryTable">
<library name="androidx.emoji2.emoji2">
<CLASSES>
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/androidx.emoji2.emoji2/classes.jar" />
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/androidx.emoji2.emoji2/res" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>
@@ -1,10 +0,0 @@
<component name="libraryTable">
<library name="androidx.emoji2.emoji2-views-helper">
<CLASSES>
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/androidx.emoji2.emoji2-views-helper/classes.jar" />
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/androidx.emoji2.emoji2-views-helper/res" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>
@@ -1,9 +0,0 @@
<component name="libraryTable">
<library name="androidx.exifinterface.exifinterface">
<CLASSES>
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/androidx.exifinterface.exifinterface/classes.jar" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>
@@ -1,10 +0,0 @@
<component name="libraryTable">
<library name="androidx.fragment.fragment">
<CLASSES>
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/androidx.fragment.fragment/classes.jar" />
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/androidx.fragment.fragment/res" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>
@@ -1,10 +0,0 @@
<component name="libraryTable">
<library name="androidx.fragment.fragment-ktx">
<CLASSES>
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/androidx.fragment.fragment-ktx/classes.jar" />
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/androidx.fragment.fragment-ktx/res" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>
@@ -1,9 +0,0 @@
<component name="libraryTable">
<library name="androidx.interpolator.interpolator">
<CLASSES>
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/androidx.interpolator.interpolator/classes.jar" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>
@@ -1,9 +0,0 @@
<component name="libraryTable">
<library name="androidx.legacy.legacy-support-core-utils">
<CLASSES>
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/androidx.legacy.legacy-support-core-utils/classes.jar" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>
@@ -1,9 +0,0 @@
<component name="libraryTable">
<library name="androidx.lifecycle.lifecycle-common">
<CLASSES>
<root url="jar://$PROJECT_DIR$/../../../../../Nuget/xamarin.androidx.lifecycle.common/2.6.1.3/jar/androidx.lifecycle.lifecycle-common.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>
@@ -1,10 +0,0 @@
<component name="libraryTable">
<library name="androidx.lifecycle.lifecycle-livedata">
<CLASSES>
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/androidx.lifecycle.lifecycle-livedata/classes.jar" />
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/androidx.lifecycle.lifecycle-livedata/res" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>
@@ -1,10 +0,0 @@
<component name="libraryTable">
<library name="androidx.lifecycle.lifecycle-livedata-core">
<CLASSES>
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/androidx.lifecycle.lifecycle-livedata-core/classes.jar" />
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/androidx.lifecycle.lifecycle-livedata-core/res" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>
@@ -1,10 +0,0 @@
<component name="libraryTable">
<library name="androidx.lifecycle.lifecycle-livedata-core-ktx">
<CLASSES>
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/androidx.lifecycle.lifecycle-livedata-core-ktx/classes.jar" />
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/androidx.lifecycle.lifecycle-livedata-core-ktx/res" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>
@@ -1,10 +0,0 @@
<component name="libraryTable">
<library name="androidx.lifecycle.lifecycle-process">
<CLASSES>
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/androidx.lifecycle.lifecycle-process/classes.jar" />
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/androidx.lifecycle.lifecycle-process/res" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>
@@ -1,10 +0,0 @@
<component name="libraryTable">
<library name="androidx.lifecycle.lifecycle-runtime">
<CLASSES>
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/androidx.lifecycle.lifecycle-runtime/classes.jar" />
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/androidx.lifecycle.lifecycle-runtime/res" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>
@@ -1,10 +0,0 @@
<component name="libraryTable">
<library name="androidx.lifecycle.lifecycle-runtime-ktx">
<CLASSES>
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/androidx.lifecycle.lifecycle-runtime-ktx/classes.jar" />
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/androidx.lifecycle.lifecycle-runtime-ktx/res" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>
@@ -1,10 +0,0 @@
<component name="libraryTable">
<library name="androidx.lifecycle.lifecycle-viewmodel">
<CLASSES>
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/androidx.lifecycle.lifecycle-viewmodel/classes.jar" />
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/androidx.lifecycle.lifecycle-viewmodel/res" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>
@@ -1,10 +0,0 @@
<component name="libraryTable">
<library name="androidx.lifecycle.lifecycle-viewmodel-ktx">
<CLASSES>
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/androidx.lifecycle.lifecycle-viewmodel-ktx/classes.jar" />
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/androidx.lifecycle.lifecycle-viewmodel-ktx/res" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>
@@ -1,10 +0,0 @@
<component name="libraryTable">
<library name="androidx.lifecycle.lifecycle-viewmodel-savedstate">
<CLASSES>
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/androidx.lifecycle.lifecycle-viewmodel-savedstate/classes.jar" />
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/androidx.lifecycle.lifecycle-viewmodel-savedstate/res" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>
@@ -1,9 +0,0 @@
<component name="libraryTable">
<library name="androidx.loader.loader">
<CLASSES>
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/androidx.loader.loader/classes.jar" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>
@@ -1,10 +0,0 @@
<component name="libraryTable">
<library name="androidx.localbroadcastmanager.localbroadcastmanager">
<CLASSES>
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/androidx.localbroadcastmanager.localbroadcastmanager/classes.jar" />
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/androidx.localbroadcastmanager.localbroadcastmanager/res" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>
@@ -1,10 +0,0 @@
<component name="libraryTable">
<library name="androidx.navigation.navigation-common">
<CLASSES>
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/androidx.navigation.navigation-common/classes.jar" />
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/androidx.navigation.navigation-common/res" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>
@@ -1,10 +0,0 @@
<component name="libraryTable">
<library name="androidx.navigation.navigation-fragment">
<CLASSES>
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/androidx.navigation.navigation-fragment/classes.jar" />
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/androidx.navigation.navigation-fragment/res" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>
@@ -1,10 +0,0 @@
<component name="libraryTable">
<library name="androidx.navigation.navigation-runtime">
<CLASSES>
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/androidx.navigation.navigation-runtime/classes.jar" />
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/androidx.navigation.navigation-runtime/res" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>
@@ -1,10 +0,0 @@
<component name="libraryTable">
<library name="androidx.navigation.navigation-ui">
<CLASSES>
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/androidx.navigation.navigation-ui/classes.jar" />
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/androidx.navigation.navigation-ui/res" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>
@@ -1,9 +0,0 @@
<component name="libraryTable">
<library name="androidx.print.print">
<CLASSES>
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/androidx.print.print/classes.jar" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>
@@ -1,10 +0,0 @@
<component name="libraryTable">
<library name="androidx.profileinstaller.profileinstaller">
<CLASSES>
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/androidx.profileinstaller.profileinstaller/classes.jar" />
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/androidx.profileinstaller.profileinstaller/res" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>
@@ -1,10 +0,0 @@
<component name="libraryTable">
<library name="androidx.recyclerview.recyclerview">
<CLASSES>
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/androidx.recyclerview.recyclerview/classes.jar" />
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/androidx.recyclerview.recyclerview/res" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>
@@ -1,9 +0,0 @@
<component name="libraryTable">
<library name="androidx.resourceinspection.resourceinspection-annotation">
<CLASSES>
<root url="jar://$PROJECT_DIR$/../../../../../Nuget/xamarin.androidx.resourceinspection.annotation/1.0.1.7/jar/androidx.resourceinspection.resourceinspection-annotation.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>
@@ -1,10 +0,0 @@
<component name="libraryTable">
<library name="androidx.savedstate.savedstate">
<CLASSES>
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/androidx.savedstate.savedstate/classes.jar" />
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/androidx.savedstate.savedstate/res" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>
@@ -1,10 +0,0 @@
<component name="libraryTable">
<library name="androidx.savedstate.savedstate-ktx">
<CLASSES>
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/androidx.savedstate.savedstate-ktx/classes.jar" />
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/androidx.savedstate.savedstate-ktx/res" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>
@@ -1,10 +0,0 @@
<component name="libraryTable">
<library name="androidx.security.security-crypto">
<CLASSES>
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/androidx.security.security-crypto/classes.jar" />
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/androidx.security.security-crypto/res" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>
@@ -1,10 +0,0 @@
<component name="libraryTable">
<library name="androidx.slidingpanelayout.slidingpanelayout">
<CLASSES>
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/androidx.slidingpanelayout.slidingpanelayout/classes.jar" />
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/androidx.slidingpanelayout.slidingpanelayout/res" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>
@@ -1,10 +0,0 @@
<component name="libraryTable">
<library name="androidx.startup.startup-runtime">
<CLASSES>
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/androidx.startup.startup-runtime/classes.jar" />
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/androidx.startup.startup-runtime/res" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>
@@ -1,10 +0,0 @@
<component name="libraryTable">
<library name="androidx.swiperefreshlayout.swiperefreshlayout">
<CLASSES>
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/androidx.swiperefreshlayout.swiperefreshlayout/classes.jar" />
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/androidx.swiperefreshlayout.swiperefreshlayout/res" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>
@@ -1,10 +0,0 @@
<component name="libraryTable">
<library name="androidx.tracing.tracing">
<CLASSES>
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/androidx.tracing.tracing/classes.jar" />
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/androidx.tracing.tracing/res" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>
@@ -1,10 +0,0 @@
<component name="libraryTable">
<library name="androidx.transition.transition">
<CLASSES>
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/androidx.transition.transition/classes.jar" />
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/androidx.transition.transition/res" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>
@@ -1,9 +0,0 @@
<component name="libraryTable">
<library name="androidx.vectordrawable.vectordrawable">
<CLASSES>
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/androidx.vectordrawable.vectordrawable/classes.jar" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>
@@ -1,9 +0,0 @@
<component name="libraryTable">
<library name="androidx.vectordrawable.vectordrawable-animated">
<CLASSES>
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/androidx.vectordrawable.vectordrawable-animated/classes.jar" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>
@@ -1,9 +0,0 @@
<component name="libraryTable">
<library name="androidx.versionedparcelable.versionedparcelable">
<CLASSES>
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/androidx.versionedparcelable.versionedparcelable/classes.jar" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>
@@ -1,10 +0,0 @@
<component name="libraryTable">
<library name="androidx.viewpager2.viewpager2">
<CLASSES>
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/androidx.viewpager2.viewpager2/classes.jar" />
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/androidx.viewpager2.viewpager2/res" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>
@@ -1,9 +0,0 @@
<component name="libraryTable">
<library name="androidx.viewpager.viewpager">
<CLASSES>
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/androidx.viewpager.viewpager/classes.jar" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>
@@ -1,10 +0,0 @@
<component name="libraryTable">
<library name="androidx.window.extensions.core.core">
<CLASSES>
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/androidx.window.extensions.core.core/classes.jar" />
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/androidx.window.extensions.core.core/res" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>
@@ -1,10 +0,0 @@
<component name="libraryTable">
<library name="androidx.window.window">
<CLASSES>
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/androidx.window.window/classes.jar" />
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/androidx.window.window/res" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>
-9
View File
@@ -1,9 +0,0 @@
<component name="libraryTable">
<library name="annotations">
<CLASSES>
<root url="jar://$PROJECT_DIR$/../../../../../Nuget/xamarin.android.glide.annotations/4.15.1.2/jar/annotations.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>
@@ -1,10 +0,0 @@
<component name="libraryTable">
<library name="com.google.android.material.material">
<CLASSES>
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/com.google.android.material.material/classes.jar" />
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/com.google.android.material.material/res" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>
-9
View File
@@ -1,9 +0,0 @@
<component name="libraryTable">
<library name="disklrucache">
<CLASSES>
<root url="jar://$PROJECT_DIR$/../../../../../Nuget/xamarin.android.glide.disklrucache/4.15.1.2/jar/disklrucache.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>
-9
View File
@@ -1,9 +0,0 @@
<component name="libraryTable">
<library name="gifdecoder">
<CLASSES>
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/gifdecoder/classes.jar" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>
-10
View File
@@ -1,10 +0,0 @@
<component name="libraryTable">
<library name="glide">
<CLASSES>
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/glide/classes.jar" />
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/glide/res" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>
@@ -1,9 +0,0 @@
<component name="libraryTable">
<library name="guava-listenablefuture">
<CLASSES>
<root url="jar://$PROJECT_DIR$/../../../../../Nuget/xamarin.google.guava.listenablefuture/1.0.0.14/jar/guava-listenablefuture.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>
-10
View File
@@ -1,10 +0,0 @@
<component name="libraryTable">
<library name="maui">
<CLASSES>
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/maui/classes.jar" />
<root url="file://$USER_HOME$/AppData/Local/Temp/JetBrains/xamarinAarPackages/maui/res" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>
@@ -1,9 +0,0 @@
<component name="libraryTable">
<library name="org.jetbrains.annotations-24.0.1">
<CLASSES>
<root url="jar://$PROJECT_DIR$/../../../../../Nuget/xamarin.jetbrains.annotations/24.0.1.3/jar/org.jetbrains.annotations-24.0.1.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>
@@ -1,9 +0,0 @@
<component name="libraryTable">
<library name="org.jetbrains.kotlin.kotlin-stdlib-1.9.0">
<CLASSES>
<root url="jar://$PROJECT_DIR$/../../../../../Nuget/xamarin.kotlin.stdlib/1.9.0.1/jar/org.jetbrains.kotlin.kotlin-stdlib-1.9.0.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>
@@ -1,9 +0,0 @@
<component name="libraryTable">
<library name="org.jetbrains.kotlin.kotlin-stdlib-common-1.9.0">
<CLASSES>
<root url="jar://$PROJECT_DIR$/../../../../../Nuget/xamarin.kotlin.stdlib.common/1.9.0.1/jar/org.jetbrains.kotlin.kotlin-stdlib-common-1.9.0.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>
@@ -1,9 +0,0 @@
<component name="libraryTable">
<library name="org.jetbrains.kotlin.kotlin-stdlib-jdk7-1.9.0">
<CLASSES>
<root url="jar://$PROJECT_DIR$/../../../../../Nuget/xamarin.kotlin.stdlib.jdk7/1.9.0.1/jar/org.jetbrains.kotlin.kotlin-stdlib-jdk7-1.9.0.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>
@@ -1,9 +0,0 @@
<component name="libraryTable">
<library name="org.jetbrains.kotlin.kotlin-stdlib-jdk8-1.9.0">
<CLASSES>
<root url="jar://$PROJECT_DIR$/../../../../../Nuget/xamarin.kotlin.stdlib.jdk8/1.9.0.1/jar/org.jetbrains.kotlin.kotlin-stdlib-jdk8-1.9.0.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>
@@ -1,9 +0,0 @@
<component name="libraryTable">
<library name="org.jetbrains.kotlinx.kotlinx-coroutines-android-1.7.2">
<CLASSES>
<root url="jar://$PROJECT_DIR$/../../../../../Nuget/xamarin.kotlinx.coroutines.android/1.7.2.1/jar/org.jetbrains.kotlinx.kotlinx-coroutines-android-1.7.2.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>
@@ -1,9 +0,0 @@
<component name="libraryTable">
<library name="org.jetbrains.kotlinx.kotlinx-coroutines-core-jvm-1.7.2">
<CLASSES>
<root url="jar://$PROJECT_DIR$/../../../../../Nuget/xamarin.kotlinx.coroutines.core.jvm/1.7.2.1/jar/org.jetbrains.kotlinx.kotlinx-coroutines-core-jvm-1.7.2.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>
-6
View File
@@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="RiderProjectSettingsUpdater">
<option name="vcsConfiguration" value="3" />
</component>
</project>
-6
View File
@@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>
-282
View File
@@ -1,282 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="AutoGeneratedRunConfigurationManager">
<projectFile kind="Uwp">MyWorkout.Maui/MyWorkout.Maui.csproj</projectFile>
<projectFile kind="XamarinAndroid">MyWorkout.Maui/MyWorkout.Maui.csproj</projectFile>
<projectFile kind="XamarinIOS">MyWorkout.Maui/MyWorkout.Maui.csproj</projectFile>
<projectFile kind="XamarinMacOS">MyWorkout.Maui/MyWorkout.Maui.csproj</projectFile>
<projectFile profileName="IIS Express">MyWorkout.Web/MyWorkout.Web.csproj</projectFile>
<projectFile profileName="http">MyWorkout.Web/MyWorkout.Web.csproj</projectFile>
<projectFile profileName="https">MyWorkout.Web/MyWorkout.Web.csproj</projectFile>
<projectFile kind="Uwp">MyWorkout/MyWorkout.csproj</projectFile>
<projectFile kind="XamarinAndroid">MyWorkout/MyWorkout.csproj</projectFile>
<projectFile kind="XamarinIOS">MyWorkout/MyWorkout.csproj</projectFile>
<projectFile kind="XamarinMacOS">MyWorkout/MyWorkout.csproj</projectFile>
</component>
<component name="AutoImportSettings">
<option name="autoReloadType" value="SELECTIVE" />
</component>
<component name="ChangeListManager">
<list default="true" id="edced0ab-e6dd-42cc-8a68-495114c2cdc7" name="Changes" comment="" />
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
<option name="LAST_RESOLUTION" value="IGNORE" />
</component>
<component name="DpaMonitoringSettings">
<option name="autoShow" value="false" />
</component>
<component name="FileTemplateManagerImpl">
<option name="RECENT_TEMPLATES">
<list>
<option value="CSS File" />
</list>
</option>
</component>
<component name="Git.Settings">
<option name="RECENT_BRANCH_BY_REPOSITORY">
<map>
<entry key="$PROJECT_DIR$" value="master" />
</map>
</option>
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
</component>
<component name="GitHubPullRequestSearchHistory">{
&quot;lastFilter&quot;: {
&quot;state&quot;: &quot;OPEN&quot;,
&quot;assignee&quot;: &quot;Gius95&quot;
}
}</component>
<component name="GithubPullRequestsUISettings">{
&quot;selectedUrlAndAccountId&quot;: {
&quot;url&quot;: &quot;https://github.com/Gius95/MyWorkout.git&quot;,
&quot;accountId&quot;: &quot;a185c658-6c2a-4400-a130-bcdc4388f65f&quot;
}
}</component>
<component name="HighlightingSettingsPerFile">
<setting file="file://$PROJECT_DIR$/../../../../Nuget/microsoft.windowsappsdk/1.5.240607001/include/WindowsAppSDK-VersionInfo.cs" root0="SKIP_HIGHLIGHTING" />
<setting file="file://$PROJECT_DIR$/MyWorkout.Shared/wwwroot/css/bootstrap/bootstrap.min.css.map" root0="FORCE_HIGHLIGHTING" />
</component>
<component name="InvalidFacetManager">
<ignored-facets>
<facet id="MyWorkout.Maui/invalid/Android Facet - MyWorkout.Maui" />
<facet id="MyWorkout/invalid/Android Facet - MyWorkout" />
</ignored-facets>
</component>
<component name="MetaFilesCheckinStateConfiguration" checkMetaFiles="true" />
<component name="ProjectColorInfo">{
&quot;associatedIndex&quot;: 4
}</component>
<component name="ProjectId" id="2lNRrHvJ5CNxepUtmnbRs3upDdV" />
<component name="ProjectLevelVcsManager" settingsEditedManually="true">
<ConfirmationsSetting value="2" id="Add" />
</component>
<component name="ProjectViewState">
<option name="hideEmptyMiddlePackages" value="true" />
<option name="showLibraryContents" value="true" />
</component>
<component name="PropertiesComponent"><![CDATA[{
"keyToString": {
".NET Launch Settings Profile.MyWorkout.Web: http.executor": "Run",
"ASKED_SHARE_PROJECT_CONFIGURATION_FILES": "true",
"Android.MyWorkout.Maui.executor": "Run",
"Device#class com.jetbrains.rider.run.multiPlatform.ios.devices.IOSConnectedDeviceKind#com.jetbrains.rider.run.multiPlatform.ios.devices.IOSDevicesProvider#iOS: MyWorkout.Maui": "iPhone di Giuseppe",
"DeviceKind#com.jetbrains.rider.run.multiPlatform.ios.devices.IOSDevicesProvider": "Device",
"RunOnceActivity.ShowReadmeOnStart": "true",
"SHARE_PROJECT_CONFIGURATION_FILES": "true",
"iOS.MyWorkout.Maui.executor": "Run",
"ignore.virus.scanning.warn.message": "true",
"list.type.of.created.stylesheet": "CSS",
"node.js.detected.package.eslint": "true",
"node.js.detected.package.tslint": "true",
"node.js.selected.package.eslint": "(autodetect)",
"node.js.selected.package.tslint": "(autodetect)",
"nodejs_package_manager_path": "npm",
"settings.editor.selected.configurable": "preferences.pluginManager",
"vue.rearranger.settings.migration": "true"
}
}]]></component>
<component name="RunManager" selected="iOS.MyWorkout.Maui">
<configuration name="MyWorkout.Web: IIS Express" type="LaunchSettings" factoryName=".NET Launch Settings Profile">
<option name="LAUNCH_PROFILE_PROJECT_FILE_PATH" value="$PROJECT_DIR$/MyWorkout.Web/MyWorkout.Web.csproj" />
<option name="LAUNCH_PROFILE_TFM" value="net8.0" />
<option name="LAUNCH_PROFILE_NAME" value="IIS Express" />
<option name="USE_EXTERNAL_CONSOLE" value="0" />
<option name="USE_MONO" value="0" />
<option name="RUNTIME_ARGUMENTS" value="" />
<option name="GENERATE_APPLICATIONHOST_CONFIG" value="1" />
<option name="SHOW_IIS_EXPRESS_OUTPUT" value="0" />
<option name="SEND_DEBUG_REQUEST" value="1" />
<option name="ADDITIONAL_IIS_EXPRESS_ARGUMENTS" value="" />
<method v="2">
<option name="Build" />
</method>
</configuration>
<configuration name="MyWorkout.Web: http" type="LaunchSettings" factoryName=".NET Launch Settings Profile">
<option name="LAUNCH_PROFILE_PROJECT_FILE_PATH" value="$PROJECT_DIR$/MyWorkout.Web/MyWorkout.Web.csproj" />
<option name="LAUNCH_PROFILE_TFM" value="net8.0" />
<option name="LAUNCH_PROFILE_NAME" value="http" />
<option name="USE_EXTERNAL_CONSOLE" value="0" />
<option name="USE_MONO" value="0" />
<option name="RUNTIME_ARGUMENTS" value="" />
<option name="GENERATE_APPLICATIONHOST_CONFIG" value="1" />
<option name="SHOW_IIS_EXPRESS_OUTPUT" value="0" />
<option name="SEND_DEBUG_REQUEST" value="1" />
<option name="ADDITIONAL_IIS_EXPRESS_ARGUMENTS" value="" />
<method v="2">
<option name="Build" />
</method>
</configuration>
<configuration name="MyWorkout.Web: https" type="LaunchSettings" factoryName=".NET Launch Settings Profile">
<option name="LAUNCH_PROFILE_PROJECT_FILE_PATH" value="$PROJECT_DIR$/MyWorkout.Web/MyWorkout.Web.csproj" />
<option name="LAUNCH_PROFILE_TFM" value="net8.0" />
<option name="LAUNCH_PROFILE_NAME" value="https" />
<option name="USE_EXTERNAL_CONSOLE" value="0" />
<option name="USE_MONO" value="0" />
<option name="RUNTIME_ARGUMENTS" value="" />
<option name="GENERATE_APPLICATIONHOST_CONFIG" value="1" />
<option name="SHOW_IIS_EXPRESS_OUTPUT" value="0" />
<option name="SEND_DEBUG_REQUEST" value="1" />
<option name="ADDITIONAL_IIS_EXPRESS_ARGUMENTS" value="" />
<method v="2">
<option name="Build" />
</method>
</configuration>
<configuration name="MyWorkout.Maui" type="UwpProject" factoryName="UWP">
<option name="PROJECT_PATH" value="$PROJECT_DIR$/MyWorkout.Maui/MyWorkout.Maui.csproj" />
<option name="PROGRAM_PARAMETERS" value="" />
<method v="2">
<option name="Build" />
</method>
</configuration>
<configuration name="MyWorkout.Maui" type="XamarinAndroidProject" factoryName="Xamarin.Android">
<option name="PROJECT_PATH" value="$PROJECT_DIR$/MyWorkout.Maui/MyWorkout.Maui.csproj" />
<option name="PROGRAM_PARAMETERS" value="" />
<option name="TARGET_SELECTION_MODE" value="SHOW_DIALOG" />
<option name="DEPLOY_BEHAVIOUR_NAME" value="Default" />
<method v="2">
<option name="Build" />
</method>
</configuration>
<configuration name="MyWorkout.Maui" type="XamarinIOSProject" factoryName="Xamarin.iOS">
<option name="PROJECT_PATH" value="$PROJECT_DIR$/MyWorkout.Maui/MyWorkout.Maui.csproj" />
<option name="PROGRAM_PARAMETERS" value="" />
<option name="IS_PASS_PARENT_ENVS" value="false" />
<option name="EXTRA_MLAUNCH_PARAMETERS" value="" />
<method v="2" />
</configuration>
<configuration name="MyWorkout.Maui" type="XamarinMacProject" factoryName="Xamarin.Mac">
<option name="PROJECT_PATH" value="$PROJECT_DIR$/MyWorkout.Maui/MyWorkout.Maui.csproj" />
<option name="PROGRAM_PARAMETERS" value="" />
<option name="WORKING_DIRECTORY" value="" />
<option name="PASS_PARENT_ENVS_MAC" value="1" />
<method v="2">
<option name="Build" />
</method>
</configuration>
</component>
<component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" DefaultDictionary="application-level" UseSingleDictionary="true" transferred="true" />
<component name="TaskManager">
<task active="true" id="Default" summary="Default task">
<changelist id="edced0ab-e6dd-42cc-8a68-495114c2cdc7" name="Changes" comment="" />
<created>1725018744974</created>
<option name="number" value="Default" />
<option name="presentableId" value="Default" />
<updated>1725018744974</updated>
<workItem from="1725018746052" duration="10025000" />
<workItem from="1725364137287" duration="33000" />
<workItem from="1725440486502" duration="14170000" />
<workItem from="1725462815165" duration="310000" />
<workItem from="1725529939719" duration="34000" />
</task>
<task id="LOCAL-00001" summary="Creata nuova soluzione con progetti suddivisi">
<option name="closed" value="true" />
<created>1725022531111</created>
<option name="number" value="00001" />
<option name="presentableId" value="LOCAL-00001" />
<option name="project" value="LOCAL" />
<updated>1725022531111</updated>
</task>
<task id="LOCAL-00002" summary="Creata nuova soluzione con progetti suddivisi">
<option name="closed" value="true" />
<created>1725022706736</created>
<option name="number" value="00002" />
<option name="presentableId" value="LOCAL-00002" />
<option name="project" value="LOCAL" />
<updated>1725022706736</updated>
</task>
<task id="LOCAL-00003" summary="Modifiche NavBar">
<option name="closed" value="true" />
<created>1725035828891</created>
<option name="number" value="00003" />
<option name="presentableId" value="LOCAL-00003" />
<option name="project" value="LOCAL" />
<updated>1725035828891</updated>
</task>
<task id="LOCAL-00004" summary="Applicate modifiche grafiche sulla navbar iniziale di blazor">
<option name="closed" value="true" />
<created>1725440019898</created>
<option name="number" value="00004" />
<option name="presentableId" value="LOCAL-00004" />
<option name="project" value="LOCAL" />
<updated>1725440019898</updated>
</task>
<task id="LOCAL-00005" summary="Integrato RemixIcon e compilata prima versione funzionante su Android">
<option name="closed" value="true" />
<created>1725444162475</created>
<option name="number" value="00005" />
<option name="presentableId" value="LOCAL-00005" />
<option name="project" value="LOCAL" />
<updated>1725444162475</updated>
</task>
<task id="LOCAL-00006" summary="Apportate modifiche a navmenu e provata implementazione immagine">
<option name="closed" value="true" />
<created>1725448379729</created>
<option name="number" value="00006" />
<option name="presentableId" value="LOCAL-00006" />
<option name="project" value="LOCAL" />
<updated>1725448379729</updated>
</task>
<task id="LOCAL-00007" summary="Implementati background per NoData di Workbook e LogBook">
<option name="closed" value="true" />
<created>1725461048413</created>
<option name="number" value="00007" />
<option name="presentableId" value="LOCAL-00007" />
<option name="project" value="LOCAL" />
<updated>1725461048413</updated>
</task>
<option name="localTasksCounter" value="8" />
<servers />
</component>
<component name="TypeScriptGeneratedFilesManager">
<option name="version" value="3" />
</component>
<component name="UnityCheckinConfiguration" checkUnsavedScenes="true" />
<component name="UnityProjectConfiguration" hasMinimizedUI="false" />
<component name="Vcs.Log.Tabs.Properties">
<option name="TAB_STATES">
<map>
<entry key="MAIN">
<value>
<State />
</value>
</entry>
</map>
</option>
</component>
<component name="VcsManagerConfiguration">
<option name="LOCAL_CHANGES_DETAILS_PREVIEW_SHOWN" value="false" />
<option name="CLEAR_INITIAL_COMMIT_MESSAGE" value="true" />
<MESSAGE value="Creata nuova soluzione con progetti suddivisi" />
<MESSAGE value="Modifiche NavBar" />
<MESSAGE value="Applicate modifiche grafiche sulla navbar iniziale di blazor" />
<MESSAGE value="Integrato RemixIcon e compilata prima versione funzionante su Android" />
<MESSAGE value="Apportate modifiche a navmenu e provata implementazione immagine" />
<MESSAGE value="Implementati background per NoData di Workbook e LogBook" />
<option name="LAST_COMMIT_MESSAGE" value="Implementati background per NoData di Workbook e LogBook" />
</component>
<component name="XSLT-Support.FileAssociations.UIState">
<expand />
<select />
</component>
</project>
+14
View File
@@ -0,0 +1,14 @@
{
"detector": {
"ignoreRules": [],
"ignoreFiles": [],
"ignoreValues": [
{
"rule": "overused-font",
"value": "inter",
"reason": "Scelta esplicita dell'utente: STILE_UI.md prescrive Inter per uniformare le app Integry; il register product della skill ammette Inter per le UI di prodotto",
"createdAt": "2026-09-17T08:51:01.079Z"
}
]
}
}
@@ -0,0 +1,98 @@
---
target: IspezionePage
total_score: 18
p0_count: 1
p1_count: 3
timestamp: 2026-07-08T13-15-08Z
slug: steup-shared-components-pages-ispezionepage-razor
---
# Critique: IspezionePage
Method: dual-agent (A: design-review · B: detector+evidence). Browser visualization SKIPPED (MAUI Blazor Hybrid / WASM requires app build + auth + runtime state; no static HTML or dev server to inject into).
## Design Health Score
| # | Heuristic | Score | Key Issue |
|---|-----------|-------|-----------|
| 1 | Visibility of System Status | 1 | SchedaCard never shows local-only vs already-sent (`ActivityId`); "offline è la verità" is invisible on its central screen |
| 2 | Match System / Real World | 3 | Clean Italian, correct `sched{a/e}` pluralization; but online "+" is icon-only, unlabelled |
| 3 | User Control and Freedom | 1 | ExportReparto and Completa push to server irreversibly, no undo; export has no confirm |
| 4 | Consistency and Standards | 1 | MudBlazor default color rainbow (Warning/Success/Info/Error) violates single-accent; MudFab is both tiny icon and wide labelled button |
| 5 | Error Prevention | 2 | Completa & Delete confirmed; Export has no confirm and no double-tap guard |
| 6 | Recognition Rather Than Recall | 2 | No per-scheda sync badge → user must remember which reparti were exported |
| 7 | Flexibility and Efficiency | 2 | Three overlapping sync paths (per-scheda / per-reparto / Completa), unclear which supersedes |
| 8 | Aesthetic and Minimalist Design | 2 | Multi-color FAB clusters + info chips add chroma noise |
| 9 | Error Recovery | 2 | OnError surfaces raw `e.Message` (+ Console.WriteLine) — technical, not field-friendly |
| 10 | Help and Documentation | 2 | No empty state — empty SchedeGrouped renders a blank body |
| **Total** | | **18/40** | **Poor — major UX work before it delivers its promise** |
## Anti-Patterns Verdict
**LLM assessment:** No gradients/glass/eyebrows/side-stripes. The tell is subtler: the screen wears MudBlazor's default demo palette. Actions form a semantic rainbow — Warning(orange)=Add, Success(green)=Export, Info(blue)=Edit, Error(red)=Delete — none overridden in MudTheme (only Primary/Secondary/Tertiary/TextPrimary are set). DESIGN.md's loudest rule (La Regola dell'Unico Accento — coral #ec4c41 as the sole action color) appears nowhere on the action surface. Reads as "component-library defaults, lightly arranged" — the enterprise-Blazor flavor of AI slop.
**Deterministic scan:** detect.mjs clean (exit 0, 0 findings) on IspezionePage.razor and on InspectionCard + SchedaCard. No false positives. The scanner targets HTML/CSS slop patterns; the real defects here are semantic (color roles, state visibility) which it structurally cannot see — so the LLM review carries this critique.
**Visual overlays:** none — browser visualization not applicable to this target.
## Overall Impression
The bones are good — reparto grouping with live counts, restrained rounded surfaces, honest completion-confirm copy — but the screen fails at the one thing the product exists for: making sync/offline state unambiguous. A rilevatore cannot glance at this screen and know what is still trapped on the phone. On top of that, the signature coral accent is absent from every action, replaced by library-default colors. Biggest single opportunity: make per-scheda sync state visible and route all actions through the single coral accent.
## What's Working
1. **Completion-confirm copy** is plain, honest, consequence-first — the "conferme che prevengono l'errore" principle done right.
2. **Reparto grouping with live count chips** + correct Italian pluralization — thoughtful, task-shaped IA.
3. **Restrained surface design** (1em panels, 20px cards, tonal #f5f5f5, flat-by-default) respects the "taccuino da campo" north star.
## Priority Issues
**[P0] Sync state is invisible on SchedaCard / the whole screen** — violates "Offline è la verità" (#1 principle)
- Why: nothing distinguishes a locally-saved scheda from one on the server (`ActivityId`); no reparto "X da inviare" signal. The core product promise breaks exactly where it matters.
- Fix: persistent per-scheda status badge (Locale / Da inviare / Inviato) — coral for needs-action, success green for inviato; reparto-level unsent counter.
- Command: /impeccable clarify
**[P1] Kill the MudBlazor color rainbow; restore the single accent** — violates Regola dell'Unico Accento
- Why: coral never appears on actions; "Add" literally looks like a warning; reads as default slop and destroys the accent's meaning.
- Fix: coral (Primary) for the single primary action per context; demote secondary actions to neutral/text; reserve red strictly for Delete.
- Command: /impeccable colorize
**[P1] Export reparto is irreversible, unconfirmed, and double-tap-able**
- Why: fires on FAB tap with no confirmation; overlay mounts a frame late, so a fast gloved double-tap can re-send the batch → duplicate server activities.
- Fix: confirm dialog matching Completa; disable/guard the FAB the instant it's tapped, not on next render.
- Command: /impeccable harden
**[P1] Primary actions sit in panel headers, not at thumb reach** — violates "Il pollice comanda"
- Why: Add/Export FABs live in TitleContent at the top of a scrolling list; Size.Small FABs ≈40px (under 44px); Delete sits ~1rem from Export.
- Fix: move primary create to bottom-right custom-mudfab; enforce ≥44px; separate Delete from Export (spacing or overflow menu).
- Command: /impeccable layout
**[P2] Opaque blocking wait + no success payoff at completion**
- Why: Completa loop shows a featureless full-screen spinner through save→upload-photos→complete with zero progress; SpinnerOverlay's built-in success-checkmark is never wired here — the emotional peak has no reassurance.
- Fix: step progress ("Invio scheda 3/7 · foto 2/4"); trigger the existing success animation on completion.
- Command: /impeccable animate
**[P3] All panels Expanded="true" + no empty state**
- Why: every reparto expands by default (scroll purgatory for many reparti); an empty inspection renders blank.
- Fix: expand only the first (or none) with counts visible; add empty state ("Nessuna scheda — tocca + per iniziare").
- Command: /impeccable distill
## Persona Red Flags
- **Casey (distracted mobile):** unlabelled orange "+" online; three different sync verbs; nothing shows what's already sent → taps Export twice or completes without exporting.
- **Sam (accessibility):** Size.Small FABs under 44px; meaning by color alone across a Warning/Info/Success/Error rainbow (color-blind users can't tell Add from Delete by hue); `info-subtitle` (gray-default) and `info-inspection-text` (text-secondary) muted gray violate the sun-contrast rule and likely fail AA.
- **Riley (stress tester):** double-tap Export → duplicate records; errors surface as raw exception strings; 40 schede across 8 reparti all expanded → scroll purgatory.
- **Marco the rilevatore (gloved, offline, sunlight):** offline, the Export FAB silently disappears with no "why"; the Add FAB stays enabled here yet the same action is Disabled in NavMenu (contradictory); in bright sun he cannot tell which schede are still trapped on the device — the exact fear the app exists to remove.
## Minor Observations
- InspectionCard runs an artificial `await Task.Delay(250)` before showing store data — a deliberate stall on a screen whose principle is "feedback immediato".
- scheda action cluster is center-justified — harder to acquire one-handed than edge-anchored.
- OnError keeps a `Console.WriteLine(e.Message)` beside the logger — dev residue.
- Photo/QR chips in SchedaCard add visual weight but aren't tappable.
## Questions to Consider
- If a rilevatore can't glance at this screen and instantly know what's still only on the phone, does the app deliver its single promise?
- Why do three separate "send" affordances exist (per-scheda, per-reparto, complete)? Could one honest sync model with clear per-item state replace all three?
- The success-checkmark animation was built but never wired here — cut or forgotten? Which is worse?
- If coral is "the color of action" but every action button is orange/green/blue, what is coral the color of on this screen?
@@ -0,0 +1,89 @@
---
target: IspezionePage
total_score: 34
p0_count: 0
p1_count: 1
timestamp: 2026-07-08T13-44-46Z
slug: steup-shared-components-pages-ispezionepage-razor
---
# Critique: IspezionePage (re-run post-fix)
Method: dual-agent (A: design-review · B: detector+evidence). Browser visualization SKIPPED (MAUI Blazor Hybrid / WASM requires app build + auth + runtime state).
## Design Health Score
| # | Heuristic | Score | Key Issue |
|---|-----------|-------|-----------|
| 1 | Visibility of System Status | 4 | Per-scheda sync badge + reparto "da inviare" counter + granular completion progress + success checkmark |
| 2 | Match System / Real World | 3 | Italian & readable, but status shown ALL-CAPS and scheda title is a raw ActivityTypeId code |
| 3 | User Control and Freedom | 3 | Confirmations everywhere; no abort during long upload (sends irreversible by nature) |
| 4 | Consistency and Standards | 3 | coral=send now consistent; undermined by off-palette amber status chip |
| 5 | Error Prevention | 4 | Export confirms + double-tap guards; completion confirmed + _isBusy guard |
| 6 | Recognition Rather Than Recall | 4 | Grouped by reparto, counters, icons, labels |
| 7 | Flexibility and Efficiency | 3 | Three send paths (scheda/reparto/concludi) powerful but diffuse |
| 8 | Aesthetic and Minimalist | 3 | Clean; one expanded panel still stacks several action types |
| 9 | Error Recovery | 4 | OnError copy reassuring, tech detail to logs |
| 10 | Help and Documentation | 3 | Good empty-state; no hint why send buttons vanish offline |
| **Total** | | **34/40** | **Strong / ship-worthy with targeted fixes** |
## Anti-Patterns Verdict
**LLM assessment:** Largely free of AI slop; reads as a genuine field tool. Single-Accent Rule now respected on the action surface — coral is consistently "the send action" (per-scheda Invia, panel Esporta reparto, "da inviare" counter), neutral gray for non-send actions, red reserved for delete. SchedaSyncHelper encodes coral=azione-richiesta / green=fatto. No gradients/glass/side-stripes/identical-grid. One genuine rainbow leak remains: StatusEnumHelper.GetColor() paints the InspectionCard status chip Color.Warning (amber) for InCorso/Verifica — amber is not in the SteUP palette and competes with coral. Status labels are ALL-CAPS (violates Regola del Peso, non del Maiuscolo).
**Deterministic scan:** detect.mjs clean (exit 0) on IspezionePage.razor, SchedaCard.razor, SpinnerOverlay.razor. CSS scan: 3 advisory design-system-radius findings, all in SpinnerOverlay.razor.css (border-radius 100px/2px) — all confirmed false positives (icon geometry of the animated success-checkmark: arc masks + rounded line caps), not surface radii.
**Visual overlays:** none — browser visualization not applicable to this target.
## Overall Impression
Big jump from the first pass (18→34). The screen now delivers its core promise: sync state is unambiguous per-scheda and per-reparto, the completion moment is reassuring (real progress + success checkmark), destructive/irreversible sends are confirmed and double-tap-guarded, and the single coral accent finally means "send." The remaining issues are a real data-integrity bug in the completion loop and a few palette/copy nits — no longer structural.
## What's Working
1. SchedaSyncHelper sync-state system — per-scheda coral "Da inviare" / green "Inviato" badges (icon+text, not color-only) + reparto CountDaInviare() counter. The Offline-è-la-verità principle made concrete.
2. Completion progress + confirmation choreography — SetProgress messages, success checkmark with 1.8s dwell, irreversibility confirm guarded by _isBusy.
3. Guarded, reassuring exports — ExportReparto confirms, guards double-tap, keeps work local on failure with human copy, logs the stack trace.
## Priority Issues (remaining)
**[P1] Silent scheda skip on completion still shows success**
- What: In HandleCompleteInspection, `if (apiResponse == null) continue;` skips a scheda that failed to save, yet the loop still calls CompleteInspection, sets Completata, and shows "Ispezione inviata".
- Why: The inspection becomes non-editable while one or more schede never reached the server — exactly the data loss PRODUCT.md exists to prevent.
- Fix: track failed schede; if any failed, do NOT complete — surface "N schede non inviate, riprova" and keep them "Da inviare". Complete only when all succeed.
- Command: /impeccable harden
**[P2] Off-palette amber status chip**
- What: StatusEnumHelper.GetColor() returns Color.Warning (amber) for InCorso/Verifica (InspectionCard status chip).
- Why: Amber isn't in the DESIGN.md palette; a second attention color dilutes coral (Regola dell'Unico Accento).
- Fix: map InCorso/Verifica to Color.Default (neutral) or navy Secondary; keep green Completata, red Annullata.
- Command: /impeccable colorize
**[P3] ALL-CAPS status labels**
- What: ConvertToHumanReadable returns "IN CORSO", "COMPLETATA".
- Why: Violates Regola del Peso, non del Maiuscolo.
- Fix: sentence case ("In corso", "Completata"); rely on the chip's 700 weight.
**[P3] Scheda title is a raw code**
- What: `<b>@Scheda.ActivityTypeId</b>` as the card headline.
- Why: forces decoding an internal identifier in the field.
- Fix: show a human descrizione, fall back to the code only if none.
## Minor Observations
- OnSchedaModified uses `if (index > 0)` — skips index 0, so modifying the FIRST scheda in SchedeList won't replace it in-list (likely a `>= 0` bug). Pre-existing; now also on the post-export refresh path.
- Sync model collapsed to two states (DaInviare/Inviato) vs the three-state brief (Locale/Da inviare/Inviato) — acceptable, but "local draft" vs "ready to send" no longer distinguished.
- InspectionCard still has an artificial `await Task.Delay(250)` skeleton delay — fights "feedback immediato".
- InspectionCard address (info-subtitle, gray-darker, weight 600) is still gray, not ink — mild sun-legibility compromise (verify AA); verify amber-on-white too.
- Offline, all send buttons disappear with no "torna online per inviare" hint — badges show "da inviare" but no next step.
## Persona Red Flags (delta)
- Casey (mobile): RESOLVED — FABs Size.Medium (≥44px), flex-wrap. Remaining: per-reparto actions sit in panel TitleContent (top of expanded panel), drifting from the thumb zone on long lists.
- Sam (accessibility): RESOLVED — aria-labels on FABs; sync state icon+text not color-only. Remaining: ALL-CAPS status; verify amber-on-white and gray-darker address hit AA.
- Marco (gloved/offline/sun): RESOLVED — sync visibility + reparto counter answer "what hasn't gone yet." Remaining: offline the send buttons vanish with no explanation; address text still gray not ink.
## Questions to Consider
- If completion continues past a failed scheda and still locks the inspection, how does Marco discover which scheda didn't make it once editing is disabled?
- Should the total "da inviare" roll up onto the InspectionCard header, visible before expanding any reparto?
- Three send paths (per-scheda, per-reparto, global concludi) — does that dilute the single primary task? Could per-reparto export be the one canonical action?
+112
View File
@@ -0,0 +1,112 @@
{
"schemaVersion": 2,
"generatedAt": "2026-07-08T00:00:00.000Z",
"title": "Design System: SteUP",
"extensions": {
"colorMeta": {
"primary": { "role": "primary", "displayName": "Arancio-Rosso Allerta", "canonical": "#ec4c41", "tonalRamp": ["#3a0f0b", "#5e1712", "#8a2019", "#b62f24", "#ec4c41", "#f27a72", "#f7a9a3", "#fcdcd9"] },
"secondary": { "role": "secondary", "displayName": "Blu Profondo", "canonical": "#002339", "tonalRamp": ["#000c14", "#001622", "#002339", "#003653", "#0a5480", "#3f7ea8", "#87b3d0", "#d5e6f1"] },
"tertiary": { "role": "tertiary", "displayName": "Azzurro Tenue", "canonical": "#dff2ff", "tonalRamp": ["#12313f", "#1c5570", "#2b7ba3", "#4aa4d1", "#86c8e8", "#b3ddf3", "#dff2ff", "#f2faff"] },
"ink": { "role": "neutral", "displayName": "Inchiostro", "canonical": "#000000", "tonalRamp": ["#000000", "#1a1a1a", "#333333", "#4d4d4d", "#737373", "#999999", "#cccccc", "#f5f5f5"] },
"paper": { "role": "neutral", "displayName": "Carta", "canonical": "#ffffff", "tonalRamp": ["#c2c2c2", "#d1d1d1", "#e0e0e0", "#ededed", "#f5f5f5", "#fafafa", "#ffffff", "#ffffff"] },
"success": { "role": "semantic", "displayName": "Verde OK", "canonical": "#26b050", "tonalRamp": ["#0a3318", "#125025", "#1a7d38", "#26b050", "#4fca72", "#84dc9d", "#b7ecc6", "#e6f9ec"] },
"error": { "role": "semantic", "displayName": "Rosso Errore", "canonical": "#e50000", "tonalRamp": ["#3a0000", "#5e0000", "#8a0000", "#b60000", "#e50000", "#f24d4d", "#f79999", "#fcdcdc"] },
"focus-ring": { "role": "semantic", "displayName": "Blu Focus", "canonical": "#258cfb", "tonalRamp": ["#08213f", "#0c3a70", "#1257b6", "#258cfb", "#5aa9fc", "#8fc4fd", "#c4e0fe", "#eaf4ff"] }
},
"typographyMeta": {
"page-title": { "displayName": "Page Title", "purpose": "Titolo di schermata; ancora l'utente al compito corrente." },
"title": { "displayName": "Title", "purpose": "Intestazioni di sezione, titoli di dialog e message-box." },
"body": { "displayName": "Body", "purpose": "Testo corrente e dati; prosa a 65-75ch." },
"label": { "displayName": "Label", "purpose": "Etichette di pulsanti e controlli di form; peso 700 per presenza al tocco." }
},
"shadows": [
{ "name": "ombra-custom", "value": "1px 2px 5px hsl(from var(--mud-palette-overlay-dark) h s 40%)", "purpose": "Stacco morbido per card ed elementi che galleggiano sul contenuto." },
{ "name": "ombra-eccezione", "value": "1px 2px 5px rgba(0,0,0,0.3)", "purpose": "Rilievo leggermente più marcato per box di errore/eccezione." }
],
"motion": [
{ "name": "connection-slide", "value": "all 0.5s ease", "purpose": "Comparsa/scomparsa della barra di stato connessione (translateY)." },
{ "name": "ripple", "value": "ripple-effect 0.6s linear", "purpose": "Feedback fisico al tocco su pulsanti e contenitori tattili." },
{ "name": "spinner", "value": "l24 1s infinite linear", "purpose": "Loader di caricamento a doppio anello." }
],
"breakpoints": [
{ "name": "mobile", "value": "0px" }
]
},
"components": [
{
"name": "Primary Button",
"kind": "button",
"refersTo": "button-primary",
"description": "Azione primaria: fondo accento, etichetta bianca in grassetto, angoli molto arrotondati.",
"html": "<button class=\"ds-btn-primary\">Salva</button>",
"css": ".ds-btn-primary { font-family: Nunito, sans-serif; background: #ec4c41; color: #fff; font-weight: 700; font-size: 0.9375rem; border: none; border-radius: 20px; padding: 0.65rem 1.5rem; min-height: 44px; cursor: pointer; transition: filter 0.15s ease, transform 0.1s ease; } .ds-btn-primary:hover { filter: brightness(1.05); } .ds-btn-primary:focus-visible { outline: none; box-shadow: 0 0 0 0.1rem #fff, 0 0 0 0.25rem #258cfb; } .ds-btn-primary:active { transform: translateY(1px); filter: brightness(0.95); }"
},
{
"name": "FAB (Floating Action)",
"kind": "button",
"refersTo": "button-primary",
"description": "Azione primaria fissa in basso a destra, a portata di pollice; rispetta la safe-area.",
"html": "<button class=\"ds-fab\" aria-label=\"Nuova scheda\"><svg viewBox=\"0 0 24 24\" width=\"24\" height=\"24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\"><path d=\"M12 5v14M5 12h14\"/></svg></button>",
"css": ".ds-fab { font-family: Nunito, sans-serif; position: fixed; bottom: 4rem; right: 16px; width: 56px; height: 56px; border-radius: 50%; border: none; background: #ec4c41; color: #fff; display: inline-flex; align-items: center; justify-content: center; box-shadow: 1px 2px 5px rgba(0,0,0,0.3); cursor: pointer; transition: filter 0.15s ease, transform 0.1s ease; } .ds-fab:hover { filter: brightness(1.05); } .ds-fab:active { transform: translateY(1px); } .ds-fab:focus-visible { outline: none; box-shadow: 0 0 0 0.1rem #fff, 0 0 0 0.25rem #258cfb; }"
},
{
"name": "Input Card",
"kind": "input",
"refersTo": "input-card",
"description": "Campo a scheda su fondo grigio tonale, senza underline; etichetta a sinistra, valore a destra.",
"html": "<label class=\"ds-input-card\"><span class=\"ds-input-label\">Quantità</span><input class=\"ds-input-field\" type=\"text\" inputmode=\"numeric\" value=\"12\" /></label>",
"css": ".ds-input-card { font-family: Nunito, sans-serif; display: flex; align-items: center; justify-content: space-between; gap: 0.5rem; width: 100%; background: #f5f5f5; border-radius: 9px; padding: 0.5rem 1rem; min-height: 44px; } .ds-input-label { font-weight: 700; color: #000; } .ds-input-field { font-family: Nunito, sans-serif; font-weight: 500; text-align: right; border: none; background: transparent; color: #000; outline: none; min-width: 0; } .ds-input-field:focus { outline: none; }"
},
{
"name": "Connection Status Bar",
"kind": "custom",
"refersTo": null,
"description": "Striscia di stato rete/servizio che scorre dall'alto: verde se OK, rosso se KO. Incarna 'Offline è la verità'.",
"html": "<div class=\"ds-connection ds-connection--ko\">Nessuna connessione — lavoro salvato in locale</div>",
"css": ".ds-connection { font-family: Nunito, sans-serif; display: flex; align-items: center; gap: 1rem; min-height: 35px; padding: 0 0.75rem; font-weight: 700; font-size: 1.05rem; color: #fff; transition: all 0.5s ease; } .ds-connection--ko { background: #e50000; } .ds-connection--ok { background: #26b050; }"
},
{
"name": "Panel / Card",
"kind": "card",
"refersTo": "panel",
"description": "Superficie di contenuto: carta bianca, angoli 1em, piatta di default, ombra solo se galleggia.",
"html": "<div class=\"ds-panel\"><h3 class=\"ds-panel-title\">Scheda articolo</h3><p class=\"ds-panel-body\">Dettagli della rilevazione.</p></div>",
"css": ".ds-panel { font-family: Nunito, sans-serif; background: #fff; color: #000; border-radius: 1em; padding: 1rem; } .ds-panel-title { font-weight: 700; font-size: 1.1rem; margin: 0 0 0.5rem; } .ds-panel-body { font-weight: 400; font-size: 0.875rem; line-height: 1.8; margin: 0; }"
}
],
"narrative": {
"northStar": "Il taccuino da campo",
"overview": "SteUP è lo strumento che il rilevatore tiene in mano mentre gira i punti vendita: deve funzionare come carta e inchiostro — sempre, anche senza rete, leggibile in pieno sole, comprensibile con un'occhiata. La chiarezza viene prima di qualsiasi ornamento. Il sistema è tattile e sicuro: bersagli ampi per il pollice, una sola mano e i guanti; feedback fisico immediato a ogni tocco e scansione. Lo stato — salvato in locale, in attesa di sync, inviato, completato — non è mai ambiguo. Rifiuta il gestionale datato e denso e l'app consumer social/giocosa: è uno strumento professionale.",
"keyCharacteristics": [
"Offline-first: lo stato di salvataggio e sincronizzazione è sempre esplicito",
"Mobile-first, uso a una mano/guanti: tocchi ≥44px, azioni a portata di pollice",
"Alto contrasto e testo generoso per la leggibilità all'aperto",
"Un solo accento (Arancio-Rosso Allerta), usato per azione e stato, mai per decorazione",
"Un'unica famiglia tipografica, angoli arrotondati coerenti (9px → 20px → 1em)"
],
"rules": [
{ "name": "La Regola dell'Unico Accento", "body": "L'Arancio-Rosso Allerta è l'unico accento del sistema e appare solo su azione o stato attivo, mai come decorazione. La sua rarità è ciò che lo rende un segnale.", "section": "colors" },
{ "name": "La Regola del Contrasto da Sole", "body": "Il testo di corpo è inchiostro (#000) su carta (#fff). Il grigio chiaro 'per eleganza' è vietato sul testo leggibile: si progetta per lo schermo colpito dal sole.", "section": "colors" },
{ "name": "La Regola del Peso, non del Maiuscolo", "body": "L'enfasi si ottiene con il peso (700/800) e la dimensione, non con il maiuscolo spaziato. Niente eyebrow maiuscoli tracciati sopra le sezioni.", "section": "typography" },
{ "name": "La Regola del Piatto-di-Default", "body": "Le superfici sono piatte a riposo. L'ombra compare solo quando un elemento deve galleggiare (overlay, dialog, card sollevata) o rispondere a uno stato.", "section": "elevation" }
],
"dos": [
"Do usare l'Arancio-Rosso Allerta (#ec4c41) solo per azione e stato attivo; mantenerlo raro.",
"Do tenere il testo di corpo in inchiostro (#000) su carta (#fff); alto contrasto per la lettura al sole.",
"Do dimensionare i bersagli di tocco ≥44px e collocare le azioni primarie a portata di pollice (FAB in basso a destra).",
"Do rendere sempre esplicito lo stato offline/sync (barra di connessione, stati di scheda/ispezione).",
"Do dare feedback fisico immediato a ogni tocco e scansione (ripple, cambio di stato).",
"Do usare un'unica famiglia (Nunito) e fare gerarchia con peso e dimensione.",
"Do rispettare le safe-area iOS/Android e prefers-reduced-motion."
],
"donts": [
"Don't costruire un gestionale datato e denso: niente tabelle fittissime, testo minuscolo, grigio ovunque.",
"Don't virare verso un'estetica consumer social/giocosa: niente colore ludico o decorazione fine a sé stessa.",
"Don't usare testo grigio chiaro sul corpo 'per eleganza': causa numero uno di illeggibilità al sole.",
"Don't usare bordo-laterale colorato (border-left/right > 1px) come accento su card, liste o alert.",
"Don't usare testo con gradiente, glassmorphism decorativo, griglie di card tutte identiche, o eyebrow maiuscoli su ogni sezione.",
"Don't introdurre animazioni di scena orchestrate al caricamento: il movimento serve allo stato, non allo spettacolo.",
"Don't reinventare affordance standard (scrollbar strane, controlli di form non convenzionali) per 'carattere'."
]
}
}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 205 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 159 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 105 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 154 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 121 KiB

File diff suppressed because one or more lines are too long
-275
View File
@@ -1,275 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 28.4.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 522.92 500" style="enable-background:new 0 0 522.92 500;" xml:space="preserve">
<style type="text/css">
.st0{clip-path:url(#SVGID_00000023275264634511008070000003220646107616116611_);fill:#F4D160;}
.st1{fill:none;stroke:#FFFFFF;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
.st2{fill:#F4D160;}
.st3{fill:#808183;}
.st4{fill:#A6A8AA;}
.st5{fill:#929496;}
.st6{fill:#4E67AD;}
.st7{fill:#E6E6E7;}
.st8{fill:#FFFFFF;}
.st9{fill:#FFFFFF;stroke:#F4D160;stroke-width:2.1553;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
.st10{opacity:0.5;fill:#F4D160;}
.st11{fill:#FFFFFF;stroke:#F4D160;stroke-width:1.0776;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
.st12{opacity:0.5;}
.st13{fill:#A53A0A;}
.st14{fill:#D5652C;}
.st15{fill:#BBBCBF;}
.st16{font-family:'Rubik-Bold';}
.st17{font-size:20.8057px;}
.st18{fill:#BC3C15;}
.st19{fill:#6D6E70;}
.st20{fill:#D35B30;}
.st21{fill:#C1451F;}
.st22{fill:#434244;}
.st23{fill:#F1F1F2;}
.st24{fill:#D0D1D3;}
.st25{fill:#512D0D;}
.st26{fill:#603B16;}
.st27{opacity:0.35;fill:#603B16;}
.st28{fill:#845225;}
</style>
<g id="Background">
<g>
<defs>
<path id="SVGID_1_" d="M476.16,235.41c26.1,59.8,17.3,111.85-8.43,147.15c-24.28,33.31-51.72,54.89-106.19,60.71
c-55.72,5.95-72.73-19.05-126.95-28.04c-43.3-7.18-78.36,0.75-113.12,20.74c-36.79,21.16-78.39,42.22-97.98,0.42
c-36.89-78.73-19.46-172.14-7.55-211.57c15.21-50.36,42.12-81.55,88.98-113.83c41.3-28.45,60.32-34.92,106.35-51.85
c16.75-6.16,115.93-27.4,145.63,3.7c36.91,38.65-11.01,52.09,23.15,88.36C416.78,190.2,452.49,181.17,476.16,235.41z"/>
</defs>
<clipPath id="SVGID_00000088812324151204080360000018176712255185552313_">
<use xlink:href="#SVGID_1_" style="overflow:visible;"/>
</clipPath>
<rect style="clip-path:url(#SVGID_00000088812324151204080360000018176712255185552313_);fill:#F4D160;" width="522.92" height="500"/>
</g>
</g>
<g id="Design">
<g>
<g>
<path class="st1" d="M152.26,394.1L49.09,413.5c-3.26,0.61-6.39-1.53-7-4.79l-19.4-103.16c-0.61-3.26,1.53-6.39,4.79-7
l103.16-19.4c3.26-0.61,6.39,1.53,7,4.79l19.4,103.16C157.66,390.35,155.51,393.49,152.26,394.1z"/>
<g>
<line class="st1" x1="28.77" y1="309.89" x2="77.83" y2="300.66"/>
<line class="st1" x1="31.16" y1="322.57" x2="80.22" y2="313.35"/>
<line class="st1" x1="33.54" y1="335.25" x2="82.6" y2="326.03"/>
<line class="st1" x1="35.93" y1="347.94" x2="84.99" y2="338.71"/>
<line class="st1" x1="38.31" y1="360.62" x2="87.37" y2="351.4"/>
<line class="st1" x1="40.69" y1="373.31" x2="89.76" y2="364.08"/>
<line class="st1" x1="43.08" y1="385.99" x2="92.14" y2="376.76"/>
<line class="st1" x1="45.46" y1="398.67" x2="94.53" y2="389.45"/>
</g>
</g>
<g>
<path class="st1" d="M383.31,329.59l-86.11-60.04c-2.72-1.89-3.38-5.63-1.49-8.35l60.04-86.11c1.89-2.72,5.63-3.38,8.35-1.49
l86.11,60.04c2.72,1.89,3.38,5.63,1.49,8.35l-60.04,86.11C389.77,330.82,386.03,331.49,383.31,329.59z"/>
<g>
<line class="st1" x1="356.91" y1="182.47" x2="397.86" y2="211.03"/>
<line class="st1" x1="349.53" y1="193.06" x2="390.48" y2="221.61"/>
<line class="st1" x1="342.15" y1="203.65" x2="383.1" y2="232.2"/>
<line class="st1" x1="334.77" y1="214.23" x2="375.72" y2="242.79"/>
<line class="st1" x1="327.39" y1="224.82" x2="368.34" y2="253.37"/>
<line class="st1" x1="320" y1="235.41" x2="360.96" y2="263.96"/>
<line class="st1" x1="312.62" y1="245.99" x2="353.57" y2="274.55"/>
<line class="st1" x1="305.24" y1="256.58" x2="346.19" y2="285.13"/>
</g>
</g>
<ellipse transform="matrix(0.1586 -0.9874 0.9874 0.1586 -5.1546 348.5406)" class="st1" cx="201.91" cy="177.29" rx="64.97" ry="64.97"/>
<g>
<path class="st2" d="M88.19,188.86c0.82-2.05,0.53-3.62-4.15-5.64c-3.81-1.64-5.97-1.19-6.98,0.94c-0.82,0.03-1.6,0.51-1.95,1.32
c-0.3,0.69-0.21,1.45,0.16,2.04c-0.25,0.58-0.54,1.25-0.85,1.98c-1.97-0.38-4.57-0.43-5.45,1.6
c-0.95,2.21-16.29,41.51-14.42,42.31c0,0,15.54-37.63,16.49-38.2c0.25-0.15,0.47,0.14,0.65,0.64
c-4.29,9.98-10.97,25.56-18.07,42.23c-0.76,0.08-1.45,0.55-1.78,1.3c-0.33,0.76-0.19,1.6,0.29,2.21
c-13.97,32.86-28.98,68.71-30.24,73.89c-1.72,7.08-0.81,9.63-0.16,10.52l-0.69,1.59c-0.13,0.31,0.01,0.67,0.32,0.8
c0.31,0.13,0.67-0.01,0.8-0.32l0.69-1.59c1.09-0.13,3.58-1.23,7.55-7.33c2.9-4.46,18.66-39.89,32.99-72.56
c0.88,0.03,1.73-0.46,2.1-1.32c0.37-0.85,0.15-1.8-0.46-2.42c9.78-22.32,18.61-42.73,21.84-50.18c0.8-0.04,1.56-0.52,1.9-1.31
C89.15,190.48,88.89,189.47,88.19,188.86z"/>
<g>
<path class="st3" d="M70.11,184.49c0,0-6.49-2.1-7.77,1.38c-0.83,2.26-13.89,42.37-11.98,43.07c0,0,13.36-38.46,14.28-39.08
c0.92-0.62,1.64,4.98,1.64,4.98L70.11,184.49z"/>
<path d="M22.66,325.66L22.66,325.66c-0.32-0.12-0.48-0.47-0.36-0.78l1.26-3.44c0.12-0.32,0.47-0.48,0.78-0.36l0,0
c0.32,0.12,0.48,0.47,0.36,0.78l-1.26,3.44C23.33,325.61,22.98,325.78,22.66,325.66z"/>
<path class="st4" d="M81.32,182.77c0.81-2.21,0.58-3.81-4.38-5.62c-3.98-1.46-6.13-0.83-6.98,1.47
c-0.07,0.18-0.31,0.24-0.46,0.4c0,0-45.22,123.74-47.05,133.72c-1.83,9.98,0.94,10.92,0.94,10.92s2.73,1.07,7.76-7.74
c5.04-8.81,50.26-132.55,50.26-132.55C81.4,183.16,81.25,182.95,81.32,182.77z"/>
<line class="st1" x1="63.29" y1="203.47" x2="56.77" y2="221.67"/>
<line class="st1" x1="69.23" y1="186.88" x2="67.04" y2="192.98"/>
<path class="st5" d="M81.32,182.77c0.81-2.21,0.58-3.81-4.38-5.62c-2.74-1-4.6-1-5.78-0.16c0.17,0.06,0.32,0.09,0.5,0.16
c4.96,1.81,5.19,3.41,4.38,5.62c-0.07,0.18,0.08,0.39,0.1,0.6c0,0-45.22,123.74-50.26,132.55c-1.46,2.56-2.73,4.28-3.79,5.44
c0.44,2,1.31,2.3,1.31,2.3s2.73,1.07,7.76-7.74c5.04-8.81,50.26-132.55,50.26-132.55C81.4,183.16,81.25,182.95,81.32,182.77z"/>
<path class="st3" d="M59.14,241.47l-9.83-3.59c-1.14-0.42-1.72-1.68-1.31-2.82l0,0c0.42-1.14,1.68-1.73,2.82-1.31l9.83,3.59
c1.14,0.42,1.72,1.68,1.31,2.82v0C61.54,241.3,60.28,241.89,59.14,241.47z"/>
<path class="st3" d="M79.3,186.32l-9.83-3.59c-1.14-0.42-1.72-1.68-1.31-2.82l0,0c0.42-1.14,1.68-1.72,2.82-1.31l9.83,3.59
c1.14,0.42,1.72,1.68,1.31,2.82l0,0C81.7,186.15,80.44,186.74,79.3,186.32z"/>
</g>
</g>
<g>
<path class="st2" d="M92.64,244.48l-1.36,3.21c-0.89,2.11-0.82,4.52,0.2,6.56c8.1,16.25,44.33,90.68,55.15,143.31
c1.02,4.95,6.37,7.54,10.76,5.23c16.78-8.83,56.12-26.58,108.76-31.33c1.32-0.12,2.59-0.58,3.67-1.37
c9.76-7.06,61.57-43.35,105-50.83c4.51-0.78,7.33-5.45,5.94-9.92l-43.3-140.23c-1.26-4.07-5.5-6.31-9.46-5.01l-230.78,76.1
C95.17,240.89,93.5,242.45,92.64,244.48z"/>
<path class="st6" d="M75.39,225.85l-1.48,3.4c-0.97,2.24-0.89,4.79,0.22,6.97c8.82,17.24,48.25,96.21,60.03,152.07
c1.11,5.25,6.93,8,11.71,5.55c18.27-9.37,61.08-28.21,118.37-33.24c1.44-0.13,2.82-0.62,4-1.45c10.62-7.49,67.01-46,114.28-53.93
c4.91-0.82,7.97-5.78,6.47-10.53l-47.13-148.8c-1.37-4.32-5.98-6.7-10.29-5.31L80.38,221.32
C78.14,222.04,76.32,223.69,75.39,225.85z"/>
<path class="st7" d="M329.52,104.75c17.25,43.58,33.21,92.68,45.62,147.04c3.09,13.54,5.83,26.83,8.25,39.86
c0.78,4.18-1.95,8.2-6.13,9.02c-2.55,0.5-5.14,1.05-7.76,1.65c-19.93,4.57-37.22,11.17-51.75,18.14
C321.67,248.55,325.6,176.65,329.52,104.75z"/>
<path class="st7" d="M71.42,223.64c-1.26-2.23-1.32-4.96-0.09-7.21c0.65-1.19,1.39-2.41,2.25-3.64
c5.48-7.9,12.57-12.05,16.89-14.09c17.33,61.42,46.66,121.31,63.99,182.73l-10.29,2.13c-3.8,0.78-7.57-1.47-8.66-5.2
c-13.83-47.62-31.61-95.37-58.41-144.52C75.22,230.41,73.33,227.01,71.42,223.64z"/>
<path class="st8" d="M78.38,210.76l59.71,163.88c2.33,6.39,9.5,9.6,15.79,7.03c13.84-5.65,29.96-11.2,48.18-15.72
c22.68-5.62,43.26-8.3,60.61-9.47c2.46-0.17,4.8-1.08,6.72-2.64c16.96-13.74,38.62-28.91,65.23-42.67
c15.79-8.16,30.87-14.56,44.71-19.6c6.13-2.23,9.38-8.91,7.32-15.1c-19.4-58.3-38.8-116.6-58.2-174.89
c-2.12-6.37-9.05-9.78-15.38-7.55c-13.86,4.87-29.35,11.37-45.65,20.13c-24.75,13.31-44.37,28.05-59.17,40.98
c-1.98,1.73-4.47,2.77-7.1,2.94c-17.32,1.1-40.3,4.37-65.95,13.28c-21.29,7.39-38.66,16.67-51.97,25.13
C78.47,199.52,76.45,205.45,78.38,210.76z"/>
<path class="st9" d="M294.94,297.63c0,0,22.11-19.4,45.78-21.73"/>
<path class="st9" d="M305.93,295.95c0,0,14.74-9.31,24.05-11.9"/>
<path class="st9" d="M248.58,154.13c0,0,22.11-19.4,45.78-21.73"/>
<path class="st9" d="M259.57,152.45c0,0,14.74-9.31,24.05-11.9"/>
<path class="st10" d="M148.69,229.01l-19.37,8.66c-3.26,1.46-7.08,0-8.53-3.26l-9.51-21.26c-1.46-3.26,0-7.08,3.26-8.53
l19.37-8.66c3.26-1.46,7.08,0,8.53,3.26l9.51,21.26C153.4,223.73,151.94,227.55,148.69,229.01z"/>
<circle class="st10" cx="176.22" cy="202.45" r="8.73"/>
<path class="st10" d="M171.12,326.85c-0.82,4.75-5.34,7.94-10.09,7.11c-4.75-0.82-7.94-5.34-7.11-10.09
c0.82-4.75,5.34-7.94,10.09-7.11C168.75,317.59,171.94,322.1,171.12,326.85z"/>
<path class="st10" d="M178.04,332.28c-0.82,4.75-5.34,7.94-10.09,7.11c-4.75-0.82-7.94-5.34-7.11-10.09
c0.82-4.75,5.34-7.94,10.09-7.11C175.67,323.02,178.86,327.53,178.04,332.28z"/>
<ellipse transform="matrix(0.7071 -0.7071 0.7071 0.7071 -81.6645 186.4035)" class="st10" cx="184.18" cy="191.78" rx="12.22" ry="12.22"/>
<path class="st9" d="M204.15,299.31c0,0,17.3-9.31,34.32-7.24"/>
<path class="st9" d="M206.12,308.15c0,0,17.3-9.31,34.32-7.24"/>
<path class="st9" d="M208.09,316.99c0,0,17.3-9.31,34.32-7.24"/>
<path class="st11" d="M205.18,157.86c0,0,50.65,107.44,61.28,198.39"/>
<g>
<path class="st9" d="M141.37,251.05c0,0,28.66-19.61,59.37-20.71"/>
<path class="st9" d="M144.22,260.55c0,0,28.66-19.61,59.37-20.71"/>
<path class="st9" d="M147.06,270.06c0,0,28.66-19.61,59.37-20.71"/>
<path class="st9" d="M149.9,279.56c0,0,28.66-19.61,59.37-20.71"/>
<path class="st9" d="M152.74,289.06c0,0,28.66-19.61,59.37-20.71"/>
<path class="st9" d="M155.59,298.57c0,0,28.66-19.61,59.37-20.71"/>
</g>
<g class="st12">
<g>
<path class="st2" d="M335.06,177.05l4.9,18.39c0.7,2.64-1.06,4.62-3.95,4.41l-35.97-2.57l-44.37-3.16l36.86-24.78l36.03,2.56
c1.95,0.14,3.9,1.23,5.18,2.74C334.37,175.37,334.84,176.2,335.06,177.05z"/>
<path class="st2" d="M339.08,211.36l-29.94-2.14l-36.87,24.8l74.26,5.3c2.89,0.21,4.65-1.77,3.95-4.41l-4.9-18.38
C344.88,213.87,341.97,211.56,339.08,211.36z"/>
<path class="st2" d="M339.42,212.61l-86.04,57.8l21.8,2.32l-3.62,18.48l75.31-50.65c2.4-1.61,3.78-5.07,3.07-7.71l-4.9-18.38
C344.34,211.83,341.82,210.99,339.42,212.61z"/>
</g>
</g>
<g>
<g>
<path class="st13" d="M334.26,173.47l4.9,18.39c0.7,2.64-1.06,4.62-3.95,4.41l-35.97-2.57l-44.37-3.16l36.86-24.78l36.03,2.56
c1.95,0.14,3.9,1.23,5.18,2.74C333.56,171.79,334.03,172.62,334.26,173.47z"/>
<path class="st10" d="M251.14,214.59l86.04-57.8l-21.8-2.32l3.62-18.48l-75.31,50.65c-2.4,1.61-3.78,5.07-3.07,7.71l4.9,18.38
C246.22,215.37,248.74,216.2,251.14,214.59z"/>
<path class="st13" d="M338.28,207.78l-29.94-2.14l-36.87,24.8l70.8,4.47c2.89,0.21,7.57-2.99,6.86-5.63l-4.35-16.34
C344.07,210.29,341.16,207.98,338.28,207.78z"/>
<path class="st10" d="M261.61,253.89l75.31-50.65c2.4-1.61,3.78-5.07,3.07-7.71l-4.9-18.38c-0.7-2.64-3.22-3.48-5.62-1.86
l-75.31,50.65c-2.4,1.61-3.78,5.07-3.07,7.71l4.9,18.38C256.69,254.67,259.21,255.5,261.61,253.89z"/>
<path class="st14" d="M338.61,209.03l-86.04,57.8l21.8,2.32l-3.62,18.48l75.31-50.65c2.4-1.61,3.78-5.07,3.07-7.71l-4.9-18.38
C343.53,208.25,341.01,207.41,338.61,209.03z"/>
<path class="st14" d="M250.33,211.01l86.04-57.8l-21.8-2.32l3.62-18.48l-75.31,50.65c-2.4,1.61-3.78,5.07-3.07,7.71l4.9,18.38
C245.41,211.79,247.93,212.62,250.33,211.01z"/>
<path class="st14" d="M260.8,250.31l75.31-50.65c2.4-1.61,3.78-5.07,3.07-7.71l-4.9-18.38c-0.7-2.64-3.22-3.48-5.62-1.86
l-75.31,50.65c-2.4,1.61-3.78,5.07-3.07,7.71l4.9,18.38C255.88,251.09,258.4,251.92,260.8,250.31z"/>
</g>
<g>
<g>
<text transform="matrix(0.8508 -0.5255 0.5255 0.8508 268.682 189.8981)" class="st15 st16 st17">LOG</text>
<text transform="matrix(0.8508 -0.5255 0.5255 0.8508 269.7597 188.8204)" class="st15 st16 st17">LOG</text>
</g>
<text transform="matrix(0.8508 -0.5255 0.5255 0.8508 269.7597 188.8204)" class="st8 st16 st17">LOG</text>
</g>
<g>
<g>
<text transform="matrix(0.8302 -0.5575 0.5575 0.8302 279.1401 231.4013)" class="st15 st16 st17">BOOK</text>
<text transform="matrix(0.8302 -0.5575 0.5575 0.8302 280.2178 230.3236)" class="st15 st16 st17">BOOK</text>
</g>
<text transform="matrix(0.8302 -0.5575 0.5575 0.8302 280.2178 230.3236)" class="st8 st16 st17">BOOK</text>
</g>
<g>
</g>
</g>
</g>
<g>
<path class="st2" d="M341.09,406.33l-1.31-0.83c0.03-1.01-0.59-3.42-5.43-7.83c-1.09-1-4.65-3.51-9.81-7
c-0.52-0.88-1.26-1.69-2.19-2.33l-28.36-18.92c-1.31-0.9-2.68-1.36-3.93-1.39c-5.01-3.24-10.12-6.54-15.15-9.78
c0.04-0.71-0.28-1.42-0.91-1.81c-0.62-0.39-1.36-0.37-1.96-0.03c-13.61-8.75-26.37-16.9-34.55-22.11
c-0.12-0.47-0.11-0.81,0.15-0.83c0.99-0.08,31.37,19.92,31.37,19.92c0.96-1.6-30.12-22.97-31.93-24.12
c-1.66-1.06-3.54,0.38-4.79,1.72c-0.61-0.39-1.15-0.73-1.63-1.04c-0.03-0.65-0.35-1.26-0.91-1.62c-0.66-0.42-1.47-0.37-2.08,0.05
c-1.25-0.74-2.5-0.58-3.79,0.67l-3.16-2.01c-1.02-0.65-2.37-0.31-3.01,0.77l-0.75,1.27c-0.64,1.07-0.33,2.47,0.69,3.12l3.1,1.97
c-0.67,1.99-0.04,2.92,1.15,3.72c-0.2,0.83,0.11,1.73,0.85,2.2c0.65,0.41,1.44,0.37,2.05-0.03c6.12,3.88,22.89,14.51,41.32,26.07
c-0.14,0.79,0.19,1.62,0.88,2.07c0.7,0.45,1.57,0.36,2.2-0.13c5.1,3.2,10.28,6.44,15.37,9.61c0.59,1.22,1.6,2.34,2.94,3.12
c0,0,0,0,0,0c0,0,0.01,0,0.01,0.01c0,0,0.15,0.08,0.39,0.23l28.85,16.74c0.52,0.3,1.07,0.51,1.61,0.67
c5.95,3.56,10.16,5.97,11.61,6.57c5.99,2.47,8.36,1.96,9.22,1.47l1.31,0.83c0.25,0.16,0.59,0.08,0.75-0.19
C341.42,406.84,341.34,406.49,341.09,406.33z"/>
<g>
<g>
<path class="st18" d="M234.59,327.36c0,0,3.67-5.08,6.37-3.16c1.75,1.24,31.67,24.2,30.64,25.75c0,0-29.3-21.55-30.29-21.52
c-0.99,0.03,1.33,4.61,1.33,4.61L234.59,327.36z"/>
<path d="M340.98,407.33L340.98,407.33c0.17-0.26,0.11-0.61-0.13-0.78l-2.66-1.89c-0.25-0.17-0.58-0.11-0.76,0.15l0,0
c-0.17,0.26-0.11,0.61,0.13,0.78l2.66,1.89C340.47,407.65,340.81,407.59,340.98,407.33z"/>
<path class="st19" d="M230.01,327.63l-0.82,1.23c-0.69,1.04-2.06,1.31-3.04,0.61l-4.74-3.37c-0.99-0.7-1.23-2.11-0.53-3.15
l0.82-1.23c0.69-1.04,2.06-1.31,3.04-0.61l4.74,3.37C230.46,325.19,230.7,326.59,230.01,327.63z"/>
<path class="st20" d="M225.53,332.13c-1.71-1.22-2.36-2.54,0.34-6.58c2.17-3.24,4.06-3.94,5.84-2.67
c0.14,0.1,0.35,0.01,0.54,0.05c0,0,95.91,68.13,102.31,74.61c6.41,6.48,4.86,8.68,4.86,8.68s-1.45,2.27-9.6-1.59
c-8.16-3.87-104.06-72-104.06-72C225.67,332.47,225.67,332.23,225.53,332.13z"/>
<path class="st21" d="M332.26,402.21c-8.16-3.87-104.06-72-104.06-72c-0.1-0.17-0.1-0.4-0.24-0.5
c-1.71-1.22-2.36-2.54,0.34-6.58c0.1-0.15,0.2-0.29,0.3-0.43c-0.86,0.49-1.77,1.42-2.73,2.86c-2.7,4.04-2.06,5.36-0.34,6.58
c0.14,0.1,0.14,0.33,0.24,0.5c0,0,95.91,68.13,104.06,72c8.16,3.87,9.6,1.59,9.6,1.59s0.35-0.52,0.01-1.78
C338,404.39,335.74,403.86,332.26,402.21z"/>
<line class="st1" x1="255.28" y1="342.84" x2="260.61" y2="346.76"/>
<line class="st1" x1="237.93" y1="330.07" x2="251.85" y2="340.32"/>
<path class="st18" d="M271.56,364.06l5.36-8.01c0.62-0.93,0.41-2.19-0.48-2.81l0,0c-0.88-0.63-2.1-0.38-2.72,0.54l-5.36,8.01
c-0.62,0.93-0.41,2.19,0.48,2.81l0,0C269.72,365.23,270.94,364.99,271.56,364.06z"/>
<path class="st18" d="M228.81,333.7l5.36-8.01c0.62-0.93,0.41-2.19-0.48-2.81l0,0c-0.88-0.63-2.1-0.38-2.72,0.54l-5.36,8.01
c-0.62,0.93-0.41,2.19,0.48,2.81l0,0C226.97,334.87,228.19,334.63,228.81,333.7z"/>
</g>
<path class="st22" d="M324.67,395.96l0.46-0.69c1.51-2.25,0.6-5.63-2.06-7.67l-27.35-20.37c-2.83-2.17-6.08-2.23-7.69,0.17
l-1.9,2.84c-1.61,2.41-0.45,6.06,2.54,8.01L317,396.72C319.79,398.54,323.17,398.21,324.67,395.96z"/>
<path class="st19" d="M288.29,376.25l5.38-8.46c0.46-0.73,1.45-0.92,2.15-0.41c4.82,3.54,21.64,16.04,26.14,19.38
c0.63,0.47,0.79,1.34,0.37,2l-4.31,6.78c-0.45,0.7-1.38,0.91-2.08,0.45c-5.53-3.6-27.25-17.75-27.25-17.75
c0,0-0.01-0.01-0.01-0.01C288.01,377.82,287.87,376.92,288.29,376.25z"/>
</g>
</g>
<g>
<circle class="st2" cx="436.14" cy="340.38" r="66.73"/>
<circle class="st8" cx="444.06" cy="327.42" r="66.73"/>
<path class="st7" d="M450.9,390.55c-36.85,0-66.73-29.88-66.73-66.73c0-24.21,12.9-45.41,32.2-57.11
c-23.03,10.52-39.04,33.74-39.04,60.71c0,36.85,29.88,66.73,66.73,66.73c12.64,0,24.46-3.52,34.53-9.62
C470.15,388.38,460.78,390.55,450.9,390.55z"/>
<circle class="st23" cx="444.06" cy="327.42" r="51.99"/>
<path class="st7" d="M509.05,332.78h-38.18c-2.96,0-5.37-2.4-5.37-5.37l0,0c0-2.96,2.4-5.37,5.37-5.37h38.18
c2.96,0,5.37,2.4,5.37,5.37l0,0C514.42,330.38,512.01,332.78,509.05,332.78z"/>
<path class="st24" d="M512.85,331.21c-8.35-0.23-15.07-2.79-20.08-5.72c-3.95-2.31-8.49-3.43-13.07-3.43h-8.6
c-2.8,0-5.31,2.05-5.57,4.84c-0.31,3.2,2.2,5.89,5.34,5.89h38.18C510.54,332.78,511.88,332.18,512.85,331.21z"/>
<circle class="st7" cx="444.06" cy="327.42" r="43.47"/>
<circle class="st25" cx="444.06" cy="327.42" r="37.98"/>
<circle class="st26" cx="444.06" cy="327.42" r="32.1"/>
<circle class="st27" cx="444.06" cy="327.42" r="30.06"/>
<g>
<path class="st28" d="M428.11,303.6c-5.07,2.75-10.72,8.73-11.95,21.24c-1.42,14.45,8.1,20.34,10.08,18.36
c1.98-1.98-6.6-12.75,1.08-26.16c5.76-10.05,13.45-7.29,12.84-12.84C439.62,299.31,430.61,302.24,428.11,303.6z"/>
<path class="st28" d="M428.73,348.45c0.22,0.22,11.52,8.19,12.87,4.59S425.76,345.48,428.73,348.45z"/>
<path class="st28" d="M460.77,314.07c-4.26-4.26-12.69-7.11-23.22-0.54c-11.78,7.35-10.42,31.45,6.03,32.22
c10.1,0.47,12.43-10.27,3.73-6.45c-1.57,0.69-5.34,2.02-7.12,0.24c-5.47-5.47,0.06-11.5,6.54-12.12
c4.29-0.41,10.81,3.17,13.23,1.18C464.4,324.96,463.71,317.01,460.77,314.07z"/>
<path class="st28" d="M470.4,320.82c1.23,1.23,2.25,5.67,0,14.85c-2.88,11.73-13.5,15.48-12.87,12.24s5.6-1.56,9.9-15.75
C469.23,326.22,469.18,319.61,470.4,320.82z"/>
<path class="st28" d="M452.88,301.98c-0.26-0.14-6.89-1.02-6.42,1.02c0.48,2.04,13.08,5.04,12.42,2.58
C458.22,303.12,454.42,302.82,452.88,301.98z"/>
<path class="st28" d="M463.13,308.46c-0.22-0.11-2.48-1.11-0.59,0.78c1.89,1.89,5.58,5.4,5.16,3.42
C467.28,310.68,464.53,309.14,463.13,308.46z"/>
</g>
</g>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 18 KiB

Some files were not shown because too many files have changed in this diff Show More