Documentation

Ui Examples

Π’ этом Ρ€Π°Π·Π΄Π΅Π»Π΅ прСдставлСны Π³ΠΎΡ‚ΠΎΠ²Ρ‹Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ интСрфСйсов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² своих ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°Ρ… Π½Π° Wudgine.

Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅

Π—Π΄Π΅ΡΡŒ Π²Ρ‹ Π½Π°ΠΉΠ΄Π΅Ρ‚Π΅ ΠΏΠΎΠ»Π½Ρ‹Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ интСрфСйсов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΡƒΡŽΡ‚, ΠΊΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ 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.

НС Π·Π°Π±Ρ‹Π²Π°ΠΉΡ‚Π΅ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ свои интСрфСйсы для Π»ΡƒΡ‡ΡˆΠ΅ΠΉ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, особСнно Π½Π° ΠΌΠΎΠ±ΠΈΠ»ΡŒΠ½Ρ‹Ρ… устройствах.

Wudgine β€’ Β© 2025