CSS, JS ve derleme
Bu sayfa, CSS ve JavaScript'i nasıl derleyeceğinizi ve Acun UI'nin bu dosyaları sayfalara nasıl yüklediğini anlatır.
Derlemek
Tasarımı değiştirdiğinizde CSS ve JavaScript'i yeniden derleyin:
npm install # yalnızca ilk seferde: Vite ve Tailwind derleme araçlarını kurar
npm run build # canlı ortam için derler (public/build)
Derlenmiş dosyalar temanın zip'inde hazır gelir. Şu durumlarda yeniden derleyin:
- renkleri ya da
@themeayarlarını değiştirdiniz, - Blade dosyalarına yeni Tailwind sınıfları yazdınız,
resources/jsaltındaki dosyaları değiştirdiniz,- Acun UI paketlerini güncellediniz.
npm install yalnızca derleme araçlarını kurar. Acun UI'nin kendisi npm'den gelmez: package.json içindeki "@acunsoft/acun-ui-core": "file:packages/acun-ui/acun-ui-core" satırı zip'teki klasörü kullanır. Sunucuya yüklemeden önce yapılacaklar Yayına alma sayfasındadır.
Geliştirme sunucusu
Geliştirirken her değişiklikte yeniden derlemek yerine Vite'ın geliştirme sunucusunu çalıştırın:
npm run dev
CSS ve JavaScript değişiklikleri anında görünür. Blade dosyaları ya da menü değişince sayfa kendiliğinden yenilenir. composer run dev sunucuyu, kuyruğu ve Vite'ı birlikte başlatır.
Geliştirme sunucusunu kapatınca sayfalar yeniden public/build içindeki derlenmiş dosyaları kullanır.
Her sayfada yüklenen dosyalar
Hazır düzenler her sayfanın <head> bölümünde üç dosya yükler:
@vite(['resources/css/acun-ui.css', 'resources/js/acun-ui.js', 'resources/js/app.js'])
| Dosya | İçinde |
|---|---|
resources/css/acun-ui.css |
Tailwind, Acun UI'nin teması ve PRO stilleri |
resources/js/acun-ui.js |
Acun UI'nin her sayfada gereken JavaScript'i |
resources/js/app.js |
Uygulamanın kendi kodu; grafik, harita ve tarih kayıtları |
Aynı üç dosya vite.config.js içindeki input listesindedir. Kendi düzeninizde de bu sırayla yükleyin. Mevcut bir projede CSS dosyasının adı genellikle resources/css/app.css'tir; işleyiş aynıdır.
CSS dosyası
CSS dosyası Tailwind'i, Acun UI'nin temasını ve bileşenlerin stillerini bir araya getirir:
@import 'tailwindcss';
@plugin '@tailwindcss/forms';
@import '@acunsoft/acun-ui-core';
@import '../../vendor/acunsoft/acun-ui-pro/resources/css/acun-ui-pro.css';
@source '../../vendor/acunsoft/acun-ui-free/resources/views';
@source '../../vendor/acunsoft/acun-ui-pro/resources/views';
@import '@acunsoft/acun-ui-core'temayı, düzeni ve menüyü getirir.acun-ui-pro.cssDataTable ve form penceresi stillerini ekler.@sourcesatırları Tailwind'e paketlerin Blade dosyalarını taratır. Onlar olmazsa bileşenlerin sınıfları derlemeye girmez ve bileşenler stilsiz görünür.
Full sürümde dosya ayrıca front.css'i içe aktarır: önyüz temalarının yazı tipi, köşe ve yüzey kuralları. Renkleri ve görünümü değiştirmek için Özelleştirme sayfasına bakın.
JavaScript katmanları
Acun UI'nin JavaScript'i katmanlara ayrılır; böylece her sayfa yalnızca gerekeni indirir.
| Ne zaman | Ne yüklenir |
|---|---|
| Her sayfada | acun-ui.js: tema, pencere (modal), çekmece, açılır menü, sekme, odak, kaydırma kilidi, olaylar, Livewire düzeltmeleri ve PRO'nun kaydedilmemiş değişiklik koruması |
| Her sayfada | app.js: uygulamanın kendi kodu |
| Yalnızca gerektiğinde | DataTable, combobox, dosya yükleme ve form penceresi; grafik, harita ve tarih kütüphaneleri |
| Sayfaya özel kod varsa | @stack('page-scripts') ile eklenen, o sayfanın kendi dosyası |
resources/js/acun-ui.js iki satırdır:
import '@acunsoft/acun-ui-core';
import '@acunsoft/acun-ui-pro';
Acun UI ayrı bir dosyada olduğu için uygulamanızın kodu değişince tarayıcı onu yeniden indirmez. app.js Acun UI'yi içe aktarmaz; aksi hâlde Vite iki giriş için ortak bir parça çıkarır. PRO'nun kayıt işlevleri bu yüzden window.AcunUI.pro altındadır. Alpine, Livewire ile gelir; ayrıca kurmanız gerekmez.
import '@acunsoft/acun-ui-core' olmadan çekmece ve pencere açılmaz, görünüm ayarları çalışmaz. Panel düzeni kullanan her sayfa ona ihtiyaç duyar.
@acunsoft/acun-ui-pro bir npm paketi değildir. vite.config.js içindeki takma ad onu Composer paketinden bulur:
resolve: {
alias: { '@acunsoft/acun-ui-pro': path.resolve(import.meta.dirname, 'vendor/acunsoft/acun-ui-pro/resources/js/index.js') },
},
Ağır bileşenler yalnızca gerektiğinde
Büyük bileşenlerin JavaScript'i yalnızca sayfada o bileşen varken iner. Örneğin DataTable'ın tarayıcı tarafı (dışa aktarma, tam ekran, sabit başlık ve sütunlar), combobox, dosya yükleme ve form penceresi ayrı parçalardır.
<!-- acun:combobox'ın sunucuda çizdiği HTML -->
<div x-data="uiCombobox" data-acun-component="combobox">…</div>
Bileşen sunucunun HTML'ine data-acun-component="…" işaretini koyar. Bu işaretli bir eleman sayfada ilk kez göründüğünde Acun UI bileşenin parçasını bir kez indirir. Alpine o elemanı parça gelince başlatır.
- İlk açılışta,
wire:navigategeçişinde, Livewire'ın sonradan eklediği elemanlarda ve iç içe Livewire bileşenlerinde aynı şekilde çalışır. Sayfa ayrıca taranmaz. - Aynı sayfadaki beş combobox için parça bir kez iner.
- Parça gelene kadar bileşenin sunucuda çizilen HTML'i görünür.
- Tarayıcı işlemi olmayan bir DataTable hiç JavaScript indirmez.
- Parça inemezse konsolda
[Acun UI] The JavaScript of the "combobox" component could not be loaded.hatası çıkar.
Parçayı önceden indirmek
Kullanıcının birazdan açacağı bir pencere için parçayı önceden indirebilirsiniz:
AcunUI.load('combobox');
Kendi bileşeninizi eklemek
Kendi ağır bileşeninizi aynı düzene katmak için onu bir adla tanımlayın:
window.AcunUI.components.define('editor', () => import('./components/editor.js').then((module) => module.register(window.Alpine)));
<div data-acun-component="editor" x-data="editor(@js($ayarlar))">…</div>
PRO'nun registerCombobox, registerFileUpload, registerDataTable, registerDataTableFixed ve registerFormModal işlevleri önce bileşenin parçasını indirir ve bir Promise döndürür. Bunları eskisi gibi çağırmaya devam edebilirsiniz. Kaydedilmemiş değişiklik yöneticisinin API'si için: const { initDirtyForms } = await loadDirtyForms();.
Sayfaya özel kod
Yalnızca bir sayfanın ihtiyacı olan JavaScript'i o sayfada yükleyin:
@push('page-scripts')
@vite('resources/js/pages/rapor.js')
@endpush
Hazır düzenler </body> öncesinde @stack('page-scripts') yazar. Dosyayı vite.config.js içindeki input listesine de ekleyin.
Tekrar kullanılan davranışı (tablo, pencere) buraya değil bileşene koyun; sayfa kodu yalnızca o sayfanın işini yapsın. wire:navigate ile aynı sayfaya dönüldüğünde modül yeniden çalışmaz. Her girişte çalışacak kodu document.addEventListener('livewire:navigated', …) içine yazın.
Grafik, harita ve tarih aralığı
Grafik, harita ve tarih aralığı bileşenleri dış kütüphane kullanır: ApexCharts, Leaflet ve flatpickr. Kütüphaneleri uygulamanız Acun UI'ye verir. resources/js/app.js içinde:
document.addEventListener('livewire:init', () => {
const { lazyLibrary, registerChart, registerDateRangePicker, registerMap } = window.AcunUI.pro;
registerChart(window.Alpine, lazyLibrary(() => import('apexcharts')));
registerMap(window.Alpine, lazyLibrary(() => import('leaflet/dist/leaflet.css').then(() => import('leaflet'))));
// Takvim sayfanın dilinde: Türkçe sayfada Türkçe ay ve gün adları.
registerDateRangePicker(window.Alpine, lazyLibrary(async () => {
const turkish = document.documentElement.lang.startsWith('tr');
const [{ default: flatpickr }, locale] = await Promise.all([
import('flatpickr'),
turkish ? import('flatpickr/dist/l10n/tr.js') : Promise.resolve(null),
import('flatpickr/dist/flatpickr.min.css'),
]);
if (locale) flatpickr.localize(locale.Turkish);
return flatpickr;
}));
});
lazyLibrary kütüphaneyi uygulamanın JavaScript'ine katmaz. Kütüphane ayrı bir parça olarak, yalnızca o bileşenin bulunduğu sayfada ve ilk kullanıldığında stiliyle birlikte iner. ApexCharts tek başına yaklaşık 530 kB'tır; grafiği olmayan sayfalar onu hiç indirmez.
Kütüphaneyi doğrudan da verebilirsiniz: registerChart(window.Alpine, ApexCharts). O zaman kütüphane uygulamanın JavaScript'iyle birlikte her sayfada gelir.
Parçalara adlarını vermek için (apexcharts-*.js, leaflet-*.js, flatpickr-*.js) vite.config.js içine şunu ekleyin:
build: {
rolldownOptions: {
output: {
codeSplitting: {
groups: [
{ name: 'apexcharts', test: /node_modules[\\/]apexcharts[\\/]/ },
{ name: 'leaflet', test: /node_modules[\\/]leaflet[\\/]/ },
{ name: 'flatpickr', test: /node_modules[\\/]flatpickr[\\/]/ },
],
},
},
},
// apexcharts-*.js kütüphanenin kendisidir ve yalnızca grafikli sayfada indirilir.
chunkSizeWarningLimit: 600,
},
Dikkat
Harita varsayılan olarak OpenStreetMap'in ücretsiz karo sunucusunu kullanır. Bu sunucu yoğun canlı trafiğe izin vermez. Canlıda kendi karo sağlayıcınızı
registerMap(Alpine, L, { tileUrl, attribution })ile verin.
Yazı tipleri
Tema metin için Public Sans, kod ve sayısal etiketler için DM Mono yazı tipini kullanır. İkisini vite.config.js içinden yükleyin:
import { bunny } from 'laravel-vite-plugin/fonts';
import { woff2Only } from '@acunsoft/acun-ui-core/vite';
plugins: [
laravel({
input: ['resources/css/acun-ui.css', 'resources/js/acun-ui.js', 'resources/js/app.js'],
fonts: [
bunny('Public Sans', { weights: [400, 500, 600, 700], subsets: ['latin', 'latin-ext'], preload: [{ weight: 400 }, { weight: 600 }] }),
bunny('DM Mono', { weights: [400, 500], subsets: ['latin', 'latin-ext'], preload: false }),
],
}),
woff2Only(),
tailwindcss(),
],
Ardından düzenin head slot'una font etiketlerini ekleyin:
@acunFonts(['public-sans', 'dm-mono'])
latin-ext alt kümesi Türkçe harfleri (ş, ğ, İ, ı) içerir.
woff2Only
woff2Only() font derlemesinde yalnızca WOFF2 dosyalarını bırakır; onu laravel()'dan sonra yazın. Font sağlayıcıları her yüzü WOFF2 ve WOFF olarak gönderir. Eklenti ikisini aynı tanımlı iki ayrı @font-face kuralı olarak yazar ve WOFF'u sona koyar. Tarayıcı sonuncuyu kullandığı için daha büyük WOFF dosyalarını indirir; önceden yüklenen WOFF2'ler boşa gider. Acun UI'nin desteklediği her tarayıcı WOFF2 okur. woff2Only() WOFF dosyalarını, onların kurallarını ve manifest kayıtlarını çıkarır.
Önceden yükleme
preload yalnızca ilk ekranda hemen gereken ağırlıkları önceden yükletir: gövde metni için 400, başlık ve düğmeler için 600. Her ağırlık iki dosyadır (latin ve latin-ext); bu yüzden sayfaya dört font önyüklemesi düşer. Diğer ağırlıklar ve DM Mono kullanıldıkları anda gelir (font-display: swap).
preload verilmezse her ağırlık ve alt küme önceden yüklenir; bu yapılandırmada 12 dosya. Tarayıcı bunların çoğunu ilk ekranda kullanmaz ve "preloaded but not used" uyarısı verir.
@acunFonts
@acunFonts, Laravel'in @fonts yönergesiyle aynı önyükleme etiketlerini basar. Farkı şudur: @font-face kurallarını her sayfaya satır içi <style> olarak yazmaz; eklentinin derlediği fonts-*.css dosyasını bağlar. Tarayıcı bu dosyayı önbelleğe alır.
Birden çok font ailesi tanımladıysanız her düzen yalnızca kendi ailelerini yazabilir. Full sürümün önyüz temaları böyle yapar:
{{-- layouts/front/theme-3.blade.php: başlıklarda Fraunces --}}
@acunFonts(['public-sans', 'fraunces', 'dm-mono'])
Önyükleme etiketleri yalnızca o aileler için basılır; bağlanan dosya yine aynıdır. Tarayıcı sayfanın kullanmadığı fontu indirmez.
- Vite geliştirme sunucusu çalışırken
@acunFontstam olarak@fontsgibi davranır. - Laravel 13'ten önceki sürümlerde
@acunFontshiçbir şey yazmaz; fontları o zaman kendi CSS'inizle yükleyin. - Kendi font dosyalarınızı kullanıyorsanız
@themeiçinde--font-sansve--font-monodeğerlerini değiştirin.
Vite olmadan yüklemek
Vite kullanmıyorsanız JavaScript'in paketlerle gelen derlenmiş kopyalarını @acunUiScripts yönergesiyle yükleyin. Panel düzenlerinde onu head slot'una koyun:
<acun:layout.sidebar brand-name="Uygulamam">
<acun:slot:head>
@acunUiScripts
</acun:slot:head>
{{ $slot }}
</acun:layout.sidebar>
Yönerge ücretsiz acunsoft/acun-ui-free paketindedir. Önce Acun UI'nin ortak JavaScript'ini (acun-ui.js), PRO paketi kuruluysa ardından PRO JavaScript'ini (acun-ui-pro.js) yazar. Kendi düzeninizde onu <head> içine ya da </body> öncesine koyabilirsiniz. Etiketler defer ile gelir ve Livewire Alpine'ı başlatmadan önce çalışır; başka bir şey eklemeniz gerekmez.
- Dosyalar: paketlerin
dist/klasöründedir (acun-ui-free/dist/acun-ui.js,acun-ui-pro/dist/acun-ui-pro.js). Derleme adımı gerekmez. Paketler onları/acun-ui/acun-ui.js?id=<içerik özeti>ve/acun-ui/acun-ui-pro.js?id=<içerik özeti>adreslerinden bir yıllık önbellekle sunar. Dosya değişince adres de değişir. - Adres ayarları:
config/acun-ui.phpiçindedir. Ortak JavaScript içinassets.prefixadresin önekidir (varsayılanacun-ui),assets.urldosyaların bulunduğu bir CDN klasörüdür. PRO için aynı ayarlarpro.assets.prefixvepro.assets.urladını taşır; buradaurldosyanın tam adresidir. Bkz. Yapılandırma. - Web sunucusundan sunmak: dosyaları yayınlayın:
php artisan vendor:publish --tag=acun-ui-assets(public/vendor/acun-ui), PRO için--tag=acun-ui-pro-assets(public/vendor/acun-ui-pro). Yönerge o zaman bu kopyaları kullanır. Paketi güncelledikten sonra--forceile yeniden yayınlayın. Ortak JavaScript'in eski kalan kopyası kullanılmaz, paketin kendi dosyası yüklenir. PRO'nun eski kalan kopyası için konsolda uyarı çıkar. - Grafik, harita ve tarih aralığı: ApexCharts, Leaflet ve flatpickr'i
<script>etiketiyle (asyncolmadan) yüklersenizacun:chart,acun:mapve tarih aralığı seçici kendiliğinden kaydedilir. flatpickr'in dili sayfanınlangözniteliğinden seçilir. Kendi ayarlarınızla kaydetmek içinlivewire:initiçindewindow.AcunUI.pro.registerMap(window.Alpine, L, { tileUrl, attribution })çağırın. - Vite ile birlikte: uygulama JavaScript'i Acun UI'yi zaten Vite ile yüklüyorsa (
import '@acunsoft/acun-ui-core',import '@acunsoft/acun-ui-pro') yönergenin dosyaları hiçbir şey yapmaz. Yine de ikisinden birini seçin.
Tema dosyası
Tema dosyası, kullanıcının tema, ana renk ve menü seçimlerini sayfa ekrana çizilmeden önce uygular; böylece sayfa açılırken renk değiştirip titremez. acun:layout.head onu <head> içine kendisi yazar (hazır düzenler bu bileşeni zaten kullanır):
<script type="application/json" data-acun-ui-config>{…}</script>
<script src="/acun-ui/acun-ui-boot.js?id=…" data-acun-ui-boot data-navigate-track></script>
Bu dosya defer almaz, çünkü ilk çizimden önce çalışmalıdır. Paketle gelir ve adresinde içerik özeti (?id=…) olduğu için tarayıcı onu bir yıl önbellekte tutar. Düzen satır içi JavaScript yazmaz; ayarlar data-acun-ui-config etiketinde yalnızca veri olarak gelir.
İçerik Güvenliği Politikası
Siteniz İçerik Güvenliği Politikası (CSP) kullanıyorsa Acun UI'nin JavaScript etiketlerine nonce verin:
@acunUiScripts(['nonce' => $nonce])
<acun:layout.head :nonce="$nonce">…</acun:layout.head>
Nonce verilmezse ikisi de Vite::cspNonce() değerini kullanır. Hazır düzenler nonce'u buradan alır; Laravel'de Vite::useCspNonce() ile bir nonce üretmeniz yeterlidir.
Ortak JavaScript yüklenmezse
Bir panel sayfasında import '@acunsoft/acun-ui-core' ya da @acunUiScripts yoksa tema dosyası tarayıcı konsoluna tek bir hata yazar (ileti İngilizcedir):
[Acun UI] JavaScript is not loaded: add "import '@acunsoft/acun-ui-core';" to resources/js/app.js and build the assets (npm run build), or add @acunUiScripts to your layout. Drawers, modals and the theme settings will not work.
Sayfa kayıtlı görünümüyle açılır ve başka bir hata çıkmaz. Ama çekmece ve pencere açılmaz; tema ve menü ayarları değişmez. Çözüm: import '@acunsoft/acun-ui-core' satırını JavaScript girişinize (temada resources/js/acun-ui.js) ekleyip derleyin ya da düzene @acunUiScripts ekleyin.
PRO JavaScript yüklenmezse
PRO JavaScript'ine ihtiyaç duyan bileşenler sayfaya bir kez küçük bir denetim ekler. Bu bileşenler: acun:combobox, acun:file-upload, acun:form-modal, acun:form dirty-check ve tarayıcı işlemi, sabit başlığı ya da sabit sütunları olan DataTable. PRO JavaScript'i yüklenmemişse konsolda şu hata çıkar:
[Acun UI PRO] JavaScript is not loaded: add "import '@acunsoft/acun-ui-pro';" to resources/js/app.js and build the assets (npm run build), or add @acunUiScripts to your layout. Components that will not work: acun:combobox (1), acun:data-table (1).
- İlk sayfa yüklemesinde açılır liste ve dosya yükleme alanı soluk ve tıklanamaz kalır. Sayfanın geri kalanı çalışır.
- DataTable'da arama, filtre ve sayfalama çalışmaya devam eder. Dışa aktarma, kopyalama ve tam ekran gibi tarayıcıdaki işlemler çalışmaz.
@acunUiScriptssayfada olduğu hâlde dosya gelmediyse hata "The JavaScript file could not be loaded (…)" diye başlar.
Ayrıntılar: Sık sorulan sorular.
Daha fazlası
- Mevcut projeye ekleme: bu dosyaları sıfırdan kurmak.
- Bağımlılıklar: paketlerin ve kütüphanelerin listesi.
- Yapılandırma:
config/acun-ui.phpayarları. - Yayına alma: sunucuya yüklemeden önce derlemek.