# Screen-fájl struktúra — hordozható sablon

**Mire való.** Ezt a fájlt add oda Claude-nak egy MÁSIK projektben, és kérd: *„Az itt leírt struktúra szerint építsd a screen-mock HTML-fájlokat."* Projekt-független: nincs benne hivatkozás konkrét spec-re, organizmusra vagy fájlra — csak a minta.

---

## 0. Mappa-szerkezet

```
design-system/
  colors_and_type.css              ← tokenek (--u-* CSS-változók) + tipográfia
  components/<komponens>.css       ← per-komponens DS-CSS (button, card, input, …)
<termek>-system/
  data/mock.js                     ← chrome-mock: tenant + currentUser + navCounts
  organisms/
    _styles.css                    ← MINDEN organism CSS-e egy fájlban (.mgr-* prefix)
    icon.jsx                       ← Icon-komponens (Lucide-stílusú inline SVG map)
    <organism>.jsx                 ← 1 fájl / organism, window-ra exportálva
  preview/screens/
    <azonosito>-<nev>.html         ← screen-mock fájlok (ez a sablon róluk szól)
design-canvas.jsx                  ← DesignCanvas + DCSection + DCArtboard (starter komponens — kérd Claude-tól)
```

---

## 1. A screen-fájl 4 kötelező blokkja (sorrendben)

```html
<!doctype html>
<html lang="hu">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title><Termék> · S<N> — <Screen-azonosító> <Screen-név> (screen)</title>

<!-- ── 1. BUNDLER-THUMBNAIL (splash offline-bundle-höz) ── -->
<template id="__bundler_thumbnail" data-bg-color="#2E63EB">
  <svg viewBox="0 0 1200 800" xmlns="http://www.w3.org/2000/svg">
    <text x="600" y="370" font-family="system-ui,sans-serif" font-size="56"
          font-weight="700" fill="#fff" text-anchor="middle"><Screen-név></text>
    <text x="600" y="420" font-family="system-ui,sans-serif" font-size="22"
          fill="#fff" fill-opacity="0.7" text-anchor="middle"><állapotszám> állapot · screen-mock</text>
  </svg>
</template>

<!-- ── 2. CSS LINK-SOR — DS előbb, termék-organism utoljára ── -->
<link rel="stylesheet" href="../../../design-system/colors_and_type.css">
<link rel="stylesheet" href="../../../design-system/components/layout.css">
<!-- …csak az adott screenen HASZNÁLT DS-komponens-CSS-ek… -->
<link rel="stylesheet" href="../../organisms/_styles.css">  <!-- MINDIG UTOLSÓ -->

<!-- ── 3. INLINE CSS — screen-scope szabályok ── -->
<style>
  html, body { margin: 0; padding: 0; height: 100%; background: #f0eee9; }
  body { font-family: var(--u-font-sans); display: flex; flex-direction: column; min-height: 100%; }
  *, *::before, *::after { box-sizing: border-box; }
  button { font-family: inherit; }
  #root { flex: 1; min-height: 0; }

  /* screen-header sablon — l. 4. szekció, copy-paste */
  /* .<prefix>-page > * + * { margin-top: var(--u-space-4); }  ← flow-spacing */
  /* .<prefix>-* per-screen helper-osztályok */
</style>
</head>
<body class="<termek-body-class>">

<!-- ── 4a. SCREEN-HEADER (dokumentációs banner, mock-only) ── -->
<header class="screen-header">
  <div class="screen-header__id">A1</div>
  <div class="screen-header__body">
    <h1 class="screen-header__title">Screen-név <code>/url/utvonal</code></h1>
    <p class="screen-header__purpose">1–2 mondat: mit csinál a screen, kinek. (~120–200 char)</p>
    <div class="screen-header__refs">
      <span><strong>Spec:</strong> <code>spec-fajl.md</code> §x.y</span>
      <span><strong>Döntések:</strong> D-1, D-2</span>
    </div>
  </div>
</header>

<!-- ── 4b. ROOT + SCRIPT-SOR ── -->
<div id="root"></div>
<script src="https://unpkg.com/react@18.3.1/umd/react.development.js" integrity="sha384-hD6/rw4ppMLGNu3tX5cjIb+uRZ7UkRJ6BPkLpg4hAu/6onKUg4lLsHAs9EBPT82L" crossorigin="anonymous"></script>
<script src="https://unpkg.com/react-dom@18.3.1/umd/react-dom.development.js" integrity="sha384-u6aeetuaXnQ38mYT8rp6sbXaQe3NL9t+IBXmnYxwkUI2Hw4bsp2Wvmx4yRQF1uAm" crossorigin="anonymous"></script>
<script src="https://unpkg.com/@babel/standalone@7.29.0/babel.min.js" integrity="sha384-m08KidiNqLdpJqLq95G/LEi8Qvjl/xUYll3QILypMoQ65QorJ9Lvtp2RXYGBFj1y" crossorigin="anonymous"></script>
<script src="../../data/mock.js"></script>
<script type="text/babel" src="../../../design-canvas.jsx"></script>
<script type="text/babel" src="../../organisms/icon.jsx"></script>   <!-- MINDIG az első organism -->
<script type="text/babel" src="../../organisms/<tovabbi>.jsx"></script> <!-- függés-rendben -->
<script type="text/babel">
  /* A. Mock-adat (per-screen, a blokk tetején, kommentált szeparátorral) */
  /* B. Helper-komponensek (Cell/Row/Card/Section) */
  /* C. State-komponensek: StateNormal, StateLoading, StateEmpty, … */
  /* D. <App> — DesignCanvas + DCSection + DCArtboard mátrix */
  /* E. ReactDOM.createRoot(document.getElementById('root')).render(<App />); */
</script>
</body>
</html>
```

