PageSourceSearch

https://hopelia.com/assets/app.profil-BxclYiYw.js

js hopelia.com collected 2026-10-02 01:34:02 UTC 20,460 bytes, 1 lines download raw bytes

1import{r as d,j as e,S as T,a2 as N,s as L,t as f,i as R,bb as g,b4 as I,b5 as M,L as U,bM as j,B}from"./index-Bf345cdl.js";import{P as F}from"./PageTitle-DYTJmOvH.js";import{r as V}from"./fiscal-diagnostic-C2a_5KEe.js";import{S as O}from"./scale-pygPDYRn.js";import{F as K}from"./fiscal-DU2bdmoQ.js";import{u as W}from"./useMutation-D1XpQOaK.js";import{u as H}from"./useProfile-C76L2fG5.js";import{N as $,p as C}from"./NoteDonneesPrivees-CYS4JVy2.js";import{C as J}from"./CapaciteCard-hVXcfhH8.js";import{S as b}from"./switch-DJEVkiLp.js";import{u as Q}from"./CapBar-D-5qhJHC.js";import{T as S}from"./TermeTip-mHqxmT3X.js";import{I as h}from"./input-BEEDdCLI.js";import{L as z}from"./label-C4k2OGk0.js";import{U as X}from"./user-DeixZ2m0.js";import"./cashflow-DKNRQAre.js";import"./lock-DMNPP5Xg.js";import"./index-XP3hnUEp.js";import"./index-CzsHxXRn.js";import"./index-BcIPzEZJ.js";import"./useRoadmap-BiemTm9L.js";import"./useProjetContext-j-7_BNcU.js";import"./useMemory-Bbp9KLnM.js";import"./useObjectives-kq1Ugntr.js";import"./useFavorites-xyjRtwmU.js";import"./ecriture-guard-C2qLtfHI.js";import"./freemium-BbxWPx9a.js";import"./useScope-CkV3SUje.js";import"./usePlan-D7X9LkHX.js";import"./useViewAs-C4sUdePs.js";import"./subscription-T4ha2ROn.js";import"./social-GpM-F0Gm.js";import"./useProjects-DoiYYunC.js";import"./useProperties-CLwk0fHM.js";import"./chevron-down-BDBfN9do.js";import"./x-DKzmyLgw.js";import"./check-yPydNSZS.js";import"./chevron-right-BMaKOtS2.js";import"./lexique-D7UYB_MJ.js";import"./FicheTerme-DzQulUwZ.js";import"./popover-CyMX68Cn.js";import"./index-dfK5sxcX.js";import"./index-JmRR4qGX.js";import"./index-DTBawxFz.js";function A({value:t,onChange:a}){return e.jsx("div",{className:"inline-flex rounded-lg border border-border bg-muted/40 p-0.5 text-sm",children:[{v:!1,l:"Non"},{v:!0,l:"Oui"}].map(n=>e.jsx("button",{type:"button",onClick:()=>a(n.v),className:`rounded-md px-3 py-1 font-medium transition-colors ${t===n.v?"bg-background text-foreground shadow-sm":"text-muted-foreground"}`,children:n.l},n.l))})}function Y({loyerAnnuelDefaut:t=0}){const[a,n]=d.useState("meuble"),[s,i]=d.useState(t),[o,u]=d.useState(!1),[m,r]=d.useState(!0),l=d.useMemo(()=>V({location:a,loyerAnnuel:s,grossesCharges:o,patrimoineLongTerme:m}),[a,s,o,m]);return e.jsxs("div",{className:"bg-card border border-border rounded-2xl p-6 space-y-5",children:[e.jsxs("div",{children:[e.jsxs("h2",{className:"text-lg font-display font-semibold inline-flex items-center gap-2",children:[e.jsx(O,{className:"size-4 text-primary"})," Quel régime fiscal pour vous ?"]}),e.jsx("p",{className:"text-sm text-muted-foreground mt-1",children:"Répondez à quelques questions, on vous oriente vers le régime le plus adapté et on vous explique pourquoi."})]}),e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"flex items-center justify-between gap-3 flex-wrap",children:[e.jsx("span",{className:"text-sm",children:"Vous louez (ou comptez louer)"}),e.jsx("div",{className:"inline-flex rounded-lg border border-border bg-muted/40 p-0.5 text-sm",children:[{v:"nu",l:"Nu"},{v:"meuble",l:"Meublé"}].map(p=>e.jsx("button",{type:"button",onClick:()=>n(p.v),className:`rounded-md px-3 py-1 font-medium transition-colors ${a===p.v?"bg-background text-foreground shadow-sm":"text-muted-foreground"}`,children:p.l},p.v))})]}),e.jsxs("div",{className:"flex items-center justify-between gap-3 flex-wrap",children:[e.jsx("label",{htmlFor:"loyer-annuel",className:"text-sm",children:"Loyers annuels estimés (€)"}),e.jsx("input",{id:"loyer-annuel",type:"number",min:0,step:500,value:s||"",onChange:p=>i(Math.max(0,Number(p.target.value)||0)),placeholder:"ex : 9600",className:"w-32 bg-input border border-border rounded-lg px-3 py-1.5 text-sm text-right tabular-nums outline-none focus:border-primary"})]}),e.jsxs("div",{className:"flex items-center justify-between gap-3 flex-wrap",children:[e.jsx("span",{className:"text-sm max-w-[65%]",children:"Crédit sur le bien et/ou travaux importants ?"}),e.jsx(A,{value:o,onChange:u})]}),e.jsxs("div",{className:"flex items-center justify-between gap-3 flex-wrap",children:[e.jsx("span",{className:"text-sm max-w-[65%]",children:"Vous comptez garder le bien longtemps ?"}),e.jsx(A,{value:m,onChange:r})]})]}),e.jsxs("div",{className:"rounded-xl bg-primary/5 border border-primary/20 p-4",children:[e.jsxs("p",{className:"text-sm font-semibold text-primary inline-flex items-center gap-2",children:[e.jsx(T,{className:"size-4"})," Recommandation : ",l.titre]}),e.jsx("ul",{className:"mt-2 space-y-1 list-disc pl-5 marker:text-primary/60",children:l.pourquoi.map(p=>e.jsx("li",{className:"text-sm text-muted-foreground",children:p},p))})]}
1),e.jsx("p",{className:"text-[11px] text-muted-foreground/80",children:K})]})}const G=/^https:\/\/(?:ptb\.|canary\.)?discord(?:app)?\.com\/api\/webhooks\/\d+\/[A-Za-z0-9_-]+$/;function q(t){return typeof t=="string"&&G.test(t.trim())}function Z(){const[t,a]=Q();return e.jsxs("label",{className:"flex items-center justify-between gap-4 cursor-pointer",children:[e.jsxs("span",{children:[e.jsx("span",{className:"block text-sm font-medium",children:"Barre de progression"}),e.jsx("span",{className:"block text-xs text-muted-foreground/70 mt-0.5",children:"Affiche votre avancement dans le parcours en haut de chaque page, avec la prochaine action. Appliqué tout de suite, sur cet appareil."})]}),e.jsx(b,{checked:!t,onCheckedChange:n=>a(!n)})]})}function ee(t){const a="=".repeat((4-t.length%4)%4),n=(t+a).replace(/-/g,"+").replace(/_/g,"/"),s=atob(n),i=new Uint8Array(s.length);for(let o=0;o<s.length;o++)i[o]=s.charCodeAt(o);return i}function P(t){if(!t)return"";const a=new Uint8Array(t);let n="";for(const s of a)n+=String.fromCharCode(s);return btoa(n).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}const v=L,se="BLJfXugxzyVjm8lVbniM_a4l3kGTaS8zM-afVWr2E8Pn4zsJAx4FLqcWSEEwb1fxPxXAfeoBmKomwtKHP0uF1eE",re=se;function y(){return typeof window<"u"&&"serviceWorker"in navigator&&"PushManager"in window&&"Notification"in window}function te(){return typeof Notification>"u"?"denied":Notification.permission}async function ae(){const t=await navigator.serviceWorker.register("/sw.js");return await navigator.serviceWorker.ready,t}async function D(){if(!y())return null;const t=await navigator.serviceWorker.getRegistration();return t?t.pushManager.getSubscription():null}function ne(t){return{p256dh:P(t.getKey("p256dh")),auth:P(t.getKey("auth"))}}async function ie(){if(!y())return{ok:!1,reason:"unsupported"};if(await Notification.requestPermission()!=="granted")return{ok:!1,reason:"denied"};const a=await ae(),n=await a.pushManager.getSubscription()??await a.pushManager.subscribe({userVisibleOnly:!0,applicationServerKey:ee(re)}),s=await N();if(!s)return{ok:!1,reason:"not-authenticated"};const i=ne(n),{error:o}=await v.from("push_subscriptions").upsert({user_id:s.id,endpoint:n.endpoint,p256dh:i.p256dh,auth:i.auth,user_agent:typeof navigator<"u"?navigator.userAgent.
1slice(0,300):null,last_seen_at:new Date().toISOString()},{onConflict:"user_id,endpoint"});if(o)return{ok:!1,reason:o.message};const{error:u}=await v.from("profiles").update({alerte_push:!0}).eq("user_id",s.id);return u?{ok:!1,reason:u.message}:{ok:!0}}async function oe(){const t=await D(),a=t?.endpoint;if(t)try{await t.unsubscribe()}catch{}const n=await N();if(!n)return{ok:!1,reason:"not-authenticated"};a&&await v.from("push_subscriptions").delete().eq("user_id",n.id).eq("endpoint",a);const{error:s}=await v.from("profiles").update({alerte_push:!1}).eq("user_id",n.id);return s?{ok:!1,reason:s.message}:{ok:!0}}function le(){const[t,a]=d.useState({supported:!1,permission:"default",subscribed:!1,busy:!1}),n=d.useCallback(async()=>{if(!y()){a(m=>({...m,supported:!1}));return}const u=await D();a(m=>({...m,supported:!0,permission:te(),subscribed:!!u}))},[]);d.useEffect(()=>{n()},[n]);const s=d.useCallback(async()=>{a(o=>({...o,busy:!0}));try{const o=await ie();return await n(),o}finally{a(o=>({...o,busy:!1}))}},[n]),i=d.useCallback(async()=>{a(o=>({...o,busy:!0}));try{const o=await oe();return await n(),o}finally{a(o=>({...o,busy:!1}))}},[n]);return{...t,enable:s,disable:i,refresh:n}}const _={denied:"Permission refusée par le navigateur. Autorisez les notifications pour Hopelia dans les réglages du site, puis réessayez.",unsupported:"Votre navigateur ne supporte pas les notifications bureau.","no-vapid-key":"Configuration serveur incomplète (clé VAPID manquante).","not-authenticated":"Session expirée, reconnectez-vous."};function ue(){const{supported:t,permission:a,subscribed:n,busy:s,enable:i,disable:o}=le();async function u(r){if(r){const l=await i();l.ok?f.success("Notifications bureau activées"):f.error(_[l.reason??""]??l.reason??"Activation impossible")}else{const l=await o();l.ok?f("Notifications bureau désactivées"):f.error(_[l.reason??""]??l.reason??"Erreur")}}const m=t&&a==="denied"&&!n;return e.jsxs("label",{className:"mt-4 flex items-center justify-between gap-4 cursor-pointer",children:[e.jsxs("span",{children:[e.jsx("span",{className:"block text-sm font-medium",children:"Notifications sur le bureau"}),e.jsx("span",{className:"block text-xs text-muted-foreground/70 mt-0.5",children:t?m?_.denied:"Recevez une notification de votre navigateur, même Hopelia fermé, dès que de nouveaux biens correspondent à une alerte active. À activer par appareil.":"Votre navigateur ne supporte pas les notifications bureau."})]}),e.jsx(b,{checked:n,disabled:!t||s||m,onCheckedChange:u})]})}function ce(){return e.jsxs("div",{className:"bg-card border border-border rounded-2xl p-6 space-y-4",children:[e.jsxs("div",{children:[e.jsx("h2",{className:"text-sm font-semibold uppercase tracking-wider text-muted-foreground",children:"Vos données"}),e.jsx("p",{className:"text-xs text-muted-foreground/70 mt-1",children:"Tout ce que vous enregistrez ici vous appartient. Le détail de ce qu'on conserve et de vos droits est dans la politique de confidentialité (lien en bas de la page d'accueil)."})]}),e.jsxs("p",{className:"text-sm text-muted-foreground",children:["Vous voulez récupérer une copie de vos données ou supprimer votre compte ? Écrivez-nous à"," ",e.jsx("a",{href:"mailto:[email protected]",className:"font-medium text-foreground hover:underline",children:"[email protected]"})," ","et on s'en occupe rapidement."]})]})}const de=[{v:"cdi",l:"CDI"},{v:"cdd",l:"CDD / intérim"},{v:"independant",l:"Indépendant"},{v:"dirigeant",l:"Dirigeant"}],me=[{v:"cashflow",l:"Cash-flow"},{v:"patrimoine",l:"Patrimoine"},{v:"residence",l:"Résidence principale"}],pe={created_at:"",display_name:"",taux:g.tauxNominal,duree_ans:g.dureeAns,frais_notaire_pct:g.fraisNotairePct,apport_eur:0,loyer_net_pct:75,revenus_mensuels_eur:0,type_contrat:"cdi",revenus_locatifs_eur:0,credits_mensuels_eur:0,objectif:"cashflow",objectif_choisi:!1,taux_assurance:g.tauxAssurance,onboarding_done:!0,wizard_passe:!1,alerte_email:!1,alerte_pepite:!1,discord_webhook_url:null,emails_produit:!0,bailleur_nom:null,bailleur_prenom:null,bailleur_adresse:null};function as(){const t=R(),{data:a,isLoading:n}
1=H(),[s,i]=d.useState(null);d.useEffect(()=>{a!==void 0&&!s&&i({...pe,...a??{}})},[a,s]);const o=d.useMemo(()=>{if(!s||!(s.revenus_mensuels_eur>0))return null;const{borrower:r,assumptions:l}=I(s);return M(r,l)},[s]),u=W({mutationFn:async r=>{const l=await N();if(!l)throw new Error("Not authenticated");const{created_at:p,...w}=r,{error:k}=await L.from("profiles").upsert({user_id:l.id,...w,duree_ans:Math.min(w.duree_ans,j)},{onConflict:"user_id"});if(k)throw k},onSuccess:()=>{f.success("Profil enregistré"),t.invalidateQueries({queryKey:["profile"]})},onError:r=>f.error(r instanceof Error?r.message:"Erreur")});function m(r){if(r.preventDefault(),!s)return;const l=(s.discord_webhook_url??"").trim();if(l&&!q(l)){f.error("L'URL du webhook Discord n'est pas valide (elle doit ressembler à https://discord.com/api/webhooks/…).");return}u.mutate({...s,discord_webhook_url:l||null,objectif_choisi:!0})}return n||!s?e.jsx("div",{className:"p-10 text-muted-foreground",children:"Chargement…"}):e.jsxs("div",{className:"max-w-2xl mx-auto p-6 md:p-10",children:[e.jsxs("header",{className:"mb-8",children:[e.jsx(F,{icon:X,children:"Profil"}),e.jsx($,{className:"mt-2"})]}),e.jsxs("form",{onSubmit:m,className:"space-y-6",children:[o?e.jsx(J,{result:o}):e.jsxs("div",{className:"bg-card border border-border rounded-2xl p-5 text-sm text-muted-foreground",children:["Renseignez vos revenus pour voir votre capacité d'emprunt et votre budget cible."," ",e.jsx(U,{to:"/onboarding",className:"text-primary hover:underline",children:"Relancer l'assistant →"})]}),e.jsxs("div",{className:"bg-card border border-border rounded-2xl p-6 space-y-6",children:[e.jsx(c,{label:"Nom affiché",children:e.jsx(h,{value:s.display_name??"",onChange:r=>i({...s,display_name:r.target.value})})}),e.jsxs(E,{title:"Profil financier",children:[e.jsx(c,{label:"Revenus nets mensuels (€)",children:e.jsx(x,{value:s.revenus_mensuels_eur,step:100,onChange:r=>i({...s,revenus_mensuels_eur:r})})}),e.jsx(c,{label:"Type de contrat",children:e.jsx("select",{value:s.type_contrat,onChange:r=>i({...s,type_contrat:r.target.value}),className:"w-full bg-input border border-border rounded-lg px-3 py-2 text-sm outline-none focus:border-primary",children:de.map(r=>e.jsx("option",{value:r.v,children:r.l},r.v))})}),e.jsx(c,{label:"Revenus locatifs existants (€/mois)",hint:e.jsx(S,{texte:"Loyers bruts, retenus à 70 % par la banque (règle HCSF)"}),children:e.jsx(x,{value:s.revenus_locatifs_eur,step:50,onChange:r=>i({...s,revenus_locatifs_eur:r})})}),e.jsx(c,{label:"Crédits en cours (€/mois)",children:e.jsx(x,{value:s.credits_mensuels_eur,step:50,onChange:r=>i({...s,credits_mensuels_eur:r})})}),e.jsx(c,{label:"Apport (€)",children:e.jsx(x,{value:s.apport_eur,step:1e3,onChange:r=>i({...s,apport_eur:r})})}),e.jsx(c,{label:"Objectif",hint:e.jsx(S,{texte:"Cash-flow : un revenu net chaque mois. Patrimoine : de la valeur qui grossit sur le long terme. Résidence principale : acheter le logement que vous habitez. C'est lui qui oriente votre roadmap."}),children:e.jsx("select",{value:s.objectif,onChange:r=>i({...s,objectif:r.target.value,objectif_choisi:!0}),className:"w-full bg-input border border-border rounded-lg px-3 py-2 text-sm outline-none focus:border-primary",children:me.map(r=>e.jsx("option",{value:r.v,children:r.l},r.v))})})]}),e.jsxs(E,{title:"Hypothèses de financement",children:[e.jsx(c,{label:"Taux nominal (%)",children:e.jsx(x,{value:s.taux,step:.05,decimal:!0,onChange:r=>i({...s,taux:r})})}),e.jsx(c,{label:"Taux assurance (%)",hint:"Sur capital initial, compris dans les 35 %",children:e.jsx(x,{value:s.taux_assurance,step:.01,decimal
1:!0,onChange:r=>i({...s,taux_assurance:r})})}),e.jsx(c,{label:`Durée (années, max ${j})`,children:e.jsx(x,{value:s.duree_ans,step:1,onChange:r=>i({...s,duree_ans:Math.min(r,j)})})}),e.jsx(c,{label:"Frais de notaire (%)",children:e.jsx(x,{value:s.frais_notaire_pct,step:.5,decimal:!0,onChange:r=>i({...s,frais_notaire_pct:r})})}),e.jsx(c,{label:"Loyer net perçu (%)",hint:"Part du loyer brut conservée après charges, vacance, gestion",children:e.jsx(x,{value:s.loyer_net_pct,step:1,decimal:!0,onChange:r=>i({...s,loyer_net_pct:r})})})]}),e.jsxs("div",{className:"border-t border-border pt-6",children:[e.jsx("h2",{className:"text-sm font-semibold uppercase tracking-wider text-muted-foreground mb-4",children:"Identité bailleur"}),e.jsx("p",{className:"text-xs text-muted-foreground/70 mb-4 -mt-2",children:"Reprise sur vos documents locatifs (quittances, bail, avenants de révision, décomptes de charges). Sans elle, ces documents sortent avec un blanc à compléter à la main."}),e.jsxs("div",{className:"grid grid-cols-1 sm:grid-cols-2 gap-4",children:[e.jsx(c,{label:"Prénom",children:e.jsx(h,{value:s.bailleur_prenom??"",onChange:r=>i({...s,bailleur_prenom:r.target.value||null})})}),e.jsx(c,{label:"Nom",children:e.jsx(h,{value:s.bailleur_nom??"",onChange:r=>i({...s,bailleur_nom:r.target.value||null})})}),e.jsx("div",{className:"sm:col-span-2",children:e.jsx(c,{label:"Adresse postale",hint:"Ex : 12 rue des Lilas, 59100 Roubaix",children:e.jsx(h,{value:s.bailleur_adresse??"",onChange:r=>i({...s,bailleur_adresse:r.target.value||null})})})})]})]}),e.jsxs("div",{className:"border-t border-border pt-6",children:[e.jsx("h2",{className:"text-sm font-semibold uppercase tracking-wider text-muted-foreground mb-4",children:"Notifications"}),e.jsxs("label",{className:"flex items-center justify-between gap-4 cursor-pointer",children:[e.jsxs("span",{children:[e.jsx("span",{className:"block text-sm font-medium",children:"Alertes par email"}),e.jsx("span",{className:"block text-xs text-muted-foreground/70 mt-0.5",children:"Recevez un email quand de nouveaux biens correspondent à une recherche dont l'alerte est active. Les notifications dans l'app restent actives quoi qu'il arrive."})]}),e.jsx(b,{checked:s.alerte_email,onCheckedChange:r=>i({...s,alerte_email:r})})]}),e.jsxs("label",{className:"flex items-center justify-between gap-4 cursor-pointer mt-4",children:[e.jsxs("span",{children:[e.jsx("span",{className:"block text-sm font-medium",children:"Alerte pépite"}),e.jsx("span",{className:"block text-xs text-muted-foreground/70 mt-0.5",children:"Recevez une notification quand un bien fraîchement scrapé passe la même barre de qualité que le bouton « Trouver une pépite » pour votre projet. Au plus une par jour. Désactivée par défaut : une alerte qui se trompe coûte plus cher qu'une alerte qu'on active soi-même."})]}),e.jsx(b,{checked:s.alerte_pepite,onCheckedChange:r=>i({...s,alerte_pepite:r})})]}),e.jsxs("label",{className:"flex items-center justify-between gap-4 cursor-pointer mt-4",children:[e.jsxs("span",{children:[e.jsx("span",{className:"block text-sm font-medium",children:"Emails de suivi du compte"}),e.jsx("span",{className:"block text-xs text-muted-foreground/70 mt-0.5",children:"Bienvenue, fin d'essai, informations importantes sur votre compte. Les alertes immobilières gardent leur réglage séparé juste au-dessus."})]}),e.jsx(b,{checked:s.emails_produit,onCheckedChange:r=>i({...s,emails_produit:r})})]}),e.jsx(ue,{}),e.jsxs("div",{className:"mt-5 space-y-1.5",children:[e.jsx(z,{className:"text-xs uppercase tracking-wider text-muted-foreground",children:"Alertes Discord (webhook)"}),e.jsx(h,{value:s.discord_webhook_url??"",placeholder:"https://discord.com/api/webhooks/…",onChange:r=>i({...s,discord_webhook_url:r.target.value||null})}),e.jsx("p",{className:"text-xs text-muted-foreground/70",children:"Recevez vos alertes dans le salon Discord de votre choix : dans Discord, ouvrez les paramètres du salon, Intégrations, Webhooks, créez un webhook et collez son URL ici. Laissez vide pour désactiver."}),(s.discord_webhook_url??"").trim()!==""&&!q((s.discord_webhook_url??"").trim())&&e.jsx("p",{className:"text-xs text-destructive",children:"Cette URL ne ressemble pas à un webhook Discord."})]})]}),e.jsxs("div",{className:"border-t border-border pt-6",children:[e.jsx("h2",{className:"text-sm font-semibold uppercase tracking-wider text-muted-foreground mb-4",children:"Affichage"}),e.jsx(Z,{})]}),e.jsx("div",{className:"flex justify-end pt-2",children:e.jsx(B,{t
1ype:"submit",disabled:u.isPending,children:u.isPending?"Enregistrement…":"Enregistrer"})})]})]}),e.jsx("div",{className:"mt-6",children:e.jsx(Y,{loyerAnnuelDefaut:(s.revenus_locatifs_eur||0)*12})}),e.jsx("div",{className:"mt-6",children:e.jsx(ce,{})})]})}function E({title:t,children:a}){return e.jsxs("div",{className:"border-t border-border pt-6",children:[e.jsx("h2",{className:"text-sm font-semibold uppercase tracking-wider text-muted-foreground mb-4",children:t}),e.jsx("div",{className:"grid grid-cols-1 sm:grid-cols-2 gap-4",children:a})]})}function c({label:t,hint:a,children:n}){return e.jsxs("div",{className:"space-y-1.5",children:[e.jsx(z,{className:"text-xs uppercase tracking-wider text-muted-foreground",children:t}),n,a&&e.jsx("p",{className:"text-xs text-muted-foreground/70",children:a})]})}function x({value:t,onChange:a,step:n,decimal:s=!1}){const[i,o]=d.useState(t>0?String(t):"");return d.useEffect(()=>{o(u=>C(u,s)===t?u:t>0?String(t):"")},[t,s]),e.jsx(h,{type:"number",step:n,min:0,className:"tabular",value:i,placeholder:"0",onChange:u=>{o(u.target.value),a(C(u.target.value,s))},onBlur:()=>o(t>0?String(t):"")})}export{as as component};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.