Files
MyClub/DOCS/MYUIBRIX_DRAGGABLE_UPDATE.md
Tomas Dvorak 087f30e82c dev day #80
2025-11-02 21:31:00 +01:00

297 lines
6.7 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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! 🎉**