mirror of
https://github.com/Dvorinka/MyClubServer.git
synced 2026-06-03 18:22:57 +00:00
6.7 KiB
6.7 KiB
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:
// 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
- Najeďte myší na záhlaví panelu (barevná lišta nahoře)
- Kurzor se změní na "move" ✋
- Klikněte a držte levé tlačítko myši
- Přetáhněte panel na novou pozici
- Pusťte tlačítko myši
Změna Velikosti
- Najeďte na pravý dolní roh panelu
- Zobrazí se šedý trojúhelník
- Kurzor se změní na resize ↘️
- Klikněte a držte levé tlačítko myši
- Přetáhněte pro změnu velikosti
📦 Technické Detaily
State Management
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
// 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
// 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
// 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
/* Š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
- Přidat do state:
const [panelPositions, setPanelPositions] = useState({
...existujici,
novyPanel: { x: 0, y: 0, width: 400, height: 500 }
});
- Použít v JSX:
<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! 🎉