This commit is contained in:
Tomas Dvorak
2025-11-02 21:31:00 +01:00
parent b9cea0cd77
commit 087f30e82c
130 changed files with 20104 additions and 34330 deletions
+296
View File
@@ -0,0 +1,296 @@
# 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! 🎉**