@turk.net/mui 3.0.8 → 3.0.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.opencode/rules/design-compliance.md +17 -5
- package/.opencode/skills/onehub-design-verification/SKILL.md +4 -4
- package/.opencode/skills/turknet-onehub-component-usage/SKILL.md +73 -14
- package/COMPONENT_MAP.md +678 -57
- package/DESIGN_RULES.md +43 -19
- package/DESIGN_SOURCES.md +22 -0
- package/DESIGN_TOKENS_MAP.md +14 -5
- package/ESLINT_DESIGN_RULES.md +5 -3
- package/LLM_EXAMPLES.md +5 -5
- package/LLM_GUIDELINES.md +60 -6
- package/PAGE_PATTERNS.md +62 -0
- package/SKILL_SETUP.md +14 -14
- package/dist/index.js +75 -4
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +76 -5
- package/dist/index.mjs.map +1 -1
- package/dist/theme/components/Tabs.d.mts +3 -0
- package/dist/theme/components/Tabs.d.ts +3 -0
- package/dist/theme/index.js +75 -4
- package/dist/theme/index.js.map +1 -1
- package/dist/theme/index.mjs +76 -5
- package/dist/theme/index.mjs.map +1 -1
- package/package.json +1 -1
package/DESIGN_RULES.md
CHANGED
|
@@ -37,7 +37,8 @@ Font weights: `400` (Regular), `500` (Medium), `600` (Semibold), `700` (Bold).
|
|
|
37
37
|
|
|
38
38
|
| Context | Variant | Weight |
|
|
39
39
|
|---------|---------|--------|
|
|
40
|
-
| Page title | `display.lg.bold` or `display.md.semibold` | 600-700 |
|
|
40
|
+
| Page title (ana sayfa başlığı) | `display.lg.bold` or `display.md.semibold` | 600-700 |
|
|
41
|
+
| Page title (sayfa içi başlık) | `text.xl.medium` or `display.xs.bold` | 500-700 |
|
|
41
42
|
| Section header | `text.lg.medium` or `text.md.semibold` | 500-600 |
|
|
42
43
|
| Body text | `text.md.regular` or `text.sm.regular` | 400 |
|
|
43
44
|
| Table header | `text.xs.medium` | 500 |
|
|
@@ -46,6 +47,7 @@ Font weights: `400` (Regular), `500` (Medium), `600` (Semibold), `700` (Bold).
|
|
|
46
47
|
| Helper/error text | `text.xs.regular` | 400 |
|
|
47
48
|
| Button text | `text.sm.medium` | 500 |
|
|
48
49
|
| Chip/Badge text | `text.xs.medium` | 500 |
|
|
50
|
+
| Modal title | `text.lg.semibold` | 600 |
|
|
49
51
|
|
|
50
52
|
---
|
|
51
53
|
|
|
@@ -87,7 +89,7 @@ Component color props MUST use ONLY the values listed below:
|
|
|
87
89
|
| `Checkbox` | `primary`, `error` |
|
|
88
90
|
| `Radio` | `primary`, `error` |
|
|
89
91
|
| `Switch` | `primary`, `error` |
|
|
90
|
-
| `Chip` | `primary`, `secondary`, `error` |
|
|
92
|
+
| `Chip` | `primary`, `secondary`, `error`, `danger`, `success`, `informative`, `brand`, `severewarning`, `important` |
|
|
91
93
|
| `Badge` | `default`, `brand`, `success`, `danger`, `severewarning`, `warning`, `important` |
|
|
92
94
|
| `Alert` | `success`, `warning`, `error`, `info` |
|
|
93
95
|
|
|
@@ -180,8 +182,8 @@ function MyButton({ children }: { children: React.ReactNode }) {
|
|
|
180
182
|
|
|
181
183
|
| Layout | Import | Use Case |
|
|
182
184
|
|--------|--------|----------|
|
|
183
|
-
| TabBased | `@
|
|
184
|
-
|
|
|
185
|
+
| TabBased | `@turk.net/mui/layouts/app/TabBased` | Tab-based application layout |
|
|
186
|
+
| Dashboard | Modül başına özel (`src/components/layouts/dashboard/`) | Sidebar + content layout |
|
|
185
187
|
| Empty | Custom per module | No layout (passthrough) |
|
|
186
188
|
| Login | Custom per module | Authentication pages |
|
|
187
189
|
|
|
@@ -191,15 +193,17 @@ function MyButton({ children }: { children: React.ReactNode }) {
|
|
|
191
193
|
|
|
192
194
|
### 5.1 — Icon Source
|
|
193
195
|
|
|
194
|
-
**MUST import icons from `@
|
|
196
|
+
**MUST import icons from `@turk.net/mui/icons/*`** (SVG React components — tercih edilen) or the project's Tune icon font.
|
|
195
197
|
|
|
196
198
|
```typescript
|
|
197
|
-
// ✅ CORRECT — SVG icons
|
|
198
|
-
import
|
|
199
|
+
// ✅ CORRECT — SVG icons (tercih edilen)
|
|
200
|
+
import Settings01Icon from "@turk.net/mui/icons/Settings01Icon";
|
|
201
|
+
import ArrowRightIcon from "@turk.net/mui/icons/ArrowRightIcon";
|
|
202
|
+
import SearchMdIcon from "@turk.net/mui/icons/SearchMdIcon";
|
|
199
203
|
|
|
200
|
-
// ✅ CORRECT — Tune icon font
|
|
204
|
+
// ✅ CORRECT — Tune icon font (eski projelerde)
|
|
201
205
|
import { TuneIcon } from '@/components/ui/icon';
|
|
202
|
-
<TuneIcon name="
|
|
206
|
+
<TuneIcon name="search-md" size="20px" />
|
|
203
207
|
```
|
|
204
208
|
|
|
205
209
|
### 5.2 — Icon Sizing
|
|
@@ -278,16 +282,36 @@ import * as yup from 'yup';
|
|
|
278
282
|
|
|
279
283
|
### 9.2 — Form Components
|
|
280
284
|
|
|
281
|
-
| Field Type | MUI Component |
|
|
282
|
-
|
|
283
|
-
| Text input | `TextField` |
|
|
284
|
-
|
|
|
285
|
-
|
|
|
286
|
-
|
|
|
287
|
-
|
|
|
288
|
-
|
|
|
289
|
-
|
|
|
290
|
-
|
|
|
285
|
+
| Field Type | MUI Component | Notes |
|
|
286
|
+
|-----------|---------------|-------|
|
|
287
|
+
| Text input (standard) | `TextField variant="outlined"` | Varsayılan form alanı |
|
|
288
|
+
| Text input (login) | `TextField variant="filled"` | Login/parola sayfaları |
|
|
289
|
+
| Dropdown | `Select` + `MenuItem` | |
|
|
290
|
+
| Autocomplete | `Autocomplete` | |
|
|
291
|
+
| Checkbox | `Checkbox` + `FormControlLabel` | |
|
|
292
|
+
| Radio group | `RadioGroup` + `Radio` + `FormControlLabel` | |
|
|
293
|
+
| Switch | `Switch` + `FormControlLabel` | |
|
|
294
|
+
| Date picker | `DatePicker` (`@mui/x-date-pickers`) | `dayjs` adapter |
|
|
295
|
+
| Search (inline) | `InputBase` + search icon | Tablo üstü arama |
|
|
296
|
+
| Submit | `Button variant="contained" color="primary"` | |
|
|
297
|
+
|
|
298
|
+
### 9.3 — Formik Configuration
|
|
299
|
+
|
|
300
|
+
```typescript
|
|
301
|
+
import { useFormik } from "formik";
|
|
302
|
+
import * as Yup from "yup";
|
|
303
|
+
|
|
304
|
+
const form = useFormik({
|
|
305
|
+
initialValues: { email: "", password: "" },
|
|
306
|
+
validationSchema: Yup.object().shape({
|
|
307
|
+
email: Yup.string().required("Zorunlu alan"),
|
|
308
|
+
password: Yup.string().required("Zorunlu alan"),
|
|
309
|
+
}),
|
|
310
|
+
onSubmit: (values) => { /* ... */ },
|
|
311
|
+
validateOnChange: false, // Sadece submit'te validasyon
|
|
312
|
+
validateOnBlur: false,
|
|
313
|
+
});
|
|
314
|
+
```
|
|
291
315
|
|
|
292
316
|
---
|
|
293
317
|
|
package/DESIGN_SOURCES.md
CHANGED
|
@@ -39,6 +39,28 @@
|
|
|
39
39
|
|
|
40
40
|
## Module → Design Mapping
|
|
41
41
|
|
|
42
|
+
### Activation Module (`tn.onehub.ui.activation`)
|
|
43
|
+
|
|
44
|
+
| Attribute | Value |
|
|
45
|
+
|-----------|-------|
|
|
46
|
+
| **App Path** | `/` (ana uygulama) |
|
|
47
|
+
| **Theme Package** | `@turk.net/mui` |
|
|
48
|
+
| **Figma Doc** | OneHub Pages & Layouts |
|
|
49
|
+
| **Layout** | `TabBasedLayout` from `@turk.net/mui/layouts/app/TabBased` |
|
|
50
|
+
| **Icon System** | `@turk.net/mui/icons/*` + TuneIcon font |
|
|
51
|
+
| **Key Pages** | Login, My Tasks, Team Tasks, Customers, Performance, Ticket Details, Customer Details |
|
|
52
|
+
|
|
53
|
+
### Support Qualcomm Module (`tn.onehub.ui.supportqualcomm`)
|
|
54
|
+
|
|
55
|
+
| Attribute | Value |
|
|
56
|
+
|-----------|-------|
|
|
57
|
+
| **App Path** | `/communication` (örnek) |
|
|
58
|
+
| **Theme Package** | `@turk.net/mui` |
|
|
59
|
+
| **Figma Doc** | OneHub Pages & Layouts |
|
|
60
|
+
| **Layout** | `TabBasedLayout` from `@turk.net/mui/layouts/app/TabBased` |
|
|
61
|
+
| **Icon System** | `@turk.net/mui/icons/*` + TuneIcon font |
|
|
62
|
+
| **Key Pages** | Login, Form Templates, Sent Forms, Operational Feedbacks, Performance Results |
|
|
63
|
+
|
|
42
64
|
### Support Module (`tn.onehub.ui.task`)
|
|
43
65
|
|
|
44
66
|
| Attribute | Value |
|
package/DESIGN_TOKENS_MAP.md
CHANGED
|
@@ -249,15 +249,24 @@ sx={{ padding: 8 }}
|
|
|
249
249
|
|
|
250
250
|
## Sizing System
|
|
251
251
|
|
|
252
|
-
### Component Height Table (from Figma)
|
|
252
|
+
### Component Height Table (from Figma & Gerçek Projeler)
|
|
253
253
|
|
|
254
254
|
| Component | Height | Notes |
|
|
255
255
|
|-----------|--------|-------|
|
|
256
|
+
| Button (extra-small) | `24px` | ButtonGroup sayfa boyutu seçici |
|
|
257
|
+
| Button (small) | `28px` | Compact action button |
|
|
256
258
|
| Button (medium) | `32px` | Standard action button |
|
|
257
|
-
|
|
|
258
|
-
|
|
|
259
|
-
|
|
|
259
|
+
| Button (large) | `40px` | Primary CTA |
|
|
260
|
+
| Button (extra-large) | `48px` | Hero/large CTA |
|
|
261
|
+
| Table Header (MUI Table) | `40px` | TextField/Select ile aynı |
|
|
262
|
+
| Table Row (MUI Table) | `56px` | — |
|
|
263
|
+
| Filter Button | `32px` | Same as medium button |
|
|
260
264
|
| Checkbox/Radio | `16px` | Square (width = height) |
|
|
265
|
+
| TabBased Header (top bar) | `56px` | Global header |
|
|
266
|
+
| Sidebar Width | `256px` | Dashboard sidebar |
|
|
267
|
+
| Modal Paper (default) | `800px` width | Desktop modal |
|
|
268
|
+
| Drawer (right panel) | `400px`-`800px` width | Variable |
|
|
269
|
+
| LinearProgress bar | `8px` height | Progress indicator |
|
|
261
270
|
|
|
262
271
|
---
|
|
263
272
|
|
|
@@ -268,4 +277,4 @@ sx={{ padding: 8 }}
|
|
|
268
277
|
| **Family** | Inter (`var(--font-inter)`) |
|
|
269
278
|
| **Weights** | 400 (Regular), 500 (Medium), 600 (Semibold), 700 (Bold) |
|
|
270
279
|
| **Host Project Responsibility** | MUST define `@font-face` and set `--font-inter` CSS variable |
|
|
271
|
-
| **Package** | Font files NOT distributed by `@
|
|
280
|
+
| **Package** | Font files NOT distributed by `@turk.net/mui`. Host project must self-host (via `next/font/google` — Inter). |
|
package/ESLINT_DESIGN_RULES.md
CHANGED
|
@@ -142,7 +142,9 @@ Detects MUI `color` prop values that are not valid for the specific component.
|
|
|
142
142
|
// ❌ Error
|
|
143
143
|
<Button color="success">Save</Button> // Valid: primary, secondary, error
|
|
144
144
|
<TextField color="primary" /> // Valid: neutral, brand, danger
|
|
145
|
-
<Chip color="success" /> // Valid:
|
|
145
|
+
<Chip color="success" /> // Valid: informative, brand, danger, success, severewarning, important, warning
|
|
146
|
+
|
|
147
|
+
<Chip color="gradient" /> // ❌ NOT valid
|
|
146
148
|
<Badge color="primary" /> // Valid: default, brand, success, danger, ...warning, important
|
|
147
149
|
|
|
148
150
|
// ✅ OK
|
|
@@ -254,7 +256,7 @@ These rules require human or AI judgment because context matters.
|
|
|
254
256
|
| Correct MUI component selected for Figma pattern | Requires visual comparison |
|
|
255
257
|
| Form uses Formik + Yup | Can check imports but can't verify correct usage |
|
|
256
258
|
| Data fetching uses React Query | Can check imports but can't verify correct pattern |
|
|
257
|
-
| Icons from correct source | `@
|
|
259
|
+
| Icons from correct source | `@turk.net/mui/icons/*` vs `@mui/icons-material` can be checked by import source |
|
|
258
260
|
| Accessibility (labels, keyboard nav) | Needs behavioral/visual verification |
|
|
259
261
|
| Border radius matches element type | Context-dependent |
|
|
260
262
|
| Shadow/elevation level appropriate | Context-dependent |
|
|
@@ -342,7 +344,7 @@ design-lint:
|
|
|
342
344
|
name: Design Compliance Check
|
|
343
345
|
script:
|
|
344
346
|
- yarn lint:design
|
|
345
|
-
- node node_modules/@
|
|
347
|
+
- node node_modules/@turk.net/mui/scripts/verify-design.js src/
|
|
346
348
|
```
|
|
347
349
|
|
|
348
350
|
---
|
package/LLM_EXAMPLES.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# LLM Examples — Correct vs. Incorrect Usage
|
|
2
2
|
|
|
3
|
-
This document demonstrates correct and incorrect usage of Material UI components according to the `@
|
|
3
|
+
This document demonstrates correct and incorrect usage of Material UI components according to the `@turk.net/mui` theme package rules.
|
|
4
4
|
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -55,7 +55,7 @@ import { Button } from '@mui/material';
|
|
|
55
55
|
</Button>
|
|
56
56
|
|
|
57
57
|
// ✅ Button with icon
|
|
58
|
-
import { DeleteIcon } from '@
|
|
58
|
+
import { DeleteIcon } from '@turk.net/mui/icons/DeleteIcon';
|
|
59
59
|
|
|
60
60
|
<Button
|
|
61
61
|
variant="contained"
|
|
@@ -197,7 +197,7 @@ import { TextField } from '@mui/material';
|
|
|
197
197
|
/>
|
|
198
198
|
|
|
199
199
|
// ✅ With icon/adornment
|
|
200
|
-
import { SearchIcon } from '@
|
|
200
|
+
import { SearchIcon } from '@turk.net/mui/icons/SearchIcon';
|
|
201
201
|
import { InputAdornment } from '@mui/material';
|
|
202
202
|
|
|
203
203
|
<TextField
|
|
@@ -892,7 +892,7 @@ import {
|
|
|
892
892
|
ListItemButton,
|
|
893
893
|
Divider
|
|
894
894
|
} from '@mui/material';
|
|
895
|
-
import { StarIcon } from '@
|
|
895
|
+
import { StarIcon } from '@turk.net/mui/icons/StarIcon';
|
|
896
896
|
|
|
897
897
|
// ✅ Basic List
|
|
898
898
|
<List>
|
|
@@ -1171,7 +1171,7 @@ import { Paper, Typography, Box } from '@mui/material';
|
|
|
1171
1171
|
|
|
1172
1172
|
```tsx
|
|
1173
1173
|
import { Chip, Badge, Avatar } from '@mui/material';
|
|
1174
|
-
import { DeleteIcon, StarIcon } from '@
|
|
1174
|
+
import { DeleteIcon, StarIcon } from '@turk.net/mui/icons';
|
|
1175
1175
|
|
|
1176
1176
|
// ✅ Basic chip
|
|
1177
1177
|
<Chip label="Kategori" variant="filled" color="primary" />
|
package/LLM_GUIDELINES.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# LLM Guidelines - @
|
|
1
|
+
# LLM Guidelines - @turk.net/mui Material UI Theme Package
|
|
2
2
|
|
|
3
3
|
> **MANDATORY**: You MUST read this document in its entirety. Using Material UI components according to the rules defined in this theme package is **mandatory**.
|
|
4
4
|
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
|
|
21
21
|
### Purpose of This Package
|
|
22
22
|
|
|
23
|
-
`@
|
|
23
|
+
`@turk.net/mui` is a theme package that customizes Material UI components through **theme configuration**. It does **NOT** provide its own components — you use Material UI's base components through this theme.
|
|
24
24
|
|
|
25
25
|
### Critical Rules
|
|
26
26
|
|
|
@@ -141,7 +141,7 @@ palette.[neutral|brand|danger]:
|
|
|
141
141
|
| **Checkbox** | primary, error |
|
|
142
142
|
| **Radio** | primary, error |
|
|
143
143
|
| **Switch** | primary, error |
|
|
144
|
-
| **Chip** |
|
|
144
|
+
| **Chip** | informative, brand, danger, success, severewarning, important, warning |
|
|
145
145
|
| **Alert** | success, warning, error, info (MUI defaults) |
|
|
146
146
|
| **Badge** | primary, secondary, error, success, warning, info |
|
|
147
147
|
| **Typography** | (default) |
|
|
@@ -294,7 +294,7 @@ text.xs.{regular|medium|semibold|bold} → 12px
|
|
|
294
294
|
| Component | MUI Doc | Variants | Sizes | Colors | Typography | Purpose |
|
|
295
295
|
|---|---|---|---|---|---|---|
|
|
296
296
|
| **Typography** | [docs](https://mui.com/api/typography/) | display.*.*, text.*.* | - | (default) | display.xl2-xs, text.xl-xs | Text display, headings |
|
|
297
|
-
| **Chip** | [docs](https://mui.com/api/chip/) | filled,
|
|
297
|
+
| **Chip** | [docs](https://mui.com/api/chip/) | filled, tint, outline, ghost | small, medium | informative, brand, danger, success, severewarning, important, warning | text.xs - text.md | Label, category, tag, status |
|
|
298
298
|
| **Badge** | [docs](https://mui.com/api/badge/) | - | small, medium | primary, secondary, error, success, warning, info | - | Info badge, counter |
|
|
299
299
|
| **Avatar** | [docs](https://mui.com/api/avatar/) | - | small, medium, large | - | - | User profile picture |
|
|
300
300
|
| **AvatarGroup** | [docs](https://mui.com/api/avatar-group/) | - | - | - | - | Avatar grouping |
|
|
@@ -365,7 +365,7 @@ text.xs.{regular|medium|semibold|bold} → 12px
|
|
|
365
365
|
- **Material UI Official Documentation**: https://mui.com
|
|
366
366
|
- **Material UI Theme**: https://mui.com/material-ui/customization/theming/
|
|
367
367
|
- **Material UI Components API**: https://mui.com/material-ui/api/
|
|
368
|
-
- **@
|
|
368
|
+
- **@turk.net/mui Repository**: Your project's repository link
|
|
369
369
|
- **Usage Examples**: You MUST read the `LLM_EXAMPLES.md` file
|
|
370
370
|
|
|
371
371
|
---
|
|
@@ -398,6 +398,60 @@ text.xs.{regular|medium|semibold|bold} → 12px
|
|
|
398
398
|
|
|
399
399
|
---
|
|
400
400
|
|
|
401
|
+
## Layout & Figma Recognition
|
|
402
|
+
|
|
403
|
+
### Figma "Header tab navigation" → TabBased Layout
|
|
404
|
+
|
|
405
|
+
**When a Figma design contains a layer named `"Header tab navigation"`:**
|
|
406
|
+
|
|
407
|
+
This indicates the page uses the TabBased layout (56px header toolbar with navigation buttons). The page content MUST be developed as a **tab** within the existing TabBased layout.
|
|
408
|
+
|
|
409
|
+
```tsx
|
|
410
|
+
// ❌ WRONG — Do NOT implement the header in your page
|
|
411
|
+
function MyPage() {
|
|
412
|
+
return (
|
|
413
|
+
<Box>
|
|
414
|
+
<AppBar position="static">...</AppBar> // ← NEVER do this
|
|
415
|
+
<Box>page content</Box>
|
|
416
|
+
</Box>
|
|
417
|
+
);
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
// ✅ CORRECT — Page as a tab, layout provides header automatically
|
|
421
|
+
function MyPageContent() {
|
|
422
|
+
return (
|
|
423
|
+
<Box>
|
|
424
|
+
<Typography variant="display.xs.bold">Page Title</Typography>
|
|
425
|
+
{/* page content only */}
|
|
426
|
+
</Box>
|
|
427
|
+
);
|
|
428
|
+
}
|
|
429
|
+
```
|
|
430
|
+
|
|
431
|
+
**Layout is handled by:** `@turk.net/mui/layouts/app/TabBased`
|
|
432
|
+
|
|
433
|
+
### Figma "Card" / "Container" → Paper
|
|
434
|
+
|
|
435
|
+
**When a Figma design contains a layer named `"Card"` or `"Container"`** with:
|
|
436
|
+
- Background: `var(--Neutral-Background-2-Rest, #FAFAFA)` or white
|
|
437
|
+
- Box Shadow: `0 0 2px 0 rgba(0,0,0,0.12), 0 1px 2px 0 rgba(0,0,0,0.14)`
|
|
438
|
+
|
|
439
|
+
→ Use `<Paper elevation={2}>` from `@mui/material`
|
|
440
|
+
|
|
441
|
+
```tsx
|
|
442
|
+
// ✅ CORRECT
|
|
443
|
+
<Paper elevation={2}>
|
|
444
|
+
<Box sx={{ p: theme.spacing(4) }}>
|
|
445
|
+
<Typography variant="text.md.medium">Card Title</Typography>
|
|
446
|
+
{/* card content */}
|
|
447
|
+
</Box>
|
|
448
|
+
</Paper>
|
|
449
|
+
```
|
|
450
|
+
|
|
451
|
+
Paper has `8px` borderRadius by default (from theme). If the Figma design has sharp corners, override with `sx={{ borderRadius: 0 }}`.
|
|
452
|
+
|
|
453
|
+
---
|
|
454
|
+
|
|
401
455
|
**Last Updated**: May 2026
|
|
402
456
|
**Version**: 2.0+
|
|
403
|
-
**Package**: @
|
|
457
|
+
**Package**: @turk.net/mui
|
package/PAGE_PATTERNS.md
CHANGED
|
@@ -495,6 +495,66 @@ enqueueSnackbar('Something went wrong', { variant: 'error' });
|
|
|
495
495
|
|
|
496
496
|
---
|
|
497
497
|
|
|
498
|
+
---
|
|
499
|
+
|
|
500
|
+
## Pattern 9: Figma Layer → Layout Decision
|
|
501
|
+
|
|
502
|
+
### 9.1 — "Header tab navigation" Layer → TabBased Layout
|
|
503
|
+
|
|
504
|
+
**When a Figma design contains a layer named `"Header tab navigation"`:**
|
|
505
|
+
|
|
506
|
+
This is the TabBased layout's header (56px toolbar with navigation/action buttons). The page is designed as a **tab** within the existing TabBased layout.
|
|
507
|
+
|
|
508
|
+
**CRITICAL:** Do NOT implement this header in the page component. The header is handled by `@turk.net/mui/layouts/app/TabBased`.
|
|
509
|
+
|
|
510
|
+
```tsx
|
|
511
|
+
// ❌ WRONG
|
|
512
|
+
function MyPage() {
|
|
513
|
+
return (
|
|
514
|
+
<Box>
|
|
515
|
+
<AppBar>...</AppBar> // ← Bunu yapma!
|
|
516
|
+
<Box>content</Box>
|
|
517
|
+
</Box>
|
|
518
|
+
);
|
|
519
|
+
}
|
|
520
|
+
|
|
521
|
+
// ✅ CORRECT
|
|
522
|
+
// Sayfa TabBased layout altında sekme olarak açılır
|
|
523
|
+
// Sadece içeriği geliştir, header'ı layout sağlar
|
|
524
|
+
function MyPageContent() {
|
|
525
|
+
return (
|
|
526
|
+
<Box sx={{ p: theme.spacing(4) }}>
|
|
527
|
+
<Typography variant="display.xs.bold">Sayfa Başlığı</Typography>
|
|
528
|
+
{/* sayfa içeriği */}
|
|
529
|
+
</Box>
|
|
530
|
+
);
|
|
531
|
+
}
|
|
532
|
+
```
|
|
533
|
+
|
|
534
|
+
### 9.2 — "Card" / "Container" Layer → Paper
|
|
535
|
+
|
|
536
|
+
**When a Figma design contains a layer named `"Card"` or `"Container"`** with these styles:
|
|
537
|
+
|
|
538
|
+
| Style | Value |
|
|
539
|
+
|-------|-------|
|
|
540
|
+
| Background | `var(--Neutral-Background-2-Rest, #FAFAFA)` or white |
|
|
541
|
+
| Box Shadow | `0 0 2px 0 rgba(0,0,0,0.12), 0 1px 2px 0 rgba(0,0,0,0.14)` |
|
|
542
|
+
|
|
543
|
+
→ **Use `<Paper elevation={2}>`** from `@mui/material`
|
|
544
|
+
|
|
545
|
+
```tsx
|
|
546
|
+
<Paper elevation={2}>
|
|
547
|
+
<Box sx={{ p: theme.spacing(4) }}>
|
|
548
|
+
<Typography variant="text.md.medium">Card Title</Typography>
|
|
549
|
+
{/* card content */}
|
|
550
|
+
</Box>
|
|
551
|
+
</Paper>
|
|
552
|
+
```
|
|
553
|
+
|
|
554
|
+
**Corner radius:** Paper has `8px` borderRadius by default (from theme). If Figma shows sharp corners (0px), override with `sx={{ borderRadius: 0 }}`.
|
|
555
|
+
|
|
556
|
+
---
|
|
557
|
+
|
|
498
558
|
## Quick Decision Guide
|
|
499
559
|
|
|
500
560
|
| If you need to... | Use Pattern |
|
|
@@ -507,3 +567,5 @@ enqueueSnackbar('Something went wrong', { variant: 'error' });
|
|
|
507
567
|
| Show feedback message | Pattern 6: Notifications |
|
|
508
568
|
| Handle no-data state | Pattern 7: Empty State |
|
|
509
569
|
| Handle loading state | Pattern 8: Loading State |
|
|
570
|
+
| Figma has "Header tab navigation" layer | Pattern 9.1: TabBased layout tab |
|
|
571
|
+
| Figma has "Card" / "Container" layer | Pattern 9.2: Paper elevation={2} |
|
package/SKILL_SETUP.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
# OpenCode Skill & Rule Setup — @
|
|
1
|
+
# OpenCode Skill & Rule Setup — @turk.net/mui Design System
|
|
2
2
|
|
|
3
|
-
This document explains how to set up OpenCode skills, rules, and verification tools for projects using the `@
|
|
3
|
+
This document explains how to set up OpenCode skills, rules, and verification tools for projects using the `@turk.net/mui` MUI theme package.
|
|
4
4
|
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -19,7 +19,7 @@ The complete design verification system ensures AI agents (LLMs) and developers
|
|
|
19
19
|
|
|
20
20
|
- OpenCode CLI installed (`opencode` command works)
|
|
21
21
|
- Project configured with `.opencode.json` or `.opencode/` directory
|
|
22
|
-
- `@
|
|
22
|
+
- `@turk.net/mui` in `package.json` dependencies
|
|
23
23
|
|
|
24
24
|
---
|
|
25
25
|
|
|
@@ -34,7 +34,7 @@ The complete design verification system ensures AI agents (LLMs) and developers
|
|
|
34
34
|
mkdir -p .opencode/skills/turknet-onehub-component-usage
|
|
35
35
|
|
|
36
36
|
# Copy skill file from theme package
|
|
37
|
-
cp node_modules/@
|
|
37
|
+
cp node_modules/@turk.net/mui/.opencode/skills/turknet-onehub-component-usage/SKILL.md \
|
|
38
38
|
.opencode/skills/turknet-onehub-component-usage/SKILL.md
|
|
39
39
|
```
|
|
40
40
|
|
|
@@ -45,7 +45,7 @@ cp node_modules/@turknet/onehub/.opencode/skills/turknet-onehub-component-usage/
|
|
|
45
45
|
mkdir -p .opencode/skills/onehub-design-verification
|
|
46
46
|
|
|
47
47
|
# Copy skill file from theme package
|
|
48
|
-
cp node_modules/@
|
|
48
|
+
cp node_modules/@turk.net/mui/.opencode/skills/onehub-design-verification/SKILL.md \
|
|
49
49
|
.opencode/skills/onehub-design-verification/SKILL.md
|
|
50
50
|
```
|
|
51
51
|
|
|
@@ -58,7 +58,7 @@ The design-compliance rule automatically enforces design constraints whenever AI
|
|
|
58
58
|
mkdir -p .opencode/rules
|
|
59
59
|
|
|
60
60
|
# Copy rule file from theme package
|
|
61
|
-
cp node_modules/@
|
|
61
|
+
cp node_modules/@turk.net/mui/.opencode/rules/design-compliance.md \
|
|
62
62
|
.opencode/rules/design-compliance.md
|
|
63
63
|
```
|
|
64
64
|
|
|
@@ -69,7 +69,7 @@ cp node_modules/@turknet/onehub/.opencode/rules/design-compliance.md \
|
|
|
69
69
|
mkdir -p scripts
|
|
70
70
|
|
|
71
71
|
# Copy verification script
|
|
72
|
-
cp node_modules/@
|
|
72
|
+
cp node_modules/@turk.net/mui/scripts/verify-design.js \
|
|
73
73
|
scripts/verify-design.js
|
|
74
74
|
```
|
|
75
75
|
|
|
@@ -171,7 +171,7 @@ your-project/
|
|
|
171
171
|
├── scripts/
|
|
172
172
|
│ └── verify-design.js # Automated verification script
|
|
173
173
|
├── node_modules/
|
|
174
|
-
│ └── @
|
|
174
|
+
│ └── @turk.net/mui/
|
|
175
175
|
│ ├── DESIGN_RULES.md # Mandatory design rules
|
|
176
176
|
│ ├── COMPONENT_MAP.md # Figma → MUI component mapping
|
|
177
177
|
│ ├── COMPONENT_GLOSSARY.md # Valid component prop combinations
|
|
@@ -214,13 +214,13 @@ In OpenCode, available via `Ctrl+P`:
|
|
|
214
214
|
|
|
215
215
|
```bash
|
|
216
216
|
# Read design rules
|
|
217
|
-
cat node_modules/@
|
|
217
|
+
cat node_modules/@turk.net/mui/DESIGN_RULES.md
|
|
218
218
|
|
|
219
219
|
# Check component prop validity
|
|
220
|
-
cat node_modules/@
|
|
220
|
+
cat node_modules/@turk.net/mui/COMPONENT_GLOSSARY.md
|
|
221
221
|
|
|
222
222
|
# Find the right component for a Figma pattern
|
|
223
|
-
cat node_modules/@
|
|
223
|
+
cat node_modules/@turk.net/mui/COMPONENT_MAP.md
|
|
224
224
|
```
|
|
225
225
|
|
|
226
226
|
---
|
|
@@ -348,14 +348,14 @@ Edit `scripts/verify-design.js` to adjust rule severity or add exceptions. The s
|
|
|
348
348
|
|
|
349
349
|
Make sure you copied the script:
|
|
350
350
|
```bash
|
|
351
|
-
cp node_modules/@
|
|
351
|
+
cp node_modules/@turk.net/mui/scripts/verify-design.js scripts/
|
|
352
352
|
```
|
|
353
353
|
|
|
354
354
|
---
|
|
355
355
|
|
|
356
356
|
## Design Reference Files
|
|
357
357
|
|
|
358
|
-
All files are available in `node_modules/@
|
|
358
|
+
All files are available in `node_modules/@turk.net/mui/` after installing:
|
|
359
359
|
|
|
360
360
|
| File | What It Provides |
|
|
361
361
|
|------|-----------------|
|
|
@@ -375,7 +375,7 @@ All files are available in `node_modules/@turknet/onehub/` after installing:
|
|
|
375
375
|
|
|
376
376
|
For issues or suggestions:
|
|
377
377
|
|
|
378
|
-
- **@
|
|
378
|
+
- **@turk.net/mui Repository**: Internal Git repository
|
|
379
379
|
- **OpenCode Docs**: https://opencode.ai
|
|
380
380
|
- **Material UI Docs**: https://mui.com
|
|
381
381
|
|
package/dist/index.js
CHANGED
|
@@ -1732,6 +1732,7 @@ function createButtonBase() {
|
|
|
1732
1732
|
return {
|
|
1733
1733
|
styleOverrides: {
|
|
1734
1734
|
root: ({ theme: theme2 }) => ({
|
|
1735
|
+
textTransform: "unset",
|
|
1735
1736
|
[`&.${material.buttonClasses.root}.${material.buttonClasses.disabled}`]: {
|
|
1736
1737
|
backgroundColor: theme2.vars?.palette.neutral.background.disabled.rest,
|
|
1737
1738
|
color: theme2.vars?.palette.neutral.foreground.disabled.rest,
|
|
@@ -1782,10 +1783,11 @@ function createButton() {
|
|
|
1782
1783
|
props: { size: "extra-small" },
|
|
1783
1784
|
style: {
|
|
1784
1785
|
gap: theme2.spacing(2),
|
|
1785
|
-
"--padding-x": theme2.spacing(3
|
|
1786
|
+
"--padding-x": theme2.spacing(3),
|
|
1786
1787
|
"--padding-y": theme2.spacing(2.75),
|
|
1787
1788
|
fontSize: theme2.typography.text.xs.medium.fontSize,
|
|
1788
1789
|
fontWeight: theme2.typography.text.xs.medium.fontWeight,
|
|
1790
|
+
minWidth: theme2.spacing(8.5),
|
|
1789
1791
|
[`.${material.buttonClasses.icon}`]: {
|
|
1790
1792
|
marginTop: theme2.spacing(-0.5),
|
|
1791
1793
|
marginBottom: theme2.spacing(-0.5)
|
|
@@ -1817,6 +1819,7 @@ function createButton() {
|
|
|
1817
1819
|
gap: theme2.spacing(2.5),
|
|
1818
1820
|
"--padding-y": theme2.spacing(3.25),
|
|
1819
1821
|
"--padding-x": theme2.spacing(4),
|
|
1822
|
+
minWidth: theme2.spacing(10),
|
|
1820
1823
|
// -- ONLY ICON SIZE & SPACES
|
|
1821
1824
|
[`& svg.${material.svgIconClasses.root}`]: {
|
|
1822
1825
|
width: theme2.spacing(4),
|
|
@@ -1844,6 +1847,7 @@ function createButton() {
|
|
|
1844
1847
|
fontSize: theme2.typography.text.md.medium.fontSize,
|
|
1845
1848
|
fontWeight: theme2.typography.text.md.medium.fontWeight,
|
|
1846
1849
|
gap: theme2.spacing(3),
|
|
1850
|
+
minWidth: theme2.spacing(12),
|
|
1847
1851
|
"--padding-x": theme2.spacing(4.5),
|
|
1848
1852
|
"--padding-y": theme2.spacing(4),
|
|
1849
1853
|
[`.${material.buttonClasses.icon}`]: {
|
|
@@ -1874,6 +1878,7 @@ function createButton() {
|
|
|
1874
1878
|
fontSize: theme2.typography.text.md.medium.fontSize,
|
|
1875
1879
|
fontWeight: theme2.typography.text.md.medium.fontWeight,
|
|
1876
1880
|
gap: theme2.spacing(3.5),
|
|
1881
|
+
minWidth: theme2.spacing(13),
|
|
1877
1882
|
"--padding-x": theme2.spacing(5),
|
|
1878
1883
|
"--padding-y": theme2.spacing(4.5),
|
|
1879
1884
|
[`.${material.buttonClasses.icon}`]: {
|
|
@@ -1904,6 +1909,7 @@ function createButton() {
|
|
|
1904
1909
|
fontSize: theme2.typography.text.lg.medium.fontSize,
|
|
1905
1910
|
fontWeight: theme2.typography.text.lg.medium.fontWeight,
|
|
1906
1911
|
gap: theme2.spacing(4),
|
|
1912
|
+
minWidth: theme2.spacing(15),
|
|
1907
1913
|
"--padding-x": theme2.spacing(5.5),
|
|
1908
1914
|
"--padding-y": theme2.spacing(5.25),
|
|
1909
1915
|
[`.${material.buttonClasses.icon}`]: {
|
|
@@ -3511,9 +3517,72 @@ function createBadge() {
|
|
|
3511
3517
|
}
|
|
3512
3518
|
};
|
|
3513
3519
|
}
|
|
3520
|
+
function createTabs() {
|
|
3521
|
+
return {
|
|
3522
|
+
styleOverrides: {
|
|
3523
|
+
root: ({ theme: theme2 }) => ({
|
|
3524
|
+
minHeight: "32px",
|
|
3525
|
+
variants: [
|
|
3526
|
+
{
|
|
3527
|
+
props: { indicatorColor: "primary" },
|
|
3528
|
+
style: {
|
|
3529
|
+
[`.${material.tabsClasses.indicator}`]: {
|
|
3530
|
+
backgroundColor: theme2.vars?.palette.brand.stroke.compound.rest
|
|
3531
|
+
}
|
|
3532
|
+
}
|
|
3533
|
+
},
|
|
3534
|
+
{
|
|
3535
|
+
props: { textColor: "primary" },
|
|
3536
|
+
style: {
|
|
3537
|
+
[`.${material.tabClasses.root}.${material.tabClasses.textColorPrimary}`]: {
|
|
3538
|
+
color: theme2.vars?.palette.neutral.foreground[2].rest
|
|
3539
|
+
},
|
|
3540
|
+
[`.${material.tabClasses.root}.${material.tabClasses.textColorPrimary}.${material.tabClasses.selected}`]: {
|
|
3541
|
+
color: theme2.vars?.palette.brand.foreground.compound.rest
|
|
3542
|
+
}
|
|
3543
|
+
}
|
|
3544
|
+
}
|
|
3545
|
+
]
|
|
3546
|
+
})
|
|
3547
|
+
}
|
|
3548
|
+
};
|
|
3549
|
+
}
|
|
3550
|
+
function createTab() {
|
|
3551
|
+
return {
|
|
3552
|
+
defaultProps: {
|
|
3553
|
+
disableRipple: true,
|
|
3554
|
+
disableFocusRipple: true,
|
|
3555
|
+
disableTouchRipple: true
|
|
3556
|
+
},
|
|
3557
|
+
styleOverrides: {
|
|
3558
|
+
root: ({ theme: theme2 }) => ({
|
|
3559
|
+
textTransform: "unset",
|
|
3560
|
+
minHeight: theme2.spacing(8),
|
|
3561
|
+
height: theme2.spacing(8),
|
|
3562
|
+
padding: "0px 4px 11px",
|
|
3563
|
+
":not(:last-child)": {
|
|
3564
|
+
marginRight: theme2.spacing(4)
|
|
3565
|
+
},
|
|
3566
|
+
variants: [
|
|
3567
|
+
{
|
|
3568
|
+
props: { color: "primary" },
|
|
3569
|
+
style: {
|
|
3570
|
+
color: theme2.vars?.palette.brand.foreground.compound.rest
|
|
3571
|
+
}
|
|
3572
|
+
}
|
|
3573
|
+
]
|
|
3574
|
+
}),
|
|
3575
|
+
labelIcon: ({ theme: theme2 }) => ({
|
|
3576
|
+
padding: "0px 4px 11px",
|
|
3577
|
+
minHeight: theme2.spacing(8),
|
|
3578
|
+
height: theme2.spacing(8)
|
|
3579
|
+
})
|
|
3580
|
+
}
|
|
3581
|
+
};
|
|
3582
|
+
}
|
|
3514
3583
|
|
|
3515
3584
|
// theme/components/index.tsx
|
|
3516
|
-
var
|
|
3585
|
+
var Components23 = {
|
|
3517
3586
|
MuiAutocomplete: createAutocomplete(),
|
|
3518
3587
|
MuiAvatar: createAvatar(),
|
|
3519
3588
|
MuiBadge: createBadge(),
|
|
@@ -3547,7 +3616,9 @@ var Components22 = {
|
|
|
3547
3616
|
MuiSlider: createSlider(),
|
|
3548
3617
|
MuiSwitch: createSwitch(),
|
|
3549
3618
|
MuiTextField: createTextField(),
|
|
3550
|
-
MuiTypography: createTypography()
|
|
3619
|
+
MuiTypography: createTypography(),
|
|
3620
|
+
MuiTab: createTab(),
|
|
3621
|
+
MuiTabs: createTabs()
|
|
3551
3622
|
};
|
|
3552
3623
|
|
|
3553
3624
|
// theme/typography/typographyVariants.ts
|
|
@@ -3915,7 +3986,7 @@ var theme = styles.createTheme({
|
|
|
3915
3986
|
shape: {
|
|
3916
3987
|
borderRadius: 8
|
|
3917
3988
|
},
|
|
3918
|
-
components:
|
|
3989
|
+
components: Components23,
|
|
3919
3990
|
colorSchemes: colorSchemes_default
|
|
3920
3991
|
});
|
|
3921
3992
|
var theme_default = theme;
|