mirror of
https://github.com/Dvorinka/MyClubServer.git
synced 2026-06-04 18:52:56 +00:00
297 lines
6.7 KiB
Markdown
297 lines
6.7 KiB
Markdown
# MyUIbrix Draggable & Resizable Update - Říjen 2025
|
||
|
||
## 🎯 Přehled změn
|
||
|
||
Všechny panely v MyUIbrix editoru jsou nyní **přetažitelné** a **měnitelné velikosti**.
|
||
|
||
---
|
||
|
||
## ✨ Nové Funkce
|
||
|
||
### 1. **Přetažitelné Panely**
|
||
Všechny panely můžete přetáhnout kliknutím na záhlaví:
|
||
- 🎨 **Vizuální Styly Panel** (levá strana)
|
||
- ⚙️ **Style Picker** (kontextový panel u elementu)
|
||
- 📋 **Layers Panel** (seznam vrstev)
|
||
- ➕ **Element Picker** (přidávání elementů)
|
||
|
||
### 2. **Měnitelná Velikost**
|
||
Každý panel má v pravém dolním rohu **resize handle** (šedý trojúhelník):
|
||
- Přetáhněte pro změnu šířky a výšky
|
||
- Minimální velikost: 280px × 300px
|
||
- Vizuální feedback při hover
|
||
|
||
### 3. **Chytré Omezení**
|
||
- Panely nelze přetáhnout mimo obrazovku
|
||
- Automatické omezení pozice
|
||
- Pamatuje si poslední pozici během editace
|
||
|
||
---
|
||
|
||
## 🐛 Opravené Chyby
|
||
|
||
### 1. **Duplicitní Text "Unsaved Changes"**
|
||
**Problém**: Zobrazovalo se "12 neuložených změn1 Unsaved Changes"
|
||
|
||
**Oprava**:
|
||
```typescript
|
||
// PŘED
|
||
{Object.keys(localChanges).length} neuložených změn
|
||
|
||
// PO
|
||
Neuložené změny: {Object.keys(localChanges).filter(...).length}
|
||
```
|
||
|
||
### 2. **AboutPage Překlad**
|
||
**Opraveno**:
|
||
- ✅ "About MyClub" → "O klubu"
|
||
- ✅ "This page is not set up yet..." → "Tato stránka ještě není nastavena..."
|
||
- ✅ Meta descriptions přeloženy do češtiny
|
||
- ✅ Odstraněn duplicitní `<h1>About MyClub</h1>`
|
||
|
||
---
|
||
|
||
## 🎨 Jak Používat
|
||
|
||
### **Přetahování Panelu**
|
||
1. Najeďte myší na **záhlaví panelu** (barevná lišta nahoře)
|
||
2. Kurzor se změní na "move" ✋
|
||
3. Klikněte a držte levé tlačítko myši
|
||
4. Přetáhněte panel na novou pozici
|
||
5. Pusťte tlačítko myši
|
||
|
||
### **Změna Velikosti**
|
||
1. Najeďte na **pravý dolní roh** panelu
|
||
2. Zobrazí se šedý trojúhelník
|
||
3. Kurzor se změní na resize ↘️
|
||
4. Klikněte a držte levé tlačítko myši
|
||
5. Přetáhněte pro změnu velikosti
|
||
|
||
---
|
||
|
||
## 📦 Technické Detaily
|
||
|
||
### State Management
|
||
```typescript
|
||
const [panelPositions, setPanelPositions] = useState({
|
||
stylePicker: { x: 0, y: 0, width: 360, height: 550 },
|
||
layersPanel: { x: 0, y: 0, width: 320, height: 600 },
|
||
visualStylePanel: { x: 0, y: 60, width: 320, height: 700 },
|
||
elementPicker: { x: 0, y: 0, width: 600, height: 600 }
|
||
});
|
||
```
|
||
|
||
### Drag Handlers
|
||
```typescript
|
||
// Mouse down na záhlaví
|
||
const handlePanelMouseDown = (panelName, e) => {
|
||
if (!target.closest('.panel-header')) return;
|
||
setDraggingPanel(panelName);
|
||
// Zachytí offset od okraje panelu
|
||
};
|
||
|
||
// Mouse move
|
||
const handlePanelMouseMove = (e) => {
|
||
// Aktualizuje pozici s boundary checking
|
||
const newX = Math.max(0, Math.min(x, maxX));
|
||
const newY = Math.max(0, Math.min(y, maxY));
|
||
};
|
||
```
|
||
|
||
### Resize Handlers
|
||
```typescript
|
||
// Resize handle - trojúhelník v rohu
|
||
<Box
|
||
position="absolute"
|
||
bottom={0}
|
||
right={0}
|
||
width="20px"
|
||
height="20px"
|
||
cursor="nwse-resize"
|
||
bg="gray.400"
|
||
opacity={0.6}
|
||
_hover={{ opacity: 1 }}
|
||
onMouseDown={(e) => handleResizeStart(panelName, e)}
|
||
sx={{
|
||
clipPath: 'polygon(100% 0, 100% 100%, 0 100%)'
|
||
}}
|
||
/>
|
||
```
|
||
|
||
### Panel Header
|
||
```typescript
|
||
// Všechna záhlaví mají class="panel-header"
|
||
<Flex
|
||
className="panel-header"
|
||
bg={primaryColor}
|
||
color="white"
|
||
p={3}
|
||
cursor="move" // Indikuje přetažitelnost
|
||
>
|
||
<HStack>
|
||
<Icon as={FaPaintBrush} />
|
||
<Text>Panel Název</Text>
|
||
</HStack>
|
||
<IconButton
|
||
icon={<FiX />}
|
||
onClick={() => closePanel()}
|
||
/>
|
||
</Flex>
|
||
```
|
||
|
||
---
|
||
|
||
## 🎯 Upravené Komponenty
|
||
|
||
### 1. **Vizuální Styly Panel** (levá strana)
|
||
- ✅ Přetažitelné záhlaví
|
||
- ✅ Resize handle
|
||
- ✅ Scroll pro obsah
|
||
- ✅ Zachovaná funkčnost VisualStylePanel
|
||
|
||
### 2. **Style Picker** (kontextový)
|
||
- ✅ Přetažitelný
|
||
- ✅ Resizable
|
||
- ✅ Výchozí pozice u elementu
|
||
- ✅ Po přetažení zůstane na místě
|
||
|
||
### 3. **Layers Panel** (vrstvy)
|
||
- ✅ Přetažitelný ze záhlaví
|
||
- ✅ Resizable
|
||
- ✅ Výchozí pozice vpravo
|
||
- ✅ Drag & drop elementů funguje uvnitř
|
||
|
||
### 4. **Element Picker** (modal)
|
||
- ✅ Přetažitelný
|
||
- ✅ Resizable
|
||
- ✅ Výchozí pozice centrovaná
|
||
- ✅ Backdrop zůstává
|
||
|
||
---
|
||
|
||
## 🎨 Vizuální Změny
|
||
|
||
### Resize Handle Styling
|
||
```css
|
||
/* Šedý trojúhelník v pravém dolním rohu */
|
||
clipPath: polygon(100% 0, 100% 100%, 0 100%)
|
||
opacity: 0.6
|
||
_hover: { opacity: 1 }
|
||
cursor: nwse-resize
|
||
```
|
||
|
||
### Cursor Feedback
|
||
- **Záhlaví**: `cursor: move` (ruka)
|
||
- **Při tažení**: `cursor: grabbing` (zavřená ruka)
|
||
- **Resize handle**: `cursor: nwse-resize` (diagonální šipky)
|
||
|
||
### Panel Borders
|
||
- Aktivní panel: zvýrazněný border
|
||
- Každý panel má svou barvu (primary, secondary, teal)
|
||
|
||
---
|
||
|
||
## 📝 Klávesové Zkratky
|
||
|
||
Všechny původní zkratky zůstávají:
|
||
|
||
| Zkratka | Akce |
|
||
|---------|------|
|
||
| `ESC` | Zavřít aktivní panel |
|
||
| `L` | Toggle Layers Panel |
|
||
| `A` | Otevřít Element Picker |
|
||
| `Ctrl+S` | Uložit změny |
|
||
|
||
---
|
||
|
||
## 🚀 Testování
|
||
|
||
### Checklist
|
||
- [✅] Přetažení Style Picker panelu
|
||
- [✅] Přetažení Layers Panel
|
||
- [✅] Přetažení Visual Style Panel
|
||
- [✅] Přetažení Element Picker
|
||
- [✅] Resize všech panelů
|
||
- [✅] Boundary checking (nelze mimo obrazovku)
|
||
- [✅] Minimální velikost panelů
|
||
- [✅] Kurzor feedback
|
||
- [✅] Oprava "Unsaved Changes" textu
|
||
- [✅] AboutPage český překlad
|
||
|
||
---
|
||
|
||
## 📦 Soubory
|
||
|
||
**Upravené:**
|
||
```
|
||
frontend/src/components/editor/MyUIbrixEditor.tsx
|
||
frontend/src/pages/AboutPage.tsx
|
||
```
|
||
|
||
**Nové:**
|
||
```
|
||
MYUIBRIX_DRAGGABLE_UPDATE.md (tento soubor)
|
||
```
|
||
|
||
---
|
||
|
||
## 🎓 Pro Vývojáře
|
||
|
||
### Přidání Nového Přetažitelného Panelu
|
||
|
||
1. **Přidat do state:**
|
||
```typescript
|
||
const [panelPositions, setPanelPositions] = useState({
|
||
...existujici,
|
||
novyPanel: { x: 0, y: 0, width: 400, height: 500 }
|
||
});
|
||
```
|
||
|
||
2. **Použít v JSX:**
|
||
```typescript
|
||
<Box
|
||
position="fixed"
|
||
left={`${panelPositions.novyPanel.x}px`}
|
||
top={`${panelPositions.novyPanel.y}px`}
|
||
width={`${panelPositions.novyPanel.width}px`}
|
||
height={`${panelPositions.novyPanel.height}px`}
|
||
onMouseDown={(e) => handlePanelMouseDown('novyPanel', e)}
|
||
cursor={draggingPanel === 'novyPanel' ? 'grabbing' : 'default'}
|
||
>
|
||
<Flex className="panel-header" cursor="move">
|
||
{/* Záhlaví */}
|
||
</Flex>
|
||
|
||
{/* Obsah */}
|
||
|
||
{/* Resize handle */}
|
||
<Box
|
||
position="absolute"
|
||
bottom={0}
|
||
right={0}
|
||
width="20px"
|
||
height="20px"
|
||
cursor="nwse-resize"
|
||
onMouseDown={(e) => handleResizeStart('novyPanel', e)}
|
||
/>
|
||
</Box>
|
||
```
|
||
|
||
---
|
||
|
||
## 📚 Reference
|
||
|
||
- React useState hooks pro panel positions
|
||
- Mouse events: mousedown, mousemove, mouseup
|
||
- Boundary checking: Math.max, Math.min
|
||
- CSS clip-path pro resize handle
|
||
- Chakra UI positioning
|
||
|
||
---
|
||
|
||
**Datum:** 18. října 2025
|
||
**Verze:** 2.1
|
||
**Status:** ✅ Kompletní a otestováno
|
||
|
||
**Všechny panely jsou nyní plně přetažitelné a měnitelné velikosti! 🎉**
|