1import{r as u,j as e,g as f,B as v,L as D,I as b,T as P,C as k,b as y,q as I,v as M,ab as B,h as L,i as U,k as O,l as V,m as A}from"./index-BWYXbCDk.js";import{T as _}from"./textarea-CNNz8Eh1.js";import{S as C}from"./AdminDashboard-Cgu7susQ.js";import{B as w}from"./badge-C-0yQAfi.js";import{M as R}from"./useMasterpieceBrandProfiles-BcN1fvOY.js";import{a as S,b as W,c as $,d as F,e as K,u as H,f as T,g as q}from"./useMasterpieceProductDna-C5mvogQI.js";import{cj as G,ck as J,aa as z,cl as E,O as Q,a3 as X}from"./sheet-BkALcbyN.js";import{U as Z}from"./separator-BseUOeT3.js";import{P as Y}from"./plus-BS97ruWX.js";import{C as ee}from"./circle-check-DuWgpWTO.js";import"./useCustomerLicensePortal-DzxlC7_a.js";import"./iconMapping-B7V8kQdh.js";import"./circle-oiTnu0S3.js";import"./search-D017GuSe.js";import"./eye-DFTW9LgU.js";import"./tv-C9w1fruU.js";import"./InstagramIcon-BQdOV4er.js";import"./index-1cZJTSKC.js";import"./chevron-right-C5Bwh-pi.js";import"./PasswordRequirements-yWgbYJj6.js";import"./volume-x-XxgtBFAk.js";import"./refresh-cw-uZCpQ3HL.js";import"./shopping-cart-BwnhpZLS.js";import"./format-BPs4-Yqy.js";import"./nl-D5z8NZOa.js";import"./shield-alert-CbKkVKKv.js";import"./cpu-DKUTSiM6.js";import"./tabs-nCwyglKA.js";import"./circle-x-C3cp_uUG.js";import"./package-check-DTo_d_fV.js";import"./arrow-left-D7uSaoui.js";import"./laptop-4MvXsn9a.js";import"./history-DwxW46W2.js";import"./LicenseChangeWizard-CJhDZJhb.js";import"./radio-group-B9k0auzs.js";import"./arrow-right-ppbF7pdL.js";import"./monitor-D3HAv5OI.js";import"./PortalStat-CMFtk4gX.js";import"./LicenseCard-EbAusqni.js";import"./StatusPill-DAENqR-0.js";import"./plug-zap-DBc2I2nl.js";import"./useCustomerPurchaseRequests-Cmn7mC3B.js";import"./clock-C2p1W8t_.js";import"./wrench-ckOvx86t.js";import"./brandSettings-CEXkSGMF.js";import"./useMasterpieceVisuals-CzTwZwlQ.js";import"./life-buoy-Dp8WZVPZ.js";function te({asset:t,url:r,dnaId:g}){const[l,d]=u.useState(t.title??""),[n,m]=u.useState(t.notes??""),i=F(g),o=K(g);return e.jsxs("div",{className:"space-y-2 rounded-lg border bg-card p-2",children:[e.jsx("div",{className:"flex aspect-video items-center justify-center overflow-hidden rounded bg-muted",children:r?e.jsx("img",{src:r,alt:t.title,className:"h-full w-full object-contain",loading:"lazy"}):e.jsx(D,{className:"h-4 w-4 animate-spin text-muted-foreground"})}),e.jsxs("div",{className:"space-y-1",children:[e.jsx(f,{className:"text-[11px] text-muted-foreground",children:"Titel"}),e.jsx(b,{value:l,onChange:p=>d(p.target.value),onBlur:()=>{const p=l.trim();p&&(t.title??"")!==p?i.mutate({id:t.id,title:p}):p||d(t.title??"")},placeholder:"Titel van deze afbeelding",className:"h-8 text-xs"})]}),e.jsxs("div",{className:"space-y-1",children:[e.jsx(f,{className:"text-[11px] text-muted-foreground",children:"Omschrijving"}),e.jsx(_,{value:n,onChange:p=>m(p.target.value),onBlur:()=>{(t.notes??"")!==n&&i.mutate({id:t.id,notes:n})},placeholder:"Wat moet de AI hier uit meenemen? Meerdere regels mogen.",rows:4,className:"min-h-[88px] text-xs"})]}),!n.trim()&&e.jsxs("p",{className:"flex items-start gap-1 text-[11px] text-destructive",children:[e.jsx(P,{className:"mt-0.5 h-3 w-3 shrink-0"}),"Zonder toelichting moet de AI het beeld zelf interpreteren â beschrijf kort de regel."]}),e.jsxs(v,{size:"sm",variant:"ghost",className:"w-full text-xs",onClick:()=>o.mutate(t),disabled:o.isPending,children:[e.jsx(z,{className:"mr-2 h-3.5 w-3.5"}),"Verwijderen"]})]})}function ae({dnaId:t}){const{data:r,isLoading:g}=S(t),l=(r??[]).map(a=>a.storage_path),{data:d}=W(l),n=$(t),m=u.useRef(null),[i,o]=u.useState(!1),p=u.useRef(n);p.current=n;const x=u.useCallback(a=>{const h=a.filter(c=>c.type.startsWith("image/"));
1return h.length?(h.forEach(c=>{const s=c.name&&c.name!=="image.png"?c:new File([c],`plakken-${new Date().toISOString().slice(0,19)}.png`,{type:c.type||"image/png"});p.current.mutate({file:s})}),!0):!1},[]);return u.useEffect(()=>{const a=h=>{const c=h.target;if(c&&(c.isContentEditable||["INPUT","TEXTAREA","SELECT"].includes(c.tagName)))return;const N=Array.from(h.clipboardData?.items??[]).filter(j=>j.kind==="file"&&j.type.startsWith("image/")).map(j=>j.getAsFile()).filter(j=>!!j);x(N.length?N:Array.from(h.clipboardData?.files??[]))&&h.preventDefault()};return document.addEventListener("paste",a),()=>document.removeEventListener("paste",a)},[x]),e.jsxs("div",{className:"space-y-3",children:[e.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-2",children:[e.jsxs(f,{className:"flex items-center gap-2",children:[e.jsx(G,{className:"h-4 w-4"}),"Afbeeldingen bij dit DNA"]}),e.jsxs(v,{size:"sm",variant:"outline",onClick:()=>m.current?.click(),disabled:n.isPending,children:[n.isPending?e.jsx(D,{className:"mr-2 h-4 w-4 animate-spin"}):e.jsx(Z,{className:"mr-2 h-4 w-4"}),"Afbeelding uploaden"]}),e.jsx("input",{ref:m,type:"file",accept:"image/*",multiple:!0,className:"hidden",onChange:a=>{x(Array.from(a.target.files??[])),a.target.value=""}})]}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"De afbeeldingen gaan als beeld mee na
1ar de AI bij plannen, schermontwerpen en documentatie. De toelichting bepaalt wat er uit moet worden overgenomen â beschrijf dus kort de regel."}),e.jsxs("div",{role:"button",tabIndex:0,"aria-label":"Afbeelding plakken of hierheen slepen",onDragOver:a=>{a.preventDefault(),o(!0)},onDragLeave:()=>o(!1),onDrop:a=>{a.preventDefault(),o(!1),x(Array.from(a.dataTransfer.files??[]))},onClick:()=>m.current?.click(),onKeyDown:a=>{(a.key==="Enter"||a.key===" ")&&(a.preventDefault(),m.current?.click())},className:`flex cursor-pointer items-center justify-center gap-2 rounded-lg border border-dashed px-3 py-4 text-xs transition-colors ${i?"border-primary bg-primary/10 text-foreground":"border-border bg-muted/30 text-muted-foreground hover:border-primary/60"}`,children:[e.jsx(J,{className:"h-4 w-4"}),"Plak met Ctrl+V (of Cmd+V) â waar je ook staat op deze pagina â sleep een afbeelding hierheen, of klik om te uploaden."]}),g?e.jsx("p",{className:"text-xs text-muted-foreground",children:"Afbeeldingen ladenâ¦"}):(r??[]).length===0?e.jsx("p",{className:"text-xs text-muted-foreground",children:"Nog geen afbeeldingen toegevoegd."}):e.jsx("div",{className:"grid gap-3 sm:grid-cols-3 lg:grid-cols-4",children:(r??[]).map(a=>e.jsx(te,{asset:a,url:d?.[a.storage_path],dnaId:t},a.id))})]})}const se=`## Wat is dit product 2AerOn is de radio-automatisering (playout + planning) van Nextwave Broadcast. 3 4## Onmisbare werkwijzen (nooit wegontwerpen) 5- Sleutelbegrippen: uurklok, jingle-separatie, rotatie, criteria 1 en 2, weekdeel/jaardeel. 6- Een DJ werkt met sneltoetsen; muis is secundair. 7 8## UI-wetten 9- Dichte informatiedichtheid: veel data per scherm, geen luchtige marketing-layout. 10- Kritieke acties (start/stop/next) altijd op dezelfde plek en met kleurcode. 11 12## Taal en termen 13- Nederlands in de UI; Aeron-termen exact aanhouden (geen synoniemen bedenken). 14 15## Techniek en grenzen 16- Delphi/VCL, NexusDB/PostgreSQL; geen breaking changes in bestaande databankvelden. 17 18## Verboden 19- Geen mock-data, geen wizard die bestaande workflow vervangt.`;function re({item:t}){const[r,g]=u.useState(t),[l,d]=u.useState(t.keywords.join(", ")),n=T(),m=q(),{data:i}=S(t.id);u.useEffect(()=>{g(t),d(t.keywords.join(", "))},[t]);const o=s=>g(N=>({...N,...s})),p=()=>n.mutate({...r,keywords:l.split(",").map(s=>s.trim()).filter(Boolean)}),x=(i??[]).length,a=!!t.dna_markdown.trim()||x>0,h=t.always_apply||t.keywords.length>0||!!t.product_name.trim(),c=t.is_active&&a&&h;return e.jsxs(k,{children:[e.jsxs(I,{children:[e.jsxs(M,{className:"flex flex-wrap items-center gap-2 text-base",children:[e.jsx(E,{className:"h-4 w-4"}),r.product_name||"Nieuw product",r.always_apply&&e.jsx(w,{variant:"secondary",children:"Altijd toepassen"}),!r.is_active&&e.jsx(w,{variant:"outline",children:"Uit"}),c?e.jsxs(w,{className:"gap-1",children:[e.jsx(ee,{className:"h-3 w-3"}),"Wordt toegepast",x>0&&` · ${x} beeld${x===1?"":"en"}`]}):e.jsxs(w,{variant:"destructive",className:"gap-1",children:[e.jsx(P,{className:"h-3 w-3"}),"Wordt overgeslagen"]})]}),e.jsx(B,{children:c?"Deze regel gaat als leidende instructie mee naar de AI bij plannen, user stories, schermontwerpen en documentatie. Afbeeldingen gaan als beeld mee.":t.is_active?"Nog leeg: vul de DNA-tekst in of voeg minstens één afbeelding toe, anders wordt deze regel bij een run overgeslagen.":'Staat uit: zet "Actief" aan om deze regel te laten meegaan.'})]}),e.jsxs(y,{className:"space-y-4",children:[e.jsxs("div",{className:"grid gap-3 sm:grid-cols-3",children:[e.jsxs("div",{className:"space-y-1.5",children:[e.jsx(f,{children:"Productnaam"}),e.jsx(b,{value:r.product_name,onChange:s=>o({product_name:s.target.value}),placeholder:"AerOn"})]}),e.jsxs("div",{className:"space-y-1.5",children:[e.jsx(f,{children:"Soort applicatie"}),e.jsxs(L,{value:r.platform??"geen",onValueChange:s=>o({platform:s==="geen"?null:s}),children:[e.jsx(U,{children:e.jsx(O,{})}),e.jsxs(V,{children:[e.jsx(A,{value:"geen",children:"Niet gebonden"}),R.map(s=>e.jsx(A,{value:s.value,children:s.label},s.value))]})]})]}),e.jsxs("div",{className:"space-y-1.5",children:[e.jsx(f,{children:"Trefwoorden (komma-gescheiden)"}
19),e.jsx(b,{value:l,onChange:s=>d(s.target.value),placeholder:"aeron, playout, uurklok"})]})]}),e.jsxs("div",{className:"space-y-1.5",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(f,{children:"DNA (markdown)"}),!r.dna_markdown.trim()&&e.jsxs(v,{size:"sm",variant:"ghost",onClick:()=>o({dna_markdown:se}),children:[e.jsx(Q,{className:"mr-2 h-4 w-4"}),"Voorbeeld invullen"]})]}),e.jsx(_,{rows:16,className:"font-mono text-xs",value:r.dna_markdown,onChange:s=>o({dna_markdown:s.target.value}),placeholder:"Werkwijzen, termen, UI-wetten, techniek en verbodenâ¦"})]}),e.jsx("div",{className:"rounded-lg border bg-muted/30 p-3",children:e.jsx(ae,{dnaId:t.id})}),e.jsxs("div",{className:"flex flex-wrap items-center gap-6",children:[e.jsxs("label",{className:"flex items-center gap-2 text-sm",children:[e.jsx(C,{checked:r.always_apply,onCheckedChange:s=>o({always_apply:s})}),"Altijd toepassen (ook zonder trefwoord-match)"]}),e.jsxs("label",{className:"flex items-center gap-2 text-sm",children:[e.jsx(C,{checked:r.is_active,onCheckedChange:s=>o({is_active:s})}),"Actief"]})]}),e.jsxs("div",{className:"flex flex-wrap gap-2",children:[e.jsxs(v,{onClick:p,disabled:n.isPending||!r.product_name.trim(),children:[n.isPending?e.jsx(D,{className:"mr-2 h-4 w-4 animate-spin"}):e.jsx(X,{className:"mr-2 h-4 w-4"}),"Opslaan"]}),e.jsxs(v,{variant:"ghost",onClick:()=>m.mutate(t.id),disabled:m.isPending,children:[e.jsx(z,{className:"mr-2 h-4 w-4"}),"Verwijderen"]})]})]})]})}function Ze(){const{data:t,isLoading:r}=H(),g=T(),l=t??[],[d,n]=u.useState(null);u.useEffect(()=>{if(!l.length){d!==null&&n(null);return}(!d||!l.some(i=>i.id===d))&&n(l[0].id)},[l,d]);const m=l.find(i=>i.id===d)??null;return e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{className:"flex flex-wrap items-start justify-between gap-4",children:[e.jsxs("div",{className:"space-y-1",children:[e.jsx("h1",{className:"text-2xl font-black uppercase tracking-tight",children:"Product-DNA"}),e.jsx("p",{className:"max-w-3xl text-sm text-muted-foreground",children:"Leg hier per product vast wat altijd waar is: werkwijzen, vaste termen, UI-wetten, technische grenzen en wat nooit mag. Bij elke pipeline-run wordt het DNA van het herkende product bovenaan de brontekst meegestuurd, zodat nieuwe plannen en ontwerpen hier rekening mee houden. Herkenning gaat via de productnaam en de trefwoorden."})]}),e.jsxs(v,{onClick:()=>g.mutate({product_name:"Nieuw product",dna_markdown:""}),disabled:g.isPending,children:[e.jsx(Y,{className:"mr-2 h-4 w-4"}),"DNA toevoegen"]})]}),r?e.jsx(k,{children:e.jsx(y,{className:"py-10 text-center text-sm text-muted-foreground",children:"DNA ladenâ¦"})}):l.length===0?e.jsx(k,{children:e.jsx(y,{className:"py-10 text-center text-sm text-muted-foreground",children:"Nog geen product-DNA vastgelegd."})}):e.jsxs("div",{className:"grid gap-6 lg:grid-cols-[240px_1fr]",children:[e.jsx("nav",{"aria-label":"Product-DNA's",className:"space-y-1",children:l.map(i=>{const o=i.id===d;return e.jsxs("button",{type:"button",onClick:()=>n(i.id),className:`flex w-full items-center gap-2 rounded-lg border px-3 py-2 text-left text-sm transition-colors ${o?"border-primary bg-primary/10 font-semibold":"border-border bg-card hover:border-primary/50"}`,children:[e.jsx(E,{className:"h-4 w-4 shrink-0"}),e.jsx("span",{className:"truncate",children:i.product_name||"Nieuw product"}),!i.is_active&&e.jsx(w,{variant:"outline",className:"ml-auto shrink-0",children:"Uit"})]},i.id)})}),m&&e.jsx(re,{item:m},m.id)]})]})}export{Ze as default};
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.