Compare commits
45 Commits
1d0328d8eb
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7518baccfa | ||
|
|
620e41edae | ||
|
|
50dc415987 | ||
|
|
be4b2c6000 | ||
|
|
37baeb9172 | ||
|
|
45775c8c3f | ||
|
|
18d5b42136 | ||
|
|
4c618781f6 | ||
|
|
e62c6f07df | ||
|
|
488845ae1f | ||
|
|
9ea006ec22 | ||
|
|
a5c2bcbc4d | ||
|
|
c2aba25814 | ||
|
|
2278d2a218 | ||
|
|
0b92f999bc | ||
|
|
cc9686147e | ||
|
|
bd613adb8a | ||
|
|
205743f3b1 | ||
|
|
a8bd13ef43 | ||
|
|
647a44e46a | ||
|
|
6495369c56 | ||
|
|
b4effc8545 | ||
|
|
6bd210075f | ||
|
|
716f7bb3fb | ||
|
|
f27f3ffaac | ||
|
|
ff66480227 | ||
|
|
b3dd36fa72 | ||
|
|
55eb32b22a | ||
|
|
8cf0c3267d | ||
|
|
569b9e5da2 | ||
|
|
acb3b9d557 | ||
|
|
1583d424fd | ||
|
|
60e81e266d | ||
|
|
736a6fabf0 | ||
|
|
65d630d754 | ||
|
|
e74710a20a | ||
|
|
9139977cd6 | ||
|
|
a1b2c4b069 | ||
|
|
36008bb72a | ||
|
|
2c542e7756 | ||
|
|
dc6d894a37 | ||
|
|
40a1c8ef8e | ||
|
|
7288c926d0 | ||
|
|
d93cf742ff | ||
|
|
209d203fe8 |
197
.agents/skills/prototype/PICKER.md
Normal file
@@ -0,0 +1,197 @@
|
|||||||
|
# The Picker
|
||||||
|
|
||||||
|
The picker's appearance is **not a design decision** — it is this spec. Copy the markup, CSS, and wiring below verbatim; the only values that change per run are the variant names and count. It stays identical across every project so it always reads as harness chrome, never as part of the design being judged. Do not restyle it with the project's tokens, fonts, or colors.
|
||||||
|
|
||||||
|
It is a floating dark pill, bottom-center. Dark glass works on top of any page — light or dark — which is why it is not theme-aware.
|
||||||
|
|
||||||
|
## Markup
|
||||||
|
|
||||||
|
The sliding highlight span first, one button per variant, a hairline divider, then the replay button (only when at least one variant has motion to re-trigger):
|
||||||
|
|
||||||
|
```html
|
||||||
|
<nav class="proto-picker" aria-label="Prototype variants">
|
||||||
|
<span class="proto-picker-highlight" aria-hidden="true"></span>
|
||||||
|
<button class="proto-picker-item" data-active aria-current="true">Quiet</button>
|
||||||
|
<button class="proto-picker-item">Editorial</button>
|
||||||
|
<button class="proto-picker-item">Playful</button>
|
||||||
|
<span class="proto-picker-divider" aria-hidden="true"></span>
|
||||||
|
<button class="proto-picker-item proto-picker-replay" aria-label="Replay animation (R)">↻</button>
|
||||||
|
</nav>
|
||||||
|
```
|
||||||
|
|
||||||
|
In a framework, keep the class names and structure; only the rendering syntax changes.
|
||||||
|
|
||||||
|
## Styles
|
||||||
|
|
||||||
|
```css
|
||||||
|
.proto-picker {
|
||||||
|
position: fixed;
|
||||||
|
bottom: 24px;
|
||||||
|
left: 50%;
|
||||||
|
transform: translateX(-50%);
|
||||||
|
z-index: 2147483647;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 2px;
|
||||||
|
padding: 4px;
|
||||||
|
border-radius: 999px;
|
||||||
|
background: rgba(10, 10, 10, 0.82);
|
||||||
|
-webkit-backdrop-filter: blur(12px) saturate(1.4);
|
||||||
|
backdrop-filter: blur(12px) saturate(1.4);
|
||||||
|
box-shadow:
|
||||||
|
0 0 0 1px rgba(255, 255, 255, 0.08) inset,
|
||||||
|
0 8px 24px rgba(0, 0, 0, 0.24),
|
||||||
|
0 2px 6px rgba(0, 0, 0, 0.12);
|
||||||
|
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
|
||||||
|
font-size: 13px;
|
||||||
|
line-height: 1;
|
||||||
|
-webkit-font-smoothing: antialiased;
|
||||||
|
user-select: none;
|
||||||
|
-webkit-user-select: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.proto-picker-highlight {
|
||||||
|
position: absolute;
|
||||||
|
top: 4px;
|
||||||
|
left: 0;
|
||||||
|
height: 28px;
|
||||||
|
border-radius: 999px;
|
||||||
|
background: rgba(255, 255, 255, 0.12);
|
||||||
|
will-change: transform;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* The slide is enabled only after first paint (data-ready), so load doesn't animate. */
|
||||||
|
.proto-picker[data-ready] .proto-picker-highlight {
|
||||||
|
transition:
|
||||||
|
transform 250ms cubic-bezier(0.23, 1, 0.32, 1),
|
||||||
|
width 250ms cubic-bezier(0.23, 1, 0.32, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (prefers-reduced-motion: reduce) {
|
||||||
|
.proto-picker[data-ready] .proto-picker-highlight { transition: none; }
|
||||||
|
}
|
||||||
|
|
||||||
|
.proto-picker-item {
|
||||||
|
position: relative; /* sits above the highlight */
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
height: 28px;
|
||||||
|
padding: 0 12px;
|
||||||
|
border: 0;
|
||||||
|
border-radius: 999px;
|
||||||
|
background: transparent;
|
||||||
|
color: rgba(255, 255, 255, 0.55);
|
||||||
|
font: inherit;
|
||||||
|
cursor: pointer;
|
||||||
|
transition: color 150ms ease-out;
|
||||||
|
}
|
||||||
|
|
||||||
|
.proto-picker-item:hover {
|
||||||
|
color: rgba(255, 255, 255, 0.85);
|
||||||
|
}
|
||||||
|
|
||||||
|
.proto-picker-item:active {
|
||||||
|
transform: scale(0.97);
|
||||||
|
}
|
||||||
|
|
||||||
|
.proto-picker-item:focus-visible {
|
||||||
|
outline: 2px solid rgba(255, 255, 255, 0.4);
|
||||||
|
outline-offset: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.proto-picker-item[data-active] {
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.proto-picker-divider {
|
||||||
|
width: 1px;
|
||||||
|
height: 16px;
|
||||||
|
margin: 0 4px;
|
||||||
|
background: rgba(255, 255, 255, 0.12);
|
||||||
|
}
|
||||||
|
|
||||||
|
.proto-picker-replay {
|
||||||
|
padding: 0 10px;
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.proto-picker[data-position="top"] {
|
||||||
|
bottom: auto;
|
||||||
|
top: 24px;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Rules
|
||||||
|
|
||||||
|
- **Verbatim.** These values are the spec. No project fonts, no brand colors, no theme switching, no extra shadows or borders.
|
||||||
|
- **The highlight slides; the variant swap stays instant.** The active pill animates between buttons (250ms, strong ease-out) as spatial feedback on the picker itself — but the variant being previewed still switches with no transition. The `width` transition is a deliberate exception to the transform/opacity rule: the element is 28px tall, absolutely positioned, and has no layout dependents, so the paint cost is negligible.
|
||||||
|
- **One allowed modification:** if a variant occupies the bottom-center of the screen (a toast stack, a bottom sheet, a dock), set `data-position="top"` so the picker never covers the work. Nothing else about it may move or change.
|
||||||
|
- **Replay is conditional.** Render the replay button and its divider only when at least one variant has an entrance or state animation worth re-triggering; a static comparison gets a shorter pill.
|
||||||
|
|
||||||
|
## Behavior contract
|
||||||
|
|
||||||
|
The contract is fixed regardless of how the harness renders:
|
||||||
|
|
||||||
|
- Number keys `1–N` and `←`/`→` switch variants; `R` replays. Ignore key events when focus is in an input, textarea, select, or contenteditable, or when a modifier is held.
|
||||||
|
- Clicking an item switches to it; exactly one item carries `data-active` and `aria-current="true"` at all times, and the highlight slides to it.
|
||||||
|
- Selection persists across reload via a URL param (`?v=2`), falling back to variant 1. The highlight takes its initial position without animating (`data-ready` is added after first paint).
|
||||||
|
- Switching re-mounts the variant (so entrance animations re-run); the replay key re-mounts without switching.
|
||||||
|
|
||||||
|
## Reference wiring
|
||||||
|
|
||||||
|
Verbatim for the standalone-HTML branch; in a framework, keep the same behavior but express it idiomatically (state instead of `innerHTML`, a keyed re-mount instead of `requestAnimationFrame`, refs + a layout effect for the highlight measurement).
|
||||||
|
|
||||||
|
```js
|
||||||
|
// `variants` is an array of render functions, one per variant, in picker order.
|
||||||
|
const stage = document.getElementById('stage');
|
||||||
|
const picker = document.querySelector('.proto-picker');
|
||||||
|
const highlight = picker.querySelector('.proto-picker-highlight');
|
||||||
|
const items = [...picker.querySelectorAll('.proto-picker-item:not(.proto-picker-replay)')];
|
||||||
|
const replay = picker.querySelector('.proto-picker-replay');
|
||||||
|
let current = 0;
|
||||||
|
|
||||||
|
function moveHighlight() {
|
||||||
|
const el = items[current];
|
||||||
|
highlight.style.width = el.offsetWidth + 'px';
|
||||||
|
highlight.style.transform = `translateX(${el.offsetLeft}px)`;
|
||||||
|
}
|
||||||
|
|
||||||
|
function mount(i) {
|
||||||
|
stage.innerHTML = '';
|
||||||
|
// Clear first, render next frame, so entrance animations re-run.
|
||||||
|
requestAnimationFrame(() => { stage.innerHTML = variants[i](); });
|
||||||
|
}
|
||||||
|
|
||||||
|
function setActive(i) {
|
||||||
|
if (i < 0 || i >= variants.length) return;
|
||||||
|
current = i;
|
||||||
|
items.forEach((el, j) => {
|
||||||
|
el.toggleAttribute('data-active', j === i);
|
||||||
|
if (j === i) el.setAttribute('aria-current', 'true');
|
||||||
|
else el.removeAttribute('aria-current');
|
||||||
|
});
|
||||||
|
moveHighlight();
|
||||||
|
const url = new URL(location);
|
||||||
|
url.searchParams.set('v', i + 1);
|
||||||
|
history.replaceState(null, '', url);
|
||||||
|
mount(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
items.forEach((el, i) => el.addEventListener('click', () => setActive(i)));
|
||||||
|
replay?.addEventListener('click', () => mount(current));
|
||||||
|
window.addEventListener('resize', moveHighlight);
|
||||||
|
|
||||||
|
document.addEventListener('keydown', (e) => {
|
||||||
|
if (/^(INPUT|TEXTAREA|SELECT)$/.test(e.target.tagName) || e.target.isContentEditable) return;
|
||||||
|
if (e.metaKey || e.ctrlKey || e.altKey) return;
|
||||||
|
const num = parseInt(e.key, 10);
|
||||||
|
if (num >= 1 && num <= variants.length) setActive(num - 1);
|
||||||
|
else if (e.key === 'ArrowRight') setActive((current + 1) % variants.length);
|
||||||
|
else if (e.key === 'ArrowLeft') setActive((current - 1 + variants.length) % variants.length);
|
||||||
|
else if (e.key === 'r' || e.key === 'R') mount(current);
|
||||||
|
});
|
||||||
|
|
||||||
|
setActive((parseInt(new URLSearchParams(location.search).get('v'), 10) || 1) - 1);
|
||||||
|
// Enable the slide only after first paint, so load doesn't animate.
|
||||||
|
requestAnimationFrame(() => requestAnimationFrame(() => picker.setAttribute('data-ready', '')));
|
||||||
|
```
|
||||||
90
.agents/skills/prototype/SKILL.md
Normal file
@@ -0,0 +1,90 @@
|
|||||||
|
---
|
||||||
|
name: prototype
|
||||||
|
description: Build multiple genuinely different versions of a UI piece you describe, rendered behind a visual picker so you can flip through them live and promote the one that feels right. Only runs when explicitly invoked; it does not trigger on its own.
|
||||||
|
disable-model-invocation: true
|
||||||
|
---
|
||||||
|
|
||||||
|
# Prototyping Variants
|
||||||
|
|
||||||
|
A divergence skill. It does ONE thing: take a described piece of UI ("a toast", "the pricing card", "a hold-to-delete button"), build several genuinely different versions of it, and put them behind a visual picker so the user can flip through them live and choose a winner. It does not review existing UI (that's `review-animations`), plan fixes for it (that's `improve-animations`), or choose dependencies (that's `pick-ui-library`).
|
||||||
|
|
||||||
|
## Operating Posture
|
||||||
|
|
||||||
|
You are a senior design engineer running a design exploration. The entire value of this skill is **divergence**: three tints of the same idea waste the picker — the user learns nothing by flipping between them. Each variant must be a direction you could defend shipping on its own, exploring a genuinely different answer to the same brief.
|
||||||
|
|
||||||
|
Divergence is not an excuse to drop the craft bar. Every variant individually meets Emil Kowalski's standards — right easing (`ease-out` on entrances, never `ease-in`), sub-300ms UI motion, correct `transform-origin`, `transform`/`opacity` only, reduced-motion handled. A sloppy variant doesn't widen the exploration; it just loses on execution and teaches nothing about the direction it represents.
|
||||||
|
|
||||||
|
## Hard Rules
|
||||||
|
|
||||||
|
1. **Never touch production code during exploration.** Everything lives in an isolated prototype surface (see Phase 4). Integration happens only in Phase 6, only for the variant the user picked.
|
||||||
|
2. **Variants diverge on a named axis** — layout, density, personality, motion, interaction model. Before building, you must be able to state each variant's axis in a phrase. Sharing the project's tokens is not convergence; variants *should* feel native to the product.
|
||||||
|
3. **Every variant fully works.** Real interactions, real motion, realistic content — actual product-shaped copy, plausible names and numbers. No lorem ipsum, no dead buttons, no "imagine this part".
|
||||||
|
4. **The picker is chrome, not a contestant.** Its exact markup, styles, and behavior are specified in [PICKER.md](PICKER.md) — copy them verbatim. Its look is not a design decision and never adapts to the project.
|
||||||
|
5. **Clean up after the choice.** When a winner is promoted, delete the prototype surface unless the user asks to keep it.
|
||||||
|
|
||||||
|
## Workflow
|
||||||
|
|
||||||
|
### Phase 1 — Scope
|
||||||
|
|
||||||
|
One thing per run. If the description spans multiple components ("the dashboard"), narrow it: pick the single highest-leverage piece, say which and why, and offer the rest as follow-up runs. Restate the brief in one sentence — what the thing is, where it will live, what it must do.
|
||||||
|
|
||||||
|
### Phase 2 — Recon
|
||||||
|
|
||||||
|
Before designing anything, map the ground the variants must stand on:
|
||||||
|
|
||||||
|
- **Stack**: framework, styling system (Tailwind, CSS modules, vanilla), motion library if any.
|
||||||
|
- **Tokens**: colors, radii, spacing, fonts, easing/duration variables. Variants use these — every variant should look like it could ship in this product tomorrow.
|
||||||
|
- **Personality**: playful consumer app or crisp dashboard? This bounds how far the boldest variant may go.
|
||||||
|
- **Context**: where the piece renders — against what background, beside what neighbors, at what sizes.
|
||||||
|
|
||||||
|
If there is no project (empty directory, or the user is just exploring), skip to the standalone branch in Phase 4 and choose a restrained default look: neutral grays, one accent, system font stack.
|
||||||
|
|
||||||
|
### Phase 3 — Choose directions
|
||||||
|
|
||||||
|
Default **3 variants**; up to 5 when the user asks or the design space is genuinely wide. More than 5 dilutes the comparison.
|
||||||
|
|
||||||
|
Before writing any code, list the set: a name and an axis for each. Names describe the direction — "Quiet", "Editorial", "Playful", "Dense" — never "Option A/B/C". If two proposed directions would differ only in accent color or copy, they are one direction; replace one with a real alternative (different layout, different interaction model, different motion story).
|
||||||
|
|
||||||
|
**Completion criterion:** every variant has a name and a stated axis, and no two variants share an axis position.
|
||||||
|
|
||||||
|
### Phase 4 — Build the picker harness
|
||||||
|
|
||||||
|
Two branches, by what exists:
|
||||||
|
|
||||||
|
- **In a project with a dev server** — an isolated route or page (`/prototypes/<slug>`, or the framework's equivalent), one file per variant plus a small harness file. Nothing imports from the prototype surface into production code.
|
||||||
|
- **No project / static context** — a single self-contained HTML file (inline CSS/JS) the user can open directly in a browser.
|
||||||
|
|
||||||
|
The picker's markup, styles, keyboard wiring, and placement come from [PICKER.md](PICKER.md), verbatim — load it now and build exactly that. Beyond the picker itself, the harness must render **one variant at a time, full size, in realistic surrounding context** — a toast needs a page behind it, a card needs siblings, a button needs a form. Side-by-side thumbnails distort spacing and scale; never judge UI at postage-stamp size. Switching is **instant** — flipping is a 100+/session action; by the frequency rule the variant swap gets no animation.
|
||||||
|
|
||||||
|
### Phase 5 — Verify and hand off
|
||||||
|
|
||||||
|
Run the harness. Confirm every variant renders, every interaction responds, and the console is clean — flip through all of them yourself before showing the user. If browser tooling is available, screenshot each variant.
|
||||||
|
|
||||||
|
Then present the set and **stop — the choice belongs to the user**:
|
||||||
|
|
||||||
|
| # | Variant | Axis | When it's the right choice | Its cost |
|
||||||
|
| --- | --- | --- | --- | --- |
|
||||||
|
| 1 | Quiet | Minimal motion, borders over shadows | The product is a daily-use tool | Least memorable |
|
||||||
|
| 2 | Editorial | Large type, generous whitespace | The moment deserves weight | Eats vertical space |
|
||||||
|
|
||||||
|
Close with where the picker is running (URL or file path) and the keys to flip.
|
||||||
|
|
||||||
|
**Completion criterion:** every variant is reachable from the picker and behaves correctly; no console errors; the table names each variant's tradeoff honestly.
|
||||||
|
|
||||||
|
### Phase 6 — Promote on selection
|
||||||
|
|
||||||
|
When the user picks: integrate that variant where it belongs, following the project's existing conventions (file layout, naming, token usage), then delete the prototype surface per Hard Rule 5. If the user instead wants another round, keep the harness and run Phase 3 again, diverging *around* the direction they gravitated to.
|
||||||
|
|
||||||
|
## Invocation Variants
|
||||||
|
|
||||||
|
| Invocation | Behavior |
|
||||||
|
| --- | --- |
|
||||||
|
| `<description>` | Full workflow: scope → recon → 3 variants → picker → wait for choice |
|
||||||
|
| `<description> x5` | Same, with that many variants (capped at 5) |
|
||||||
|
| `riff <variant>` | New round: keep the harness, generate a fresh set diverging around the named variant's direction |
|
||||||
|
| `keep <variant>` | Promote that variant into the codebase and delete the prototype surface |
|
||||||
|
| `keep <variant>, leave the picker` | Promote, but keep the prototype surface around |
|
||||||
|
|
||||||
|
## Tone
|
||||||
|
|
||||||
|
Sell each variant honestly — one line on when it wins, one on what it costs. Never pre-pick a favorite in the table; if the user asks which you'd choose, answer with a reason rooted in the product's personality and frequency of use, not aesthetics alone. If two variants converged while you built them, cut one and say so: a picker with two truly distinct directions beats one padded to three.
|
||||||
@@ -12,6 +12,12 @@
|
|||||||
"runtimeExecutable": "npm",
|
"runtimeExecutable": "npm",
|
||||||
"runtimeArgs": ["run", "dev", "--", "-p", "3100"],
|
"runtimeArgs": ["run", "dev", "--", "-p", "3100"],
|
||||||
"port": 3100
|
"port": 3100
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "prod-3100",
|
||||||
|
"runtimeExecutable": "pnpm",
|
||||||
|
"runtimeArgs": ["start", "-p", "3100"],
|
||||||
|
"port": 3100
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
20
.claude/settings.json
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
{
|
||||||
|
"enabledPlugins": {
|
||||||
|
"superpowers@superpowers-marketplace": false,
|
||||||
|
"prd-development@pm-skills": false
|
||||||
|
},
|
||||||
|
"extraKnownMarketplaces": {
|
||||||
|
"superpowers-marketplace": {
|
||||||
|
"source": {
|
||||||
|
"source": "github",
|
||||||
|
"repo": "obra/superpowers-marketplace"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"pm-skills": {
|
||||||
|
"source": {
|
||||||
|
"source": "github",
|
||||||
|
"repo": "deanpeters/Product-Manager-Skills"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
1
.claude/skills/prototype
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
../../.agents/skills/prototype
|
||||||
@@ -1,11 +1,11 @@
|
|||||||
---
|
---
|
||||||
name: ui-ux-pro-max
|
name: ui-ux-pro-max
|
||||||
description: "UI/UX design intelligence. 50 styles, 21 palettes, 50 font pairings, 20 charts, 9 stacks (React, Next.js, Vue, Svelte, SwiftUI, React Native, Flutter, Tailwind, shadcn/ui). Actions: plan, build, create, design, implement, review, fix, improve, optimize, enhance, refactor, check UI/UX code. Projects: website, landing page, dashboard, admin panel, e-commerce, SaaS, portfolio, blog, mobile app, .html, .tsx, .vue, .svelte. Elements: button, modal, navbar, sidebar, card, table, form, chart. Styles: glassmorphism, claymorphism, minimalism, brutalism, neumorphism, bento grid, dark mode, responsive, skeuomorphism, flat design. Topics: color palette, accessibility, animation, layout, typography, font pairing, spacing, hover, shadow, gradient. Integrations: shadcn/ui MCP for component search and examples."
|
description: "UI/UX design intelligence. 50 styles, 21 palettes, 50 font pairings, 20 charts, 4 stacks (Next.js, React, Tailwind, shadcn/ui). Actions: plan, build, create, design, implement, review, fix, improve, optimize, enhance, refactor, check UI/UX code. Projects: website, landing page, dashboard, admin panel, e-commerce, SaaS, portfolio, blog, .html, .tsx. Elements: button, modal, navbar, sidebar, card, table, form, chart. Styles: glassmorphism, claymorphism, minimalism, brutalism, neumorphism, bento grid, dark mode, responsive, skeuomorphism, flat design. Topics: color palette, accessibility, animation, layout, typography, font pairing, spacing, hover, shadow, gradient. Integrations: shadcn/ui MCP for component search and examples."
|
||||||
---
|
---
|
||||||
|
|
||||||
# UI/UX Pro Max - Design Intelligence
|
# UI/UX Pro Max - Design Intelligence
|
||||||
|
|
||||||
Comprehensive design guide for web and mobile applications. Contains 50+ styles, 97 color palettes, 57 font pairings, 99 UX guidelines, and 25 chart types across 9 technology stacks. Searchable database with priority-based recommendations.
|
Comprehensive design guide for this Next.js + React + Tailwind + shadcn/ui codebase. Contains 50+ styles, 97 color palettes, 57 font pairings, 99 UX guidelines, and 25 chart types across 4 technology stacks. Searchable database with priority-based recommendations.
|
||||||
|
|
||||||
## When to Apply
|
## When to Apply
|
||||||
|
|
||||||
@@ -128,7 +128,7 @@ Extract key information from user request:
|
|||||||
- **Product type**: SaaS, e-commerce, portfolio, dashboard, landing page, etc.
|
- **Product type**: SaaS, e-commerce, portfolio, dashboard, landing page, etc.
|
||||||
- **Style keywords**: minimal, playful, professional, elegant, dark mode, etc.
|
- **Style keywords**: minimal, playful, professional, elegant, dark mode, etc.
|
||||||
- **Industry**: healthcare, fintech, gaming, education, etc.
|
- **Industry**: healthcare, fintech, gaming, education, etc.
|
||||||
- **Stack**: React, Vue, Next.js, or default to `html-tailwind`
|
- **Stack**: Next.js / React / shadcn (default: `nextjs`)
|
||||||
|
|
||||||
### Step 2: Generate Design System (REQUIRED)
|
### Step 2: Generate Design System (REQUIRED)
|
||||||
|
|
||||||
@@ -167,15 +167,15 @@ python3 .claude/skills/ui-ux-pro-max/scripts/search.py "<keyword>" --domain <dom
|
|||||||
| Alternative fonts | `typography` | `--domain typography "elegant luxury"` |
|
| Alternative fonts | `typography` | `--domain typography "elegant luxury"` |
|
||||||
| Landing structure | `landing` | `--domain landing "hero social-proof"` |
|
| Landing structure | `landing` | `--domain landing "hero social-proof"` |
|
||||||
|
|
||||||
### Step 4: Stack Guidelines (Default: html-tailwind)
|
### Step 4: Stack Guidelines (Default: nextjs)
|
||||||
|
|
||||||
Get implementation-specific best practices. If user doesn't specify a stack, **default to `html-tailwind`**.
|
Get implementation-specific best practices. If user doesn't specify a stack, **default to `nextjs`**. For component patterns use `shadcn`; for Tailwind utilities use `html-tailwind`.
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
python3 .claude/skills/ui-ux-pro-max/scripts/search.py "<keyword>" --stack html-tailwind
|
python3 .claude/skills/ui-ux-pro-max/scripts/search.py "<keyword>" --stack nextjs
|
||||||
```
|
```
|
||||||
|
|
||||||
Available stacks: `html-tailwind`, `react`, `nextjs`, `vue`, `svelte`, `swiftui`, `react-native`, `flutter`, `shadcn`
|
Available stacks: `nextjs`, `react`, `shadcn`, `html-tailwind`
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -200,15 +200,10 @@ Available stacks: `html-tailwind`, `react`, `nextjs`, `vue`, `svelte`, `swiftui`
|
|||||||
|
|
||||||
| Stack | Focus |
|
| Stack | Focus |
|
||||||
|-------|-------|
|
|-------|-------|
|
||||||
| `html-tailwind` | Tailwind utilities, responsive, a11y (DEFAULT) |
|
| `nextjs` | SSR, routing, images, API routes (DEFAULT) |
|
||||||
| `react` | State, hooks, performance, patterns |
|
| `react` | State, hooks, performance, patterns |
|
||||||
| `nextjs` | SSR, routing, images, API routes |
|
|
||||||
| `vue` | Composition API, Pinia, Vue Router |
|
|
||||||
| `svelte` | Runes, stores, SvelteKit |
|
|
||||||
| `swiftui` | Views, State, Navigation, Animation |
|
|
||||||
| `react-native` | Components, Navigation, Lists |
|
|
||||||
| `flutter` | Widgets, State, Layout, Theming |
|
|
||||||
| `shadcn` | shadcn/ui components, theming, forms, patterns |
|
| `shadcn` | shadcn/ui components, theming, forms, patterns |
|
||||||
|
| `html-tailwind` | Tailwind utilities, responsive, a11y |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -220,7 +215,7 @@ Available stacks: `html-tailwind`, `react`, `nextjs`, `vue`, `svelte`, `swiftui`
|
|||||||
- Product type: Beauty/Spa service
|
- Product type: Beauty/Spa service
|
||||||
- Style keywords: elegant, professional, soft
|
- Style keywords: elegant, professional, soft
|
||||||
- Industry: Beauty/Wellness
|
- Industry: Beauty/Wellness
|
||||||
- Stack: html-tailwind (default)
|
- Stack: nextjs (default)
|
||||||
|
|
||||||
### Step 2: Generate Design System (REQUIRED)
|
### Step 2: Generate Design System (REQUIRED)
|
||||||
|
|
||||||
@@ -243,7 +238,7 @@ python3 .claude/skills/ui-ux-pro-max/scripts/search.py "elegant luxury serif" --
|
|||||||
### Step 4: Stack Guidelines
|
### Step 4: Stack Guidelines
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
python3 .claude/skills/ui-ux-pro-max/scripts/search.py "layout responsive form" --stack html-tailwind
|
python3 .claude/skills/ui-ux-pro-max/scripts/search.py "layout responsive form" --stack nextjs
|
||||||
```
|
```
|
||||||
|
|
||||||
**Then:** Synthesize design system + detailed searches and implement the design.
|
**Then:** Synthesize design system + detailed searches and implement the design.
|
||||||
|
|||||||
@@ -1,53 +0,0 @@
|
|||||||
No,Category,Guideline,Description,Do,Don't,Code Good,Code Bad,Severity,Docs URL
|
|
||||||
1,Widgets,Use StatelessWidget when possible,Immutable widgets are simpler,StatelessWidget for static UI,StatefulWidget for everything,class MyWidget extends StatelessWidget,class MyWidget extends StatefulWidget (static),Medium,https://api.flutter.dev/flutter/widgets/StatelessWidget-class.html
|
|
||||||
2,Widgets,Keep widgets small,Single responsibility principle,Extract widgets into smaller pieces,Large build methods,Column(children: [Header() Content()]),500+ line build method,Medium,
|
|
||||||
3,Widgets,Use const constructors,Compile-time constants for performance,const MyWidget() when possible,Non-const for static widgets,const Text('Hello'),Text('Hello') for literals,High,https://dart.dev/guides/language/language-tour#constant-constructors
|
|
||||||
4,Widgets,Prefer composition over inheritance,Combine widgets using children,Compose widgets,Extend widget classes,Container(child: MyContent()),class MyContainer extends Container,Medium,
|
|
||||||
5,State,Use setState correctly,Minimal state in StatefulWidget,setState for UI state changes,setState for business logic,setState(() { _counter++; }),Complex logic in setState,Medium,https://api.flutter.dev/flutter/widgets/State/setState.html
|
|
||||||
6,State,Avoid setState in build,Never call setState during build,setState in callbacks only,setState in build method,onPressed: () => setState(() {}),build() { setState(); },High,
|
|
||||||
7,State,Use state management for complex apps,Provider Riverpod BLoC,State management for shared state,setState for global state,Provider.of<MyState>(context),Global setState calls,Medium,
|
|
||||||
8,State,Prefer Riverpod or Provider,Recommended state solutions,Riverpod for new projects,InheritedWidget manually,ref.watch(myProvider),Custom InheritedWidget,Medium,https://riverpod.dev/
|
|
||||||
9,State,Dispose resources,Clean up controllers and subscriptions,dispose() for cleanup,Memory leaks from subscriptions,@override void dispose() { controller.dispose(); },No dispose implementation,High,
|
|
||||||
10,Layout,Use Column and Row,Basic layout widgets,Column Row for linear layouts,Stack for simple layouts,"Column(children: [Text(), Button()])",Stack for vertical list,Medium,https://api.flutter.dev/flutter/widgets/Column-class.html
|
|
||||||
11,Layout,Use Expanded and Flexible,Control flex behavior,Expanded to fill space,Fixed sizes in flex containers,Expanded(child: Container()),Container(width: 200) in Row,Medium,
|
|
||||||
12,Layout,Use SizedBox for spacing,Consistent spacing,SizedBox for gaps,Container for spacing only,SizedBox(height: 16),Container(height: 16),Low,
|
|
||||||
13,Layout,Use LayoutBuilder for responsive,Respond to constraints,LayoutBuilder for adaptive layouts,Fixed sizes for responsive,LayoutBuilder(builder: (context constraints) {}),Container(width: 375),Medium,https://api.flutter.dev/flutter/widgets/LayoutBuilder-class.html
|
|
||||||
14,Layout,Avoid deep nesting,Keep widget tree shallow,Extract deeply nested widgets,10+ levels of nesting,Extract widget to method or class,Column(Row(Column(Row(...)))),Medium,
|
|
||||||
15,Lists,Use ListView.builder,Lazy list building,ListView.builder for long lists,ListView with children for large lists,"ListView.builder(itemCount: 100, itemBuilder: ...)",ListView(children: items.map(...).toList()),High,https://api.flutter.dev/flutter/widgets/ListView-class.html
|
|
||||||
16,Lists,Provide itemExtent when known,Skip measurement,itemExtent for fixed height items,No itemExtent for uniform lists,ListView.builder(itemExtent: 50),ListView.builder without itemExtent,Medium,
|
|
||||||
17,Lists,Use keys for stateful items,Preserve widget state,Key for stateful list items,No key for dynamic lists,ListTile(key: ValueKey(item.id)),ListTile without key,High,
|
|
||||||
18,Lists,Use SliverList for custom scroll,Custom scroll effects,CustomScrollView with Slivers,Nested ListViews,CustomScrollView(slivers: [SliverList()]),ListView inside ListView,Medium,https://api.flutter.dev/flutter/widgets/SliverList-class.html
|
|
||||||
19,Navigation,Use Navigator 2.0 or GoRouter,Declarative routing,go_router for navigation,Navigator.push for complex apps,GoRouter(routes: [...]),Navigator.push everywhere,Medium,https://pub.dev/packages/go_router
|
|
||||||
20,Navigation,Use named routes,Organized navigation,Named routes for clarity,Anonymous routes,Navigator.pushNamed(context '/home'),Navigator.push(context MaterialPageRoute()),Low,
|
|
||||||
21,Navigation,Handle back button (PopScope),Android back behavior and predictive back (Android 14+),Use PopScope widget (WillPopScope is deprecated),Use WillPopScope,"PopScope(canPop: false, onPopInvoked: (didPop) => ...)",WillPopScope(onWillPop: ...),High,https://api.flutter.dev/flutter/widgets/PopScope-class.html
|
|
||||||
22,Navigation,Pass typed arguments,Type-safe route arguments,Typed route arguments,Dynamic arguments,MyRoute(id: '123'),arguments: {'id': '123'},Medium,
|
|
||||||
23,Async,Use FutureBuilder,Async UI building,FutureBuilder for async data,setState for async,FutureBuilder(future: fetchData()),fetchData().then((d) => setState()),Medium,https://api.flutter.dev/flutter/widgets/FutureBuilder-class.html
|
|
||||||
24,Async,Use StreamBuilder,Stream UI building,StreamBuilder for streams,Manual stream subscription,StreamBuilder(stream: myStream),stream.listen in initState,Medium,https://api.flutter.dev/flutter/widgets/StreamBuilder-class.html
|
|
||||||
25,Async,Handle loading and error states,Complete async UI states,ConnectionState checks,Only success state,if (snapshot.connectionState == ConnectionState.waiting),No loading indicator,High,
|
|
||||||
26,Async,Cancel subscriptions,Clean up stream subscriptions,Cancel in dispose,Memory leaks,subscription.cancel() in dispose,No subscription cleanup,High,
|
|
||||||
27,Theming,Use ThemeData,Consistent theming,ThemeData for app theme,Hardcoded colors,Theme.of(context).primaryColor,Color(0xFF123456) everywhere,Medium,https://api.flutter.dev/flutter/material/ThemeData-class.html
|
|
||||||
28,Theming,Use ColorScheme,Material 3 color system,ColorScheme for colors,Individual color properties,colorScheme: ColorScheme.fromSeed(),primaryColor: Colors.blue,Medium,
|
|
||||||
29,Theming,Access theme via context,Dynamic theme access,Theme.of(context),Static theme reference,Theme.of(context).textTheme.bodyLarge,TextStyle(fontSize: 16),Medium,
|
|
||||||
30,Theming,Support dark mode,Respect system theme,darkTheme in MaterialApp,Light theme only,"MaterialApp(theme: light, darkTheme: dark)",MaterialApp(theme: light),Medium,
|
|
||||||
31,Animation,Use implicit animations,Simple animations,AnimatedContainer AnimatedOpacity,Explicit for simple transitions,AnimatedContainer(duration: Duration()),AnimationController for fade,Low,https://api.flutter.dev/flutter/widgets/AnimatedContainer-class.html
|
|
||||||
32,Animation,Use AnimationController for complex,Fine-grained control,AnimationController with Ticker,Implicit for complex sequences,AnimationController(vsync: this),AnimatedContainer for staggered,Medium,
|
|
||||||
33,Animation,Dispose AnimationControllers,Clean up animation resources,dispose() for controllers,Memory leaks,controller.dispose() in dispose,No controller disposal,High,
|
|
||||||
34,Animation,Use Hero for transitions,Shared element transitions,Hero for navigation animations,Manual shared element,Hero(tag: 'image' child: Image()),Custom shared element animation,Low,https://api.flutter.dev/flutter/widgets/Hero-class.html
|
|
||||||
35,Forms,Use Form widget,Form validation,Form with GlobalKey,Individual validation,Form(key: _formKey child: ...),TextField without Form,Medium,https://api.flutter.dev/flutter/widgets/Form-class.html
|
|
||||||
36,Forms,Use TextEditingController,Control text input,Controller for text fields,onChanged for all text,final controller = TextEditingController(),onChanged: (v) => setState(),Medium,
|
|
||||||
37,Forms,Validate on submit,Form validation flow,_formKey.currentState!.validate(),Skip validation,if (_formKey.currentState!.validate()),Submit without validation,High,
|
|
||||||
38,Forms,Dispose controllers,Clean up text controllers,dispose() for controllers,Memory leaks,controller.dispose() in dispose,No controller disposal,High,
|
|
||||||
39,Performance,Use const widgets,Reduce rebuilds,const for static widgets,No const for literals,const Icon(Icons.add),Icon(Icons.add),High,
|
|
||||||
40,Performance,Avoid rebuilding entire tree,Minimal rebuild scope,Isolate changing widgets,setState on parent,Consumer only around changing widget,setState on root widget,High,
|
|
||||||
41,Performance,Use RepaintBoundary,Isolate repaints,RepaintBoundary for animations,Full screen repaints,RepaintBoundary(child: AnimatedWidget()),Animation without boundary,Medium,https://api.flutter.dev/flutter/widgets/RepaintBoundary-class.html
|
|
||||||
42,Performance,Profile with DevTools,Measure before optimizing,Flutter DevTools profiling,Guess at performance,DevTools performance tab,Optimize without measuring,Medium,https://docs.flutter.dev/tools/devtools
|
|
||||||
43,Accessibility,Use Semantics widget,Screen reader support,Semantics for accessibility,Missing accessibility info,Semantics(label: 'Submit button'),GestureDetector without semantics,High,https://api.flutter.dev/flutter/widgets/Semantics-class.html
|
|
||||||
44,Accessibility,Support large fonts,MediaQuery text scaling,MediaQuery.textScaleFactor,Fixed font sizes,style: Theme.of(context).textTheme,TextStyle(fontSize: 14),High,
|
|
||||||
45,Accessibility,Test with screen readers,TalkBack and VoiceOver,Test accessibility regularly,Skip accessibility testing,Regular TalkBack testing,No screen reader testing,High,
|
|
||||||
46,Testing,Use widget tests,Test widget behavior,WidgetTester for UI tests,Unit tests only,testWidgets('...' (tester) async {}),Only test() for UI,Medium,https://docs.flutter.dev/testing
|
|
||||||
47,Testing,Use integration tests,Full app testing,integration_test package,Manual testing only,IntegrationTestWidgetsFlutterBinding,Manual E2E testing,Medium,
|
|
||||||
48,Testing,Mock dependencies,Isolate tests,Mockito or mocktail,Real dependencies in tests,when(mock.method()).thenReturn(),Real API calls in tests,Medium,
|
|
||||||
49,Platform,Use Platform checks,Platform-specific code,Platform.isIOS Platform.isAndroid,Same code for all platforms,if (Platform.isIOS) {},Hardcoded iOS behavior,Medium,
|
|
||||||
50,Platform,Use kIsWeb for web,Web platform detection,kIsWeb for web checks,Platform for web,if (kIsWeb) {},Platform.isWeb (doesn't exist),Medium,
|
|
||||||
51,Packages,Use pub.dev packages,Community packages,Popular maintained packages,Custom implementations,cached_network_image,Custom image cache,Medium,https://pub.dev/
|
|
||||||
52,Packages,Check package quality,Quality before adding,Pub points and popularity,Any package without review,100+ pub points,Unmaintained packages,Medium,
|
|
||||||
|
@@ -1,51 +0,0 @@
|
|||||||
No,Category,Guideline,Description,Do,Don't,Code Good,Code Bad,Severity,Docs URL
|
|
||||||
1,Installation,Add Nuxt UI module,Install and configure Nuxt UI in your Nuxt project,pnpm add @nuxt/ui and add to modules,Manual component imports,"modules: ['@nuxt/ui']","import { UButton } from '@nuxt/ui'",High,https://ui.nuxt.com/docs/getting-started/installation/nuxt
|
|
||||||
2,Installation,Import Tailwind and Nuxt UI CSS,Required CSS imports in main.css file,@import tailwindcss and @import @nuxt/ui,Skip CSS imports,"@import ""tailwindcss""; @import ""@nuxt/ui"";",No CSS imports,High,https://ui.nuxt.com/docs/getting-started/installation/nuxt
|
|
||||||
3,Installation,Wrap app with UApp component,UApp provides global configs for Toast Tooltip and overlays,<UApp> wrapper in app.vue,Skip UApp wrapper,<UApp><NuxtPage/></UApp>,<NuxtPage/> without wrapper,High,https://ui.nuxt.com/docs/components/app
|
|
||||||
4,Components,Use U prefix for components,All Nuxt UI components use U prefix by default,UButton UInput UModal,Button Input Modal,<UButton>Click</UButton>,<Button>Click</Button>,Medium,https://ui.nuxt.com/docs/getting-started/installation/nuxt
|
|
||||||
5,Components,Use semantic color props,Use semantic colors like primary secondary error,color="primary" color="error",Hardcoded colors,"<UButton color=""primary"">","<UButton class=""bg-green-500"">",Medium,https://ui.nuxt.com/docs/getting-started/theme/design-system
|
|
||||||
6,Components,Use variant prop for styling,Nuxt UI provides solid outline soft subtle ghost link variants,variant="soft" variant="outline",Custom button classes,"<UButton variant=""soft"">","<UButton class=""border bg-transparent"">",Medium,https://ui.nuxt.com/docs/components/button
|
|
||||||
7,Components,Use size prop consistently,Components support xs sm md lg xl sizes,size="sm" size="lg",Arbitrary sizing classes,"<UButton size=""lg"">","<UButton class=""text-xl px-6"">",Low,https://ui.nuxt.com/docs/components/button
|
|
||||||
8,Icons,Use icon prop with Iconify format,Nuxt UI supports Iconify icons via icon prop,icon="lucide:home" icon="heroicons:user",i-lucide-home format,"<UButton icon=""lucide:home"">","<UButton icon=""i-lucide-home"">",Medium,https://ui.nuxt.com/docs/getting-started/integrations/icons/nuxt
|
|
||||||
9,Icons,Use leadingIcon and trailingIcon,Position icons with dedicated props for clarity,leadingIcon="lucide:plus" trailingIcon="lucide:arrow-right",Manual icon positioning,"<UButton leadingIcon=""lucide:plus"">","<UButton><Icon name=""lucide:plus""/>Add</UButton>",Low,https://ui.nuxt.com/docs/components/button
|
|
||||||
10,Theming,Configure colors in app.config.ts,Runtime color configuration without restart,ui.colors.primary in app.config.ts,Hardcoded colors in components,"defineAppConfig({ ui: { colors: { primary: 'blue' } } })","<UButton class=""bg-blue-500"">",High,https://ui.nuxt.com/docs/getting-started/theme/design-system
|
|
||||||
11,Theming,Use @theme directive for custom colors,Define design tokens in CSS with Tailwind @theme,@theme { --color-brand-500: #xxx },Inline color definitions,@theme { --color-brand-500: #ef4444; },:style="{ color: '#ef4444' }",Medium,https://ui.nuxt.com/docs/getting-started/theme/design-system
|
|
||||||
12,Theming,Extend semantic colors in nuxt.config,Register new colors like tertiary in theme.colors,theme.colors array in ui config,Use undefined colors,"ui: { theme: { colors: ['primary', 'tertiary'] } }","<UButton color=""tertiary""> without config",Medium,https://ui.nuxt.com/docs/getting-started/theme/design-system
|
|
||||||
13,Forms,Use UForm with schema validation,UForm supports Zod Yup Joi Valibot schemas,:schema prop with validation schema,Manual form validation,"<UForm :schema=""schema"" :state=""state"">",Manual @blur validation,High,https://ui.nuxt.com/docs/components/form
|
|
||||||
14,Forms,Use UFormField for field wrapper,Provides label error message and validation display,UFormField with name prop,Manual error handling,"<UFormField name=""email"" label=""Email"">",<div><label>Email</label><UInput/><span>error</span></div>,Medium,https://ui.nuxt.com/docs/components/form-field
|
|
||||||
15,Forms,Handle form submit with @submit,UForm emits submit event with validated data,@submit handler on UForm,@click on submit button,"<UForm @submit=""onSubmit"">","<UButton @click=""onSubmit"">",Medium,https://ui.nuxt.com/docs/components/form
|
|
||||||
16,Forms,Use validateOn prop for validation timing,Control when validation triggers (blur change input),validateOn="['blur']" for performance,Always validate on input,"<UForm :validateOn=""['blur', 'change']"">","<UForm> (validates on every keystroke)",Low,https://ui.nuxt.com/docs/components/form
|
|
||||||
17,Overlays,Use v-model:open for overlay control,Modal Slideover Drawer use v-model:open,v-model:open for controlled state,Manual show/hide logic,"<UModal v-model:open=""isOpen"">",<UModal v-if="isOpen">,Medium,https://ui.nuxt.com/docs/components/modal
|
|
||||||
18,Overlays,Use useOverlay composable for programmatic overlays,Open overlays programmatically without template refs,useOverlay().open(MyModal),Template ref and manual control,"const overlay = useOverlay(); overlay.open(MyModal, { props })","const modal = ref(); modal.value.open()",Medium,https://ui.nuxt.com/docs/components/modal
|
|
||||||
19,Overlays,Use title and description props,Built-in header support for overlays,title="Confirm" description="Are you sure?",Manual header content,"<UModal title=""Confirm"" description=""Are you sure?"">","<UModal><template #header><h2>Confirm</h2></template>",Low,https://ui.nuxt.com/docs/components/modal
|
|
||||||
20,Dashboard,Use UDashboardSidebar for navigation,Provides collapsible resizable sidebar with mobile support,UDashboardSidebar with header default footer slots,Custom sidebar implementation,<UDashboardSidebar><template #header>...</template></UDashboardSidebar>,<aside class="w-64 border-r">,Medium,https://ui.nuxt.com/docs/components/dashboard-sidebar
|
|
||||||
21,Dashboard,Use UDashboardGroup for layout,Wraps dashboard components with sidebar state management,UDashboardGroup > UDashboardSidebar + UDashboardPanel,Manual layout flex containers,<UDashboardGroup><UDashboardSidebar/><UDashboardPanel/></UDashboardGroup>,"<div class=""flex""><aside/><main/></div>",Medium,https://ui.nuxt.com/docs/components/dashboard-group
|
|
||||||
22,Dashboard,Use UDashboardNavbar for top navigation,Responsive navbar with mobile menu support,UDashboardNavbar in dashboard layout,Custom navbar implementation,<UDashboardNavbar :links="navLinks"/>,<nav class="border-b">,Low,https://ui.nuxt.com/docs/components/dashboard-navbar
|
|
||||||
23,Tables,Use UTable with data and columns props,Powered by TanStack Table with built-in features,:data and :columns props,Manual table markup,"<UTable :data=""users"" :columns=""columns""/>","<table><tr v-for=""user in users"">",High,https://ui.nuxt.com/docs/components/table
|
|
||||||
24,Tables,Define columns with accessorKey,Column definitions use accessorKey for data binding,accessorKey: 'email' in column def,String column names only,"{ accessorKey: 'email', header: 'Email' }","['name', 'email']",Medium,https://ui.nuxt.com/docs/components/table
|
|
||||||
25,Tables,Use cell slot for custom rendering,Customize cell content with scoped slots,#cell-columnName slot,Override entire table,<template #cell-status="{ row }">,Manual column render function,Medium,https://ui.nuxt.com/docs/components/table
|
|
||||||
26,Tables,Enable sorting with sortable column option,Add sortable: true to column definition,sortable: true in column,Manual sort implementation,"{ accessorKey: 'name', sortable: true }",@click="sortBy('name')",Low,https://ui.nuxt.com/docs/components/table
|
|
||||||
27,Navigation,Use UNavigationMenu for nav links,Horizontal or vertical navigation with dropdown support,UNavigationMenu with items array,Manual nav with v-for,"<UNavigationMenu :items=""navItems""/>","<nav><a v-for=""item in items"">",Medium,https://ui.nuxt.com/docs/components/navigation-menu
|
|
||||||
28,Navigation,Use UBreadcrumb for page hierarchy,Automatic breadcrumb with NuxtLink support,:items array with label and to,Manual breadcrumb links,"<UBreadcrumb :items=""breadcrumbs""/>","<nav><span v-for=""crumb in crumbs"">",Low,https://ui.nuxt.com/docs/components/breadcrumb
|
|
||||||
29,Navigation,Use UTabs for tabbed content,Tab navigation with content panels,UTabs with items containing slot content,Manual tab state,"<UTabs :items=""tabs""/>","<div><button @click=""tab=1"">",Medium,https://ui.nuxt.com/docs/components/tabs
|
|
||||||
30,Feedback,Use useToast for notifications,Composable for toast notifications,useToast().add({ title description }),Alert components for toasts,"const toast = useToast(); toast.add({ title: 'Saved' })",<UAlert v-if="showSuccess">,High,https://ui.nuxt.com/docs/components/toast
|
|
||||||
31,Feedback,Use UAlert for inline messages,Static alert messages with icon and actions,UAlert with title description color,Toast for static messages,"<UAlert title=""Warning"" color=""warning""/>",useToast for inline alerts,Medium,https://ui.nuxt.com/docs/components/alert
|
|
||||||
32,Feedback,Use USkeleton for loading states,Placeholder content during data loading,USkeleton with appropriate size,Spinner for content loading,<USkeleton class="h-4 w-32"/>,<UIcon name="lucide:loader" class="animate-spin"/>,Low,https://ui.nuxt.com/docs/components/skeleton
|
|
||||||
33,Color Mode,Use UColorModeButton for theme toggle,Built-in light/dark mode toggle button,UColorModeButton component,Manual color mode logic,<UColorModeButton/>,"<button @click=""toggleColorMode"">",Low,https://ui.nuxt.com/docs/components/color-mode-button
|
|
||||||
34,Color Mode,Use UColorModeSelect for theme picker,Dropdown to select system light or dark mode,UColorModeSelect component,Custom select for theme,<UColorModeSelect/>,"<USelect v-model=""colorMode"" :items=""modes""/>",Low,https://ui.nuxt.com/docs/components/color-mode-select
|
|
||||||
35,Customization,Use ui prop for component styling,Override component styles via ui prop,ui prop with slot class overrides,Global CSS overrides,"<UButton :ui=""{ base: 'rounded-full' }""/>",<UButton class="!rounded-full"/>,Medium,https://ui.nuxt.com/docs/getting-started/theme/components
|
|
||||||
36,Customization,Configure default variants in nuxt.config,Set default color and size for all components,theme.defaultVariants in ui config,Repeat props on every component,"ui: { theme: { defaultVariants: { color: 'neutral' } } }","<UButton color=""neutral""> everywhere",Medium,https://ui.nuxt.com/docs/getting-started/installation/nuxt
|
|
||||||
37,Customization,Use app.config.ts for theme overrides,Runtime theme customization,defineAppConfig with ui key,nuxt.config for runtime values,"defineAppConfig({ ui: { button: { defaultVariants: { size: 'sm' } } } })","nuxt.config ui.button.size: 'sm'",Medium,https://ui.nuxt.com/docs/getting-started/theme/components
|
|
||||||
38,Performance,Enable component detection,Tree-shake unused component CSS,experimental.componentDetection: true,Include all component CSS,"ui: { experimental: { componentDetection: true } }","ui: {} (includes all CSS)",Low,https://ui.nuxt.com/docs/getting-started/installation/nuxt
|
|
||||||
39,Performance,Use UTable virtualize for large data,Enable virtualization for 1000+ rows,:virtualize prop on UTable,Render all rows,"<UTable :data=""largeData"" virtualize/>","<UTable :data=""largeData""/>",Medium,https://ui.nuxt.com/docs/components/table
|
|
||||||
40,Accessibility,Use semantic component props,Components have built-in ARIA support,Use title description label props,Skip accessibility props,"<UModal title=""Settings"">","<UModal><h2>Settings</h2>",Medium,https://ui.nuxt.com/docs/components/modal
|
|
||||||
41,Accessibility,Use UFormField for form accessibility,Automatic label-input association,UFormField wraps inputs,Manual id and for attributes,"<UFormField label=""Email""><UInput/></UFormField>","<label for=""email"">Email</label><UInput id=""email""/>",High,https://ui.nuxt.com/docs/components/form-field
|
|
||||||
42,Content,Use UContentToc for table of contents,Automatic TOC with active heading highlight,UContentToc with :links,Manual TOC implementation,"<UContentToc :links=""toc""/>","<nav><a v-for=""heading in headings"">",Low,https://ui.nuxt.com/docs/components/content-toc
|
|
||||||
43,Content,Use UContentSearch for docs search,Command palette for documentation search,UContentSearch with Nuxt Content,Custom search implementation,<UContentSearch/>,<UCommandPalette :groups="searchResults"/>,Low,https://ui.nuxt.com/docs/components/content-search
|
|
||||||
44,AI/Chat,Use UChatMessages for chat UI,Designed for Vercel AI SDK integration,UChatMessages with messages array,Custom chat message list,"<UChatMessages :messages=""messages""/>","<div v-for=""msg in messages"">",Medium,https://ui.nuxt.com/docs/components/chat-messages
|
|
||||||
45,AI/Chat,Use UChatPrompt for input,Enhanced textarea for AI prompts,UChatPrompt with v-model,Basic textarea,<UChatPrompt v-model="prompt"/>,<UTextarea v-model="prompt"/>,Medium,https://ui.nuxt.com/docs/components/chat-prompt
|
|
||||||
46,Editor,Use UEditor for rich text,TipTap-based editor with toolbar support,UEditor with v-model:content,Custom TipTap setup,"<UEditor v-model:content=""content""/>",Manual TipTap initialization,Medium,https://ui.nuxt.com/docs/components/editor
|
|
||||||
47,Links,Use to prop for navigation,UButton and ULink support NuxtLink to prop,to="/dashboard" for internal links,href for internal navigation,"<UButton to=""/dashboard"">","<UButton href=""/dashboard"">",Medium,https://ui.nuxt.com/docs/components/button
|
|
||||||
48,Links,Use external prop for outside links,Explicitly mark external links,target="_blank" with external URLs,Forget rel="noopener","<UButton to=""https://example.com"" target=""_blank"">","<UButton href=""https://..."">",Low,https://ui.nuxt.com/docs/components/link
|
|
||||||
49,Loading,Use loadingAuto on buttons,Automatic loading state from @click promise,loadingAuto prop on UButton,Manual loading state,"<UButton loadingAuto @click=""async () => await save()"">","<UButton :loading=""isLoading"" @click=""save"">",Low,https://ui.nuxt.com/docs/components/button
|
|
||||||
50,Loading,Use UForm loadingAuto,Auto-disable form during submit,loadingAuto on UForm (default true),Manual form disabled state,"<UForm @submit=""handleSubmit"">","<UForm :disabled=""isSubmitting"">",Low,https://ui.nuxt.com/docs/components/form
|
|
||||||
|
Can't render this file because it contains an unexpected character in line 6 and column 94.
|
@@ -1,59 +0,0 @@
|
|||||||
No,Category,Guideline,Description,Do,Don't,Code Good,Code Bad,Severity,Docs URL
|
|
||||||
1,Routing,Use file-based routing,Create routes by adding files in pages directory,pages/ directory with index.vue,Manual route configuration,pages/dashboard/index.vue,Custom router setup,Medium,https://nuxt.com/docs/getting-started/routing
|
|
||||||
2,Routing,Use dynamic route parameters,Create dynamic routes with bracket syntax,[id].vue for dynamic params,Hardcoded routes for dynamic content,pages/posts/[id].vue,pages/posts/post1.vue,Medium,https://nuxt.com/docs/getting-started/routing
|
|
||||||
3,Routing,Use catch-all routes,Handle multiple path segments with [...slug],[...slug].vue for catch-all,Multiple nested dynamic routes,pages/[...slug].vue,pages/[a]/[b]/[c].vue,Low,https://nuxt.com/docs/getting-started/routing
|
|
||||||
4,Routing,Define page metadata with definePageMeta,Set page-level configuration and middleware,definePageMeta for layout middleware title,Manual route meta configuration,"definePageMeta({ layout: 'admin', middleware: 'auth' })",router.beforeEach for page config,High,https://nuxt.com/docs/api/utils/define-page-meta
|
|
||||||
5,Routing,Use validate for route params,Validate dynamic route parameters before rendering,validate function in definePageMeta,Manual validation in setup,"definePageMeta({ validate: (route) => /^\d+$/.test(route.params.id) })",if (!valid) navigateTo('/404'),Medium,https://nuxt.com/docs/api/utils/define-page-meta
|
|
||||||
6,Rendering,Use SSR by default,Server-side rendering is enabled by default,Keep ssr: true (default),Disable SSR unnecessarily,ssr: true (default),ssr: false for all pages,High,https://nuxt.com/docs/guide/concepts/rendering
|
|
||||||
7,Rendering,Use .client suffix for client-only components,Mark components to render only on client,ComponentName.client.vue suffix,v-if with process.client check,Comments.client.vue,<div v-if="process.client"><Comments/></div>,Medium,https://nuxt.com/docs/guide/directory-structure/components
|
|
||||||
8,Rendering,Use .server suffix for server-only components,Mark components to render only on server,ComponentName.server.vue suffix,Manual server check,HeavyMarkdown.server.vue,v-if="process.server",Low,https://nuxt.com/docs/guide/directory-structure/components
|
|
||||||
9,DataFetching,Use useFetch for simple data fetching,Wrapper around useAsyncData for URL fetching,useFetch for API calls,$fetch in onMounted,"const { data } = await useFetch('/api/posts')","onMounted(async () => { data.value = await $fetch('/api/posts') })",High,https://nuxt.com/docs/api/composables/use-fetch
|
|
||||||
10,DataFetching,Use useAsyncData for complex fetching,Fine-grained control over async data,useAsyncData for CMS or custom fetching,useFetch for non-URL data sources,"const { data } = await useAsyncData('posts', () => cms.getPosts())","const { data } = await useFetch(() => cms.getPosts())",Medium,https://nuxt.com/docs/api/composables/use-async-data
|
|
||||||
11,DataFetching,Use $fetch for non-reactive requests,$fetch for event handlers and non-component code,$fetch in event handlers or server routes,useFetch in click handlers,"async function submit() { await $fetch('/api/submit', { method: 'POST' }) }","async function submit() { await useFetch('/api/submit') }",High,https://nuxt.com/docs/api/utils/dollarfetch
|
|
||||||
12,DataFetching,Use lazy option for non-blocking fetch,Defer data fetching for better initial load,lazy: true for below-fold content,Blocking fetch for non-critical data,"useFetch('/api/comments', { lazy: true })",await useFetch('/api/comments') for footer,Medium,https://nuxt.com/docs/api/composables/use-fetch
|
|
||||||
13,DataFetching,Use server option to control fetch location,Choose where data is fetched,server: false for client-only data,Server fetch for user-specific client data,"useFetch('/api/user-preferences', { server: false })",useFetch for localStorage-dependent data,Medium,https://nuxt.com/docs/api/composables/use-fetch
|
|
||||||
14,DataFetching,Use pick to reduce payload size,Select only needed fields from response,pick option for large responses,Fetching entire objects when few fields needed,"useFetch('/api/user', { pick: ['id', 'name'] })",useFetch('/api/user') then destructure,Low,https://nuxt.com/docs/api/composables/use-fetch
|
|
||||||
15,DataFetching,Use transform for data manipulation,Transform data before storing in state,transform option for data shaping,Manual transformation after fetch,"useFetch('/api/posts', { transform: (posts) => posts.map(p => p.title) })",const titles = data.value.map(p => p.title),Low,https://nuxt.com/docs/api/composables/use-fetch
|
|
||||||
16,DataFetching,Handle loading and error states,Always handle pending and error states,Check status pending error refs,Ignoring loading states,"<div v-if=""status === 'pending'"">Loading...</div>",No loading indicator,High,https://nuxt.com/docs/getting-started/data-fetching
|
|
||||||
17,Lifecycle,Avoid side effects in script setup root,Move side effects to lifecycle hooks,Side effects in onMounted,setInterval in root script setup,"onMounted(() => { interval = setInterval(...) })","<script setup>setInterval(...)</script>",High,https://nuxt.com/docs/guide/concepts/nuxt-lifecycle
|
|
||||||
18,Lifecycle,Use onMounted for DOM access,Access DOM only after component is mounted,onMounted for DOM manipulation,Direct DOM access in setup,"onMounted(() => { document.getElementById('el') })","<script setup>document.getElementById('el')</script>",High,https://nuxt.com/docs/api/composables/on-mounted
|
|
||||||
19,Lifecycle,Use nextTick for post-render access,Wait for DOM updates before accessing elements,await nextTick() after state changes,Immediate DOM access after state change,"count.value++; await nextTick(); el.value.focus()","count.value++; el.value.focus()",Medium,https://nuxt.com/docs/api/utils/next-tick
|
|
||||||
20,Lifecycle,Use onPrehydrate for pre-hydration logic,Run code before Nuxt hydrates the page,onPrehydrate for client setup,onMounted for hydration-critical code,"onPrehydrate(() => { console.log(window) })",onMounted for pre-hydration needs,Low,https://nuxt.com/docs/api/composables/on-prehydrate
|
|
||||||
21,Server,Use server/api for API routes,Create API endpoints in server/api directory,server/api/users.ts for /api/users,Manual Express setup,server/api/hello.ts -> /api/hello,app.get('/api/hello'),High,https://nuxt.com/docs/guide/directory-structure/server
|
|
||||||
22,Server,Use defineEventHandler for handlers,Define server route handlers,defineEventHandler for all handlers,export default function,"export default defineEventHandler((event) => { return { hello: 'world' } })","export default function(req, res) {}",High,https://nuxt.com/docs/guide/directory-structure/server
|
|
||||||
23,Server,Use server/routes for non-api routes,Routes without /api prefix,server/routes for custom paths,server/api for non-api routes,server/routes/sitemap.xml.ts,server/api/sitemap.xml.ts,Medium,https://nuxt.com/docs/guide/directory-structure/server
|
|
||||||
24,Server,Use getQuery and readBody for input,Access query params and request body,getQuery(event) readBody(event),Direct event access,"const { id } = getQuery(event)",event.node.req.query,Medium,https://nuxt.com/docs/guide/directory-structure/server
|
|
||||||
25,Server,Validate server input,Always validate input in server handlers,Zod or similar for validation,Trust client input,"const body = await readBody(event); schema.parse(body)",const body = await readBody(event),High,https://nuxt.com/docs/guide/directory-structure/server
|
|
||||||
26,State,Use useState for shared reactive state,SSR-friendly shared state across components,useState for cross-component state,ref for shared state,"const count = useState('count', () => 0)",const count = ref(0) in composable,High,https://nuxt.com/docs/api/composables/use-state
|
|
||||||
27,State,Use unique keys for useState,Prevent state conflicts with unique keys,Descriptive unique keys for each state,Generic or duplicate keys,"useState('user-preferences', () => ({}))",useState('data') in multiple places,Medium,https://nuxt.com/docs/api/composables/use-state
|
|
||||||
28,State,Use Pinia for complex state,Pinia for advanced state management,@pinia/nuxt for complex apps,Custom state management,useMainStore() with Pinia,Custom reactive store implementation,Medium,https://nuxt.com/docs/getting-started/state-management
|
|
||||||
29,State,Use callOnce for one-time async operations,Ensure async operations run only once,callOnce for store initialization,Direct await in component,"await callOnce(store.fetch)",await store.fetch() on every render,Medium,https://nuxt.com/docs/api/utils/call-once
|
|
||||||
30,SEO,Use useSeoMeta for SEO tags,Type-safe SEO meta tag management,useSeoMeta for meta tags,useHead for simple meta,"useSeoMeta({ title: 'Home', ogTitle: 'Home', description: '...' })","useHead({ meta: [{ name: 'description', content: '...' }] })",High,https://nuxt.com/docs/api/composables/use-seo-meta
|
|
||||||
31,SEO,Use reactive values in useSeoMeta,Dynamic SEO tags with refs or getters,Computed getters for dynamic values,Static values for dynamic content,"useSeoMeta({ title: () => post.value.title })","useSeoMeta({ title: post.value.title })",Medium,https://nuxt.com/docs/api/composables/use-seo-meta
|
|
||||||
32,SEO,Use useHead for non-meta head elements,Scripts styles links in head,useHead for scripts and links,useSeoMeta for scripts,"useHead({ script: [{ src: '/analytics.js' }] })","useSeoMeta({ script: '...' })",Medium,https://nuxt.com/docs/api/composables/use-head
|
|
||||||
33,SEO,Include OpenGraph tags,Add OG tags for social sharing,ogTitle ogDescription ogImage,Missing social preview,"useSeoMeta({ ogImage: '/og.png', twitterCard: 'summary_large_image' })",No OG configuration,Medium,https://nuxt.com/docs/api/composables/use-seo-meta
|
|
||||||
34,Middleware,Use defineNuxtRouteMiddleware,Define route middleware properly,defineNuxtRouteMiddleware wrapper,export default function,"export default defineNuxtRouteMiddleware((to, from) => {})","export default function(to, from) {}",High,https://nuxt.com/docs/guide/directory-structure/middleware
|
|
||||||
35,Middleware,Use navigateTo for redirects,Redirect in middleware with navigateTo,return navigateTo('/login'),router.push in middleware,"if (!auth) return navigateTo('/login')","if (!auth) router.push('/login')",High,https://nuxt.com/docs/api/utils/navigate-to
|
|
||||||
36,Middleware,Reference middleware in definePageMeta,Apply middleware to specific pages,middleware array in definePageMeta,Global middleware for page-specific,definePageMeta({ middleware: ['auth'] }),Global auth check for one page,Medium,https://nuxt.com/docs/guide/directory-structure/middleware
|
|
||||||
37,Middleware,Use .global suffix for global middleware,Apply middleware to all routes,auth.global.ts for app-wide auth,Manual middleware on every page,middleware/auth.global.ts,middleware: ['auth'] on every page,Medium,https://nuxt.com/docs/guide/directory-structure/middleware
|
|
||||||
38,ErrorHandling,Use createError for errors,Create errors with proper status codes,createError with statusCode,throw new Error,"throw createError({ statusCode: 404, statusMessage: 'Not Found' })",throw new Error('Not Found'),High,https://nuxt.com/docs/api/utils/create-error
|
|
||||||
39,ErrorHandling,Use NuxtErrorBoundary for local errors,Handle errors within component subtree,NuxtErrorBoundary for component errors,Global error page for local errors,"<NuxtErrorBoundary @error=""log""><template #error=""{ error }"">",error.vue for component errors,Medium,https://nuxt.com/docs/getting-started/error-handling
|
|
||||||
40,ErrorHandling,Use clearError to recover from errors,Clear error state and optionally redirect,clearError({ redirect: '/' }),Manual error state reset,clearError({ redirect: '/home' }),error.value = null,Medium,https://nuxt.com/docs/api/utils/clear-error
|
|
||||||
41,ErrorHandling,Use short statusMessage,Keep statusMessage brief for security,Short generic messages,Detailed error info in statusMessage,"createError({ statusCode: 400, statusMessage: 'Bad Request' })","createError({ statusMessage: 'Invalid user ID: 123' })",High,https://nuxt.com/docs/getting-started/error-handling
|
|
||||||
42,Link,Use NuxtLink for internal navigation,Client-side navigation with prefetching,<NuxtLink to> for internal links,<a href> for internal links,<NuxtLink to="/about">About</NuxtLink>,<a href="/about">About</a>,High,https://nuxt.com/docs/api/components/nuxt-link
|
|
||||||
43,Link,Configure prefetch behavior,Control when prefetching occurs,prefetchOn for interaction-based,Default prefetch for low-priority,"<NuxtLink prefetch-on=""interaction"">",Always default prefetch,Low,https://nuxt.com/docs/api/components/nuxt-link
|
|
||||||
44,Link,Use useRouter for programmatic navigation,Navigate programmatically,useRouter().push() for navigation,Direct window.location,"const router = useRouter(); router.push('/dashboard')",window.location.href = '/dashboard',Medium,https://nuxt.com/docs/api/composables/use-router
|
|
||||||
45,Link,Use navigateTo in composables,Navigate outside components,navigateTo() in middleware or plugins,useRouter in non-component code,return navigateTo('/login'),router.push in middleware,Medium,https://nuxt.com/docs/api/utils/navigate-to
|
|
||||||
46,AutoImports,Leverage auto-imports,Use auto-imported composables directly,Direct use of ref computed useFetch,Manual imports for Nuxt composables,"const count = ref(0)","import { ref } from 'vue'; const count = ref(0)",Medium,https://nuxt.com/docs/guide/concepts/auto-imports
|
|
||||||
47,AutoImports,Use #imports for explicit imports,Explicit imports when needed,#imports for clarity or disabled auto-imports,"import from 'vue' when auto-import enabled","import { ref } from '#imports'","import { ref } from 'vue'",Low,https://nuxt.com/docs/guide/concepts/auto-imports
|
|
||||||
48,AutoImports,Configure third-party auto-imports,Add external package auto-imports,imports.presets in nuxt.config,Manual imports everywhere,"imports: { presets: [{ from: 'vue-i18n', imports: ['useI18n'] }] }",import { useI18n } everywhere,Low,https://nuxt.com/docs/guide/concepts/auto-imports
|
|
||||||
49,Plugins,Use defineNuxtPlugin,Define plugins properly,defineNuxtPlugin wrapper,export default function,"export default defineNuxtPlugin((nuxtApp) => {})","export default function(ctx) {}",High,https://nuxt.com/docs/guide/directory-structure/plugins
|
|
||||||
50,Plugins,Use provide for injection,Provide helpers across app,return { provide: {} } for type safety,nuxtApp.provide without types,"return { provide: { hello: (name) => `Hello ${name}!` } }","nuxtApp.provide('hello', fn)",Medium,https://nuxt.com/docs/guide/directory-structure/plugins
|
|
||||||
51,Plugins,Use .client or .server suffix,Control plugin execution environment,plugin.client.ts for client-only,if (process.client) checks,analytics.client.ts,"if (process.client) { // analytics }",Medium,https://nuxt.com/docs/guide/directory-structure/plugins
|
|
||||||
52,Environment,Use runtimeConfig for env vars,Access environment variables safely,runtimeConfig in nuxt.config,process.env directly,"runtimeConfig: { apiSecret: '', public: { apiBase: '' } }",process.env.API_SECRET in components,High,https://nuxt.com/docs/guide/going-further/runtime-config
|
|
||||||
53,Environment,Use NUXT_ prefix for env override,Override config with environment variables,NUXT_API_SECRET NUXT_PUBLIC_API_BASE,Custom env var names,NUXT_PUBLIC_API_BASE=https://api.example.com,API_BASE=https://api.example.com,High,https://nuxt.com/docs/guide/going-further/runtime-config
|
|
||||||
54,Environment,Access public config with useRuntimeConfig,Get public config in components,useRuntimeConfig().public,Direct process.env access,const config = useRuntimeConfig(); config.public.apiBase,process.env.NUXT_PUBLIC_API_BASE,High,https://nuxt.com/docs/api/composables/use-runtime-config
|
|
||||||
55,Environment,Keep secrets in private config,Server-only secrets in runtimeConfig root,runtimeConfig.apiSecret (server only),Secrets in public config,runtimeConfig: { dbPassword: '' },runtimeConfig: { public: { dbPassword: '' } },High,https://nuxt.com/docs/guide/going-further/runtime-config
|
|
||||||
56,Performance,Use Lazy prefix for code splitting,Lazy load components with Lazy prefix,<LazyComponent> for below-fold,Eager load all components,<LazyMountainsList v-if="show"/>,<MountainsList/> for hidden content,Medium,https://nuxt.com/docs/guide/directory-structure/components
|
|
||||||
57,Performance,Use useLazyFetch for non-blocking data,Alias for useFetch with lazy: true,useLazyFetch for secondary data,useFetch for all requests,"const { data } = useLazyFetch('/api/comments')",await useFetch for comments section,Medium,https://nuxt.com/docs/api/composables/use-lazy-fetch
|
|
||||||
58,Performance,Use lazy hydration for interactivity,Delay component hydration until needed,LazyComponent with hydration strategy,Immediate hydration for all,<LazyModal hydrate-on-visible/>,<Modal/> in footer,Low,https://nuxt.com/docs/guide/going-further/experimental-features
|
|
||||||
|
Can't render this file because it contains an unexpected character in line 8 and column 193.
|
@@ -1,52 +0,0 @@
|
|||||||
No,Category,Guideline,Description,Do,Don't,Code Good,Code Bad,Severity,Docs URL
|
|
||||||
1,Components,Use functional components,Hooks-based components are standard,Functional components with hooks,Class components,const App = () => { },class App extends Component,Medium,https://reactnative.dev/docs/intro-react
|
|
||||||
2,Components,Keep components small,Single responsibility principle,Split into smaller components,Large monolithic components,<Header /><Content /><Footer />,500+ line component,Medium,
|
|
||||||
3,Components,Use TypeScript,Type safety for props and state,TypeScript for new projects,JavaScript without types,const Button: FC<Props> = () => { },const Button = (props) => { },Medium,
|
|
||||||
4,Components,Colocate component files,Keep related files together,Component folder with styles,Flat structure,components/Button/index.tsx styles.ts,components/Button.tsx styles/button.ts,Low,
|
|
||||||
5,Styling,Use StyleSheet.create,Optimized style objects,StyleSheet for all styles,Inline style objects,StyleSheet.create({ container: {} }),style={{ margin: 10 }},High,https://reactnative.dev/docs/stylesheet
|
|
||||||
6,Styling,Avoid inline styles,Prevent object recreation,Styles in StyleSheet,Inline style objects in render,style={styles.container},"style={{ margin: 10, padding: 5 }}",Medium,
|
|
||||||
7,Styling,Use flexbox for layout,React Native uses flexbox,flexDirection alignItems justifyContent,Absolute positioning everywhere,flexDirection: 'row',position: 'absolute' everywhere,Medium,https://reactnative.dev/docs/flexbox
|
|
||||||
8,Styling,Handle platform differences,Platform-specific styles,Platform.select or .ios/.android files,Same styles for both platforms,"Platform.select({ ios: {}, android: {} })",Hardcoded iOS values,Medium,https://reactnative.dev/docs/platform-specific-code
|
|
||||||
9,Styling,Use responsive dimensions,Scale for different screens,Dimensions or useWindowDimensions,Fixed pixel values,useWindowDimensions(),width: 375,Medium,
|
|
||||||
10,Navigation,Use React Navigation,Standard navigation library,React Navigation for routing,Manual navigation management,createStackNavigator(),Custom navigation state,Medium,https://reactnavigation.org/
|
|
||||||
11,Navigation,Type navigation params,Type-safe navigation,Typed navigation props,Untyped navigation,"navigation.navigate<RootStackParamList>('Home', { id })","navigation.navigate('Home', { id })",Medium,
|
|
||||||
12,Navigation,Use deep linking,Support URL-based navigation,Configure linking prop,No deep link support,linking: { prefixes: [] },No linking configuration,Medium,https://reactnavigation.org/docs/deep-linking/
|
|
||||||
13,Navigation,Handle back button,Android back button handling,useFocusEffect with BackHandler,Ignore back button,BackHandler.addEventListener,No back handler,High,
|
|
||||||
14,State,Use useState for local state,Simple component state,useState for UI state,Class component state,"const [count, setCount] = useState(0)",this.state = { count: 0 },Medium,
|
|
||||||
15,State,Use useReducer for complex state,Complex state logic,useReducer for related state,Multiple useState for related values,useReducer(reducer initialState),5+ useState calls,Medium,
|
|
||||||
16,State,Use context sparingly,Context for global state,Context for theme auth locale,Context for frequently changing data,ThemeContext for app theme,Context for list item data,Medium,
|
|
||||||
17,State,Consider Zustand or Redux,External state management,Zustand for simple Redux for complex,useState for global state,create((set) => ({ })),Prop drilling global state,Medium,
|
|
||||||
18,Lists,Use FlatList for long lists,Virtualized list rendering,FlatList for 50+ items,ScrollView with map,<FlatList data={items} />,<ScrollView>{items.map()}</ScrollView>,High,https://reactnative.dev/docs/flatlist
|
|
||||||
19,Lists,Provide keyExtractor,Unique keys for list items,keyExtractor with stable ID,Index as key,keyExtractor={(item) => item.id},"keyExtractor={(_, index) => index}",High,
|
|
||||||
20,Lists,Optimize renderItem,Memoize list item components,React.memo for list items,Inline render function,renderItem={({ item }) => <MemoizedItem item={item} />},renderItem={({ item }) => <View>...</View>},High,
|
|
||||||
21,Lists,Use getItemLayout for fixed height,Skip measurement for performance,getItemLayout when height known,Dynamic measurement for fixed items,"getItemLayout={(_, index) => ({ length: 50, offset: 50 * index, index })}",No getItemLayout for fixed height,Medium,
|
|
||||||
22,Lists,Implement windowSize,Control render window,Smaller windowSize for memory,Default windowSize for large lists,windowSize={5},windowSize={21} for huge lists,Medium,
|
|
||||||
23,Performance,Use React.memo,Prevent unnecessary re-renders,memo for pure components,No memoization,export default memo(MyComponent),export default MyComponent,Medium,
|
|
||||||
24,Performance,Use useCallback for handlers,Stable function references,useCallback for props,New function on every render,"useCallback(() => {}, [deps])",() => handlePress(),Medium,
|
|
||||||
25,Performance,Use useMemo for expensive ops,Cache expensive calculations,useMemo for heavy computations,Recalculate every render,"useMemo(() => expensive(), [deps])",const result = expensive(),Medium,
|
|
||||||
26,Performance,Avoid anonymous functions in JSX,Prevent re-renders,Named handlers or useCallback,Inline arrow functions,onPress={handlePress},onPress={() => doSomething()},Medium,
|
|
||||||
27,Performance,Use Hermes engine,Improved startup and memory,Enable Hermes in build,JavaScriptCore for new projects,hermes_enabled: true,hermes_enabled: false,Medium,https://reactnative.dev/docs/hermes
|
|
||||||
28,Images,Use expo-image,Modern performant image component for React Native,"Use expo-image for caching, blurring, and performance",Use default Image for heavy lists or unmaintained libraries,<Image source={url} cachePolicy='memory-disk' /> (expo-image),<FastImage source={url} />,Medium,https://docs.expo.dev/versions/latest/sdk/image/
|
|
||||||
29,Images,Specify image dimensions,Prevent layout shifts,width and height for remote images,No dimensions for network images,<Image style={{ width: 100 height: 100 }} />,<Image source={{ uri }} /> no size,High,
|
|
||||||
30,Images,Use resizeMode,Control image scaling,resizeMode cover contain,Stretch images,"resizeMode=""cover""",No resizeMode,Low,
|
|
||||||
31,Forms,Use controlled inputs,State-controlled form fields,value + onChangeText,Uncontrolled inputs,<TextInput value={text} onChangeText={setText} />,<TextInput defaultValue={text} />,Medium,
|
|
||||||
32,Forms,Handle keyboard,Manage keyboard visibility,KeyboardAvoidingView,Content hidden by keyboard,"<KeyboardAvoidingView behavior=""padding"">",No keyboard handling,High,https://reactnative.dev/docs/keyboardavoidingview
|
|
||||||
33,Forms,Use proper keyboard types,Appropriate keyboard for input,keyboardType for input type,Default keyboard for all,"keyboardType=""email-address""","keyboardType=""default"" for email",Low,
|
|
||||||
34,Touch,Use Pressable,Modern touch handling,Pressable for touch interactions,TouchableOpacity for new code,<Pressable onPress={} />,<TouchableOpacity onPress={} />,Low,https://reactnative.dev/docs/pressable
|
|
||||||
35,Touch,Provide touch feedback,Visual feedback on press,Ripple or opacity change,No feedback on press,android_ripple={{ color: 'gray' }},No press feedback,Medium,
|
|
||||||
36,Touch,Set hitSlop for small targets,Increase touch area,hitSlop for icons and small buttons,Tiny touch targets,hitSlop={{ top: 10 bottom: 10 }},44x44 with no hitSlop,Medium,
|
|
||||||
37,Animation,Use Reanimated,High-performance animations,react-native-reanimated,Animated API for complex,useSharedValue useAnimatedStyle,Animated.timing for gesture,Medium,https://docs.swmansion.com/react-native-reanimated/
|
|
||||||
38,Animation,Run on UI thread,worklets for smooth animation,Run animations on UI thread,JS thread animations,runOnUI(() => {}),Animated on JS thread,High,
|
|
||||||
39,Animation,Use gesture handler,Native gesture recognition,react-native-gesture-handler,JS-based gesture handling,<GestureDetector>,<View onTouchMove={} />,Medium,https://docs.swmansion.com/react-native-gesture-handler/
|
|
||||||
40,Async,Handle loading states,Show loading indicators,ActivityIndicator during load,Empty screen during load,{isLoading ? <ActivityIndicator /> : <Content />},No loading state,Medium,
|
|
||||||
41,Async,Handle errors gracefully,Error boundaries and fallbacks,Error UI for failed requests,Crash on error,{error ? <ErrorView /> : <Content />},No error handling,High,
|
|
||||||
42,Async,Cancel async operations,Cleanup on unmount,AbortController or cleanup,Memory leaks from async,useEffect cleanup,No cleanup for subscriptions,High,
|
|
||||||
43,Accessibility,Add accessibility labels,Describe UI elements,accessibilityLabel for all interactive,Missing labels,"accessibilityLabel=""Submit form""",<Pressable> without label,High,https://reactnative.dev/docs/accessibility
|
|
||||||
44,Accessibility,Use accessibility roles,Semantic meaning,accessibilityRole for elements,Wrong roles,"accessibilityRole=""button""",No role for button,Medium,
|
|
||||||
45,Accessibility,Support screen readers,Test with TalkBack/VoiceOver,Test with screen readers,Skip accessibility testing,Regular TalkBack testing,No screen reader testing,High,
|
|
||||||
46,Testing,Use React Native Testing Library,Component testing,render and fireEvent,Enzyme or manual testing,render(<Component />),shallow(<Component />),Medium,https://callstack.github.io/react-native-testing-library/
|
|
||||||
47,Testing,Test on real devices,Real device behavior,Test on iOS and Android devices,Simulator only,Device testing in CI,Simulator only testing,High,
|
|
||||||
48,Testing,Use Detox for E2E,End-to-end testing,Detox for critical flows,Manual E2E testing,detox test,Manual testing only,Medium,https://wix.github.io/Detox/
|
|
||||||
49,Native,Use native modules carefully,Bridge has overhead,Batch native calls,Frequent bridge crossing,Batch updates,Call native on every keystroke,High,
|
|
||||||
50,Native,Use Expo when possible,Simplified development,Expo for standard features,Bare RN for simple apps,expo install package,react-native link package,Low,https://docs.expo.dev/
|
|
||||||
51,Native,Handle permissions,Request permissions properly,Check and request permissions,Assume permissions granted,PermissionsAndroid.request(),Access without permission check,High,https://reactnative.dev/docs/permissionsandroid
|
|
||||||
|
@@ -1,54 +0,0 @@
|
|||||||
No,Category,Guideline,Description,Do,Don't,Code Good,Code Bad,Severity,Docs URL
|
|
||||||
1,Reactivity,Use $: for reactive statements,Automatic dependency tracking,$: for derived values,Manual recalculation,$: doubled = count * 2,let doubled; count && (doubled = count * 2),Medium,https://svelte.dev/docs/svelte-components#script-3-$-marks-a-statement-as-reactive
|
|
||||||
2,Reactivity,Trigger reactivity with assignment,Svelte tracks assignments not mutations,Reassign arrays/objects to trigger update,Mutate without reassignment,"items = [...items, newItem]",items.push(newItem),High,https://svelte.dev/docs/svelte-components#script-2-assignments-are-reactive
|
|
||||||
3,Reactivity,Use $state in Svelte 5,Runes for explicit reactivity,let count = $state(0),Implicit reactivity in Svelte 5,let count = $state(0),let count = 0 (Svelte 5),Medium,https://svelte.dev/blog/runes
|
|
||||||
4,Reactivity,Use $derived for computed values,$derived replaces $: in Svelte 5,let doubled = $derived(count * 2),$: in Svelte 5,let doubled = $derived(count * 2),$: doubled = count * 2 (Svelte 5),Medium,
|
|
||||||
5,Reactivity,Use $effect for side effects,$effect replaces $: side effects,Use $effect for subscriptions,$: for side effects in Svelte 5,$effect(() => console.log(count)),$: console.log(count) (Svelte 5),Medium,
|
|
||||||
6,Props,Export let for props,Declare props with export let,export let propName,Props without export,export let count = 0,let count = 0,High,https://svelte.dev/docs/svelte-components#script-1-export-creates-a-component-prop
|
|
||||||
7,Props,Use $props in Svelte 5,$props rune for prop access,let { name } = $props(),export let in Svelte 5,"let { name, age = 0 } = $props()",export let name; export let age = 0,Medium,
|
|
||||||
8,Props,Provide default values,Default props with assignment,export let count = 0,Required props without defaults,export let count = 0,export let count,Low,
|
|
||||||
9,Props,Use spread props,Pass through unknown props,{...$$restProps} on elements,Manual prop forwarding,<button {...$$restProps}>,<button class={$$props.class}>,Low,https://svelte.dev/docs/basic-markup#attributes-and-props
|
|
||||||
10,Bindings,Use bind: for two-way binding,Simplified input handling,bind:value for inputs,on:input with manual update,<input bind:value={name}>,<input value={name} on:input={e => name = e.target.value}>,Low,https://svelte.dev/docs/element-directives#bind-property
|
|
||||||
11,Bindings,Bind to DOM elements,Reference DOM nodes,bind:this for element reference,querySelector in onMount,<div bind:this={el}>,onMount(() => el = document.querySelector()),Medium,
|
|
||||||
12,Bindings,Use bind:group for radios/checkboxes,Simplified group handling,bind:group for radio/checkbox groups,Manual checked handling,"<input type=""radio"" bind:group={selected}>","<input type=""radio"" checked={selected === value}>",Low,
|
|
||||||
13,Events,Use on: for event handlers,Event directive syntax,on:click={handler},addEventListener in onMount,<button on:click={handleClick}>,onMount(() => btn.addEventListener()),Medium,https://svelte.dev/docs/element-directives#on-eventname
|
|
||||||
14,Events,Forward events with on:event,Pass events to parent,on:click without handler,createEventDispatcher for DOM events,<button on:click>,"dispatch('click', event)",Low,
|
|
||||||
15,Events,Use createEventDispatcher,Custom component events,dispatch for custom events,on:event for custom events,"dispatch('save', { data })",on:save without dispatch,Medium,https://svelte.dev/docs/svelte#createeventdispatcher
|
|
||||||
16,Lifecycle,Use onMount for initialization,Run code after component mounts,onMount for setup and data fetching,Code in script body for side effects,onMount(() => fetchData()),fetchData() in script body,High,https://svelte.dev/docs/svelte#onmount
|
|
||||||
17,Lifecycle,Return cleanup from onMount,Automatic cleanup on destroy,Return function from onMount,Separate onDestroy for paired cleanup,onMount(() => { sub(); return unsub }),onMount(sub); onDestroy(unsub),Medium,
|
|
||||||
18,Lifecycle,Use onDestroy sparingly,Only when onMount cleanup not possible,onDestroy for non-mount cleanup,onDestroy for mount-related cleanup,onDestroy for store unsubscribe,onDestroy(() => clearInterval(id)),Low,
|
|
||||||
19,Lifecycle,Avoid beforeUpdate/afterUpdate,Usually not needed,Reactive statements instead,beforeUpdate for derived state,$: if (x) doSomething(),beforeUpdate(() => doSomething()),Low,
|
|
||||||
20,Stores,Use writable for mutable state,Basic reactive store,writable for shared mutable state,Local variables for shared state,const count = writable(0),let count = 0 in module,Medium,https://svelte.dev/docs/svelte-store#writable
|
|
||||||
21,Stores,Use readable for read-only state,External data sources,readable for derived/external data,writable for read-only data,"readable(0, set => interval(set))",writable(0) for timer,Low,https://svelte.dev/docs/svelte-store#readable
|
|
||||||
22,Stores,Use derived for computed stores,Combine or transform stores,derived for computed values,Manual subscription for derived,"derived(count, $c => $c * 2)",count.subscribe(c => doubled = c * 2),Medium,https://svelte.dev/docs/svelte-store#derived
|
|
||||||
23,Stores,Use $ prefix for auto-subscription,Automatic subscribe/unsubscribe,$storeName in components,Manual subscription,{$count},count.subscribe(c => value = c),High,
|
|
||||||
24,Stores,Clean up custom subscriptions,Unsubscribe when component destroys,Return unsubscribe from onMount,Leave subscriptions open,onMount(() => store.subscribe(fn)),store.subscribe(fn) in script,High,
|
|
||||||
25,Slots,Use slots for composition,Content projection,<slot> for flexible content,Props for all content,<slot>Default</slot>,"<Component content=""text""/>",Medium,https://svelte.dev/docs/special-elements#slot
|
|
||||||
26,Slots,Name slots for multiple areas,Multiple content areas,"<slot name=""header"">",Single slot for complex layouts,"<slot name=""header""><slot name=""footer"">",<slot> with complex conditionals,Low,
|
|
||||||
27,Slots,Check slot content with $$slots,Conditional slot rendering,$$slots.name for conditional rendering,Always render slot wrapper,"{#if $$slots.footer}<slot name=""footer""/>{/if}","<div><slot name=""footer""/></div>",Low,
|
|
||||||
28,Styling,Use scoped styles by default,Styles scoped to component,<style> for component styles,Global styles for component,:global() only when needed,<style> all global,Medium,https://svelte.dev/docs/svelte-components#style
|
|
||||||
29,Styling,Use :global() sparingly,Escape scoping when needed,:global for third-party styling,Global for all styles,:global(.external-lib),<style> without scoping,Medium,
|
|
||||||
30,Styling,Use CSS variables for theming,Dynamic styling,CSS custom properties,Inline styles for themes,"style=""--color: {color}""","style=""color: {color}""",Low,
|
|
||||||
31,Transitions,Use built-in transitions,Svelte transition directives,transition:fade for simple effects,Manual CSS transitions,<div transition:fade>,<div class:fade={visible}>,Low,https://svelte.dev/docs/element-directives#transition-fn
|
|
||||||
32,Transitions,Use in: and out: separately,Different enter/exit animations,in:fly out:fade for asymmetric,Same transition for both,<div in:fly out:fade>,<div transition:fly>,Low,
|
|
||||||
33,Transitions,Add local modifier,Prevent ancestor trigger,transition:fade|local,Global transitions for lists,<div transition:slide|local>,<div transition:slide>,Medium,
|
|
||||||
34,Actions,Use actions for DOM behavior,Reusable DOM logic,use:action for DOM enhancements,onMount for each usage,<div use:clickOutside>,onMount(() => setupClickOutside(el)),Medium,https://svelte.dev/docs/element-directives#use-action
|
|
||||||
35,Actions,Return update and destroy,Lifecycle methods for actions,"Return { update, destroy }",Only initial setup,"return { update(params) {}, destroy() {} }",return destroy only,Medium,
|
|
||||||
36,Actions,Pass parameters to actions,Configure action behavior,use:action={params},Hardcoded action behavior,<div use:tooltip={options}>,<div use:tooltip>,Low,
|
|
||||||
37,Logic,Use {#if} for conditionals,Template conditionals,{#if} {:else if} {:else},Ternary in expressions,{#if cond}...{:else}...{/if},{cond ? a : b} for complex,Low,https://svelte.dev/docs/logic-blocks#if
|
|
||||||
38,Logic,Use {#each} for lists,List rendering,{#each} with key,Map in expression,{#each items as item (item.id)},{items.map(i => `<div>${i}</div>`)},Medium,
|
|
||||||
39,Logic,Always use keys in {#each},Proper list reconciliation,(item.id) for unique key,Index as key or no key,{#each items as item (item.id)},"{#each items as item, i (i)}",High,
|
|
||||||
40,Logic,Use {#await} for promises,Handle async states,{#await} for loading/error states,Manual promise handling,{#await promise}...{:then}...{:catch},{#if loading}...{#if error},Medium,https://svelte.dev/docs/logic-blocks#await
|
|
||||||
41,SvelteKit,Use +page.svelte for routes,File-based routing,+page.svelte for route components,Custom routing setup,routes/about/+page.svelte,routes/About.svelte,Medium,https://kit.svelte.dev/docs/routing
|
|
||||||
42,SvelteKit,Use +page.js for data loading,Load data before render,load function in +page.js,onMount for data fetching,export function load() {},onMount(() => fetchData()),High,https://kit.svelte.dev/docs/load
|
|
||||||
43,SvelteKit,Use +page.server.js for server-only,Server-side data loading,+page.server.js for sensitive data,+page.js for API keys,+page.server.js with DB access,+page.js with DB access,High,
|
|
||||||
44,SvelteKit,Use form actions,Server-side form handling,+page.server.js actions,API routes for forms,export const actions = { default },fetch('/api/submit'),Medium,https://kit.svelte.dev/docs/form-actions
|
|
||||||
45,SvelteKit,Use $app/stores for app state,$page $navigating $updated,$page for current page data,Manual URL parsing,import { page } from '$app/stores',window.location.pathname,Medium,https://kit.svelte.dev/docs/modules#$app-stores
|
|
||||||
46,Performance,Use {#key} for forced re-render,Reset component state,{#key id} for fresh instance,Manual destroy/create,{#key item.id}<Component/>{/key},on:change={() => component = null},Low,https://svelte.dev/docs/logic-blocks#key
|
|
||||||
47,Performance,Avoid unnecessary reactivity,Not everything needs $:,$: only for side effects,$: for simple assignments,$: if (x) console.log(x),$: y = x (when y = x works),Low,
|
|
||||||
48,Performance,Use immutable compiler option,Skip equality checks,immutable: true for large lists,Default for all components,<svelte:options immutable/>,Default without immutable,Low,
|
|
||||||
49,TypeScript,"Use lang=""ts"" in script",TypeScript support,"<script lang=""ts"">",JavaScript for typed projects,"<script lang=""ts"">",<script> with JSDoc,Medium,https://svelte.dev/docs/typescript
|
|
||||||
50,TypeScript,Type props with interface,Explicit prop types,interface $$Props for types,Untyped props,interface $$Props { name: string },export let name,Medium,
|
|
||||||
51,TypeScript,Type events with createEventDispatcher,Type-safe events,createEventDispatcher<Events>(),Untyped dispatch,createEventDispatcher<{ save: Data }>(),createEventDispatcher(),Medium,
|
|
||||||
52,Accessibility,Use semantic elements,Proper HTML in templates,button nav main appropriately,div for everything,<button on:click>,<div on:click>,High,
|
|
||||||
53,Accessibility,Add aria to dynamic content,Accessible state changes,aria-live for updates,Silent dynamic updates,"<div aria-live=""polite"">{message}</div>",<div>{message}</div>,Medium,
|
|
||||||
|
@@ -1,51 +0,0 @@
|
|||||||
No,Category,Guideline,Description,Do,Don't,Code Good,Code Bad,Severity,Docs URL
|
|
||||||
1,Views,Use struct for views,SwiftUI views are value types,struct MyView: View,class MyView: View,struct ContentView: View { var body: some View },class ContentView: View,High,https://developer.apple.com/documentation/swiftui/view
|
|
||||||
2,Views,Keep views small and focused,Single responsibility for each view,Extract subviews for complex layouts,Large monolithic views,Extract HeaderView FooterView,500+ line View struct,Medium,
|
|
||||||
3,Views,Use body computed property,body returns the view hierarchy,var body: some View { },func body() -> some View,"var body: some View { Text(""Hello"") }",func body() -> Text,High,
|
|
||||||
4,Views,Prefer composition over inheritance,Compose views using ViewBuilder,Combine smaller views,Inheritance hierarchies,VStack { Header() Content() },class SpecialView extends BaseView,Medium,
|
|
||||||
5,State,Use @State for local state,Simple value types owned by view,@State for view-local primitives,@State for shared data,@State private var count = 0,@State var sharedData: Model,High,https://developer.apple.com/documentation/swiftui/state
|
|
||||||
6,State,Use @Binding for two-way data,Pass mutable state to child views,@Binding for child input,@State in child for parent data,@Binding var isOn: Bool,$isOn to pass binding,Medium,https://developer.apple.com/documentation/swiftui/binding
|
|
||||||
7,State,Use @StateObject for reference types,ObservableObject owned by view,@StateObject for view-created objects,@ObservedObject for owned objects,@StateObject private var vm = ViewModel(),@ObservedObject var vm = ViewModel(),High,https://developer.apple.com/documentation/swiftui/stateobject
|
|
||||||
8,State,Use @ObservedObject for injected objects,Reference types passed from parent,@ObservedObject for injected dependencies,@StateObject for injected objects,@ObservedObject var vm: ViewModel,@StateObject var vm: ViewModel (injected),High,https://developer.apple.com/documentation/swiftui/observedobject
|
|
||||||
9,State,Use @EnvironmentObject for shared state,App-wide state injection,@EnvironmentObject for global state,Prop drilling through views,@EnvironmentObject var settings: Settings,Pass settings through 5 views,Medium,https://developer.apple.com/documentation/swiftui/environmentobject
|
|
||||||
10,State,Use @Published in ObservableObject,Automatically publish property changes,@Published for observed properties,Manual objectWillChange calls,@Published var items: [Item] = [],var items: [Item] { didSet { objectWillChange.send() } },Medium,
|
|
||||||
11,Observable,Use @Observable macro (iOS 17+),Modern observation without Combine,@Observable class for view models,ObservableObject for new projects,@Observable class ViewModel { },class ViewModel: ObservableObject,Medium,https://developer.apple.com/documentation/observation
|
|
||||||
12,Observable,Use @Bindable for @Observable,Create bindings from @Observable,@Bindable var vm for bindings,@Binding with @Observable,@Bindable var viewModel,$viewModel.name with @Observable,Medium,
|
|
||||||
13,Layout,Use VStack HStack ZStack,Standard stack-based layouts,Stacks for linear arrangements,GeometryReader for simple layouts,VStack { Text() Image() },GeometryReader for vertical list,Medium,https://developer.apple.com/documentation/swiftui/vstack
|
|
||||||
14,Layout,Use LazyVStack LazyHStack for lists,Lazy loading for performance,Lazy stacks for long lists,Regular stacks for 100+ items,LazyVStack { ForEach(items) },VStack { ForEach(largeArray) },High,https://developer.apple.com/documentation/swiftui/lazyvstack
|
|
||||||
15,Layout,Use GeometryReader sparingly,Only when needed for sizing,GeometryReader for responsive layouts,GeometryReader everywhere,GeometryReader for aspect ratio,GeometryReader wrapping everything,Medium,
|
|
||||||
16,Layout,Use spacing and padding consistently,Consistent spacing throughout app,Design system spacing values,Magic numbers for spacing,.padding(16) or .padding(),".padding(13), .padding(17)",Low,
|
|
||||||
17,Layout,Use frame modifiers correctly,Set explicit sizes when needed,.frame(maxWidth: .infinity),Fixed sizes for responsive content,.frame(maxWidth: .infinity),.frame(width: 375),Medium,
|
|
||||||
18,Modifiers,Order modifiers correctly,Modifier order affects rendering,Background before padding for full coverage,Wrong modifier order,.padding().background(Color.red),.background(Color.red).padding(),High,
|
|
||||||
19,Modifiers,Create custom ViewModifiers,Reusable modifier combinations,ViewModifier for repeated styling,Duplicate modifier chains,struct CardStyle: ViewModifier,.shadow().cornerRadius() everywhere,Medium,https://developer.apple.com/documentation/swiftui/viewmodifier
|
|
||||||
20,Modifiers,Use conditional modifiers carefully,Avoid changing view identity,if-else with same view type,Conditional that changes view identity,Text(title).foregroundColor(isActive ? .blue : .gray),if isActive { Text().bold() } else { Text() },Medium,
|
|
||||||
21,Navigation,Use NavigationStack (iOS 16+),Modern navigation with type-safe paths,NavigationStack with navigationDestination,NavigationView for new projects,NavigationStack { },NavigationView { } (deprecated),Medium,https://developer.apple.com/documentation/swiftui/navigationstack
|
|
||||||
22,Navigation,Use navigationDestination,Type-safe navigation destinations,.navigationDestination(for:),NavigationLink(destination:),.navigationDestination(for: Item.self),NavigationLink(destination: DetailView()),Medium,
|
|
||||||
23,Navigation,Use @Environment for dismiss,Programmatic navigation dismissal,@Environment(\.dismiss) var dismiss,presentationMode (deprecated),@Environment(\.dismiss) var dismiss,@Environment(\.presentationMode),Low,
|
|
||||||
24,Lists,Use List for scrollable content,Built-in scrolling and styling,List for standard scrollable content,ScrollView + VStack for simple lists,List { ForEach(items) { } },ScrollView { VStack { ForEach } },Low,https://developer.apple.com/documentation/swiftui/list
|
|
||||||
25,Lists,Provide stable identifiers,Use Identifiable or explicit id,Identifiable protocol or id parameter,Index as identifier,ForEach(items) where Item: Identifiable,"ForEach(items.indices, id: \.self)",High,
|
|
||||||
26,Lists,Use onDelete and onMove,Standard list editing,onDelete for swipe to delete,Custom delete implementation,.onDelete(perform: delete),.onTapGesture for delete,Low,
|
|
||||||
27,Forms,Use Form for settings,Grouped input controls,Form for settings screens,Manual grouping for forms,Form { Section { Toggle() } },VStack { Toggle() },Low,https://developer.apple.com/documentation/swiftui/form
|
|
||||||
28,Forms,Use @FocusState for keyboard,Manage keyboard focus,@FocusState for text field focus,Manual first responder handling,@FocusState private var isFocused: Bool,UIKit first responder,Medium,https://developer.apple.com/documentation/swiftui/focusstate
|
|
||||||
29,Forms,Validate input properly,Show validation feedback,Real-time validation feedback,Submit without validation,TextField with validation state,TextField without error handling,Medium,
|
|
||||||
30,Async,Use .task for async work,Automatic cancellation on view disappear,.task for view lifecycle async,onAppear with Task,.task { await loadData() },onAppear { Task { await loadData() } },Medium,https://developer.apple.com/documentation/swiftui/view/task(priority:_:)
|
|
||||||
31,Async,Handle loading states,Show progress during async operations,ProgressView during loading,Empty view during load,if isLoading { ProgressView() },No loading indicator,Medium,
|
|
||||||
32,Async,Use @MainActor for UI updates,Ensure UI updates on main thread,@MainActor on view models,Manual DispatchQueue.main,@MainActor class ViewModel,DispatchQueue.main.async,Medium,
|
|
||||||
33,Animation,Use withAnimation,Animate state changes,withAnimation for state transitions,No animation for state changes,withAnimation { isExpanded.toggle() },isExpanded.toggle(),Low,https://developer.apple.com/documentation/swiftui/withanimation(_:_:)
|
|
||||||
34,Animation,Use .animation modifier,Apply animations to views,.animation(.spring()) on view,Manual animation timing,.animation(.easeInOut),CABasicAnimation equivalent,Low,
|
|
||||||
35,Animation,Respect reduced motion,Check accessibility settings,Check accessibilityReduceMotion,Ignore motion preferences,@Environment(\.accessibilityReduceMotion),Always animate regardless,High,
|
|
||||||
36,Preview,Use #Preview macro (Xcode 15+),Modern preview syntax,#Preview for view previews,PreviewProvider protocol,#Preview { ContentView() },struct ContentView_Previews: PreviewProvider,Low,
|
|
||||||
37,Preview,Create multiple previews,Test different states and devices,Multiple previews for states,Single preview only,"#Preview(""Light"") { } #Preview(""Dark"") { }",Single preview configuration,Low,
|
|
||||||
38,Preview,Use preview data,Dedicated preview mock data,Static preview data,Production data in previews,Item.preview for preview,Fetch real data in preview,Low,
|
|
||||||
39,Performance,Avoid expensive body computations,Body should be fast to compute,Precompute in view model,Heavy computation in body,vm.computedValue in body,Complex calculation in body,High,
|
|
||||||
40,Performance,Use Equatable views,Skip unnecessary view updates,Equatable for complex views,Default equality for all views,struct MyView: View Equatable,No Equatable conformance,Medium,
|
|
||||||
41,Performance,Profile with Instruments,Measure before optimizing,Use SwiftUI Instruments,Guess at performance issues,Profile with Instruments,Optimize without measuring,Medium,
|
|
||||||
42,Accessibility,Add accessibility labels,Describe UI elements,.accessibilityLabel for context,Missing labels,".accessibilityLabel(""Close button"")",Button without label,High,https://developer.apple.com/documentation/swiftui/view/accessibilitylabel(_:)-1d7jv
|
|
||||||
43,Accessibility,Support Dynamic Type,Respect text size preferences,Scalable fonts and layouts,Fixed font sizes,.font(.body) with Dynamic Type,.font(.system(size: 16)),High,
|
|
||||||
44,Accessibility,Use semantic views,Proper accessibility traits,Correct accessibilityTraits,Wrong semantic meaning,Button for actions Image for display,Image that acts like button,Medium,
|
|
||||||
45,Testing,Use ViewInspector for testing,Third-party view testing,ViewInspector for unit tests,UI tests only,ViewInspector assertions,Only XCUITest,Medium,
|
|
||||||
46,Testing,Test view models,Unit test business logic,XCTest for view model,Skip view model testing,Test ViewModel methods,No unit tests,Medium,
|
|
||||||
47,Testing,Use preview as visual test,Previews catch visual regressions,Multiple preview configurations,No visual verification,Preview different states,Single preview only,Low,
|
|
||||||
48,Architecture,Use MVVM pattern,Separate view and logic,ViewModel for business logic,Logic in View,ObservableObject ViewModel,@State for complex logic,Medium,
|
|
||||||
49,Architecture,Keep views dumb,Views display view model state,View reads from ViewModel,Business logic in View,view.items from vm.items,Complex filtering in View,Medium,
|
|
||||||
50,Architecture,Use dependency injection,Inject dependencies for testing,Initialize with dependencies,Hard-coded dependencies,init(service: ServiceProtocol),let service = RealService(),Medium,
|
|
||||||
|
@@ -1,50 +0,0 @@
|
|||||||
No,Category,Guideline,Description,Do,Don't,Code Good,Code Bad,Severity,Docs URL
|
|
||||||
1,Composition,Use Composition API for new projects,Composition API offers better TypeScript support and logic reuse,<script setup> for components,Options API for new projects,<script setup>,export default { data() },Medium,https://vuejs.org/guide/extras/composition-api-faq.html
|
|
||||||
2,Composition,Use script setup syntax,Cleaner syntax with automatic exports,<script setup> with defineProps,setup() function manually,<script setup>,<script> setup() { return {} },Low,https://vuejs.org/api/sfc-script-setup.html
|
|
||||||
3,Reactivity,Use ref for primitives,ref() for primitive values that need reactivity,ref() for strings numbers booleans,reactive() for primitives,const count = ref(0),const count = reactive(0),Medium,https://vuejs.org/guide/essentials/reactivity-fundamentals.html
|
|
||||||
4,Reactivity,Use reactive for objects,reactive() for complex objects and arrays,reactive() for objects with multiple properties,ref() for complex objects,const state = reactive({ user: null }),const state = ref({ user: null }),Medium,
|
|
||||||
5,Reactivity,Access ref values with .value,Remember .value in script unwrap in template,Use .value in script,Forget .value in script,count.value++,count++ (in script),High,
|
|
||||||
6,Reactivity,Use computed for derived state,Computed properties cache and update automatically,computed() for derived values,Methods for derived values,const doubled = computed(() => count.value * 2),const doubled = () => count.value * 2,Medium,https://vuejs.org/guide/essentials/computed.html
|
|
||||||
7,Reactivity,Use shallowRef for large objects,Avoid deep reactivity for performance,shallowRef for large data structures,ref for large nested objects,const bigData = shallowRef(largeObject),const bigData = ref(largeObject),Medium,https://vuejs.org/api/reactivity-advanced.html#shallowref
|
|
||||||
8,Watchers,Use watchEffect for simple cases,Auto-tracks dependencies,watchEffect for simple reactive effects,watch with explicit deps when not needed,watchEffect(() => console.log(count.value)),"watch(count, (val) => console.log(val))",Low,https://vuejs.org/guide/essentials/watchers.html
|
|
||||||
9,Watchers,Use watch for specific sources,Explicit control over what to watch,watch with specific refs,watchEffect for complex conditional logic,"watch(userId, fetchUser)",watchEffect with conditionals,Medium,
|
|
||||||
10,Watchers,Clean up side effects,Return cleanup function in watchers,Return cleanup in watchEffect,Leave subscriptions open,watchEffect((onCleanup) => { onCleanup(unsub) }),watchEffect without cleanup,High,
|
|
||||||
11,Props,Define props with defineProps,Type-safe prop definitions,defineProps with TypeScript,Props without types,defineProps<{ msg: string }>(),defineProps(['msg']),Medium,https://vuejs.org/guide/typescript/composition-api.html#typing-component-props
|
|
||||||
12,Props,Use withDefaults for default values,Provide defaults for optional props,withDefaults with defineProps,Defaults in destructuring,"withDefaults(defineProps<Props>(), { count: 0 })",const { count = 0 } = defineProps(),Medium,
|
|
||||||
13,Props,Avoid mutating props,Props should be read-only,Emit events to parent for changes,Direct prop mutation,"emit('update:modelValue', newVal)",props.modelValue = newVal,High,
|
|
||||||
14,Emits,Define emits with defineEmits,Type-safe event emissions,defineEmits with types,Emit without definition,defineEmits<{ change: [id: number] }>(),"emit('change', id) without define",Medium,https://vuejs.org/guide/typescript/composition-api.html#typing-component-emits
|
|
||||||
15,Emits,Use v-model for two-way binding,Simplified parent-child data flow,v-model with modelValue prop,:value + @input manually,"<Child v-model=""value""/>","<Child :value=""value"" @input=""value = $event""/>",Low,https://vuejs.org/guide/components/v-model.html
|
|
||||||
16,Lifecycle,Use onMounted for DOM access,DOM is ready in onMounted,onMounted for DOM operations,Access DOM in setup directly,onMounted(() => el.value.focus()),el.value.focus() in setup,High,https://vuejs.org/api/composition-api-lifecycle.html
|
|
||||||
17,Lifecycle,Clean up in onUnmounted,Remove listeners and subscriptions,onUnmounted for cleanup,Leave listeners attached,onUnmounted(() => window.removeEventListener()),No cleanup on unmount,High,
|
|
||||||
18,Lifecycle,Avoid onBeforeMount for data,Use onMounted or setup for data fetching,Fetch in onMounted or setup,Fetch in onBeforeMount,onMounted(async () => await fetchData()),onBeforeMount(async () => await fetchData()),Low,
|
|
||||||
19,Components,Use single-file components,Keep template script style together,.vue files for components,Separate template/script files,Component.vue with all parts,Component.js + Component.html,Low,
|
|
||||||
20,Components,Use PascalCase for components,Consistent component naming,PascalCase in imports and templates,kebab-case in script,<MyComponent/>,<my-component/>,Low,https://vuejs.org/style-guide/rules-strongly-recommended.html
|
|
||||||
21,Components,Prefer composition over mixins,Composables replace mixins,Composables for shared logic,Mixins for code reuse,const { data } = useApi(),mixins: [apiMixin],Medium,
|
|
||||||
22,Composables,Name composables with use prefix,Convention for composable functions,useFetch useAuth useForm,getData or fetchApi,export function useFetch(),export function fetchData(),Medium,https://vuejs.org/guide/reusability/composables.html
|
|
||||||
23,Composables,Return refs from composables,Maintain reactivity when destructuring,Return ref values,Return reactive objects that lose reactivity,return { data: ref(null) },return reactive({ data: null }),Medium,
|
|
||||||
24,Composables,Accept ref or value params,Use toValue for flexible inputs,toValue() or unref() for params,Only accept ref or only value,const val = toValue(maybeRef),const val = maybeRef.value,Low,https://vuejs.org/api/reactivity-utilities.html#tovalue
|
|
||||||
25,Templates,Use v-bind shorthand,Cleaner template syntax,:prop instead of v-bind:prop,Full v-bind syntax,"<div :class=""cls"">","<div v-bind:class=""cls"">",Low,
|
|
||||||
26,Templates,Use v-on shorthand,Cleaner event binding,@event instead of v-on:event,Full v-on syntax,"<button @click=""handler"">","<button v-on:click=""handler"">",Low,
|
|
||||||
27,Templates,Avoid v-if with v-for,v-if has higher priority causes issues,Wrap in template or computed filter,v-if on same element as v-for,<template v-for><div v-if>,<div v-for v-if>,High,https://vuejs.org/style-guide/rules-essential.html#avoid-v-if-with-v-for
|
|
||||||
28,Templates,Use key with v-for,Proper list rendering and updates,Unique key for each item,Index as key for dynamic lists,"v-for=""item in items"" :key=""item.id""","v-for=""(item, i) in items"" :key=""i""",High,
|
|
||||||
29,State,Use Pinia for global state,Official state management for Vue 3,Pinia stores for shared state,Vuex for new projects,const store = useCounterStore(),Vuex with mutations,Medium,https://pinia.vuejs.org/
|
|
||||||
30,State,Define stores with defineStore,Composition API style stores,Setup stores with defineStore,Options stores for complex state,"defineStore('counter', () => {})","defineStore('counter', { state })",Low,
|
|
||||||
31,State,Use storeToRefs for destructuring,Maintain reactivity when destructuring,storeToRefs(store),Direct destructuring,const { count } = storeToRefs(store),const { count } = store,High,https://pinia.vuejs.org/core-concepts/#destructuring-from-a-store
|
|
||||||
32,Routing,Use useRouter and useRoute,Composition API router access,useRouter() useRoute() in setup,this.$router this.$route,const router = useRouter(),this.$router.push(),Medium,https://router.vuejs.org/guide/advanced/composition-api.html
|
|
||||||
33,Routing,Lazy load route components,Code splitting for routes,() => import() for components,Static imports for all routes,component: () => import('./Page.vue'),component: Page,Medium,https://router.vuejs.org/guide/advanced/lazy-loading.html
|
|
||||||
34,Routing,Use navigation guards,Protect routes and handle redirects,beforeEach for auth checks,Check auth in each component,router.beforeEach((to) => {}),Check auth in onMounted,Medium,
|
|
||||||
35,Performance,Use v-once for static content,Skip re-renders for static elements,v-once on never-changing content,v-once on dynamic content,<div v-once>{{ staticText }}</div>,<div v-once>{{ dynamicText }}</div>,Low,https://vuejs.org/api/built-in-directives.html#v-once
|
|
||||||
36,Performance,Use v-memo for expensive lists,Memoize list items,v-memo with dependency array,Re-render entire list always,"<div v-for v-memo=""[item.id]"">",<div v-for> without memo,Medium,https://vuejs.org/api/built-in-directives.html#v-memo
|
|
||||||
37,Performance,Use shallowReactive for flat objects,Avoid deep reactivity overhead,shallowReactive for flat state,reactive for simple objects,shallowReactive({ count: 0 }),reactive({ count: 0 }),Low,
|
|
||||||
38,Performance,Use defineAsyncComponent,Lazy load heavy components,defineAsyncComponent for modals dialogs,Import all components eagerly,defineAsyncComponent(() => import()),import HeavyComponent from,Medium,https://vuejs.org/guide/components/async.html
|
|
||||||
39,TypeScript,Use generic components,Type-safe reusable components,Generic with defineComponent,Any types in components,"<script setup lang=""ts"" generic=""T"">",<script setup> without types,Medium,https://vuejs.org/guide/typescript/composition-api.html
|
|
||||||
40,TypeScript,Type template refs,Proper typing for DOM refs,ref<HTMLInputElement>(null),ref(null) without type,const input = ref<HTMLInputElement>(null),const input = ref(null),Medium,
|
|
||||||
41,TypeScript,Use PropType for complex props,Type complex prop types,PropType<User> for object props,Object without type,type: Object as PropType<User>,type: Object,Medium,
|
|
||||||
42,Testing,Use Vue Test Utils,Official testing library,mount shallowMount for components,Manual DOM testing,import { mount } from '@vue/test-utils',document.createElement,Medium,https://test-utils.vuejs.org/
|
|
||||||
43,Testing,Test component behavior,Focus on inputs and outputs,Test props emit and rendered output,Test internal implementation,expect(wrapper.text()).toContain(),expect(wrapper.vm.internalState),Medium,
|
|
||||||
44,Forms,Use v-model modifiers,Built-in input handling,.lazy .number .trim modifiers,Manual input parsing,"<input v-model.number=""age"">","<input v-model=""age""> then parse",Low,https://vuejs.org/guide/essentials/forms.html#modifiers
|
|
||||||
45,Forms,Use VeeValidate or FormKit,Form validation libraries,VeeValidate for complex forms,Manual validation logic,useField useForm from vee-validate,Custom validation in each input,Medium,
|
|
||||||
46,Accessibility,Use semantic elements,Proper HTML elements in templates,button nav main for purpose,div for everything,<button @click>,<div @click>,High,
|
|
||||||
47,Accessibility,Bind aria attributes dynamically,Keep ARIA in sync with state,":aria-expanded=""isOpen""",Static ARIA values,":aria-expanded=""menuOpen""","aria-expanded=""true""",Medium,
|
|
||||||
48,SSR,Use Nuxt for SSR,Full-featured SSR framework,Nuxt 3 for SSR apps,Manual SSR setup,npx nuxi init my-app,Custom SSR configuration,Medium,https://nuxt.com/
|
|
||||||
49,SSR,Handle hydration mismatches,Client/server content must match,ClientOnly for browser-only content,Different content server/client,<ClientOnly><BrowserWidget/></ClientOnly>,<div>{{ Date.now() }}</div>,High,
|
|
||||||
|
@@ -76,13 +76,6 @@ STACK_CONFIG = {
|
|||||||
"html-tailwind": {"file": "stacks/html-tailwind.csv"},
|
"html-tailwind": {"file": "stacks/html-tailwind.csv"},
|
||||||
"react": {"file": "stacks/react.csv"},
|
"react": {"file": "stacks/react.csv"},
|
||||||
"nextjs": {"file": "stacks/nextjs.csv"},
|
"nextjs": {"file": "stacks/nextjs.csv"},
|
||||||
"vue": {"file": "stacks/vue.csv"},
|
|
||||||
"nuxtjs": {"file": "stacks/nuxtjs.csv"},
|
|
||||||
"nuxt-ui": {"file": "stacks/nuxt-ui.csv"},
|
|
||||||
"svelte": {"file": "stacks/svelte.csv"},
|
|
||||||
"swiftui": {"file": "stacks/swiftui.csv"},
|
|
||||||
"react-native": {"file": "stacks/react-native.csv"},
|
|
||||||
"flutter": {"file": "stacks/flutter.csv"},
|
|
||||||
"shadcn": {"file": "stacks/shadcn.csv"}
|
"shadcn": {"file": "stacks/shadcn.csv"}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ Usage: python search.py "<query>" [--domain <domain>] [--stack <stack>] [--max-r
|
|||||||
python search.py "<query>" --design-system [-p "Project Name"]
|
python search.py "<query>" --design-system [-p "Project Name"]
|
||||||
|
|
||||||
Domains: style, prompt, color, chart, landing, product, ux, typography
|
Domains: style, prompt, color, chart, landing, product, ux, typography
|
||||||
Stacks: html-tailwind, react, nextjs
|
Stacks: html-tailwind, react, nextjs, shadcn
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import argparse
|
import argparse
|
||||||
@@ -44,7 +44,7 @@ if __name__ == "__main__":
|
|||||||
parser = argparse.ArgumentParser(description="UI Pro Max Search")
|
parser = argparse.ArgumentParser(description="UI Pro Max Search")
|
||||||
parser.add_argument("query", help="Search query")
|
parser.add_argument("query", help="Search query")
|
||||||
parser.add_argument("--domain", "-d", choices=list(CSV_CONFIG.keys()), help="Search domain")
|
parser.add_argument("--domain", "-d", choices=list(CSV_CONFIG.keys()), help="Search domain")
|
||||||
parser.add_argument("--stack", "-s", choices=AVAILABLE_STACKS, help="Stack-specific search (html-tailwind, react, nextjs)")
|
parser.add_argument("--stack", "-s", choices=AVAILABLE_STACKS, help="Stack-specific search (html-tailwind, react, nextjs, shadcn)")
|
||||||
parser.add_argument("--max-results", "-n", type=int, default=MAX_RESULTS, help="Max results (default: 3)")
|
parser.add_argument("--max-results", "-n", type=int, default=MAX_RESULTS, help="Max results (default: 3)")
|
||||||
parser.add_argument("--json", action="store_true", help="Output as JSON")
|
parser.add_argument("--json", action="store_true", help="Output as JSON")
|
||||||
# Design system generation
|
# Design system generation
|
||||||
|
|||||||
@@ -1,13 +1,27 @@
|
|||||||
node_modules
|
node_modules
|
||||||
.next
|
.next
|
||||||
.git
|
.git
|
||||||
|
.gitea
|
||||||
.agents
|
.agents
|
||||||
.claude
|
.claude
|
||||||
.mcp.json
|
.mcp.json
|
||||||
|
# Yalnızca kök dizindeki .md dosyaları (path ayracını geçmez);
|
||||||
|
# content/rehber/*.md build için gerekli, etkilenmez.
|
||||||
*.md
|
*.md
|
||||||
.env*
|
.env*
|
||||||
!.env.example
|
!.env.example
|
||||||
drizzle/
|
docs/
|
||||||
|
# scripts/ build'de kullanılmaz; istisnalar: entrypoint + standalone link
|
||||||
|
# onarımı + açılış migration runner'ı (drizzle/ da onun için imaja girer)
|
||||||
|
scripts/*
|
||||||
|
!scripts/docker-entrypoint.sh
|
||||||
|
!scripts/standalone-linkleri-onar.sh
|
||||||
|
!scripts/db-goc.mjs
|
||||||
|
package-lock.json
|
||||||
|
skills-lock.json
|
||||||
|
components.json
|
||||||
|
eslint.config.mjs
|
||||||
|
drizzle.config.ts
|
||||||
data/
|
data/
|
||||||
!data/app.db
|
!data/app.db
|
||||||
!data/yokatlas.db
|
!data/yokatlas.db
|
||||||
|
|||||||
@@ -26,10 +26,54 @@ jobs:
|
|||||||
IYZICO_API_KEY=${{ secrets.IYZICO_API_KEY }}
|
IYZICO_API_KEY=${{ secrets.IYZICO_API_KEY }}
|
||||||
IYZICO_SECRET_KEY=${{ secrets.IYZICO_SECRET_KEY }}
|
IYZICO_SECRET_KEY=${{ secrets.IYZICO_SECRET_KEY }}
|
||||||
IYZICO_BASE_URL=${{ secrets.IYZICO_BASE_URL }}
|
IYZICO_BASE_URL=${{ secrets.IYZICO_BASE_URL }}
|
||||||
ANTHROPIC_API_KEY=${{ secrets.ANTHROPIC_API_KEY }}
|
OPENROUTER_API_KEY=${{ secrets.OPENROUTER_API_KEY }}
|
||||||
|
OPENROUTER_MODEL=${{ secrets.OPENROUTER_MODEL }}
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
- name: Build & deploy
|
# BuildKit'te "docker build --memory" YOK SAYILIR (moby/buildkit#1362);
|
||||||
|
# gerçek sınır ancak buildkitd'yi kendi cgroup'u olan bir container'da
|
||||||
|
# (buildx docker-container driver) koşturarak konur. Böylece build OOM
|
||||||
|
# olursa yalnızca builder container'ı ölür — uygulama + Gitea ayakta kalır
|
||||||
|
# ve adım 35-90 dk sessiz kilitlenme yerine hızlı, görünür hata verir.
|
||||||
|
#
|
||||||
|
# Sınırlar container İLK oluşturulduğunda donar; değerleri değiştirmek için
|
||||||
|
# önce: docker buildx rm sinirli && docker rm -f buildx_buildkit_sinirli0
|
||||||
|
- name: Sınırlı builder hazırla
|
||||||
run: |
|
run: |
|
||||||
docker compose -p kolaytercih up -d --build --remove-orphans
|
cat > buildkitd.toml <<'EOF'
|
||||||
docker image prune -f
|
[worker.oci]
|
||||||
|
enabled = true
|
||||||
|
max-parallelism = 1
|
||||||
|
EOF
|
||||||
|
# Act container'ı her koşuda sıfırdan geldiği için client kaydı hep
|
||||||
|
# yeniden oluşturulur; host'taki buildx_buildkit_sinirli0 container'ı
|
||||||
|
# (ve build cache'i) varsa bootstrap'ta aynen yeniden kullanılır.
|
||||||
|
docker buildx create --name sinirli \
|
||||||
|
--driver docker-container \
|
||||||
|
--driver-opt memory=2200m \
|
||||||
|
--driver-opt memory-swap=4200m \
|
||||||
|
--driver-opt cpu-quota=150000 \
|
||||||
|
--buildkitd-config ./buildkitd.toml \
|
||||||
|
2>/dev/null || true
|
||||||
|
docker buildx inspect sinirli --bootstrap >/dev/null
|
||||||
|
|
||||||
|
- name: Build (sınırlı builder)
|
||||||
|
run: |
|
||||||
|
docker compose -p kolaytercih build --builder sinirli
|
||||||
|
# docker-container driver'da imajın daemon'a --load ile düştüğünü doğrula;
|
||||||
|
# düşmediyse aynı cache'ten yeniden build edip elle yükle.
|
||||||
|
docker image inspect kolaytercih-app >/dev/null 2>&1 || \
|
||||||
|
docker buildx build --builder sinirli --load -t kolaytercih-app .
|
||||||
|
|
||||||
|
- name: Deploy
|
||||||
|
run: docker compose -p kolaytercih up -d --no-build --remove-orphans
|
||||||
|
|
||||||
|
- name: Temizlik (başarısız build'de de çalışır)
|
||||||
|
if: always()
|
||||||
|
run: |
|
||||||
|
docker image prune -f || true
|
||||||
|
# sinirli builder'ın cache'ini 4 GB'ta tut (flag adı buildx sürümüne göre değişti)
|
||||||
|
docker buildx prune --builder sinirli -f --max-used-space 4gb 2>/dev/null || \
|
||||||
|
docker buildx prune --builder sinirli -f --keep-storage 4gb || true
|
||||||
|
# eski varsayılan-builder cache artıkları
|
||||||
|
docker builder prune -f --filter "until=72h" || true
|
||||||
|
|||||||
@@ -1,5 +1,9 @@
|
|||||||
{
|
{
|
||||||
"mcpServers": {
|
"mcpServers": {
|
||||||
|
"rybbit": {
|
||||||
|
"type": "http",
|
||||||
|
"url": "https://rybbit.kolaytercih.com/api/mcp"
|
||||||
|
},
|
||||||
"shadcn": {
|
"shadcn": {
|
||||||
"command": "npx",
|
"command": "npx",
|
||||||
"args": [
|
"args": [
|
||||||
|
|||||||
20
AGENTS.md
@@ -3,7 +3,27 @@
|
|||||||
|
|
||||||
This version has breaking changes — APIs, conventions, and file structure may all differ from your training data. Read the relevant guide in `node_modules/next/dist/docs/` before writing any code. Heed deprecation notices.
|
This version has breaking changes — APIs, conventions, and file structure may all differ from your training data. Read the relevant guide in `node_modules/next/dist/docs/` before writing any code. Heed deprecation notices.
|
||||||
|
|
||||||
|
# Tarayıcı açma
|
||||||
|
|
||||||
|
UI değişikliklerini tarayıcıda/preview'da doğrulamaya çalışma; kullanıcı kendisi kontrol ediyor. Dev sunucusu veya browser paneli açma — sadece kod değişikliğini yap ve ne değiştiğini raporla.
|
||||||
|
|
||||||
# Push öncesi build zorunlu
|
# Push öncesi build zorunlu
|
||||||
|
|
||||||
Push emri geldiğinde önce lokalde `pnpm build` başarıyla geçmeli; geçmeden asla push etme. Kritik detay: çalışma ağacı kirliyken build, commit'lenmemiş dosyaları da gördüğü için CI'da kırılacak bir commit'i yakalayamayabilir. Bu yüzden build'i **push edilecek commit'in kendisi** üzerinde doğrula (ör. geçici `git worktree add <dir> HEAD` + `node_modules` symlink'i ile). Ayrıca kısmi commit atarken değişikliğin bağımlılık kapanışını kontrol et — bir dosyanın kullandığı prop/export başka bir commit'lenmemiş dosyadan geliyorsa onları da aynı commit'e dahil et.
|
Push emri geldiğinde önce lokalde `pnpm build` başarıyla geçmeli; geçmeden asla push etme. Kritik detay: çalışma ağacı kirliyken build, commit'lenmemiş dosyaları da gördüğü için CI'da kırılacak bir commit'i yakalayamayabilir. Bu yüzden build'i **push edilecek commit'in kendisi** üzerinde doğrula (ör. geçici `git worktree add <dir> HEAD` + `node_modules` symlink'i ile). Ayrıca kısmi commit atarken değişikliğin bağımlılık kapanışını kontrol et — bir dosyanın kullandığı prop/export başka bir commit'lenmemiş dosyadan geliyorsa onları da aynı commit'e dahil et.
|
||||||
|
|
||||||
|
# Badge/eyebrow rozetleri: tek kaynak SectionEyebrow
|
||||||
|
|
||||||
|
Site genelindeki tüm badge/rozet/eyebrow elemanları ana sayfadaki section başlıklarının üstünde duran rozetle birebir aynı olmalı. Kanonik bileşen `src/components/pixel-decor.tsx` içindeki `SectionEyebrow`dur (piksel imzalı `PixelMark` ikonu + `rounded-full border border-slate-200 bg-white px-3.5 py-1.5 text-xs font-semibold uppercase tracking-[0.12em] text-primary`). Yeni bir badge/eyebrow gerektiğinde `SectionEyebrow` kullan (`className` prop'u kenar boşluğu için var); `@/components/ui/badge`'deki `Badge` ile ya da elle yazılmış pill span'lerle yeni badge tasarlama. İnteraktif chip/buton pill'leri (filtre çipleri, nav butonları) bu kuralın dışındadır.
|
||||||
|
|
||||||
|
# UI tutarlılığı: ortak elemanlar tek kaynaktan
|
||||||
|
|
||||||
|
Modallar arası ortak elemanlar (kapatma çarpısı, başlık düzeni vb.) görsel olarak birebir aynı olmalı. Kapatma çarpısının kanonik stili `src/components/ui/dialog.tsx` içindeki `DialogContent` varsayılan butonudur (yuvarlak, `size-9`, `border border-slate-200`, `size-4` X ikonu, hover'da `bg-slate-100`, `active:scale-[0.96]`). Yeni bir modal eklerken bu varsayılanı kullan; özel yerleşim gerekiyorsa (ör. katalog-arama'da input satırının içindeki buton) `showCloseButton={false}` ver ama **aynı class setini** kopyala — farklı boyut/renk/varyantta yeni bir çarpı tasarlama. Aynı prensip diğer tekrarlanan UI parçaları için de geçerli: bir eleman iki yerde görünüyorsa stilini tek kaynaktan al veya birebir eşleştir.
|
||||||
|
|
||||||
|
# CTA butonlarında ikon: yıldız yok, sağ ok metnin sonunda
|
||||||
|
|
||||||
|
Funnel CTA butonlarında ("Listemi oluştur", "Tercihlerimi belirle", giriş/ödeme CTA'ları vb.) `Sparkles` (yıldız) ikonu kullanılmaz. Kanonik desen: buton metni önce gelir, sonunda `<ArrowRight className="size-4" aria-hidden />` durur. Yeni bir CTA butonu eklerken bu deseni uygula; metnin başına ikon koyma. Dekoratif `Sparkles` kullanımları (boş durum başlık ikonları, bilgi satırları) bu kuralın dışındadır — kural yalnızca aksiyon butonları/CTA linkleri içindir.
|
||||||
|
|
||||||
|
# Meraklısına'daki mermaid şeması mimariyle senkron kalmalı
|
||||||
|
|
||||||
|
`/meraklisina` sayfasındaki sihirbaz akış şeması (`src/app/meraklisina/huni-semasi.tsx` içindeki `SEMA` sabiti) ürünün gerçek davranışının belgesidir, dekor değildir. Sihirbaz/listeleme mimarisinde davranış değiştiren her değişiklikte bu şema da aynı PR/commit içinde güncellenmeli: sihirbaz adımlarının sayısı-sırası-içeriği (alan → il → devlet/vakıf), aday havuzu kuralları, 24'lük liste iskeleti (hayal/dengeli/garanti dağılımı), havuz 24'ün altına düşünce filtre gevşetme sırası ve yapay zekânın havuz-dışına-çıkamama kuralı. Şemayı güncellerken çevresindeki unsurları da eşitle: bölümdeki anlatım metni (`src/app/meraklisina/page.tsx`, 4. bölüm), kabın `aria-label`'ı ve figcaption. Şema öğrenci diliyle kalmalı (SQL/prompt/teknik detay yok) ve ürünün risk renk dilini korumalı — kırmızı/sarı/yeşil her zaman metin etiketiyle birlikte, renk tek başına anlam taşımaz.
|
||||||
<!-- END:nextjs-agent-rules -->
|
<!-- END:nextjs-agent-rules -->
|
||||||
|
|||||||
51
Dockerfile
@@ -1,6 +1,8 @@
|
|||||||
FROM node:20-alpine AS base
|
# syntax=docker/dockerfile:1
|
||||||
|
|
||||||
# pnpm kurulumu
|
FROM node:20-alpine AS base
|
||||||
|
ENV PNPM_HOME="/pnpm"
|
||||||
|
ENV PATH="$PNPM_HOME:$PATH"
|
||||||
RUN corepack enable && corepack prepare pnpm@10.8.1 --activate
|
RUN corepack enable && corepack prepare pnpm@10.8.1 --activate
|
||||||
|
|
||||||
# ── Bağımlılık katmanı ──
|
# ── Bağımlılık katmanı ──
|
||||||
@@ -9,17 +11,36 @@ WORKDIR /app
|
|||||||
# better-sqlite3 Alpine'de kaynaktan derleniyor (musl için prebuilt yok)
|
# better-sqlite3 Alpine'de kaynaktan derleniyor (musl için prebuilt yok)
|
||||||
RUN apk add --no-cache python3 make g++
|
RUN apk add --no-cache python3 make g++
|
||||||
COPY package.json pnpm-lock.yaml ./
|
COPY package.json pnpm-lock.yaml ./
|
||||||
RUN pnpm install --frozen-lockfile
|
# pnpm store cache mount'ta yaşar: lockfile değişse bile inen paketler yeniden inmez
|
||||||
|
RUN --mount=type=cache,id=pnpm,target=/pnpm/store \
|
||||||
|
pnpm install --frozen-lockfile
|
||||||
|
|
||||||
# ── Derleme katmanı ──
|
# ── Derleme katmanı ──
|
||||||
FROM base AS builder
|
FROM base AS builder
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
COPY --from=deps /app/node_modules ./node_modules
|
COPY --from=deps /app/node_modules ./node_modules
|
||||||
COPY . .
|
# Build girdileri açık listelenir: docs/, scripts/, CI dosyası değişiklikleri
|
||||||
|
# bu katmanı invalide edemez. next build'in okuduğu her şey burada:
|
||||||
|
# content/ (rehber.ts), data/ (db.ts prerender), public/ (opengraph-image).
|
||||||
|
COPY package.json next.config.ts tsconfig.json postcss.config.mjs ./
|
||||||
|
COPY scripts/standalone-linkleri-onar.sh ./scripts/
|
||||||
|
COPY public ./public
|
||||||
|
COPY data ./data
|
||||||
|
COPY content ./content
|
||||||
|
COPY src ./src
|
||||||
|
|
||||||
ENV NEXT_TELEMETRY_DISABLED=1
|
ENV NEXT_TELEMETRY_DISABLED=1
|
||||||
# data/ .dockerignore'da; libsql build sırasında file:./data/app.db açabilsin diye boş dizin gerekli
|
# V8 heap sınırı ana süreç + statik üretim worker'larına miras kalır.
|
||||||
RUN mkdir -p data && pnpm build
|
# Turbopack'ın Rust tarafı bu sınırın dışında; onun hedefi next.config.ts'te
|
||||||
|
# turbopackMemoryLimit ile verilir (BUILD_KAYNAK_KISITLI bloğu).
|
||||||
|
ENV NODE_OPTIONS="--max-old-space-size=1536"
|
||||||
|
ENV BUILD_KAYNAK_KISITLI=1
|
||||||
|
RUN --mount=type=cache,id=next-cache,target=/app/.next/cache \
|
||||||
|
pnpm build
|
||||||
|
# Turbopack, ESM external'ların (@google/genai vb.) kök node_modules symlink'ini
|
||||||
|
# nft trace'ine yazmıyor; eksik linkler tamamlanmazsa runtime MODULE_NOT_FOUND
|
||||||
|
# ile düşer. Ayrıntı script'in başındaki açıklamada.
|
||||||
|
RUN sh scripts/standalone-linkleri-onar.sh .next/standalone
|
||||||
|
|
||||||
# ── Çalıştırma katmanı ──
|
# ── Çalıştırma katmanı ──
|
||||||
FROM node:20-alpine AS runner
|
FROM node:20-alpine AS runner
|
||||||
@@ -31,20 +52,28 @@ ENV NEXT_TELEMETRY_DISABLED=1
|
|||||||
RUN addgroup --system --gid 1001 nodejs && \
|
RUN addgroup --system --gid 1001 nodejs && \
|
||||||
adduser --system --uid 1001 nextjs
|
adduser --system --uid 1001 nextjs
|
||||||
|
|
||||||
# Bağımlılıklar
|
# standalone çıktı, file-tracing ile seçilmiş kendi minimal node_modules'unu
|
||||||
COPY --from=deps /app/node_modules ./node_modules
|
# içerir (serverExternalPackages dahil) — tam node_modules kopyalanmaz.
|
||||||
COPY --from=builder /app/.next/standalone ./
|
COPY --from=builder /app/.next/standalone ./
|
||||||
COPY --from=builder /app/.next/static ./.next/static
|
COPY --from=builder /app/.next/static ./.next/static
|
||||||
COPY --from=builder /app/public ./public
|
COPY --from=builder /app/public ./public
|
||||||
|
|
||||||
|
# Trace, data/yokatlas.db'yi de standalone'a koyuyor; runtime'da /app/data
|
||||||
|
# volume'ü bunu gölgelediği için imajdan atılır (~22M).
|
||||||
|
RUN rm -rf /app/data
|
||||||
|
|
||||||
# Seed veritabanları: entrypoint açılışta bunları /app/data volume'üne kopyalar
|
# Seed veritabanları: entrypoint açılışta bunları /app/data volume'üne kopyalar
|
||||||
COPY data/ ./seed/
|
COPY data/ ./seed/
|
||||||
|
# Migration'lar: entrypoint açılışta db-goc.mjs ile volume'deki app.db'ye uygular
|
||||||
|
COPY drizzle ./drizzle
|
||||||
|
COPY scripts/db-goc.mjs ./scripts/db-goc.mjs
|
||||||
COPY scripts/docker-entrypoint.sh ./docker-entrypoint.sh
|
COPY scripts/docker-entrypoint.sh ./docker-entrypoint.sh
|
||||||
|
|
||||||
# SQLite veri dizini
|
# SQLite veri dizini + Next'in runtime'da yazdığı image/fetch cache dizini
|
||||||
|
# (.next'in geri kalanı root'ta kalır; salt-okunur olması sorun değil)
|
||||||
RUN chmod +x /app/docker-entrypoint.sh && \
|
RUN chmod +x /app/docker-entrypoint.sh && \
|
||||||
mkdir -p /app/data && \
|
mkdir -p /app/data /app/.next/cache && \
|
||||||
chown -R nextjs:nodejs /app/data /app/seed
|
chown -R nextjs:nodejs /app/data /app/seed /app/.next/cache
|
||||||
|
|
||||||
USER nextjs
|
USER nextjs
|
||||||
|
|
||||||
|
|||||||
@@ -22,6 +22,7 @@
|
|||||||
"hooks": "@/hooks"
|
"hooks": "@/hooks"
|
||||||
},
|
},
|
||||||
"registries": {
|
"registries": {
|
||||||
"@skiper-ui": "https://skiper-ui.com/registry/{name}.json"
|
"@skiper-ui": "https://skiper-ui.com/registry/{name}.json",
|
||||||
|
"@magicui": "https://magicui.design/r/{name}"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
58
content/rehber/ais-tercih-nasil-yapilir-onaylama.md
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
---
|
||||||
|
baslik: AİS'te Tercih Nasıl Yapılır, Nasıl Onaylanır? (Son Kontrol Listesi)
|
||||||
|
aciklama: ÖSYM AİS tercih ekranı adım adım — kod girme, sıralama, "Tercihleri Bildir" onayı ve göndermeden önceki 5 maddelik son kontrol tek şemada.
|
||||||
|
tarih: 2026-08-05
|
||||||
|
---
|
||||||
|
|
||||||
|
Listeni kurdun; şimdi işin resmî kısmı var: tercihleri ÖSYM'nin sistemine girmek ve **onaylamak**. Her yıl adayların bir kısmı listeyi özenle kurup son adımda takılıyor — tercihler girilir ama bildirilmez, kod yanlış yazılır, değişiklikten sonra yeniden onay unutulur. Bu yazı AİS ekranını adım adım anlatıyor ve göndermeden önceki son kontrol listesini veriyor.
|
||||||
|
|
||||||
|
## Nereden, ne zamana kadar?
|
||||||
|
|
||||||
|
Tercihler yalnızca iki resmî kanaldan girilir: **ais.osym.gov.tr** ve **ÖSYM Aday İşlemleri mobil uygulaması**. Giriş T.C. kimlik numarası ve aday şifresiyle. 2026'da pencere **29 Temmuz - 10 Ağustos, saat 23.59** ([takvimin tamamı](/rehber/yks-tercih-takvimi-2026)). Son saate bırakma: kapanış akşamı sistem yoğunluğu gerçektir ve 23.59'dan sonra hiçbir işlem alınmaz.
|
||||||
|
|
||||||
|
## Adım adım AİS tercih ekranı
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
%% aria: ÖSYM AİS tercih bildirme akış şeması. Adımlar sırayla: aday şifresiyle AİS'e giriş yapılır, 2026 YKS Tercih ekranı açılır, kılavuzdaki program kodları tek tek listeye eklenir, satırlar istek sırasına göre dizilir, ardından son kontrol yapılır. Son kontrolden sonra Tercihleri Bildir butonuna basılır. Kritik doğrulama şudur: ekranda tercihleriniz ÖSYM'ye bildirilmiştir uyarısı görünüyorsa işlem tamamdır ve bu kutu yeşildir; uyarı görünmüyorsa tercihler kaydedilmiş ama bildirilmemiş olabilir, bu durumda tercihlerin geçersiz sayılır ve bu kutu kırmızıdır. Son tarihe kadar listede değişiklik yapılabilir ama her değişiklikten sonra Tercihleri Bildir adımı yeniden yapılmalıdır; bu döngü sarı ile işaretlidir çünkü en sık unutulan adımdır.
|
||||||
|
%% altyazi: Kaydetmek yetmez — ekranda "bildirilmiştir" uyarısını görmeden sistemden çıkma.
|
||||||
|
flowchart TD
|
||||||
|
A("AİS'e gir:<br/>T.C. kimlik + aday şifresi") --> B("2026-YKS Tercih<br/>ekranını aç")
|
||||||
|
B --> C("Program kodlarını<br/>kılavuzdan tek tek ekle")
|
||||||
|
C --> D("Satırları İSTEK sırana<br/>göre diz")
|
||||||
|
D --> E("Son kontrolü yap") --> F("Tercihleri Bildir<br/>butonuna bas")
|
||||||
|
F --> G{"Ekranda 'Tercihleriniz<br/>ÖSYM'ye bildirilmiştir'<br/>uyarısı var mı?"}
|
||||||
|
G -- "evet" --> H("İşlem tamam:<br/>ekran görüntüsü al")
|
||||||
|
G -- "hayır" --> I("Tercihler GEÇERSİZ:<br/>bildirme adımını<br/>tamamla")
|
||||||
|
H --> J{"Son güne kadar<br/>değişiklik yaptın mı?"}
|
||||||
|
J -- "evet" --> F
|
||||||
|
J -- "hayır" --> K("10 Ağustos 23.59'da<br/>liste kilitlenir")
|
||||||
|
|
||||||
|
classDef uyari fill:#fef3c7,stroke:#f59e0b,color:#92400e
|
||||||
|
classDef garanti fill:#d1fae5,stroke:#10b981,color:#065f46
|
||||||
|
classDef hayal fill:#fee2e2,stroke:#ef4444,color:#991b1b
|
||||||
|
class E,G,J uyari
|
||||||
|
class H,K garanti
|
||||||
|
class I hayal
|
||||||
|
```
|
||||||
|
|
||||||
|
**1) Giriş.** ais.osym.gov.tr adresine T.C. kimlik numaran ve aday şifrenle gir. Şifren yoksa/unuttuysan hemen yenile — bunu son güne bırakmak en gereksiz risk.
|
||||||
|
|
||||||
|
**2) Tercih ekranı.** Açılan sayfada "2026-YKS Tercih" seçeneğine tıkla.
|
||||||
|
|
||||||
|
**3) Kodları ekle.** Her programın kılavuzda ve [tercih robotu](/tercih-robotu) çıktısında görünen bir **program kodu** var. Kodu ekleyince ekranda çıkan program adını ve üniversiteyi kendi listenle karşılaştır — tek rakam farkı seni başka şehre, başka bölüme yazar.
|
||||||
|
|
||||||
|
**4) İstek sırana göre diz.** Merkezi yerleştirme listeyi yukarıdan aşağı okur ve seni yerleştirebileceği **en üstteki** satıra yerleştirir ([sistem nasıl çalışır](/rehber/merkezi-yerlestirme-nasil-calisir)). Sıra yerleşme ihtimaline göre değil, *istemene* göre olmalı.
|
||||||
|
|
||||||
|
**5) Bildir ve doğrula.** "Tercihleri Bildir" butonuna bas ve ekranda **"2026-YKS Tercihleriniz ÖSYM'ye bildirilmiştir"** uyarısını gör. Bu uyarıyı görmeden kapattığın oturumda tercihlerin kaydedilmiş ama **bildirilmemiş** olabilir — bildirilmeyen tercih geçersizdir. Uyarı ekranının görüntüsünü al, sakla.
|
||||||
|
|
||||||
|
**6) Değişiklik yaptıysan yeniden bildir.** Son tarihe kadar listeyi istediğin kadar güncelleyebilirsin; ama her değişiklikten sonra bildirme adımı **yeniden** yapılır. Sistemdeki geçerli liste, en son "bildirilmiştir" uyarısını aldığın listedir.
|
||||||
|
|
||||||
|
## Göndermeden önce: 5 maddelik son kontrol
|
||||||
|
|
||||||
|
1. **Her satırın koşulunu okudun mu?** Yaş, cinsiyet, sağlık raporu gibi [özel koşullar](/rehber/ozel-kosullu-programlar) ve [başarı sırası şartları](/rehber/siralama-sartlari-2026) sağlanmıyorsa o satır ya boşa gider ya da yerleşsen bile kayıtta yanar.
|
||||||
|
2. **Üst sıralarda ölü tercih var mı?** Tabanı senden çok iyi programı listenin *sonuna* yazmak satırı çöpe atar ([ölü tercih nedir](/rehber/olu-tercih-nedir)).
|
||||||
|
3. **Listenin sonu gerçekten garanti mi?** Son 4-6 satır, yerleşirsen kayıt yaptıracağın programlar olmalı ([hayal/dengeli/garanti dağılımı](/rehber/tercih-listesi-nasil-yapilir)).
|
||||||
|
4. **Kayıt yaptırmayacağın satır var mı?** Varsa sil: oraya yerleşirsen hem yılın gider hem [ek yerleştirmeye](/rehber/ek-yerlestirme-2026) başvuramazsın.
|
||||||
|
5. **Kodları tek tek doğruladın mı?** Ekrandaki program adı + üniversite + şehir üçlüsünü kendi listenle satır satır karşılaştır.
|
||||||
|
|
||||||
|
Listen henüz oturmadıysa önce evreni gör: [tercih robotuna](/tercih-robotu) sıralamanı gir, sıralamana düşen programları hayal/dengeli/garanti dilimleriyle çıkar, sonra AİS'e kodları bu listeden aktar. AİS'te düşünülmez — AİS'e *bitmiş* liste girilir.
|
||||||
65
content/rehber/bolum-mu-universite-mi-sehir-mi.md
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
---
|
||||||
|
baslik: Bölüm mü, Üniversite mi, Şehir mi? Üçünü Nasıl Dengelersin?
|
||||||
|
aciklama: İyi üniversitede kötü bölüm mü, sıradan üniversitede istediğin bölüm mü? Tercih döneminin en çok sorulan sorusu — karar sırası tek şemada.
|
||||||
|
tarih: 2026-08-03
|
||||||
|
---
|
||||||
|
|
||||||
|
Tercih döneminde herkesin bir cümlesi var: "Bölüm her şeydir", "Hayır, üniversite markası her şeydir", "Asıl şehir önemli". Üçü de eksik. Bu üç başlığın **hangi durumda hangisinin öne geçtiği** belli bir sıraya oturur ve bu sıra herkes için aynı değildir.
|
||||||
|
|
||||||
|
## Karar sırası
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
%% aria: Bölüm üniversite şehir dengesi şeması. İlk soru mesleğin diplomaya bağlı olup olmadığıdır. Tıp, diş hekimliği, eczacılık, hukuk, öğretmenlik gibi diploma kilidi olan alanlarda bölüm her şeyin önündedir; sonra şehir, en son üniversite adı gelir. Diploma kilidi yoksa ikinci soru bölümün ne kadar net olduğudur. Bölüm netse üniversitenin o bölümdeki kadrosu ve akreditasyonu belirleyicidir. Bölüm net değilse geniş kampüs, çift anadal ve yatay geçiş imkânı olan üniversite öne geçer. Her üç yolda da şehir maliyeti ve barınma son filtredir; bütçe tutmuyorsa satır listeye girmez.
|
||||||
|
%% altyazi: Sıralama herkes için aynı değil — önce mesleğin diplomaya bağlı olup olmadığına bak.
|
||||||
|
flowchart TD
|
||||||
|
A{"Hedeflediğin meslek<br/>belirli bir diplomaya<br/>bağlı mı?"}
|
||||||
|
A -- "evet: tıp, diş, eczacılık,<br/>hukuk, öğretmenlik..." --> B("Önce BÖLÜM<br/>sonra şehir<br/>en son üniversite adı")
|
||||||
|
A -- "hayır: mühendislik,<br/>işletme, sosyal bilimler..." --> C{"Bölümün<br/>kafanda net mi?"}
|
||||||
|
C -- "net" --> D("Önce o bölümün KADROSU<br/>ve akreditasyonu<br/>sonra şehir")
|
||||||
|
C -- "net değil" --> E("Önce GENİŞ ÜNİVERSİTE:<br/>çift anadal, yatay geçiş,<br/>bölüm çeşitliliği")
|
||||||
|
B --> F{"Şehir ve barınma<br/>maliyeti 4 yıl boyunca<br/>karşılanabilir mi?"}
|
||||||
|
D --> F
|
||||||
|
E --> F
|
||||||
|
F -- "evet" --> G("Satır listeye girer")
|
||||||
|
F -- "hayır" --> H("Satırı yazma:<br/>yerleşirsen kayıt<br/>yaptıramazsın")
|
||||||
|
|
||||||
|
classDef uyari fill:#fef3c7,stroke:#f59e0b,color:#92400e
|
||||||
|
classDef garanti fill:#d1fae5,stroke:#10b981,color:#065f46
|
||||||
|
classDef hayal fill:#fee2e2,stroke:#ef4444,color:#991b1b
|
||||||
|
class B,D,G garanti
|
||||||
|
class C,E,F uyari
|
||||||
|
class H hayal
|
||||||
|
```
|
||||||
|
|
||||||
|
## 1) Bölümün diploma kilidi var mı?
|
||||||
|
|
||||||
|
Bazı meslekleri **yalnızca o diplomayla** yapabilirsin. [Tıp](/bolum/tip), [Diş Hekimliği](/bolum/dis-hekimligi), [Eczacılık](/bolum/eczacilik), [Hukuk](/bolum/hukuk), [Hemşirelik](/bolum/hemsirelik), [Fizyoterapi ve Rehabilitasyon](/bolum/fizyoterapi-ve-rehabilitasyon), öğretmenlik programları böyledir. Bu alanlarda tartışma biter: **bölüm birinci sıradadır.** Sıralaman iki programa da yetiyorsa aralarında üniversiteye göre seçersin, ama "iyi üniversitede başka bölüm" bu grupta bir alternatif değildir — çünkü diploma mesleğin kapısıdır.
|
||||||
|
|
||||||
|
Diploma kilidi olmayan alanlarda ise mezuniyet sonrası yollar çatallanır. [İşletme](/bolum/isletme), [İktisat](/bolum/iktisat), [Sosyoloji](/bolum/sosyoloji), [Uluslararası İlişkiler](/bolum/uluslararasi-iliskiler) mezunlarının gittiği yer büyük ölçüde stajlar, ikinci diller ve üniversitenin ağıyla belirlenir. Burada üniversitenin ağırlığı gerçekten artar.
|
||||||
|
|
||||||
|
## 2) Üniversiteyi "marka" olarak değil, "o bölümdeki hâli" olarak oku
|
||||||
|
|
||||||
|
Bir üniversite bir bölümünde çok güçlü, diğerinde vasat olabilir. Marka ismi yerine şunlara bak:
|
||||||
|
|
||||||
|
- **Bölümün öğretim üyesi sayısı ve unvan dağılımı.** Üniversitenin bölüm sayfasındaki akademik kadro listesi bunu doğrudan gösterir. Beş kişilik kadroyla yürüyen bir mühendislik bölümüyle otuz kişilik kadro aynı şey değildir.
|
||||||
|
- **Akreditasyon.** Mühendislikte MÜDEK, eğitim fakültelerinde EPDAD gibi program akreditasyonları, o bölümün belirli bir eğitim standardını sağladığının dışarıdan onayıdır. Üniversitenin bölüm sayfasında yazar.
|
||||||
|
- **Ders katalogu.** Neredeyse her üniversitenin Bologna/ders kataloğu sayfası vardır; dört yıl boyunca hangi dersleri alacağını orada satır satır okuyabilirsin. Aynı adlı iki bölümün müfredatı şaşırtıcı derecede farklı olabilir.
|
||||||
|
- **Taban sıralamanın söyledikleri.** Bir programın tabanı, piyasanın o programa biçtiği değerin toplamıdır. İki üniversite arasında kararsızsan tabanlar sana toplumun ortalama kanaatini söyler — ama bunu tek başına değil, yukarıdaki üç maddeyle birlikte oku. [Taban sıralamalar yıldan yıla nasıl değişir](/rehber/taban-siralamalar-nasil-degisir) yazısı bu okumanın sınırlarını anlatıyor.
|
||||||
|
|
||||||
|
## 3) Şehir bir "tercih kriteri" değil, bir "geçerlilik filtresi"
|
||||||
|
|
||||||
|
Şehri en sona bıraktık ama en zayıf kriter olduğu için değil — **eleyici** olduğu için. Şehir şu üç şeyi belirler:
|
||||||
|
|
||||||
|
1. **Toplam maliyet.** Kira, yurt, ulaşım ve yemek dört yıla vurulduğunda okulun kendisinden büyük bir kalem olur. [Yurt, burs ve yıllık maliyet](/rehber/yurt-burs-ve-yillik-maliyet) yazısında bunu satır satır hesaplıyoruz.
|
||||||
|
2. **Staj ve yarı zamanlı iş erişimi.** Mühendislik, [Mimarlık](/bolum/mimarlik), medya, [Gazetecilik](/bolum/gazetecilik) gibi alanlarda sektörün fiziksel olarak bulunduğu şehir, öğrencilik yıllarında ciddi bir avantajdır.
|
||||||
|
3. **Dört yıl orada yaşayacak olman.** İklimi, eve uzaklığı, sosyal hayatı sana uymayan bir şehirde okulu bırakma ihtimali gerçek bir risktir.
|
||||||
|
|
||||||
|
Şehri "istediğim şehirde okumak istiyorum" diye en başa koyarsan, listeni gereksiz yere daraltırsın. En sona koyarsan da bütçeyi patlatırsın. Doğru yeri **filtre**: bölüm ve üniversite sıralamanı yaptıktan sonra, karşılayamayacağın şehirdeki satırları listeden çıkar.
|
||||||
|
|
||||||
|
## Sık düşülen üç tuzak
|
||||||
|
|
||||||
|
- **"Puanım boşa gitmesin" tuzağı.** Sıralaman yetiyor diye istemediğin bir bölümü listenin üstüne yazmak, en pahalı hatadır: ÖSYM seni yerleşebildiğin **en üst** tercihe koyar, o satır tutarsa aşağıdaki gerçek tercihlerin hiç okunmaz. [Merkezi yerleştirme nasıl çalışır](/rehber/merkezi-yerlestirme-nasil-calisir) yazısı bu mekanizmayı anlatıyor.
|
||||||
|
- **"Sonra yatay geçerim" tuzağı.** Yatay geçiş gerçek bir yoldur ama garanti değildir — koşulları ve kontenjanı vardır. Planını üstüne kurma; [yatay geçiş, ÇAP ve yandal](/rehber/yatay-gecis-cap-yandal) yazısı gerçekçi sınırları çiziyor.
|
||||||
|
- **"Üniversitenin adı beni taşır" tuzağı.** Köklü bir üniversitenin zayıf bir bölümünde dört yıl geçirmek, mezuniyette beklediğin kapıyı açmayabilir. Marka değil, **o bölümün o üniversitedeki hâli** taşır.
|
||||||
|
|
||||||
|
Sıralamana hangi bölüm–üniversite–şehir kombinasyonlarının düştüğünü tek ekranda görmek için [tercih robotuna](/tercih-robotu) sıralamanı gir; şehir ve devlet/vakıf filtreleriyle üç ekseni ayrı ayrı deneyebilirsin.
|
||||||
73
content/rehber/bolumun-is-imkanini-nasil-arastirirsin.md
Normal file
@@ -0,0 +1,73 @@
|
|||||||
|
---
|
||||||
|
baslik: Bir Bölümün İş İmkânını Nasıl Araştırırsın? (Duyduklarına Değil, Kaynağa Bakma Rehberi)
|
||||||
|
aciklama: Bu bölüm iş bulur mu sorusunun cevabı forumda değil. Bir bölümün mezuniyet sonrasını beş adımda kendin araştırma yöntemi — tek şemada.
|
||||||
|
tarih: 2026-07-28
|
||||||
|
---
|
||||||
|
|
||||||
|
"Bu bölüm iş bulur mu?" tercih döneminin en çok sorulan, en kötü cevaplanan sorusu. Forumlarda gördüğün cevaplar birkaç kişinin kendi hikâyesidir; akrabaların söyledikleri on yıl öncesinin piyasasıdır. İyi haber şu: bu soruyu **kendin araştırabilirsin** ve gereken kaynakların hepsi açık. Bu yazı yöntemi veriyor — hangi bölüm olursa olsun işleyen bir yöntem.
|
||||||
|
|
||||||
|
## Beş adımlı araştırma
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
%% aria: Bölüm araştırma yöntemi şeması, beş adım. Birinci adım mesleğin kapısının nasıl açıldığını anlamaktır: diploma tek başına yetiyor mu, üstüne bir sınav mı gerekiyor, yoksa serbest bir alan mı. İkinci adım o kapının darlığını ölçmektir: sınav varsa kaç kişi giriyor kaç kişi geçiyor, kontenjan ne kadar. Üçüncü adım bölümün müfredatını okumaktır: üniversitenin ders kataloğunda dört yıl boyunca alacağın dersler satır satır yazar. Dördüncü adım arz tarafına bakmaktır: bu bölümden Türkiye genelinde yılda kaç kişi mezun oluyor ve kontenjan artıyor mu azalıyor mu. Beşinci adım gerçek insanlarla konuşmaktır: mezunların gittiği yerleri incelemek ve iki üç mezunla konuşmak. Bu beş adımın sonunda karar duyduklarına değil kaynağa dayanır.
|
||||||
|
%% altyazi: Sıra önemli: önce mesleğin kapısı, en son insan hikâyeleri.
|
||||||
|
flowchart TD
|
||||||
|
A1("1. Kapı nasıl açılıyor?<br/>diploma tek başına mı,<br/>üstüne sınav mı,<br/>serbest alan mı") --> A2("2. Kapı ne kadar dar?<br/>kaç kişi giriyor,<br/>kaç kişi geçiyor")
|
||||||
|
A2 --> A3("3. Müfredatı oku<br/>üniversitenin ders katalogu<br/>4 yılda ne öğreneceksin")
|
||||||
|
A3 --> A4("4. Arz tarafı<br/>yılda kaç mezun veriliyor,<br/>kontenjan artıyor mu")
|
||||||
|
A4 --> A5("5. İnsanla konuş<br/>mezunlar nereye gitmiş,<br/>2-3 kişiyle görüş")
|
||||||
|
A5 --> S{"Beş adımın sonunda"}
|
||||||
|
S -- "cevaplar tutarlı" --> K("Karar kaynağa dayanıyor")
|
||||||
|
S -- "hâlâ belirsiz" --> B("Belirsizlik gerçek:<br/>listeye alternatif de koy")
|
||||||
|
|
||||||
|
classDef uyari fill:#fef3c7,stroke:#f59e0b,color:#92400e
|
||||||
|
classDef garanti fill:#d1fae5,stroke:#10b981,color:#065f46
|
||||||
|
class K garanti
|
||||||
|
class S,B uyari
|
||||||
|
```
|
||||||
|
|
||||||
|
## Adım 1: Mesleğin kapısı nasıl açılıyor?
|
||||||
|
|
||||||
|
Bölümler mezuniyet sonrası açısından üçe ayrılır ve bu ayrım her şeyden önemlidir:
|
||||||
|
|
||||||
|
- **Diploma doğrudan yetki verir.** [Tıp](/bolum/tip), [Diş Hekimliği](/bolum/dis-hekimligi), [Eczacılık](/bolum/eczacilik), [Hemşirelik](/bolum/hemsirelik), [Veteriner](/bolum/veteriner), [Fizyoterapi ve Rehabilitasyon](/bolum/fizyoterapi-ve-rehabilitasyon) gibi. Mesleği yapmak için diploma gereklidir; uzmanlaşma veya kamuda çalışma için ayrıca sınav olabilir.
|
||||||
|
- **Diplomanın üstüne bir kapı sınavı var.** [Hukuk](/bolum/hukuk) mezunu için staj ve baro süreci, öğretmenlik programları için atama sınavı, kamuda çalışmak isteyen [Kamu Yönetimi](/bolum/kamu-yonetimi) veya [İktisat](/bolum/iktisat) mezunu için merkezi sınavlar gibi. Burada kritik soru bölümün kendisi değil, **o kapının genişliğidir.**
|
||||||
|
- **Kapı serbest, ölçü senin portföyün.** [Bilgisayar Mühendisliği](/bolum/bilgisayar-muhendisligi), [Yazılım Mühendisliği](/bolum/yazilim-muhendisligi), [İşletme](/bolum/isletme), [Radyo, Televizyon ve Sinema](/bolum/radyo-televizyon-ve-sinema) gibi alanlarda diploma bir başlangıçtır; işveren staja, projeye, portföye bakar.
|
||||||
|
|
||||||
|
Bu üç grubun "iş imkânı" sorusuna cevabı bambaşkadır. İkinci gruptaki bir bölümü değerlendirirken bölümün kalitesine değil, **atama/geçiş oranlarına** bakman gerekir.
|
||||||
|
|
||||||
|
## Adım 2: Kapı ne kadar dar?
|
||||||
|
|
||||||
|
Sınavla açılan bir kapı varsa sayıları ara: o alanda yılda kaç kişi sınava giriyor, kaç kişi geçiyor, kaç kadro açılıyor? Bu veriler ilgili kurumun (bakanlık, meslek odası, sınavı yapan kurum) kendi duyurularında yayımlanır ve genelde yıllara göre karşılaştırılabilir.
|
||||||
|
|
||||||
|
Burada dikkat: **rakamı bul, yorumu sonra yap.** "Atama yok" ile "geçen yıl şu kadar kadro açıldı, şu kadar mezun vardı" arasında dağlar kadar fark var. İkincisi karar verilebilir bir bilgidir.
|
||||||
|
|
||||||
|
## Adım 3: Müfredatı gerçekten oku
|
||||||
|
|
||||||
|
Neredeyse her üniversitenin ders kataloğu (Bologna bilgi paketi) açıktır. Bölüm sayfasından "ders planı" veya "müfredat" bağlantısını bul ve **sekiz yarıyılın dersini de oku.** Bu on beş dakika, bölüm hakkında forumlarda geçireceğin on saatten fazlasını anlatır.
|
||||||
|
|
||||||
|
Bakman gerekenler:
|
||||||
|
|
||||||
|
- Derslerin ağırlığı beklentine uyuyor mu? Adı aynı olan iki bölümden biri ağırlıklı matematik, diğeri ağırlıklı tasarım olabilir.
|
||||||
|
- Zorunlu staj var mı, kaç gün?
|
||||||
|
- Seçmeli ders havuzu ne kadar geniş? Geniş havuz, alan içinde yön değiştirme imkânı demektir.
|
||||||
|
- Bölümün akreditasyonu var mı? Mühendislikte MÜDEK, eğitimde EPDAD gibi program akreditasyonları üniversitenin bölüm sayfasında ilan edilir.
|
||||||
|
|
||||||
|
## Adım 4: Arz tarafına bak
|
||||||
|
|
||||||
|
Bir alanın doygunluğunu anlamanın en sade yolu: **Türkiye genelinde o bölümden yılda kaç kişi mezun oluyor?** Kontenjan tarafı bunun iyi bir göstergesidir — aynı bölümün kaç üniversitede açık olduğuna ve toplam kontenjanına bakabilirsin. Kontenjanı hızla artan bir bölümde, bugünün mezun sayısıyla dört yıl sonrakinin aynı olmayacağını hesaba kat.
|
||||||
|
|
||||||
|
Tabanların yıllar içindeki seyri de bu tabloyu okur: bir bölümün tabanı birkaç yıl üst üste gevşiyorsa, talep tarafında bir şey değişiyor demektir. [Taban sıralamalar yıldan yıla ne kadar değişir](/rehber/taban-siralamalar-nasil-degisir) yazısı bu okumanın nasıl yapılacağını ve sınırlarını anlatıyor.
|
||||||
|
|
||||||
|
## Adım 5: İnsanla konuş — ama doğru soruyu sorarak
|
||||||
|
|
||||||
|
En son adım bu, çünkü ilk dördü olmadan sorduğun sorular yüzeysel kalır. İki kaynak:
|
||||||
|
|
||||||
|
- **Mezunların gittiği yerler.** Meslek ağlarında üniversite + bölüm araması yapıp mezunların bugün ne iş yaptığına bakmak, tek tek hikâyelerden çok daha sağlıklı bir dağılım verir.
|
||||||
|
- **İki-üç mezunla konuşmak.** "Memnun musun?" diye sorma; şunları sor: *İlk işini nasıl buldun? Okuduğun derslerden hangisi işine yaradı? Bugün yeniden seçsen ne değiştirirdin?* Bu üç soru, on dakikada gerçek bilgi verir.
|
||||||
|
|
||||||
|
## Cevap belirsiz kaldıysa ne yapmalı?
|
||||||
|
|
||||||
|
Bazı alanlarda dört yıl sonrası dürüstçe belirsizdir — ve bu, o bölümü kötü yapmaz. Belirsizlikle baş etmenin tercih listesindeki karşılığı şu: **listeye alternatif de koy.** İstediğin bölümü üst bloğa yaz, ama alt bloğa da seni memnun edecek ikinci ve üçüncü seçenekleri diz. [Tercih listesi nasıl yapılır](/rehber/tercih-listesi-nasil-yapilir) yazısındaki hayal–dengeli–garanti dağılımı tam olarak bu belirsizliği yönetmek için var.
|
||||||
|
|
||||||
|
Bir de bölümlerin kendi sayfalarına bak: [bölüm kataloğunda](/bolumler) her bölümün hangi üniversitelerde açık olduğunu, taban sıralamalarını ve program sayısını görebilir, araştırmanın dördüncü adımını dakikalar içinde tamamlayabilirsin. Sıralamana hangi bölümlerin düştüğünü görmek içinse [tercih robotuna](/tercih-robotu) sıralamanı gir.
|
||||||
53
content/rehber/devlet-mi-vakif-mi.md
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
---
|
||||||
|
baslik: Devlet mi Vakıf mı? Burslu ve İndirimli Programlar Nasıl Okunur?
|
||||||
|
aciklama: Aynı bölümün beş farklı fiyat etiketi var — burslu, indirimli, ücretli... Vakıf tablosunu doğru okumanın rehberi, tek şemada.
|
||||||
|
tarih: 2026-07-19
|
||||||
|
---
|
||||||
|
|
||||||
|
Tercih tablolarında aynı bölümün adı beş kez geçebilir: *Psikoloji (Burslu)*, *Psikoloji (%50 İndirimli)*, *Psikoloji (%25 İndirimli)*, *Psikoloji (Ücretli)*, *Psikoloji (İngilizce)*. Bunlar ayrı programlardır: ayrı kontenjan, ayrı taban, ayrı fiyat. Bu yazı tabloyu doğru okumayı ve devlet-vakıf kararını sağlıklı vermeyi anlatıyor.
|
||||||
|
|
||||||
|
## Varyantlar ne anlama geliyor?
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
%% aria: Vakıf program varyantları şeması: aynı bölüm adı altında burslu yüzde yüz, yüzde elli veya yirmi beş indirimli ve ücretli programlar ayrı kontenjan ve ayrı tabanla listelenir. Burslu genelde en sıkı tabana sahiptir ve devletlerle yarışır; indirimli orta bütçe ister; ücretli en geniş tabanlıdır ama aile bütçesine uymuyorsa yazılmamalıdır. İngilizce veya UOLP etiketi burs bilgisi değil öğretim dili bilgisidir.
|
||||||
|
%% altyazi: Aynı bölüm adı beş kez geçebilir — her satır ayrı program, ayrı fiyat, ayrı tabandır.
|
||||||
|
flowchart TD
|
||||||
|
B("Aynı bölüm adı<br/>tabloda birkaç kez geçer") --> V{"Hangi etiket?"}
|
||||||
|
V -- "%100 burslu" --> BU("Ücret yok<br/>taban genelde en sıkı,<br/>devletlerle yarışır")
|
||||||
|
V -- "%50 / %25 indirimli" --> IN("Kısmi ücret<br/>toplam maliyeti baştan hesapla")
|
||||||
|
V -- "ücretli" --> UC("Tam ücret<br/>taban genelde en geniş")
|
||||||
|
V -- "İngilizce / UOLP" --> DI("Burs değil, dil bilgisi<br/>hazırlık yılı ekleyebilir")
|
||||||
|
UC --> K{"Bütçe gerçekten uygun<br/>ve okulu istiyor musun?"}
|
||||||
|
K -- "evet" --> YAZ("Listeye yaz")
|
||||||
|
K -- "hayır" --> YAZMA("Yazma:<br/>yerleşirsen ek hakkın yanar")
|
||||||
|
|
||||||
|
classDef uyari fill:#fef3c7,stroke:#f59e0b,color:#92400e
|
||||||
|
classDef garanti fill:#d1fae5,stroke:#10b981,color:#065f46
|
||||||
|
classDef hayal fill:#fee2e2,stroke:#ef4444,color:#991b1b
|
||||||
|
class BU,YAZ garanti
|
||||||
|
class IN,DI uyari
|
||||||
|
class YAZMA hayal
|
||||||
|
```
|
||||||
|
|
||||||
|
- **Burslu (%100):** Öğrenim ücreti yok. Vakıfların vitrini olduğu için tabanı çoğu zaman aynı üniversitenin ücretli programından *yüz binlerce sıra* daha iyidir; köklü devletlerle yarışır.
|
||||||
|
- **%50 / %25 indirimli:** Ücretin o oranı düşülür. Kalan tutar yıllara ve okula göre ciddi bir bütçedir; 4-6 yıllık toplam maliyeti baştan hesapla.
|
||||||
|
- **Ücretli:** Tam ücret. Tabanlar genelde en geniştir.
|
||||||
|
- **İngilizce / UOLP:** Öğretim dili veya ortak program bilgisidir; burs bilgisi değildir. Hazırlık yılı ekleyebilir.
|
||||||
|
|
||||||
|
Kritik uyarı: **bursun sürme koşullarını** üniversitenin kendi yönetmeliğinden kontrol et. Çoğu vakıfta giriş bursu süresizdir ama bazı okullarda not ortalaması şartı vardır.
|
||||||
|
|
||||||
|
## Devlet-vakıf kararında gerçek kriterler
|
||||||
|
|
||||||
|
**Bütçe dışında** şunlara bak:
|
||||||
|
|
||||||
|
1. **Kadro ve bölümün kurumsallığı.** Bölümün öğretim üyesi sayısı, araştırma çıktısı, akreditasyonu (MÜDEK, PSİKOLOG odaklı akreditasyonlar vb.) devlet-vakıf etiketinden daha belirleyicidir.
|
||||||
|
2. **Şehir ve yaşam maliyeti.** Devlet okulu + büyükşehir kirası, bazen vakıf burslusu + yurt kombinasyonundan pahalıya gelir. Toplam maliyeti karşılaştır.
|
||||||
|
3. **Tabanın söylediği.** Bir vakıf burslusunun tabanı köklü devletlerle aynıysa, piyasa o programa devlet muadili değer biçiyor demektir. [İşletme](/bolum/isletme) veya [Psikoloji](/bolum/psikoloji) tablolarını aç; Tür kolonunda devlet/vakıf ayrımını, satır altlarında burs varyantlarını yan yana görüp kendi sıralamanla kıyaslayabilirsin.
|
||||||
|
|
||||||
|
## Listede nasıl konumlanır?
|
||||||
|
|
||||||
|
- Burslu vakıf programları taban olarak "hayal/dengeli" bölgene düşüyorsa devlet alternatifleriyle **aynı blokta, istek sırana göre** diz — ayrı kefeye koyma.
|
||||||
|
- İndirimli programlarda aileyle net bütçe konuşmasını *listeyi vermeden önce* yap; yerleştikten sonra "ödeyemeyiz" durumu bir yıl kaybettirir.
|
||||||
|
- Ücretli programı yalnızca bütçe gerçekten uygunsa ve o okulu gerçekten istiyorsan yaz — "garanti olsun" diye yazılan ücretli program, kayıt yaptırmayacaksan [ölü tercihten](/rehber/olu-tercih-nedir) beterdir: yerleşirsen ek tercih hakkın da yanar.
|
||||||
|
|
||||||
|
Sıralamana hangi devlet ve vakıf programlarının düştüğünü tek ekranda görmek için [tercih robotuna](/tercih-robotu) sıralamanı gir; devlet/vakıf filtresiyle iki evreni ayrı ayrı da tarayabilirsin.
|
||||||
55
content/rehber/ek-yerlestirme-2026.md
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
---
|
||||||
|
baslik: Ek Yerleştirme Nedir? 2026 Ek Tercih Rehberi
|
||||||
|
aciklama: İlk yerleştirmede boşta kaldıysan oyun bitmedi — kimlerin başvurabileceği ve ikinci şansı doğru kullanmanın yolu tek şemada.
|
||||||
|
tarih: 2026-07-22
|
||||||
|
---
|
||||||
|
|
||||||
|
Merkezi yerleştirme sonuçları açıklandığında bir programa yerleşememiş olmak yılın sonu değildir. Üniversiteler kayıt dönemini kapattığında binlerce kontenjan boş kalır ve ÖSYM bu boş kontenjanlar için **ek yerleştirme** (ek tercih) süreci açar.
|
||||||
|
|
||||||
|
## Ek yerleştirme ne zaman?
|
||||||
|
|
||||||
|
Kayıtlar tamamlandıktan sonra, genellikle **Eylül ayı içinde**. ÖSYM önce boş kontenjanları içeren Ek Yerleştirme Kılavuzu'nu yayımlar, ardından birkaç günlük tercih penceresi açılır. Kesin tarihler her yıl ÖSYM duyurusuyla netleşir — tercih takviminin tamamı için [YKS 2026 tercih takvimi](/rehber/yks-tercih-takvimi-2026) yazısına bak.
|
||||||
|
|
||||||
|
## Kimler başvurabilir?
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
%% aria: Ek yerleştirme başvuru şeması: ilk yerleştirmede hiçbir programa yerleşemediysen veya hiç tercih yapmadıysan ek yerleştirmeye başvurabilirsin; Eylül'de kılavuz yayımlanınca yeni bir 24 tercihlik liste kurarsın. İlk turda herhangi bir programa yerleştiysen — kayıt yaptırmasan bile — ek yerleştirme kapısı kapalıdır.
|
||||||
|
%% altyazi: Kritik kural: yerleşmiş sayılmak ek kapıyı kapatır; kayıt yaptırmamak bu durumu değiştirmez.
|
||||||
|
flowchart TD
|
||||||
|
S{"İlk yerleştirmede<br/>ne oldu?"}
|
||||||
|
S -- "hiçbir programa yerleşemedin<br/>ya da hiç tercih yapmadın" --> A("Ek yerleştirme hakkın var:<br/>Eylülde yeni 24 tercih")
|
||||||
|
A --> L("Kılavuzdaki boş kontenjanlardan<br/>gerçekçi bir liste kur")
|
||||||
|
S -- "bir programa yerleştin<br/>kayıt yaptırmasan bile" --> K("Kapı kapalı:<br/>ek yerleştirmeye giremezsin")
|
||||||
|
|
||||||
|
classDef garanti fill:#d1fae5,stroke:#10b981,color:#065f46
|
||||||
|
classDef hayal fill:#fee2e2,stroke:#ef4444,color:#991b1b
|
||||||
|
class A,L garanti
|
||||||
|
class K hayal
|
||||||
|
```
|
||||||
|
|
||||||
|
Kurallar nettir ve en kritik olanı şudur:
|
||||||
|
|
||||||
|
- **İlk yerleştirmede herhangi bir programa yerleşen aday, kayıt yaptırmasa bile ek yerleştirmeye başvuramaz.** "Yerleştim ama gitmeyeceğim, ek tercihte daha iyisini denerim" diye bir yol yoktur.
|
||||||
|
- Ek yerleştirme yalnızca ilk yerleştirmede **hiçbir programa yerleşememiş** adaylara açıktır.
|
||||||
|
- İlk dönemde hiç tercih yapmamış adaylar da ek yerleştirmeye katılabilir.
|
||||||
|
|
||||||
|
Bu kural, ilk listenin sonuna "kayıt yaptırmayacağım ama boşta da kalmayayım" mantığıyla program yazmanın neden tehlikeli olduğunu gösterir: oraya yerleşirsen ek tercih hakkın yanar. Bu tuzağın detayı [tercih listesi rehberinde](/rehber/tercih-listesi-nasil-yapilir).
|
||||||
|
|
||||||
|
## Ek yerleştirmede taban nasıl işler?
|
||||||
|
|
||||||
|
Ek yerleştirmede bir programa başvurabilmek için o programın **ilk yerleştirmedeki taban puanına eşit veya daha yüksek** puana sahip olman gerekir (ilk yerleştirmede hiç dolmayan programlarda bu şart esner). Yani ek tercih "tabanlar sıfırlanır, herkes her yere yazılır" demek değildir.
|
||||||
|
|
||||||
|
## Boş kontenjanlar nereden çıkar?
|
||||||
|
|
||||||
|
- İlk yerleştirmede hiç dolmayan programlar (çoğunlukla vakıf ücretli ve bazı önlisans programları),
|
||||||
|
- Yerleşip kayıt yaptırmayan adaylardan boşalan yerler.
|
||||||
|
|
||||||
|
Boş kontenjan listesi ağırlıklı olarak vakıf üniversiteleri, ücretli/indirimli varyantlar ve önlisans programlarından oluşur; ama her yıl devlet üniversitelerinden de şaşırtıcı fırsatlar çıkar. Hangi bölümlerde kontenjanların geniş olduğuna dair fikir edinmek için [tüm bölümlerin taban puanları](/bolumler) sayfasındaki kontenjan kolonlarına göz at.
|
||||||
|
|
||||||
|
## Ek tercih stratejisi
|
||||||
|
|
||||||
|
1. **Kılavuzu bekleme, hazırlığını şimdi yap.** Sıralamana uygun program evrenini [tercih robotuyla](/tercih-robotu) önceden çıkar; kılavuz yayımlanınca sadece kesişimi almak kalır.
|
||||||
|
2. **İlk yerleştirme mantığıyla kurma.** Ek yerleştirmede tek liste hakkın var ve pencere kısa; dengeli-garanti ağırlıklı, gerçekçi bir liste kur.
|
||||||
|
3. **Kayıt yaptırmayacağın programı yine yazma.** Aynı kural burada da geçerli — ek yerleştirmeden sonra üçüncü bir şans yok.
|
||||||
|
|
||||||
|
Ek yerleştirme, ilk turda şanssızlık yaşayanlar için gerçek bir ikinci şanstır; panik turu değil. Veriyle ve soğukkanlı kurulmuş bir ek liste, aceleyle yazılmış ilk listeden daha iyi sonuç verebilir.
|
||||||
65
content/rehber/hazirlik-sinifi-ve-ogretim-dili.md
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
---
|
||||||
|
baslik: Hazırlık Sınıfı ve Öğretim Dili — (İngilizce), (%30 İngilizce) Ne Demek?
|
||||||
|
aciklama: Program adının yanındaki dil etiketi ne anlatıyor, hazırlık zorunlu mu, atlanabilir mi, bir yıl uzar mı? Dil kararının tamamı tek şemada.
|
||||||
|
tarih: 2026-07-31
|
||||||
|
---
|
||||||
|
|
||||||
|
Tercih tablosunda aynı bölümü üç farklı etiketle görürsün: *Bilgisayar Mühendisliği*, *Bilgisayar Mühendisliği (İngilizce)*, *Bilgisayar Mühendisliği (%30 İngilizce)*. Bu etiket **öğretim dilini** anlatır; burs ya da kalite bilgisi değildir. Ama okuma sürene, hazırlık yılına ve mezuniyetteki dil seviyene doğrudan etki eder — yani listede yerini bilerek belirlemen gerekir.
|
||||||
|
|
||||||
|
## Etiketten hazırlığa: karar akışı
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
%% aria: Öğretim dili ve hazırlık sınıfı akış şeması. Program adının yanındaki etiket önce okunur. Tamamen İngilizce programlarda derslerin tamamı İngilizcedir ve hazırlık sınıfı genellikle zorunludur. Yüzde otuz İngilizce programlarda derslerin bir kısmı İngilizcedir ve hazırlık üniversiteye göre zorunlu veya isteğe bağlı olabilir. Türkçe programlarda hazırlık genelde isteğe bağlıdır. Hazırlık zorunluysa yıl başında yapılan yeterlik yani muafiyet sınavına girilir. Sınav geçilirse doğrudan birinci sınıftan başlanır. Geçilemezse bir yıl hazırlık okunur ve bu yıl normal öğrenim süresine dahil değildir. Hazırlık sonunda yine başarısız olunursa üniversitenin yönetmeliğine göre ek süre veya Türkçe eşdeğer programa geçiş gündeme gelir; bu koşullar okuldan okula değiştiği için kılavuzdan ve üniversitenin yönetmeliğinden doğrulanmalıdır.
|
||||||
|
%% altyazi: Dil etiketi süreyi değiştirir: hazırlık yılı normal öğrenim süresine dahil değildir.
|
||||||
|
flowchart TD
|
||||||
|
E{"Program adının<br/>yanındaki etiket"}
|
||||||
|
E -- "İngilizce" --> I("Dersler tamamen İngilizce<br/>hazırlık genelde ZORUNLU")
|
||||||
|
E -- "%30 İngilizce" --> O("Derslerin bir kısmı İngilizce<br/>hazırlık okula göre değişir")
|
||||||
|
E -- "etiket yok" --> T("Türkçe program<br/>hazırlık genelde İSTEĞE BAĞLI")
|
||||||
|
I --> M{"Yıl başındaki yeterlik<br/>muafiyet sınavı"}
|
||||||
|
O --> M
|
||||||
|
M -- "geçtin" --> B("Doğrudan 1. sınıf<br/>süre uzamaz")
|
||||||
|
M -- "geçemedin" --> H("1 yıl hazırlık<br/>normal süreye dahil DEĞİL")
|
||||||
|
H --> S{"Hazırlık sonu<br/>başarı"}
|
||||||
|
S -- "başardın" --> B
|
||||||
|
S -- "başaramadın" --> U("Üniversitenin yönetmeliğine göre:<br/>ek süre veya Türkçe<br/>eşdeğer programa geçiş")
|
||||||
|
|
||||||
|
classDef uyari fill:#fef3c7,stroke:#f59e0b,color:#92400e
|
||||||
|
classDef garanti fill:#d1fae5,stroke:#10b981,color:#065f46
|
||||||
|
classDef hayal fill:#fee2e2,stroke:#ef4444,color:#991b1b
|
||||||
|
class B,T garanti
|
||||||
|
class M,S,H,O uyari
|
||||||
|
class U hayal
|
||||||
|
```
|
||||||
|
|
||||||
|
## Etiketler ne anlatıyor?
|
||||||
|
|
||||||
|
- **(İngilizce):** Programdaki derslerin tamamına yakını İngilizce işlenir. Bu programlarda hazırlık sınıfı çoğunlukla zorunludur; yeterlik sınavını geçemezsen bir yıl hazırlık okursun.
|
||||||
|
- **(%30 İngilizce):** Derslerin belirli bir bölümü İngilizce, geri kalanı Türkçedir. Hazırlığın zorunlu mu isteğe bağlı mı olduğu üniversiteden üniversiteye değişir — bunu ÖSYM kılavuzundaki program koşullarından ve üniversitenin kendi yönetmeliğinden doğrulaman gerekir.
|
||||||
|
- **Etiketsiz program:** Türkçe öğretim yapılır. Çoğu üniversitede isteğe bağlı hazırlık imkânı yine de vardır.
|
||||||
|
- **UOLP / ortak program:** Yurt dışındaki bir üniversiteyle yürütülen ortak programdır. Dil etiketinden ayrı bir şeydir; kendi koşulları, kendi ücretlendirmesi ve genelde yurt dışında geçirilecek dönemleri vardır. Kılavuzdaki açıklama maddelerini satır satır okumadan bu satırları listeye yazma.
|
||||||
|
|
||||||
|
Kritik nokta: **etiket bir kalite göstergesi değildir.** Aynı üniversitenin Türkçe ve İngilizce programı arasındaki taban farkı, çoğu zaman eğitim kalitesi farkını değil, adayların dil tercihini yansıtır.
|
||||||
|
|
||||||
|
## Hazırlık yılı süreyi uzatır mı?
|
||||||
|
|
||||||
|
Hazırlık sınıfı **normal öğrenim süresine dahil değildir.** Yani dört yıllık bir lisans programında hazırlık okursan toplam beş yıl kampüste olursun, ama azami öğrenim süren dört yıl üzerinden işlemeye hazırlıktan sonra başlar. Pratik sonuç: hazırlık, mezuniyetini bir yıl öteler.
|
||||||
|
|
||||||
|
Bu bir yıl kayıp mı? Cevap tamamen sana bağlı:
|
||||||
|
|
||||||
|
- **Dilin zaten iyiyse** yeterlik sınavını geçip doğrudan birinci sınıftan başlarsın; hiçbir şey uzamaz. Bu sınav yıl başında yapılır ve girmek ücretsizdir — kaybedecek bir şeyin yok.
|
||||||
|
- **Dilin zayıfsa ve hedefin dilin ağır bastığı bir alansa** ([Bilgisayar Mühendisliği](/bolum/bilgisayar-muhendisligi), [Yazılım Mühendisliği](/bolum/yazilim-muhendisligi), [Uluslararası İlişkiler](/bolum/uluslararasi-iliskiler), [Endüstri Mühendisliği](/bolum/endustri-muhendisligi)) hazırlık yılı büyük ihtimalle hayatındaki en verimli yatırımlardan biridir. Bu alanlarda kaynakların, dokümantasyonun ve iş ilanlarının çoğu İngilizcedir.
|
||||||
|
- **Dilin zayıfsa ve alanın ağırlıklı olarak Türkçe yürüyorsa** ([Hukuk](/bolum/hukuk), [Sınıf Öğretmenliği](/bolum/sinif-ogretmenligi), [Türkçe Öğretmenliği](/bolum/turkce-ogretmenligi), sağlık meslek programlarının çoğu) hazırlığı zorunlu kılan bir programı sırf etiket için tercih etmenin getirisi sınırlıdır.
|
||||||
|
|
||||||
|
## Hazırlıkta başarısız olursam?
|
||||||
|
|
||||||
|
Bu, tercih öncesinde en az konuşulan ama en çok korkulan konu. Genel çerçeve şu: hazırlık sonunda yeterlik sağlanamazsa üniversitenin yönetmeliği devreye girer. Bazı üniversiteler ek süre veya yaz okulu tanır; bazılarında ise Türkçe eşdeğer bir programa geçiş imkânı gündeme gelir. **Bu koşullar okuldan okula ciddi biçimde değişir** — tercih etmeyi düşündüğün üniversitenin "Yabancı Diller Yüksekokulu" veya "Hazırlık Sınıfı Yönetmeliği" sayfasını açıp okumak on dakika sürer ve seni yıllarca ilgilendirir.
|
||||||
|
|
||||||
|
## Listede nasıl konumlanır?
|
||||||
|
|
||||||
|
- İngilizce ve Türkçe programı **ayrı satır** olarak düşün: ayrı kontenjan, ayrı taban, ayrı program kodu.
|
||||||
|
- İkisini de istiyorsan ikisini de yaz; hangisini daha çok istiyorsan üste koy. Aralarındaki taban farkı sıralamana bağlı olarak ikisini de erişilebilir kılabilir.
|
||||||
|
- İngilizce programı **yalnızca hazırlık yılını göze alıyorsan** yaz. "Nasıl olsa muafiyet sınavını geçerim" varsayımıyla yazıp geçemezsen, yine de o yılı okursun.
|
||||||
|
- %30 İngilizce programlarda hazırlığın zorunlu olup olmadığını **program bazında** kontrol et; aynı üniversitenin iki bölümünde bile farklı olabilir.
|
||||||
|
|
||||||
|
Sıralamanla hangi dil varyantlarının açık olduğunu yan yana görmek için [tercih robotuna](/tercih-robotu) sıralamanı gir; aynı bölümün Türkçe ve İngilizce satırlarını tek listede karşılaştırabilirsin.
|
||||||
58
content/rehber/kac-siralama-ile-hangi-bolume-girebilirim.md
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
---
|
||||||
|
baslik: Kaç Sıralama ile Hangi Bölüme Girebilirim? (2025 Verileriyle)
|
||||||
|
aciklama: 10 binden 1 milyona — sıralama bandına göre hangi bölümlerin gerçekçi olduğunun haritası ve nasıl okunacağı tek şemada.
|
||||||
|
tarih: 2026-07-23
|
||||||
|
---
|
||||||
|
|
||||||
|
"Sıralamam X, nereyi kazanırım?" tercih döneminin en çok sorulan sorusu. Aşağıdaki bantlar 2025 YKS yerleştirme verilerine (YÖK Atlas) dayanır ve **kabaca bir harita** çizer — kesin sınır değildir; aynı bölümün tabanı üniversiteye, şehre ve burs durumuna göre çok geniş bir aralığa yayılır.
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
%% aria: Sıralama bandı okuma şeması: önce kendi puan türünün sıralama bandını bulursun; bant sana hangi bölümlere bakmaya değer olduğunu söyler ama hangi üniversitede tutacağını söylemez. Sonra bölüm sayfasındaki tabloya inip kendi sıralamanın düştüğü programları görürsün; en hızlı yol tercih robotuna sıralamanı girip hayal, dengeli ve garanti dilimlerini tek bakışta almaktır. Bant pusuladır, garanti değildir.
|
||||||
|
%% altyazi: Bant "nereye bakayım" der; kesin satırı bölüm tablosu ve tercih robotu söyler.
|
||||||
|
flowchart TD
|
||||||
|
B("Sıralama bandını bul<br/>SAY, EA, sözel veya dil") --> N("Bant sana hangi bölümlere<br/>bakmaya değer olduğunu söyler")
|
||||||
|
N --> T{"Nasıl netleşir?"}
|
||||||
|
T -- "bölüm tablosuna in" --> TAB("Aynı bölümde tabanlar<br/>üniversiteye göre çok açılır")
|
||||||
|
T -- "tercih robotuna gir" --> R("Hayal / dengeli / garanti<br/>dilimleri saniyede çıkar")
|
||||||
|
TAB --> K("Bandına düşen satırları<br/>istek sırana göre diz")
|
||||||
|
R --> K
|
||||||
|
|
||||||
|
classDef uyari fill:#fef3c7,stroke:#f59e0b,color:#92400e
|
||||||
|
classDef garanti fill:#d1fae5,stroke:#10b981,color:#065f46
|
||||||
|
class N,TAB uyari
|
||||||
|
class R,K garanti
|
||||||
|
```
|
||||||
|
|
||||||
|
## Sayısal (SAY) için kaba harita
|
||||||
|
|
||||||
|
| Sıralama bandı | Gerçekçi seçenekler |
|
||||||
|
| --- | --- |
|
||||||
|
| İlk 5 bin | Köklü devletlerde [Tıp](/bolum/tip), [Bilgisayar Mühendisliği](/bolum/bilgisayar-muhendisligi), [Elektrik-Elektronik Mühendisliği](/bolum/elektrik-elektronik-muhendisligi) |
|
||||||
|
| 5-25 bin | Devlet tıp (yeni fakülteler), [Diş Hekimliği](/bolum/dis-hekimligi), iyi devletlerde mühendislikler |
|
||||||
|
| 25-75 bin | [Eczacılık](/bolum/eczacilik), devlet mühendislikleri, [Mimarlık](/bolum/mimarlik) |
|
||||||
|
| 75-200 bin | Sağlık bilimleri ([Fizyoterapi ve Rehabilitasyon](/bolum/fizyoterapi-ve-rehabilitasyon), [Hemşirelik](/bolum/hemsirelik)), Anadolu devletlerinde mühendislik |
|
||||||
|
| 200-500 bin | Fen bilimleri, ziraat, daha geniş kapatan mühendislikler, vakıf burslu seçenekleri |
|
||||||
|
| 500 bin+ | Açıköğretim dışı seçenekler daralır; önlisans (TYT) tarafı güçlü alternatif olur |
|
||||||
|
|
||||||
|
## Eşit Ağırlık (EA) için kaba harita
|
||||||
|
|
||||||
|
| Sıralama bandı | Gerçekçi seçenekler |
|
||||||
|
| --- | --- |
|
||||||
|
| İlk 10 bin | Köklü devletlerde [Hukuk](/bolum/hukuk), [Psikoloji](/bolum/psikoloji) |
|
||||||
|
| 10-50 bin | Devlet hukuk (geniş kapatanlar), [İşletme](/bolum/isletme) / [İktisat](/bolum/iktisat) (iyi devletler), Psikoloji |
|
||||||
|
| 50-150 bin | Anadolu devletlerinde İİBF bölümleri, [Rehberlik ve Psikolojik Danışmanlık](/bolum/rehberlik-ve-psikolojik-danismanlik) |
|
||||||
|
| 150-400 bin | Vakıf burslu/indirimli seçenekler, sosyal hizmet, kamu yönetimi |
|
||||||
|
|
||||||
|
Sözel ve Dil tarafında bantlar daha da geniştir; öğretmenlikler için ayrıca **başarı sıralaması şartı** devreye girer — detayı [Baraj ve başarı sıralaması şartları](/rehber/siralama-sartlari-2026) yazısında.
|
||||||
|
|
||||||
|
## Bu tabloyu nasıl kullanmalısın?
|
||||||
|
|
||||||
|
1. **Bandını bul, ama banda güvenme.** Bant sana "hangi bölümlere bakmaya değer" der; hangi üniversitede tutacağını söylemez. Aynı bölüm içinde tabanlar 10 kat oynayabilir.
|
||||||
|
2. **Bölüm sayfasının tablosuna in.** Örneğin [Psikoloji taban puanları](/bolum/psikoloji) sayfasında 380'e yakın programın tek tek tabanını görürsün — senin sıralaman listenin neresine düşüyorsa gerçekçi bölgen orasıdır.
|
||||||
|
3. **Kendi sıralamanla tara.** [Tercih robotuna](/tercih-robotu) sıralamanı gir; robot 23.000+ programın içinden senin bandına düşenleri hayal/dengeli/garanti dilimleriyle ayırıp önüne koyar. Tablo ezberlemekten hızlıdır.
|
||||||
|
|
||||||
|
## Unutma
|
||||||
|
|
||||||
|
- Sıralaman **puan türüne özeldir**; SAY sıralaman ile EA sıralaman farklıdır, her listeyi kendi türünün sıralamasıyla kur.
|
||||||
|
- Burslu/indirimli/İngilizce varyantların tabanları aynı bölümde bile çok farklıdır.
|
||||||
|
- 2026 tabanları bu yılın yerleştirmesiyle netleşir; buradaki veriler pusula, garanti değil.
|
||||||
50
content/rehber/merkezi-yerlestirme-nasil-calisir.md
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
---
|
||||||
|
baslik: Merkezi Yerleştirme Nasıl Çalışır? ÖSYM Seni Nasıl Yerleştirir?
|
||||||
|
aciklama: "Üst sıraya yazarsam şansımı yakar mıyım?" korkusunun cevabı sistemin kendisinde. ÖSYM'nin yerleştirme mantığı, tek şemada ve öğrenci diliyle.
|
||||||
|
tarih: 2026-07-26
|
||||||
|
---
|
||||||
|
|
||||||
|
Tercih döneminin en çok aranan sorularından biri şu: *"Tercihler nasıl değerlendiriliyor? Üst sıraya iddialı bir bölüm yazarsam alttaki şansımı kaybeder miyim?"* Kısa cevap: **hayır, kaybetmezsin.** Nedenini anlamak için ÖSYM'nin yerleştirme mantığını bir kez görmek yeter — sistem sandığından çok daha basit çalışır.
|
||||||
|
|
||||||
|
## Sistem tek cümlede
|
||||||
|
|
||||||
|
ÖSYM önce **adayları** puana göre sıralar, sonra sıra sana gelince **senin listeni** yukarıdan aşağı okur ve boş kontenjan bulduğu ilk satıra seni yerleştirir. Hepsi bu.
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
%% aria: Merkezi yerleştirme akış şeması: ÖSYM tüm adayları puana göre sıralar ve sıra puanı yüksekten düşüğe ilerler; sıra sana gelince tercih listen birinci satırdan başlayarak kontrol edilir, boş kontenjan bulunan ilk programa yerleşirsin ve alttaki satırlara hiç bakılmaz; 24 satırın hiçbirinde yer yoksa boşta kalırsın ama ek yerleştirme hakkın devam eder.
|
||||||
|
%% altyazi: Sistem listene her zaman yukarıdan aşağı bakar; bir satıra yerleştiğin an alttaki satırlar devre dışı kalır.
|
||||||
|
flowchart TD
|
||||||
|
P("ÖSYM tüm adayları puana göre sıralar<br/>sıra, puanı yüksekten düşüğe ilerler") --> S("Sıra sana geldi:<br/>listen 1. satırdan okunmaya başlar")
|
||||||
|
S --> T1{"1. tercihinde boş<br/>kontenjan var mı?"}
|
||||||
|
T1 -- "evet" --> Y("Yerleştin<br/>alttaki satırlara hiç bakılmaz")
|
||||||
|
T1 -- "hayır" --> T2{"2. tercihinde<br/>boş yer var mı?"}
|
||||||
|
T2 -- "evet" --> Y
|
||||||
|
T2 -- "hayır" --> D("aynı soru 24. satıra<br/>kadar tekrarlanır")
|
||||||
|
D --> B{"24 satırın hiçbirinde<br/>yer kalmadı mı?"}
|
||||||
|
B -- "boşta kaldın" --> E("Üzülme, bitmedi:<br/>ek yerleştirme hakkın saklı")
|
||||||
|
|
||||||
|
classDef garanti fill:#d1fae5,stroke:#10b981,color:#065f46
|
||||||
|
classDef uyari fill:#fef3c7,stroke:#f59e0b,color:#92400e
|
||||||
|
class Y garanti
|
||||||
|
class E uyari
|
||||||
|
```
|
||||||
|
|
||||||
|
## Bu mantıktan çıkan üç altın kural
|
||||||
|
|
||||||
|
**1) Üst sıradaki "hayal" tercihi alttakilere zarar veremez.** Sistem 1. tercihinde yer bulamazsa hiç duraksamadan 2.'ye geçer. Hayal bölümünü en üste yazmanın tek "maliyeti" bir satırdır; alttaki dengeli ve garanti tercihlerinin ihtimali kılını bile kıpırdatmaz. Bu yüzden listenin başı gönlüne göre, sonu aklına göre kurulur — dilim mantığının tamamı [tercih listesi rehberinde](/rehber/tercih-listesi-nasil-yapilir) var.
|
||||||
|
|
||||||
|
**2) Yerleştiğin satırın altı yok hükmündedir.** 3. tercihine yerleştiysen 4-24 arası hiç okunmaz. Bu yüzden listeyi *yerleşme ihtimaline göre değil, istek sırana göre* dizmelisin: en çok istediğin hep daha üstte durmalı. "Daha çok istediğim bölüm alttaydı, keşke" cümlesinin telafisi yoktur.
|
||||||
|
|
||||||
|
**3) Taban sıralaması yerleştirme bittikten sonra oluşur.** Bir programın tabanı, o programa **yerleşen son kişinin** sıralamasıdır. Yani tabanlar önceden ilan edilen bir eşik değil, o yılın adaylarının tercih davranışının sonucudur — bu yüzden yıldan yıla oynar. Detayı [tabanlar nasıl değişir](/rehber/taban-siralamalar-nasil-degisir) yazısında.
|
||||||
|
|
||||||
|
## Peki neden hâlâ "ölü tercih" diye bir şey var?
|
||||||
|
|
||||||
|
Sistemin yukarıdan aşağı okuması, sıralamanın çok üstünde kapatan bir programı listenin *sonuna* yazmayı anlamsızlaştırır: o satıra sıra geldiyse zaten üstteki 20 satırda yer bulamamışsındır; tabanı senden çok iyi olan o program sana hiç açılmayacaktır. Bu satırlar listede yer kaplayan boş kurşunlardır — tanımı ve temizleme yöntemi için [ölü tercih nedir](/rehber/olu-tercih-nedir) yazısına bak.
|
||||||
|
|
||||||
|
## Pratik sonuç
|
||||||
|
|
||||||
|
- Listenin başına puanın "yetmeyecek gibi" duran ama çok istediğin programları çekinmeden yaz.
|
||||||
|
- Ortayı sıralamana yakın programlarla doldur, sona gerçekten razı olacağın garantileri koy.
|
||||||
|
- Sıralamanla hangi dilime neyin girdiğini görmek için [tercih robotuna](/tercih-robotu) sıralamanı girmen yeterli.
|
||||||
|
|
||||||
|
Sistemi bilen aday, listeyi korkuyla değil stratejiyle kurar. Korku listesi hep aşağı yığılır; strateji listesi yukarıdan kazanır.
|
||||||
47
content/rehber/obp-nedir-nasil-hesaplanir.md
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
---
|
||||||
|
baslik: OBP Nedir, Nasıl Hesaplanır? Diploma Notu Kaç Puan Getirir?
|
||||||
|
aciklama: Ortaöğretim başarı puanının hesabı, yerleştirme puanına gerçek katkısı ve "geçen yıl yerleştiysen çarpan yarıya düşer" kuralı — sayılarla ve tek şemada.
|
||||||
|
tarih: 2026-07-27
|
||||||
|
---
|
||||||
|
|
||||||
|
Tercih döneminde en çok aranan hesap sorusu: *"Diploma notum yerleştirme puanıma kaç puan ekler?"* Cevap net bir formüle dayanır ve iki dakikada öğrenilir. Ama formülün ucunda, tercih stratejini doğrudan etkileyen bir kural saklı: **geçen yıl bir programa yerleşenlerin katkısı yarıya düşer.**
|
||||||
|
|
||||||
|
## Hesap üç adımda
|
||||||
|
|
||||||
|
Lise diploma notun 50-100 arasındadır. ÖSYM bunu 5 ile çarpar ve **OBP** (Ortaöğretim Başarı Puanı) 250-500 arasında bir değere dönüşür. Yerleştirme puanına eklenen katkı ise OBP'nin 0,12 ile çarpımıdır:
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
%% aria: OBP hesap şeması: 50 ile 100 arasındaki diploma notu 5 ile çarpılarak 250 ile 500 arasında OBP değerine dönüşür; OBP 0,12 ile çarpılarak 30 ile 60 puan arasında bir katkı üretir ve ham YKS puanına eklenerek yerleştirme puanını oluşturur; geçen yıl merkezi yerleştirmeyle bir programa yerleştiysen çarpan 0,06'ya düşer ve katkı 15 ile 30 puan arasına iner.
|
||||||
|
%% altyazi: Katkı aralığı 30-60 puandır; iki aday arasındaki gerçek fark ise çoğu zaman birkaç puandır çünkü herkes en az 30 alır.
|
||||||
|
flowchart TD
|
||||||
|
D("Diploma notun<br/>50 ile 100 arası") -- "5 ile çarpılır" --> O("OBP<br/>250 ile 500 arası")
|
||||||
|
O -- "0,12 ile çarpılır" --> K("Yerleştirme puanına katkı<br/>30 ile 60 puan arası")
|
||||||
|
K --> P("Ham YKS puanın + katkı<br/>= yerleştirme puanın")
|
||||||
|
O -. "geçen yıl bir programa yerleştiysen<br/>çarpan 0,06 olur" .-> Z("Katkı yarıya düşer<br/>15 ile 30 puan arası")
|
||||||
|
|
||||||
|
classDef garanti fill:#d1fae5,stroke:#10b981,color:#065f46
|
||||||
|
classDef hayal fill:#fee2e2,stroke:#ef4444,color:#991b1b
|
||||||
|
class P garanti
|
||||||
|
class Z hayal
|
||||||
|
```
|
||||||
|
|
||||||
|
## Sayının doğru okuması: 60 değil, fark önemli
|
||||||
|
|
||||||
|
"60 puana kadar katkı" kulağa devasa gelir ama herkes **en az 30** alır (diploma notu 50 bile olsa). Yani seninle rakibin arasındaki gerçek OBP farkı en fazla 30 puandır ve diploma notları yakınsa bu fark birkaç puana iner. Diploma notu 85 olan bir aday 51 puan katkı alır; 95 olan 57 alır — arada sadece 6 puan vardır. OBP kimseyi tek başına bölüm atlatmaz; **eşit puan bölgesinde sıralamayı birkaç bin kaydırır.** Sıralamanın puandan neden daha önemli olduğu ayrı bir yazının konusu: [taban puan mı, sıralama mı?](/rehber/taban-puan-mi-siralama-mi)
|
||||||
|
|
||||||
|
## Kritik kural: çarpan neden yarıya düşer?
|
||||||
|
|
||||||
|
Geçen yıl merkezi yerleştirmeyle bir programa **yerleştirildiysen** — kayıt yaptırmamış olsan bile — bu yıl OBP çarpanın 0,12 yerine **0,06** uygulanır (kontenjansız açıköğretim programları bu kuralın dışındadır). Yani "bir yere yerleşeyim de garantim olsun, seneye yine denerim" planının görünmez bir bedeli vardır: gelecek yılki puanından 15-30 puan peşinen gider.
|
||||||
|
|
||||||
|
Bunun tercih listene çevirisi şudur: **yerleşsen bile gitmeyeceğin programı listene yazma.** Bu kuralın diğer bedelleriyle birlikte tamamı [tercih listesi rehberinde](/rehber/tercih-listesi-nasil-yapilir) anlatılıyor.
|
||||||
|
|
||||||
|
## Okul birincilerine ayrı kapı
|
||||||
|
|
||||||
|
Okul birincileri için üniversitelerde **ayrı bir kontenjan** ayrılır (2026'da yaklaşık 17 bin 862 kişilik). Okul birincisi, hem genel kontenjandan hem de okul birincisi kontenjanından değerlendirilir — hangisinden yerleşirse o geçerli olur. Ayrıca 2026'da şehit ve gazi yakınları ile 34 yaş üstü kadın adaylar için de özel kontenjanlar var; sonuç belgende bu kontenjanlardan birine hakkın görünüyorsa tercih ekranında ayrıca işaretlemeyi unutma.
|
||||||
|
|
||||||
|
## Özet
|
||||||
|
|
||||||
|
- OBP = diploma notu × 5; katkı = OBP × 0,12 → **30-60 puan arası.**
|
||||||
|
- Herkes en az 30 aldığı için gerçek rekabet farkı küçüktür; asıl belirleyici sınav performansın ve sıralamandır.
|
||||||
|
- Geçen yıl yerleştiysen çarpan yarıya düşer — istemediğin programı listeye yazmanın en somut cezası budur.
|
||||||
|
- Sıralamanla nereye uzanabildiğini görmek için [tercih robotunu](/tercih-robotu) kullanabilirsin.
|
||||||
48
content/rehber/olu-tercih-nedir.md
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
---
|
||||||
|
baslik: Ölü Tercih Nedir, Nasıl Anlaşılır? (Ve Nasıl Kaçınılır)
|
||||||
|
aciklama: Listende hiç işe yaramayan satırlar olabilir. Ölü tercihin iki biçimi ve temizleme yolu — tek şemada.
|
||||||
|
tarih: 2026-07-24
|
||||||
|
---
|
||||||
|
|
||||||
|
Ölü tercih, **hiçbir senaryoda seni yerleştirmeyecek satır** demektir. Listende durur, yer kaplar ama hiç işe yaramaz. 24 tercih hakkın varken bunun 5-6'sını ölü satırlara harcamak, tercih dönemi hatalarının en sessizidir — kimse fark etmez, ta ki sonuçlar açıklanana kadar.
|
||||||
|
|
||||||
|
## Ölü tercihin iki biçimi
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
%% aria: Ölü tercih tanı şeması: her satır için sorulan soru, bu programa yerleşmenin gerçekçi olup olmadığıdır. Tabanı senden çok daha iyi olan bir program listenin sonundaysa ölü tercihtir — yeri listenin başındaki hayal bölgesidir. Aynı programın kopyası veya üstteki satırdan daha sıkı tabanlı bir program alta yazılmışsa yine ölüdür. Sağlıklı listede tabanlar yukarıdan aşağı giderek gevşer.
|
||||||
|
%% altyazi: Hayal tercihinin yeri listenin başıdır; sona saklanan iddialı satır ölü tercihe dönüşür.
|
||||||
|
flowchart TD
|
||||||
|
S{"Bu satıra yerleşmem<br/>gerçekçi mi?"}
|
||||||
|
S -- "tabanı çok sıkı<br/>ve listenin sonunda" --> O1("Ölü tercih:<br/>yeri baştaki hayal bölgesiydi")
|
||||||
|
S -- "üsttekiyle aynı program<br/>ya da ondan daha sıkı" --> O2("Ölü tercih:<br/>sıra hatası, satırı taşı veya sil")
|
||||||
|
S -- "tabanlar yukarıdan aşağı<br/>giderek gevşiyor" --> T("Sağlıklı satır:<br/>merdiven düzgün iner")
|
||||||
|
|
||||||
|
classDef hayal fill:#fee2e2,stroke:#ef4444,color:#991b1b
|
||||||
|
classDef garanti fill:#d1fae5,stroke:#10b981,color:#065f46
|
||||||
|
class O1,O2 hayal
|
||||||
|
class T garanti
|
||||||
|
```
|
||||||
|
|
||||||
|
**1) Sıralaması yetmeyecek programı listenin sonuna yazmak.**
|
||||||
|
ÖSYM yerleştirme sistemi listeni yukarıdan aşağı okur ve seni *yerleşebildiğin en üst tercihe* koyar. Diyelim sıralaman 200 bin ve 15. sıraya tabanı 40 bin kapatan bir program yazdın. O programa yerleşebilmen için üstteki 14 tercihin de tutmaması VE tabanın 40 binden 200 bine gevşemesi gerekir — pratikte imkânsız. O satır ölüdür. Hayal tercihi meşrudur ama yeri listenin **başıdır**, sonu değil.
|
||||||
|
|
||||||
|
**2) Zaten üstte yazdığın programın kopyasını alta yazmak.**
|
||||||
|
Aynı programın ikinci yazımı sistemde hiçbir şey değiştirmez. Benzer şekilde, tabanı üstteki tercihten belirgin şekilde daha iyi olan bir programı alta koymak da ölüdür: üstteki tutmadıysa alttaki hiç tutmaz.
|
||||||
|
|
||||||
|
## Nasıl anlarsın?
|
||||||
|
|
||||||
|
Her satır için şu soruyu sor: **"Bu programa yerleşmem için üstümdeki tercihlerin hepsinin tutmaması VE bu programın tabanının benim sıralamama gelmesi gerçekçi mi?"**
|
||||||
|
|
||||||
|
Pratik kontrol yöntemi:
|
||||||
|
|
||||||
|
- Satırın taban sıralamasına son 4 yıl üzerinden bak (tek yıl yanıltır).
|
||||||
|
- Tabanı, senin sıralamandan iyiyse → o satır ancak listenin *üst bloğunda* (hayal) anlamlıdır.
|
||||||
|
- Tabanı üstündeki satırdan da iyiyse → sıra hatası var; satırları taban gevşekliğine göre yeniden diz.
|
||||||
|
|
||||||
|
[Tercih robotuna](/tercih-robotu) sıralamanı girdiğinde programlar hayal/dengeli/garanti dilimleriyle etiketlenir; bir programın senin sıralamana göre hangi bölgede olduğunu tek bakışta görürsün. Popüler bölümlerde tabanların ne kadar geniş bir aralığa yayıldığını görmek için [Psikoloji](/bolum/psikoloji) veya [Hukuk](/bolum/hukuk) tablolarına bak — aynı bölümün tabanı üniversiteye göre yüz binlerce sıra oynayabilir; yani bölüm ölü değildir, *yanlış üniversite-satır eşleşmesi* ölüdür.
|
||||||
|
|
||||||
|
## Ölü tercihten temizlenmiş liste nasıl görünür?
|
||||||
|
|
||||||
|
Yukarıdan aşağı **tabanlar giderek gevşer**. İlk satırlar "tutarsa harika", orta blok "büyük ihtimal buradayım", son satırlar "kesin tutar ve severek giderim" der. Grafiğe döksen düzgün bir merdiven görürsün; ölü tercihli listelerde merdivenin ortasında yukarı fırlayan basamaklar olur.
|
||||||
|
|
||||||
|
Son bir uyarı: ölü tercihi temizleyeyim derken listenin başındaki hayal tercihlerini de kesme. Üst sıradaki iddialı tercih ölü değildir — bedava piyango biletidir. Ölü olan, o iddialı tercihi listenin *sonuna* saklamaktır.
|
||||||
48
content/rehber/onlisans-mi-lisans-mi.md
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
---
|
||||||
|
baslik: TYT ile Önlisans Tercihi — Önlisans mı, Lisans mı?
|
||||||
|
aciklama: 2 yıllıklar "yedek plan" değil, başlı başına bir rota. Önlisans mı lisans mı kararını tek şemada netleştir.
|
||||||
|
tarih: 2026-07-17
|
||||||
|
---
|
||||||
|
|
||||||
|
AYT'si istediği gibi gitmeyen ya da hedefi zaten uygulamalı bir meslek olan aday için önlisans (2 yıllık) programlar güçlü bir rotadır. Türkiye'deki yükseköğretim kontenjanının büyük bölümü TYT puan türüyle öğrenci alan önlisans programlarındadır — yani seçenek evreni geniştir.
|
||||||
|
|
||||||
|
## Önlisans ne zaman doğru tercih?
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
%% aria: Önlisans mı lisans mı karar şeması: hedef meslek lisans diploması şart koşuyorsa lisans yoluna bakarsın. Sıralaman gitmekten mutlu olacağın bir lisansa yetiyorsa o yolu seçersin. Hedef meslek uygulamalıysa, TYT güçlü AYT zayıfsa ve DGS köprüsü planlıyorsan ya da bir yıl daha sınav istemiyorsan önlisans rotası güçlenir. İstemediğin lisansa sırf kazanmış olmak için gitmek de gereksiz yere önlisansa razı olmak da hatadır.
|
||||||
|
%% altyazi: Doğru rota hedef mesleğe ve sıralama bandına göre değişir; ikisi de aynı 24'lük listede yan yana yazılabilir.
|
||||||
|
flowchart TD
|
||||||
|
S{"Hedefin ve sıralaman<br/>nereye işaret ediyor?"}
|
||||||
|
S -- "meslek lisans diploması ister<br/>ya da sıralaman mutlu olacağın lisansa yeter" --> L("Lisans rotası:<br/>kendi puan türünün sıralamasıyla kur")
|
||||||
|
S -- "uygulamalı meslek, DGS köprüsü<br/>ya da bir yıl daha sınav istemiyorsun" --> O("Önlisans rotası:<br/>TYT sıralamasıyla kur")
|
||||||
|
L --> UYARI("İstemediğin lisansa<br/>sırf kazanmış olmak için gitme")
|
||||||
|
O --> DGS("DGS planın varsa önce hedef lisansı,<br/>sonra ona köprü önlisansı seç")
|
||||||
|
|
||||||
|
classDef uyari fill:#fef3c7,stroke:#f59e0b,color:#92400e
|
||||||
|
classDef garanti fill:#d1fae5,stroke:#10b981,color:#065f46
|
||||||
|
class L,O garanti
|
||||||
|
class UYARI,DGS uyari
|
||||||
|
```
|
||||||
|
|
||||||
|
- **Hedef meslek uygulamalıysa.** [Bilgisayar Programcılığı](/bolum/bilgisayar-programciligi), [Anestezi](/bolum/anestezi), [İlk ve Acil Yardım](/bolum/ilk-ve-acil-yardim) gibi programlar 2 yılda alana özgü istihdama bağlanır.
|
||||||
|
- **Lisansa köprü olarak.** DGS (Dikey Geçiş Sınavı) ile önlisans mezunları ilgili lisans bölümlerine geçebilir. "TYT'm iyi, AYT'm zayıf" profili için 2+ yıl planı — önlisans + DGS — düşük sıralamayla doğrudan zayıf bir lisansa gitmekten daha iyi sonuç verebilir.
|
||||||
|
- **Bir yıl daha sınav istemiyorsan.** Tekrar hazırlanmak yerine alanda ilerlemek isteyene zaman kazandırır.
|
||||||
|
|
||||||
|
## Lisans lehine düşünmen gereken durumlar
|
||||||
|
|
||||||
|
- Hedef meslek lisans diploması şart koşuyorsa (mühendislik, hukuk, tıp, öğretmenlik...).
|
||||||
|
- Sıralaman, gitmekten mutlu olacağın bir lisans programına yetiyorsa — sırf "üniversite kazandı" demek için istemediğin lisansa gitmek de, gereksiz yere önlisansa razı olmak da hatadır. Bandını görmek için [kaç sıralama ile hangi bölüme girebilirim](/rehber/kac-siralama-ile-hangi-bolume-girebilirim) rehberine bak.
|
||||||
|
|
||||||
|
## TYT tablosunu doğru okumak
|
||||||
|
|
||||||
|
Önlisans tercihinde üç ayrıntı belirleyicidir:
|
||||||
|
|
||||||
|
1. **Sıralama TYT sıralamasıdır.** SAY/EA sıralamanla önlisans tablosu okuma; sonuç belgende TYT satırı ayrı yazar.
|
||||||
|
2. **Aynı programın tabanı okula göre uçurum yapar.** Büyükşehirdeki köklü bir MYO'nun programı ile küçük ilçe MYO'sunun aynı adlı programı arasında yüz binlerce sıra fark olabilir — [Bilgisayar Programcılığı tablosunda](/bolum/bilgisayar-programciligi) bunu net görürsün (395 program!).
|
||||||
|
3. **DGS planın varsa bölüm adına dikkat.** DGS'de hangi önlisanstan hangi lisansa geçilebildiği tablolarla sınırlıdır; hedef lisansı önce belirle, ona köprü olan önlisansı sonra seç.
|
||||||
|
|
||||||
|
## Tercih listesi taktiği
|
||||||
|
|
||||||
|
24 tercih hakkı lisans ve önlisansta **ortaktır** — aynı listeye ikisini de yazabilirsin. Ama farklı puan türlerinin sıralamaları karışacağı için düzeni şöyle kur: önce gitmeye razı olduğun lisans programları (kendi türünün sıralamasıyla), sonra önlisans bloğu (TYT sıralamasıyla). Her iki blokta da [ölü tercih](/rehber/olu-tercih-nedir) kuralları aynen geçerli.
|
||||||
|
|
||||||
|
TYT sıralamanı [tercih robotuna](/tercih-robotu) girip türü "TYT" seçersen önlisans evrenini hayal/dengeli/garanti dilimleriyle görürsün; lisans sıralamanla da ayrı bir tarama yapıp iki listeyi yan yana koyman en sağlıklısı.
|
||||||
72
content/rehber/ozel-kosullu-programlar.md
Normal file
@@ -0,0 +1,72 @@
|
|||||||
|
---
|
||||||
|
baslik: Özel Koşullu Programlar — Sağlık Raporu, Mülakat, Boy-Kilo ve Özel Yetenek
|
||||||
|
aciklama: Bazı programlara sadece sıralaman yetmez. Kılavuzdaki koşul maddeleri, sağlık raporu isteyen bölümler ve özel yetenek sınavı — tek şemada.
|
||||||
|
tarih: 2026-08-02
|
||||||
|
---
|
||||||
|
|
||||||
|
Tercih tablosunda bazı program satırlarının yanında küçük madde numaraları görürsün. Bunlar süs değil: o programa yerleşmek için **sıralamanın dışında** sağlanması gereken koşulları anlatır. Sağlık kurulu raporu, boy-kilo ölçüsü, mülakat, güvenlik soruşturması, belirli bir lise türünden mezuniyet... Bu koşulu sağlayamayan bir aday yerleşse bile kaydı yapılmaz. Bu yazı, o satırları tercih etmeden önce nasıl okuyacağını anlatıyor.
|
||||||
|
|
||||||
|
## Bir programın önündeki üç kapı
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
%% aria: Özel koşullu programlar şeması. Bir programa yerleşmenin önünde üç ayrı kapı olabilir. Birinci kapı sıralamadır: taban sıralaması ve varsa başarı sıralaması barajı. İkinci kapı kılavuzdaki koşul maddeleridir: sağlık kurulu raporu, boy ve kilo ölçüsü, mülakat, güvenlik soruşturması, belirli bir lise türünden mezun olma veya yaş sınırı gibi. Üçüncü kapı özel yetenek sınavıdır ve bu programlar merkezi yerleştirmeye dahil değildir; konservatuvar, spor bilimleri ve güzel sanatlar programlarına üniversitenin kendi düzenlediği sınavla girilir, tercih listesine yazılmaz. Bir programı listeye yazmadan önce koşul maddelerinin okunması ve sağlanamayan koşul varsa satırın yazılmaması gerekir; koşul sağlanmazsa yerleşme iptal edilir ve o yıl kaybedilir.
|
||||||
|
%% altyazi: Sıralaman yetse bile koşul sağlanmıyorsa kayıt yapılmaz — madde numaralarını tercihten önce oku.
|
||||||
|
flowchart TD
|
||||||
|
P("Programa yerleşmek") --> K1{"1. Kapı: sıralama<br/>taban ve varsa<br/>başarı sıralaması barajı"}
|
||||||
|
K1 -- "yetmiyor" --> R1("Satır hayal bloğunda<br/>ya da hiç yazılmaz")
|
||||||
|
K1 -- "yetiyor" --> K2{"2. Kapı: kılavuzdaki<br/>koşul maddeleri"}
|
||||||
|
K2 -- "sağlık raporu, boy-kilo,<br/>mülakat, lise türü..." --> D{"Koşulu<br/>sağlıyor musun?"}
|
||||||
|
D -- "evet, belgeli" --> Y("Satır listeye yazılabilir")
|
||||||
|
D -- "emin değilim" --> A("Önce belgeyi/ölçüyü doğrula<br/>sonra yaz")
|
||||||
|
D -- "hayır" --> H("Yazma:<br/>yerleşsen de kayıt yapılmaz,<br/>yıl kaybedilir")
|
||||||
|
K2 -- "koşul yok" --> Y
|
||||||
|
P --> K3("3. Kapı: özel yetenek<br/>konservatuvar, spor bilimleri,<br/>güzel sanatlar<br/>merkezi yerleştirmeye dahil DEĞİL")
|
||||||
|
|
||||||
|
classDef uyari fill:#fef3c7,stroke:#f59e0b,color:#92400e
|
||||||
|
classDef garanti fill:#d1fae5,stroke:#10b981,color:#065f46
|
||||||
|
classDef hayal fill:#fee2e2,stroke:#ef4444,color:#991b1b
|
||||||
|
class Y garanti
|
||||||
|
class K1,K2,D,A,K3 uyari
|
||||||
|
class H,R1 hayal
|
||||||
|
```
|
||||||
|
|
||||||
|
## Kapı 1: Sıralama ve barajlar
|
||||||
|
|
||||||
|
Bazı bölümlere yerleşmek için taban sıralamasını geçmek yetmez; ayrıca **başarı sıralaması barajını** da geçmen gerekir. Tıp, diş hekimliği, eczacılık, hukuk, mimarlık, mühendislik ve öğretmenlik programlarında bu barajlar uygulanır ve barajın altındaki adaylar o programı **tercih edemez**. Güncel eşikler [baraj ve başarı sıralaması şartları](/rehber/siralama-sartlari-2026) yazısında.
|
||||||
|
|
||||||
|
## Kapı 2: Kılavuzdaki koşul maddeleri
|
||||||
|
|
||||||
|
ÖSYM kılavuzunda her program satırının yanındaki numaralar, kılavuzun **"Koşullar ve Açıklamalar"** bölümündeki maddelere karşılık gelir. En sık karşılaşılanlar:
|
||||||
|
|
||||||
|
- **Sağlık kurulu raporu.** Bazı programlar, tam teşekküllü bir hastaneden alınacak sağlık kurulu raporu ister; raporda "bu programda öğrenim görmesinde sakınca yoktur" ifadesi aranır. Denizcilik, pilotaj, itfaiyecilik, bazı sağlık ve teknik programlar bu grupta olabilir. Renk körlüğü, işitme, denge gibi belirli sağlık koşullarını kapsayan maddeler de vardır.
|
||||||
|
- **Boy ve kilo ölçüsü.** [Pilotaj](/bolum/pilotaj) ve bazı güvenlik/denizcilik programlarında belirli boy ve kilo aralıkları aranır.
|
||||||
|
- **Mülakat / güvenlik soruşturması.** Bazı programlarda merkezi yerleştirmenin ardından ek bir değerlendirme aşaması vardır.
|
||||||
|
- **Belirli lise türünden mezuniyet.** Bazı önlisans programları yalnızca ilgili meslek lisesi mezunlarına, bazıları ise sınavsız/ek kontenjanla açıktır.
|
||||||
|
- **Yaş sınırı.** Özellikle havacılık ve güvenlik alanındaki programlarda üst yaş sınırı bulunabilir.
|
||||||
|
- **Yatılılık, üniforma, staj zorunluluğu.** Öğrencilik hayatını doğrudan etkileyen ama tercih anında atlanan maddelerdir.
|
||||||
|
- **Ücretli/ikinci öğretim, uzaktan öğretim bilgisi.** Programın işleyişini değiştirir; koşul maddesinde belirtilir.
|
||||||
|
|
||||||
|
**Nasıl kontrol edilir?** Listeye yazmayı düşündüğün her program için: kılavuzda satırın yanındaki madde numaralarını not al, kılavuzun koşullar bölümünden o maddeleri **tek tek oku**. Bu iş program başına iki dakika sürer ve tercih döneminde yapılabilecek en yüksek getirili iştir.
|
||||||
|
|
||||||
|
Kritik uyarı: koşulu sağlamadığın hâlde yerleştiysen **kaydın yapılmaz ve yerleşme hakkın iptal edilir.** Bu durumda o yılki [ek yerleştirme](/rehber/ek-yerlestirme-2026) süreci dışında elinde bir şey kalmaz.
|
||||||
|
|
||||||
|
## Kapı 3: Özel yetenek sınavıyla öğrenci alan programlar
|
||||||
|
|
||||||
|
Konservatuvarlar, spor bilimleri fakülteleri ve güzel sanatlar programlarının önemli bir kısmı **merkezi yerleştirmeye dahil değildir.** Yani bu programlar tercih listene yazılmaz; üniversitelerin kendi düzenlediği özel yetenek sınavlarına ayrı ayrı başvurursun.
|
||||||
|
|
||||||
|
İşleyişi:
|
||||||
|
|
||||||
|
- Genellikle belirli bir **TYT puanı** şartı aranır; bu eşik üniversiteden üniversiteye ve programdan programa değişir.
|
||||||
|
- Başvuru takvimini, sınav içeriğini ve değerlendirme formülünü **her üniversite kendi ilan eder.** Aynı hafta içinde birkaç okulun sınavına girmek mümkündür ama takvimler çakışabilir.
|
||||||
|
- Yerleştirme, üniversitenin kendi hesapladığı yerleştirme puanına göre yapılır; bu puanda TYT puanı, özel yetenek sınavı sonucu ve bazen orta öğretim başarı puanı birlikte kullanılır.
|
||||||
|
|
||||||
|
Pratik sonuç: özel yetenek hedefliyorsan **iki paralel süreç** yürütürsün — bir yandan merkezi tercih listeni hazırlarsın, bir yandan özel yetenek sınavı başvurularını takip edersin. Bu ikisi birbirini engellemez.
|
||||||
|
|
||||||
|
## Listeye nasıl yansıtılır?
|
||||||
|
|
||||||
|
- Koşulunu **belgeyle doğruladığın** özel koşullu programları normal satır gibi, istek sırana göre diz.
|
||||||
|
- Koşulundan emin olmadığın bir programı listeye yazmadan önce doğrula: sağlık raporu gerektiren bir programda "büyük ihtimalle uygun çıkarım" varsayımıyla ilerlemek risklidir.
|
||||||
|
- Koşulunu sağlamadığın programı hiç yazma. Bu satır, [ölü tercihten](/rehber/olu-tercih-nedir) daha kötüdür: ölü tercih sadece yer kaplar, koşulu sağlanmayan tercih ise yerleşirsen yılını götürür.
|
||||||
|
- Özel yetenek programlarını merkezi listene yazmaya çalışma; ayrı süreçtir.
|
||||||
|
|
||||||
|
Kılavuz koşullarını okuduktan sonra sıralamana hangi programların gerçekten açık olduğunu görmek için [tercih robotuna](/tercih-robotu) sıralamanı gir; listeyi kurarken [tercih listesi nasıl yapılır](/rehber/tercih-listesi-nasil-yapilir) yazısındaki hayal–dengeli–garanti dağılımını temel al.
|
||||||
58
content/rehber/siralama-sartlari-2026.md
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
---
|
||||||
|
baslik: Baraj ve Başarı Sıralaması Şartları 2026 (Tıp, Hukuk, Mühendislik, Öğretmenlik...)
|
||||||
|
aciklama: Bazı bölümleri istemek yetmez — YÖK'ün başarı sıralaması şartı ile taban farkı tek şemada; hangi bölümde hangi eşik var, tabloda.
|
||||||
|
tarih: 2026-07-18
|
||||||
|
---
|
||||||
|
|
||||||
|
Bazı bölümler için puanın ve sıralaman "yetiyor" görünse bile, YÖK'ün belirlediği **başarı sıralaması şartını** sağlamıyorsan o bölümü tercih bile edemezsin. Bu şart taban sıralamasından farklıdır: taban, yerleşen son kişinin sıralamasıdır ve her yıl piyasada oluşur; **sıralama şartı** ise merkezî bir üst eşiktir — geçemeyen listeye yazamaz.
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
%% aria: Sıralama şartı ile taban ayrımı şeması: önce hedef bölümün YÖK başarı sıralaması şartını geçip geçmediğine bakarsın. Şartı geçemiyorsan o bölümü listeye hiç yazamazsın ve alternatif rotaya yönelirsin. Şartı geçiyorsan bu yalnızca kapıyı açar; yerleşmek için hâlâ o programın o yılki taban sıralamasına bakman gerekir. Şartı geçmek yerleşmeyi garanti etmez.
|
||||||
|
%% altyazi: Şart kapıyı açar veya kapatır; taban ise kapıdan girip giremeyeceğini söyler.
|
||||||
|
flowchart TD
|
||||||
|
H("Hedef bölümün<br/>sıralama şartı var mı?") --> S{"Şartı geçiyor musun?"}
|
||||||
|
S -- "hayır" --> K("Listeye yazamazsın:<br/>alternatif rotaya yönel")
|
||||||
|
S -- "evet" --> A("Kapı açık — ama bu yerleşmek değil")
|
||||||
|
A --> T("Gözünü tabana çevir:<br/>kendi sıralamanın düştüğü bandı bul")
|
||||||
|
T --> L("Gerçekçi satırları<br/>hayal / dengeli / garanti diz")
|
||||||
|
|
||||||
|
classDef hayal fill:#fee2e2,stroke:#ef4444,color:#991b1b
|
||||||
|
classDef uyari fill:#fef3c7,stroke:#f59e0b,color:#92400e
|
||||||
|
classDef garanti fill:#d1fae5,stroke:#10b981,color:#065f46
|
||||||
|
class K hayal
|
||||||
|
class A,T uyari
|
||||||
|
class L garanti
|
||||||
|
```
|
||||||
|
|
||||||
|
## 2026'da sıralama şartı olan başlıca bölümler
|
||||||
|
|
||||||
|
| Bölüm | Puan türü | Sıralama şartı |
|
||||||
|
| --- | --- | --- |
|
||||||
|
| [Tıp](/bolum/tip) | SAY | İlk 50 bin |
|
||||||
|
| [Hukuk](/bolum/hukuk) | EA | İlk 100 bin |
|
||||||
|
| [Diş Hekimliği](/bolum/dis-hekimligi) | SAY | İlk 80 bin |
|
||||||
|
| [Eczacılık](/bolum/eczacilik) | SAY | İlk 100 bin |
|
||||||
|
| Mühendislik programları (ör. [Bilgisayar Mühendisliği](/bolum/bilgisayar-muhendisligi)) | SAY | İlk 300 bin |
|
||||||
|
| [Mimarlık](/bolum/mimarlik) | SAY | İlk 250 bin |
|
||||||
|
| Öğretmenlik programları (ör. [İlköğretim Matematik Öğretmenliği](/bolum/ilkogretim-matematik-ogretmenligi)) | İlgili tür | İlk 300 bin |
|
||||||
|
|
||||||
|
Şartlar kılavuzla kesinleşir; tercih vermeden önce mutlaka ÖSYM kılavuzunun güncel maddesinden doğrula. (Eşikler son yıllarda sabit seyrediyor ama nihai söz her yıl kılavuzundur.)
|
||||||
|
|
||||||
|
## Sıralama şartı ile taban sıralaması karışmasın
|
||||||
|
|
||||||
|
İki örnekle netleşir:
|
||||||
|
|
||||||
|
- Sıralaman SAY 45 bin olsun. Tıp için şartı (ilk 50 bin) **geçiyorsun** — tercih edebilirsin. Ama köklü devlet tıp fakültelerinin tabanı ilk 5-15 bin bandında kapanır; senin gerçekçi tıp evrenin tabanı 45 bine yakın olan fakültelerdir. Şartı geçmek yerleşmeyi garanti etmez.
|
||||||
|
- Sıralaman EA 130 bin olsun. Hukuk şartı ilk 100 bin olduğundan hukuk programlarını **hiç tercih edemezsin** — tabanı 130 binden geniş bir hukuk fakültesi olsa bile. Bu durumda enerjini şartı olmayan komşu bölümlere ([Kamu Yönetimi](/bolum/kamu-yonetimi), [Sosyal Hizmet](/bolum/sosyal-hizmet) vb.) yönlendirmek daha akıllıca.
|
||||||
|
|
||||||
|
## Baraj puanları
|
||||||
|
|
||||||
|
Sıralama şartından ayrı olarak tercih yapabilmek için puan türünde **baraj puanını** aşmış olman gerekir (TYT ve ilgili yerleştirme puanı barajları). Sonuç belgende puanın hesaplandıysa bu barajı geçmişsin demektir; ayrıca dert etme.
|
||||||
|
|
||||||
|
## Ne yapmalı?
|
||||||
|
|
||||||
|
1. Hedef bölümünün şartı var mı, kılavuzdan işaretle.
|
||||||
|
2. Şartı geçiyorsan gözünü tabana çevir: bölüm sayfasındaki tabloda ([örnek: Tıp](/bolum/tip)) kendi sıralamanın düştüğü bandı bul.
|
||||||
|
3. Şartı geçemiyorsan o bölümü listeden çıkar ve alternatif rotayı kur — [tercih robotu](/tercih-robotu) sıralamana uygun programları zaten şartlara göre süzülmüş tablolar üzerinden gösterir.
|
||||||
|
|
||||||
|
Sıralama şartı acımasız görünür ama işlevi nettir: hem kontenjan enflasyonunu hem de "nasılsa yazayım" kalabalığını engeller. Senin işin, şartı geçtiğin bölümlerde tabanı doğru okumak.
|
||||||
48
content/rehber/taban-puan-mi-siralama-mi.md
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
---
|
||||||
|
baslik: Taban Puan mı, Başarı Sıralaması mı? Tercihte Hangisine Bakılır?
|
||||||
|
aciklama: İki sayı da sonuç belgende yazıyor ama tercih listeni sadece biriyle kurmalısın. Neden sıralamanın kazandığı tek şemada.
|
||||||
|
tarih: 2026-07-21
|
||||||
|
---
|
||||||
|
|
||||||
|
Kısa cevap: **başarı sıralamasına bakılır.** Taban puan, tabelada büyük yazan ama seni yanıltan sayıdır. Nedenini iki dakikada anlatalım.
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
%% aria: Puan ile sıralama karşılaştırma şeması: aynı puan yıldan yıla farklı sıralamalara denk gelebilir çünkü sınav zorluğu puanı şişirir veya söndürür — bu yüzden puana bakarak liste kurmak yanıltır. Başarı sıralaması seni o yılın adaylarıyla kıyaslar ve yıllar arasında karşılaştırılabilir kalır; tercih listesi her zaman kendi puan türünün sıralamasıyla kurulur.
|
||||||
|
%% altyazi: Puan her yıl kayar; sıralama aynı cetvelde kalır. Listeyi sıralama kolonuna göre kur.
|
||||||
|
flowchart TD
|
||||||
|
P("Sonuç belgende iki sayı var:<br/>puan ve başarı sıralaması") --> S{"Hangisiyle<br/>liste kuracaksın?"}
|
||||||
|
S -- "puana bakarsan" --> Y("Yanıltır:<br/>450 puan bir yıl 30 bin,<br/>ertesi yıl 60 bin olabilir")
|
||||||
|
S -- "sıralamaya bakarsan" --> G("Güvenilir:<br/>seni o yılın herkesıyla kıyaslar,<br/>yıllar arası karşılaştırılır")
|
||||||
|
G --> L("Listeni kendi puan türünün<br/>sıralamasıyla kur")
|
||||||
|
|
||||||
|
classDef hayal fill:#fee2e2,stroke:#ef4444,color:#991b1b
|
||||||
|
classDef garanti fill:#d1fae5,stroke:#10b981,color:#065f46
|
||||||
|
class Y hayal
|
||||||
|
class G,L garanti
|
||||||
|
```
|
||||||
|
|
||||||
|
## Puan neden yanıltır?
|
||||||
|
|
||||||
|
YKS puanı, sınavın o yılki zorluğuna ve aday kitlesinin performansına göre şekillenir. Sınav kolay geçtiyse herkesin puanı şişer; zor geçtiyse söner. 450 puan bir yıl ilk 30 bine, ertesi yıl ilk 60 bine denk gelebilir. Yani "geçen yıl bu bölüm 450 ile kapatmış, benim puanım 455, güvendeyim" cümlesi hatalıdır — iki farklı yılın puanları aynı cetvelle ölçülmez.
|
||||||
|
|
||||||
|
## Sıralama neden güvenilir?
|
||||||
|
|
||||||
|
Başarı sıralaması, seni o yıl sınava giren herkesle kıyaslar: "SAY'da 85.000'incisin" bilgisi yıldan yıla **karşılaştırılabilir** kalır. Bir programın geçen yılki taban *sıralaması* 90 bin ise, bu yıl 85 bininci aday için o program "dengeli" bölgededir — sınav kolay muydu zor muydu fark etmez, çünkü herkes aynı gemide.
|
||||||
|
|
||||||
|
ÖSYM sonuç belgende her puan türü için ayrı sıralama yazar. Tercih listeni hangi türden kuruyorsan **o türün sıralamasını** kullan; SAY sıralamanla EA listesi kurmak elma-armut kıyasıdır.
|
||||||
|
|
||||||
|
## Peki taban puan ne işe yarar?
|
||||||
|
|
||||||
|
- Aynı yıl içinde iki programı kabaca kıyaslamaya,
|
||||||
|
- Ek yerleştirmede başvuru eşiği olarak (ek tercihte ilk yerleştirme taban puanı şart koşulur — detay [ek yerleştirme rehberinde](/rehber/ek-yerlestirme-2026)),
|
||||||
|
- Bir de haber sitelerine manşet olmaya.
|
||||||
|
|
||||||
|
Liste kurarken açtığın her tabloda gözün **sıralama kolonunda** olmalı. Örneğin [Bilgisayar Mühendisliği taban puanları](/bolum/bilgisayar-muhendisligi) sayfasında programlar taban sıralamasına göre dizilir; puan kolonu yalnızca bağlam içindir. Aynısı [Hukuk](/bolum/hukuk) ve tüm diğer bölüm sayfaları için geçerli.
|
||||||
|
|
||||||
|
## Uygulamada üç kural
|
||||||
|
|
||||||
|
1. **Listeyi sıralamayla kur.** Her satırın son 3-4 yıllık taban sıralaması trendine bak; tek yıl yanıltır ([neden yanılttığını burada gösterdik](/rehber/taban-siralamalar-nasil-degisir)).
|
||||||
|
2. **Puan haberlerine kapılma.** "X bölümü 500 puanla öğrenci aldı" manşeti sana hiçbir şey söylemez; o yılın 500 puanı kaçıncı sıraysa bilgi odur.
|
||||||
|
3. **Sıralamanı doğru yerden oku.** ÖSYM sonuç belgesindeki, kendi puan türünün "başarı sırası" satırı. OBP eklenmiş/eklenmemiş karışıklığına dikkat — tercihte kullanılan, yerleştirme puanına ait sıralamadır.
|
||||||
|
|
||||||
|
Sıralamanı biliyorsan gerisi mekanik: [tercih robotuna](/tercih-robotu) gir, sıralamana uygun programları hayal/dengeli/garanti dilimleriyle gör, listeni veriyle kur.
|
||||||
57
content/rehber/taban-siralamalar-nasil-degisir.md
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
---
|
||||||
|
baslik: Taban Sıralamalar Yıldan Yıla Ne Kadar Değişir?
|
||||||
|
aciklama: "Geçen yıl 90 bin kapatmış, ben 85 binim, garanti" demeden önce oku — tabanları oynatan mekanizmalar ve trend okuma yolu tek şemada.
|
||||||
|
tarih: 2026-07-16
|
||||||
|
---
|
||||||
|
|
||||||
|
Tercih listeni geçen yılın tabanlarıyla kuruyorsun ama yerleşmeni **bu yılın** tabanları belirleyecek. Aradaki fark bazen birkaç bin, bazen yüz binlerce sıra. Bu yazı tabanları neyin oynattığını ve trendi nasıl okuyacağını anlatıyor.
|
||||||
|
|
||||||
|
## Tabanı oynatan mekanizmalar
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
%% aria: Taban trendi okuma şeması: tek yılın tabanı fotoğraftır, dört yılın tabanı filmdir. Dört yıl üst üste dar banttaysa istikrarlı referanstır. Her yıl sıkılaşıyorsa geçen yılın tabanına güvenme ve pay bırak. Bir sıkı bir gevşek testere dişi sürü etkisidir, ortalamayı al. Bazı yıllar veri boşsa belirsizlik yüksektir; o programı dengeli değil hayal bölgesine koy.
|
||||||
|
%% altyazi: Tek yıla bakan, testere dişinin tepesinden ya da dibinden ölçüm alır — en az 3-4 yıla bak.
|
||||||
|
flowchart TD
|
||||||
|
F("Tek yılın tabanı = fotoğraf<br/>dört yılın tabanı = film") --> T{"Film ne diyor?"}
|
||||||
|
T -- "dört yıl dar bantta" --> I("İstikrarlı:<br/>güvenilir referans")
|
||||||
|
T -- "her yıl sıkılaşıyor" --> S("Tek yönlü trend:<br/>pay bırak, geçen yıla güvenme")
|
||||||
|
T -- "bir sıkı bir gevşek" --> TE("Testere dişi:<br/>ortalamayı al, uca değil")
|
||||||
|
T -- "bazı yıllar veri yok" --> B("Belirsiz:<br/>dengeli değil, hayal bölgesine koy")
|
||||||
|
|
||||||
|
classDef garanti fill:#d1fae5,stroke:#10b981,color:#065f46
|
||||||
|
classDef uyari fill:#fef3c7,stroke:#f59e0b,color:#92400e
|
||||||
|
classDef hayal fill:#fee2e2,stroke:#ef4444,color:#991b1b
|
||||||
|
class I garanti
|
||||||
|
class S,TE uyari
|
||||||
|
class B hayal
|
||||||
|
```
|
||||||
|
|
||||||
|
**1) Kontenjan değişimi.** En mekanik etki: bir program kontenjanını 60'tan 90'a çıkarırsa taban gevşer; 90'dan 60'a inerse sıkılaşır. Bölüm sayfalarındaki kontenjan kolonunu yıllar arasında kıyaslamak bu yüzden önemli.
|
||||||
|
|
||||||
|
**2) Aday davranışı (sürü etkisi).** "Geçen yıl çok kapattı" diye herkes bir programdan kaçarsa taban gevşer; "gevşedi" diye ertesi yıl herkes geri dönerse tekrar sıkılaşır. Tabanlar bu yüzden testere dişi gibi salınabilir — tek yıla bakan, testere dişinin tepesinden ya da dibinden ölçüm alır.
|
||||||
|
|
||||||
|
**3) Yeni açılan programlar.** Bir şehirde yeni fakülte açılınca hem kendi tabanı belirsiz olur hem çevresindeki programların tabanını seyreltir.
|
||||||
|
|
||||||
|
**4) Şartlar ve politika değişiklikleri.** Başarı sıralaması şartının gelmesi/eşiğin değişmesi, burs oranlarının değişmesi, öğretim dilinin değişmesi tabanı sıçratır. ([Şartların güncel listesi burada.](/rehber/siralama-sartlari-2026))
|
||||||
|
|
||||||
|
**5) Ekonomi ve istihdam algısı.** Mezun istihdamına dair haber akışı bile birkaç yıl içinde bir bölümün talebini görünür şekilde değiştirir — son yıllarda kimi mühendisliklerde ve sağlık programlarında bunun örnekleri yaşandı.
|
||||||
|
|
||||||
|
## Trend nasıl okunur?
|
||||||
|
|
||||||
|
Tek yılın tabanı **fotoğraf**, dört yılın tabanı **film**dir. Film izle:
|
||||||
|
|
||||||
|
- **İstikrarlı taban** (dört yıl üst üste dar bantta): güvenilir referans. Sıralaman tabana yakınsa "dengeli", belirgin gerisindeyse "garanti" davranabilirsin.
|
||||||
|
- **Tek yönlü trend** (her yıl sıkılaşıyor): geçen yılın tabanına güvenme; bu yıl daha da sıkılaşacağını varsayıp payla yaklaş. Popüler bölümlerde sık görülür — [Psikoloji](/bolum/psikoloji) ve [Bilgisayar Mühendisliği](/bolum/bilgisayar-muhendisligi) tablolarında 2024-2025 kolonlarını yan yana koyup bak.
|
||||||
|
- **Testere dişi** (bir sıkı bir gevşek): sürü etkisi işliyor demektir; ortalamayı referans al, uç yıla değil.
|
||||||
|
- **Veri boşluğu** (bazı yıllar "—"): yeni ya da o yıl dolmamış program; belirsizlik yüksek, listende dengeli değil garanti bölgesine koyma, hayal bölgesine koy.
|
||||||
|
|
||||||
|
Bölüm sayfalarımızdaki tablolarda 2025 sıralamasının yanında 2024 kolonu ve değişim yönü işareti (▲/▼) tam bu iş için var.
|
||||||
|
|
||||||
|
## Listeye nasıl yansıtılır?
|
||||||
|
|
||||||
|
1. Her satır için son 4 yılın tabanına bak; tek yıl asla yeterli değil.
|
||||||
|
2. Sıkılaşma trendindeki programları bir kademe yukarı say ("dengeli" sandığın aslında "hayal" olabilir).
|
||||||
|
3. Gevşeme trendindeki programlara erken sevinme; sürü geri dönebilir.
|
||||||
|
4. Belirsizliği [dengeli bir listeyle](/rehber/tercih-listesi-nasil-yapilir) yönet: trend ne yaparsa yapsın, hayal/dengeli/garanti dağılımı düzgün kurulmuş bir liste boşta bırakmaz.
|
||||||
|
|
||||||
|
[Tercih robotu](/tercih-robotu) bu analizi senin yerine yapar: sıralamanı girdiğinde programları yalnızca son tabana göre değil, çok yıllı veriyle dilimleyerek gösterir.
|
||||||
57
content/rehber/tercih-listesi-nasil-yapilir.md
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
---
|
||||||
|
baslik: YKS Tercih Listesi Nasıl Yapılır? (2026 Rehberi)
|
||||||
|
aciklama: 24 tercihlik listeyi dilim dilim kurmanın adım adım yöntemi — hayal, dengeli ve garanti bölgeleri tek şemada.
|
||||||
|
tarih: 2026-07-25
|
||||||
|
---
|
||||||
|
|
||||||
|
Tercih listesi kurmanın tek doğru yolu yok; ama boşta bırakan yanlış yolları belli. Bu rehber, ÖSYM'nin tanıdığı 24 tercih hakkını **hayal / dengeli / garanti** mantığıyla nasıl dağıtacağını anlatıyor.
|
||||||
|
|
||||||
|
## Önce ölçüyü düzelt: puan değil, sıralama
|
||||||
|
|
||||||
|
Tercihin tek sağlam ölçüsü **başarı sıralamandır**. Puanlar her yıl sınavın zorluğuna göre kayar; aynı puan bir yıl 80 bininci, ertesi yıl 120 bininci sıraya denk gelebilir. ÖSYM sonuç belgende her puan türü için ayrı sıralaman yazar — listeyi o satıra göre kur. Bu konunun detayı için [Taban puan mı, başarı sıralaması mı?](/rehber/taban-puan-mi-siralama-mi) yazısına bak.
|
||||||
|
|
||||||
|
## Listenin üç bölgesi
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
%% aria: Tercih listesi dilim şeması: 24 satırlık liste yukarıdan aşağı üç bölgeye ayrılır. İlk 4-8 satır hayal tercihleri — tabanı senden daha iyi kapatan ama çok istediğin programlar; tutmazsa alttakilere zarar vermez. Orta 8-12 satır dengeli tercihler — sıralamana yakın programlar, yerleşme ihtimalinin en yüksek olduğu bölge. Son 4-6 satır garanti tercihler — tabanı belirgin geniş programlar; buraya yalnızca gerçekten kayıt yaptıracağın programları yazarsın.
|
||||||
|
%% altyazi: Üstte hayal (kırmızı), ortada dengeli (sarı), altta garanti (yeşil) — her satır istek sırana göre dizilir, yerleşme ihtimaline göre değil.
|
||||||
|
flowchart TD
|
||||||
|
L("24 tercihlik listen<br/>yukarıdan aşağı okunur") --> H("Hayal · ilk 4-8 satır<br/>çok istediğin, tabanı daha sıkı programlar")
|
||||||
|
H --> D("Dengeli · orta 8-12 satır<br/>sıralamana yakın programlar")
|
||||||
|
D --> G("Garanti · son 4-6 satır<br/>gerçekten razı olacağın programlar")
|
||||||
|
H -. "tutmazsa sıradakine geçer<br/>alttakilere zarar vermez" .-> D
|
||||||
|
G --> K{"Kayıt yaptırır mısın?"}
|
||||||
|
K -- "evet, severek giderim" --> OK("Listeye yaz")
|
||||||
|
K -- "hayır" --> YAZMA("Yazma:<br/>yerleşirsen ek hakkın yanar")
|
||||||
|
|
||||||
|
classDef hayal fill:#fee2e2,stroke:#ef4444,color:#991b1b
|
||||||
|
classDef uyari fill:#fef3c7,stroke:#f59e0b,color:#92400e
|
||||||
|
classDef garanti fill:#d1fae5,stroke:#10b981,color:#065f46
|
||||||
|
class H hayal
|
||||||
|
class D uyari
|
||||||
|
class G,OK garanti
|
||||||
|
class YAZMA hayal
|
||||||
|
```
|
||||||
|
|
||||||
|
**1) Hayal tercihleri (ilk 4-8 sıra).** Taban sıralaması seninkinden *daha iyi* kapatan ama çok istediğin programlar. "Sıralamam yetmez, boşa gider" korkusu yersizdir: bir programı üst sıraya yazmak, alttaki tercihlere yerleşme ihtimalini **azaltmaz**. ÖSYM sistemi yukarıdan aşağı bakar; hayal tutmazsa sıradakine geçer. Tabanlar her yıl oynar — geçen yıl 5 bin kapatmış bir bölüm bu yıl 8 bine gevşeyebilir.
|
||||||
|
|
||||||
|
**2) Dengeli tercihler (orta blok, 8-12 sıra).** Taban sıralaması senin sıralamana yakın programlar. Listenin kalbi burasıdır; yerleşme ihtimalinin en yüksek olduğu bölge. Aynı bölümün farklı şehirlerdeki/üniversitelerdeki versiyonlarını sıralama sırasıyla diz.
|
||||||
|
|
||||||
|
**3) Garanti tercihleri (son 4-6 sıra).** Taban sıralaması seninkinden belirgin şekilde geniş programlar. Buradaki altın kural: **yerleşsen kayıt yaptırmayacağın hiçbir programı yazma.** Garanti dilimi "razı olacağın en makul seçenek" demektir, "ne olursa olsun bir yere gireyim" demek değil. Kayıt yaptırmayacağın bir yere yerleşirsen hem bir yılın gider hem de ek yerleştirmeye başvuramazsın.
|
||||||
|
|
||||||
|
## Sık yapılan hatalar
|
||||||
|
|
||||||
|
- **Tek yıla bakmak.** 2025 tabanı tek başına yanıltır; en az son 3-4 yılın trendine bak. Tabanların yıldan yıla nasıl oynadığını [Taban sıralamalar yıldan yıla ne kadar değişir?](/rehber/taban-siralamalar-nasil-degisir) yazısında verilerle gösterdik.
|
||||||
|
- **24'ü doldurmak için doldurmak.** Okumayacağın bölümü listeye eklemek hata; 16 gerçekçi tercih, 24 gelişigüzel tercihten iyidir.
|
||||||
|
- **"Ölü tercih" yazmak.** Tabanı senin sıralamandan çok daha iyi olan bir programı listenin *sonlarına* yazmak o satırı çöpe atar — üstteki tercihlerinden birine yerleşmişsen oraya sıra zaten gelmez. Detay: [Ölü tercih nedir?](/rehber/olu-tercih-nedir)
|
||||||
|
- **Sadece bölüme ya da sadece şehre kilitlenmek.** "Ne olursa olsun [Tıp](/bolum/tip)" diyorsan 24 tercihi de tıp yazabilirsin; ama "mühendislik olsun da hangisi olursa olsun" diyorsan [Bilgisayar Mühendisliği](/bolum/bilgisayar-muhendisligi), [Elektrik-Elektronik Mühendisliği](/bolum/elektrik-elektronik-muhendisligi) gibi yakın bölümleri karışık ve sıralama sırasıyla dizmek daha akıllıca.
|
||||||
|
|
||||||
|
## Pratik akış
|
||||||
|
|
||||||
|
1. Sıralamanı ve puan türünü not et.
|
||||||
|
2. Sıralamana uygun program evrenini çıkar — [tercih robotuna](/tercih-robotu) sıralamanı girerek hayal/dengeli/garanti dilimlerini saniyede görebilirsin.
|
||||||
|
3. İstemediklerini ele, kalanları *istek sırana* göre diz (yerleşme ihtimaline göre değil).
|
||||||
|
4. Son kontrol: listenin başı hayal mi, ortası dengeli mi, sonu gerçekten garanti mi? Sonunda kayıt yaptırmayacağın program var mı?
|
||||||
|
5. ÖSYM AİS'e girerken listeyi bir kez daha kod kod doğrula.
|
||||||
|
|
||||||
|
Listeyi kurarken her satırın "neden burada" sorusuna cevabı olmalı. Cevabı yoksa o satır ya yanlış yerde ya da listede fazla.
|
||||||
@@ -0,0 +1,62 @@
|
|||||||
|
---
|
||||||
|
baslik: Tercih Robotu Nedir? YÖK Atlas Tercih Sihirbazı Nasıl Kullanılır?
|
||||||
|
aciklama: Tercih robotu neyi çözer, neyi çözemez? YÖK Atlas'ı adım adım kullanma rehberi ve robota liste teslim etmeden önce bilmen gereken dört tuzak — tek şemada.
|
||||||
|
tarih: 2026-08-06
|
||||||
|
---
|
||||||
|
|
||||||
|
Tercih döneminin en çok aranan araçlarından biri "tercih robotu". Ama iki farklı şey aynı adla anılıyor: YÖK'ün resmî veri ekranı **YÖK Atlas tercih sihirbazı** ve sıralamanı girince sana program listeleyen **tercih robotları**. Bu yazı ikisinin de ne işe yaradığını, YÖK Atlas'ın adım adım nasıl kullanıldığını ve bir robotun çıktısını hangi süzgeçten geçirmen gerektiğini anlatıyor.
|
||||||
|
|
||||||
|
## Tercih robotu ne yapar?
|
||||||
|
|
||||||
|
Özünde her tercih robotu aynı işi yapar: **başarı sıralamanı** alır, geçmiş yılların taban sıralamalarıyla karşılaştırır ve 23.000'i aşkın programın içinden senin bandına düşenleri süzer. Elle günler süren tarama işini saniyelere indirir. İyi bir robot bunun üstüne üç şey daha katar:
|
||||||
|
|
||||||
|
- Programları tek yılın tabanına göre değil, **çok yıllı trende** göre dilimlemek ([tabanlar yıldan yıla nasıl oynuyor](/rehber/taban-siralamalar-nasil-degisir)),
|
||||||
|
- Sonuçları **hayal / dengeli / garanti** mantığıyla ayırmak ([listenin üç bölgesi](/rehber/tercih-listesi-nasil-yapilir)),
|
||||||
|
- Kılavuzdaki [özel koşulları ve sıralama şartlarını](/rehber/siralama-sartlari-2026) süzgece dahil etmek.
|
||||||
|
|
||||||
|
Robotun yapamayacağı şey ise senin yerine **istemek**: hangi bölümü gerçekten okuyacağını, hangi şehirde dört yıl yaşayabileceğini, bütçenin neye yettiğini robot bilemez. Robot evreni daraltır; sırayı sen kurarsın.
|
||||||
|
|
||||||
|
## YÖK Atlas tercih sihirbazı adım adım
|
||||||
|
|
||||||
|
YÖK Atlas (yokatlas.yok.gov.tr), YÖK'ün resmî yerleştirme verilerini açtığı ücretsiz ekrandır. Kullanımı:
|
||||||
|
|
||||||
|
1. **Düzeyini seç.** 4 yıllık için "Lisans Tercih Sihirbazı", 2 yıllık için "Önlisans Tercih Sihirbazı" ([önlisans mı lisans mı](/rehber/onlisans-mi-lisans-mi)).
|
||||||
|
2. **Puan türünü ve sıralamanı gir.** SAY, EA, SÖZ, DİL ya da TYT — ve puanını değil, **başarı sıralamanı** ([neden sıralama](/rehber/taban-puan-mi-siralama-mi)).
|
||||||
|
3. **Filtrele.** Şehir, devlet/vakıf, öğretim türü, burs oranı gibi filtrelerle evreni daralt.
|
||||||
|
4. **Program sayfalarına in.** Her programın sayfasında kontenjan, taban, yerleşenlerin sıralama aralığı, akademik kadro ve doluluk geçmişi var. Asıl hazine listede değil, bu detay sayfalarındadır.
|
||||||
|
|
||||||
|
## Robot çıktısını okurken dört tuzak
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
%% aria: Tercih robotu kullanım akışı şeması. Doğru akış şöyledir: başarı sıralamanı girersin, filtrelerle aday havuzunu daraltırsın, robot programları hayal, dengeli ve garanti dilimlerine ayırır, sonra son kontrol sana geçer: kılavuz koşullarını, çok yıllı taban trendini ve kendi isteklerini kendin doğrularsın; bu kontrol sarı ile işaretlidir çünkü atlanması en sık hatadır. Akışın dışında dört tuzak kutusu kırmızı ile işaretlidir: puanla arama yapmak, tek yılın tabanına güvenmek, listeyi robotun verdiği sırayla göndermek ve kılavuz koşullarını hiç okumamak. Bu dört hatadan herhangi biri listeyi çürütür. Son kontrolden geçen liste yeşil ile işaretlenmiş sağlam liste kutusuna ulaşır.
|
||||||
|
%% altyazi: Robot evreni daraltır, sırayı sen kurarsın — son kontrol devredilemez.
|
||||||
|
flowchart TD
|
||||||
|
A("Başarı sıralamanı gir<br/>puanı değil") --> B("Filtrele:<br/>şehir, devlet/vakıf,<br/>öğretim dili")
|
||||||
|
B --> C("Robot dilimler:<br/>hayal / dengeli / garanti")
|
||||||
|
C --> D{"Son kontrol sende:<br/>kılavuz koşulları,<br/>çok yıllı trend,<br/>gerçek isteklerin"}
|
||||||
|
D -- "kontrolü yaptın" --> E("Sağlam liste:<br/>her satırın gerekçesi var")
|
||||||
|
D -- "atladın" --> F("Tuzaklar devrede")
|
||||||
|
T1("Puanla arama") -.-> F
|
||||||
|
T2("Tek yılın tabanına<br/>güvenmek") -.-> F
|
||||||
|
T3("Robotun sırasını<br/>aynen göndermek") -.-> F
|
||||||
|
T4("Kılavuz koşullarını<br/>okumamak") -.-> F
|
||||||
|
|
||||||
|
classDef uyari fill:#fef3c7,stroke:#f59e0b,color:#92400e
|
||||||
|
classDef garanti fill:#d1fae5,stroke:#10b981,color:#065f46
|
||||||
|
classDef hayal fill:#fee2e2,stroke:#ef4444,color:#991b1b
|
||||||
|
class D uyari
|
||||||
|
class E garanti
|
||||||
|
class F,T1,T2,T3,T4 hayal
|
||||||
|
```
|
||||||
|
|
||||||
|
**1) Puanla arama yapmak.** Puanlar sınavın zorluğuyla her yıl kayar; aynı puan bir yıl 80 bininci, ertesi yıl 120 bininci sıraya denk gelir. Robota da YÖK Atlas'a da **sıralamanı** ver.
|
||||||
|
|
||||||
|
**2) Tek yılın tabanına güvenmek.** Geçen yılın tabanı tek başına bir fotoğraftır, film değil. Kontenjanı artan program gevşer, kapanan varyantın talebi komşusuna taşar. En az son 3-4 yılın trendine bakmayan çıktı eksiktir.
|
||||||
|
|
||||||
|
**3) Robotun sırasını aynen göndermek.** Robotlar genelde yerleşme ihtimaline göre sıralar; oysa merkezi yerleştirmede liste **istek sırana** göre dizilir ([sistem nasıl çalışır](/rehber/merkezi-yerlestirme-nasil-calisir)). İhtimal sırasıyla gönderilen liste, üst sıralara [ölü tercih](/rehber/olu-tercih-nedir) gömer.
|
||||||
|
|
||||||
|
**4) Kılavuz koşullarını okumamak.** Yaş şartı, cinsiyet şartı, sağlık raporu, zorunlu hizmet gibi [özel koşullar](/rehber/ozel-kosullu-programlar) robota her zaman tam yansımaz. Yazacağın her satırın kılavuz koşul maddelerini bir kez kendin oku.
|
||||||
|
|
||||||
|
## YÖK Atlas mı, tercih robotu mu?
|
||||||
|
|
||||||
|
İkisi rakip değil, ardışık: robot tarama işini saniyeye indirir, YÖK Atlas tek programın derinine iner. Verimli akış şöyle: [tercih robotuna](/tercih-robotu) sıralamanı gir, hayal/dengeli/garanti dilimlerine ayrılmış aday havuzunu çıkar; sonra listende ciddi yer verdiğin programların YÖK Atlas sayfalarını açıp kadro, doluluk geçmişi ve koşulları tek tek doğrula. Robotla dakikada evreni gör, Atlas'la satır satır emin ol — liste ikisinin kesişiminden çıkar.
|
||||||
63
content/rehber/tercih-sonuclari-ne-zaman-2026.md
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
---
|
||||||
|
baslik: 2026 YKS Tercih Sonuçları Ne Zaman Açıklanacak? (Sonuç Ekranı Rehberi)
|
||||||
|
aciklama: Yerleştirme sonuçları için beklenen tarih aralığı, sonucun nereden sorgulanacağı ve ekranı gördüğün anda yapman gerekenler — iki senaryo tek şemada.
|
||||||
|
tarih: 2026-08-07
|
||||||
|
---
|
||||||
|
|
||||||
|
Tercihler 10 Ağustos 23.59'da kapandı mı, arama motorlarındaki soru değişir: **"Tercih sonuçları ne zaman açıklanacak?"** Bu yazı üç şeyi netleştiriyor: sonuçların beklendiği tarih aralığı, sonucu nereden öğreneceğin ve ekranı gördüğün anda — yerleşmiş ya da yerleşememiş olarak — atman gereken adımlar.
|
||||||
|
|
||||||
|
## Ne zaman açıklanacak?
|
||||||
|
|
||||||
|
ÖSYM, yerleştirme sonuçları için gün ilan etmez; sonuçlar hazır olduğunda duyuruyla erişime açılır. Ama takvimin iki ucu belli olduğu için aralığı daraltmak kolay:
|
||||||
|
|
||||||
|
- Tercihler **10 Ağustos 2026** gecesi kapandı.
|
||||||
|
- Üniversite kayıtları **24-28 Ağustos** tarihlerinde yapılacak (e-kayıt 24-26 Ağustos).
|
||||||
|
|
||||||
|
Kayıt 24 Ağustos'ta başladığına göre sonuçların **ondan önce, Ağustos'un ikinci yarısında** açıklanması gerekiyor. Geçmiş yıllarda da yerleştirme sonuçları tercih bitiminden yaklaşık 1,5-2 hafta sonra geldi. Yani beklenen pencere dar: **15-23 Ağustos arası.** Kesin gün için tek resmî kaynak ÖSYM duyurusudur; takvimin tamamı [2026 tercih takvimi](/rehber/yks-tercih-takvimi-2026) yazısında.
|
||||||
|
|
||||||
|
## Nereden öğreneceksin?
|
||||||
|
|
||||||
|
Sonuç açıklandığında iki resmî kanaldan sorgulayabilirsin:
|
||||||
|
|
||||||
|
- **sonuc.osym.gov.tr** — T.C. kimlik numaran ve aday şifrenle.
|
||||||
|
- **ÖSYM Aday İşlemleri Mobil Uygulaması** — aynı girişle telefonda.
|
||||||
|
|
||||||
|
Şifreni unuttuysan bugünden yenile; sonuç günü şifre sıfırlama ekranları yoğunluktan yavaşlar. Sonuç belgesinde yerleştiğin programın adı, kodu ve yerleştirme puanın yazar; hiçbir tercihine yerleşemediysen bunu da açıkça belirtir.
|
||||||
|
|
||||||
|
## Ekranı gördüğün an: iki senaryo
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
%% aria: Yerleştirme sonucu açıklandıktan sonraki akış şeması. Sonuç ekranında iki ihtimal vardır. Bir programa yerleştiysen önce yerleştiğin satırın hangi tercihin olduğuna bakarsın; ardından kayıt penceresini kaçırmaman gerekir: 24 ile 26 Ağustos arasında e-Devlet üzerinden belgesiz e-kayıt, 24 ile 28 Ağustos arasında üniversitede şahsen kayıt yapılabilir. Kayıt yaptırırsan öğrencilik başlar. Kayıt yaptırmazsan bu yılki hakkın yanar ve yerleştiğin için ek yerleştirmeye de başvuramazsın; bu kutu kırmızı ile işaretlidir. Hiçbir programa yerleşemediysen yol kapanmaz: Eylül'de açılan ek yerleştirme dönemine yalnızca boşta kalanlar başvurabilir ve bu ikinci şans yeşil ile işaretlidir. Ek yerleştirme hazırlığına sonuç gününden itibaren başlamak gerekir.
|
||||||
|
%% altyazi: Yerleşenin tek riski kaydı kaçırmak; yerleşemeyenin tek işi ek yerleştirmeye hazırlanmak.
|
||||||
|
flowchart TD
|
||||||
|
S("Sonuç ekranı açıldı") --> Q{"Bir programa<br/>yerleştin mi?"}
|
||||||
|
Q -- "evet" --> Y("Yerleştiğin satırı oku:<br/>kaçıncı tercihindi,<br/>program kodu ne")
|
||||||
|
Y --> K{"Kayıt penceresi:<br/>e-kayıt 24-26 Ağustos<br/>şahsen 24-28 Ağustos"}
|
||||||
|
K -- "kayıt yaptırdın" --> O("Öğrenciliğin başladı")
|
||||||
|
K -- "kayıt yaptırmadın" --> H("Bu yılki hak yandı:<br/>ek yerleştirmeye de<br/>başvuramazsın")
|
||||||
|
Q -- "hayır" --> E("Ek yerleştirme · Eylül<br/>yalnızca boşta kalanlar<br/>başvurabilir")
|
||||||
|
E --> P("Hazırlığa bugün başla:<br/>sıralamana uygun<br/>alternatif havuzu çıkar")
|
||||||
|
|
||||||
|
classDef uyari fill:#fef3c7,stroke:#f59e0b,color:#92400e
|
||||||
|
classDef garanti fill:#d1fae5,stroke:#10b981,color:#065f46
|
||||||
|
classDef hayal fill:#fee2e2,stroke:#ef4444,color:#991b1b
|
||||||
|
class O,E garanti
|
||||||
|
class K,P uyari
|
||||||
|
class H hayal
|
||||||
|
```
|
||||||
|
|
||||||
|
## Yerleştiysen: tek işin kaydı kaçırmamak
|
||||||
|
|
||||||
|
Tebrikler — ama süreç kayıtla biter, sonuç ekranıyla değil. Üniversitelerin çoğu e-Devlet üzerinden **belgesiz, yolsuz, sırasız e-kayıt** kabul ediyor; penceresi şahsen kayıttan iki gün önce kapanıyor. Hangi belgelerin gerektiği, e-kaydın adım adım nasıl yapıldığı ve "kayıt yaptırmazsam ne olur" sorusunun net cevabı [üniversite kayıt rehberinde](/rehber/universite-kayit-rehberi-2026).
|
||||||
|
|
||||||
|
Kritik uyarı: **yerleştiğin programa kayıt yaptırmazsan ek yerleştirmeye başvuramazsın** ve gelecek yıl OBP katkın yarıya düşer ([OBP nasıl hesaplanır](/rehber/obp-nedir-nasil-hesaplanir)). "Beğenmedim, ek tercihte daha iyisini yazarım" planı bu yüzden çalışmaz — ek yerleştirme kapısı yalnızca **hiçbir programa yerleşememiş** adaylara açıktır.
|
||||||
|
|
||||||
|
## Yerleşemediysen: oyun bitmedi, ikinci yarı Eylül'de
|
||||||
|
|
||||||
|
Hiçbir tercihe yerleşememek yılın sonu değil. Kayıtlar kapandığında binlerce kontenjan boş kalır ve ÖSYM bunlar için **ek yerleştirme** açar — genellikle Eylül içinde, birkaç günlük dar bir pencereyle. Kimlerin başvurabileceği ve ikinci şansı doğru kullanmanın yolu [ek yerleştirme rehberinde](/rehber/ek-yerlestirme-2026); boşta kalmanın tipik sebepleri ve her birinin çıkış yolu ise [Yerleşemedim, ne yapmalıyım?](/rehber/yerlesemedim-ne-yapmaliyim) yazısında.
|
||||||
|
|
||||||
|
Ek yerleştirmede en büyük hata kılavuzu bekleyip son gün panikle liste kurmak. Boş kontenjan kılavuzu yayımlanmadan da hazırlanabilirsin: sıralamana uygun program evrenini şimdiden çıkarır, kılavuz gelince yalnızca kesişimi alırsın.
|
||||||
|
|
||||||
|
## Beklerken yapılacak en akıllıca iş
|
||||||
|
|
||||||
|
Sonuç ekranı açılana kadar elindeki en değerli veri hâlâ **başarı sıralaman**. Hangi senaryoda olursan ol — ek yerleştirme ihtimaline hazırlık ya da sadece "nereye yerleşmiş olabilirim" merakı — [tercih robotuna](/tercih-robotu) sıralamanı girerek sıralamana düşen programları hayal/dengeli/garanti dilimleriyle görebilirsin. Sonuç günü geldiğinde sürpriz değil, doğrulama yaşarsın.
|
||||||
59
content/rehber/universite-kayit-rehberi-2026.md
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
---
|
||||||
|
baslik: Üniversite Kaydı Nasıl Yapılır? 2026 e-Kayıt ve Belge Rehberi
|
||||||
|
aciklama: Yerleştin, tebrikler — şimdi kaydını kaçırma. e-Devlet'ten 5 dakikada e-kayıt, şahsen kayıtta istenen belgeler ve "kayıt yaptırmazsam ne olur" sorusunun net cevabı.
|
||||||
|
tarih: 2026-07-28
|
||||||
|
---
|
||||||
|
|
||||||
|
Yerleştirme sonuçları açıklandıktan sonra en çok aranan soru değişir: "nereye yerleştim"in yerini **"kayıt nasıl yapılır, son gün ne zaman?"** alır. 2026'da kayıtlar **24-28 Ağustos** tarihleri arasında; e-Devlet üzerinden elektronik kayıt ise **24-26 Ağustos** günlerinde yapılabiliyor. Takvimin tamamı için [2026 tercih takvimi](/rehber/yks-tercih-takvimi-2026) yazısına bakabilirsin.
|
||||||
|
|
||||||
|
## Önce e-kayıt dene: belge yok, yol yok, sıra yok
|
||||||
|
|
||||||
|
Üniversitelerin büyük bölümü e-Devlet üzerinden **e-kayıt** kabul ediyor. e-Devlet'e girip *"Üniversite E-Kayıt"* hizmetini açtığında yerleştiğin program listeleniyorsa birkaç onayla kaydın tamamlanır — diploma, fotoğraf, şehirlerarası yolculuk gerekmez. Kayıt belgeni yine e-Devlet'ten barkodlu indirebilirsin.
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
%% aria: Üniversite kayıt akış şeması: bir programa yerleştikten sonra kayıt yaptırmaya karar verirsen önce e-Devlet'te e-kayıt seçeneğini kontrol edersin; açıksa 24-26 Ağustos arasında belgesiz ve sırasız e-kayıt yaparsın, kapalıysa 24-28 Ağustos arasında belgelerinle üniversiteye giderek şahsen kayıt olursun; iki yol da kaydını tamamlar. Kayıt yaptırmazsan bu yılki hakkın yanar, yerleştiğin için ek yerleştirmeye giremezsin ve gelecek yıl OBP katkın yarıya düşer.
|
||||||
|
%% altyazi: e-kayıt penceresi şahsen kayıttan iki gün önce kapanır; önce e-kaydı dene, olmuyorsa belgelerle yola çık.
|
||||||
|
flowchart TD
|
||||||
|
S("Sonuçlar açıklandı:<br/>bir programa yerleştin") --> K{"Kayıt yaptıracak mısın?"}
|
||||||
|
K -- "evet" --> E{"e-Devlet'te e-kayıt<br/>seçeneğin açık mı?"}
|
||||||
|
E -- "evet" --> E1("24-26 Ağustos: e-kayıt<br/>belge yok, sıra yok, 5 dakika")
|
||||||
|
E -- "hayır" --> E2("24-28 Ağustos: üniversitede şahsen kayıt<br/>belgelerini yanına al")
|
||||||
|
E1 --> T("Kaydın tamam,<br/>artık öğrencisin")
|
||||||
|
E2 --> T
|
||||||
|
K -- "hayır" --> R("Bu yılki hakkın yanar:<br/>ek yerleştirmeye giremezsin,<br/>gelecek yıl OBP katkın yarıya düşer")
|
||||||
|
|
||||||
|
classDef garanti fill:#d1fae5,stroke:#10b981,color:#065f46
|
||||||
|
classDef hayal fill:#fee2e2,stroke:#ef4444,color:#991b1b
|
||||||
|
class T garanti
|
||||||
|
class R hayal
|
||||||
|
```
|
||||||
|
|
||||||
|
## Şahsen kayıtta istenen belgeler
|
||||||
|
|
||||||
|
Üniversiteler kendi listesini yayımlar; standart çekirdek şudur:
|
||||||
|
|
||||||
|
- **Lise diploması** (aslı) ya da yeni mezunlar için mezuniyet belgesi
|
||||||
|
- **ÖSYS yerleştirme sonuç belgesi** (internet çıktısı yeterli)
|
||||||
|
- Nüfus cüzdanı / T.C. kimlik kartı ve fotokopisi
|
||||||
|
- Vesikalık fotoğraf (genelde 4-6 adet)
|
||||||
|
- Bazı programlar için ek koşul belgeleri: sağlık raporu, boy-kilo şartı, mülakat sonucu gibi — bunlar kılavuzda programın yanındaki koşul numaralarında yazar
|
||||||
|
|
||||||
|
İkinci öğretim ya da vakıf programına yerleştiysen ilk taksit/öğrenim ücreti dekontu da istenir. Gitmeden önce üniversitenin kayıt sayfasını mutlaka aç; eksik belge, kayıt döneminin en klasik zaman kaybıdır.
|
||||||
|
|
||||||
|
## "Kayıt yaptırmazsam ne olur?"
|
||||||
|
|
||||||
|
Bu sorunun cevabı üç maddedir ve üçü de önemlidir:
|
||||||
|
|
||||||
|
1. **Bu yılki hakkın yanar.** Yerleştiğin programa sonradan "vazgeçtim, geleyim" diyemezsin.
|
||||||
|
2. **Ek yerleştirmeye giremezsin.** Kayıt yaptırmasan bile *yerleştirilmiş* sayılırsın ve [ek yerleştirme](/rehber/ek-yerlestirme-2026) kapısı sana kapanır.
|
||||||
|
3. **Gelecek yıl OBP çarpanın yarıya düşer.** Seneye tekrar sınava girersen diploma notu katkın 0,12 yerine 0,06 ile hesaplanır — [OBP yazısında](/rehber/obp-nedir-nasil-hesaplanir) sayılarla anlattık.
|
||||||
|
|
||||||
|
Bu üç maddenin tek bir tercih dersi var: **kayıt yaptırmayacağın programı listene hiç yazma.** Liste kurarken bu süzgeci nasıl uygulayacağın [tercih listesi rehberinde](/rehber/tercih-listesi-nasil-yapilir).
|
||||||
|
|
||||||
|
## Kayıt sonrası küçük ama önemli işler
|
||||||
|
|
||||||
|
- Ders kaydı / oryantasyon tarihlerini üniversitenin öğrenci işleri sayfasından not al; kayıt olmak çoğu üniversitede ders seçimini otomatik yapmaz.
|
||||||
|
- Yurt başvurusu (KYK) ayrı bir takvimle yürür — kayıt haftasını beklemeden başvuru dönemini takip et.
|
||||||
|
- Öğrenci belgeni e-Devlet'ten alabilirsin; indirim ve burs başvurularının çoğu bunu ister.
|
||||||
|
|
||||||
|
Yerleşmek maratonun bitişi, kayıt ise ipi göğüslemek. Son güne bırakma — e-kayıt penceresi, şahsen kayıttan **iki gün önce** kapanıyor.
|
||||||
60
content/rehber/veliler-icin-tercih-rehberi.md
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
---
|
||||||
|
baslik: Veliler İçin Tercih Rehberi — Nerede Yardım Etmeli, Nerede Geri Durmalı?
|
||||||
|
aciklama: Tercih listesini kim doldurmalı, veli hangi konuda gerçekten faydalı olur? Görev dağılımı ve o meşhur anlaşmazlık — tek şemada.
|
||||||
|
tarih: 2026-08-02
|
||||||
|
---
|
||||||
|
|
||||||
|
Tercih dönemi evde iki farklı endişenin çarpıştığı iki haftadır. Öğrenci "istediğim bölümü okuyamayacağım" diye endişelenir; veli "yanlış karar verip yıllarını kaybedecek" diye. İkisi de haklı bir yerden bakıyor, ama aynı işi yapmaya çalıştıklarında liste bozulur. Bu yazı, **hangi işin kimde olduğunu** ayırıyor.
|
||||||
|
|
||||||
|
## Görev dağılımı
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
%% aria: Veli ve öğrenci görev dağılımı şeması. Tercih sürecindeki işler üçe ayrılır. Öğrencinin kararı: hangi bölümü okumak istediği, listenin sırası ve hayal tercihleri. Velinin gerçek katkısı: bütçe gerçeği, barınma ve yurt araştırması, şehir güvenliği ve ulaşım, ailedeki ve çevredeki meslek sahipleriyle görüşme ayarlamak. Ortak karar: bütçenin tutmadığı satırların listeden çıkarılması ve nihai listenin birlikte gözden geçirilmesi. Veliye düşmeyen iş: listeyi öğrencinin yerine doldurmak veya sıralamayı değiştirmek, çünkü dört yıl okulu okuyacak olan öğrencidir.
|
||||||
|
%% altyazi: Bölüm kararı öğrencinin, bütçe ve barınma gerçeği velinin; liste ikisinin birlikte okuduğu son metin.
|
||||||
|
flowchart TD
|
||||||
|
T("Tercih süreci") --> O("ÖĞRENCİDE:<br/>hangi bölüm,<br/>listenin sırası,<br/>hayal tercihleri")
|
||||||
|
T --> V("VELİDE:<br/>bütçe gerçeği,<br/>yurt ve barınma,<br/>şehir ve ulaşım,<br/>meslek sahibiyle görüşme")
|
||||||
|
T --> Y("VELİYE DÜŞMEYEN:<br/>listeyi doldurmak,<br/>sıralamayı değiştirmek")
|
||||||
|
O --> B{"Bütçe bu satırı<br/>4 yıl taşır mı?"}
|
||||||
|
V --> B
|
||||||
|
B -- "evet" --> L("Satır listede kalır")
|
||||||
|
B -- "hayır" --> C("Birlikte konuşulur,<br/>satır çıkarılır<br/>veya burslu eşdeğeri aranır")
|
||||||
|
Y --> R("Sonuç: öğrenci sahiplenmez,<br/>ilk zorlukta okul bırakılır")
|
||||||
|
|
||||||
|
classDef uyari fill:#fef3c7,stroke:#f59e0b,color:#92400e
|
||||||
|
classDef garanti fill:#d1fae5,stroke:#10b981,color:#065f46
|
||||||
|
classDef hayal fill:#fee2e2,stroke:#ef4444,color:#991b1b
|
||||||
|
class O,V,L garanti
|
||||||
|
class B,C uyari
|
||||||
|
class Y,R hayal
|
||||||
|
```
|
||||||
|
|
||||||
|
## Velinin gerçekten fark yarattığı dört alan
|
||||||
|
|
||||||
|
Bölüm seçiminde ısrar etmek yerine, bu dört başlıkta veli katkısı doğrudan işe yarar:
|
||||||
|
|
||||||
|
1. **Bütçe gerçeğini net söylemek.** "Bakarız, hallederiz" en riskli cümledir. Vakıf üniversitelerinde indirimli programların dört-altı yıllık toplam maliyetini, devlet üniversitelerinde ise şehrin kira ve yaşam giderini **listeyi vermeden önce** açıkça konuşun. Yerleştikten sonra ortaya çıkan "ödeyemeyiz" durumu bir yıl kaybettirir. [Devlet mi vakıf mı](/rehber/devlet-mi-vakif-mi) yazısı burs varyantlarının nasıl okunacağını anlatıyor.
|
||||||
|
2. **Barınmayı önceden araştırmak.** Yurt kapasitesi, öğrenci evi kiraları ve kampüsün şehir merkezine uzaklığı velinin rahat araştırabileceği, öğrencinin ise tercih telaşında atladığı konulardır. [Yurt, burs ve yıllık maliyet](/rehber/yurt-burs-ve-yillik-maliyet) yazısındaki kalemleri şehir şehir doldurmak iyi bir veli işidir.
|
||||||
|
3. **Doğru insanla konuşturmak.** "Bence doktor ol" demek yerine, çevrenizdeki bir hekimle, mühendisle, öğretmenle yarım saatlik bir görüşme ayarlamak on kat etkilidir. Öğrenci mesleği sizden değil, o mesleği yapan birinden duysun.
|
||||||
|
4. **Süreci takip etmek.** Tercih işlemi tarihleri, kayıt belgeleri, e-Devlet adımları — bunlar sıkıcı ama kritik. [Tercih takvimi](/rehber/yks-tercih-takvimi-2026) ve [kayıt rehberi](/rehber/universite-kayit-rehberi-2026) yazılarındaki tarihleri takvime işlemek tam bir veli görevidir.
|
||||||
|
|
||||||
|
## Listeyi neden öğrenci doldurmalı?
|
||||||
|
|
||||||
|
Çünkü dört yıl o sıraları okuyacak olan o. Bunun ötesinde pratik bir sebep de var: **ÖSYM seni yerleşebildiğin en üst tercihe koyar.** Yani listenin sırası bir istek beyanıdır, taktik değil. Öğrenci gerçekten istediği sırayı yazmazsa, sistem ona istemediği bir yeri verir ve bu tamamen kendi listesinden kaynaklanır. [Merkezi yerleştirme nasıl çalışır](/rehber/merkezi-yerlestirme-nasil-calisir) yazısı bu mantığı adım adım gösteriyor.
|
||||||
|
|
||||||
|
Velinin listeyi "düzeltmesi" genelde şuraya varır: üst sıralara ailenin prestijli bulduğu bölümler girer, öğrencinin gerçek isteği aşağı iner. Sıralama tutarsa öğrenci sahiplenmediği bir bölümde başlar; ilk dönem sonunda devamsızlık, sonraki yıl ise ya yeniden sınav ya da okulu bırakma gelir. Kazanılan bir şey yoktur.
|
||||||
|
|
||||||
|
## Anlaşmazlık çıktığında: üç adımlı yol
|
||||||
|
|
||||||
|
Öğrenci bir bölümü çok istiyor, siz riskli buluyorsunuz. Tartışmak yerine:
|
||||||
|
|
||||||
|
- **Adım 1 — İddiaları yazıya dökün.** "Bu bölüm iş bulamaz" ya da "bu bölüm harika" cümlelerinin ikisi de kanıtsız. İkiniz de iddianızı somut bir kaynağa dayandırın: ders katalogu, akreditasyon, mezunların gittiği yerler. [Bir bölümün iş imkânını nasıl araştırırsın](/rehber/bolumun-is-imkanini-nasil-arastirirsin) yazısı bunun yöntemini veriyor.
|
||||||
|
- **Adım 2 — Listede ikisine de yer açın.** 24 satırlık liste tam da bunun için var. Öğrencinin çok istediği bölüm üst bloğa, sizin daha güvenli bulduğunuz alternatifler alt bloğa girebilir. İkisi çatışmaz, sıralanır. [Tercih listesi nasıl yapılır](/rehber/tercih-listesi-nasil-yapilir) yazısındaki hayal–dengeli–garanti dağılımı bu pazarlığın zeminidir.
|
||||||
|
- **Adım 3 — Kararı öğrenciye bırakın, gerekçenizi bir kez söyleyin.** Bir kez. Tekrar etmek ikna etmez, sadece kararı duygusallaştırır.
|
||||||
|
|
||||||
|
## Son iki hatırlatma
|
||||||
|
|
||||||
|
- **Kendi dönemini referans almayın.** Yirmi yıl önce güçlü olan bir bölüm bugün öyle olmayabilir, tersi de doğru. Tabanlar ve müfredatlar değişti; karar bugünün verisiyle verilmeli.
|
||||||
|
- **Boş satır bırakmayın, ama zorla da doldurmayın.** Kayıt yaptırmayacağınız bir programı "garanti olsun" diye yazmak, [ölü tercihten](/rehber/olu-tercih-nedir) daha kötüdür: yerleşirseniz ek yerleştirme hakkı da yanar.
|
||||||
|
|
||||||
|
Öğrencinizin sıralamasıyla hangi bölümlerin ve şehirlerin gerçekten masada olduğunu birlikte görmek için [tercih robotuna](/tercih-robotu) sıralamayı girip listeyi ekranda yan yana inceleyebilirsiniz.
|
||||||
79
content/rehber/yatay-gecis-cap-yandal.md
Normal file
@@ -0,0 +1,79 @@
|
|||||||
|
---
|
||||||
|
baslik: İstemediğim Bölüme Yerleşirsem? Yatay Geçiş, ÇAP ve Yandal Gerçekte Nasıl İşler?
|
||||||
|
aciklama: Sonra yatay geçerim cümlesinin arkasında ne var? Üniversiteye başladıktan sonraki dört yol ve gerçek koşulları — tek şemada.
|
||||||
|
tarih: 2026-07-30
|
||||||
|
---
|
||||||
|
|
||||||
|
Tercih döneminde en çok kurulan cümlelerden biri: "Şimdilik buraya yazayım, sonra yatay geçerim." Bu cümle tamamen yanlış değil — üniversiteye başladıktan sonra gerçekten birkaç çıkış yolu var. Ama her birinin koşulu, takvimi ve kontenjanı var. Bu yazı, o yolları **planlanabilir** hâle getiriyor: hangisi neye bağlı, hangisi ne zaman açılıyor.
|
||||||
|
|
||||||
|
## Başladıktan sonraki dört yol
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
%% aria: Üniversiteye başladıktan sonraki geçiş yolları şeması. Kayıtlı olduğun bölümden memnun değilsen dört yol vardır. Birincisi merkezi yerleştirme puanıyla yatay geçiş, kısaca Ek Madde 1: kayıt olduğun yıldaki YKS puanın hedef programın aynı yıldaki taban puanına eşit veya ondan yüksekse başvurabilirsin, not ortalaması şartı aranmaz ve bu haktan yalnızca bir kez yararlanılır. İkincisi not ortalamasıyla yatay geçiş: genellikle lisansta üçüncü ve beşinci yarıyıl başında, eşdeğer programlara, kontenjan dahilinde yapılır ve not ortalaması şartı vardır. Üçüncüsü çift anadal ve yandal: mevcut bölümü bırakmadan ikinci bir programın derslerini almaktır, not ortalaması ve sınıf başarı sırası şartı aranır. Dördüncüsü yeniden sınava girmektir; bu her zaman açık olan yoldur ama bir yıl maliyeti vardır. Hiçbir yolun garanti olmadığı için tercih listesi bu yollara güvenilerek kurulmamalıdır.
|
||||||
|
%% altyazi: Dört yol da gerçek, hiçbiri garanti değil — liste bu yolların üstüne kurulmaz.
|
||||||
|
flowchart TD
|
||||||
|
A("Bölümden memnun değilim") --> Y1{"Kayıt yılındaki YKS puanın<br/>hedef programın o yılki<br/>tabanına yetiyor mu?"}
|
||||||
|
Y1 -- "evet" --> E1("Ek Madde 1<br/>merkezi puanla yatay geçiş<br/>not şartı yok, 1 kez")
|
||||||
|
Y1 -- "hayır" --> Y2{"Not ortalaman<br/>yüksek mi?"}
|
||||||
|
Y2 -- "evet, bölümü bırakacağım" --> E2("Not ortalamasıyla yatay geçiş<br/>3. ve 5. yarıyıl<br/>kontenjan sınırlı")
|
||||||
|
Y2 -- "evet, bölümü bırakmayacağım" --> E3("Çift anadal / yandal<br/>ikinci diploma veya sertifika")
|
||||||
|
Y2 -- "hayır" --> E4("Yeniden YKS<br/>her zaman açık,<br/>1 yıl maliyeti var")
|
||||||
|
|
||||||
|
classDef uyari fill:#fef3c7,stroke:#f59e0b,color:#92400e
|
||||||
|
classDef garanti fill:#d1fae5,stroke:#10b981,color:#065f46
|
||||||
|
classDef hayal fill:#fee2e2,stroke:#ef4444,color:#991b1b
|
||||||
|
class E1,E3 garanti
|
||||||
|
class Y1,Y2,E2 uyari
|
||||||
|
class E4 hayal
|
||||||
|
```
|
||||||
|
|
||||||
|
## 1) Merkezi yerleştirme puanıyla yatay geçiş (Ek Madde 1)
|
||||||
|
|
||||||
|
En çok merak edilen ve en yanlış bilinen yol. Mantığı basit: **kayıt olduğun yıldaki YKS puanın**, geçmek istediğin programın **aynı yıldaki taban puanına** eşit ya da ondan yüksekse başvurabilirsin.
|
||||||
|
|
||||||
|
Bilmen gereken çerçeve:
|
||||||
|
|
||||||
|
- **Not ortalaması şartı aranmaz.** Değerlendirmede yalnızca yerleştiğin yıldaki merkezi yerleştirme puanların dikkate alınır.
|
||||||
|
- **Puan türü tutmalı.** Hedef programın puan türünde bir puanın olmalı ve o puan hedefin tabanını geçmeli.
|
||||||
|
- **Bu haktan bir kez yararlanılır.**
|
||||||
|
- **Her üniversite kendi duyurusunu yayımlar.** Başvuru takvimi, istenen belgeler ve varsa ek koşullar okulun öğrenci işleri sayfasında ilan edilir. "Ek Madde 1" veya "merkezi yerleştirme puanıyla yatay geçiş" başlığıyla ararsın.
|
||||||
|
|
||||||
|
Pratik sonuç: bu yol, **puanı yettiği hâlde listeyi yanlış kurduğu için aşağı bir programa düşenler** için gerçek bir ikinci şanstır. Puanı zaten yetmeyenler için bir şey değiştirmez. Yani "sonra yatay geçerim" cümlesi, ancak puanın hedefe zaten yetiyorsa anlamlıdır — ki o durumda en baştan doğru listeyi kurmak çok daha kolaydı. [Tercih listesi nasıl yapılır](/rehber/tercih-listesi-nasil-yapilir) yazısı bu hatayı baştan önlemek için var.
|
||||||
|
|
||||||
|
## 2) Not ortalamasıyla yatay geçiş
|
||||||
|
|
||||||
|
Klasik yatay geçiş. Genel çerçevesi şöyle: lisans programlarında **üçüncü ve beşinci yarıyıl** başında, önlisansta ise ikinci ve üçüncü yarıyılda, **eşdeğer programlar** arasında, **kontenjan dahilinde** yapılır. Not ortalaması şartı vardır ve başvurular genel not ortalamasına göre sıralanır.
|
||||||
|
|
||||||
|
Kritik farklar:
|
||||||
|
|
||||||
|
- **Kurum içi geçiş genelde daha kolaydır.** Üniversiteden memnunsan ama bölümden değilsen, aynı okul içinde geçiş şartları çoğunlukla daha esnektir.
|
||||||
|
- **Kontenjan azdır.** Popüler programlara yatay geçiş kontenjanı bazen tek hanelidir; başvuranlar arasında en yüksek ortalamalar kazanır.
|
||||||
|
- **Ders intibakı sürprizli olabilir.** Geçtiğin bölümdeki derslerin hangilerinden muaf sayılacağına ilgili fakültenin muafiyet ve intibak komisyonu karar verir. Muaf sayılmayan dersler mezuniyetini uzatabilir.
|
||||||
|
- **Hazırlık sınıfı yarıyıl sayılmaz.** Hazırlıkta yatay geçiş yapılmaz; en az bir yarıyıl lisans eğitimi tamamlaman gerekir. [Hazırlık sınıfı ve öğretim dili](/rehber/hazirlik-sinifi-ve-ogretim-dili) yazısında hazırlığın süreye etkisi anlatılıyor.
|
||||||
|
|
||||||
|
## 3) Çift anadal (ÇAP) ve yandal
|
||||||
|
|
||||||
|
Bunlar "kaçış" değil, **ekleme** yollarıdır: mevcut bölümünü bırakmadan ikinci bir programın derslerini alırsın.
|
||||||
|
|
||||||
|
- **Çift anadal:** İki ayrı diplomayla mezun olursun. Genellikle belirli bir genel not ortalaması ve kendi sınıfında belirli bir başarı dilimi şartı aranır; iki programın toplam ders yükü ciddi bir tempodur.
|
||||||
|
- **Yandal:** Diploma değil, sertifika alırsın. Şartları çift anadaldan hafiftir, ders yükü daha azdır.
|
||||||
|
|
||||||
|
Eşik değerler ve hangi bölümler arası açıldığı **üniversitenin kendi yönetmeliğinde** yazar ve okuldan okula değişir. Kararı verirken şuna bak: [İşletme](/bolum/isletme) okuyup [Bilgisayar Mühendisliği](/bolum/bilgisayar-muhendisligi) ÇAP'ı yapmak gibi kombinasyonlar ancak o üniversitede açıksa mümkündür. Tercih aşamasında merak ediyorsan üniversitenin "çift anadal programları" listesine bak — bu, geniş üniversitelerin sessiz avantajıdır.
|
||||||
|
|
||||||
|
## 4) Yeniden sınava girmek
|
||||||
|
|
||||||
|
Her zaman açık olan yol. Ama şu üç şeyi baştan bil:
|
||||||
|
|
||||||
|
- Bir yıl maliyeti vardır ve bu yıl geri gelmez.
|
||||||
|
- Bir yükseköğretim programına kayıtlıysan, ertesi yıl yerleştiğinde eski kaydın silinir; ayrıca kayıtlı olmanın OBP ve bazı programların koşulları açısından sonuçlarını [tercih takvimi](/rehber/yks-tercih-takvimi-2026) ve kılavuz üzerinden kontrol etmelisin.
|
||||||
|
- Sıralamanın ikinci yılda otomatik olarak yükseleceği garantisi yoktur.
|
||||||
|
|
||||||
|
[Yerleşemedim ya da istemediğim bölüme yerleştim](/rehber/yerlesemedim-ne-yapmaliyim) yazısı bu kararı bütün seçenekleriyle birlikte ele alıyor.
|
||||||
|
|
||||||
|
## Peki liste kurulurken bu yollar nasıl hesaba katılır?
|
||||||
|
|
||||||
|
Tek cümleyle: **hesaba katılmaz.** Listeyi, "buraya yerleşirsem burada okurum" varsayımıyla kur. Yatay geçiş, ÇAP ve yeniden sınav, listeyi gevşetmek için değil, iş ters giderse elinde kalan yollar için vardır.
|
||||||
|
|
||||||
|
Somut kural: kayıt yaptırmayacağın bir programı "nasıl olsa geçerim" diye listeye yazma — bu tam olarak [ölü tercih](/rehber/olu-tercih-nedir) mantığındaki hatadır ve yerleşirsen ek yerleştirme hakkın da yanar.
|
||||||
|
|
||||||
|
Sıralamanın gerçekten nereye yettiğini görüp listeyi baştan doğru kurmak için [tercih robotuna](/tercih-robotu) sıralamanı gir; hayal, dengeli ve garanti bloklarını tek ekranda görürsün.
|
||||||
55
content/rehber/yerlesemedim-ne-yapmaliyim.md
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
---
|
||||||
|
baslik: Yerleşemedim ya da İstemediğim Bölüme Yerleştim — Şimdi Ne Olacak?
|
||||||
|
aciklama: Sonuç ekranı istediğin gibi çıkmadıysa önünde hâlâ üç yol var: ek yerleştirme, yatay geçiş ve yeniden deneme. Hangi durumda hangisi mantıklı, tek şemada.
|
||||||
|
tarih: 2026-08-01
|
||||||
|
---
|
||||||
|
|
||||||
|
Sonuçlar açıklandığında iki tür hayal kırıklığı yaşanır: hiçbir tercihe yerleşememek ya da listenin sonlarındaki "keşke yazmasaydım" satırına yerleşmek. İkisi de yolun sonu değil — ama ikisinin kuralları **birbirinden çok farklı** ve yanlış hamle, doğru kapıyı kapatabiliyor.
|
||||||
|
|
||||||
|
## Önce durumunu netleştir
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
%% aria: Yerleşememe durumunda karar şeması: sonuç ekranında hiçbir tercihe yerleşemediysen ek yerleştirmeye başvurabilirsin ve boş kontenjanlar için yeni bir 24 tercihlik liste yaparsın; istemediğin bir programa yerleştiysen iki yol vardır: kayıt yaptırırsan birinci sınıfta merkezi yerleştirme puanınla yatay geçiş kapısını araştırabilirsin, kayıt yaptırmazsan yerleşmiş sayıldığın için ek yerleştirmeye giremezsin ve kalan tek yol gelecek yıl yeniden sınava girmektir.
|
||||||
|
%% altyazi: Kritik ayrım: "yerleşemedim" ek yerleştirme kapısını açar; "yerleştim ama gitmedim" o kapıyı kapatır.
|
||||||
|
flowchart TD
|
||||||
|
S{"Sonuç ekranında<br/>ne yazıyor?"}
|
||||||
|
S -- "hiçbir tercihe yerleşemedin" --> E("Ek yerleştirme hakkın var:<br/>boş kontenjanlar için yeni bir liste")
|
||||||
|
E --> E2("Eylülde ÖSYM kılavuzu yayımlar,<br/>yeniden 24 tercih yaparsın")
|
||||||
|
S -- "istemediğin bir programa yerleştin" --> K{"Kayıt yaptıracak mısın?"}
|
||||||
|
K -- "evet" --> Y("Kayıt ol; 1. sınıfta merkezi puanla<br/>yatay geçiş kapısını araştır")
|
||||||
|
K -- "hayır" --> R("Yerleşmiş sayılırsın:<br/>ek yerleştirmeye giremezsin,<br/>kalan yol gelecek yıl yeniden YKS")
|
||||||
|
|
||||||
|
classDef uyari fill:#fef3c7,stroke:#f59e0b,color:#92400e
|
||||||
|
classDef garanti fill:#d1fae5,stroke:#10b981,color:#065f46
|
||||||
|
classDef hayal fill:#fee2e2,stroke:#ef4444,color:#991b1b
|
||||||
|
class E,E2 uyari
|
||||||
|
class Y garanti
|
||||||
|
class R hayal
|
||||||
|
```
|
||||||
|
|
||||||
|
## Yol 1: Ek yerleştirme — boşta kalanların ikinci şansı
|
||||||
|
|
||||||
|
İlk yerleştirmede **hiçbir programa yerleşemediysen** ek yerleştirmeye başvurabilirsin. Kayıt dönemi bitince boş kalan ve kayıt yaptırılmadığı için boşalan kontenjanlar ÖSYM'nin ek kılavuzunda ilan edilir; yeniden en fazla 24 tercih yaparsın. Tabanlar ilk yerleştirmeye göre genelde gevşer ama en çok istenen programlar ek yerleştirmeye nadiren kalır. Kimin başvurabileceği, takvimi ve stratejisiyle tüm detaylar [ek yerleştirme rehberinde](/rehber/ek-yerlestirme-2026).
|
||||||
|
|
||||||
|
Kritik kural bir kez daha: bir programa **yerleştirildiysen** — kayıt yaptırmamış olsan bile — ek yerleştirme sana kapalıdır. "İstemediğim yere yerleştim, kayıt olmayayım, ek tercihte daha iyisini yazarım" planı **çalışmaz.**
|
||||||
|
|
||||||
|
## Yol 2: Kayıt ol + yatay geçişi araştır
|
||||||
|
|
||||||
|
İstemediğin programa yerleştiysen çoğu durumda en az riskli hamle **kayıt olmaktır.** Çünkü kayıtlı öğrenciye açık bir kapı var: **merkezi yerleştirme puanıyla (Ek Madde-1) yatay geçiş.** Mantığı şu:
|
||||||
|
|
||||||
|
- YKS'de aldığın puan, yerleştiğin yıl için geçerliliğini korur.
|
||||||
|
- Puanın, geçmek istediğin programın **senin yerleştiğin yıldaki** taban puanına eşit ya da ondan yüksekse başvurabilirsin.
|
||||||
|
- Başvuru, yerleştiğin yıl içinde değil, öğrenimin başladıktan sonraki dönemlerde (üniversitelerin ilan ettiği kontenjan ve takvimle) yapılır ve bu hak **bir kez** kullanılır.
|
||||||
|
|
||||||
|
Yani "puanım aslında X bölümüne yetiyordu ama listeme yazmamıştım" durumundaysan, bir dönem/yıl sonra o bölüme sınavsız geçme ihtimalin var. Kontenjanlar sınırlı ve üniversiteden üniversiteye değişir; hedef üniversitenin yatay geçiş sayfasını şimdiden takibe al.
|
||||||
|
|
||||||
|
## Yol 3: Yeniden denemek — bedelini bilerek
|
||||||
|
|
||||||
|
Gelecek yıl tekrar sınava girmek meşru bir plan; ama iki bedelini baştan bil:
|
||||||
|
|
||||||
|
1. **OBP çarpanı:** bir programa yerleştirildiysen (kayıt yaptırmasan bile) gelecek yıl diploma notu katkın yarıya düşer — hesabı [OBP yazısında](/rehber/obp-nedir-nasil-hesaplanir).
|
||||||
|
2. **Tabanlar sabit durmaz:** bu yıl "az farkla kaçırdığın" bölümün tabanı seneye aynı yerde olmayabilir — [tabanlar nasıl değişir](/rehber/taban-siralamalar-nasil-degisir) yazısı bu oynaklığı verilerle gösteriyor.
|
||||||
|
|
||||||
|
## Bir dahaki listeye ders
|
||||||
|
|
||||||
|
Bu durumların neredeyse tamamı, liste kurulurken önlenebilir: sonuna gerçekten razı olacağın garantiler koymak, kayıt yaptırmayacağın satırı hiç yazmamak ve [ölü tercihleri](/rehber/olu-tercih-nedir) temizlemek. Ek yerleştirme listesi kuracaksan da aynı disiplin geçerli — sıralamana göre gerçekçi seçenekleri [tercih robotunda](/tercih-robotu) saniyeler içinde görebilirsin.
|
||||||
53
content/rehber/yks-tercih-takvimi-2026.md
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
---
|
||||||
|
baslik: YKS 2026 Tercih Takvimi ve Süreç Adımları
|
||||||
|
aciklama: Sonuçların açıklanmasından ek yerleştirmeye — 2026 tercih döneminin tüm aşamaları tek şemada ve tek sayfada.
|
||||||
|
tarih: 2026-07-20
|
||||||
|
---
|
||||||
|
|
||||||
|
Tercih dönemi kısa ve her adımı tarihli bir süreçtir. 2026'nın akışı şöyle işliyor (kesin tarihler için tek resmî kaynak ÖSYM duyurularıdır; buradaki çerçeve genel akışı gösterir):
|
||||||
|
|
||||||
|
## Sürecin aşamaları
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
%% aria: 2026 tercih dönemi akış şeması: önce YKS sonuçları açıklanır ve başarı sıralaman netleşir; ardından tercih kılavuzu ve kontenjanlar yayımlanır; Temmuz sonu ile Ağustos başı arasında en fazla 24 tercih girilir; yerleştirme sonuçları Ağustos'ta açıklanır; kayıt dönemi Ağustos sonu ile Eylül başı arasındadır; boş kontenjanlar için ek yerleştirme Eylül'de açılır ama yalnızca ilk turda hiçbir programa yerleşemeyenler başvurabilir.
|
||||||
|
%% altyazi: Altı aşama sıralı ilerler; kesin tarihler her yıl ÖSYM duyurusuyla netleşir.
|
||||||
|
flowchart TD
|
||||||
|
R("1 · YKS sonuçları<br/>başarı sıralaman netleşir") --> K("2 · Kılavuz ve kontenjanlar<br/>yayımlanır")
|
||||||
|
K --> T("3 · Tercih dönemi<br/>en fazla 24 tercih, ~2 hafta")
|
||||||
|
T --> Y("4 · Yerleştirme sonuçları<br/>Ağustos")
|
||||||
|
Y --> Kayit("5 · Kayıt dönemi<br/>e-Devlet veya üniversite")
|
||||||
|
Kayit --> E("6 · Ek yerleştirme · Eylül<br/>yalnızca boşta kalanlar başvurur")
|
||||||
|
|
||||||
|
classDef uyari fill:#fef3c7,stroke:#f59e0b,color:#92400e
|
||||||
|
classDef garanti fill:#d1fae5,stroke:#10b981,color:#065f46
|
||||||
|
class T uyari
|
||||||
|
class Kayit,E garanti
|
||||||
|
```
|
||||||
|
|
||||||
|
**1) YKS sonuçlarının açıklanması (Temmuz ortası-sonu).**
|
||||||
|
ÖSYM sonuç belgende puanların ve her puan türü için **başarı sıralaman** yazar. Tercihte kullanacağın sayı budur — puan değil ([neden olduğunu burada anlattık](/rehber/taban-puan-mi-siralama-mi)).
|
||||||
|
|
||||||
|
**2) Tercih kılavuzunun ve kontenjanların yayımlanması.**
|
||||||
|
ÖSYM Yükseköğretim Programları ve Kontenjanları Kılavuzu'nu yayımlar; YÖK Atlas verileri güncellenir. Hangi programın kaç kişi alacağı ve geçen yılların tabanları netleşir.
|
||||||
|
|
||||||
|
**3) Tercih dönemi (Temmuz sonu — Ağustos başı, ~2 hafta).**
|
||||||
|
2026'da tercihler 29 Temmuz - 10 Ağustos arasında alındı. Tercihler ÖSYM AİS (Aday İşlemleri Sistemi) üzerinden girilir; en fazla **24 tercih** hakkın vardır. Liste kurma yöntemi için [tercih listesi rehberine](/rehber/tercih-listesi-nasil-yapilir) bak; sıralamana uygun programları görmek için [tercih robotunu](/tercih-robotu) kullan.
|
||||||
|
|
||||||
|
**4) Yerleştirme sonuçlarının açıklanması (Ağustos).**
|
||||||
|
Tercih döneminin kapanmasından yaklaşık 2-3 hafta sonra. Sonuçla birlikte her programın o yılki gerçek taban puanı ve sıralaması da netleşir.
|
||||||
|
|
||||||
|
**5) Kayıt dönemi (Ağustos sonu — Eylül başı).**
|
||||||
|
Yerleştiğin programa e-Devlet üzerinden veya üniversiteye giderek kayıt yaptırırsın. Kayıt süresini kaçırmak hakkın yanması demektir — tarihleri takvimine işaretle.
|
||||||
|
|
||||||
|
**6) Ek yerleştirme (Eylül).**
|
||||||
|
Boş kalan kontenjanlar için ikinci tur. Kritik kural: ilk yerleştirmede bir programa yerleşen, **kayıt yaptırmasa bile** ek tercihe başvuramaz. Detaylar [ek yerleştirme rehberinde](/rehber/ek-yerlestirme-2026).
|
||||||
|
|
||||||
|
## Tercih haftası için pratik plan
|
||||||
|
|
||||||
|
- **1. gün:** Sıralamanı doğrula, puan türünü netleştir.
|
||||||
|
- **2-3. gün:** Program evrenini çıkar. [Bölüm taban puanları](/bolumler) tablolarında ilgilendiğin bölümlerin son yıllardaki tabanlarını incele; [Psikoloji](/bolum/psikoloji) gibi geniş bölümlerde aralığın ne kadar açıldığını görmek ufuk açar.
|
||||||
|
- **4-5. gün:** Taslak listeyi kur: üstte hayal, ortada dengeli, altta gerçekten gideceğin garanti.
|
||||||
|
- **6. gün:** Ölü tercih taraması yap ([nasıl yapılır](/rehber/olu-tercih-nedir)), aile onayını al, üniversitelerin özel şartlarını (kılavuz dipnotlarını) oku.
|
||||||
|
- **Son gün değil, son günden önce:** AİS'e gir, listeyi kod kod işle, onayla, çıktısını sakla. Sistem son saatlerde yoğunluktan yavaşlar — son güne bırakma.
|
||||||
|
|
||||||
|
Tercih dönemi stresli görünür ama takvimi bilen için sadece sıralı bir yapılacaklar listesidir. Adımları sırayla yürü, kararlarını veriyle ver.
|
||||||
72
content/rehber/yurt-burs-ve-yillik-maliyet.md
Normal file
@@ -0,0 +1,72 @@
|
|||||||
|
---
|
||||||
|
baslik: Yurt, Burs ve Yıllık Maliyet — Tercih Listesinin Görünmeyen Kolonu
|
||||||
|
aciklama: Tercih tablosunda maliyet kolonu yok, ama listeyi asıl eleyen o. Barınma, burs ve dört yıllık toplam hesabı — tek şemada.
|
||||||
|
tarih: 2026-07-29
|
||||||
|
---
|
||||||
|
|
||||||
|
Tercih tablosunda kontenjan var, taban var, tür var — ama **maliyet kolonu yok.** Oysa her yıl binlerce öğrenci yerleştiği yere maliyet yüzünden kayıt yaptıramıyor ya da ikinci dönem şehir değiştirmek zorunda kalıyor. Bu yazı o eksik kolonu doldurmak için: barınma, burs ve dört yıllık gerçek hesap.
|
||||||
|
|
||||||
|
## Bir satırın gerçek maliyeti
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
%% aria: Tercih satırının gerçek maliyeti şeması. Bir programın yıllık maliyeti üç kalemden oluşur. Birincisi öğrenim ücreti: devlet üniversitesi birinci öğretimde normal sürede ücret yoktur, ikinci öğretimde ve süre aşımında katkı payı çıkar; vakıf üniversitesinde burslu programlarda ücret yok, indirimli ve ücretli programlarda ücret vardır. İkincisi barınma: aile yanında kalınıyorsa maliyet en düşüktür, devlet yurdunda orta, özel yurt veya öğrenci evinde en yüksektir. Üçüncüsü yaşam giderleri: yemek, ulaşım, kırtasiye ve şehre gidiş gelişler. Bu üç kalemin toplamı yıllık maliyettir ve öğrenim süresiyle çarpılır. Çıkan sayı ailenin karşılayabileceği tutarın üstündeyse satır listeye yazılmaz veya burslu eşdeğeri aranır. Altındaysa satır listede kalır.
|
||||||
|
%% altyazi: Ücret kaleminin sıfır olması maliyetin sıfır olduğu anlamına gelmiyor — asıl fark barınmada.
|
||||||
|
flowchart TD
|
||||||
|
P("Bir tercih satırı") --> U("1. Öğrenim ücreti<br/>devlet 1. öğretim: yok<br/>vakıf burslu: yok<br/>indirimli / ücretli: var")
|
||||||
|
P --> B("2. Barınma<br/>aile yanı en düşük<br/>devlet yurdu orta<br/>özel yurt / ev en yüksek")
|
||||||
|
P --> Y("3. Yaşam<br/>yemek, ulaşım,<br/>kırtasiye, şehir arası yol")
|
||||||
|
U --> T("Yıllık toplam<br/>x öğrenim süresi")
|
||||||
|
B --> T
|
||||||
|
Y --> T
|
||||||
|
T --> K{"Aile bütçesi<br/>bu tutarı taşır mı?"}
|
||||||
|
K -- "evet" --> L("Satır listede kalır")
|
||||||
|
K -- "sınırda" --> S("Burslu / yurdu güçlü<br/>eşdeğerini de listeye ekle")
|
||||||
|
K -- "hayır" --> C("Satırı yazma:<br/>yerleşirsen kayıt<br/>yaptıramazsın")
|
||||||
|
|
||||||
|
classDef uyari fill:#fef3c7,stroke:#f59e0b,color:#92400e
|
||||||
|
classDef garanti fill:#d1fae5,stroke:#10b981,color:#065f46
|
||||||
|
classDef hayal fill:#fee2e2,stroke:#ef4444,color:#991b1b
|
||||||
|
class L garanti
|
||||||
|
class K,S,T uyari
|
||||||
|
class C hayal
|
||||||
|
```
|
||||||
|
|
||||||
|
## Kalem 1: Öğrenim ücreti
|
||||||
|
|
||||||
|
- **Devlet üniversitesi, birinci öğretim:** Normal öğrenim süresi içinde öğrenim ücreti alınmaz. Süreyi aşarsan veya ikinci öğretimde okursan katkı payı/öğrenim ücreti gündeme gelir. Uzaktan öğretim programlarının kendi ücretlendirmesi vardır.
|
||||||
|
- **Vakıf üniversitesi:** Aynı bölümün burslu, %50 indirimli, %25 indirimli ve ücretli varyantları **ayrı programlardır**; ayrı kontenjan, ayrı taban, ayrı fiyat. Burslu programda öğrenim ücreti yoktur. [Devlet mi vakıf mı](/rehber/devlet-mi-vakif-mi) yazısı bu tabloyu okumayı anlatıyor.
|
||||||
|
- **Bursun sürme koşulu:** Vakıf burslarının çoğu giriş bursudur ve süresizdir, ama bazı okullarda not ortalaması şartı vardır. Üniversitenin **burs yönergesini** tercih etmeden önce oku — bu tek belge dört yıllık planını değiştirebilir.
|
||||||
|
- **Hazırlık yılı:** Hazırlık okuyacaksan bu yılın ücret ve barınma maliyetini de hesaba kat. [Hazırlık sınıfı ve öğretim dili](/rehber/hazirlik-sinifi-ve-ogretim-dili) yazısı hangi programlarda hazırlığın zorunlu olduğunu anlatıyor.
|
||||||
|
|
||||||
|
## Kalem 2: Barınma — asıl fark burada
|
||||||
|
|
||||||
|
Devlet üniversitesi + büyükşehir kirası, bazen vakıf burslusu + yurt kombinasyonundan pahalıya gelir. İki satırı karşılaştırırken ücrete değil, **toplam yıllık çıkışa** bak.
|
||||||
|
|
||||||
|
Barınma seçenekleri ve tercih aşamasında bakman gerekenler:
|
||||||
|
|
||||||
|
- **Devlet yurdu (KYK):** Başvurular yerleştirme sonuçları açıklandıktan sonra e-Devlet üzerinden alınır; burs ve öğrenim kredisi başvuruları ise ayrı bir takvimde açılır. Tarihler her yıl Gençlik ve Spor Bakanlığı tarafından duyurulur, sabit değildir — sonuç açıklandığında resmî duyuruyu takip et. **Yerleştirilme garanti değildir**, öncelik kriterleri vardır.
|
||||||
|
- **Üniversitenin kendi yurdu:** Özellikle vakıf üniversitelerinde kampüs içi yurt kapasitesi ve fiyatı okulun sitesinde yazar. Kapasite küçükse birinci sınıfta yer bulmak zorlaşır.
|
||||||
|
- **Özel yurt / öğrenci evi:** En pahalı ve en değişken kalem. Aynı şehirde kampüse yürüme mesafesindeki fiyatla, 40 dakika uzaktaki fiyat arasında ciddi fark olur.
|
||||||
|
- **Aile yanı:** Kendi şehrindeki bir üniversiteyi tercih etmenin ekonomik ağırlığı budur. Bu seçenek elindeyse, listedeki diğer satırların "prim"ini bunun üstüne koyarak düşün: bu program, yılda şu kadar ek maliyeti hak ediyor mu?
|
||||||
|
|
||||||
|
Pratik bir kontrol: **kampüsün şehir merkezine uzaklığı**. Şehir dışı kampüslerde kira ucuz ama ulaşım ve zaman maliyeti yüksektir; merkezdeki kampüslerde tam tersi.
|
||||||
|
|
||||||
|
## Kalem 3: Yaşam giderleri
|
||||||
|
|
||||||
|
Yemek, ulaşım, kırtasiye ve — sık unutulan — **eve gidiş geliş**. Memleketine ayda bir gidecek bir öğrenci için otobüs/uçak parası yılda ciddi bir kalem olur. Şehir seçerken ulaşım hattının varlığına da bak.
|
||||||
|
|
||||||
|
## Dört yıllık toplamı çıkarmanın en hızlı yolu
|
||||||
|
|
||||||
|
Listeye ciddi olarak yazacağın her satır için üç sayı yaz: **yıllık öğrenim ücreti + yıllık barınma + yıllık yaşam.** Toplamı öğrenim süresiyle (hazırlık varsa +1 yıl) çarp. [Tıp](/bolum/tip) gibi altı yıllık programlarda bu çarpan tek başına belirleyici olabilir.
|
||||||
|
|
||||||
|
Sonuç üç kutudan birine düşer:
|
||||||
|
|
||||||
|
- **Rahat taşınıyor:** Satır listede kalır.
|
||||||
|
- **Sınırda:** Satırı listede tut ama aynı bölümün burslu ya da yurdu güçlü bir eşdeğerini de listeye ekle. Böylece iki senaryoya da hazırlıklı olursun.
|
||||||
|
- **Taşımıyor:** Satırı yazma. "Yerleşirsem bir çaresine bakarız" en pahalı cümledir: yerleştiğin an [ek yerleştirme](/rehber/ek-yerlestirme-2026) hakkın da yanar ve elinde kayıt yaptıramayacağın bir program kalır.
|
||||||
|
|
||||||
|
## Bu konuşmayı listeyi vermeden önce yap
|
||||||
|
|
||||||
|
Maliyet konuşması tercih listesinin **girdisidir**, sonucu değil. Sonuçlar açıklandıktan sonra yapılan "biz bunu ödeyemeyiz" konuşması bir yıl kaybettirir. [Veliler için tercih rehberi](/rehber/veliler-icin-tercih-rehberi) yazısında bu konuşmanın nasıl yapılacağı ve görev dağılımı var.
|
||||||
|
|
||||||
|
Sıralamana düşen programları devlet/vakıf ve şehir filtreleriyle daraltıp maliyet senaryolarını yan yana görmek için [tercih robotuna](/tercih-robotu) sıralamanı girebilirsin.
|
||||||
BIN
data/app.db
BIN
data/yokatlas.db
@@ -3,6 +3,11 @@ services:
|
|||||||
build: .
|
build: .
|
||||||
container_name: kolaytercih
|
container_name: kolaytercih
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
|
# Host'u korur: uygulama bu sınırın üstüne çıkamaz. OOM anında kernel'ın
|
||||||
|
# önce build süreçlerini (skor 0) öldürmesi için negatif oom_score_adj.
|
||||||
|
mem_limit: 1g
|
||||||
|
mem_reservation: 256m
|
||||||
|
oom_score_adj: -600
|
||||||
volumes:
|
volumes:
|
||||||
- app-data:/app/data
|
- app-data:/app/data
|
||||||
env_file:
|
env_file:
|
||||||
|
|||||||
106
docs/tasarim/cta-cekmece-tasarimi.md
Normal file
@@ -0,0 +1,106 @@
|
|||||||
|
# CTA çekmecesi tasarım algısı — "Sıralamanla nereye yerleşirsin? Saniyede gör."
|
||||||
|
|
||||||
|
Bu doküman, programatik SEO sayfalarındaki funnel CTA'sının (`src/components/cta-sira-form.tsx`)
|
||||||
|
alttan açılan çekmece (drawer) tasarımının arkasındaki algıyı ve kuralları belgeler.
|
||||||
|
Yeni bir funnel giriş noktası eklerken ya da bu bileşeni değiştirirken buradaki
|
||||||
|
ilkelere uy.
|
||||||
|
|
||||||
|
## 1. Temel algı: vaadi verdiğin yerde tahsil et
|
||||||
|
|
||||||
|
Eski davranış adayı ana sayfaya (`/`) gönderiyordu: "Saniyede gör" vaadi verip
|
||||||
|
saniyeler süren bir sayfa geçişi ve bağlam kaybı yaşatıyordu. Yeni algı şu:
|
||||||
|
|
||||||
|
- **Kart vaat eder** — SEO sayfasının içinde duran kart (`bg-primary/5`,
|
||||||
|
`border-primary/20`) merak uyandırır: "Sıralamanla nereye yerleşirsin?"
|
||||||
|
- **Çekmece tahsil eder** — CTA butonu sayfadan koparmadan alttan bir çekmece
|
||||||
|
açar; sıralama girişi, sihirbaz adımları ve tamamlama hepsi aynı bağlamda akar.
|
||||||
|
- **Ödül `/sonuc`'ta** — seçimler tamamlanınca profil yazılır, çekmece kapanır
|
||||||
|
ve aday doğrudan sonuç sayfasına gider. Sayfa geçişi yalnızca ödül anında olur.
|
||||||
|
|
||||||
|
Akış: **kart (vaat) → çekmece (sıralama) → sihirbaz (kişiselleştirme) → /sonuc (ödül)**.
|
||||||
|
|
||||||
|
Profilli adayda çekmece hiç devreye girmez: kayıtlı sıralamayla doğrudan
|
||||||
|
`/sonuc` linki gösterilir — sıralamasını girmiş adaya bir daha girmesini
|
||||||
|
söylemeyiz.
|
||||||
|
|
||||||
|
## 2. Neden çekmece, modal değil?
|
||||||
|
|
||||||
|
- Çekmece **sayfanın üstüne değil, altına eklenir** algısı verir: aday hâlâ
|
||||||
|
okuduğu üniversite/bölüm sayfasının üzerindedir, içerik kaybolmaz (overlay
|
||||||
|
hafif: `bg-black/10` + blur).
|
||||||
|
- Alttan gelen yüzey mobilde başparmak menzilinde; hedef kitle (YKS adayı)
|
||||||
|
ağırlıkla mobilde.
|
||||||
|
- Swipe-to-dismiss (tutamaktan) ve overlay/Escape ile kaçış ucuz: "bir bakayım"
|
||||||
|
maliyeti düşük tutulur. `handleOnly` kullanılır ki form/sihirbaz içindeki
|
||||||
|
kaydırmalar çekmeceyi yanlışlıkla kapatmasın.
|
||||||
|
- Desktop'ta çekmece tam genişliğe yayılmaz: `sm:max-w-2xl` ile ortalanır,
|
||||||
|
`sm:border-x + sm:shadow-2xl` ile sayfadan yükselen bir panel gibi durur
|
||||||
|
(liste çekmecesiyle aynı reçete).
|
||||||
|
|
||||||
|
## 3. Görsel dil: yeni hiçbir şey icat etme
|
||||||
|
|
||||||
|
Çekmecedeki her parça sitede zaten var olan kanonik kaynaktan gelir:
|
||||||
|
|
||||||
|
| Parça | Kaynak / kural |
|
||||||
|
| --- | --- |
|
||||||
|
| Eyebrow rozeti ("Saniyede gör") | `SectionEyebrow` (`pixel-decor.tsx`) — elle pill yazılmaz |
|
||||||
|
| Kapatma çarpısı | `dialog.tsx`'teki kanonik set: `size-9`, `rounded-full`, `border-slate-200`, `size-4` X, hover `bg-slate-100`, `active:scale-[0.96]` |
|
||||||
|
| CTA butonları | Metin önce, sonda `ArrowRight` (`size-4`); yıldız/Sparkles yok; `bg-orange-500 → hover:bg-orange-600` |
|
||||||
|
| Puan türü çipleri | Hero formundaki radiogroup çipleriyle birebir aynı class seti |
|
||||||
|
| Sıralama girişi | Profil kapısındaki desen: sola `Trophy` ikonu, `h-12`, `pl-11` |
|
||||||
|
| Kanıt üçlüsü | Arama funnel kartıyla aynı üçlü: 24 tercihlik plan / Risk analizi / YÖK Atlas verisi (`ListChecks`, `ChartNoAxesCombined`, `Database`) |
|
||||||
|
| Başlık/kopya tipografisi | `font-heading` bold başlık, `text-slate-600` gövde, `text-slate-900` vurgu |
|
||||||
|
|
||||||
|
Algı hedefi: çekmece açıldığında aday "yeni bir yere geldim" değil, "aynı ürünün
|
||||||
|
bir katmanı kalktı" hissetmeli. Bu yüzden çekmeceye özgü hiçbir yeni renk,
|
||||||
|
rozet, buton varyantı tasarlanmaz.
|
||||||
|
|
||||||
|
## 4. İçerik tonu
|
||||||
|
|
||||||
|
- Öğrenci diliyle, ikinci tekil: "Sıralamanı yaz", "bu sayfadan ayrılmadan gör".
|
||||||
|
- Sürtünme kaldıran güvence her zaman görünür: **"Ücretsiz, üyelik gerekmez."**
|
||||||
|
- Kanıt üçlüsü süs değil, ürün vaadinin özetidir; metin etiketleri ikonsuz da
|
||||||
|
anlamlı olmalı (renk/ikon tek başına anlam taşımaz — ürünün risk renk dili
|
||||||
|
kuralıyla aynı ilke).
|
||||||
|
- Buton etiketleri eylemin sonucunu söyler: "Programları gör" (girdi adımı),
|
||||||
|
"Ücretsiz tablonu gör" / "Yapay Zeka listemi kur (3 kredi)" (sihirbaz sonu, girişe göre).
|
||||||
|
|
||||||
|
## 5. Davranış ve teknik algı
|
||||||
|
|
||||||
|
- **Statik kalır:** Kart RSC sayfalarında prerender edilir; oturum bilgisi
|
||||||
|
mount'ta değil, facet isteğiyle **paralel** çözülür (hero formundaki desen) —
|
||||||
|
landing başına gereksiz auth turu atılmaz.
|
||||||
|
- **Preload:** CTA butonuna `pointerenter`/`focus` ve sıralama inputuna `focus`
|
||||||
|
geldiğinde `preloadSihirbazAdimlar()` çalışır; sihirbaz açıldığında chunk
|
||||||
|
çoktan inmiştir. "Saniyede gör" vaadi teknik olarak da tutulur.
|
||||||
|
- **İki adım, tek yüzey:** çekmece içinde `sira → sihirbaz` adımları vardır;
|
||||||
|
erişilebilir ad sabittir (sr-only `DrawerTitle`/`DrawerDescription`), görünür
|
||||||
|
başlıklar adıma göre değişir.
|
||||||
|
- **Kapanış = sıfırlama, ama nazikçe:** çekmece kapanınca adım ve facet'ler
|
||||||
|
sıfırlanır; adayın yazdığı sıralama ve puan türü **korunur** (tekrar açarsa
|
||||||
|
baştan yazmasın).
|
||||||
|
- **Tamamlanınca:** `tercihProfiliYaz` → çekmece kapanır → `sonucHref` ile
|
||||||
|
`/sonuc` (girişliye `sihirbaz: "1"`, girişsize `hazir: "1"`). Giriş duvarı
|
||||||
|
sihirbazın hemen arkasında değildir; değer önce gösterilir.
|
||||||
|
- **Lenis:** çekmece içeriği ve kaydırma kabı `data-lenis-prevent` taşır;
|
||||||
|
sayfadaki smooth-scroll çekmece içi kaydırmayı ezmez.
|
||||||
|
|
||||||
|
## 6. Erişilebilirlik
|
||||||
|
|
||||||
|
- Sıralama alanı: `inputMode="numeric"`, binlik ayraçlı biçimleme
|
||||||
|
(85000 → 85.000), hata durumunda `aria-invalid` + `aria-describedby` +
|
||||||
|
`role="alert"`.
|
||||||
|
- Puan türü seçimi `role="radiogroup"` / `role="radio"` + `aria-checked`.
|
||||||
|
- Kapatma yolları: çarpı butonu, overlay, Escape, tutamaktan swipe.
|
||||||
|
- `prefers-reduced-motion` vaul/motion tarafında zaten sadeleşir; çekmeceye
|
||||||
|
özel ek animasyon eklenmedi.
|
||||||
|
|
||||||
|
## 7. Bu deseni ne zaman kullan / kullanma
|
||||||
|
|
||||||
|
**Kullan:** İçerik sayfasında duran ve adaydan tek kritik girdi (sıralama)
|
||||||
|
isteyen her funnel girişi. Adayın okuduğu bağlam değerliyse (bölüm, üniversite,
|
||||||
|
rehber) çekmece doğru araçtır.
|
||||||
|
|
||||||
|
**Kullanma:** Zaten modal/dialog içinde olan akışlar (arama modalındaki funnel
|
||||||
|
kartı gibi — modal üstüne çekmece açılmaz, oradaki kart mevcut kapı/dialog
|
||||||
|
akışını kullanır) ve profilli kısayollar (doğrudan link yeterli).
|
||||||
101
docs/tasarim/ux-duzeltmeler.md
Normal file
@@ -0,0 +1,101 @@
|
|||||||
|
# UX/CRO Kritik Düzeltmeler — Uygulama Takibi
|
||||||
|
|
||||||
|
UX denetiminden çıkan 🔴 kritik bulguların uygulama listesi.
|
||||||
|
Kaynak: 26 Temmuz 2026 tarihli UX/CRO denetimi.
|
||||||
|
|
||||||
|
## K1 — Ödeme sonrası teslimat
|
||||||
|
|
||||||
|
- [x] `/odeme/sonuc` başarı CTA'sı doğrudan `/listem`'e gitsin (ölü `/sonuc?acildi=1` yerine)
|
||||||
|
(sahte "paid" siparişle canlı doğrulandı: CTA → `/listem?acildi=1`)
|
||||||
|
- [x] `/listem` ödeme dönüşünde tek seferlik "kilit açıldı" deneyimi (banner + unblur)
|
||||||
|
- [x] Ücretli `/listem` başlık kopyası düzelsin (rozet "Paketin aktif", alt metin
|
||||||
|
"24 tercihinin tamamını gerekçe, risk analizi ve trendleriyle…")
|
||||||
|
|
||||||
|
## K2 — Buton dürüstlüğü (giriş duvarı sürprizi)
|
||||||
|
|
||||||
|
- [x] Hero sihirbazı son butonu girişsiz kullanıcıda girişi açıkça söylesin
|
||||||
|
("Giriş yap ve listeni gör"; girişliyse "Listemi oluştur (3 kredi)")
|
||||||
|
- [x] Hero akışı oturumu açık kullanıcıyı `/giris`'ten sektirmeyip doğrudan `/sonuc`'a götürsün
|
||||||
|
- [x] `/sonuc` sihirbazında girişsiz son buton "Listemi gör" yerine dürüst etiket taşısın
|
||||||
|
- [x] Değer önce: hero sihirbazı biten girişsiz kullanıcı `/giris`'e değil doğrudan
|
||||||
|
`/sonuc`'taki ücretsiz tabloya gitsin; AI CTA'sı oradan "5 deneme kredinle
|
||||||
|
AI listeni kur — giriş yap" olarak verilsin (panel + sabit alt kart);
|
||||||
|
girişten dönüşte kayıtlı seçimlerle otomatik üretim başlasın
|
||||||
|
|
||||||
|
## K3 — Fiyat şeffaflığı
|
||||||
|
|
||||||
|
- [x] Landing hero mikro-kopyasına paket fiyatı (299 TL) eklensin
|
||||||
|
- [x] FAQ "Fiyatlandırma nasıl çalışıyor?" cevabına rakamlar yazılsın
|
||||||
|
|
||||||
|
## K4 — Puan türü seçici
|
||||||
|
|
||||||
|
- [x] Hero formuna SAY/EA/SÖZ/DİL/TYT segment kontrolü (varsayılan SAY)
|
||||||
|
|
||||||
|
## K5 — Ücretsiz kullanıcıya AI sohbeti
|
||||||
|
|
||||||
|
- [x] `/listem`'de paketi olmayan kullanıcıya kalan kredileriyle sohbet açılsın
|
||||||
|
(fiyat kartının altında; mesaj gönderimi + kredi düşümü canlı doğrulandı)
|
||||||
|
- [x] Kredi bitince composer yerinde paket CTA'sı görünsün (0 krediyle canlı doğrulandı)
|
||||||
|
|
||||||
|
## K6 — Ödeme/AI hata mesajları
|
||||||
|
|
||||||
|
- [x] iyzico/Anthropic yapılandırma hataları kullanıcıya ham sızmasın (log'a detay, kullanıcıya sade mesaj)
|
||||||
|
(iyzico yolu canlı doğrulandı: "Ödeme şu anda başlatılamıyor; kartından çekim yapılmadı…")
|
||||||
|
- [x] `/paket` sayfası `?hata=token|siparis` parametresini okuyup banner göstersin
|
||||||
|
|
||||||
|
## Bonus
|
||||||
|
|
||||||
|
- [x] Hero rozetindeki "açıkk" yazım hatası düzeltilsin
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# 🟠 Önemli
|
||||||
|
|
||||||
|
- [x] Ö1: `/listem` paywall ara kartı kopyası netleşsin (kilit ikonu + "aşağıdaki tüm
|
||||||
|
satırlar açık" çelişkisi giderilsin; CTA fiyatı söylesin)
|
||||||
|
(yeni kopya: "İlk 3 tercihte AI analizini gördün… Analizleri aç — 299 TL")
|
||||||
|
- [x] Ö2: İl seçimi mobilde aranabilir liste ile yapılabilsin; harita mobilde geri
|
||||||
|
çekilsin; harita illerine erişilebilir isim (aria-label) eklensin
|
||||||
|
(arama + çip birincil; harita ≥sm'de görsel destek; path'lerde aria-label/aria-pressed)
|
||||||
|
- [x] Ö3: "Listem" isim çakışması giderilsin (manuel liste "Seçtiklerim" olsun,
|
||||||
|
AI raporu /listem "Listem" kalsın)
|
||||||
|
- [x] Ö3b: Navbar'daki "Seçtiklerim" butonu liste boşken görünmesin — tabloya
|
||||||
|
ulaşmamış ziyaretçiye "0/24" gürültü; ilk program eklenince belirir,
|
||||||
|
liste boşalınca kaybolur (canlı doğrulandı)
|
||||||
|
- [x] Ö4: Güven sayfaları eklensin (gizlilik/KVKK, kullanım & iade koşulları,
|
||||||
|
iletişim) ve footer + giriş + paket sayfalarından bağlansın
|
||||||
|
(NOT: metinler MVP taslağı — yayın öncesi hukuki gözden geçirme gerekir)
|
||||||
|
- [x] Ö5: AI'ın ürettiği genel değerlendirme ve uyarılar /listem'de görünsün
|
||||||
|
(paketliye tam, paketsize kilitli önizleme — "Danışman özeti" kartı)
|
||||||
|
- [x] Ö6: Paketlinin gerçek revizyon akışı /listem'de çalışsın (geri bildirim
|
||||||
|
kutusu; başlıktaki "Revize et" oraya götürsün)
|
||||||
|
(`revizyon-kutusu.tsx` → `listeRevize` aksiyonu; kalan hak sayacıyla)
|
||||||
|
- [x] Ö7: Liste tepesine dilim özeti (hayal/dengeli/garanti dağılımı) ve tek
|
||||||
|
şehir uyarısı eklensin
|
||||||
|
- [x] Ö8: 2024/2025 verisi eksik satırda çelişkili trend rozeti gösterilmesin
|
||||||
|
(rozet iki yıl da doluysa çıkar; yoksa "Veri eksik")
|
||||||
|
- [x] Ö9: Magic link "gönderildi" ekranına yeniden gönder + e-postayı düzelt eklensin
|
||||||
|
(30 sn bekleme sayaçlı yeniden gönder + "E-postayı düzelt")
|
||||||
|
- [x] Ö10: Mobilde sohbete hızlı erişim (yüzen "Danışmana sor" kısayolu)
|
||||||
|
|
||||||
|
# 🛠 Dev araçları
|
||||||
|
|
||||||
|
- [x] Dev süperadmin paneli: yalnızca geliştirme ortamında sol altta "DEV"
|
||||||
|
butonu — anında giriş (magic link atlanır), kredi/paket/rapor senaryoları,
|
||||||
|
sahte "paid" siparişle ödeme başarı ekranı, tüm sayfalara hızlı bağlantılar
|
||||||
|
(`src/components/dev/dev-panel.tsx` + `src/lib/dev/actions.ts`;
|
||||||
|
layout NODE_ENV kontrolüyle monte eder, aksiyonlar sunucuda ayrıca korunur)
|
||||||
|
|
||||||
|
# 🟢 Güzel olur
|
||||||
|
|
||||||
|
- [x] G1: Sıralama girişinde canlı binlik ayracı + toast yerine input altı hata
|
||||||
|
- [x] G2: Sihirbaz adım göstergesi tamamlanan adımı işaretlesin; 1. adımda
|
||||||
|
"Geri" görünmesin
|
||||||
|
- [x] G3: Route-level loading / error / not-found boundary'leri eklensin
|
||||||
|
(kök loading/error/not-found + /sonuc ve /listem'e Skeleton'lı loading)
|
||||||
|
- [x] G4: Landing istatistik kartlarının yanında "yerleşme garantisi vermeyen
|
||||||
|
dürüst araç" konumlandırması cesur işlensin (koyu kart: "Yerleşme
|
||||||
|
garantisi vermiyoruz. Çünkü kimse veremez.")
|
||||||
|
- [x] G5: `sonButonEtiketi` şeffaflığı hero varyantına taşınsın (girişli:
|
||||||
|
"Listemi oluştur (3 kredi)"; girişsiz artık ücretsiz tabloya gittiği
|
||||||
|
için "Ücretsiz tablonu gör")
|
||||||
239
docs/urun/gamification.md
Normal file
@@ -0,0 +1,239 @@
|
|||||||
|
# Kolay Tercih — Gamification ve Listeye Ekleme Kurgusu
|
||||||
|
|
||||||
|
> Durum: Ürün kararı
|
||||||
|
> Son güncelleme: 1 Ağustos 2026
|
||||||
|
|
||||||
|
## Ana fikir
|
||||||
|
|
||||||
|
Kolay Tercih'te bütün deneyim kullanıcının başarı sıralaması üzerine inşa
|
||||||
|
edilir. Amaç kullanıcıya yalnızca erişebileceği programları göstermek değil;
|
||||||
|
seçtiği programların sıralamasına, ilgi alanlarına ve önceliklerine ne kadar
|
||||||
|
uyduğunu açıklayarak tercihine ışık tutmaktır.
|
||||||
|
|
||||||
|
Gamification; puan, rozet veya yapay rekabet üzerinden değil, kullanıcının
|
||||||
|
belirsiz bir fikirden gerekçeli ve dengeli bir tercih listesine ilerlemesi
|
||||||
|
üzerinden çalışır.
|
||||||
|
|
||||||
|
## Değişmez ürün kuralları
|
||||||
|
|
||||||
|
1. Başarı sıralaması bütün hesaplamaların başlangıç noktasıdır.
|
||||||
|
2. Listeye yalnızca tekil bir program eklenir. Üniversitenin veya bölümün tamamı
|
||||||
|
listeye eklenmez.
|
||||||
|
3. Program satırlarında erişilebilir bir `+` düğmesi bulunur.
|
||||||
|
4. Kullanıcı sihirbazı doldurmadan ilk programı listesine ekleyemez.
|
||||||
|
5. Sihirbaz tamamlandıktan sonra `+` ile seçilen program doğrudan listeye
|
||||||
|
eklenir; uyumsuz programlar engellenmez.
|
||||||
|
6. Sistem kullanıcının yerine karar vermez. Çelişkileri görünür kılar, nedenini
|
||||||
|
açıklar ve son kararı kullanıcıya bırakır.
|
||||||
|
7. “Garanti kazanırsın” gibi kesinlik bildiren ifadeler kullanılmaz. Risk ve
|
||||||
|
uyum değerlendirmeleri geçmiş YÖK Atlas verilerine dayalı rehberliktir.
|
||||||
|
|
||||||
|
## Kullanıcı yolculuğu
|
||||||
|
|
||||||
|
### 1. Sıralamayı öğren
|
||||||
|
|
||||||
|
Kullanıcı başarı sıralamasını ve puan türünü girer. Sistem buna göre program
|
||||||
|
havuzunu, hayal/dengeli/güvenli aralıklarını ve kullanılabilir sihirbaz
|
||||||
|
seçeneklerini oluşturur.
|
||||||
|
|
||||||
|
### 2. Niyetini öğren
|
||||||
|
|
||||||
|
Kullanıcı ilk kez bir programdaki `+` düğmesine bastığında sihirbaz seçimleri
|
||||||
|
yoksa program hemen eklenmez. Tıklanan program “bekleyen program” olarak
|
||||||
|
korunur ve kısa sihirbaz açılır.
|
||||||
|
|
||||||
|
Sihirbaz en az şu bilgileri toplar:
|
||||||
|
|
||||||
|
- İlgi alanları
|
||||||
|
- Tercih edilen şehirler
|
||||||
|
- Devlet/vakıf tercihi
|
||||||
|
- Kariyer ve yaşam öncelikleri
|
||||||
|
|
||||||
|
Sihirbaz giriş mesajı:
|
||||||
|
|
||||||
|
> Önce seni biraz tanıyalım
|
||||||
|
>
|
||||||
|
> Sadece sıralamana uyan bir liste değil, ne istediğine de uyan bir tercih
|
||||||
|
> listesi kurmak istiyoruz. Birkaç kısa seçim yap; eklediğin programların sana
|
||||||
|
> ne kadar uyduğunu birlikte değerlendirelim.
|
||||||
|
|
||||||
|
Kısa alternatif:
|
||||||
|
|
||||||
|
> Tercihine ışık tutabilmemiz için önce ne istediğini öğrenelim.
|
||||||
|
|
||||||
|
Birincil eylem:
|
||||||
|
|
||||||
|
> Tercihlerimi belirle
|
||||||
|
|
||||||
|
İkincil eylem:
|
||||||
|
|
||||||
|
> Vazgeç
|
||||||
|
|
||||||
|
Sihirbaz zorunludur; “şimdilik atla ve ekle” seçeneği bulunmaz.
|
||||||
|
|
||||||
|
### 3. İlk programı ekle
|
||||||
|
|
||||||
|
Sihirbaz başarıyla tamamlandığında kullanıcının daha önce `+` ile seçtiği
|
||||||
|
bekleyen program otomatik olarak listeye eklenir. Kullanıcı aynı programı
|
||||||
|
yeniden bulmak veya tekrar `+` düğmesine basmak zorunda kalmaz.
|
||||||
|
|
||||||
|
Başarı bildirimi:
|
||||||
|
|
||||||
|
> Program listene eklendi. Sıralamana ve tercihlerine göre değerlendirdik.
|
||||||
|
|
||||||
|
### 4. Listeyi bilinçli biçimde geliştir
|
||||||
|
|
||||||
|
Sihirbaz tamamlandıktan sonraki `+` tıklamaları programı doğrudan ekler.
|
||||||
|
Sistem ekleme öncesinde onay modalı göstermez ve uyumsuz seçimleri engellemez.
|
||||||
|
Her programın değerlendirmesi listede görünür.
|
||||||
|
|
||||||
|
## Program değerlendirme modeli
|
||||||
|
|
||||||
|
Her eklenen program iki ayrı eksende değerlendirilir:
|
||||||
|
|
||||||
|
### Yerleşme riski
|
||||||
|
|
||||||
|
Kullanıcının başarı sıralaması ile programın güncel ve geçmiş taban
|
||||||
|
sıralamaları karşılaştırılır.
|
||||||
|
|
||||||
|
Örnek durumlar:
|
||||||
|
|
||||||
|
- Hayal
|
||||||
|
- Dengeli
|
||||||
|
- Daha güvenli
|
||||||
|
- Veri yetersiz
|
||||||
|
|
||||||
|
“Garanti” yerine mümkün olduğunda “daha güvenli” ifadesi tercih edilir.
|
||||||
|
|
||||||
|
### Tercih uyumu
|
||||||
|
|
||||||
|
Program, sihirbaz seçimleriyle karşılaştırılır. Uyum tek bir kapalı puan olarak
|
||||||
|
verilmek yerine anlaşılır gerekçelerle açıklanır.
|
||||||
|
|
||||||
|
Örnek olumlu sinyaller:
|
||||||
|
|
||||||
|
- İlgi alanlarınla uyumlu
|
||||||
|
- Tercih ettiğin şehirlerden birinde
|
||||||
|
- Devlet/vakıf tercihine uyuyor
|
||||||
|
- Kariyer önceliklerinle örtüşüyor
|
||||||
|
|
||||||
|
Örnek çelişki sinyalleri:
|
||||||
|
|
||||||
|
- Seçtiğin ilgi alanlarının dışında görünüyor
|
||||||
|
- Tercih ettiğin şehirlerin dışında
|
||||||
|
- Üniversite türü tercihinle uyuşmuyor
|
||||||
|
- Belirttiğin önceliklerle zayıf eşleşiyor
|
||||||
|
|
||||||
|
Dil yargılayıcı olmamalıdır. “Sana uygun değil” yerine “seçimlerinle
|
||||||
|
karşılaştırdığımızda şu noktada ayrışıyor” denir.
|
||||||
|
|
||||||
|
## Liste ekranı
|
||||||
|
|
||||||
|
Liste yalnızca seçilen programları depolayan bir favoriler alanı değildir.
|
||||||
|
Kullanıcının tercih stratejisini görünür kılan karar merkezidir.
|
||||||
|
|
||||||
|
Her satırda en az şu bilgiler bulunur:
|
||||||
|
|
||||||
|
- Program ve üniversite
|
||||||
|
- Güncel taban sıralaması
|
||||||
|
- Kullanıcının sıralamasına göre risk durumu
|
||||||
|
- Tercihlerle uyumlu noktalar
|
||||||
|
- Varsa çelişki veya dikkat notu
|
||||||
|
- Listeden çıkarma eylemi
|
||||||
|
|
||||||
|
Örnek uyumlu satır mesajı:
|
||||||
|
|
||||||
|
> İlgi alanın ve devlet üniversitesi tercihinle uyumlu. Sıralama açısından
|
||||||
|
> dengeli aralıkta.
|
||||||
|
|
||||||
|
Örnek çelişkili satır mesajı:
|
||||||
|
|
||||||
|
> Bu program listende kalabilir; ancak seçtiğin ilgi alanlarının ve tercih
|
||||||
|
> ettiğin şehirlerin dışında görünüyor.
|
||||||
|
|
||||||
|
Örnek risk mesajı:
|
||||||
|
|
||||||
|
> Geçen yılın taban sıralaması senin sıralamandan daha yukarıda. Hayal
|
||||||
|
> tercihlerinden biri olarak değerlendirebilirsin.
|
||||||
|
|
||||||
|
Birden fazla çelişki varsa sistem hepsini aynı anda bağırmaz. En önemli bir veya
|
||||||
|
iki gerekçe satırda gösterilir; ayrıntılar açılır alanda sunulur.
|
||||||
|
|
||||||
|
## İlerleme hissi
|
||||||
|
|
||||||
|
Deneyimin oyunlaştırma döngüsü şöyledir:
|
||||||
|
|
||||||
|
1. **Keşfet:** Sıralamana göre programları incele.
|
||||||
|
2. **Seç:** `+` ile ilgini çeken programı listene al.
|
||||||
|
3. **Anla:** Sistem risk ve tercih uyumunu açıklar.
|
||||||
|
4. **Dengele:** Hayal, dengeli ve daha güvenli dağılımını geliştir.
|
||||||
|
5. **Tamamla:** Gerekçeli 24 tercihlik listeye ulaş.
|
||||||
|
|
||||||
|
İlerleme göstergeleri:
|
||||||
|
|
||||||
|
- `3 / 24 tercih`
|
||||||
|
- Hayal / dengeli / daha güvenli dağılımı
|
||||||
|
- Tercihlerle güçlü uyum gösteren program sayısı
|
||||||
|
- Dikkat edilmesi gereken seçim sayısı
|
||||||
|
- Listenin eksik kalan tarafına yönelik tek ve uygulanabilir öneri
|
||||||
|
|
||||||
|
Örnek yönlendirmeler:
|
||||||
|
|
||||||
|
> Listen dengeli tercihlerde güçleniyor. Birkaç daha güvenli seçenek eklemek
|
||||||
|
> riski dağıtabilir.
|
||||||
|
|
||||||
|
> Seçtiklerinin çoğu aynı şehirde. Şehir konusunda esneksen alternatiflerini
|
||||||
|
> genişletebilirsin.
|
||||||
|
|
||||||
|
> 24 tercihe ulaştın. Şimdi dağılımı ve dikkat notlarını birlikte gözden geçir.
|
||||||
|
|
||||||
|
## `+` düğmesinin durumları
|
||||||
|
|
||||||
|
- **Varsayılan:** “Listeme ekle”
|
||||||
|
- **Sihirbaz gerekli:** Tıklama sihirbaz ön bilgilendirmesini açar
|
||||||
|
- **Ekleniyor:** Düğme geçici olarak devre dışı kalır
|
||||||
|
- **Eklendi:** `+` yerine onay işareti gösterilir, erişilebilir etiketi
|
||||||
|
“Listende” olur
|
||||||
|
- **Liste dolu:** Düğme devre dışıdır ve “Listen 24 tercihe ulaştı” açıklaması
|
||||||
|
sunulur
|
||||||
|
- **Hata:** Seçim kaybolmaz; kullanıcıya yeniden deneme eylemi verilir
|
||||||
|
|
||||||
|
İkon düğmesinin dokunma alanı en az 44×44 piksel olmalı ve yalnızca ikona bağlı
|
||||||
|
anlam bırakılmamalıdır. Görsel etiket veya erişilebilir ad bulunmalıdır.
|
||||||
|
|
||||||
|
## Sihirbaz seçimlerini değiştirme
|
||||||
|
|
||||||
|
Kullanıcı sihirbaz yanıtlarını daha sonra değiştirebilir. Değişiklik mevcut
|
||||||
|
programları listeden otomatik olarak çıkarmaz. Bütün satırların uyum
|
||||||
|
değerlendirmesi yeni yanıtlara göre yeniden hesaplanır ve değişen yorumlar
|
||||||
|
görünür biçimde güncellenir.
|
||||||
|
|
||||||
|
Örnek bildirim:
|
||||||
|
|
||||||
|
> Tercihlerin güncellendi. Listendeki programları yeni seçimlerine göre yeniden
|
||||||
|
> değerlendirdik; hiçbir programı silmedik.
|
||||||
|
|
||||||
|
## Kaçınılacak kalıplar
|
||||||
|
|
||||||
|
- Kullanıcıyı sihirbazı doldurmadığı için suçlayan dil
|
||||||
|
- Uyumsuz bir programın eklenmesini engellemek
|
||||||
|
- Sadece renk ile uyum veya risk anlatmak
|
||||||
|
- Kesin yerleşme vaadi vermek
|
||||||
|
- Her `+` tıklamasında modal veya onay adımı göstermek
|
||||||
|
- Rozet, puan ve seri gibi kararın ciddiyetini oyunlaştıran ödüller
|
||||||
|
- Kullanıcının sihirbazdan önce tıkladığı programı unutmak
|
||||||
|
- İlgi alanı uyumunu yerleşme ihtimaliyle aynı şeymiş gibi sunmak
|
||||||
|
|
||||||
|
## Başarı ölçütleri
|
||||||
|
|
||||||
|
- Sıralama sonucundan ilk `+` tıklamasına geçiş
|
||||||
|
- İlk `+` sonrasında sihirbaz tamamlama oranı
|
||||||
|
- Sihirbazdan sonra bekleyen programın başarıyla eklenme oranı
|
||||||
|
- Kullanıcı başına eklenen program sayısı
|
||||||
|
- 24 tercihe ulaşan kullanıcı oranı
|
||||||
|
- Uyarı görüldükten sonra programı koruma/çıkarma davranışı
|
||||||
|
- Sihirbaz tercihlerini güncelleme oranı
|
||||||
|
- Liste dağılımının zaman içinde daha dengeli hâle gelmesi
|
||||||
|
|
||||||
|
Bu metrikler kullanıcıyı daha çok tıklamaya zorlamak için değil, daha bilinçli
|
||||||
|
bir tercih listesi kurup kuramadığını anlamak için kullanılmalıdır.
|
||||||
189
docs/urun/prd-kapi1-ucretsiz-funnel.md
Normal file
@@ -0,0 +1,189 @@
|
|||||||
|
# Kapı 1 Güçlendirme PRD — Ücretsiz Değerden Ücretli Akışa
|
||||||
|
|
||||||
|
> Durum: Taslak v1 · Sahip: Bilal · Tarih: 6 Ağustos 2026
|
||||||
|
> Gösterim: 🔶 Varsayım (makul ama doğrulanmamış) · 🔵 Açık soru (keşif gerekiyor)
|
||||||
|
|
||||||
|
## 1. Yönetici Özeti
|
||||||
|
|
||||||
|
Sıralamasını girip `/sonuc`'u gören anonim YKS öğrencisine, giriş yapmadan önce ürünün asıl farklılaştırıcı değerini (yapay zekâ gerekçeli tercih satırı) tattıran ve harcadığı emeği (manuel liste + sihirbaz profili) "kaydet, kaybetme" gerekçesiyle girişe bağlayan bir deneyim kuruyoruz. Amaç **Kapı 1 dönüşümünü (sıra girişi → giriş)** artırmak; kapı ölçümleri ve kredi-bitti e-posta dönüşüyle döngüyü kapatmak. Fiyat ve kredi kurgusu (299 TL paket, 5 deneme kredisi, 3 kredi/liste) bu PRD'de sabittir.
|
||||||
|
|
||||||
|
## 2. Problem Tanımı
|
||||||
|
|
||||||
|
### Problemi kim yaşıyor?
|
||||||
|
Sıralamasını girip ücretsiz tabloyu gören ama giriş yapmayan anonim öğrenciler (ve ödemeyi çoğu zaman onaylayan velileri).
|
||||||
|
|
||||||
|
### Problem ne?
|
||||||
|
1. **Ürünün asıl değeri kapıdan önce görünmüyor.** Anonim kullanıcı `/sonuc`'ta yalnızca ham YÖK tablosunu görüyor; "yapay zekâ gerekçeli liste"nin nasıl bir şey olduğunu giriş yapıp 3 kredi harcayana kadar hiç tatmıyor. `?hazir=1` panelinin ikna gücü tamamen metne dayanıyor (`src/app/sonuc/sihirbaz-cagri-karti.tsx:262-292`).
|
||||||
|
2. **Kullanıcı emeği uçucu.** Manuel 24'lük liste ve sihirbaz profili yalnızca localStorage'da (`src/components/manuel-liste/store.ts:16`, `src/lib/sihirbaz.ts:36`); cihaz/tarayıcı değişince kayboluyor ve "listeni kaydet" doğal giriş gerekçesi olarak kullanılmıyor.
|
||||||
|
3. **Kapılarda ölçüm yok.** `hazir=1` panel gösterimi, paywall/kilit satır görüntülenmesi ve kredi bitişi için event yok (`src/lib/analitik.ts:14-25`'teki union'da karşılıkları yok). Hangi kapıda ne kadar döküldüğü bilinmiyor.
|
||||||
|
4. **Kredisi biten kullanıcı çıkmaz sokakta.** 5 deneme kredisi tam 1 liste + 2 soruya yetiyor; sonrasında ödeme yoksa kullanıcıyı geri çağıran hiçbir mekanizma yok.
|
||||||
|
|
||||||
|
### Neden acı verici?
|
||||||
|
- **Kullanıcı:** Tercih dönemi kısa ve stresli; değer görmeden hesap açmak ekstra sürtünme. Emeğinin kaybolması güveni zedeliyor.
|
||||||
|
- **İş:** Kapı 1 funnel'ın en kalabalık geçişi — burada kaybedilen her kullanıcı, alttaki ödeme dönüşümüne hiç ulaşmıyor. Ölçüm olmadığı için iyileştirme de doğrulanamıyor.
|
||||||
|
|
||||||
|
### Kanıt
|
||||||
|
- Kod: maskeleme sunucuda, anonim tarafta hiç AI çıktısı yok (`src/lib/rapor-maske.ts`); liste/profil client-only; event listesi eksik.
|
||||||
|
- 🔶 Kapı 1 dönüşümünün düşük olduğu varsayımdır — baseline yok. (Bu, ölçüm iş paketinin kendisini gerekçelendiriyor: İP-A önce baseline kurar.)
|
||||||
|
- 🔵 Rybbit'te mevcut `sira_girildi` → `giris_denendi` oranına bakılarak kaba bir baseline bugün çıkarılabilir mi?
|
||||||
|
|
||||||
|
## 3. Hedef Kullanıcılar ve Personalar
|
||||||
|
|
||||||
|
### Birincil: Sıralı Öğrenci
|
||||||
|
- YKS sonucu açıklanmış, elinde sıralaması var; tercih penceresi ~2 hafta.
|
||||||
|
- Mobil ağırlıklı, hızlı ve güven veren bir cevap arıyor; hesap açmaya karşı sürtünme eşiği yüksek.
|
||||||
|
- Davranış: sıralamasını girer, tabloyu karıştırır, birkaç program ekler, sekmesini kapatır — geri gelmesi garantili değil.
|
||||||
|
|
||||||
|
### İkincil: Veli
|
||||||
|
- Ödemenin fiili onaycısı; "danışman 2.000–10.000 TL, bu 299 TL" karşılaştırmasına duyarlı.
|
||||||
|
- Çocuğunun kurduğu listeyi görmek ve güvenilirlik sinyali (gerekçe, risk notu) ister.
|
||||||
|
|
||||||
|
## 4. Stratejik Bağlam
|
||||||
|
|
||||||
|
- **İş hedefi:** Tek seferlik 299 TL'lik ürünün geliri doğrudan Kapı 1 hacmiyle çarpılır; funnel'ın en üst geçişini iyileştirmek alttaki her adıma bileşik etki yapar.
|
||||||
|
- **Neden şimdi:** Ürün sezonluk — yoğunluk tercih döneminde. Sezon öncesi funnel'ın oturması gerekiyor; sezon içinde büyük değişiklik riskli.
|
||||||
|
- **Rekabet:** İnsan danışmanlar (2.000–10.000 TL) ve ücretsiz robotlar. Farklılaştırıcı, gerekçeli + risk analizli liste; bu değer şu an kapının arkasında saklı.
|
||||||
|
|
||||||
|
## 5. Çözüm Özeti — 4 İş Paketi
|
||||||
|
|
||||||
|
> Sıralama bilinçli: önce ölç (A), sonra değeri göster (B), emeği bağla (C), teaser'ı parlat (D).
|
||||||
|
|
||||||
|
### İP-A · Kapı ölçümü (temel)
|
||||||
|
Funnel'ın üç kapısına gösterim/sonuç event'leri eklenir; Kapı 1 baseline'ı kurulur.
|
||||||
|
- Yeni event'ler (`OlayAdi` union'ına): `hazir_panel_goruntulendi`, `giris_cta_tiklandi` (prop: `kaynak`), `kilit_goruntulendi` (paywall satırı/kartı viewport'a girince), `kredi_bitti` (KREDI hatası panelinde).
|
||||||
|
- Gösterim event'leri viewport-temelli ve oturum başına 1 kez; `siraKovasi` dışında ham veri gönderilmez (mevcut gizlilik deseni korunur).
|
||||||
|
|
||||||
|
### İP-B · Girişsiz yapay zekâ tadımlığı
|
||||||
|
Anonim kullanıcı `/sonuc`'ta, kendi sıra kovası + alan tercihine uyan **1 örnek tercih satırını gerçek ürün formatında** (gerekçe + risk notu + trend özeti) görür; hemen altında "24 satırın tamamı için giriş yap — 5 deneme kredin hazır" CTA'sı durur.
|
||||||
|
- **Maliyet/istismar tasarımı:** Tadımlık canlı AI çağrısıyla değil, **önceden üretilmiş havuzdan** servis edilir (sıra kovası × alan kombinasyonları için batch üretim; `src/lib/rapor-havuzu.ts` altyapısıyla ilişkisi 🔵 incelenecek). Anonim istek başına LLM maliyeti sıfır, prompt-injection yüzeyi yok.
|
||||||
|
- Tadımlık satır, gerçek rapor bileşeniyle (`rapor-listesi.tsx` satır formatı) birebir aynı görünür — "demo" değil "ürünün kendisi" hissi.
|
||||||
|
- 🔶 Tek satır yeterli tatma sağlar; 2+ satır ücretsiz değeri fazla büyütüp Kapı 1'i zayıflatabilir (guardrail metriğiyle izlenecek).
|
||||||
|
- 🔵 Tadımlık satırın programı nasıl seçilecek? (Kullanıcının manuel listesindeki ilk program mı, kovadaki en popüler program mı?)
|
||||||
|
|
||||||
|
### İP-C · Liste kaydetme = giriş gerekçesi
|
||||||
|
Manuel liste ve sihirbaz profili girişte sunucuya taşınır; anonim kullanıcıya emeği büyüdükçe "listen yalnızca bu tarayıcıda — kaydet" tetikleyicileri gösterilir.
|
||||||
|
- Şema: `savedLists` (userId unique, items JSON, profil JSON) — mevcut `reports` deseniyle aynı upsert yaklaşımı.
|
||||||
|
- Girişte merge: localStorage listesi sunucudakiyle birleşir (çakışmada localStorage kazanır, 24 sınırı korunur 🔶).
|
||||||
|
- Tetikleyiciler: liste 3+ programa ulaştığında bir kez gösterilen yumuşak banner; "Seçimlerim" panelinde kalıcı satır. Agresif exit-intent popup **yok**.
|
||||||
|
- Giriş sonrası dönen kullanıcı listesini her cihazda bulur — ürün "kaydettiğin yer" kimliği kazanır.
|
||||||
|
|
||||||
|
### İP-D · Teaser zenginleştirme (ikincil metrik: ödeme dönüşümü)
|
||||||
|
Maskeli rapor deneyiminde kilidin "ne sakladığı" daha somutlaştırılır:
|
||||||
|
- `uyarilar` tamamen boşaltılmak yerine **1 uyarı açık, kalanı "N uyarı daha kilitli"** göstergesi (`src/lib/rapor-maske.ts:41` değişir; maskeleme sunucuda kalır).
|
||||||
|
- Kilit satırı (`rapor-listesi.tsx:331-337`) satır sayısı + kişiye özel içerik iması taşır ("21 satırda senin sıralamana özel gerekçe ve risk notu hazır").
|
||||||
|
- Açık satır sayısı `ACIK_SATIR = 3` sabit kalır 🔶 (değiştirme kararı ölçüm sonrası ayrı deney).
|
||||||
|
|
||||||
|
### Kullanıcı akışı (hedef durum)
|
||||||
|
```
|
||||||
|
sıra girildi → /sonuc: ham tablo + TADIMLIK AI SATIRI (B)
|
||||||
|
→ manuel liste büyüdükçe "kaydet" tetikleyicisi (C)
|
||||||
|
→ sihirbaz biter → hazir=1 paneli [ölçülüyor] (A)
|
||||||
|
→ giriş (5 kredi) → liste üretimi → maskeli rapor (zengin teaser, D)
|
||||||
|
→ ödeme 299 TL
|
||||||
|
↳ kredi bitti [ölçülüyor] → 48 saat sonra hatırlatma e-postası (A)
|
||||||
|
```
|
||||||
|
|
||||||
|
## 6. Başarı Metrikleri
|
||||||
|
|
||||||
|
### Birincil
|
||||||
|
**Kapı 1 dönüşümü:** `sira_girildi` (tekil oturum) → başarılı giriş oranı.
|
||||||
|
- Mevcut: bilinmiyor → İP-A ilk 2 hafta baseline kurar.
|
||||||
|
- 🔶 Hedef: baseline'a göre **göreli +%30** (baseline netleşince revize edilir).
|
||||||
|
|
||||||
|
### İkincil
|
||||||
|
- `hazir_panel_goruntulendi` → `giris_cta_tiklandi` tıklama oranı.
|
||||||
|
- Giriş → `liste_olusturuldu` aktivasyon oranı.
|
||||||
|
- `kilit_goruntulendi` → `odeme_baslatildi` (İP-D'nin metriği).
|
||||||
|
- Kredi-bitti e-postası → geri dönüş oturumu oranı.
|
||||||
|
|
||||||
|
### Korkuluk (guardrail)
|
||||||
|
- **Ödeme dönüşümü düşmemeli:** tadımlık, ücretsiz katmanı "yeterli" hissettirip paketi kanibalize etmemeli.
|
||||||
|
- **AI maliyeti artmamalı:** tadımlık batch-üretim; anonim trafik LLM'e istek atmaz.
|
||||||
|
- `/sonuc` LCP/performans gerilemez; ham tablo "her zaman ücretsiz" vaadi korunur.
|
||||||
|
|
||||||
|
## 7. Kullanıcı Hikâyeleri ve Gereksinimler
|
||||||
|
|
||||||
|
### Epik hipotezi
|
||||||
|
Anonim kullanıcıya gerçek ürün formatında bir yapay zekâ tadımlığı gösterip emeğini kaydetme gerekçesiyle girişe bağlarsak, Kapı 1 dönüşümü artar; çünkü kullanıcı bugün ne alacağını görmeden ve emeğini korumak için hiçbir neden olmadan hesap açmaya itiliyor. Başarıyı `sira_girildi → giriş` oranıyla ölçeceğiz.
|
||||||
|
|
||||||
|
### Hikâyeler
|
||||||
|
|
||||||
|
**A1 — Kapı event'leri.** Ürün sahibi olarak funnel'ın her kapısında gösterim ve sonuç sayısını görmek istiyorum.
|
||||||
|
- [ ] `hazir_panel_goruntulendi`, `giris_cta_tiklandi(kaynak)`, `kilit_goruntulendi(yer)`, `kredi_bitti` event'leri `OlayAdi` union'ına eklendi ve ilgili bileşenlerde ateşleniyor.
|
||||||
|
- [ ] Gösterim event'leri IntersectionObserver ile, oturum başına en fazla 1 kez.
|
||||||
|
- [ ] Ham sıra gönderilmiyor; `siraKovasi` deseni korunuyor.
|
||||||
|
|
||||||
|
**A2 — Kredi-bitti dönüş e-postası.** Kredisi biten kullanıcı olarak, listemin beni beklediğini hatırlatan bir e-posta almak istiyorum.
|
||||||
|
- [ ] `kredi_bitti` durumuna düşen kullanıcıya 48 saat sonra tek seferlik e-posta (Resend, `eposta.ts` şablon dili).
|
||||||
|
- [ ] E-posta `/listem`'e deep-link verir; ödeme baskısı ikinci planda, "3 açık satırın hazır" birinci planda.
|
||||||
|
- [ ] 🔵 Gönderim zamanlaması için altyapı: cron/queue mu, giriş anında lazy-check mi?
|
||||||
|
- [ ] 🔵 KVKK: işlemsel hatırlatma mı pazarlama izni gerektiren ileti mi — hukuki sınıflandırma netleşecek.
|
||||||
|
|
||||||
|
**B1 — Tadımlık satır.** Anonim kullanıcı olarak, sıralamama uygun bir programın yapay zekâ gerekçesini giriş yapmadan görmek istiyorum.
|
||||||
|
- [ ] `/sonuc`'ta, sıra kovası + (varsa) sihirbaz alan tercihine uyan 1 tadımlık satır gerçek rapor satırı formatında render edilir.
|
||||||
|
- [ ] İçerik önceden üretilmiş havuzdan gelir; anonim istek LLM'e gitmez.
|
||||||
|
- [ ] Satırın altında giriş CTA'sı: metin sonunda `ArrowRight`, `Sparkles` yok (CTA kuralı).
|
||||||
|
- [ ] Havuzda uygun içerik yoksa bileşen hiç render edilmez (boş/generic tadımlık gösterilmez).
|
||||||
|
- [ ] 🔵 Havuz üretim kapsamı: kova × alan kombinasyon sayısı ve tazeleme sıklığı.
|
||||||
|
|
||||||
|
**C1 — Liste sunucuya taşınır.** Giriş yapan kullanıcı olarak, anonimken kurduğum listeyi hesabımda bulmak istiyorum.
|
||||||
|
- [ ] Girişte localStorage listesi + sihirbaz profili sunucuya merge edilir (çakışmada client kazanır, 24 sınırı aşılmaz).
|
||||||
|
- [ ] Farklı cihazdan girişte liste sunucudan yüklenir; localStorage ile iki yönlü senkron kuralı belgelenir.
|
||||||
|
- [ ] Merge idempotent — çift giriş çift kayıt üretmez.
|
||||||
|
|
||||||
|
**C2 — Kaydet tetikleyicisi.** Anonim kullanıcı olarak, listem büyüdüğünde kaybolabileceğini öğrenmek istiyorum.
|
||||||
|
- [ ] Liste 3. programa ulaştığında bir kez yumuşak banner: "Listen yalnızca bu tarayıcıda — giriş yap, kaydet."
|
||||||
|
- [ ] "Seçimlerim" panelinde kalıcı "listeni kaydet" satırı.
|
||||||
|
- [ ] Banner kapatılabilir; kapatma oturumda kalıcı. Exit-intent popup yok.
|
||||||
|
|
||||||
|
**D1 — Zengin teaser.** Maskeli raporu gören kullanıcı olarak, kilidin arkasında ne olduğunu somut görmek istiyorum.
|
||||||
|
- [ ] `uyarilar`dan 1 tanesi açık, kalanı "N uyarı daha kilitli" sayacıyla gösterilir; maskeleme sunucuda kalır.
|
||||||
|
- [ ] Kilit satırı kişiselleştirilmiş metin taşır (kalan satır sayısı + "senin sıralamana özel").
|
||||||
|
- [ ] `?acildi=1` unblur akışı bozulmaz.
|
||||||
|
|
||||||
|
### Kısıtlar
|
||||||
|
- Maskeleme ve tadımlık seçimi **her zaman sunucuda** — kilitli gerçek içerik client'a asla inmez.
|
||||||
|
- Badge/eyebrow, kapatma çarpısı ve CTA ok deseni proje kurallarına uyar (`AGENTS.md`).
|
||||||
|
- Sihirbaz/liste mimarisinde davranış değişirse `/meraklisina` şeması aynı commit'te güncellenir (`src/app/meraklisina/huni-semasi.tsx`).
|
||||||
|
|
||||||
|
## 8. Kapsam Dışı
|
||||||
|
|
||||||
|
- Fiyat, paket yapısı, kredi miktarları (sabit — kullanıcı kararı).
|
||||||
|
- Abonelik, ara paket, referral programı.
|
||||||
|
- Canlı AI tadımlığı (anonim kullanıcıya gerçek zamanlı LLM çağrısı).
|
||||||
|
- Exit-intent popup ve agresif e-posta dizileri.
|
||||||
|
- `ACIK_SATIR` sayısını değiştirme (ölçüm sonrası ayrı deney).
|
||||||
|
- Mobil uygulama, push notification.
|
||||||
|
|
||||||
|
## 9. Bağımlılıklar ve Riskler
|
||||||
|
|
||||||
|
### Bağımlılıklar
|
||||||
|
- **E-posta:** Resend + `eposta.ts` şablonları hazır; yalnızca yeni şablon + tetikleme mekanizması gerekir.
|
||||||
|
- **Tadımlık havuzu:** `rapor-havuzu.ts` mevcut altyapısının kapsamı incelenecek 🔵; batch üretim script'i gerekebilir.
|
||||||
|
- **Şema değişikliği:** `savedLists` tablosu (drizzle migration).
|
||||||
|
- **`/meraklisina` şema senkronu:** İP-B ve İP-C davranış değiştiriyor → şema + anlatım metni aynı PR'da güncellenir.
|
||||||
|
|
||||||
|
### Riskler
|
||||||
|
- **Kanibalizasyon:** Tadımlık + zengin teaser ücretsiz deneyimi "yeterli" hissettirebilir. → Korkuluk metriği; tadımlık 1 satırda sabit başlar.
|
||||||
|
- **Baseline'sız iterasyon:** A'dan önce B/C/D'ye başlanırsa etki ölçülemez. → İP-A her zaman önce gider; B/C/D en az 2 hafta baseline'dan sonra açılır 🔶.
|
||||||
|
- **Merge karmaşası (C1):** İki cihazda farklı listeler → sessiz veri kaybı algısı. → Çakışma kuralı basit ve tek yönlü tutulur, edge case'ler kabul kriterlerinde.
|
||||||
|
- **Sezon zamanlaması:** Yoğun dönemde funnel değişikliği riskli. → Sezon öncesi yayın; sezon içi yalnızca metin/ölçüm ayarı.
|
||||||
|
- **KVKK/e-posta:** Hatırlatma e-postasının hukuki sınıfı belirsiz 🔵 → netleşene dek A2 yalnızca işlemsel dille yazılır.
|
||||||
|
|
||||||
|
## 10. Açık Sorular
|
||||||
|
|
||||||
|
1. 🔵 Rybbit'teki mevcut event'lerden bugün kaba bir Kapı 1 baseline'ı çıkarılabilir mi (`sira_girildi` vs `giris_denendi` tekil oranı)?
|
||||||
|
2. 🔵 Tadımlık satırın program seçimi: manuel listedeki ilk program mı, kova için önceden seçilmiş popüler program mı?
|
||||||
|
3. 🔵 `rapor-havuzu.ts` bugün ne yapıyor; tadımlık havuzu onun üstüne mi kurulur?
|
||||||
|
4. 🔵 Kredi-bitti e-postası için zamanlama altyapısı (cron vs lazy-check) ve KVKK sınıfı.
|
||||||
|
5. 🔵 `savedLists` mi yoksa mevcut `reports.params` üzerinde genişletme mi — şema kararı.
|
||||||
|
6. 🔶 +%30 göreli hedef baseline sonrası revize edilecek.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Öz Değerlendirme (şablon gereği)
|
||||||
|
|
||||||
|
- **En güçlü bölüm:** Problem tanımı — kod referanslarıyla somut.
|
||||||
|
- **En zayıf bölüm:** Başarı metrikleri — baseline yok; hedefler İP-A tamamlanana dek varsayımsal.
|
||||||
|
- **Önce doğrulanacak varsayımlar:** (1) Kapı 1 dönüşümünün gerçekten düşük olduğu, (2) tek satır tadımlığın kanibalize etmeden ikna ettiği.
|
||||||
|
- **Önerilen ilk adım:** İP-A'yı uygula (küçük, risksiz, 1-2 gün) + Rybbit'ten retrospektif baseline denemesi; 2 hafta veriyle B/C önceliği netleştir.
|
||||||
131
drizzle/0000_baslangic.sql
Normal file
@@ -0,0 +1,131 @@
|
|||||||
|
CREATE TABLE `account` (
|
||||||
|
`id` text PRIMARY KEY NOT NULL,
|
||||||
|
`account_id` text NOT NULL,
|
||||||
|
`provider_id` text NOT NULL,
|
||||||
|
`user_id` text NOT NULL,
|
||||||
|
`access_token` text,
|
||||||
|
`refresh_token` text,
|
||||||
|
`id_token` text,
|
||||||
|
`access_token_expires_at` integer,
|
||||||
|
`refresh_token_expires_at` integer,
|
||||||
|
`scope` text,
|
||||||
|
`password` text,
|
||||||
|
`created_at` integer NOT NULL,
|
||||||
|
`updated_at` integer NOT NULL,
|
||||||
|
FOREIGN KEY (`user_id`) REFERENCES `user`(`id`) ON UPDATE no action ON DELETE cascade
|
||||||
|
);
|
||||||
|
--> statement-breakpoint
|
||||||
|
CREATE TABLE `chat_messages` (
|
||||||
|
`id` text PRIMARY KEY NOT NULL,
|
||||||
|
`user_id` text NOT NULL,
|
||||||
|
`role` text NOT NULL,
|
||||||
|
`content` text NOT NULL,
|
||||||
|
`client_message_id` text,
|
||||||
|
`created_at` integer NOT NULL,
|
||||||
|
FOREIGN KEY (`user_id`) REFERENCES `user`(`id`) ON UPDATE no action ON DELETE no action
|
||||||
|
);
|
||||||
|
--> statement-breakpoint
|
||||||
|
CREATE UNIQUE INDEX `chat_messages_client_message_id_unique` ON `chat_messages` (`client_message_id`);--> statement-breakpoint
|
||||||
|
CREATE INDEX `chat_user_created` ON `chat_messages` (`user_id`,`created_at`);--> statement-breakpoint
|
||||||
|
CREATE TABLE `credit_ledger` (
|
||||||
|
`id` text PRIMARY KEY NOT NULL,
|
||||||
|
`user_id` text NOT NULL,
|
||||||
|
`delta` integer NOT NULL,
|
||||||
|
`reason` text NOT NULL,
|
||||||
|
`ref_id` text,
|
||||||
|
`created_at` integer NOT NULL,
|
||||||
|
FOREIGN KEY (`user_id`) REFERENCES `user`(`id`) ON UPDATE no action ON DELETE no action
|
||||||
|
);
|
||||||
|
--> statement-breakpoint
|
||||||
|
CREATE UNIQUE INDEX `ledger_reason_ref` ON `credit_ledger` (`reason`,`ref_id`);--> statement-breakpoint
|
||||||
|
CREATE INDEX `ledger_user` ON `credit_ledger` (`user_id`);--> statement-breakpoint
|
||||||
|
CREATE TABLE `orders` (
|
||||||
|
`id` text PRIMARY KEY NOT NULL,
|
||||||
|
`user_id` text NOT NULL,
|
||||||
|
`product` text NOT NULL,
|
||||||
|
`amount_kurus` integer NOT NULL,
|
||||||
|
`credits` integer NOT NULL,
|
||||||
|
`status` text DEFAULT 'pending' NOT NULL,
|
||||||
|
`iyzico_token` text,
|
||||||
|
`iyzico_payment_id` text,
|
||||||
|
`created_at` integer NOT NULL,
|
||||||
|
`paid_at` integer,
|
||||||
|
FOREIGN KEY (`user_id`) REFERENCES `user`(`id`) ON UPDATE no action ON DELETE no action
|
||||||
|
);
|
||||||
|
--> statement-breakpoint
|
||||||
|
CREATE INDEX `orders_user` ON `orders` (`user_id`);--> statement-breakpoint
|
||||||
|
CREATE TABLE `reports` (
|
||||||
|
`id` text PRIMARY KEY NOT NULL,
|
||||||
|
`user_id` text NOT NULL,
|
||||||
|
`params` text NOT NULL,
|
||||||
|
`result` text,
|
||||||
|
`revision_count` integer DEFAULT 0 NOT NULL,
|
||||||
|
`created_at` integer NOT NULL,
|
||||||
|
`updated_at` integer NOT NULL,
|
||||||
|
FOREIGN KEY (`user_id`) REFERENCES `user`(`id`) ON UPDATE no action ON DELETE no action
|
||||||
|
);
|
||||||
|
--> statement-breakpoint
|
||||||
|
CREATE UNIQUE INDEX `reports_user_id_unique` ON `reports` (`user_id`);--> statement-breakpoint
|
||||||
|
CREATE TABLE `saved_lists` (
|
||||||
|
`id` text PRIMARY KEY NOT NULL,
|
||||||
|
`user_id` text NOT NULL,
|
||||||
|
`items` text NOT NULL,
|
||||||
|
`profil` text,
|
||||||
|
`created_at` integer NOT NULL,
|
||||||
|
`updated_at` integer NOT NULL,
|
||||||
|
FOREIGN KEY (`user_id`) REFERENCES `user`(`id`) ON UPDATE no action ON DELETE no action
|
||||||
|
);
|
||||||
|
--> statement-breakpoint
|
||||||
|
CREATE UNIQUE INDEX `saved_lists_user_id_unique` ON `saved_lists` (`user_id`);--> statement-breakpoint
|
||||||
|
CREATE TABLE `session` (
|
||||||
|
`id` text PRIMARY KEY NOT NULL,
|
||||||
|
`expires_at` integer NOT NULL,
|
||||||
|
`token` text NOT NULL,
|
||||||
|
`ip_address` text,
|
||||||
|
`user_agent` text,
|
||||||
|
`user_id` text NOT NULL,
|
||||||
|
`created_at` integer NOT NULL,
|
||||||
|
`updated_at` integer NOT NULL,
|
||||||
|
FOREIGN KEY (`user_id`) REFERENCES `user`(`id`) ON UPDATE no action ON DELETE cascade
|
||||||
|
);
|
||||||
|
--> statement-breakpoint
|
||||||
|
CREATE UNIQUE INDEX `session_token_unique` ON `session` (`token`);--> statement-breakpoint
|
||||||
|
CREATE TABLE `tadimlik_havuzu` (
|
||||||
|
`id` text PRIMARY KEY NOT NULL,
|
||||||
|
`kova_slug` text NOT NULL,
|
||||||
|
`tur` text NOT NULL,
|
||||||
|
`kategori_slug` text NOT NULL,
|
||||||
|
`program_id` text NOT NULL,
|
||||||
|
`dilim` text NOT NULL,
|
||||||
|
`gerekce` text NOT NULL,
|
||||||
|
`risk_notu` text NOT NULL,
|
||||||
|
`trend_ozeti` text NOT NULL,
|
||||||
|
`program` text NOT NULL,
|
||||||
|
`ornek_sira` integer NOT NULL,
|
||||||
|
`uretim_at` integer NOT NULL
|
||||||
|
);
|
||||||
|
--> statement-breakpoint
|
||||||
|
CREATE UNIQUE INDEX `tadimlik_anahtar` ON `tadimlik_havuzu` (`kova_slug`,`tur`,`kategori_slug`);--> statement-breakpoint
|
||||||
|
CREATE TABLE `user` (
|
||||||
|
`id` text PRIMARY KEY NOT NULL,
|
||||||
|
`name` text NOT NULL,
|
||||||
|
`email` text NOT NULL,
|
||||||
|
`email_verified` integer DEFAULT false NOT NULL,
|
||||||
|
`image` text,
|
||||||
|
`credit_balance` integer DEFAULT 0 NOT NULL,
|
||||||
|
`has_paket` integer DEFAULT false NOT NULL,
|
||||||
|
`kredi_bitti_at` integer,
|
||||||
|
`kredi_hatirlatma_gonderildi_at` integer,
|
||||||
|
`created_at` integer NOT NULL,
|
||||||
|
`updated_at` integer NOT NULL
|
||||||
|
);
|
||||||
|
--> statement-breakpoint
|
||||||
|
CREATE UNIQUE INDEX `user_email_unique` ON `user` (`email`);--> statement-breakpoint
|
||||||
|
CREATE TABLE `verification` (
|
||||||
|
`id` text PRIMARY KEY NOT NULL,
|
||||||
|
`identifier` text NOT NULL,
|
||||||
|
`value` text NOT NULL,
|
||||||
|
`expires_at` integer NOT NULL,
|
||||||
|
`created_at` integer,
|
||||||
|
`updated_at` integer
|
||||||
|
);
|
||||||
898
drizzle/meta/0000_snapshot.json
Normal file
@@ -0,0 +1,898 @@
|
|||||||
|
{
|
||||||
|
"version": "6",
|
||||||
|
"dialect": "sqlite",
|
||||||
|
"id": "a802fded-01d5-4d17-8b6f-fca5dfc2920d",
|
||||||
|
"prevId": "00000000-0000-0000-0000-000000000000",
|
||||||
|
"tables": {
|
||||||
|
"account": {
|
||||||
|
"name": "account",
|
||||||
|
"columns": {
|
||||||
|
"id": {
|
||||||
|
"name": "id",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": true,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"account_id": {
|
||||||
|
"name": "account_id",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"provider_id": {
|
||||||
|
"name": "provider_id",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"user_id": {
|
||||||
|
"name": "user_id",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"access_token": {
|
||||||
|
"name": "access_token",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"refresh_token": {
|
||||||
|
"name": "refresh_token",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"id_token": {
|
||||||
|
"name": "id_token",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"access_token_expires_at": {
|
||||||
|
"name": "access_token_expires_at",
|
||||||
|
"type": "integer",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"refresh_token_expires_at": {
|
||||||
|
"name": "refresh_token_expires_at",
|
||||||
|
"type": "integer",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"scope": {
|
||||||
|
"name": "scope",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"password": {
|
||||||
|
"name": "password",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"created_at": {
|
||||||
|
"name": "created_at",
|
||||||
|
"type": "integer",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"updated_at": {
|
||||||
|
"name": "updated_at",
|
||||||
|
"type": "integer",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"indexes": {},
|
||||||
|
"foreignKeys": {
|
||||||
|
"account_user_id_user_id_fk": {
|
||||||
|
"name": "account_user_id_user_id_fk",
|
||||||
|
"tableFrom": "account",
|
||||||
|
"tableTo": "user",
|
||||||
|
"columnsFrom": [
|
||||||
|
"user_id"
|
||||||
|
],
|
||||||
|
"columnsTo": [
|
||||||
|
"id"
|
||||||
|
],
|
||||||
|
"onDelete": "cascade",
|
||||||
|
"onUpdate": "no action"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"compositePrimaryKeys": {},
|
||||||
|
"uniqueConstraints": {},
|
||||||
|
"checkConstraints": {}
|
||||||
|
},
|
||||||
|
"chat_messages": {
|
||||||
|
"name": "chat_messages",
|
||||||
|
"columns": {
|
||||||
|
"id": {
|
||||||
|
"name": "id",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": true,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"user_id": {
|
||||||
|
"name": "user_id",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"role": {
|
||||||
|
"name": "role",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"content": {
|
||||||
|
"name": "content",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"client_message_id": {
|
||||||
|
"name": "client_message_id",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"created_at": {
|
||||||
|
"name": "created_at",
|
||||||
|
"type": "integer",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"indexes": {
|
||||||
|
"chat_messages_client_message_id_unique": {
|
||||||
|
"name": "chat_messages_client_message_id_unique",
|
||||||
|
"columns": [
|
||||||
|
"client_message_id"
|
||||||
|
],
|
||||||
|
"isUnique": true
|
||||||
|
},
|
||||||
|
"chat_user_created": {
|
||||||
|
"name": "chat_user_created",
|
||||||
|
"columns": [
|
||||||
|
"user_id",
|
||||||
|
"created_at"
|
||||||
|
],
|
||||||
|
"isUnique": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"foreignKeys": {
|
||||||
|
"chat_messages_user_id_user_id_fk": {
|
||||||
|
"name": "chat_messages_user_id_user_id_fk",
|
||||||
|
"tableFrom": "chat_messages",
|
||||||
|
"tableTo": "user",
|
||||||
|
"columnsFrom": [
|
||||||
|
"user_id"
|
||||||
|
],
|
||||||
|
"columnsTo": [
|
||||||
|
"id"
|
||||||
|
],
|
||||||
|
"onDelete": "no action",
|
||||||
|
"onUpdate": "no action"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"compositePrimaryKeys": {},
|
||||||
|
"uniqueConstraints": {},
|
||||||
|
"checkConstraints": {}
|
||||||
|
},
|
||||||
|
"credit_ledger": {
|
||||||
|
"name": "credit_ledger",
|
||||||
|
"columns": {
|
||||||
|
"id": {
|
||||||
|
"name": "id",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": true,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"user_id": {
|
||||||
|
"name": "user_id",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"delta": {
|
||||||
|
"name": "delta",
|
||||||
|
"type": "integer",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"reason": {
|
||||||
|
"name": "reason",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"ref_id": {
|
||||||
|
"name": "ref_id",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"created_at": {
|
||||||
|
"name": "created_at",
|
||||||
|
"type": "integer",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"indexes": {
|
||||||
|
"ledger_reason_ref": {
|
||||||
|
"name": "ledger_reason_ref",
|
||||||
|
"columns": [
|
||||||
|
"reason",
|
||||||
|
"ref_id"
|
||||||
|
],
|
||||||
|
"isUnique": true
|
||||||
|
},
|
||||||
|
"ledger_user": {
|
||||||
|
"name": "ledger_user",
|
||||||
|
"columns": [
|
||||||
|
"user_id"
|
||||||
|
],
|
||||||
|
"isUnique": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"foreignKeys": {
|
||||||
|
"credit_ledger_user_id_user_id_fk": {
|
||||||
|
"name": "credit_ledger_user_id_user_id_fk",
|
||||||
|
"tableFrom": "credit_ledger",
|
||||||
|
"tableTo": "user",
|
||||||
|
"columnsFrom": [
|
||||||
|
"user_id"
|
||||||
|
],
|
||||||
|
"columnsTo": [
|
||||||
|
"id"
|
||||||
|
],
|
||||||
|
"onDelete": "no action",
|
||||||
|
"onUpdate": "no action"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"compositePrimaryKeys": {},
|
||||||
|
"uniqueConstraints": {},
|
||||||
|
"checkConstraints": {}
|
||||||
|
},
|
||||||
|
"orders": {
|
||||||
|
"name": "orders",
|
||||||
|
"columns": {
|
||||||
|
"id": {
|
||||||
|
"name": "id",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": true,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"user_id": {
|
||||||
|
"name": "user_id",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"product": {
|
||||||
|
"name": "product",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"amount_kurus": {
|
||||||
|
"name": "amount_kurus",
|
||||||
|
"type": "integer",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"credits": {
|
||||||
|
"name": "credits",
|
||||||
|
"type": "integer",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"status": {
|
||||||
|
"name": "status",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false,
|
||||||
|
"default": "'pending'"
|
||||||
|
},
|
||||||
|
"iyzico_token": {
|
||||||
|
"name": "iyzico_token",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"iyzico_payment_id": {
|
||||||
|
"name": "iyzico_payment_id",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"created_at": {
|
||||||
|
"name": "created_at",
|
||||||
|
"type": "integer",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"paid_at": {
|
||||||
|
"name": "paid_at",
|
||||||
|
"type": "integer",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false,
|
||||||
|
"autoincrement": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"indexes": {
|
||||||
|
"orders_user": {
|
||||||
|
"name": "orders_user",
|
||||||
|
"columns": [
|
||||||
|
"user_id"
|
||||||
|
],
|
||||||
|
"isUnique": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"foreignKeys": {
|
||||||
|
"orders_user_id_user_id_fk": {
|
||||||
|
"name": "orders_user_id_user_id_fk",
|
||||||
|
"tableFrom": "orders",
|
||||||
|
"tableTo": "user",
|
||||||
|
"columnsFrom": [
|
||||||
|
"user_id"
|
||||||
|
],
|
||||||
|
"columnsTo": [
|
||||||
|
"id"
|
||||||
|
],
|
||||||
|
"onDelete": "no action",
|
||||||
|
"onUpdate": "no action"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"compositePrimaryKeys": {},
|
||||||
|
"uniqueConstraints": {},
|
||||||
|
"checkConstraints": {}
|
||||||
|
},
|
||||||
|
"reports": {
|
||||||
|
"name": "reports",
|
||||||
|
"columns": {
|
||||||
|
"id": {
|
||||||
|
"name": "id",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": true,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"user_id": {
|
||||||
|
"name": "user_id",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"params": {
|
||||||
|
"name": "params",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"result": {
|
||||||
|
"name": "result",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"revision_count": {
|
||||||
|
"name": "revision_count",
|
||||||
|
"type": "integer",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false,
|
||||||
|
"default": 0
|
||||||
|
},
|
||||||
|
"created_at": {
|
||||||
|
"name": "created_at",
|
||||||
|
"type": "integer",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"updated_at": {
|
||||||
|
"name": "updated_at",
|
||||||
|
"type": "integer",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"indexes": {
|
||||||
|
"reports_user_id_unique": {
|
||||||
|
"name": "reports_user_id_unique",
|
||||||
|
"columns": [
|
||||||
|
"user_id"
|
||||||
|
],
|
||||||
|
"isUnique": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"foreignKeys": {
|
||||||
|
"reports_user_id_user_id_fk": {
|
||||||
|
"name": "reports_user_id_user_id_fk",
|
||||||
|
"tableFrom": "reports",
|
||||||
|
"tableTo": "user",
|
||||||
|
"columnsFrom": [
|
||||||
|
"user_id"
|
||||||
|
],
|
||||||
|
"columnsTo": [
|
||||||
|
"id"
|
||||||
|
],
|
||||||
|
"onDelete": "no action",
|
||||||
|
"onUpdate": "no action"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"compositePrimaryKeys": {},
|
||||||
|
"uniqueConstraints": {},
|
||||||
|
"checkConstraints": {}
|
||||||
|
},
|
||||||
|
"saved_lists": {
|
||||||
|
"name": "saved_lists",
|
||||||
|
"columns": {
|
||||||
|
"id": {
|
||||||
|
"name": "id",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": true,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"user_id": {
|
||||||
|
"name": "user_id",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"items": {
|
||||||
|
"name": "items",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"profil": {
|
||||||
|
"name": "profil",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"created_at": {
|
||||||
|
"name": "created_at",
|
||||||
|
"type": "integer",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"updated_at": {
|
||||||
|
"name": "updated_at",
|
||||||
|
"type": "integer",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"indexes": {
|
||||||
|
"saved_lists_user_id_unique": {
|
||||||
|
"name": "saved_lists_user_id_unique",
|
||||||
|
"columns": [
|
||||||
|
"user_id"
|
||||||
|
],
|
||||||
|
"isUnique": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"foreignKeys": {
|
||||||
|
"saved_lists_user_id_user_id_fk": {
|
||||||
|
"name": "saved_lists_user_id_user_id_fk",
|
||||||
|
"tableFrom": "saved_lists",
|
||||||
|
"tableTo": "user",
|
||||||
|
"columnsFrom": [
|
||||||
|
"user_id"
|
||||||
|
],
|
||||||
|
"columnsTo": [
|
||||||
|
"id"
|
||||||
|
],
|
||||||
|
"onDelete": "no action",
|
||||||
|
"onUpdate": "no action"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"compositePrimaryKeys": {},
|
||||||
|
"uniqueConstraints": {},
|
||||||
|
"checkConstraints": {}
|
||||||
|
},
|
||||||
|
"session": {
|
||||||
|
"name": "session",
|
||||||
|
"columns": {
|
||||||
|
"id": {
|
||||||
|
"name": "id",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": true,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"expires_at": {
|
||||||
|
"name": "expires_at",
|
||||||
|
"type": "integer",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"token": {
|
||||||
|
"name": "token",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"ip_address": {
|
||||||
|
"name": "ip_address",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"user_agent": {
|
||||||
|
"name": "user_agent",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"user_id": {
|
||||||
|
"name": "user_id",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"created_at": {
|
||||||
|
"name": "created_at",
|
||||||
|
"type": "integer",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"updated_at": {
|
||||||
|
"name": "updated_at",
|
||||||
|
"type": "integer",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"indexes": {
|
||||||
|
"session_token_unique": {
|
||||||
|
"name": "session_token_unique",
|
||||||
|
"columns": [
|
||||||
|
"token"
|
||||||
|
],
|
||||||
|
"isUnique": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"foreignKeys": {
|
||||||
|
"session_user_id_user_id_fk": {
|
||||||
|
"name": "session_user_id_user_id_fk",
|
||||||
|
"tableFrom": "session",
|
||||||
|
"tableTo": "user",
|
||||||
|
"columnsFrom": [
|
||||||
|
"user_id"
|
||||||
|
],
|
||||||
|
"columnsTo": [
|
||||||
|
"id"
|
||||||
|
],
|
||||||
|
"onDelete": "cascade",
|
||||||
|
"onUpdate": "no action"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"compositePrimaryKeys": {},
|
||||||
|
"uniqueConstraints": {},
|
||||||
|
"checkConstraints": {}
|
||||||
|
},
|
||||||
|
"tadimlik_havuzu": {
|
||||||
|
"name": "tadimlik_havuzu",
|
||||||
|
"columns": {
|
||||||
|
"id": {
|
||||||
|
"name": "id",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": true,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"kova_slug": {
|
||||||
|
"name": "kova_slug",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"tur": {
|
||||||
|
"name": "tur",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"kategori_slug": {
|
||||||
|
"name": "kategori_slug",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"program_id": {
|
||||||
|
"name": "program_id",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"dilim": {
|
||||||
|
"name": "dilim",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"gerekce": {
|
||||||
|
"name": "gerekce",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"risk_notu": {
|
||||||
|
"name": "risk_notu",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"trend_ozeti": {
|
||||||
|
"name": "trend_ozeti",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"program": {
|
||||||
|
"name": "program",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"ornek_sira": {
|
||||||
|
"name": "ornek_sira",
|
||||||
|
"type": "integer",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"uretim_at": {
|
||||||
|
"name": "uretim_at",
|
||||||
|
"type": "integer",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"indexes": {
|
||||||
|
"tadimlik_anahtar": {
|
||||||
|
"name": "tadimlik_anahtar",
|
||||||
|
"columns": [
|
||||||
|
"kova_slug",
|
||||||
|
"tur",
|
||||||
|
"kategori_slug"
|
||||||
|
],
|
||||||
|
"isUnique": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"foreignKeys": {},
|
||||||
|
"compositePrimaryKeys": {},
|
||||||
|
"uniqueConstraints": {},
|
||||||
|
"checkConstraints": {}
|
||||||
|
},
|
||||||
|
"user": {
|
||||||
|
"name": "user",
|
||||||
|
"columns": {
|
||||||
|
"id": {
|
||||||
|
"name": "id",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": true,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"name": {
|
||||||
|
"name": "name",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"email": {
|
||||||
|
"name": "email",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"email_verified": {
|
||||||
|
"name": "email_verified",
|
||||||
|
"type": "integer",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false,
|
||||||
|
"default": false
|
||||||
|
},
|
||||||
|
"image": {
|
||||||
|
"name": "image",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"credit_balance": {
|
||||||
|
"name": "credit_balance",
|
||||||
|
"type": "integer",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false,
|
||||||
|
"default": 0
|
||||||
|
},
|
||||||
|
"has_paket": {
|
||||||
|
"name": "has_paket",
|
||||||
|
"type": "integer",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false,
|
||||||
|
"default": false
|
||||||
|
},
|
||||||
|
"kredi_bitti_at": {
|
||||||
|
"name": "kredi_bitti_at",
|
||||||
|
"type": "integer",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"kredi_hatirlatma_gonderildi_at": {
|
||||||
|
"name": "kredi_hatirlatma_gonderildi_at",
|
||||||
|
"type": "integer",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"created_at": {
|
||||||
|
"name": "created_at",
|
||||||
|
"type": "integer",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"updated_at": {
|
||||||
|
"name": "updated_at",
|
||||||
|
"type": "integer",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"indexes": {
|
||||||
|
"user_email_unique": {
|
||||||
|
"name": "user_email_unique",
|
||||||
|
"columns": [
|
||||||
|
"email"
|
||||||
|
],
|
||||||
|
"isUnique": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"foreignKeys": {},
|
||||||
|
"compositePrimaryKeys": {},
|
||||||
|
"uniqueConstraints": {},
|
||||||
|
"checkConstraints": {}
|
||||||
|
},
|
||||||
|
"verification": {
|
||||||
|
"name": "verification",
|
||||||
|
"columns": {
|
||||||
|
"id": {
|
||||||
|
"name": "id",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": true,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"identifier": {
|
||||||
|
"name": "identifier",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"value": {
|
||||||
|
"name": "value",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"expires_at": {
|
||||||
|
"name": "expires_at",
|
||||||
|
"type": "integer",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"created_at": {
|
||||||
|
"name": "created_at",
|
||||||
|
"type": "integer",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false,
|
||||||
|
"autoincrement": false
|
||||||
|
},
|
||||||
|
"updated_at": {
|
||||||
|
"name": "updated_at",
|
||||||
|
"type": "integer",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false,
|
||||||
|
"autoincrement": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"indexes": {},
|
||||||
|
"foreignKeys": {},
|
||||||
|
"compositePrimaryKeys": {},
|
||||||
|
"uniqueConstraints": {},
|
||||||
|
"checkConstraints": {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"views": {},
|
||||||
|
"enums": {},
|
||||||
|
"_meta": {
|
||||||
|
"schemas": {},
|
||||||
|
"tables": {},
|
||||||
|
"columns": {}
|
||||||
|
},
|
||||||
|
"internal": {
|
||||||
|
"indexes": {}
|
||||||
|
}
|
||||||
|
}
|
||||||
13
drizzle/meta/_journal.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"version": "7",
|
||||||
|
"dialect": "sqlite",
|
||||||
|
"entries": [
|
||||||
|
{
|
||||||
|
"idx": 0,
|
||||||
|
"version": "6",
|
||||||
|
"when": 1786053613118,
|
||||||
|
"tag": "0000_baslangic",
|
||||||
|
"breakpoints": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -1,13 +1,50 @@
|
|||||||
import type { NextConfig } from "next";
|
import type { NextConfig } from "next";
|
||||||
|
|
||||||
|
// Dockerfile builder katmanı BUILD_KAYNAK_KISITLI=1 verir: imaj build'i prod
|
||||||
|
// VPS'te çalışan uygulamayla aynı makinede koştuğu için bellek/paralellik kısılır.
|
||||||
|
// Lokal build ve dev bu kısıtlardan etkilenmez.
|
||||||
|
const kaynakKisitli = process.env.BUILD_KAYNAK_KISITLI === "1";
|
||||||
|
|
||||||
const nextConfig: NextConfig = {
|
const nextConfig: NextConfig = {
|
||||||
|
// PPR: statik kabuk anında servis edilir, dinamik parçalar (UserNav vb.)
|
||||||
|
// Suspense sınırlarının içinde akar. Bkz. docs/cacheComponents.md.
|
||||||
|
cacheComponents: true,
|
||||||
output: "standalone",
|
output: "standalone",
|
||||||
serverExternalPackages: ["better-sqlite3", "iyzipay", "@libsql/client"],
|
// Server-only paketler bundle dışında tutulur: Turbopack bunları derlemez
|
||||||
|
// (build belleği ciddi düşer), runtime'da native require ile yüklenir ve
|
||||||
|
// standalone trace'i imaja kopyalar. (Tarihçe: @google/genai'nin sürüklediği
|
||||||
|
// bağımlılık zinciri VPS'te build OOM'unu tetiklemişti; AI katmanı artık
|
||||||
|
// yalnızca openai paketiyle OpenRouter'a gidiyor.)
|
||||||
|
serverExternalPackages: [
|
||||||
|
"better-sqlite3",
|
||||||
|
"iyzipay",
|
||||||
|
"@libsql/client",
|
||||||
|
"openai",
|
||||||
|
"resend",
|
||||||
|
],
|
||||||
|
...(kaynakKisitli
|
||||||
|
? {
|
||||||
|
// cacheComponents açıkken prerender fazında source map üretimi varsayılan
|
||||||
|
// açık; 1900+ statik sayfada ciddi bellek maliyeti var.
|
||||||
|
enablePrerenderSourceMaps: false,
|
||||||
|
experimental: {
|
||||||
|
// Turbopack'ın Rust tarafı NODE_OPTIONS heap sınırını görmez; bellek
|
||||||
|
// hedefi byte cinsinden ayrıca verilir (1.5 GB).
|
||||||
|
turbopackMemoryLimit: 1_610_612_736,
|
||||||
|
// Statik üretim: varsayılan 4 worker × 8 eşzamanlı sayfa yerine tek
|
||||||
|
// worker × 4 sayfa. Her worker ayrı bir Node süreci/heap'idir.
|
||||||
|
cpus: 1,
|
||||||
|
staticGenerationMaxConcurrency: 4,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
: {}),
|
||||||
async redirects() {
|
async redirects() {
|
||||||
// Eski akış /sonuc modalına taşındı. /rapor/yazdir korunur (tam eşleşme).
|
// Eski akış /sonuc modalına taşındı. /rapor/yazdir korunur (tam eşleşme).
|
||||||
return [
|
return [
|
||||||
{ source: "/sohbet", destination: "/sonuc", permanent: false },
|
|
||||||
{ source: "/rapor", destination: "/sonuc", permanent: false },
|
{ source: "/rapor", destination: "/sonuc", permanent: false },
|
||||||
|
{ source: "/sohbet", destination: "/listem", permanent: false },
|
||||||
|
// Ayrı robot sayfası kaldırıldı; rehber içi linkler hero formuna düşer.
|
||||||
|
{ source: "/tercih-robotu", destination: "/#hero-form", permanent: true },
|
||||||
];
|
];
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|||||||
12500
package-lock.json
generated
24
package.json
@@ -8,29 +8,47 @@
|
|||||||
"start": "next start",
|
"start": "next start",
|
||||||
"lint": "eslint",
|
"lint": "eslint",
|
||||||
"ingest": "tsx scripts/ingest.ts",
|
"ingest": "tsx scripts/ingest.ts",
|
||||||
"refresh": "tsx scripts/refresh.ts"
|
"refresh": "tsx scripts/refresh.ts",
|
||||||
|
"detay": "tsx scripts/detay.ts",
|
||||||
|
"logolar": "tsx scripts/logo-indir.ts",
|
||||||
|
"db:push": "drizzle-kit push",
|
||||||
|
"db:generate": "drizzle-kit generate",
|
||||||
|
"db:migrate": "node scripts/db-goc.mjs",
|
||||||
|
"tadimlik": "tsx scripts/tadimlik-uret.ts"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@anthropic-ai/sdk": "^0.112.4",
|
"@cds/city": "^1.1.0",
|
||||||
"@libsql/client": "^0.17.4",
|
"@libsql/client": "^0.17.4",
|
||||||
"@react-pdf/renderer": "^4.5.1",
|
"@number-flow/react": "^0.6.2",
|
||||||
"better-auth": "^1.6.23",
|
"better-auth": "^1.6.23",
|
||||||
"better-sqlite3": "^12.11.1",
|
"better-sqlite3": "^12.11.1",
|
||||||
"class-variance-authority": "^0.7.1",
|
"class-variance-authority": "^0.7.1",
|
||||||
"clsx": "^2.1.1",
|
"clsx": "^2.1.1",
|
||||||
"drizzle-orm": "^0.45.2",
|
"drizzle-orm": "^0.45.2",
|
||||||
"iyzipay": "^2.0.69",
|
"iyzipay": "^2.0.69",
|
||||||
|
"lenis": "^1.3.25",
|
||||||
"lucide-react": "^1.25.0",
|
"lucide-react": "^1.25.0",
|
||||||
|
"marked": "^18.0.7",
|
||||||
|
"mermaid": "^11.16.0",
|
||||||
|
"motion": "^12.42.2",
|
||||||
"next": "16.2.10",
|
"next": "16.2.10",
|
||||||
"next-themes": "^0.4.6",
|
"next-themes": "^0.4.6",
|
||||||
|
"openai": "^7.4.0",
|
||||||
"radix-ui": "^1.6.3",
|
"radix-ui": "^1.6.3",
|
||||||
"react": "19.2.4",
|
"react": "19.2.4",
|
||||||
"react-dom": "19.2.4",
|
"react-dom": "19.2.4",
|
||||||
|
"react-markdown": "^10.1.0",
|
||||||
|
"react-use-measure": "^2.1.7",
|
||||||
|
"remark-breaks": "^4.0.0",
|
||||||
|
"remark-gfm": "^4.0.1",
|
||||||
"resend": "^6.18.0",
|
"resend": "^6.18.0",
|
||||||
|
"shiki": "^4.3.1",
|
||||||
"sonner": "^2.0.7",
|
"sonner": "^2.0.7",
|
||||||
"tailwind-merge": "^3.6.0",
|
"tailwind-merge": "^3.6.0",
|
||||||
"turkey-map-react": "^2.0.5",
|
"turkey-map-react": "^2.0.5",
|
||||||
"tw-animate-css": "^1.4.0",
|
"tw-animate-css": "^1.4.0",
|
||||||
|
"use-stick-to-bottom": "^1.1.6",
|
||||||
|
"vaul": "^1.1.2",
|
||||||
"zod": "^4.4.3"
|
"zod": "^4.4.3"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
|||||||
2427
pnpm-lock.yaml
generated
@@ -1 +0,0 @@
|
|||||||
<svg fill="none" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><path d="M14.5 13.5V5.41a1 1 0 0 0-.3-.7L9.8.29A1 1 0 0 0 9.08 0H1.5v13.5A2.5 2.5 0 0 0 4 16h8a2.5 2.5 0 0 0 2.5-2.5m-1.5 0v-7H8v-5H3v12a1 1 0 0 0 1 1h8a1 1 0 0 0 1-1M9.5 5V2.12L12.38 5zM5.13 5h-.62v1.25h2.12V5zm-.62 3h7.12v1.25H4.5zm.62 3h-.62v1.25h7.12V11z" clip-rule="evenodd" fill="#666" fill-rule="evenodd"/></svg>
|
|
||||||
|
Before Width: | Height: | Size: 391 B |
@@ -1 +0,0 @@
|
|||||||
<svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><g clip-path="url(#a)"><path fill-rule="evenodd" clip-rule="evenodd" d="M10.27 14.1a6.5 6.5 0 0 0 3.67-3.45q-1.24.21-2.7.34-.31 1.83-.97 3.1M8 16A8 8 0 1 0 8 0a8 8 0 0 0 0 16m.48-1.52a7 7 0 0 1-.96 0H7.5a4 4 0 0 1-.84-1.32q-.38-.89-.63-2.08a40 40 0 0 0 3.92 0q-.25 1.2-.63 2.08a4 4 0 0 1-.84 1.31zm2.94-4.76q1.66-.15 2.95-.43a7 7 0 0 0 0-2.58q-1.3-.27-2.95-.43a18 18 0 0 1 0 3.44m-1.27-3.54a17 17 0 0 1 0 3.64 39 39 0 0 1-4.3 0 17 17 0 0 1 0-3.64 39 39 0 0 1 4.3 0m1.1-1.17q1.45.13 2.69.34a6.5 6.5 0 0 0-3.67-3.44q.65 1.26.98 3.1M8.48 1.5l.01.02q.41.37.84 1.31.38.89.63 2.08a40 40 0 0 0-3.92 0q.25-1.2.63-2.08a4 4 0 0 1 .85-1.32 7 7 0 0 1 .96 0m-2.75.4a6.5 6.5 0 0 0-3.67 3.44 29 29 0 0 1 2.7-.34q.31-1.83.97-3.1M4.58 6.28q-1.66.16-2.95.43a7 7 0 0 0 0 2.58q1.3.27 2.95.43a18 18 0 0 1 0-3.44m.17 4.71q-1.45-.12-2.69-.34a6.5 6.5 0 0 0 3.67 3.44q-.65-1.27-.98-3.1" fill="#666"/></g><defs><clipPath id="a"><path fill="#fff" d="M0 0h16v16H0z"/></clipPath></defs></svg>
|
|
||||||
|
Before Width: | Height: | Size: 1.0 KiB |
BIN
public/kolay-tercih-mark.png
Normal file
|
After Width: | Height: | Size: 5.0 KiB |
6
public/kolay-tercih-mark.svg
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 180 180" role="img" aria-labelledby="title">
|
||||||
|
<title id="title">KolayTercih</title>
|
||||||
|
<rect x="27" y="56" width="57" height="57" rx="13" fill="#3b82f6"/>
|
||||||
|
<rect x="91" y="29" width="56" height="56" rx="13" fill="#fdc7a7"/>
|
||||||
|
<rect x="91" y="95" width="56" height="56" rx="13" fill="#ff5a00"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 355 B |
@@ -1 +0,0 @@
|
|||||||
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 394 80"><path fill="#000" d="M262 0h68.5v12.7h-27.2v66.6h-13.6V12.7H262V0ZM149 0v12.7H94v20.4h44.3v12.6H94v21h55v12.6H80.5V0h68.7zm34.3 0h-17.8l63.8 79.4h17.9l-32-39.7 32-39.6h-17.9l-23 28.6-23-28.6zm18.3 56.7-9-11-27.1 33.7h17.8l18.3-22.7z"/><path fill="#000" d="M81 79.3 17 0H0v79.3h13.6V17l50.2 62.3H81Zm252.6-.4c-1 0-1.8-.4-2.5-1s-1.1-1.6-1.1-2.6.3-1.8 1-2.5 1.6-1 2.6-1 1.8.3 2.5 1a3.4 3.4 0 0 1 .6 4.3 3.7 3.7 0 0 1-3 1.8zm23.2-33.5h6v23.3c0 2.1-.4 4-1.3 5.5a9.1 9.1 0 0 1-3.8 3.5c-1.6.8-3.5 1.3-5.7 1.3-2 0-3.7-.4-5.3-1s-2.8-1.8-3.7-3.2c-.9-1.3-1.4-3-1.4-5h6c.1.8.3 1.6.7 2.2s1 1.2 1.6 1.5c.7.4 1.5.5 2.4.5 1 0 1.8-.2 2.4-.6a4 4 0 0 0 1.6-1.8c.3-.8.5-1.8.5-3V45.5zm30.9 9.1a4.4 4.4 0 0 0-2-3.3 7.5 7.5 0 0 0-4.3-1.1c-1.3 0-2.4.2-3.3.5-.9.4-1.6 1-2 1.6a3.5 3.5 0 0 0-.3 4c.3.5.7.9 1.3 1.2l1.8 1 2 .5 3.2.8c1.3.3 2.5.7 3.7 1.2a13 13 0 0 1 3.2 1.8 8.1 8.1 0 0 1 3 6.5c0 2-.5 3.7-1.5 5.1a10 10 0 0 1-4.4 3.5c-1.8.8-4.1 1.2-6.8 1.2-2.6 0-4.9-.4-6.8-1.2-2-.8-3.4-2-4.5-3.5a10 10 0 0 1-1.7-5.6h6a5 5 0 0 0 3.5 4.6c1 .4 2.2.6 3.4.6 1.3 0 2.5-.2 3.5-.6 1-.4 1.8-1 2.4-1.7a4 4 0 0 0 .8-2.4c0-.9-.2-1.6-.7-2.2a11 11 0 0 0-2.1-1.4l-3.2-1-3.8-1c-2.8-.7-5-1.7-6.6-3.2a7.2 7.2 0 0 1-2.4-5.7 8 8 0 0 1 1.7-5 10 10 0 0 1 4.3-3.5c2-.8 4-1.2 6.4-1.2 2.3 0 4.4.4 6.2 1.2 1.8.8 3.2 2 4.3 3.4 1 1.4 1.5 3 1.5 5h-5.8z"/></svg>
|
|
||||||
|
Before Width: | Height: | Size: 1.3 KiB |
29
public/odeme/iyzico-ile-ode.svg
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg width="210px" height="31px" viewBox="0 0 210 31" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||||
|
<title>iyzico_ile_ode_colored_horizontal</title>
|
||||||
|
<defs>
|
||||||
|
<linearGradient x1="90.2554899%" y1="50%" x2="0%" y2="50%" id="linearGradient-1">
|
||||||
|
<stop stop-color="#1E64FF" offset="0%"></stop>
|
||||||
|
<stop stop-color="#1E64FF" stop-opacity="0" offset="100%"></stop>
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
<g id="05---Landings" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||||
|
<g id="004.0.0-Brand-Kit" transform="translate(-1015.000000, -1867.000000)">
|
||||||
|
<g id="Group-2-Copy" transform="translate(135.000000, 1674.000000)">
|
||||||
|
<g id="Group-4-Copy-3" transform="translate(800.000000, 83.000000)">
|
||||||
|
<g id="Group" transform="translate(80.000000, 86.000000)">
|
||||||
|
<g id="iyzico-ile-Ode_OneLine_TR" transform="translate(0.000000, 24.452381)">
|
||||||
|
<g id="Group-3" transform="translate(-0.000000, 3.761905)" fill="url(#linearGradient-1)">
|
||||||
|
<path d="M2.8125,0 C1.25925,0 0,1.26299683 0,2.82142857 L0,19.75 C0,21.3084317 1.25925,22.5714286 2.8125,22.5714286 L24.0455,22.5714286 C25.09425,22.5714286 26.05575,21.986327 26.54,21.052873 L30.9325,12.5888381 C31.1405,12.1875683 31.24625,11.7489302 31.25,11.3097905 L31.25,11.2616381 C31.24625,10.8224984 31.1405,10.3838603 30.9325,9.98284127 L26.54,1.51855556 C26.05575,0.585352381 25.09425,0 24.0455,0 L2.8125,0 Z" id="Fill-1"></path>
|
||||||
|
</g>
|
||||||
|
<g id="Group-21" transform="translate(39.814286, 0.000000)" fill="#1E64FF">
|
||||||
|
<path d="M20.3121807,8.01261426 C20.8578941,6.95906777 22.1521777,6.54811119 23.2041402,7.09665045 C24.2564599,7.64626456 24.6648521,8.94595505 24.116103,10.0014721 L24.116103,10.0014721 L14.334155,28.9375416 C13.9659413,29.6455191 13.2602282,30.0614917 12.5195152,30.0926628 C12.1554086,30.1105772 11.7832664,30.0355158 11.4379098,29.8522514 C10.3857687,29.3044287 9.97773368,28.0047382 10.5248756,26.949042 L10.5248756,26.949042 L13.2909424,21.5890503 L7.30005957,10.0014721 C6.75291762,8.94595505 7.16380979,7.64626456 8.2147009,7.09665045 C9.26541343,6.54811119 10.562197,6.95906777 11.1070175,8.01261426 L11.1070175,8.01261426 L15.7093313,16.9135683 Z M59.6828651,6.56683175 C62.0035755,6.56683175 64.185179,7.47330093 65.8267835,9.12035184 C66.6614249,9.96143342 66.6614249,11.3241826 65.8267835,12.1654434 C64.9873206,13.0040169 63.6285728,13.0040169 62.7914314,12.1654434 C61.959647,11.3306318 60.8589346,10.8734561 59.6828651,10.8734561 C58.5100099,10.8734561 57.4075118,11.3306318 56.5780489,12.1654434 C55.7476931,12.9948806 55.2914439,14.1028869 55.2914439,15.2809385 C55.2914439,16.4579153 55.7476931,17.5646676 56.5780489,18.3978668 C57.4075118,19.2276623 58.5100099,19.6914664 59.6828651,19.6914664 C60.8589346,19.6914664 61.959647,19.2276623 62.7914314,18.3978668 C63.6285728,17.5558895 64.9873206,17.5558895 65.8267835,18.3978668 C66.6614249,19.238411 66.6614249,20.6020559 65.8267835,21.4391963 C64.185179,23.0866055 62.0035755,23.9945078 59.6828651,23.9945078 C57.3650118,23.9945078 55.1844798,23.0866055 53.5441254,21.4391963 C51.9035924,19.7971614 50.9994867,17.6073039 50.9994867,15.2809385 C50.9994867,12.9520651 51.9035924,10.7674028 53.5441254,9.12035184 C55.1844798,7.47330093 57.3650118,6.56683175 59.6828651,6.56683175 Z M77.0293898,6.56677801 C81.8183104,6.56677801 85.7141967,10.4755233 85.7141967,15.2808848 C85.7141967,20.0853505 81.8183104,23.9946332 77.0293898,23.9946332 C72.2424335,23.9946332 68.3470828,20.0853505 68.3470828,15.2808848 C68.3470828,10.4755233 72.2424335,6.56677801 77.0293898,6.56677801 Z M2.36954993,6.85444761 C3.55436938,6.85444761 4.5149035,7.81824291 4.5149035,9.0038186 L4.5149035,9.0038186 L4.5149035,21.5929915 C4.5149035,22.7826875 3.55436938,23.7439748 2.36954993,23.7439748 C1.18473047,23.7439748 0.223839218,22.7826875 0.223839218,21.5929915 L0.223839218,21.5929915 L0.223839218,9.0038186 C0.223839218,7.81824291 1.18473047,6.85444761 2.36954993,6.85444761 Z M38.4392951,6.85393075 C38.4637799,6.85397691 38.4845421,6.85402542 38.5013999,6.85407635 L38.5542396,6.85441179 C39.0669173,6.83685566 39.584595,7.00095166 40.0072729,7.35816501 C40.9137,8.11827345 41.0322712,9.47815636 40.2722725,10.387671 L40.2722725,10.387671 L32.6990708,19.4394644 L38.6254895,19.4394644 C39.8112018,19.4394644 40.7731645,20.4057677 40.7731645,21.5929557 C40.7731645,22.7828308 39.8112018,23.743939 38.6254895,23.743939 L38.6254895,23.743939 L28.0990785,23.743939 C27.6122936,23.743939 27.1215801,23.5814553 26.7197951,23.2403649 C25.813368,22.4781067 25.6937253,21.1218067 26.4560455,20.2090675 L26.4560455,20.2090675 L34.0279972,11.1603195 L29.0778268,11.1603195 C27.8915788,11.1603195 26.9324733,10.1940162 26.9324733,9.00396191 C26.9324733,7.81820708 27.8915788,6.85441179 29.0778268,6.85441179 L29.0778268,6.85441179 L30.3890569,6.85405101 C30.4611906,6.85403248 30.535603,6.85401357 30.6121121,6.85399436 Z M46.0431021,6.85444761 C47.230243,6.85444761 48.1884557,7.81824291 48.1884557,9.0038186 L48.1884557,9.0038186 L48.1884557,21.5929915 C48.1884557,22.7826875 47.230243,23.7439748 46.0431021,23.7439748 C44.8593541,23.7439748 43.9002486,22.7826875 43.9002486,21.5929915 L43.9002486,21.5929915 L43.9002486,9.0038186 C43.9002486,7.81824291 44.8593541,6.85444761 46.0431021,6.85444761 Z M77.0293898,10.8734023 C74.6077867,10.8734023 72.63904,12.8500784 72.63904,15.2808848 C72.63904,17.7109746 74.6077867,19.6914127 77.0293898,19.6914127 C79.4526,19.6914127 81.4242039,17.7109746 81.4242039,15.2808848 C81.4242039,12.8500784 79.4526,10.8734023 77.0293898,10.8734023 Z M2.36954993,-2.34732868e-15 C3.67776203,-2.34732868e-15 4.74008169,1.06519085 4.74008169,2.37921287 C4.74008169,3.69054773 3.67776203,4.75770917 2.36954993,4.75770917 C1.06133782,4.75770917 -8.89798461e-05,3.69054773 -8.89798461e-05,2.37921287 C-8.89798461e-05,1.06519085 1.06133782,-2.34732868e-15 2.36954993,-2.34732868e-15 Z M46.0431021,-2.34732868e-15 C47.3538142,-2.34732868e-15 48.4150625,1.06519085 48.4150625,2.37921287 C48.4150625,3.69054773 47.3538142,4.75770917 46.0431021,4.75770917 C44.7334615,4.75770917 43.6722132,3.69054773 43.6722132,2.37921287 C43.6722132,1.06519085 44.7334615,-2.34732868e-15 46.0431021,-2.34732868e-15 Z" id="Combined-Shape"></path>
|
||||||
|
</g>
|
||||||
|
<path d="M171.256395,5.40878903 C175.631543,5.40878903 179.956126,9.08690718 179.956126,14.4030587 C179.956126,19.7192102 175.631543,23.3954641 171.256395,23.3954641 C166.881864,23.3954641 162.557281,19.7192102 162.557281,14.4030587 C162.557281,9.08690718 166.881864,5.40878903 171.256395,5.40878903 Z M193.107162,5.23261966 C193.831728,5.23261966 194.457014,5.83787174 194.457014,6.56802698 L194.457014,22.0355112 C194.457014,22.7669092 193.831728,23.3709185 193.107162,23.3709185 C192.381979,23.3709185 191.781976,22.7669092 191.781976,22.0355112 L191.781976,20.6752475 C191.607463,21.808697 190.056583,23.3951534 187.681855,23.3951534 C184.907536,23.3951534 181.583163,21.2289227 181.583163,16.6708898 C181.583163,12.1855617 184.932202,9.96899684 187.681855,9.96899684 C189.531811,9.96899684 191.132024,10.9272091 191.781976,12.3868981 L191.781976,11.3795946 C191.781976,11.3044042 191.781976,11.2031145 191.807259,11.1279241 L191.807259,6.56802698 C191.807259,5.83787174 192.407878,5.23261966 193.107162,5.23261966 Z M135.174825,10.0454301 C135.724262,10.0454301 136.199084,10.5239148 136.199084,11.1036891 L136.199084,22.2871817 C136.199084,22.8930552 135.724262,23.3709185 135.174825,23.3709185 C134.600105,23.3709185 134.124666,22.8930552 134.124666,22.2871817 L134.124666,11.1036891 C134.124666,10.5239148 134.600105,10.0454301 135.174825,10.0454301 Z M140.024302,5.23274394 C140.574973,5.23274394 141.049795,5.71247146 141.049795,6.26614662 L141.049795,22.287306 C141.049795,22.8416026 140.574973,23.3449436 140.024302,23.3449436 C139.448966,23.3449436 138.97476,22.8416026 138.97476,22.287306 L138.97476,6.26614662 C138.97476,5.71247146 139.448966,5.23274394 140.024302,5.23274394 Z M149.70007,9.96912113 C152.549621,9.96912113 155.973274,12.2366415 155.973274,16.3180539 C155.973274,17.1227782 155.498452,17.5018375 154.649322,17.5018375 L145.450103,17.4515034 C145.674564,20.2726989 147.824831,21.6074849 149.974481,21.6074849 C151.123921,21.6074849 152.048899,21.2800025 152.873363,20.6492726 C153.248904,20.3982235 153.473983,20.2726989 153.748393,20.2726989 C154.224448,20.2726989 154.523525,20.6001813 154.523525,21.0531883 C154.523525,21.3303366 154.398961,21.6074849 153.973471,21.9853014 C152.973877,22.8664589 151.500078,23.3449436 149.923915,23.3449436 C146.724106,23.3449436 143.300453,21.229047 143.300453,16.695249 C143.300453,12.1614511 146.849903,9.96912113 149.70007,9.96912113 Z M203.182706,9.96899684 C206.032256,9.96899684 209.457143,12.2365172 209.457143,16.2414964 C209.457143,17.274899 208.881806,17.6781933 207.806981,17.6781933 L199.432843,17.6520941 C199.707253,19.994805 201.532544,21.1543536 203.532347,21.1543536 C204.55784,21.1543536 205.257741,20.9026831 206.032256,20.4241984 C206.457129,20.1973842 206.732156,20.0209041 207.081798,20.0209041 C207.657135,20.0209041 208.007393,20.4241984 208.007393,20.9778736 C208.007393,21.3059773 207.882213,21.6583161 207.332159,22.1107016 C206.382514,22.8930552 205.006763,23.3448193 203.431833,23.3448193 C200.183309,23.3448193 196.708473,21.2550218 196.708473,16.6951247 C196.708473,12.1613268 200.333155,9.96899684 203.182706,9.96899684 Z M188.107345,12.2607522 C186.28267,12.2607522 184.232301,13.6980705 184.232301,16.6708898 C184.232301,19.667944 186.28267,21.1033981 188.107345,21.1033981 C189.807455,21.1033981 191.907156,19.7934685 191.907156,16.6708898 C191.907156,13.5215904 189.807455,12.2607522 188.107345,12.2607522 Z M171.256395,7.97893545 C168.206433,7.97893545 165.382165,10.5745596 165.382165,14.4030587 C165.382165,18.2315578 168.206433,20.8010828 171.256395,20.8010828 C174.306357,20.8010828 177.131242,18.2315578 177.131242,14.4030587 C177.131242,10.5745596 174.331024,7.97893545 171.256395,7.97893545 Z M149.70007,11.8091123 C147.849497,11.8091123 145.674564,13.067465 145.450103,15.8886605 L153.948805,15.8886605 C153.724343,13.067465 151.574077,11.8091123 149.70007,11.8091123 Z M203.182706,12.2868513 C201.532544,12.2868513 199.657921,13.3451104 199.432843,15.7381553 L206.882003,15.7381553 C206.657541,13.3451104 204.85815,12.2868513 203.182706,12.2868513 Z M135.174825,4.98094913 C135.724262,4.98094913 136.224367,5.45943384 136.224367,6.03920816 C136.224367,6.61836108 135.724262,7.0974672 135.174825,7.0974672 C134.600105,7.0974672 134.1,6.61836108 134.1,6.03920816 C134.1,5.45943384 134.600105,4.98094913 135.174825,4.98094913 Z M174.331024,0.824035565 C175.130822,0.824035565 175.780773,1.47900034 175.780773,2.26135391 C175.780773,3.04184325 175.130822,3.69680803 174.331024,3.69680803 C173.531225,3.69680803 172.881274,3.04184325 172.881274,2.26135391 C172.881274,1.47900034 173.531225,0.824035565 174.331024,0.824035565 Z M168.182383,0.824035565 C168.981565,0.824035565 169.6309,1.47900034 169.6309,2.26135391 C169.6309,3.04184325 168.981565,3.69680803 168.182383,3.69680803 C167.381969,3.69680803 166.732017,3.04184325 166.732017,2.26135391 C166.732017,1.47900034 167.381969,0.824035565 168.182383,0.824035565 Z" id="Combined-Shape" fill="#495057"></path>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 11 KiB |
92
public/odeme/iyzico-logo-band.svg
Normal file
@@ -0,0 +1,92 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg width="429px" height="32px" viewBox="0 0 429 32" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||||
|
<title>logo-band</title>
|
||||||
|
<defs>
|
||||||
|
<radialGradient cx="17.5632448%" cy="17.5027381%" fx="17.5632448%" fy="17.5027381%" r="134.355667%" gradientTransform="translate(0.175632,0.175027),scale(0.694444,1.000000),translate(-0.175632,-0.175027)" id="radialGradient-1">
|
||||||
|
<stop stop-color="#9DD5F6" offset="0%"></stop>
|
||||||
|
<stop stop-color="#98D3F5" offset="7.11%"></stop>
|
||||||
|
<stop stop-color="#89CEF3" offset="15.75%"></stop>
|
||||||
|
<stop stop-color="#70C6EF" offset="25.16%"></stop>
|
||||||
|
<stop stop-color="#4EBBEA" offset="35.14%"></stop>
|
||||||
|
<stop stop-color="#23ADE3" offset="45.46%"></stop>
|
||||||
|
<stop stop-color="#0DA6E0" offset="50%"></stop>
|
||||||
|
<stop stop-color="#2E77BC" offset="100%"></stop>
|
||||||
|
</radialGradient>
|
||||||
|
<linearGradient x1="-0.000322580643%" y1="49.995%" x2="99.9996774%" y2="49.995%" id="linearGradient-2">
|
||||||
|
<stop stop-color="#1D1C45" offset="0%"></stop>
|
||||||
|
<stop stop-color="#174489" offset="100%"></stop>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient x1="90.2554899%" y1="50%" x2="0%" y2="50%" id="linearGradient-3">
|
||||||
|
<stop stop-color="#1E64FF" offset="0%"></stop>
|
||||||
|
<stop stop-color="#1E64FF" stop-opacity="0" offset="100%"></stop>
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
<g id="👉Method-View" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||||
|
<g id="PWI_Method_02_FooterAlternatives" transform="translate(-746.000000, -914.000000)">
|
||||||
|
<g id="logo-band-iyzicoileode" transform="translate(746.000000, 914.000000)">
|
||||||
|
<g id="Troy-Logo" transform="translate(370.000000, 3.000000)">
|
||||||
|
<g id="Group_1_" transform="translate(1.437077, 22.724340)" fill="#323E48">
|
||||||
|
<path d="M0.8,0.7 L0.4,0.7 C0.4,0.7 0.3,0.7 0.3,0.8 L0.3,0.9 L0.1,0.9 L0.1,0.7 C0.1,0.6 0.2,0.5 0.3,0.5 L1.6,0.5 C1.7,0.5 1.8,0.5 1.7,0.7 L1.7,0.9 L1.5,0.9 L1.5,0.8 C1.5,0.8 1.5,0.7 1.5,0.7 L1,0.7 L0.6,2.5 L0.4,2.5 L0.8,0.7 Z" id="Path_6_"></path>
|
||||||
|
<path d="M1.8,1.3 C1.8,1.3 1.7,1.2 1.8,1.3 L1.6,1.2 L1.6,1 L1.8,1 C1.9,1 2,1 1.9,1.2 L1.8,1.9 C1.8,2.1 1.8,2.3 2,2.3 C2.3,2.3 2.6,2 2.6,1.7 L2.7,1 L3,1 L2.7,2.2 C2.7,2.2 2.7,2.3 2.7,2.3 L2.8,2.3 L2.8,2.5 L2.7,2.5 C2.6,2.5 2.5,2.4 2.6,2.3 L2.6,2.2 C2.6,2.1 2.6,2.1 2.6,2.1 L2.6,2.1 C2.5,2.3 2.3,2.5 2,2.5 C1.6,2.5 1.5,2.3 1.6,2 L1.8,1.3 Z M2.2,0.5 L2.4,0.5 L2.3,0.8 L2.2,0.8 L2.2,0.5 Z M2.6,0.5 L2.8,0.5 L2.8,0.8 L2.6,0.8 L2.6,0.5 Z" id="Shape_5_" fill-rule="nonzero"></path>
|
||||||
|
<path d="M3.4,1.3 C3.4,1.3 3.4,1.2 3.4,1.3 L3.3,1.2 L3.3,1 L3.5,1 C3.6,1 3.7,1 3.6,1.2 L3.6,1.3 C3.6,1.4 3.6,1.4 3.6,1.4 L3.6,1.4 C3.7,1.2 3.9,1 4.1,1 C4.1,1 4.2,1 4.2,1 L4.2,1.2 C4.2,1.2 4.2,1.2 4.1,1.2 C3.9,1.2 3.7,1.4 3.6,1.6 C3.6,1.7 3.5,1.8 3.5,1.9 L3.4,2.5 L3.2,2.5 L3.4,1.3 Z" id="Path_7_"></path>
|
||||||
|
<path d="M4.5,0.8 C4.5,0.7 4.5,0.7 4.5,0.8 L4.3,0.7 L4.3,0.5 L4.5,0.5 C4.6,0.5 4.7,0.5 4.6,0.7 L4.5,1.6 L4.6,1.6 C4.7,1.6 4.7,1.6 4.8,1.5 L5.3,1 L5.5,1 L5,1.6 C4.9,1.7 4.9,1.7 4.9,1.7 L4.9,1.7 C4.9,1.7 4.9,1.7 5,1.8 L5.1,2.3 C5.1,2.3 5.1,2.4 5.2,2.4 L5.3,2.4 L5.3,2.6 L5.1,2.6 C5,2.6 4.9,2.6 4.9,2.5 L4.7,1.8 C4.7,1.7 4.6,1.7 4.6,1.7 L4.5,1.7 L4.3,2.5 L4.1,2.5 L4.5,0.8 Z" id="Path_8_"></path>
|
||||||
|
<path d="M6.1,1.3 C6.1,1.3 6.1,1.2 6,1.2 L5.7,1.2 L5.8,1 L6.3,1 C6.6,1 6.7,1 6.6,1.2 L6,2.2 C6,2.2 6,2.3 6.1,2.3 L6.4,2.3 L6.3,2.5 L5.9,2.5 C5.6,2.5 5.5,2.4 5.6,2.3 L6.1,1.3 Z M6.5,0.5 L6.9,0.5 L6.8,0.8 L6.4,0.8 L6.5,0.5 Z" id="Shape_6_" fill-rule="nonzero"></path>
|
||||||
|
<path d="M6.2,2.9 C6.3,2.9 6.4,2.8 6.5,2.7 L6.6,2.5 L6.4,1.3 C6.4,1.3 6.4,1.2 6.3,1.2 L6.3,1.2 L6.3,1 L6.4,1 C6.5,1 6.6,1 6.6,1.1 L6.8,2 C6.8,2.1 6.8,2.2 6.8,2.2 L6.8,2.2 C6.8,2.2 6.8,2.1 6.9,2 L7.4,1.1 C7.5,1 7.5,1 7.6,1 L7.7,1 L7.7,1.2 L7.7,1.2 C7.7,1.2 7.6,1.2 7.6,1.3 L6.6,2.8 C6.5,2.9 6.3,3 6.1,3 C5.9,3 5.9,2.9 5.9,2.9 L6,2.8 C6,2.8 6,2.9 6.2,2.9" id="Path_9_"></path>
|
||||||
|
<path d="M8.5,1 C8.9,1 9.1,1.3 9,1.7 C9,1.7 9,1.8 9,1.8 L7.9,1.8 C7.8,2.1 8,2.3 8.3,2.3 C8.6,2.3 8.8,2.1 8.8,2.1 L8.9,2.2 C8.9,2.2 8.7,2.4 8.3,2.4 C7.9,2.4 7.6,2.1 7.7,1.7 C7.8,1.3 8.1,1 8.5,1 Z M8.8,1.6 C8.9,1.3 8.7,1.2 8.5,1.2 C8.3,1.2 8,1.4 7.9,1.6 L8.8,1.6 Z" id="Shape_7_" fill-rule="nonzero"></path>
|
||||||
|
<polygon id="Path_10_" points="9.5 0.5 9.7 0.5 9.5 1 9.3 1"></polygon>
|
||||||
|
<path d="M9.9,1.3 C9.9,1.3 9.9,1.2 9.9,1.3 L9.8,1.2 L9.8,1 L10,1 C10.1,1 10.2,1 10.1,1.2 L10.1,1.3 C10.1,1.4 10.1,1.4 10.1,1.4 L10.1,1.4 C10.2,1.3 10.4,1 10.7,1 C11.1,1 11.1,1.2 11.1,1.5 L11,2.2 C11,2.2 11,2.3 11,2.3 L11.1,2.3 L11.1,2.5 L10.9,2.5 C10.8,2.5 10.7,2.4 10.8,2.3 L10.9,1.6 C10.9,1.4 11,1.2 10.7,1.2 C10.5,1.2 10.2,1.4 10.1,1.6 C10.1,1.7 10.1,1.7 10,1.8 L9.9,2.5 L9.7,2.5 L9.9,1.3 Z" id="Path_11_"></path>
|
||||||
|
<path d="M11.9,1.3 C11.9,1.3 11.9,1.2 11.8,1.2 L11.5,1.2 L11.6,1 L12.1,1 C12.4,1 12.5,1 12.4,1.2 L11.9,2.2 C11.9,2.2 11.9,2.3 12,2.3 L12.3,2.3 L12.2,2.5 L11.7,2.5 C11.4,2.5 11.3,2.4 11.4,2.3 L11.9,1.3 Z M12.3,0.5 L12.7,0.5 L12.6,0.7 L12.2,0.7 L12.3,0.5 Z" id="Shape_8_" fill-rule="nonzero"></path>
|
||||||
|
<path d="M12.3,1.3 C12.3,1.3 12.3,1.2 12.3,1.3 L12.1,1.2 L12.1,1 L12.3,1 C12.4,1 12.5,1 12.4,1.2 L12.4,1.3 C12.4,1.4 12.4,1.4 12.4,1.4 L12.4,1.4 C12.5,1.3 12.8,1 13.1,1 C13.4,1 13.5,1.2 13.4,1.5 L13.3,2.2 C13.3,2.2 13.3,2.3 13.3,2.3 L13.4,2.3 L13.4,2.5 L13.2,2.5 C13.1,2.5 13,2.4 13.1,2.3 L13.2,1.6 C13.2,1.4 13.3,1.2 13,1.2 C12.8,1.2 12.5,1.4 12.4,1.6 C12.4,1.7 12.4,1.7 12.3,1.8 L12.1,2.5 L12,2.5 L12.3,1.3 Z" id="Path_12_"></path>
|
||||||
|
<path d="M15.8,0.5 C16.4,0.5 16.7,0.9 16.6,1.5 C16.5,2.1 15.9,2.5 15.4,2.5 C14.8,2.5 14.5,2.1 14.6,1.5 C14.7,0.9 15.2,0.5 15.8,0.5 Z M15.3,2.3 C15.7,2.3 16.2,1.9 16.3,1.5 C16.4,1 16.1,0.7 15.7,0.7 C15.3,0.7 14.8,1.1 14.7,1.5 C14.6,2 14.9,2.3 15.3,2.3 Z M15.6,0.1 L15.8,0.1 L15.7,0.3 L15.5,0.3 L15.6,0.1 Z M16,0.1 L16.2,0.1 L16.1,0.3 L15.9,0.3 L16,0.1 Z" id="Shape_9_" fill-rule="nonzero"></path>
|
||||||
|
<path d="M17.5,1 C17.8,1 17.9,1.3 17.9,1.3 L17.9,1.3 C17.9,1.3 17.9,1.3 17.9,1.2 L18,0.7 C18,0.7 18,0.6 18,0.6 L17.9,0.6 L17.9,0.4 L18.1,0.4 C18.2,0.4 18.3,0.4 18.2,0.6 L17.9,2.1 C17.9,2.1 17.9,2.2 17.9,2.2 L18,2.2 L18,2.4 L17.8,2.4 C17.7,2.4 17.6,2.3 17.7,2.2 C17.7,2.1 17.7,2.1 17.7,2.1 L17.7,2.1 C17.7,2.1 17.5,2.4 17.2,2.4 C16.8,2.4 16.7,2.1 16.8,1.7 C16.8,1.3 17.1,1 17.5,1 M17.8,1.8 C17.9,1.5 17.8,1.2 17.5,1.2 C17.3,1.2 17,1.4 16.9,1.8 C16.8,2.1 17,2.4 17.2,2.4 C17.4,2.3 17.7,2.2 17.8,1.8" id="Shape_10_" fill-rule="nonzero"></path>
|
||||||
|
<path d="M19.2,1 C19.6,1 19.7,1.3 19.7,1.6 C19.7,1.6 19.7,1.7 19.7,1.7 L18.6,1.7 C18.5,2 18.7,2.3 19,2.3 C19.3,2.3 19.5,2.1 19.5,2.1 L19.6,2.2 C19.6,2.2 19.3,2.4 19,2.4 C18.6,2.4 18.3,2.1 18.4,1.7 C18.4,1.3 18.8,1 19.2,1 Z M19.4,1.6 C19.5,1.3 19.3,1.2 19.1,1.2 C18.9,1.2 18.6,1.3 18.5,1.6 L19.4,1.6 Z" id="Shape_11_" fill-rule="nonzero"></path>
|
||||||
|
<path d="M20,1.3 C20.1,1.3 20,1.2 20,1.3 L19.8,1.2 L19.8,1 L20,1 C20.1,1 20.2,1 20.1,1.2 L20.1,1.3 C20.1,1.4 20.1,1.4 20.1,1.4 L20.1,1.4 C20.3,1.2 20.6,1 20.8,1 C21.1,1 21.2,1.1 21.2,1.3 L21.2,1.3 C21.3,1.2 21.5,1 21.8,1 C22.1,1 22.2,1.2 22.1,1.5 L22,2.2 C22,2.2 22,2.3 22,2.3 L22.1,2.3 L22.1,2.5 L21.9,2.5 C21.8,2.5 21.7,2.4 21.8,2.3 L22,1.6 C22.1,1.4 22,1.2 21.8,1.2 C21.6,1.2 21.4,1.4 21.3,1.6 C21.3,1.7 21.2,1.7 21.2,1.8 L21.1,2.5 L20.9,2.5 L21.1,1.7 C21.1,1.5 21.2,1.3 20.9,1.3 C20.7,1.3 20.5,1.5 20.4,1.7 C20.4,1.8 20.3,1.8 20.3,1.9 L20,2.5 L19.8,2.5 L20,1.3 Z" id="Path_13_"></path>
|
||||||
|
<path d="M23.3,1 C23.7,1 23.8,1.3 23.8,1.6 C23.8,1.6 23.8,1.7 23.8,1.7 L22.7,1.7 C22.6,2 22.8,2.3 23.1,2.3 C23.4,2.3 23.6,2.1 23.6,2.1 L23.7,2.2 C23.7,2.2 23.4,2.4 23.1,2.4 C22.7,2.4 22.4,2.1 22.5,1.7 C22.5,1.3 22.9,1 23.3,1 Z M23.5,1.6 C23.6,1.3 23.4,1.2 23.2,1.2 C23,1.2 22.7,1.3 22.6,1.6 L23.5,1.6 Z" id="Shape_12_" fill-rule="nonzero"></path>
|
||||||
|
<path d="M25.2,1.6 L24.9,0.7 C24.9,0.6 24.8,0.6 24.8,0.6 L24.8,0.6 L24.8,0.4 L24.9,0.4 C25,0.4 25.1,0.4 25.1,0.6 L25.3,1.1 C25.3,1.2 25.4,1.3 25.4,1.3 L25.4,1.3 C25.4,1.3 25.5,1.2 25.6,1.1 L26,0.7 C26.1,0.6 26.2,0.5 26.3,0.5 L26.4,0.5 L26.4,0.7 L26.4,0.7 C26.3,0.7 26.3,0.7 26.3,0.8 L25.6,1.7 L25.4,2.5 L25,2.5 L25.2,1.6 Z" id="Path_14_"></path>
|
||||||
|
<path d="M26.9,1 C27.3,1 27.6,1.3 27.5,1.7 C27.4,2.1 27,2.4 26.6,2.4 C26.2,2.4 25.9,2.1 26,1.7 C26.1,1.4 26.5,1 26.9,1 Z M26.6,2.3 C26.9,2.3 27.2,2.1 27.3,1.7 C27.4,1.4 27.2,1.2 26.9,1.2 C26.6,1.2 26.3,1.4 26.2,1.7 C26.1,2.1 26.3,2.3 26.6,2.3 Z M26.7,0.5 L26.9,0.5 L26.8,0.7 L26.6,0.7 L26.7,0.5 Z M27.1,0.5 L27.3,0.5 L27.3,0.7 L27.1,0.7 L27.1,0.5 Z" id="Shape_13_" fill-rule="nonzero"></path>
|
||||||
|
<path d="M27.9,1.3 C27.9,1.3 27.9,1.2 27.9,1.3 L27.7,1.2 L27.7,1 L28,1 C28.1,1 28.2,1 28.1,1.2 L28.1,1.3 C28.1,1.4 28.1,1.4 28.1,1.4 L28.1,1.4 C28.2,1.3 28.4,1 28.7,1 C29,1 29.1,1.2 29,1.5 L28.9,2.2 C28.9,2.2 28.9,2.3 29,2.3 L29.1,2.3 L29.1,2.5 L28.9,2.5 C28.8,2.5 28.7,2.4 28.8,2.3 L28.9,1.6 C28.9,1.4 29,1.2 28.7,1.2 C28.5,1.2 28.2,1.4 28.1,1.6 C28,1.7 28,1.7 28,1.8 L27.9,2.5 L27.7,2.5 L27.9,1.3 Z" id="Path_15_"></path>
|
||||||
|
<path d="M29.6,1.2 L29.4,1.2 L29.4,1 L29.6,1 L29.7,0.6 L29.9,0.6 L29.8,1 L30.2,1 L30.2,1.2 L29.8,1.2 L29.6,1.9 C29.5,2.2 29.7,2.3 29.8,2.3 C29.8,2.3 29.9,2.3 29.9,2.3 L29.9,2.5 C29.9,2.5 29.9,2.5 29.8,2.5 C29.6,2.5 29.3,2.4 29.4,2 L29.6,1.2 Z" id="Path_16_"></path>
|
||||||
|
<path d="M31.1,1 C31.5,1 31.6,1.3 31.6,1.6 C31.6,1.6 31.6,1.7 31.6,1.7 L30.5,1.7 C30.4,2 30.6,2.3 30.9,2.3 C31.2,2.3 31.4,2.1 31.4,2.1 L31.5,2.2 C31.5,2.2 31.3,2.4 30.9,2.4 C30.5,2.4 30.2,2.1 30.3,1.7 C30.3,1.3 30.7,1 31.1,1 Z M31.4,1.6 C31.5,1.3 31.3,1.2 31.1,1.2 C30.9,1.2 30.6,1.3 30.5,1.6 L31.4,1.6 Z" id="Shape_14_" fill-rule="nonzero"></path>
|
||||||
|
<path d="M32,1.3 C32,1.3 32,1.2 32,1.3 L31.8,1.2 L31.8,1 L32,1 C32.1,1 32.2,1 32.1,1.2 L32.1,1.3 C32.1,1.4 32.1,1.4 32.1,1.4 L32.1,1.4 C32.3,1.2 32.5,1 32.7,1 C33,1 33.1,1.1 33.1,1.3 L33.1,1.3 C33.2,1.2 33.5,1 33.7,1 C34,1 34.1,1.2 34,1.6 L33.9,2.3 C33.9,2.3 33.9,2.4 33.9,2.4 L34,2.4 L34,2.6 L33.8,2.6 C33.7,2.6 33.6,2.5 33.7,2.4 L33.8,1.7 C33.9,1.5 33.8,1.3 33.6,1.3 C33.4,1.3 33.2,1.5 33.1,1.7 C33.1,1.8 33,1.8 33,1.9 L32.9,2.6 L32.7,2.6 L32.9,1.8 C32.9,1.6 33,1.4 32.7,1.4 C32.5,1.4 32.3,1.6 32.2,1.8 C32.2,1.9 32.2,1.9 32.1,2 L32,2.7 L31.8,2.7 L32,1.3 Z" id="Path_17_"></path>
|
||||||
|
<path d="M34.9,1.3 C34.9,1.3 34.9,1.2 34.8,1.2 L34.5,1.2 L34.6,1 L35.1,1 C35.4,1 35.5,1 35.4,1.2 L34.9,2.2 C34.9,2.2 34.9,2.3 35,2.3 L35.3,2.3 L35.2,2.5 L34.7,2.5 C34.4,2.5 34.3,2.4 34.4,2.3 L34.9,1.3 Z M35.3,0.5 L35.7,0.5 L35.6,0.7 L35.2,0.7 L35.3,0.5 Z" id="Shape_15_" fill-rule="nonzero"></path>
|
||||||
|
</g>
|
||||||
|
<g id="Group_2_">
|
||||||
|
<g id="Path_18_">
|
||||||
|
<path d="M54,4.4 C53.2,4.4 52.3,4.9 51.9,5.7 L48.1,14.4 L46.7,5.7 C46.5,4.9 46,4.4 45.1,4.4 L40.2,4.4 L44.4,18.9 C44.5,19.2 44.5,19.5 44.4,19.8 C44.2,21 43.1,22 41.9,22 L39.2,22 C38.5,22 38.1,22.4 37.8,23.4 L37.2,27 L42,27 C44.5,27 47.4,25.8 49.4,22.3 L59,4.4 L54,4.4 Z" id="Path" fill="#323E48"></path>
|
||||||
|
<path d="M6.8,0 C8.2,0 8.9,0.6 8.7,2 L8.3,4.3 L11.6,4.3 L10.9,8.4 L7.5,8.4 L6.6,13.5 C6.3,15.3 8,15.5 9.1,15.5 C9.3,15.5 9.5,15.5 9.6,15.5 L8.8,20 C8.6,20 8.3,20.1 7.8,20.1 C5.3,20.1 0.6,19.4 1.5,14.2 L2.5,8.4 L0,8.4 L0.7,4.3 L3.1,4.3 L3.9,0 L6.8,0 Z" id="Path" fill="#323E48"></path>
|
||||||
|
<g id="Group" transform="translate(24.190798, 4.196481)" fill="#00ADBB">
|
||||||
|
<path d="M10.4,0.3 L9.5,5.1 C10.5,5.6 11.3,6.7 11.3,7.9 C11.3,9.5 10.1,10.9 8.5,11.1 L7.7,15.9 C7.8,15.9 8,15.9 8.2,15.9 C12.6,15.9 16.2,12.3 16.2,7.9 C16.1,4.4 13.7,1.3 10.4,0.3 Z" id="Path"></path>
|
||||||
|
<path d="M6.6,10.8 C5.6,10.3 4.8,9.2 4.8,8 C4.8,6.4 6,5 7.6,4.8 L8.5,0 C8.4,0 8.2,0 8,0 C3.6,0 0,3.6 0,8 C0,11.6 2.4,14.6 5.7,15.6 L6.6,10.8 Z" id="Path"></path>
|
||||||
|
</g>
|
||||||
|
<path d="M13.5,4.4 L16.3,4.4 C17.7,4.4 18.4,5 18.2,6.4 L17.9,8.1 C19,6 21.2,4.2 23.6,4.2 C23.9,4.2 24.2,4.3 24.2,4.3 L23.3,9.5 C23.3,9.5 22.9,9.4 22.2,9.4 C20.9,9.4 18.8,9.8 17.6,12.1 C17.3,12.7 17.1,13.4 17,14.2 L16,20 L10.7,20 L13.5,4.4 Z" id="Path" fill="#323E48"></path>
|
||||||
|
</g>
|
||||||
|
<path d="M59,20.7 C59,21.2 58.8,21.6 58.5,21.9 C58.2,22.2 57.8,22.4 57.3,22.4 C56.8,22.4 56.4,22.2 56.1,21.9 C55.8,21.6 55.6,21.2 55.6,20.7 C55.6,20.2 55.8,19.8 56.1,19.5 C56.4,19.2 56.8,19 57.3,19 C57.8,19 58.2,19.2 58.5,19.5 C58.8,19.8 59,20.2 59,20.7 Z M58.7,20.7 C58.7,20.3 58.6,20 58.3,19.7 C58,19.4 57.7,19.3 57.3,19.3 C56.9,19.3 56.6,19.4 56.3,19.7 C56,20 55.9,20.3 55.9,20.7 C55.9,21.1 56,21.4 56.3,21.7 C56.6,22 56.9,22.1 57.3,22.1 C57.7,22.1 58,22 58.3,21.7 C58.6,21.4 58.7,21.1 58.7,20.7 Z M58,21.6 L57.7,21.6 L57.3,20.8 L57,20.8 L57,21.6 L56.7,21.6 L56.7,19.8 L57.3,19.8 C57.5,19.8 57.6,19.9 57.7,20 C57.8,20.1 57.9,20.2 57.9,20.4 C57.9,20.7 57.8,20.8 57.5,20.9 L58,21.6 Z M57.7,20.3 C57.7,20.2 57.7,20.1 57.6,20.1 C57.5,20.1 57.4,20 57.3,20 L57,20 L57,20.6 L57.3,20.6 C57.4,20.6 57.5,20.6 57.6,20.5 C57.6,20.5 57.7,20.4 57.7,20.3 Z" id="Shape_16_" fill="#323E48" fill-rule="nonzero"></path>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g id="American_Express" transform="translate(294.000000, 0.000000)">
|
||||||
|
<polyline id="Path_5_" fill="url(#radialGradient-1)" points="43.2 0 0 0 0 30 43.2 30 43.2 20.1"></polyline>
|
||||||
|
<g id="Group" transform="translate(0.000000, 6.600000)" fill="#FFFFFF" fill-rule="nonzero">
|
||||||
|
<path d="M3.9,4 L3.1,2 L2.3,4 L3.9,4 Z M22,3.2 C21.8,3.3 21.6,3.3 21.4,3.3 L20,3.3 L20,2.2 L21.5,2.2 C21.7,2.2 21.9,2.2 22.1,2.3 C22.3,2.4 22.4,2.5 22.4,2.7 C22.3,2.9 22.2,3.1 22,3.2 Z M32.4,4 L31.6,2 L30.8,4 L32.4,4 Z M13,6.2 L11.8,6.2 L11.8,2.2 L10.1,6.2 L9,6.2 L7.3,2.2 L7.3,6.2 L4.8,6.2 L4.4,5.1 L1.9,5.1 L1.4,6.2 L0.1,6.2 L2.2,1.1 L4,1.1 L6,5.9 L6,1.1 L8,1.1 L9.6,4.5 L11,1.1 L13,1.1 L13,6.2 Z M17.9,6.2 L13.9,6.2 L13.9,1.1 L17.9,1.1 L17.9,2.2 L15.1,2.2 L15.1,3.1 L17.8,3.1 L17.8,4.1 L15.1,4.1 L15.1,5.1 L17.9,5.1 L17.9,6.2 Z M23.6,2.5 C23.6,3.3 23.1,3.7 22.8,3.8 C23.1,3.9 23.3,4.1 23.4,4.2 C23.6,4.5 23.6,4.7 23.6,5.1 L23.6,6.1 L22.4,6.1 L22.4,5.5 C22.4,5.2 22.4,4.8 22.2,4.5 C22,4.3 21.8,4.3 21.3,4.3 L20,4.3 L20,6.1 L18.8,6.1 L18.8,1.1 L21.6,1.1 C22.2,1.1 22.7,1.1 23.1,1.3 C23.4,1.6 23.6,1.9 23.6,2.5 Z M25.5,6.2 L24.3,6.2 L24.3,1.1 L25.5,1.1 L25.5,6.2 Z M39.7,6.2 L38,6.2 L35.7,2.4 L35.7,6.2 L33.3,6.2 L32.8,5.1 L30.3,5.1 L29.8,6.2 L28.4,6.2 C27.8,6.2 27.1,6.1 26.7,5.6 C26.3,5.2 26.1,4.6 26.1,3.7 C26.1,2.9 26.2,2.3 26.7,1.7 C27.1,1.3 27.7,1.1 28.5,1.1 L29.7,1.1 L29.7,2.2 L28.6,2.2 C28.2,2.2 27.9,2.3 27.7,2.5 C27.5,2.7 27.4,3.1 27.4,3.6 C27.4,4.1 27.5,4.5 27.7,4.8 C27.9,5 28.2,5.1 28.5,5.1 L29,5.1 L30.7,1.1 L32.5,1.1 L34.5,5.9 L34.5,1.1 L36.3,1.1 L38.4,4.6 L38.4,1.1 L39.6,1.1 L39.7,6.2 L39.7,6.2 Z M0.1,7.2 L2.1,7.2 L2.6,6.1 L3.6,6.1 L4.1,7.2 L8.1,7.2 L8.1,6.3 L8.5,7.2 L10.6,7.2 L11,6.3 L11,7.2 L21,7.2 L21,5.4 L21.2,5.4 C21.3,5.4 21.4,5.4 21.4,5.6 L21.4,7.2 L26.6,7.2 L26.6,6.8 C27,7 27.7,7.2 28.5,7.2 L30.7,7.2 L31.2,6.1 L32.2,6.1 L32.7,7.2 L36.9,7.2 L36.9,6.1 L37.5,7.2 L40.9,7.2 L40.9,0.1 L37.6,0.1 L37.6,1 L37,0.1 L33.6,0.1 L33.6,1 L33.2,0.2 L28.6,0.2 C27.8,0.2 27.1,0.3 26.6,0.6 L26.6,0.1 L23.4,0.1 L23.4,0.5 C23,0.2 22.5,0.1 22,0.1 L10.3,0.1 L9.6,1.9 L8.8,0.1 L5.1,0.1 L5.1,1 L4.7,0.1 L1.6,0.1 L0.1,3.5 L0.1,7.2 Z" id="Shape_3_"></path>
|
||||||
|
<path d="M42.8,10.9 L40.6,10.9 C40.4,10.9 40.2,10.9 40.1,11 C40,11.1 39.9,11.2 39.9,11.4 C39.9,11.6 40,11.7 40.2,11.8 C40.3,11.8 40.5,11.9 40.7,11.9 L41.3,11.9 C42,11.9 42.4,12 42.7,12.3 C42.7,12.3 42.8,12.4 42.8,12.4 L42.8,10.9 Z M42.8,14.3 C42.5,14.7 41.9,14.9 41.2,14.9 L38.9,14.9 L38.9,13.8 L41.2,13.8 C41.4,13.8 41.6,13.8 41.7,13.7 C41.8,13.6 41.8,13.5 41.8,13.4 C41.8,13.3 41.7,13.1 41.7,13.1 C41.6,13 41.5,13 41.3,13 C40.2,13 38.8,13 38.8,11.4 C38.8,10.7 39.3,9.9 40.5,9.9 L42.9,9.9 L42.9,8.9 L40.7,8.9 C40,8.9 39.5,9.1 39.2,9.3 L39.2,8.8 L35.9,8.8 C35.4,8.8 34.8,8.9 34.5,9.2 L34.5,8.8 L28.6,8.8 L28.6,9.2 C28.1,8.9 27.3,8.8 27,8.8 L23,8.8 L23,9.2 C22.6,8.8 21.8,8.8 21.3,8.8 L17,8.8 L16,9.9 L15.1,8.8 L8.6,8.8 L8.6,15.9 L14.9,15.9 L15.9,14.8 L16.9,15.9 L20.8,15.9 L20.8,14.2 L21.2,14.2 C21.7,14.2 22.3,14.2 22.9,14 L22.9,15.9 L26.1,15.9 L26.1,14.1 L26.3,14.1 C26.5,14.1 26.5,14.1 26.5,14.3 L26.5,15.9 L36.3,15.9 C36.9,15.9 37.6,15.7 37.9,15.4 L37.9,15.9 L41,15.9 C41.6,15.9 42.3,15.8 42.8,15.6 L42.8,14.3 L42.8,14.3 Z M38,12.2 C38.2,12.4 38.4,12.8 38.4,13.3 C38.4,14.4 37.7,14.9 36.5,14.9 L34.2,14.9 L34.2,13.8 L36.5,13.8 C36.7,13.8 36.9,13.8 37,13.7 C37.1,13.6 37.1,13.5 37.1,13.4 C37.1,13.3 37,13.1 37,13.1 C36.9,13 36.8,13 36.6,13 C35.5,13 34.1,13 34.1,11.4 C34.1,10.7 34.6,9.9 35.8,9.9 L38.2,9.9 L38.2,11 L36,11 C35.8,11 35.6,11 35.5,11.1 C35.4,11.2 35.3,11.3 35.3,11.5 C35.3,11.7 35.4,11.8 35.6,11.9 C35.7,11.9 35.9,12 36.1,12 L36.7,12 C37.3,11.8 37.7,12 38,12.2 Z M27.2,11.9 C27,12 26.8,12 26.6,12 L25.1,12 L25.1,10.9 L26.6,10.9 C26.8,10.9 27,10.9 27.2,11 C27.4,11.1 27.4,11.2 27.4,11.5 C27.4,11.7 27.3,11.8 27.2,11.9 Z M27.9,12.5 C28.2,12.6 28.4,12.8 28.5,12.9 C28.7,13.1 28.7,13.4 28.7,13.8 L28.7,14.8 L27.5,14.8 L27.5,14.2 C27.5,13.9 27.5,13.4 27.3,13.2 C27.1,13 26.9,13 26.4,13 L25.1,13 L25.1,14.8 L23.9,14.8 L23.9,9.8 L26.7,9.8 C27.3,9.8 27.7,9.8 28.1,10 C28.5,10.2 28.7,10.5 28.7,11.1 C28.7,12 28.2,12.4 27.9,12.5 Z M29.4,9.8 L33.4,9.8 L33.4,10.8 L30.6,10.8 L30.6,11.7 L33.3,11.7 L33.3,12.7 L30.6,12.7 L30.6,13.7 L33.4,13.7 L33.4,14.8 L29.4,14.8 L29.4,9.8 Z M21.3,12.2 L19.8,12.2 L19.8,10.9 L21.4,10.9 C21.8,10.9 22.1,11.1 22.1,11.5 C22.1,11.9 21.8,12.2 21.3,12.2 Z M18.6,14.4 L16.8,12.3 L18.6,10.3 L18.6,14.4 Z M13.8,13.8 L10.9,13.8 L10.9,12.8 L13.5,12.8 L13.5,11.8 L10.9,11.8 L10.9,10.9 L13.9,10.9 L15.2,12.4 L13.8,13.8 Z M23.3,11.5 C23.3,12.9 22.3,13.2 21.2,13.2 L19.7,13.2 L19.7,14.9 L17.4,14.9 L16,13.2 L14.5,14.9 L9.7,14.9 L9.7,9.8 L14.5,9.8 L16,11.5 L17.5,9.8 L21.3,9.8 C22.3,9.8 23.3,10.1 23.3,11.5 Z" id="Shape_4_"></path>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g id="visa" transform="translate(200.000000, 4.000000)" fill="url(#linearGradient-2)">
|
||||||
|
<path d="M30.7,0.4 L26.6,19.7 L21.6,19.7 L25.7,0.4 L30.7,0.4 Z M51.8,12.8 L54.4,5.5 L55.9,12.8 L51.8,12.8 Z M57.4,19.7 L62,19.7 L58,0.4 L53.7,0.4 C52.7,0.4 51.9,1 51.6,1.8 L44,19.7 L49.3,19.7 L50.3,16.8 L56.7,16.8 L57.4,19.7 Z M44.3,13.4 C44.3,8.3 37.2,8 37.3,5.7 C37.3,5 38,4.3 39.4,4.1 C40.1,4 42.1,3.9 44.3,5 L45.2,0.9 C44,0.4 42.5,0 40.5,0 C35.5,0 32.1,2.6 32,6.4 C32,9.2 34.5,10.7 36.4,11.7 C38.4,12.6 39,13.3 39,14.1 C39,15.4 37.4,16 36,16 C33.5,16 32,15.3 30.9,14.8 L30,19 C31.2,19.5 33.3,20 35.6,20 C40.8,20 44.3,17.4 44.3,13.4 Z M23.5,0.4 L15.4,19.7 L10.1,19.7 L6.1,4.3 C5.9,3.3 5.6,3 4.9,2.6 C3.7,1.9 1.7,1.3 0,1 L0.1,0.4 L8.6,0.4 C9.7,0.4 10.7,1.1 10.9,2.4 L13,13.6 L18.2,0.4 L23.5,0.4 Z" id="Fill-1"></path>
|
||||||
|
</g>
|
||||||
|
<g id="mastercard-seeklogo.com" transform="translate(129.000000, 0.000000)">
|
||||||
|
<path d="M7.1,29.9 L7.1,27.9 C7.1,27.1 6.6,26.6 5.8,26.6 C5.4,26.6 5,26.7 4.7,27.2 C4.5,26.8 4.1,26.6 3.6,26.6 C3.3,26.6 2.9,26.7 2.7,27.1 L2.7,26.7 L2,26.7 L2,29.9 L2.7,29.9 L2.7,28.1 C2.7,27.5 3,27.3 3.5,27.3 C4,27.3 4.2,27.6 4.2,28.1 L4.2,29.9 L4.9,29.9 L4.9,28.1 C4.9,27.5 5.2,27.3 5.7,27.3 C6.2,27.3 6.4,27.6 6.4,28.1 L6.4,29.9 L7.1,29.9 Z M17.5,26.7 L16.4,26.7 L16.4,25.7 L15.7,25.7 L15.7,26.7 L15,26.7 L15,27.3 L15.6,27.3 L15.6,28.8 C15.6,29.5 15.9,30 16.7,30 C17,30 17.3,29.9 17.6,29.8 L17.4,29.2 C17.2,29.3 17,29.4 16.8,29.4 C16.5,29.4 16.3,29.2 16.3,28.9 L16.3,27.5 L17.4,27.5 L17.4,26.7 L17.5,26.7 Z M23.4,26.6 C23,26.6 22.7,26.8 22.6,27.1 L22.6,26.7 L21.9,26.7 L21.9,29.9 L22.6,29.9 L22.6,28.1 C22.6,27.6 22.8,27.3 23.3,27.3 C23.4,27.3 23.6,27.3 23.7,27.4 L23.9,26.7 C23.8,26.6 23.6,26.6 23.4,26.6 Z M14.4,26.9 C14.1,26.7 13.6,26.6 13.1,26.6 C12.3,26.6 11.8,27 11.8,27.6 C11.8,28.1 12.2,28.4 12.9,28.5 L13.2,28.5 C13.6,28.6 13.8,28.7 13.8,28.8 C13.8,29 13.5,29.2 13.1,29.2 C12.6,29.2 12.3,29 12,28.9 L11.7,29.4 C12.1,29.7 12.6,29.8 13.1,29.8 C14,29.8 14.6,29.4 14.6,28.8 C14.6,28.2 14.2,27.9 13.5,27.8 L13.2,27.8 C12.9,27.8 12.7,27.7 12.7,27.5 C12.7,27.3 12.9,27.1 13.3,27.1 C13.7,27.1 14.1,27.3 14.3,27.4 L14.4,26.9 Z M33.1,26.6 C32.7,26.6 32.4,26.8 32.3,27.1 L32.3,26.7 L31.6,26.7 L31.6,29.9 L32.3,29.9 L32.3,28.1 C32.3,27.6 32.5,27.3 33,27.3 C33.1,27.3 33.3,27.3 33.4,27.4 L33.6,26.7 C33.4,26.6 33.2,26.6 33.1,26.6 Z M24.1,28.3 C24.1,29.3 24.8,30 25.8,30 C26.3,30 26.6,29.9 26.9,29.6 L26.7,29 C26.4,29.2 26.2,29.3 25.9,29.3 C25.3,29.3 24.9,28.9 24.9,28.3 C24.9,27.7 25.3,27.3 25.9,27.3 C26.2,27.3 26.5,27.4 26.7,27.6 L27,27 C26.7,26.7 26.3,26.6 25.9,26.6 C24.8,26.6 24.1,27.3 24.1,28.3 Z M30.6,28.3 L30.6,26.7 L29.9,26.7 L29.9,27.1 C29.7,26.8 29.3,26.6 28.9,26.6 C28,26.6 27.3,27.3 27.3,28.3 C27.3,29.3 28,30 28.9,30 C29.4,30 29.7,29.8 29.9,29.5 L29.9,29.9 L30.6,29.9 L30.6,28.3 Z M28.1,28.3 C28.1,27.7 28.5,27.3 29.1,27.3 C29.7,27.3 30.1,27.7 30.1,28.3 C30.1,28.9 29.7,29.3 29.1,29.3 C28.4,29.3 28.1,28.8 28.1,28.3 Z M19.7,26.6 C18.8,26.6 18.1,27.3 18.1,28.3 C18.1,29.3 18.8,30 19.7,30 C20.2,30 20.6,29.9 21,29.6 L20.7,29 C20.4,29.2 20.1,29.3 19.8,29.3 C19.4,29.3 18.9,29.1 18.8,28.5 L21.2,28.5 L21.2,28.2 C21.2,27.3 20.6,26.6 19.7,26.6 Z M19.7,27.2 C20.1,27.2 20.4,27.5 20.5,28 L18.8,28 C18.9,27.5 19.2,27.2 19.7,27.2 Z M37.1,28.3 L37.1,25.5 L36.4,25.5 L36.4,27.2 C36.2,26.9 35.8,26.7 35.4,26.7 C34.5,26.7 33.8,27.4 33.8,28.4 C33.8,29.4 34.5,30.1 35.4,30.1 C35.9,30.1 36.2,29.9 36.4,29.6 L36.4,30 L37.1,30 L37.1,28.3 Z M34.5,28.3 C34.5,27.7 34.9,27.3 35.5,27.3 C36.1,27.3 36.5,27.7 36.5,28.3 C36.5,28.9 36.1,29.3 35.5,29.3 C34.9,29.3 34.5,28.8 34.5,28.3 Z M11,28.3 L11,26.7 L10.3,26.7 L10.3,27.1 C10.1,26.8 9.7,26.6 9.3,26.6 C8.4,26.6 7.7,27.3 7.7,28.3 C7.7,29.3 8.4,30 9.3,30 C9.8,30 10.1,29.8 10.3,29.5 L10.3,29.9 L11,29.9 L11,28.3 Z M8.4,28.3 C8.4,27.7 8.8,27.3 9.4,27.3 C10,27.3 10.4,27.7 10.4,28.3 C10.4,28.9 10,29.3 9.4,29.3 C8.8,29.3 8.4,28.8 8.4,28.3 Z" id="Shape" fill="#000000" fill-rule="nonzero"></path>
|
||||||
|
<rect id="Rectangle" fill="#FF5F00" x="14.2" y="2.5" width="10.5" height="18.7"></rect>
|
||||||
|
<path d="M14.9,11.9 C14.9,8.1 16.7,4.7 19.5,2.5 C17.4,1 14.8,0 12,0 C5.4,0 0,5.3 0,11.9 C0,18.5 5.4,23.8 12,23.8 C14.8,23.8 17.4,22.8 19.4,21.3 C16.7,19.1 14.9,15.7 14.9,11.9 Z" id="Path" fill="#EB001B"></path>
|
||||||
|
<path d="M39,11.9 C39,18.5 33.6,23.8 27,23.8 C24.2,23.8 21.6,22.8 19.6,21.3 C22.4,19.1 24.2,15.7 24.2,11.9 C24.2,8.1 22.4,4.7 19.6,2.5 C21.5,1 24.1,0 26.9,0 C33.6,0 39,5.4 39,11.9 Z" id="Path_1_" fill="#F79E1B"></path>
|
||||||
|
</g>
|
||||||
|
<g id="Group" transform="translate(0.000000, 0.761905)">
|
||||||
|
<path d="M52.80358,3.95309044 C53.4023794,3.64708353 54.1410993,3.8755569 54.4534379,4.46280716 L54.4534379,4.46280716 L57.0770217,9.41994225 L59.7009065,4.46280716 C60.013245,3.8755569 60.7519649,3.64708353 61.3513661,3.95309044 C61.9510682,4.25850775 62.1836671,4.98284203 61.8716295,5.57009228 L61.8716295,5.57009228 L56.2922635,16.1170126 C56.0822324,16.5105764 55.6811271,16.7434718 55.2589584,16.7605705 C55.0513345,16.770299 54.8385953,16.7269628 54.6412021,16.6261397 C54.0418009,16.3210172 53.808901,15.5966829 54.1212396,15.0091379 L54.1212396,15.0091379 L55.6976768,12.0227698 L52.2824139,5.57009228 C51.9700754,4.98284203 52.2029752,4.25909736 52.80358,3.95309044 Z M82.1554924,3.65852194 C83.4779664,3.65852194 84.7216035,4.16322698 85.6568138,5.07918409 C86.1355524,5.547923 86.1355524,6.30704419 85.6568138,6.77489869 C85.1789779,7.24304799 84.4047514,7.24304799 83.9266146,6.77489869 C83.4532922,6.31117145 82.8247033,6.05587089 82.1554924,6.05587089 C81.4856796,6.05587089 80.8570907,6.31117145 80.3834674,6.77489869 C79.910446,7.23862592 79.649562,7.85506181 79.649562,8.51070668 C79.649562,9.16605674 79.910446,9.78219783 80.3834674,10.2465147 C80.8570907,10.7096523 81.4856796,10.9652477 82.1554924,10.9652477 C82.8247033,10.9652477 83.4532922,10.7096523 83.9266146,10.2465147 C84.4047514,9.77807057 85.1789779,9.77807057 85.6568138,10.2465147 C86.1355524,10.714664 86.1355524,11.4731956 85.6568138,11.9413449 C84.7216035,12.857302 83.4779664,13.362007 82.1554924,13.362007 C80.8324165,13.362007 79.5887794,12.857302 78.6535691,11.9413449 C77.7183588,11.025093 77.2032108,9.80666659 77.2032108,8.51070668 C77.2032108,7.21504158 77.7183588,5.9957308 78.6535691,5.07918409 C79.5887794,4.16322698 80.8324165,3.65852194 82.1554924,3.65852194 Z M92.0477184,3.65861038 C94.7781233,3.65861038 97,5.83574048 97,8.51079512 C97,11.1858498 94.7781233,13.3620954 92.0477184,13.3620954 C89.3176145,13.3620954 87.0957378,11.1858498 87.0957378,8.51079512 C87.0957378,5.83574048 89.3176145,3.65861038 92.0477184,3.65861038 Z M49.4700729,3.81748044 C50.1453019,3.81748044 50.6932485,4.35372955 50.6932485,5.01586011 L50.6932485,5.01586011 L50.6932485,12.0263075 C50.6932485,12.6878484 50.1453019,13.2246871 49.4700729,13.2246871 C48.7945429,13.2246871 48.2465963,12.6878484 48.2465963,12.0263075 L48.2465963,12.0263075 L48.2465963,5.01586011 C48.2465963,4.35372955 48.7945429,3.81748044 49.4700729,3.81748044 Z M70.1055423,3.817392 C70.3968176,3.80736865 70.6926065,3.89993722 70.9333298,4.09745613 C71.451186,4.52315361 71.5182876,5.27903195 71.0843837,5.78668504 L71.0843837,5.78668504 L66.7667092,10.8275446 L70.147368,10.8275446 C70.822898,10.8275446 71.3708446,11.3643833 71.3708446,12.026219 C71.3708446,12.68776 70.822898,13.2245987 70.147368,13.2245987 L70.147368,13.2245987 L64.1428244,13.2245987 C63.8647889,13.2245987 63.5858507,13.1332094 63.3562608,12.9445346 C62.8387055,12.5191319 62.7719048,11.7629588 63.2058087,11.2561901 L63.2058087,11.2561901 L67.5240851,6.21415134 L64.6997981,6.21415134 C64.0248699,6.21415134 63.4769234,5.67790223 63.4769234,5.01606648 C63.4769234,4.35393591 64.0248699,3.817392 64.6997981,3.817392 L64.6997981,3.817392 Z M74.376336,3.81748044 C75.0521669,3.81748044 75.5995117,4.35372955 75.5995117,5.01586011 L75.5995117,5.01586011 L75.5995117,12.0263075 C75.5995117,12.6878484 75.0521669,13.2246871 74.376336,13.2246871 C73.7008061,13.2246871 73.1528595,12.6878484 73.1528595,12.0263075 L73.1528595,12.0263075 L73.1528595,5.01586011 C73.1528595,4.35372955 73.7008061,3.81748044 74.376336,3.81748044 Z M92.0477184,6.05595933 C90.6665681,6.05595933 89.542089,7.15705356 89.542089,8.51079512 C89.542089,9.86394707 90.6665681,10.9653361 92.0477184,10.9653361 C93.4291697,10.9653361 94.5530469,9.86394707 94.5530469,8.51079512 C94.5530469,7.15705356 93.4291697,6.05595933 92.0477184,6.05595933 Z M49.4700729,-1.99840144e-13 C50.2160144,-1.99840144e-13 50.8217346,0.59344115 50.8217346,1.32485073 C50.8217346,2.05655512 50.2160144,2.64970147 49.4700729,2.64970147 C48.7229277,2.64970147 48.1181102,2.05655512 48.1181102,1.32485073 C48.1181102,0.59344115 48.7229277,-1.99840144e-13 49.4700729,-1.99840144e-13 Z M74.376336,-1.99840144e-13 C75.1228794,-1.99840144e-13 75.7279978,0.59344115 75.7279978,1.32485073 C75.7279978,2.05655512 75.1228794,2.64970147 74.376336,2.64970147 C73.6294918,2.64970147 73.0243734,2.05655512 73.0243734,1.32485073 C73.0243734,0.59344115 73.6294918,-1.99840144e-13 74.376336,-1.99840144e-13 Z" id="Combined-Shape" fill="#1E64FF"></path>
|
||||||
|
<path d="M66.708643,20.4523488 C68.7783092,20.4523488 70.8240554,22.1905313 70.8240554,24.7028054 C70.8240554,27.2150795 68.7783092,28.952381 66.708643,28.952381 C64.6392684,28.952381 62.5935222,27.2150795 62.5935222,24.7028054 C62.5935222,22.1905313 64.6392684,20.4523488 66.708643,20.4523488 Z M77.04516,20.3690958 C77.3879166,20.3690958 77.6837082,20.6551221 77.6837082,21.0001744 L77.6837082,28.3097028 C77.6837082,28.6553423 77.3879166,28.9407813 77.04516,28.9407813 C76.7021117,28.9407813 76.4182801,28.6553423 76.4182801,28.3097028 L76.4182801,27.6668777 C76.3357268,28.2025163 75.6020819,28.9522341 74.4787155,28.9522341 C73.1663225,28.9522341 71.5937262,27.9285301 71.5937262,25.774523 C71.5937262,23.6548743 73.1779908,22.6073838 74.4787155,22.6073838 C75.3538387,22.6073838 76.1108202,23.0602098 76.4182801,23.7500206 L76.4182801,23.2739954 C76.4182801,23.2384623 76.4182801,23.1905955 76.4302401,23.1550624 L76.4302401,21.0001744 C76.4302401,20.6551221 76.7143635,20.3690958 77.04516,20.3690958 Z M48.6265568,22.6435041 C48.8864684,22.6435041 49.1110833,22.8696235 49.1110833,23.1436097 L49.1110833,28.4286357 C49.1110833,28.7149556 48.8864684,28.9407813 48.6265568,28.9407813 C48.3546852,28.9407813 48.1297785,28.7149556 48.1297785,28.4286357 L48.1297785,23.1436097 C48.1297785,22.8696235 48.3546852,22.6435041 48.6265568,22.6435041 Z M50.9206046,20.3691545 C51.1810996,20.3691545 51.4057145,20.5958612 51.4057145,20.8575136 L51.4057145,28.4286944 C51.4057145,28.6906405 51.1810996,28.9285063 50.9206046,28.9285063 C50.6484413,28.9285063 50.4241181,28.6906405 50.4241181,28.4286944 L50.4241181,20.8575136 C50.4241181,20.5958612 50.6484413,20.3691545 50.9206046,20.3691545 Z M55.497732,22.6074425 C56.8457134,22.6074425 58.4652746,23.6790133 58.4652746,25.607782 C58.4652746,25.9880737 58.2406597,26.1672072 57.8389782,26.1672072 L53.4872825,26.1434206 C53.5934641,27.4766438 54.6106489,28.1074287 55.627542,28.1074287 C56.1712851,28.1074287 56.6088467,27.9526691 56.9988599,27.6546027 C57.1765099,27.5359634 57.2829832,27.4766438 57.4127932,27.4766438 C57.6379915,27.4766438 57.7794698,27.6314034 57.7794698,27.8454827 C57.7794698,27.9764557 57.7205448,28.1074287 57.5192665,28.2859749 C57.0464083,28.7023869 56.3492269,28.9285063 55.6036219,28.9285063 C54.0899506,28.9285063 52.4703894,27.9285889 52.4703894,25.7860346 C52.4703894,23.6434803 54.149459,22.6074425 55.497732,22.6074425 Z M81.8114016,22.6073838 C83.1593829,22.6073838 84.7795276,23.6789546 84.7795276,25.5716029 C84.7795276,26.059962 84.5073643,26.2505483 83.9989177,26.2505483 L80.0375269,26.2382145 C80.1673369,27.3453184 81.0307917,27.8932908 81.9767998,27.8932908 C82.4619098,27.8932908 82.792998,27.7743578 83.1593829,27.5482385 C83.3603695,27.441052 83.4904712,27.3576522 83.6558694,27.3576522 C83.9280327,27.3576522 84.0937227,27.5482385 84.0937227,27.8098909 C84.0937227,27.9649442 84.0345061,28.1314502 83.7743028,28.3452358 C83.3250729,28.7149556 82.674273,28.9284475 81.9292515,28.9284475 C80.3925352,28.9284475 78.7487622,27.9408639 78.7487622,25.7859758 C78.7487622,23.6434215 80.4634202,22.6073838 81.8114016,22.6073838 Z M74.6799939,23.6904074 C73.8168307,23.6904074 72.8469026,24.3696464 72.8469026,25.774523 C72.8469026,27.1908524 73.8168307,27.8692105 74.6799939,27.8692105 C75.484232,27.8692105 76.4774968,27.2501721 76.4774968,25.774523 C76.4774968,24.2862465 75.484232,23.6904074 74.6799939,23.6904074 Z M66.708643,21.6669328 C65.2658566,21.6669328 63.9298353,22.8935569 63.9298353,24.7028054 C63.9298353,26.5120539 65.2658566,27.7263442 66.708643,27.7263442 C68.1514293,27.7263442 69.4877424,26.5120539 69.4877424,24.7028054 C69.4877424,22.8935569 68.1630976,21.6669328 66.708643,21.6669328 Z M55.497732,23.4769742 C54.6223172,23.4769742 53.5934641,24.0716387 53.4872825,25.4048619 L57.5075982,25.4048619 C57.4014166,24.0716387 56.3842318,23.4769742 55.497732,23.4769742 Z M81.8114016,23.7027411 C81.0307917,23.7027411 80.1440002,24.2028467 80.0375269,25.3337371 L83.5613561,25.3337371 C83.4551745,24.2028467 82.6039714,23.7027411 81.8114016,23.7027411 Z M48.6265568,20.2501629 C48.8864684,20.2501629 49.1230433,20.4762822 49.1230433,20.7502684 C49.1230433,21.0239609 48.8864684,21.250374 48.6265568,21.250374 C48.3546852,21.250374 48.1181102,21.0239609 48.1181102,20.7502684 C48.1181102,20.4762822 48.3546852,20.2501629 48.6265568,20.2501629 Z M68.1630976,18.2857143 C68.5414425,18.2857143 68.8489025,18.5952335 68.8489025,18.9649533 C68.8489025,19.3337922 68.5414425,19.6433114 68.1630976,19.6433114 C67.7847527,19.6433114 67.4772928,19.3337922 67.4772928,18.9649533 C67.4772928,18.5952335 67.7847527,18.2857143 68.1630976,18.2857143 Z M65.25448,18.2857143 C65.6325332,18.2857143 65.9397014,18.5952335 65.9397014,18.9649533 C65.9397014,19.3337922 65.6325332,19.6433114 65.25448,19.6433114 C64.8758434,19.6433114 64.5683834,19.3337922 64.5683834,18.9649533 C64.5683834,18.5952335 64.8758434,18.2857143 65.25448,18.2857143 Z" id="Combined-Shape" fill="#495057"></path>
|
||||||
|
<g fill="url(#linearGradient-3)" id="Group-3">
|
||||||
|
<path d="M3.78070866,0 C1.69274929,0 0,1.70531217 0,3.80952381 L0,26.6666667 C0,28.7708783 1.69274929,30.4761905 3.78070866,30.4761905 L32.3232107,30.4761905 C33.732995,30.4761905 35.0254932,29.6861799 35.6764472,28.4258201 L41.581074,16.9975873 C41.8606784,16.4557884 42.0028331,15.8635344 42.007874,15.2706032 L42.007874,15.2055873 C42.0028331,14.6126561 41.8606784,14.0204021 41.581074,13.4789418 L35.6764472,2.05037037 C35.0254932,0.790349206 33.732995,0 32.3232107,0 L3.78070866,0 Z" id="Fill-1"></path>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 32 KiB |
BIN
public/uni-logo/abdullah-gul-universitesi.png
Normal file
|
After Width: | Height: | Size: 2.6 KiB |
BIN
public/uni-logo/acibadem-mehmet-ali-aydinlar-universitesi.png
Normal file
|
After Width: | Height: | Size: 7.9 KiB |
BIN
public/uni-logo/ada-kent-universitesi.png
Normal file
|
After Width: | Height: | Size: 130 KiB |
|
After Width: | Height: | Size: 17 KiB |
BIN
public/uni-logo/adiyaman-universitesi.png
Normal file
|
After Width: | Height: | Size: 26 KiB |
BIN
public/uni-logo/afyon-kocatepe-universitesi.png
Normal file
|
After Width: | Height: | Size: 32 KiB |
BIN
public/uni-logo/afyonkarahisar-saglik-bilimleri-universitesi.png
Normal file
|
After Width: | Height: | Size: 23 KiB |
BIN
public/uni-logo/agri-ibrahim-cecen-universitesi.png
Normal file
|
After Width: | Height: | Size: 42 KiB |
BIN
public/uni-logo/akdeniz-karpaz-universitesi.png
Normal file
|
After Width: | Height: | Size: 32 KiB |
BIN
public/uni-logo/akdeniz-universitesi.png
Normal file
|
After Width: | Height: | Size: 20 KiB |
BIN
public/uni-logo/aksaray-universitesi.png
Normal file
|
After Width: | Height: | Size: 8.6 KiB |
BIN
public/uni-logo/alanya-alaaddin-keykubat-universitesi.png
Normal file
|
After Width: | Height: | Size: 29 KiB |
BIN
public/uni-logo/alanya-universitesi.png
Normal file
|
After Width: | Height: | Size: 6.1 KiB |
BIN
public/uni-logo/altinbas-universitesi.png
Normal file
|
After Width: | Height: | Size: 4.8 KiB |
BIN
public/uni-logo/amasya-universitesi.png
Normal file
|
After Width: | Height: | Size: 79 KiB |
BIN
public/uni-logo/anadolu-universitesi.png
Normal file
|
After Width: | Height: | Size: 29 KiB |
BIN
public/uni-logo/ankara-bilim-universitesi.png
Normal file
|
After Width: | Height: | Size: 16 KiB |
BIN
public/uni-logo/ankara-haci-bayram-veli-universitesi.png
Normal file
|
After Width: | Height: | Size: 1.3 KiB |
BIN
public/uni-logo/ankara-medipol-universitesi.png
Normal file
|
After Width: | Height: | Size: 18 KiB |
BIN
public/uni-logo/ankara-muzik-ve-guzel-sanatlar-universitesi.png
Normal file
|
After Width: | Height: | Size: 28 KiB |
BIN
public/uni-logo/ankara-sosyal-bilimler-universitesi.png
Normal file
|
After Width: | Height: | Size: 17 KiB |
BIN
public/uni-logo/ankara-universitesi.png
Normal file
|
After Width: | Height: | Size: 15 KiB |
BIN
public/uni-logo/ankara-yildirim-beyazit-universitesi.png
Normal file
|
After Width: | Height: | Size: 5.1 KiB |
BIN
public/uni-logo/antalya-belek-universitesi.png
Normal file
|
After Width: | Height: | Size: 38 KiB |
BIN
public/uni-logo/antalya-bilim-universitesi.png
Normal file
|
After Width: | Height: | Size: 3.4 KiB |
BIN
public/uni-logo/ardahan-universitesi.png
Normal file
|
After Width: | Height: | Size: 18 KiB |
|
After Width: | Height: | Size: 6.9 KiB |
BIN
public/uni-logo/artvin-coruh-universitesi.png
Normal file
|
After Width: | Height: | Size: 108 KiB |
BIN
public/uni-logo/atasehir-adiguzel-meslek-yuksekokulu.png
Normal file
|
After Width: | Height: | Size: 11 KiB |
BIN
public/uni-logo/ataturk-universitesi.png
Normal file
|
After Width: | Height: | Size: 34 KiB |
BIN
public/uni-logo/atilim-universitesi.png
Normal file
|
After Width: | Height: | Size: 31 KiB |