Ui Examples
ΠΠ²Π΅Π΄Π΅Π½ΠΈΠ΅
ΠΠ΄Π΅ΡΡ Π²Ρ Π½Π°ΠΉΠ΄Π΅ΡΠ΅ ΠΏΠΎΠ»Π½ΡΠ΅ ΠΏΡΠΈΠΌΠ΅ΡΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΡΡΡ, ΠΊΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ Wudgine Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ ΠΈΠ³ΡΠΎΠ²ΡΡ ΡΠΊΡΠ°Π½ΠΎΠ². ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΠΈ ΠΏΡΠΈΠΌΠ΅ΡΡ ΠΊΠ°ΠΊ ΠΎΡΠ½ΠΎΠ²Ρ Π΄Π»Ρ ΡΠ²ΠΎΠΈΡ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΎΠ².
Π£ΡΠΈΠ»ΠΈΡΡ ΠΈ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°ΡΠ΅Π»ΡΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ
ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° Π°Π½ΠΈΠΌΠ°ΡΠΈΠΉ (wgAnimate)
Wudgine ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΡ wgAnimate
Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΏΠ»Π°Π²Π½ΡΡ
Π°Π½ΠΈΠΌΠ°ΡΠΈΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°:
// ΠΠ°Π·ΠΎΠ²Π°Ρ Π°Π½ΠΈΠΌΠ°ΡΠΈΡ Ρ Π½Π°ΡΡΡΠΎΠΉΠΊΠ°ΠΌΠΈ
wgAnimate.animate(element, {
opacity: [0, 1],
transform: ['translateY(-20px)', 'translateY(0)']
}, {
duration: 300,
easing: 'ease-out',
fill: 'forwards'
});
// ΠΠ΅ΡΠ΅Ρ
ΠΎΠ΄ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠΎΡΡΠΎΡΠ½ΠΈΡΠΌΠΈ
wgAnimate.transition(element, 'fade-in', () => {
// ΠΠΎΠ»Π±ΡΠΊ ΠΏΠΎΡΠ»Π΅ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ Π°Π½ΠΈΠΌΠ°ΡΠΈΠΈ
});
// ΠΡΠ»ΡΡΠ°ΡΠΈΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°
wgAnimate.pulse(element, {
scale: [1, 1.05],
iterations: 3,
duration: 300
});
// ΠΡΡΠ΅ΠΊΡ ΡΡΡΡΠΊΠΈ Π΄Π»Ρ ΠΏΡΠΈΠ²Π»Π΅ΡΠ΅Π½ΠΈΡ Π²Π½ΠΈΠΌΠ°Π½ΠΈΡ
wgAnimate.shake(element, {
intensity: 'medium', // 'light', 'medium', 'strong'
duration: 500
});
// ΠΠΎΠΊΠ°Π·Π°ΡΡ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅
wgAnimate.showNotification('ΠΡΠ΅Π΄ΠΌΠ΅Ρ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ Π² ΠΈΠ½Π²Π΅Π½ΡΠ°ΡΡ', {
type: 'success', // 'success', 'warning', 'error', 'info'
duration: 3000,
position: 'top-right'
});
Π£ΡΠΈΠ»ΠΈΡΡ Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ Π΄Π°Π½Π½ΡΠΌΠΈ (wgUtils)
ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° wgUtils
ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΠΏΠΎΠ»Π΅Π·Π½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ Π΄Π°Π½Π½ΡΠΌΠΈ:
// Π€ΠΎΡΠΌΠ°ΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠΈΡΠ΅Π»
wgUtils.formatNumber(1000); // "1,000"
wgUtils.formatNumber(1000, { compact: true }); // "1K"
// Π€ΠΎΡΠΌΠ°ΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ
wgUtils.formatTime(3600); // "01:00:00"
wgUtils.formatTime(90, { format: 'mm:ss' }); // "01:30"
// ΠΠ±ΡΠ΅Π·ΠΊΠ° ΡΠ΅ΠΊΡΡΠ°
wgUtils.truncateText('ΠΠ»ΠΈΠ½Π½ΡΠΉ ΡΠ΅ΠΊΡΡ ΠΎΠΏΠΈΡΠ°Π½ΠΈΡ ΠΏΡΠ΅Π΄ΠΌΠ΅ΡΠ°', 10); // "ΠΠ»ΠΈΠ½Π½ΡΠΉ ΡΠ΅..."
// ΠΠ΅Π½Π΅ΡΠ°ΡΠΈΡ ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ID
const uniqueId = wgUtils.generateId();
// ΠΠ»ΡΠ±ΠΎΠΊΠΎΠ΅ ΠΊΠ»ΠΎΠ½ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ²
const clonedObject = wgUtils.deepClone(originalObject);
// Π‘ΡΠ°Π²Π½Π΅Π½ΠΈΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ²
if (wgUtils.isEqual(obj1, obj2)) {
// ΠΠ±ΡΠ΅ΠΊΡΡ ΠΈΠ΄Π΅Π½ΡΠΈΡΠ½Ρ
}
// ΠΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π²Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠ³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ
const value = wgUtils.getNestedValue(obj, 'user.profile.name');
// ΠΠΎΠ½Π²Π΅ΡΡΠ°ΡΠΈΡ ΡΠ²Π΅ΡΠΎΠ²
const hexColor = wgUtils.rgbToHex(255, 100, 50);
const rgbColor = wgUtils.hexToRgb('#FF6432');
ΠΠ½Π²Π΅Π½ΡΠ°ΡΡ Ρ ΠΏΠ΅ΡΠ΅ΡΠ°ΡΠΊΠΈΠ²Π°Π½ΠΈΠ΅ΠΌ
ΠΡΠΈΠΌΠ΅Ρ HTML-ΡΡΡΡΠΊΡΡΡΡ Π΄Π»Ρ ΠΈΠ½Π²Π΅Π½ΡΠ°ΡΡ Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡΡ ΠΏΠ΅ΡΠ΅ΡΠ°ΡΠΊΠΈΠ²Π°Π½ΠΈΡ ΠΏΡΠ΅Π΄ΠΌΠ΅ΡΠΎΠ²:
<div class="wg-inventory">
<div class="wg-inventory-header">
<h2>ΠΠ½Π²Π΅Π½ΡΠ°ΡΡ</h2>
<div class="wg-inventory-stats">
<span>ΠΠ΅Ρ: <span id="currentWeight">15</span>/<span id="maxWeight">50</span></span>
<span>Π‘Π»ΠΎΡΡ: <span id="usedSlots">12</span>/<span id="totalSlots">24</span></span>
</div>
</div>
<div class="wg-inventory-tabs">
<button class="wg-tab-button active" data-tab="all">ΠΡΠ΅</button>
<button class="wg-tab-button" data-tab="weapons">ΠΡΡΠΆΠΈΠ΅</button>
<button class="wg-tab-button" data-tab="armor">ΠΡΠΎΠ½Ρ</button>
<button class="wg-tab-button" data-tab="consumables">Π Π°ΡΡ
ΠΎΠ΄Π½ΠΈΠΊΠΈ</button>
<button class="wg-tab-button" data-tab="quest">ΠΠ²Π΅ΡΡΠΎΠ²ΡΠ΅</button>
</div>
<div class="wg-inventory-grid" id="inventoryGrid">
<!-- Π‘Π»ΠΎΡΡ Π±ΡΠ΄ΡΡ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Ρ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈ -->
</div>
<div class="wg-inventory-actions">
<button class="wg-button wg-button-secondary" id="btnSort">Π‘ΠΎΡΡΠΈΡΠΎΠ²Π°ΡΡ</button>
<button class="wg-button wg-button-secondary" id="btnStack">ΠΠ±ΡΠ΅Π΄ΠΈΠ½ΠΈΡΡ</button>
<button class="wg-button wg-button-danger" id="btnDrop">ΠΡΠ±ΡΠΎΡΠΈΡΡ</button>
</div>
<div class="wg-item-details" id="itemDetails">
<div class="wg-item-details-header">
<h3 id="itemName">ΠΠ°Π·Π²Π°Π½ΠΈΠ΅ ΠΏΡΠ΅Π΄ΠΌΠ΅ΡΠ°</h3>
<span class="wg-item-type" id="itemType">Π’ΠΈΠΏ</span>
</div>
<div class="wg-item-image">
<img id="itemImage" src="" alt="ΠΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΠΏΡΠ΅Π΄ΠΌΠ΅ΡΠ°">
</div>
<div class="wg-item-stats" id="itemStats">
<!-- Π₯Π°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊΠΈ ΠΏΡΠ΅Π΄ΠΌΠ΅ΡΠ° -->
</div>
<p class="wg-item-description" id="itemDescription">ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΠΏΡΠ΅Π΄ΠΌΠ΅ΡΠ°</p>
<div class="wg-item-actions">
<button class="wg-button wg-button-primary" id="btnUse">ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ</button>
<button class="wg-button wg-button-secondary" id="btnEquip">ΠΠΊΠΈΠΏΠΈΡΠΎΠ²Π°ΡΡ</button>
</div>
</div>
</div>
ΠΡΠ½ΠΎΠ²Π½ΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄Ρ Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ ΠΈΠ½Π²Π΅Π½ΡΠ°ΡΠ΅ΠΌ:
class Inventory {
constructor() {
this.items = [];
this.selectedItem = null;
this.draggedItem = null;
this.currentFilter = 'all';
this.initialize();
}
async initialize() {
// ΠΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π΄Π°Π½Π½ΡΡ
ΠΈΠ½Π²Π΅Π½ΡΠ°ΡΡ ΠΈΠ· Π΄Π²ΠΈΠΆΠΊΠ°
this.items = await engine.call('getInventoryItems');
// Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΡΠ»ΠΎΡΠΎΠ² ΠΈΠ½Π²Π΅Π½ΡΠ°ΡΡ
this.renderInventory();
// ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° Π²ΠΊΠ»Π°Π΄ΠΎΠΊ ΠΈ ΠΊΠ½ΠΎΠΏΠΎΠΊ
this.setupEventListeners();
// ΠΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΡΡΠ°ΡΠΈΡΡΠΈΠΊΠΈ ΠΈΠ½Π²Π΅Π½ΡΠ°ΡΡ
this.updateInventoryStats();
// ΠΠΎΠ΄ΠΏΠΈΡΠΊΠ° Π½Π° ΡΠΎΠ±ΡΡΠΈΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ ΠΈΠ½Π²Π΅Π½ΡΠ°ΡΡ
engine.subscribe('inventoryChanged', (data) => {
this.items = data.items;
this.renderInventory();
this.updateInventoryStats();
});
}
}
// ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΈΠ½Π²Π΅Π½ΡΠ°ΡΡ
const inventory = new Inventory();
Π‘Π»Π΅Π΄ΡΡΡΠΈΠ΅ ΡΠ°Π³ΠΈ
ΠΡΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ΠΈΠ΅ ΠΏΡΠΈΠΌΠ΅ΡΠΎΠ² ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΎΠ² Π²Ρ Π½Π°ΠΉΠ΄Π΅ΡΠ΅ Π² ΡΠ°ΠΉΠ»Π΅ 5.ui-examples-continued.md.