---

## 2. CSS link-sorrend (KÖTELEZŐ)

1. `design-system/colors_and_type.css` — tokenek
2. `design-system/components/layout.css` — page-keret
3. per-screen szükséges DS-komponens-CSS-ek (csak a használtak!)
4. `<termek>-system/organisms/_styles.css` — **mindig utolsó**

**Miért:** cascade — az organism-szabályoknak felül kell tudniuk írni a DS-defaultokat.

## 3. Script-sorrend (KÖTELEZŐ)

1. React + ReactDOM + Babel — **pinned verzió + integrity-hash** (l. fenti skeleton, szó szerint)
2. `data/mock.js` — chrome-mock
3. `design-canvas.jsx`
4. `organisms/icon.jsx` — mindig első organism (minden más függ tőle)
5. többi organism **függés-rendben**: ha X organism fogyasztja Y-t (`window.Y`), Y script-tagje előbb áll

**Miért:** a `Object.assign(window, {…})` exportok tag-sorrendben futnak; a fogyasztó `undefined`-et kap, ha előbb fut.

## 4. Screen-header (dokumentációs banner)

Kék banner a `<body>` tetején, a `#root` ELŐTT. **Mock-only** — production-portoláskor eltűnik. CSS-e minden screen-fájl `<style>` blokkjában inline (nem a globális CSS-ben):

```css
.screen-header { flex-shrink: 0; background: var(--u-blue-50);
  border-bottom: 1px solid var(--u-blue-200); padding: 20px 32px;
  display: flex; align-items: flex-start; gap: 18px; }
.screen-header__id { flex-shrink: 0; width: 44px; height: 44px; border-radius: 10px;
  background: var(--u-primary); color: white; display: inline-flex;
  align-items: center; justify-content: center;
  font-family: var(--u-font-display); font-size: 18px; font-weight: 700; }
.screen-header__body { flex: 1; min-width: 0; }
.screen-header__title { font-family: var(--u-font-display); font-size: 18px;
  font-weight: 700; margin: 0 0 4px; line-height: 1.3; color: var(--u-fg-1); }
.screen-header__title code { font-family: var(--u-font-mono); font-size: 13.5px;
  background: white; color: var(--u-blue-700); padding: 1px 7px; border-radius: 4px;
  border: 1px solid var(--u-blue-200); margin-left: 6px; vertical-align: middle; }
.screen-header__purpose { font-size: 13px; color: var(--u-fg-2); margin: 0 0 8px;
  line-height: 1.5; max-width: 900px; text-wrap: pretty; }
.screen-header__refs { display: flex; gap: 18px; flex-wrap: wrap;
  font-size: 12px; color: var(--u-fg-2); }
```

**Ne keverd** a `PageHeader` organizmussal: az a renderelt UI része (React-fán belül), a `screen-header` a mock-fájl dokumentációja (React-fán kívül).

## 5. Állapot-mátrix — DesignCanvas

Minden screen a saját állapotait `DCArtboard`-onként mutatja, 1–2 `DCSection`-be csoportosítva:

```jsx
const W = 1280;            // desktop-screen szélesség (mobil: 375, explorer: 820–960)
const H_NORMAL = 1280;     // per-state fix magasság-konstansok
const H_LOADING = 900;

const App = () => (
  <DesignCanvas>
    <DCSection id="primary" title="<Azonosító> <név> — fő állapot" subtitle="…">
      <DCArtboard id="normal" label="1 · Normál snapshot — <részlet>" width={W} height={H_NORMAL}>
        <StateNormal />
      </DCArtboard>
    </DCSection>
    <DCSection id="states" title="<Azonosító> <név> — másodlagos állapotok" subtitle="…">
      <DCArtboard id="loading" label="2 · Loading skeleton" width={W} height={H_LOADING}>
        <StateLoading />
      </DCArtboard>
    </DCSection>
  </DesignCanvas>
);
```

- `id`: snake_case (`normal`, `loading-overlay`, `first-time`)
- `label`: `<sorszám> · <rövid magyarázat> — <részlet>`
- `height`: fix konstans state-enként — az artboard snapshot, nem responsive konténer

## 6. Mock-adat konvenció

- **Chrome-mock** (`data/mock.js`): tenant-név, bejelentkezett user, nav-badge-számok — az AppShell fogyasztja.
- **Tartalmi mock**: per-screen inline, a babel-blokk TETEJÉN, kommentált fejezettel.
- Enum-értékek kisbetűs gépi kulcsok (`status: 'jovahagyva'`), a display-szöveg külön map (`STATUS_LABELS`).
- ID-k egész számok; displayId-k spec-formátumúak (`'XX-2026-1058'`).
- Személynevek/e-mailek screen-ek KÖZÖTT konzisztensek (ugyanaz a név → ugyanaz az e-mail).

## 7. Naming

- **Screen-scope CSS-prefix**: `.a1-*` (lista), `.a1d-*` (adatlap-suffix), `.a1m-*` (mobil) — screenenként egyedi, BEM-szerű (`__elem`, `--mod`).
- **Organism-CSS**: `.mgr-<organism>-*` (vagy termék-prefix) — CSAK az `_styles.css`-ben.
- Screen-fájl inline CSS-ében organism-prefixű szabály NEM szerepelhet (szivárgás-tilalom).
- **React-komponensek**: `State<X>` az artboard-szintű állapotok; `<X>Cell/Row/Card/Section` a helperek; a helperek NEM kerülnek `window`-ra.

## 8. Inline CSS — mi mehet hova

| Hely | Tartalom |
|---|---|
| `organisms/_styles.css` | organism-szintű, több screenen újrahasznált |
| screen-fájl `<style>` | csak az adott screen layout-mintái (screen-prefixszel) |
| `style={}` inline | CSAK valóban dinamikus érték (pl. `width: pct + '%'`) |

## 9. Ikonok

Egységes komponens: `<Icon name="plus" size={14} />` — méret-skála: 14 (gomb-belső) / 16 (táblázat-sor) / 20 (page-header, nav) / 28 (empty-state, KPI). Szín mindig `currentColor`. Hiányzó ikon → új key az `icon.jsx` map-jébe, SOHA nem inline SVG a screen-fájlban.

---

## Prompt-minta az új projekthez

> „Csatolom a SCREEN-STRUCTURE-PORTABLE.md-t. Minden screen-mock HTML-fájlt pontosan az ebben leírt 4-blokkos struktúrával építs: bundler-thumbnail, DS-CSS-link-sor (organism-CSS utolsónak), screen-header banner, majd root + pinned React/Babel + mock.js + design-canvas + organizmusok függés-rendben, végül inline babel-blokk (mock-adat → helperek → State-komponensek → DesignCanvas-mátrix). Használd a design_canvas starter komponenst."
