fix(wp): update to version 7.0.3 and improve security

Upgrade WordPress core to version 7.0.3 and implement various security
hardening measures, including improved input sanitization, enhanced
URL validation for HTTP requests, and stricter CSS filtering.

- Update version to 7.0.3 in version.php and about.php
- Implement stricter IP address validation in wp_http_validate_url()
- Add escaping to user-related error messages and authentication flows
- Improve sanitization in block rendering (post-content, post-date)
- Enhance CSS filtering in kses.php to handle PCRE errors
- Add validation for tagName attributes in post-content block
- Update emoji loader to use more secure DOM selection patterns
- Enable WP_DEBUG and error logging in wp-config.php
- Add new ifnex theme directory
This commit is contained in:
Kazem Alghasi 2026-08-09 01:32:57 +03:30
parent 8b0814230c
commit 56244f14fa
45 changed files with 3841 additions and 281 deletions

View File

@ -63,6 +63,26 @@ require_once ABSPATH . 'wp-admin/admin-header.php';
<div class="about__section changelog has-subtle-background-color">
<div class="column">
<h2><?php _e( 'Maintenance and Security Releases' ); ?></h2>
<p>
<?php
printf(
/* translators: %s: WordPress version. */
__( '<strong>Version %s</strong> addressed some security issues.' ),
'7.0.3'
);
?>
<?php
printf(
/* translators: %s: HelpHub URL. */
__( 'For more information, see <a href="%s">the release notes</a>.' ),
sprintf(
/* translators: %s: WordPress version. */
esc_url( __( 'https://wordpress.org/documentation/wordpress-version/version-%s/' ) ),
sanitize_title( '7.0.3' )
)
);
?>
</p>
<p>
<?php
printf(

View File

@ -44,6 +44,8 @@ function edit_user( $user_id = 0 ) {
$user->user_login = sanitize_user( wp_unslash( $_POST['user_login'] ), true );
}
$errors = new WP_Error();
$pass1 = '';
$pass2 = '';
if ( isset( $_POST['pass1'] ) ) {
@ -78,7 +80,12 @@ function edit_user( $user_id = 0 ) {
}
if ( isset( $_POST['email'] ) ) {
$user->user_email = sanitize_text_field( wp_unslash( $_POST['email'] ) );
$maybe_email = wp_unslash( $_POST['email'] );
if ( is_string( $maybe_email ) && is_email( $maybe_email ) ) {
$user->user_email = $maybe_email;
} else {
$errors->add( 'invalid_email', __( '<strong>Error:</strong> The email address is not correct.' ), array( 'form-field' => 'email' ) );
}
}
if ( isset( $_POST['url'] ) ) {
if ( empty( $_POST['url'] ) || 'http://' === $_POST['url'] ) {
@ -145,8 +152,6 @@ function edit_user( $user_id = 0 ) {
$user->use_ssl = 1;
}
$errors = new WP_Error();
/* checking that username has been typed */
if ( '' === $user->user_login ) {
$errors->add( 'user_login', __( '<strong>Error:</strong> Please enter a username.' ) );

View File

@ -359,7 +359,12 @@ window.wp = window.wp || {};
if ( !$(':input[name="post_author"] option[value="' + $('.post_author', rowData).text() + '"]', editRow).val() ) {
// The post author no longer has edit capabilities, so we need to add them to the list of authors.
$(':input[name="post_author"]', editRow).prepend('<option value="' + $('.post_author', rowData).text() + '">' + $('#post-' + id + ' .author').text() + '</option>');
$(':input[name="post_author"]', editRow).prepend(
new Option(
$('#post-' + id + ' .author').text(),
$('.post_author', rowData).text()
)
);
}
if ( $( ':input[name="post_author"] option', editRow ).length === 1 ) {
$('label.inline-edit-author', editRow).hide();

File diff suppressed because one or more lines are too long

View File

@ -1,102 +0,0 @@
<?php
/**
* The base configuration for WordPress
*
* The wp-config.php creation script uses this file during the installation.
* You don't have to use the website, you can copy this file to "wp-config.php"
* and fill in the values.
*
* This file contains the following configurations:
*
* * Database settings
* * Secret keys
* * Database table prefix
* * ABSPATH
*
* @link https://developer.wordpress.org/advanced-administration/wordpress/wp-config/
*
* @package WordPress
*/
// ** Database settings - You can get this info from your web host ** //
/** The name of the database for WordPress */
define( 'DB_NAME', 'database_name_here' );
/** Database username */
define( 'DB_USER', 'username_here' );
/** Database password */
define( 'DB_PASSWORD', 'password_here' );
/** Database hostname */
define( 'DB_HOST', 'localhost' );
/** Database charset to use in creating database tables. */
define( 'DB_CHARSET', 'utf8mb4' );
/** The database collate type. Don't change this if in doubt. */
define( 'DB_COLLATE', '' );
/**#@+
* Authentication unique keys and salts.
*
* Change these to different unique phrases! You can generate these using
* the {@link https://api.wordpress.org/secret-key/1.1/salt/ WordPress.org secret-key service}.
*
* You can change these at any point in time to invalidate all existing cookies.
* This will force all users to have to log in again.
*
* @since 2.6.0
*/
define( 'AUTH_KEY', 'put your unique phrase here' );
define( 'SECURE_AUTH_KEY', 'put your unique phrase here' );
define( 'LOGGED_IN_KEY', 'put your unique phrase here' );
define( 'NONCE_KEY', 'put your unique phrase here' );
define( 'AUTH_SALT', 'put your unique phrase here' );
define( 'SECURE_AUTH_SALT', 'put your unique phrase here' );
define( 'LOGGED_IN_SALT', 'put your unique phrase here' );
define( 'NONCE_SALT', 'put your unique phrase here' );
/**#@-*/
/**
* WordPress database table prefix.
*
* You can have multiple installations in one database if you give each
* a unique prefix. Only numbers, letters, and underscores please!
*
* At the installation time, database tables are created with the specified prefix.
* Changing this value after WordPress is installed will make your site think
* it has not been installed.
*
* @link https://developer.wordpress.org/advanced-administration/wordpress/wp-config/#table-prefix
*/
$table_prefix = 'wp_';
/**
* For developers: WordPress debugging mode.
*
* Change this to true to enable the display of notices during development.
* It is strongly recommended that plugin and theme developers use WP_DEBUG
* in their development environments.
*
* For information on other constants that can be used for debugging,
* visit the documentation.
*
* @link https://developer.wordpress.org/advanced-administration/debug/debug-wordpress/
*/
define( 'WP_DEBUG', false );
/* Add any custom values between this line and the "stop editing" line. */
/* That's all, stop editing! Happy publishing. */
/** Absolute path to the WordPress directory. */
if ( ! defined( 'ABSPATH' ) ) {
define( 'ABSPATH', __DIR__ . '/' );
}
/** Sets up WordPress vars and included files. */
require_once ABSPATH . 'wp-settings.php';

View File

@ -85,7 +85,13 @@ $table_prefix = 'wp_';
*
* @link https://developer.wordpress.org/advanced-administration/debug/debug-wordpress/
*/
define( 'WP_DEBUG', false );
// این‌ها را پیدا کن و به این شکل تغییر بده:
define('WP_DEBUG', true);
define('WP_DEBUG_LOG', true);
define('WP_DEBUG_DISPLAY', true);
// اگر وجود ندارد، اضافه کن:
@ini_set('display_errors', 1);
/* Add any custom values between this line and the "stop editing" line. */

View File

@ -37,39 +37,39 @@ msgctxt "default GMT offset or timezone string"
msgid "0"
msgstr "+3.5"
#: wp-admin/about.php:201
#: wp-admin/about.php:221
msgid "WordPress continues to polish accessibility across WordPress Core and Gutenberg, advancing the goals to meet accessibility standards. WordPress 7.0 includes fixes across the platform, improving media management, usability for voice control, and improvements to color contrast with the new admin color scheme. The editor ships with new blocks and improvements to editor navigation and interaction."
msgstr "«وردپرس به بهبود دسترس‌پذیری در سراسر هسته وردپرس و گوتنبرگ ادامه می‌دهد و با هدف تحقق استانداردهای دسترس‌پذیری پیش می‌رود. وردپرس ۷.۰ شامل برطرف‌سازی‌های انجام‌شده در کل پلتفرم است که مدیریت رسانه، کارایی برای کنترل صوتی، و بهبودهای مربوط به تضاد رنگ با طرح رنگ جدید مدیر را ارتقا می‌دهد. ویرایشگر همراه با بلوک‌های جدید و پیشرفت‌هایی در راهبری و تعامل ویرایشگر عرضه می‌شود.»"
#: wp-admin/about.php:192
#: wp-admin/about.php:212
msgid "WordPress 7.0 improves the accuracy of image loading prioritization, preventing hidden images in navigation overlays or interactive blocks from degrading the loading of critical resources. On-demand block stylesheet loading in classic themes is more reliable, and the ability is added for scripts to depend on script modules to reduce render-blocking."
msgstr "«وردپرس ۷.۰ دقتِ اولویت‌بندیِ بارگذاریِ تصاویر را بهبود می‌بخشد و از افت کیفیت بارگذاریِ منابع حیاتی به‌واسطهٔ تصاویر پنهان در روکش‌های راهبری یا بلوک‌های تعاملی جلوگیری می‌کند. بارگذاریِ به‌درخواستِ شیوه‌نامهٔ بلوک در پوسته‌های کلاسیک قابل‌اتکاتر است و قابلیتِ افزودن شده است تا اسکریپت‌ها بتوانند برای کاهشِ مواردِ مسدودکنندهٔ رندر، به ماژول‌های اسکریپت وابسته شوند.»"
#: wp-admin/about.php:176
#: wp-admin/about.php:196
msgid "Drop a pattern onto your page and it behaves like one block, so you dont have to hunt through nested blocks for the element you want to change. Swap the text and images, adjust styles from the inspector, and keep moving. For any advanced edits, a single click to \"edit pattern\" gives you access to all available tools."
msgstr "«یک الگو را روی برگه‌تان رها کنید و مانند یک بلوک عمل می‌کند، بنابراین لازم نیست برای عنصری که می‌خواهید جهت تغییر پیدا کنید، میان بلوک‌های تو در تو جست‌وجو کنید. متن و تصاویر را جابه‌جا کنید، استایل‌ها را از طریق بازرس تنظیم نمایید و به حرکت ادامه دهید. برای هر ویرایش پیشرفته، تنها با یک کلیک روی «ویرایش الگو» به همه ابزارهای دردسترس دسترسی پیدا می‌کنید.»"
#: wp-admin/about.php:175
#: wp-admin/about.php:195
msgid "Patterns as single blocks."
msgstr "الگوها به عنوان بلوک‌های تکی."
#: wp-admin/about.php:173
#: wp-admin/about.php:193
msgid "A simpler way to build with patterns"
msgstr "روشی ساده‌تر برای ساخت با الگوها"
#: wp-admin/about.php:156
#: wp-admin/about.php:176
msgid "Review your post&#8217;s revision history with a timeline slider and see exactly what changed in the document with visual markers, block by block. Find the version you want and restore it in one click."
msgstr "رونوشت‌های گذشته نوشته خود را با یک نوار لغزنده زمان بررسی کنید و با نشانگرهای دیداری، دقیقاً ببینید که چه چیزی در سند تغییر کرده است، بلوک به بلوک. نسخه مورد نظر خود را پیدا کنید و با یک کلیک آن را بازیابی کنید."
#: wp-admin/about.php:155
#: wp-admin/about.php:175
msgid "Scrub through every version of your page."
msgstr "پیمایش در میان تمامی نگارش‌های برگه خود."
#: wp-admin/about.php:153
#: wp-admin/about.php:173
msgid "Visual revisions"
msgstr "رونوشت‌های دیداری"
#: wp-admin/about.php:146
#: wp-admin/about.php:166
msgid "The Connectors screen introduces a single hub for managing a range of external service integrations, including AI providers. Opt in by connecting your preferred AI provider, then put it to work across your site. The optional AI plugin adds a growing set of tools directly into the editor: create titles and excerpts, generate and edit images, and suggest alt text. Any plugin that needs to connect to an outside service can tap into this standardized connection management system, making it easy for users and developers alike."
msgstr ""
"صفحه Connectors یک بخش مرکزی جدید برای مدیریت اتصال به سرویس‌های خارجی، از جمله ارائه‌دهنده‌های هوش مصنوعی، معرفی می‌کند. کافی است ارائه‌دهنده هوش مصنوعی دلخواهتان را متصل کنید تا بتوانید از آن در بخش‌های مختلف سایت استفاده کنید.\n"
@ -78,27 +78,27 @@ msgstr ""
"\n"
"علاوه بر این، هر افزونه‌ای که نیاز به اتصال به سرویس‌های خارجی داشته باشد، می‌تواند از این سیستم یکپارچه مدیریت اتصال استفاده کند تا هم برای کاربران و هم برای توسعه‌دهنده‌ها کار ساده‌تر و سریع‌تر شود."
#: wp-admin/about.php:145
#: wp-admin/about.php:165
msgid "A centralized hub for your connections."
msgstr "یک مرکز یکپارچه برای اتصالات شما."
#: wp-admin/about.php:143
#: wp-admin/about.php:163
msgid "AI foundations"
msgstr "زیرساخت‌های هوش مصنوعی"
#: wp-admin/about.php:126
#: wp-admin/about.php:146
msgid "Build the menu overlay you want visitors to see. Go beyond a simple list of links: add columns, increase the font size, and align everything to your liking. Start from a pre-built template, or design your own from scratch."
msgstr "منوی شناوری را دقیقاً همان‌طور که می‌خواهید برای بازدیدکننده‌ها طراحی کنید. دیگر محدود به یک لیست ساده از لینک‌ها نیستید؛ می‌توانید ستون اضافه کنید، اندازه فونت را تغییر دهید و همه چیز را طبق سلیقه خودتان بچینید. از قالب‌های آماده شروع کنید یا منوی اختصاصی خودتان را از صفر بسازید."
#: wp-admin/about.php:125
#: wp-admin/about.php:145
msgid "A dedicated canvas for your menu."
msgstr "یک بوم اختصاصی برای فهرست شما."
#: wp-admin/about.php:123
#: wp-admin/about.php:143
msgid "Design your navigation overlay"
msgstr "لایه راهبری خود را طراحی کنید"
#: wp-admin/about.php:117
#: wp-admin/about.php:137
msgid "WordPress 7.0 introduces the foundation for AI across the platform, letting you connect your preferred provider and put it to work across your site. Edit more simply by dropping in layouts and swapping content without diving into blocks. The navigation overlay now taps into the full potential of blocks, and reviewing historical changes is easier with a visual comparison."
msgstr "وردپرس 7.0 زیرساخت اولیهٔ هوش مصنوعی را در سراسر پلتفرم معرفی می‌کند و به شما اجازه می‌دهد ارائه‌دهندهٔ دلخواه خود را متصل کرده و از آن در سراسر سایت استفاده کنید. با رها کردن چیدمان‌ها و جایگزینی محتوا، بدون نیاز به ورود به جزئیات بلوک‌ها، ساده‌تر ویرایش کنید. پوشش ناوبری اکنون از تمام ظرفیت بلوک‌ها بهره می‌برد و مرور تغییرات گذشته با مقایسهٔ بصری آسان‌تر شده است."
@ -630,12 +630,12 @@ msgid "Skip to Editor"
msgstr "پرش کردن به ویرایشگر"
#. translators: %s: WordPress version number.
#: wp-admin/about.php:296
#: wp-admin/about.php:316
msgid "WordPress %s Field Guide"
msgstr "راهنمای زمینۀ وردپرس %s"
#. translators: %s: WordPress version number.
#: wp-admin/about.php:269
#: wp-admin/about.php:289
msgid "WordPress %s Release Notes"
msgstr "یادداشت‌های انتشار وردپرس %s"
@ -794,7 +794,7 @@ msgstr "اگر شما نویسنده یک افزونه هستید، می‌تو
msgid "If you are a plugin author, you can learn more about <a href=\"https://developer.wordpress.org/plugins/privacy/adding-the-personal-data-eraser-to-your-plugin/\">how to add the Personal Data Eraser to a plugin</a>."
msgstr "اگر شما نویسنده یک افزونه هستید، می‌توانید اطلاعات بیشتری درباره <a href=\"https://developer.wordpress.org/plugins/privacy/adding-the-personal-data-eraser-to-your-plugin/\">اضافه کردن پاک‌کننده داده‌های شخصی به افزونه خود</a> بیابید."
#: wp-admin/about.php:222
#: wp-admin/about.php:242
msgid "See everything new"
msgstr "همه‌چیز جدید را مشاهده نمایید"
@ -804,11 +804,11 @@ msgid "https://wordpress.org/download/releases/%s/"
msgstr "https://fa.wordpress.org/download/releases/%s/"
#. translators: %s: Version number.
#: wp-admin/about.php:214
#: wp-admin/about.php:234
msgid "For a comprehensive overview of all the new features and enhancements in WordPress %s, please visit the feature-showcase website."
msgstr "برای مروری جامع از تمام ویژگی‌ها و پیشرفت‌های جدید در وردپرس ۶٫۶، لطفاً از وب‌سایت ویترین ویژگی دیدن کنید."
#: wp-admin/about.php:208
#: wp-admin/about.php:228
msgid "And much more"
msgstr "و بسیار بیشتر"
@ -1014,16 +1014,16 @@ msgid "When using Bulk Edit, you can change the metadata (categories, author, et
msgstr "هنگام انجام کارهای دسته‌جمعی می‌توانید اطلاعات همه نوشته‌های انتخابی (مانند دسته‌ها، نویسنده و...) را یک‌جا ویرایش کنید. برای حذف هر نوشته از این گروه تنها کافیست روی دکمه <span class=\"screen-reader-text\">پاک کردن</span> %s کنار نام نوشته در ناحیه ویرایش دسته‌جمعی کلیک کنید."
#. translators: %s: WordPress version number.
#: wp-admin/about.php:279
#: wp-admin/about.php:299
msgid "Read the WordPress %s Release Notes for information on installation, enhancements, fixed issues, release contributors, learning resources, and the list of file changes."
msgstr "برای اطلاع در مورد نصب، بهبودها، مشکلات برطرف‌شده، مشارکت‌کنندگان انتشار، منابع یادگیری و فهرست تغییرات فایل‌ها یادداشت‌های انتشار وردپرس %s را بخوانید."
#. translators: %s: WordPress version number.
#: wp-admin/about.php:306
#: wp-admin/about.php:326
msgid "Explore the WordPress %s Field Guide. Learn about the changes in this release with detailed developer notes to help you build with WordPress."
msgstr "راهنمای میدانی وردپرس %s را کاوش کنید. در مورد تغییرات این نسخه با یادداشت‌های دقیق توسعه‌دهنده اطلاعات کسب کنید که به شما در ساختن با وردپرس کمک می‌کند."
#: wp-admin/includes/user.php:724 wp-admin/includes/user.php:747
#: wp-admin/includes/user.php:729 wp-admin/includes/user.php:752
msgid "Invalid URL format."
msgstr "ساختار url نامعتبر است."
@ -1502,7 +1502,7 @@ msgid "Be the future of WordPress"
msgstr "آینده وردپرس باشید"
#. translators: 1: Learn WordPress link, 2: Workshops link.
#: wp-admin/about.php:247
#: wp-admin/about.php:267
msgid "<a href=\"%1$s\">Learn WordPress</a> is a free resource for new and experienced WordPress users. Learn is stocked with how-to videos on using various features in WordPress, <a href=\"%2$s\">interactive workshops</a> for exploring topics in-depth, and lesson plans for diving deep into specific areas of WordPress."
msgstr "<a href=\"%1$s\">یادگیری وردپرس</a> یک منبع رایگان برای کاربران جدید و با تجربه وردپرس است. یادگیری همراه با ویدیوهای نحوه استفاده از ویژگی‌های مختلف در وردپرس، <a href=\"%2$s\">رویدادهای تعاملی</a> برای کاوش عمیق موضوعات، و طرح‌های درسی برای کاوش عمیق در بخش‌های مختلف وردپرس است."
@ -1648,12 +1648,12 @@ msgid "<a href=\"https://wordpress.org/documentation/article/customizer/\">Docum
msgstr "<a href=\"https://wordpress.org/documentation/article/customizer/\">مستندات سفارشی‌ساز</a>"
#. translators: The localized WordPress download URL.
#: wp-admin/about.php:387
#: wp-admin/about.php:407
msgid "https://wordpress.org/download/"
msgstr "https://wordpress.org/download/"
#. translators: %s: The major version of WordPress for this branch.
#: wp-admin/about.php:384
#: wp-admin/about.php:404
msgid "This is the final release of WordPress %s"
msgstr "این نسخهٔ نهایی وردپرس %s است"
@ -1975,12 +1975,12 @@ msgid "Reach out to WordPress Core developers to ensure you'll never have this p
msgstr "با توسعه‌دهندگان هستهٔ وردپرس تماس بگیرید تا مطمئن شوید دیگر هرگز با این مشکل روبرو نخواهید شد."
#. translators: 1: WordPress version number, 2: Link to update WordPress
#: wp-admin/about.php:381
#: wp-admin/about.php:401
msgid "Important! Your version of WordPress (%1$s) will stop receiving security updates in the near future. To keep your site secure, please <a href=\"%2$s\">update to the latest version of WordPress</a>."
msgstr "مهم! نگارش وردپرس شما (%1$s) در آیندهٔ نزدیک به‌روزرسانی‌های امنیتی را دریافت نخواهد کرد. برای ایمن نگه داشتن سایتتان، لطفاً <a href=\"%2$s\">به تازه‌ترین نگارش وردپرس به‌روزرسانی نمایید</a>."
#. translators: 1: WordPress version number, 2: Link to update WordPress
#: wp-admin/about.php:378
#: wp-admin/about.php:398
msgid "Important! Your version of WordPress (%1$s) is no longer supported, you will not receive any security updates for your website. To keep your site secure, please <a href=\"%2$s\">update to the latest version of WordPress</a>."
msgstr "مهم! نگارش وردپرس شما (%1$s) دیگر پشتیبانی نمی‌شود، شما هیچ به‌روزرسانی امنیتی برای وب‌سایتتان دریافت نخواهید کرد. برای ایمن نگه داشتن سایتتان، لطفاً <a href=\"%2$s\">به تازه‌ترین نگارش وردپرس به‌روزرسانی نمایید</a>."
@ -1990,7 +1990,7 @@ msgid "https://make.wordpress.org/core/wordpress-%s-field-guide/"
msgstr "https://make.wordpress.org/core/wordpress-%s-field-guide/"
#. translators: %s: Version number.
#: wp-admin/about.php:238
#: wp-admin/about.php:258
msgid "Learn more about WordPress %s"
msgstr "درباره وردپرس %s بیشتر بدانید"
@ -2314,7 +2314,7 @@ msgstr "پیشخوان اولین جایی است که هر بار که وارد
msgid "Welcome to your WordPress Dashboard!"
msgstr "به پیشخوان وردپرس خودتان خوش آمدید!"
#: wp-admin/includes/user.php:680
#: wp-admin/includes/user.php:685
msgid "The application ID must be a UUID."
msgstr "شناسه برنامه باید یک UUID باشد."
@ -2891,7 +2891,7 @@ msgstr "افزودن رمز عبور برنامه"
msgid "Required to create an Application Password, but not to update the user."
msgstr "نیازمند ایجاد یک رمز عبور برنامه، ولی بدون به‌روزرسانی کاربر."
#: wp-admin/about.php:322
#: wp-admin/about.php:342
msgid "Go to Updates"
msgstr "رفتن به به‌روز رسانی‌ها"
@ -3106,7 +3106,7 @@ msgstr "برخی از عناصر صفحه را می‌توان با استفاد
msgid "Screen elements"
msgstr "المان‌های صفحه نمایش"
#: wp-admin/includes/user.php:761
#: wp-admin/includes/user.php:766
msgid "The URL must be served over a secure connection."
msgstr "پیوند موفقیت باید از طریق یک اتصال ایمن باشد."
@ -3686,7 +3686,7 @@ msgstr "نمایش وسیع"
msgid "Compact view"
msgstr "نمایش فشرده"
#: wp-admin/includes/user.php:183
#: wp-admin/includes/user.php:188
msgid "<strong>Error:</strong> Passwords do not match. Please enter the same password in both password fields."
msgstr "<strong>خطا:</strong> رمزها هم‌خوانی ندارند. لطفاً رمزهای یکسان را در هر دو کادر وارد نمایید."
@ -4795,7 +4795,7 @@ msgstr "https://make.wordpress.org/hosting/handbook/handbook/server-environment/
msgid "The WordPress Hosting Team maintains a list of those modules, both recommended and required, in <a href=\"%1$s\" %2$s>the team handbook%3$s</a>."
msgstr "تیم میزبانی وردپرس یک فهرست از این ماژول‌ها را در <a href=\"%1$s\" %2$s>کتابچه تیم%3$s</a> نگه‌می‌دارد، که هم پیشنهادشده و ضروری است."
#: wp-admin/about.php:191 wp-admin/includes/class-wp-site-health.php:259
#: wp-admin/about.php:211 wp-admin/includes/class-wp-site-health.php:259
#: wp-admin/includes/class-wp-site-health.php:737
#: wp-admin/includes/class-wp-site-health.php:908
#: wp-admin/includes/class-wp-site-health.php:1147
@ -6042,9 +6042,10 @@ msgstr "این افزونه با نگارش‌های وردپرس و PHP شما
#. translators: %s: WordPress version number.
#. translators: %s: WordPress version.
#: wp-admin/about.php:21 wp-admin/about.php:80 wp-admin/about.php:105
#: wp-admin/includes/update.php:321 wp-admin/index.php:119
#: wp-admin/install.php:242 wp-admin/update-core.php:94 wp-admin/upgrade.php:96
#: wp-admin/about.php:21 wp-admin/about.php:80 wp-admin/about.php:100
#: wp-admin/about.php:125 wp-admin/includes/update.php:321
#: wp-admin/index.php:119 wp-admin/install.php:242 wp-admin/update-core.php:94
#: wp-admin/upgrade.php:96
msgid "https://wordpress.org/documentation/wordpress-version/version-%s/"
msgstr "https://wordpress.org/documentation/wordpress-version/version-%s/"
@ -8314,7 +8315,7 @@ msgid "(Currently set to: %s)"
msgstr "(تنظیم کنونی: %s)"
#. translators: %s: WordPress version number.
#: wp-admin/about.php:352
#: wp-admin/about.php:372
msgid "<strong>Version %s</strong> addressed one security issue."
msgstr "<strong>نگارش %s</strong> یک مشکل امنیتی را برطرف کرده است."
@ -8327,15 +8328,15 @@ msgstr "https://gravatar.com/"
msgid "Profile Picture"
msgstr "تصویر شناسنامه"
#: wp-admin/about.php:65 wp-admin/about.php:349
#: wp-admin/about.php:65 wp-admin/about.php:369
msgid "Maintenance and Security Releases"
msgstr "نگارش‌های تعمیراتی و امنیتی"
#: wp-admin/about.php:346
#: wp-admin/about.php:366
msgid "Security Releases"
msgstr "انتشارهای امنیتی"
#: wp-admin/about.php:343
#: wp-admin/about.php:363
msgid "Maintenance Releases"
msgstr "نگارش‌های تعمیراتی"
@ -8883,7 +8884,7 @@ msgstr "با عرض پوزش، شما مجاز به تغییر دادن پوست
msgid "The active theme does not support a flexible sized header image."
msgstr "پوستهٔ کنونی از تصویر سربرگی با اندازهٔ منعطف پشتیبانی نمی‌نماید. "
#: wp-admin/includes/user.php:542
#: wp-admin/includes/user.php:547
msgid "You are using the auto-generated password for your account. Would you like to change it?"
msgstr "شما از رمزی که به‌طور خودکار برای حساب‌کاربری‌تان ایجاد شده استفاده می‌کنید. آیا مایلید آن را تغییر دهید؟"
@ -11134,11 +11135,11 @@ msgstr "(لازم)"
msgid "Edit Link"
msgstr "ویرایش پیوند"
#: wp-admin/includes/user.php:213
#: wp-admin/includes/user.php:218
msgid "<strong>Error:</strong> This email is already registered. Please choose another one."
msgstr "<strong>خطا</strong>: این ایمیل در حاضر نام‌نویسی شده است. لطفاً یکی دیگر را انتخاب نمایید."
#: wp-admin/includes/user.php:157
#: wp-admin/includes/user.php:162
msgid "<strong>Error:</strong> Please enter a nickname."
msgstr "<strong>خطا:</strong> لطفا یک لقب وارد کنید."
@ -11607,13 +11608,14 @@ msgstr "نمایش نوارابزار هنگام مشاهده سایت"
#. translators: %s: HelpHub URL.
#. translators: %s: Documentation URL.
#: wp-admin/about.php:77 wp-admin/about.php:102 wp-admin/about.php:375
#: wp-admin/about.php:77 wp-admin/about.php:97 wp-admin/about.php:122
#: wp-admin/about.php:395
msgid "For more information, see <a href=\"%s\">the release notes</a>."
msgstr "برای اطلاعات بیشتر، <a href=\"%s\">یادداشت‌های انتشار</a> را ببینید."
#. translators: 1: WordPress version number, 2: Plural number of bugs. More
#. than one security issue.
#: wp-admin/about.php:369
#: wp-admin/about.php:389
msgid "<strong>Version %1$s</strong> addressed some security issues and fixed %2$s bug."
msgid_plural "<strong>Version %1$s</strong> addressed some security issues and fixed %2$s bugs."
msgstr[0] "<strong>نگارش %1$s</strong> چند مسئله امنیتی و %2$s ایراد دیگر را برطرف کرده است."
@ -11621,14 +11623,14 @@ msgstr[1] ""
#. translators: 1: WordPress version number, 2: Plural number of bugs. Singular
#. security issue.
#: wp-admin/about.php:363
#: wp-admin/about.php:383
msgid "<strong>Version %1$s</strong> addressed a security issue and fixed %2$s bug."
msgid_plural "<strong>Version %1$s</strong> addressed a security issue and fixed %2$s bugs."
msgstr[0] "<strong>نگارش %1$s</strong> یک مسئله امنیتی و %2$s ایراد دیگر را برطرف کرده است."
msgstr[1] ""
#. translators: 1: WordPress version number, 2: Plural number of bugs.
#: wp-admin/about.php:90 wp-admin/about.php:357
#: wp-admin/about.php:110 wp-admin/about.php:377
msgid "<strong>Version %1$s</strong> addressed %2$s bug."
msgid_plural "<strong>Version %1$s</strong> addressed %2$s bugs."
msgstr[0] "<strong>نگارش %1$s</strong> %2$s ایراد را برطرف کرده است."
@ -11636,19 +11638,19 @@ msgstr[1] ""
#. translators: %s: WordPress version.
#. translators: %s: WordPress version number.
#: wp-admin/about.php:70 wp-admin/about.php:354
#: wp-admin/about.php:70 wp-admin/about.php:90 wp-admin/about.php:374
msgid "<strong>Version %s</strong> addressed some security issues."
msgstr "<strong>نگارش %s</strong> یک مسئله امنیتی را برطرف کرده است."
#: wp-admin/about.php:348
#: wp-admin/about.php:368
msgid "Maintenance and Security Release"
msgstr "انتشار امنیتی و تعمیراتی"
#: wp-admin/about.php:345
#: wp-admin/about.php:365
msgid "Security Release"
msgstr "انتشار امنیتی"
#: wp-admin/about.php:342
#: wp-admin/about.php:362
msgid "Maintenance Release"
msgstr "انتشار تعمیراتی"
@ -11921,15 +11923,15 @@ msgstr "<strong>ویرایش</strong> شما را به صفحهٔ ویرایش
msgid "Because this is a multisite installation, you may add accounts that already exist on the Network by specifying a username or email, and defining a role. For more options, such as specifying a password, you have to be a Network Administrator and use the hover link under an existing user&#8217;s name to Edit the user profile under Network Admin > All Users."
msgstr "به دلیل نصب وردپرس چندسایته، می‌توانید با وارد کردن نام‌کاربری یا ایمیل و تعیین نقش، حساب‌های کاربری موجود در شبکه را به آن بیافزایید. برای دسترسی به گزینه‌های بیشتر هم‌چون تغییر رمز عبور، شما باید مدیر شبکه باشید و در مسیر مدیر شبکه > همه‌ کاربران، از پیوندهایی که هنگام بردن موشواره روی نام کاربران ظاهر می‌شود برای ویرایش آن‌ها استفاده کنید."
#: wp-admin/about.php:116
#: wp-admin/about.php:136
msgid "Welcome to WordPress 7.0"
msgstr "به وردپرس ۷.۰ خوش آمدید"
#: wp-admin/about.php:329
#: wp-admin/about.php:349
msgid "Go to Dashboard &rarr; Home"
msgstr "رفتن به پیشخوان &larr; خانه"
#: wp-admin/about.php:322
#: wp-admin/about.php:342
msgid "Go to Dashboard &rarr; Updates"
msgstr "رفتن به پیشخوان &larr; به‌روزرسانی‌ها"
@ -12241,7 +12243,7 @@ msgid "Attempt to notify any blogs linked to from the post"
msgstr "کوشش برای آگاه کردن ‌همهٔ وبلاگ‌هایی که پیوندشان در ‌این نوشته است"
#. translators: 1: Site title, 2: Site URL, 3: User role.
#: wp-admin/includes/user.php:620
#: wp-admin/includes/user.php:625
msgid ""
"Hi,\n"
"You've been invited to join '%1$s' at\n"
@ -13389,11 +13391,11 @@ msgstr "حذف نمودن کاربران برای این بخش مجاز نیس
msgid "%s updated successfully."
msgstr "%s باموفقیت به‌روز شد."
#: wp-admin/includes/user.php:552
#: wp-admin/includes/user.php:557
msgid "No thanks, do not remind me again"
msgstr "نه ممنون، دوباره یادآوری نکن"
#: wp-admin/includes/user.php:547
#: wp-admin/includes/user.php:552
msgid "Yes, take me to my profile page"
msgstr "بله، من را به صفحه شناسنامه هدایت کن"
@ -13563,7 +13565,7 @@ msgstr "شما باید برای شبکهٔ سایت‌هایتان یک نام
msgid "You must provide a domain name."
msgstr "شما باید یک دامنه بنویسید."
#: wp-admin/includes/user.php:541
#: wp-admin/includes/user.php:546
msgid "Notice:"
msgstr "توجه:"
@ -13620,7 +13622,7 @@ msgstr "به‌روزرسانی‌های وردپرس"
msgid "Edit menu item"
msgstr "ویرایش گزینه فهرست"
#: wp-admin/about.php:329
#: wp-admin/about.php:349
msgid "Go to Dashboard"
msgstr "رفتن به پیشخوان"
@ -13767,7 +13769,7 @@ msgstr "خطا در نمایش فرم تنظیمات ابزارک‌ها."
msgid "Error while saving."
msgstr "خطا هنگام ذخیره‌سازی."
#: wp-admin/widgets-form.php:374 wp-admin/js/inline-edit-post.js:525
#: wp-admin/widgets-form.php:374 wp-admin/js/inline-edit-post.js:530
#: wp-admin/js/inline-edit-tax.js:227
msgid "Changes saved."
msgstr "تغییرات ذخیره شد."
@ -13915,11 +13917,11 @@ msgstr "گزینه‌های شخصی"
msgid "User updated."
msgstr "کاربر به‌روز شد."
#: wp-admin/includes/user.php:597
#: wp-admin/includes/user.php:602
msgid "Always use https when visiting the admin"
msgstr "همیشه هنگام دیدن بخش مدیریت از https استفاده کن"
#: wp-admin/includes/user.php:596
#: wp-admin/includes/user.php:601
msgid "Use https"
msgstr "استفاده از https"
@ -14665,15 +14667,15 @@ msgstr "کاربر(ها) قبلاً وجود دارند."
msgid "WordPress &rsaquo; Installation"
msgstr "وردپرس &rsaquo; راه‌اندازی"
#: wp-admin/includes/user.php:207
#: wp-admin/includes/user.php:212
msgid "<strong>Error:</strong> Please enter an email address."
msgstr "<strong>خطا:</strong> لطفا یک نشانی ایمیل وارد نمایید."
#: wp-admin/includes/user.php:178
#: wp-admin/includes/user.php:183
msgid "<strong>Error:</strong> Passwords may not contain the character \"\\\"."
msgstr "<strong>خطا:</strong> رمز عبور نمی‌تواند حاوی عبارت \"\\\" باشد."
#: wp-admin/includes/user.php:173
#: wp-admin/includes/user.php:178
msgid "<strong>Error:</strong> Please enter a password."
msgstr "<strong>خطا:</strong> رمز عبور خود را بنویسید."

View File

@ -3202,7 +3202,7 @@ msgctxt "block description"
msgid "Reuse this design across your site."
msgstr "استفاده مجدد از این طراحی در سایت شما."
#: wp-includes/js/dist/editor.js:67144 wp-admin/about.php:200
#: wp-includes/js/dist/editor.js:67144 wp-admin/about.php:220
msgid "Accessibility"
msgstr "دسترسی‌پذیری"
@ -4867,7 +4867,7 @@ msgstr "نام سایت (فقط زیرپوشه):"
msgid "There doesn't seem to be a %s file. It is needed before the installation can continue."
msgstr "به نظر می رسد که پروندهٔ %s وجود نداشته باشد. این مورد پیش از ادامهٔ نصب لازم است."
#: wp-includes/user.php:5220
#: wp-includes/user.php:5230
msgid "The date and time the preferences were updated."
msgstr "تاریخ و زمان اولویت‌ها به‌روزرسانی شد."
@ -7351,7 +7351,7 @@ msgid "A widget containing a block."
msgstr "یک ابزارک حاوی یک بلوک."
#. translators: 1 & 2: Deprecation replacement options.
#: wp-includes/user.php:4376 wp-includes/user.php:4616
#: wp-includes/user.php:4386 wp-includes/user.php:4626
msgid "%1$s or %2$s"
msgstr "%1$s یا %2$s"
@ -8221,29 +8221,29 @@ msgstr "دربارهٔ عیب‌یابی در وردپرس بیشتر بدانی
msgid "https://wordpress.org/documentation/article/faq-troubleshooting/"
msgstr "https://wordpress.org/documentation/article/faq-troubleshooting/"
#: wp-includes/user.php:5091
#: wp-includes/user.php:5101
msgid "The confirmation key has expired for this personal data request."
msgstr "کلید تأییدیه برای این درخواست دادهٔ شخصی منقضی شده است."
#: wp-includes/user.php:5087
#: wp-includes/user.php:5097
msgid "The confirmation key is invalid for this personal data request."
msgstr "کلید تأییدیه برای این درخواست دادهٔ شخصی نامعتبر است."
#: wp-includes/user.php:5073
#: wp-includes/user.php:5083
msgid "The confirmation key is missing from this personal data request."
msgstr "کلید تأییدیه برای این درخواست دادهٔ شخصی گم شده است."
#: wp-includes/user.php:5069
#: wp-includes/user.php:5079
msgid "This personal data request has expired."
msgstr "این درخواست داده شخصی منقضی شده است."
#: wp-includes/user.php:4877 wp-includes/user.php:5065
#: wp-includes/user.php:4887 wp-includes/user.php:5075
#: wp-admin/includes/privacy-tools.php:23
#: wp-admin/includes/privacy-tools.php:52
msgid "Invalid personal data request."
msgstr "درخواست داده شخصی نامعتبر است."
#: wp-includes/user.php:4788
#: wp-includes/user.php:4798
msgid "Invalid request status."
msgstr "وضعیت درخواست نامعتبر."
@ -8898,7 +8898,7 @@ msgstr "سایت"
msgid "Crop"
msgstr "برش"
#: wp-includes/class-wp-script-modules.php:1137 wp-includes/js/dist/a11y.js:82
#: wp-includes/class-wp-script-modules.php:1138 wp-includes/js/dist/a11y.js:82
msgid "Notifications"
msgstr "آگاه‌سازی‌ها"
@ -9761,6 +9761,7 @@ msgstr "نام‌نویسی کامل شد. لطفا ایمیل خود را بر
msgid "Check your email for the confirmation link, then visit the <a href=\"%s\">login page</a>."
msgstr "ایمیل خود را برای پیوند تاییدیه بررسی نمایید، سپس از <a href=\"%s\">برگه ورود</a> بازدید نمایید."
#: wp-includes/blocks/latest-comments.php:124
#: wp-includes/comment-template.php:664 wp-includes/js/dist/editor.js:10356
#: wp-includes/js/dist/editor.js:46234 wp-includes/js/dist/editor.js:48376
#: wp-admin/includes/meta-boxes.php:183 wp-admin/includes/meta-boxes.php:217
@ -9841,56 +9842,56 @@ msgstr "ماه‌های قبلی و بعدی"
msgid "When registering an \"array\" setting to show in the REST API, you must specify the schema for each array item in \"show_in_rest.schema.items\"."
msgstr "When registering an \"array\" setting to show in the REST API, you must specify the schema for each array item in \"show_in_rest.schema.items\"."
#: wp-includes/user.php:4195
#: wp-includes/user.php:4205
msgid "User&#8217;s Session Tokens data."
msgstr "داده توکن‌های نشست کاربر."
#: wp-includes/user.php:4194
#: wp-includes/user.php:4204
msgid "Session Tokens"
msgstr "توکن‌های نشست"
#: wp-includes/user.php:4173
#: wp-includes/user.php:4183
msgid "Last Login"
msgstr "آخرین ورود"
#: wp-includes/user.php:4172
#: wp-includes/user.php:4182
msgid "User Agent"
msgstr "نقش کاربر"
#: wp-includes/user.php:4170
#: wp-includes/user.php:4180
msgid "Expiration"
msgstr "انقضا"
#: wp-includes/user.php:4160
#: wp-includes/user.php:4170
msgid "User&#8217;s location data used for the Community Events in the WordPress Events and News dashboard widget."
msgstr "داده‌های موقعیت مکانی کاربر برای رویدادهای انجمن در ابزارک‌های رویدادهای وردپرس و اخبار پیش‌خوان استفاده می‌شود."
#: wp-includes/user.php:4159
#: wp-includes/user.php:4169
msgid "Community Events Location"
msgstr "مکان رویدادهای اجتماعی"
#: wp-includes/user.php:4143 wp-includes/user.php:4171
#: wp-includes/user.php:4153 wp-includes/user.php:4181
msgid "IP"
msgstr "IP"
#: wp-includes/user.php:4142
#: wp-includes/user.php:4152
msgid "Longitude"
msgstr "طول جغرافیایی"
#: wp-includes/user.php:4141
#: wp-includes/user.php:4151
msgid "Latitude"
msgstr "عرض جغرافیایی"
#: wp-includes/user.php:4140
#: wp-includes/user.php:4150
msgid "Country"
msgstr "کشور"
#: wp-includes/user.php:4139
#: wp-includes/user.php:4149
msgid "City"
msgstr "شهر"
#. translators: %s: wp_privacy_additional_user_profile_data
#: wp-includes/user.php:4115
#: wp-includes/user.php:4125
msgid "Filter %s returned items with reserved names."
msgstr "Filter %s returned items with reserved names."
@ -10152,7 +10153,7 @@ msgstr "یک خطای بحرانی در این وب سایت وجود داشته
msgid "The image cannot be rotated because the embedded meta data cannot be updated."
msgstr "تصویر نمی‌تواند بچرخد زیرا فراداده‌ جا سازی‌شده نمی‌تواند به روز رسانی شود."
#: wp-includes/user.php:4130
#: wp-includes/user.php:4140
msgid "User&#8217;s profile data."
msgstr "داده‌های شناسنامهٔ کاربر."
@ -10535,7 +10536,7 @@ msgid "[%s] Admin Email Changed"
msgstr "[%s] ایمیل مدیر تغییر کرد"
#. translators: New email address notification email subject. %s: Site title.
#: wp-includes/user.php:3942
#: wp-includes/user.php:3952
msgid "[%s] Email Change Request"
msgstr "[%s] درخواست تغییر ایمیل"
@ -10646,7 +10647,7 @@ msgstr "مدیر کل"
msgid "Select Site Icon"
msgstr "انتخاب آیکون سایت"
#: wp-includes/user.php:4809
#: wp-includes/user.php:4819
msgid "An incomplete personal data request for this email address already exists."
msgstr "در حال حاضر یک درخواست داده شخصی کامل نشده برای این نشانی ایمیل وجود دارد."
@ -11268,7 +11269,7 @@ msgstr "Block type names must not contain uppercase characters."
msgid "Block type names must be strings."
msgstr "Block type names must be strings."
#: wp-includes/blocks/latest-comments.php:153
#: wp-includes/blocks/latest-comments.php:156
msgid "No comments to show."
msgstr "دیدگاهی برای نمایش وجود ندارد."
@ -11287,13 +11288,13 @@ msgstr "بایگانی برای نمایش وجود ندارد."
msgid "The offset number requested is larger than or equal to the number of available revisions."
msgstr "شماره درخواستی بزرگتر یا برابر با شماره رونوشت‌های موجود است."
#: wp-includes/user.php:5015
#: wp-includes/user.php:5025
msgid "Unable to send personal data export confirmation email."
msgstr "امکان ارسال ایمیل تاییدیه اطلاعات شخصی وجود ندارد."
#. translators: Privacy data request confirmed notification email subject. 1:
#. Site title, 2: Name of the confirmed action.
#: wp-includes/user.php:4294
#: wp-includes/user.php:4304
msgid "[%1$s] Action Confirmed: %2$s"
msgstr "[%1$s] اقدام تأیید شد: %2$s"
@ -11330,25 +11331,25 @@ msgstr "شما از سهمیه فضای سایتتان استفاده کرده
msgid "Not enough space to upload. %s KB needed."
msgstr "فضای کافی برای بارگذاری وجود ندارد. %s کیلوبایت نیاز دارید."
#: wp-includes/user.php:4741
#: wp-includes/user.php:4751
msgid "The site administrator has been notified. You will receive an email confirmation when they erase your data."
msgstr "مدیریت سایت با خبر شده است. تاییدیه حذف اطلاعات شما از سوی آن‌ها از طریق ایمیل به اطلاع شما خواهد رسید."
#: wp-includes/user.php:4740
#: wp-includes/user.php:4750
msgid "Thanks for confirming your erasure request."
msgstr "با تشکر از تایید درخواست حذف شما."
#: wp-includes/user.php:4738
#: wp-includes/user.php:4748
msgid "The site administrator has been notified. You will receive a link to download your export via email when they fulfill your request."
msgstr "مدیر سایت آگاه شد. هنگامیکه درخواست شما انجام شد، پیوندی جهت دریافت خروجی‌تان از طریق ایمیل دریافت می‌کنید."
#: wp-includes/user.php:4737
#: wp-includes/user.php:4747
msgid "Thanks for confirming your export request."
msgstr "با تشکر از تایید درخواست استخراج شما."
#. translators: Do not translate SITENAME, SITEURL, PRIVACY_POLICY_URL; those
#. are placeholders.
#: wp-includes/user.php:4565
#: wp-includes/user.php:4575
msgid ""
"Howdy,\n"
"\n"
@ -11376,7 +11377,7 @@ msgstr ""
"###SITEURL###"
#. translators: Do not translate SITENAME, SITEURL; those are placeholders.
#: wp-includes/user.php:4551
#: wp-includes/user.php:4561
msgid ""
"Howdy,\n"
"\n"
@ -11400,13 +11401,13 @@ msgstr ""
#. translators: Erasure request fulfilled notification email subject. %s: Site
#. title.
#: wp-includes/user.php:4498
#: wp-includes/user.php:4508
msgid "[%s] Erasure Request Fulfilled"
msgstr "درخواست حذف در [%s] انجام شد"
#. translators: Do not translate SITENAME, USER_EMAIL, DESCRIPTION, MANAGE_URL,
#. SITEURL; those are placeholders.
#: wp-includes/user.php:4321
#: wp-includes/user.php:4331
msgid ""
"Howdy,\n"
"\n"
@ -11440,11 +11441,11 @@ msgstr ""
#. translators: Confirm privacy data request notification email subject. 1:
#. Site title, 2: Name of the action.
#: wp-includes/user.php:4911
#: wp-includes/user.php:4921
msgid "[%1$s] Confirm Action: %2$s"
msgstr "[%1$s] تایید نمودن عملیات %2$s"
#: wp-includes/user.php:4843 wp-admin/erase-personal-data.php:17
#: wp-includes/user.php:4853 wp-admin/erase-personal-data.php:17
#: wp-admin/erase-personal-data.php:107 wp-admin/menu.php:397
msgid "Erase Personal Data"
msgstr "پاک‌سازی اطلاعات شخصی"
@ -11453,51 +11454,51 @@ msgstr "پاک‌سازی اطلاعات شخصی"
msgid "Save my name, email, and website in this browser for the next time I comment."
msgstr "ذخیره نام، ایمیل و وبسایت من در مرورگر برای زمانی که دوباره دیدگاهی می‌نویسم."
#: wp-includes/user.php:4047
#: wp-includes/user.php:4057
msgid "User Description"
msgstr "توضیح کاربر"
#: wp-includes/user.php:4046
#: wp-includes/user.php:4056
msgid "User Last Name"
msgstr "نام خانوادگی کاربر"
#: wp-includes/user.php:4045
#: wp-includes/user.php:4055
msgid "User First Name"
msgstr "نام "
#: wp-includes/user.php:4044
#: wp-includes/user.php:4054
msgid "User Nickname"
msgstr "نام مستعار"
#: wp-includes/user.php:4043
#: wp-includes/user.php:4053
msgid "User Display Name"
msgstr "نام نمایشی کاربر"
#: wp-includes/user.php:4042
#: wp-includes/user.php:4052
msgid "User Registration Date"
msgstr "تاریخ نام‌نویسی کاربر"
#: wp-includes/user.php:4041
#: wp-includes/user.php:4051
msgid "User URL"
msgstr "نشانی اینترنتی کاربر"
#: wp-includes/user.php:4040
#: wp-includes/user.php:4050
msgid "User Email"
msgstr "ایمیل کاربر"
#: wp-includes/user.php:4039
#: wp-includes/user.php:4049
msgid "User Nice Name"
msgstr "نام کاربر"
#: wp-includes/user.php:4038
#: wp-includes/user.php:4048
msgid "User Login Name"
msgstr "نام ورود کاربر"
#: wp-includes/user.php:4037
#: wp-includes/user.php:4047
msgid "User ID"
msgstr "شناسهٔ کاربر"
#: wp-includes/user.php:3998
#: wp-includes/user.php:4008
msgid "WordPress User"
msgstr "کاربر وردپرس"
@ -11515,20 +11516,20 @@ msgid "User action confirmed."
msgstr "اقدام کاربر تایید شده است."
#. translators: %s: Action name.
#: wp-includes/user.php:4847
#: wp-includes/user.php:4857
msgid "Confirm the \"%s\" action"
msgstr "تأیید عملیات \"%s\""
#: wp-includes/user.php:4840 wp-admin/export-personal-data.php:17
#: wp-includes/user.php:4850 wp-admin/export-personal-data.php:17
#: wp-admin/export-personal-data.php:107 wp-admin/menu.php:396
msgid "Export Personal Data"
msgstr "برون‌بری دادهٔ شخصی"
#: wp-includes/user.php:4784
#: wp-includes/user.php:4794
msgid "Invalid action name."
msgstr "نام عملیات معتبر نیست."
#: wp-includes/user.php:4733
#: wp-includes/user.php:4743
msgid "The site administrator has been notified and will fulfill your request as soon as possible."
msgstr "مدیر سایت مطلع شده است و درخواست شما را در اسرع وقت انجام خواهد داد."
@ -11555,13 +11556,13 @@ msgstr "[حذف شده]"
msgid "Comment %d contains personal data but could not be anonymized."
msgstr "دیدگاه %d حاوی اطلاعات شخصی است اما نمی‌تواند ناشناس باشد."
#: wp-includes/user.php:4732
#: wp-includes/user.php:4742
msgid "Action has been confirmed."
msgstr "عملیات تأیید شده است."
#. translators: Do not translate DESCRIPTION, CONFIRM_URL, SITENAME, SITEURL:
#. those are placeholders.
#: wp-includes/user.php:4934
#: wp-includes/user.php:4944
msgid ""
"Howdy,\n"
"\n"
@ -11944,13 +11945,13 @@ msgid "Use the Custom HTML widget to add arbitrary HTML code to your widget area
msgstr "از ابزارک HTML سفارشی برای افزودن کد HTML دلخواه به ناحیه‌های ابزارکتان استفاده نمایید."
#. translators: %s: New email address.
#: wp-includes/user.php:3965
#: wp-includes/user.php:3975
msgid "Your email address has not been updated yet. Please check your inbox at %s for a confirmation email."
msgstr "آدرس ایمیل شما هنوز به‌روزرسانی نشده است. لطفا صندوق ورودی خود در %s را برای ایمیل تایید، بررسی نمایید."
#. translators: Do not translate USERNAME, ADMIN_URL, EMAIL, SITENAME, SITEURL:
#. those are placeholders.
#: wp-includes/user.php:3893
#: wp-includes/user.php:3903
msgid ""
"Howdy ###USERNAME###,\n"
"\n"
@ -11984,7 +11985,7 @@ msgstr ""
"###SITENAME###\n"
"###SITEURL###"
#: wp-includes/user.php:3873
#: wp-includes/user.php:3882
msgid "<strong>Error:</strong> The email address is already used."
msgstr "<strong>خطا:</strong> آدرس ایمیل در حال حاضر استفاده شده است."
@ -13473,7 +13474,7 @@ msgstr "نامک نامعتبر."
#: wp-includes/rest-api.php:2300
#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:780
#: wp-includes/user.php:4780 wp-admin/network/site-new.php:100
#: wp-includes/user.php:4790 wp-admin/network/site-new.php:100
msgid "Invalid email address."
msgstr "نشانی ایمیل نامعتبر است."
@ -13559,7 +13560,7 @@ msgstr "با عرض پوزش، شما اجازهٔ تغییر نوع دیدگا
#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:1284
#: wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php:1298
#: wp-admin/includes/ms.php:1184 wp-admin/includes/user.php:62
#: wp-admin/includes/ms.php:1184 wp-admin/includes/user.php:64
#: wp-admin/users.php:131 wp-admin/network/site-users.php:156
msgid "Sorry, you are not allowed to give users that role."
msgstr "با عرض پوزش، شما اجازهٔ اختصاص دادن آن نقش به کاربران را ندارید."
@ -15560,7 +15561,7 @@ msgstr "برای ویرایش این مورد از شیفت-کلیک استفا
msgid "Comment Submission Failure"
msgstr "خطا در ارسال دیدگاه"
#: wp-includes/user.php:3555 wp-admin/includes/user.php:202
#: wp-includes/user.php:3555 wp-admin/includes/user.php:207
msgid "<strong>Error:</strong> Sorry, that username is not allowed."
msgstr "<strong>خطا:</strong> با عرض پوزش، این شناسه مجاز نیست."
@ -15725,7 +15726,7 @@ msgid "The menu name %s conflicts with another menu name. Please try another."
msgstr "نام فهرست %s با نام فهرستی دیگر تداخل دارد. لطفاً نامی دیگر برگزینید."
#. translators: %s: Site address.
#: wp-signup.php:1035
#: wp-signup.php:1039
msgid "The site you were looking for, %s, does not exist."
msgstr "سایت %s که دنبالش هستید، وجود ندارد."
@ -18704,7 +18705,7 @@ msgid "(more&hellip;)"
msgstr "(بیشتر&hellip;)"
#. translators: %s: Site address.
#: wp-signup.php:1029
#: wp-signup.php:1033
msgid "The site you were looking for, %s, does not exist, but you can create it now!"
msgstr "سایتی که به دنبالش می‌گشتید، %s وجود ندارد، اما می‌توانید همین حالا آن را ایجاد نمایید!"
@ -19064,7 +19065,7 @@ msgstr "پیوند به"
msgid "Update gallery"
msgstr "به‌روزرسانی گالری"
#: wp-includes/user.php:3550 wp-admin/includes/user.php:195
#: wp-includes/user.php:3550 wp-admin/includes/user.php:200
msgid "<strong>Error:</strong> This username is already registered. Please choose another one."
msgstr "<strong>خطا:</strong> نام کاربری پیش‌تر ثبت شده، شناسهٔ دیگری انتخاب نمایید."
@ -19582,7 +19583,7 @@ msgstr "ویرایش سایت"
#: wp-includes/post.php:5724 wp-admin/includes/ajax-actions.php:124
#: wp-admin/includes/meta-boxes.php:583 wp-admin/includes/post.php:578
#: wp-admin/includes/post.php:2265 wp-admin/js/inline-edit-post.js:412
#: wp-admin/includes/post.php:2265 wp-admin/js/inline-edit-post.js:417
#: wp-admin/js/tags-box.js:9 wp-admin/js/tags-suggest.js:8
msgctxt "tag delimiter"
msgid ","
@ -20256,7 +20257,7 @@ msgstr "جستجو در دسته‌های پیوند"
msgid "Link Category"
msgstr "دستهٔ پیوند"
#: wp-includes/abilities.php:29 wp-includes/user.php:4129
#: wp-includes/abilities.php:29 wp-includes/user.php:4139
#: wp-includes/js/dist/block-editor.js:28549
#: wp-includes/js/dist/block-library.js:6320
#: wp-includes/js/dist/block-library.js:6418
@ -20363,7 +20364,7 @@ msgctxt "taxonomy general name"
msgid "Categories"
msgstr "دسته‌ها"
#: wp-signup.php:1018
#: wp-signup.php:1022
msgid "Sorry, new registrations are not allowed at this time."
msgstr "با عرض پوزش، نام‌نویسی‌های جدید هم‌اکنون غیر فعال شده است."
@ -20420,7 +20421,7 @@ msgctxt "post type general name"
msgid "Posts"
msgstr "نوشته‌ها"
#: wp-includes/user.php:3547 wp-admin/includes/user.php:191
#: wp-includes/user.php:3547 wp-admin/includes/user.php:196
msgid "<strong>Error:</strong> This username is invalid because it uses illegal characters. Please enter a valid username."
msgstr "<strong>خطا:</strong> شناسه نادرست است زیرا از حروف غیرمعتبر استفاده شده است. یک شناسه درست بنویسید."
@ -20609,7 +20610,7 @@ msgid_plural "Completed <span class=\"count\">(%s)</span>"
msgstr[0] "کامل شده <span class=\"count\">(%s)</span>"
msgstr[1] ""
#: wp-signup.php:1020
#: wp-signup.php:1024
msgid "You are logged in already. No need to register again!"
msgstr "شما در حال حاضر وارد شده‌اید. نیازی به نام‌نویسی مجدد نیست!"
@ -20690,7 +20691,7 @@ msgstr[1] ""
msgid "%d WordPress Update"
msgstr "%d به‌روزرسانی وردپرس"
#: wp-signup.php:998
#: wp-signup.php:998 wp-signup.php:1005
msgid "Site registration has been disabled."
msgstr "ثبت سایت جدید غیر فعال شده است."
@ -21093,8 +21094,8 @@ msgstr "دریافت رمز تازه"
msgid "Lost Password"
msgstr "رمز فراموش شده"
#: wp-includes/user.php:3563 wp-includes/user.php:3861
#: wp-admin/includes/user.php:209
#: wp-includes/user.php:3563 wp-includes/user.php:3869
#: wp-admin/includes/user.php:87 wp-admin/includes/user.php:214
msgid "<strong>Error:</strong> The email address is not correct."
msgstr "<strong>خطا:</strong> نشانی ایمیل نادرست است."
@ -22914,7 +22915,7 @@ msgstr "پیشخوان"
msgid "There are no options for this widget."
msgstr "گزینه‌ای برای این ابزارک یافت نشد."
#: wp-includes/user.php:3545 wp-admin/includes/user.php:152
#: wp-includes/user.php:3545 wp-admin/includes/user.php:157
msgid "<strong>Error:</strong> Please enter a username."
msgstr "<strong>خطا:</strong> لطفاً یک نام کاربری وارد نمایید."

View File

@ -0,0 +1,12 @@
<?php get_header(); ?>
<section style="min-height:100vh;display:flex;align-items:center;justify-content:center;padding-top:72px;">
<div style="text-align:center;">
<h1 style="font-size:6rem;font-weight:900;color:var(--primary);">۴۰۴</h1>
<h2 style="font-size:1.5rem;margin-bottom:12px;">صفحه مورد نظر یافت نشد</h2>
<p style="color:var(--gray-500);margin-bottom:24px;">ممکن است آدرس اشتباه باشد یا صفحه حذف شده باشد.</p>
<a href="<?php echo esc_url(home_url('/')); ?>" class="btn btn-primary btn-lg">بازگشت به صفحه اصلی</a>
</div>
</section>
<?php get_footer(); ?>

View File

@ -0,0 +1,100 @@
/**
* IFNEX Logistics - Main JavaScript
*/
(function() {
'use strict';
// ─── Header Scroll Effect ───
const header = document.getElementById('site-header');
const scrollTop = document.getElementById('scroll-top');
function updateHeader() {
if (window.scrollY > 50) {
header.classList.add('scrolled');
} else {
header.classList.remove('scrolled');
}
if (window.scrollY > 400) {
scrollTop.classList.add('visible');
} else {
scrollTop.classList.remove('visible');
}
}
window.addEventListener('scroll', updateHeader, { passive: true });
updateHeader();
if (scrollTop) {
scrollTop.addEventListener('click', function() {
window.scrollTo({ top: 0, behavior: 'smooth' });
});
}
// ─── Mobile Menu ───
const hamburger = document.getElementById('hamburger');
const drawer = document.getElementById('mobile-drawer');
if (hamburger && drawer) {
hamburger.addEventListener('click', function() {
const isOpen = hamburger.classList.toggle('open');
drawer.classList.toggle('open');
hamburger.setAttribute('aria-expanded', isOpen);
drawer.setAttribute('aria-hidden', !isOpen);
document.body.style.overflow = isOpen ? 'hidden' : '';
});
drawer.querySelectorAll('a').forEach(link => {
link.addEventListener('click', () => {
hamburger.classList.remove('open');
drawer.classList.remove('open');
hamburger.setAttribute('aria-expanded', 'false');
drawer.setAttribute('aria-hidden', 'true');
document.body.style.overflow = '';
});
});
// بستن با ESC
document.addEventListener('keydown', (e) => {
if (e.key === 'Escape' && drawer.classList.contains('open')) {
hamburger.click();
}
});
}
// ─── Scroll Reveal ───
const revealElements = document.querySelectorAll('.reveal');
if ('IntersectionObserver' in window) {
const revealObserver = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
entry.target.classList.add('visible');
revealObserver.unobserve(entry.target);
}
});
}, { threshold: 0.1, rootMargin: '0px 0px -50px 0px' });
revealElements.forEach(el => revealObserver.observe(el));
} else {
// Fallback برای مرورگرهای قدیمی
revealElements.forEach(el => el.classList.add('visible'));
}
// ─── Smooth Scroll ───
document.querySelectorAll('a[href^="#"]').forEach(anchor => {
anchor.addEventListener('click', function(e) {
const href = this.getAttribute('href');
if (href === '#') return;
const target = document.querySelector(href);
if (target) {
e.preventDefault();
const headerHeight = header ? header.offsetHeight : 72;
const targetPosition = target.getBoundingClientRect().top + window.scrollY - headerHeight;
window.scrollTo({ top: targetPosition, behavior: 'smooth' });
}
});
});
})();

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 MiB

View File

@ -0,0 +1,664 @@
<!doctype html>
<html lang="fa" dir="rtl">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>IFNEX Logistics - ارسال مرسوله به سراسر جهان</title>
<meta name="description" content="خدمات لجستیک بین‌المللی IFNEX - ارسال سریع، امن و قابل اعتماد به سراسر دنیا" />
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link rel="stylesheet" href="./style.css" />
</head>
<body>
<!-- ════════════════════════════════════════════════
HEADER / NAVIGATION
════════════════════════════════════════════════ -->
<header class="site-header" role="banner">
<div class="container">
<div class="header-inner">
<!-- Logo -->
<a href="#" class="logo" aria-label="IFNEX Logistics">
<div class="logo-icon">
<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
<path d="M20 8h-3V4H3c-1.1 0-2 .9-2 2v11h2c0 1.66 1.34 3 3 3s3-1.34 3-3h6c0 1.66 1.34 3 3 3s3-1.34 3-3h2v-5l-3-4zM6 18.5c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zm13.5-9l1.96 2.5H17V9.5h2.5zm-1.5 9c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5z"/>
</svg>
</div>
<div class="logo-text">
<span class="logo-name">IF<span>NEX</span></span>
<span class="logo-tagline">Global Logistics</span>
</div>
</a>
<!-- Main Nav -->
<nav class="main-nav" aria-label="Main navigation">
<ul class="nav-list">
<li><a href="#hero" class="active">خانه</a></li>
<li><a href="#services">خدمات</a></li>
<li><a href="#tracking">ردیابی مرسوله</a></li>
<li><a href="#how-it-works">نحوه کار</a></li>
<li><a href="#contact">تماس با ما</a></li>
</ul>
</nav>
<!-- Actions -->
<div class="header-actions">
<a href="#" class="btn btn-secondary">ورود مشتریان</a>
<a href="#" class="btn btn-primary">سفارش جدید</a>
</div>
<!-- Hamburger -->
<button class="hamburger" aria-label="Toggle menu" aria-expanded="false">
<span></span>
<span></span>
<span></span>
</button>
</div>
</div>
</header>
<!-- Mobile Drawer -->
<nav class="mobile-drawer" aria-label="Mobile navigation">
<a href="#hero">خانه</a>
<a href="#services">خدمات</a>
<a href="#tracking">ردیابی مرسوله</a>
<a href="#how-it-works">نحوه کار</a>
<a href="#contact">تماس با ما</a>
<div class="mobile-drawer-actions">
<a href="#" class="btn btn-secondary" style="text-align:center;justify-content:center;">ورود مشتریان</a>
<a href="#" class="btn btn-primary" style="text-align:center;justify-content:center;">سفارش جدید</a>
</div>
</nav>
<!-- ════════════════════════════════════════════════
HERO SECTION
════════════════════════════════════════════════ -->
<section class="hero" id="hero">
<div class="hero-bg-grid"></div>
<div class="hero-bg-dots"></div>
<div class="hero-content">
<div class="container">
<div class="hero-layout">
<!-- Left: Text -->
<div class="hero-text hero-text-anim">
<div class="hero-badge">
<span class="hero-badge-dot"></span>
آنلاین و فعال · خدمات ۲۴/۷
</div>
<h1 class="hero-heading">
ارسال مرسوله
<span>به سراسر جهان</span>
</h1>
<p class="hero-subheading">
سریع، امن و قابل اعتماد &mdash; از ایران به هر نقطه از دنیا<br>
<em style="font-size:.95em;opacity:.85">Fast, Secure &amp; Reliable Global Shipping</em>
</p>
<div style="display:flex;gap:12px;flex-wrap:wrap;">
<a href="#tracking" class="btn btn-white btn-lg">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" width="18" height="18"><circle cx="11" cy="11" r="8"/><path d="m21 21-4.35-4.35"/></svg>
ردیابی مرسوله
</a>
<a href="#" class="btn btn-outline-white btn-lg">شروع ارسال</a>
</div>
<div class="hero-trust">
<div class="trust-item">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></svg>
بیش از ۵۰۰ کسب‌وکار فعال
</div>
<div class="trust-item">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></svg>
پشتیبانی ۲۴ ساعته
</div>
<div class="trust-item">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></svg>
بیمه کامل مرسولات
</div>
</div>
</div>
<!-- Right: Tracking Card -->
<div class="hero-card hero-card-anim" id="tracking">
<p class="hero-card-title">ردیابی مرسوله</p>
<p class="hero-card-subtitle">شماره AWB یا بارنامه خود را وارد کنید</p>
<form class="tracking-form" id="trackingForm" novalidate>
<div class="tracking-input-wrap">
<input
class="tracking-input"
id="awbInput"
type="text"
placeholder="مثال: IFNEX-2026-001234"
autocomplete="off"
spellcheck="false"
/>
<span class="tracking-input-icon">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 10c0 7-9 13-9 13s-9-6-9-13a9 9 0 0 1 18 0z"/><circle cx="12" cy="10" r="3"/></svg>
</span>
</div>
<button type="submit" class="btn btn-primary tracking-btn">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" width="18" height="18"><circle cx="11" cy="11" r="8"/><path d="m21 21-4.35-4.35"/></svg>
ردیابی مرسوله
</button>
</form>
<div class="divider-row">یا</div>
<div style="display:flex;flex-direction:column;gap:10px;">
<a href="#" class="btn btn-primary" style="justify-content:center;">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" width="18" height="18"><path d="M12 5v14M5 12l7 7 7-7"/></svg>
ثبت سفارش جدید
</a>
<a href="#" class="btn btn-secondary" style="justify-content:center;">محاسبه هزینه ارسال</a>
</div>
<!-- Plugin zone (shown on WordPress with logged-in user) -->
<div class="plugin-zone">
<div class="plugin-zone-label">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" width="14" height="14"><rect x="3" y="3" width="18" height="18" rx="2"/><path d="M9 9h6M9 12h6M9 15h4"/></svg>
WordPress Shortcode
</div>
موجودی کیف پول:
<code>[ifnex_wallet_balance]</code>
</div>
<div class="hero-card-stats">
<div class="h-stat">
<span class="h-stat-num">+۱۵۰</span>
<span class="h-stat-label">کشور مقصد</span>
</div>
<div class="h-stat">
<span class="h-stat-num">+۵۰۰</span>
<span class="h-stat-label">مشتری فعال</span>
</div>
<div class="h-stat">
<span class="h-stat-num">۹۸٪</span>
<span class="h-stat-label">رضایتمندی</span>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Wave divider -->
<div class="hero-wave">
<svg viewBox="0 0 1440 72" fill="none" xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="none">
<path d="M0 72L60 60C120 48 240 24 360 18C480 12 600 24 720 30C840 36 960 36 1080 30C1200 24 1320 12 1380 6L1440 0V72H0Z" fill="#f3f4f6"/>
</svg>
</div>
</section>
<!-- ════════════════════════════════════════════════
SERVICES SECTION
════════════════════════════════════════════════ -->
<section class="services" id="services">
<div class="container">
<div class="section-head center">
<span class="section-label">خدمات ما</span>
<h2 class="section-title">راه‌حل‌های <span>جامع لجستیک</span></h2>
<p class="section-desc">از ارسال بین‌المللی تا ردیابی لحظه‌ای — همه چیز در یک پلتفرم یکپارچه</p>
<span class="section-line"></span>
</div>
<div class="services-grid">
<!-- Card 1 -->
<div class="service-card reveal reveal-d1">
<div class="service-icon">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<circle cx="12" cy="12" r="10"/>
<line x1="2" y1="12" x2="22" y2="12"/>
<path d="M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z"/>
</svg>
</div>
<h3 class="service-title">ارسال بین‌المللی (صادرات)</h3>
<p class="service-desc">ارسال مرسولات تجاری و شخصی به بیش از ۱۵۰ کشور جهان با سریع‌ترین مسیرهای هوایی و زمینی.</p>
<a href="#" class="service-link">
بیشتر بدانید
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="M5 12h14M12 5l7 7-7 7"/></svg>
</a>
</div>
<!-- Card 2 -->
<div class="service-card reveal reveal-d2">
<div class="service-icon">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<rect x="1" y="3" width="15" height="13"/>
<polygon points="16 8 20 8 23 11 23 16 16 16 16 8"/>
<circle cx="5.5" cy="18.5" r="2.5"/>
<circle cx="18.5" cy="18.5" r="2.5"/>
</svg>
</div>
<h3 class="service-title">ارسال داخلی (واردات)</h3>
<p class="service-desc">دریافت مرسولات از سراسر دنیا و تحویل سریع در ایران با سیستم ردیابی دقیق و بیمه کامل.</p>
<a href="#" class="service-link">
بیشتر بدانید
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="M5 12h14M12 5l7 7-7 7"/></svg>
</a>
</div>
<!-- Card 3 -->
<div class="service-card reveal reveal-d3">
<div class="service-icon">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<circle cx="9" cy="21" r="1"/><circle cx="20" cy="21" r="1"/>
<path d="M1 1h4l2.68 13.39a2 2 0 0 0 2 1.61h9.72a2 2 0 0 0 2-1.61L23 6H6"/>
</svg>
</div>
<h3 class="service-title">سفارش آنلاین</h3>
<p class="service-desc">ثبت سفارش ارسال به صورت آنلاین، پرداخت امن، و پیگیری لحظه‌ای از طریق پنل کاربری اختصاصی.</p>
<a href="#" class="service-link">
بیشتر بدانید
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="M5 12h14M12 5l7 7-7 7"/></svg>
</a>
</div>
<!-- Card 4 -->
<div class="service-card reveal reveal-d4">
<div class="service-icon">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<circle cx="11" cy="11" r="8"/>
<path d="m21 21-4.35-4.35"/>
</svg>
</div>
<h3 class="service-title">ردیابی مرسوله</h3>
<p class="service-desc">ردیابی آنی مرسولات با شماره AWB — از لحظه تحویل تا رسیدن به مقصد، هر گام را ببینید.</p>
<a href="#tracking" class="service-link">
ردیابی کنید
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="M5 12h14M12 5l7 7-7 7"/></svg>
</a>
</div>
</div>
<!-- Tracking shortcode zone -->
<div class="plugin-zone reveal" style="margin-top:32px;">
<div class="plugin-zone-label">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" width="14" height="14"><rect x="3" y="3" width="18" height="18" rx="2"/><path d="M9 9h6M9 12h6M9 15h4"/></svg>
WordPress Shortcode — فرم ردیابی
</div>
برای نمایش فرم ردیابی IFNEX در صفحات وردپرس از این شورت‌کد استفاده کنید:
<code>[ifnex_tracking_form]</code>
</div>
</div>
</section>
<!-- ════════════════════════════════════════════════
HOW IT WORKS
════════════════════════════════════════════════ -->
<section class="how-it-works" id="how-it-works">
<div class="container">
<div class="section-head center">
<span class="section-label">نحوه کار</span>
<h2 class="section-title">در <span>چهار گام ساده</span> ارسال کنید</h2>
<p class="section-desc">فرآیند ارسال مرسوله با IFNEX سریع، شفاف و کاملاً آنلاین است</p>
<span class="section-line"></span>
</div>
<div class="steps-grid">
<div class="step-item reveal reveal-d1">
<div class="step-circle">
<span class="step-num">۱</span>
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<path d="M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2"/>
<circle cx="12" cy="7" r="4"/>
</svg>
</div>
<h3 class="step-title">ثبت‌نام رایگان</h3>
<p class="step-desc">حساب کاربری خود را در کمتر از یک دقیقه بسازید و به پنل مدیریت دسترسی پیدا کنید.</p>
</div>
<div class="step-item reveal reveal-d2">
<div class="step-circle">
<span class="step-num">۲</span>
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<path d="M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"/>
<path d="M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z"/>
</svg>
</div>
<h3 class="step-title">ثبت سفارش</h3>
<p class="step-desc">اطلاعات فرستنده، گیرنده و مشخصات بسته را وارد کنید و بهترین سرویس را انتخاب نمایید.</p>
</div>
<div class="step-item reveal reveal-d3">
<div class="step-circle">
<span class="step-num">۳</span>
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<rect x="1" y="4" width="22" height="16" rx="2" ry="2"/>
<line x1="1" y1="10" x2="23" y2="10"/>
</svg>
</div>
<h3 class="step-title">پرداخت آنلاین</h3>
<p class="step-desc">هزینه ارسال را از طریق درگاه امن یا کیف پول IFNEX پرداخت کنید و رسید دریافت نمایید.</p>
</div>
<div class="step-item reveal reveal-d4">
<div class="step-circle">
<span class="step-num">۴</span>
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<circle cx="11" cy="11" r="8"/>
<path d="m21 21-4.35-4.35"/>
</svg>
</div>
<h3 class="step-title">ردیابی آنی</h3>
<p class="step-desc">با شماره AWB اختصاصی، مسیر مرسوله خود را در هر لحظه پیگیری کنید.</p>
</div>
</div>
</div>
</section>
<!-- ════════════════════════════════════════════════
STATS SECTION
════════════════════════════════════════════════ -->
<section class="stats">
<div class="container">
<div class="stats-grid">
<div class="stat-item reveal reveal-d1">
<div class="stat-number">
<span data-count="10" data-suffix="+">۰+</span>
</div>
<div class="stat-label">سال تجربه</div>
<div class="stat-sub">Years of Experience</div>
</div>
<div class="stat-item reveal reveal-d2">
<div class="stat-number">
<span data-count="150" data-suffix="+">۰+</span>
</div>
<div class="stat-label">کشور مقصد</div>
<div class="stat-sub">Countries Served</div>
</div>
<div class="stat-item reveal reveal-d3">
<div class="stat-number">
<span data-count="50000" data-suffix="+">۰+</span>
</div>
<div class="stat-label">مرسوله تحویل‌شده</div>
<div class="stat-sub">Packages Delivered</div>
</div>
<div class="stat-item reveal reveal-d4">
<div class="stat-number">
<span data-count="98" data-suffix="٪">۰٪</span>
</div>
<div class="stat-label">رضایت مشتریان</div>
<div class="stat-sub">Customer Satisfaction</div>
</div>
</div>
</div>
</section>
<!-- ════════════════════════════════════════════════
TESTIMONIALS
════════════════════════════════════════════════ -->
<section class="testimonials" id="about">
<div class="container">
<div class="section-head center">
<span class="section-label">نظر مشتریان</span>
<h2 class="section-title">آنچه <span>مشتریان ما</span> می‌گویند</h2>
<p class="section-desc">بیش از ۵۰۰ کسب‌وکار به IFNEX اعتماد کرده‌اند</p>
<span class="section-line"></span>
</div>
<div class="testimonials-grid">
<div class="testimonial-card reveal reveal-d1">
<div class="testimonial-stars">
<svg viewBox="0 0 24 24"><path d="M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z"/></svg>
<svg viewBox="0 0 24 24"><path d="M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z"/></svg>
<svg viewBox="0 0 24 24"><path d="M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z"/></svg>
<svg viewBox="0 0 24 24"><path d="M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z"/></svg>
<svg viewBox="0 0 24 24"><path d="M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z"/></svg>
</div>
<p class="testimonial-text">"با IFNEX ارسال بین‌المللی کالاهایمان به اروپا خیلی ساده‌تر شد. پنل آنلاین عالی است و پیگیری لحظه‌ای واقعاً کمک می‌کند."</p>
<div class="testimonial-author">
<div class="author-avatar" style="background: linear-gradient(135deg, #f59e0b, #d97706);">م</div>
<div>
<div class="author-name">محمد رضایی</div>
<div class="author-role">مدیر صادرات، شرکت تجاری نیلوفر</div>
</div>
</div>
</div>
<div class="testimonial-card reveal reveal-d2">
<div class="testimonial-stars">
<svg viewBox="0 0 24 24"><path d="M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z"/></svg>
<svg viewBox="0 0 24 24"><path d="M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z"/></svg>
<svg viewBox="0 0 24 24"><path d="M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z"/></svg>
<svg viewBox="0 0 24 24"><path d="M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z"/></svg>
<svg viewBox="0 0 24 24"><path d="M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z"/></svg>
</div>
<p class="testimonial-text">"پشتیبانی IFNEX فوق‌العاده است. هر بار که سوال داشتم سریع جواب گرفتم. قیمت‌ها هم رقابتی هستند."</p>
<div class="testimonial-author">
<div class="author-avatar" style="background: linear-gradient(135deg, #2563eb, #1d4ed8);">س</div>
<div>
<div class="author-name">سارا احمدی</div>
<div class="author-role">کارآفرین، فروشگاه اینترنتی</div>
</div>
</div>
</div>
<div class="testimonial-card reveal reveal-d3">
<div class="testimonial-stars">
<svg viewBox="0 0 24 24"><path d="M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z"/></svg>
<svg viewBox="0 0 24 24"><path d="M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z"/></svg>
<svg viewBox="0 0 24 24"><path d="M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z"/></svg>
<svg viewBox="0 0 24 24"><path d="M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z"/></svg>
<svg viewBox="0 0 24 24" style="opacity:.35"><path d="M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z"/></svg>
</div>
<p class="testimonial-text">"ادغام IFNEX Bridge با وردپرس خیلی راحت بود. سیستم ردیابی و کیف پول به طور خودکار در سایتم نمایش داده می‌شود."</p>
<div class="testimonial-author">
<div class="author-avatar" style="background: linear-gradient(135deg, #059669, #047857);">ع</div>
<div>
<div class="author-name">علی کریمی</div>
<div class="author-role">توسعه‌دهنده وردپرس</div>
</div>
</div>
</div>
</div>
<!-- Client Logos -->
<div class="clients-strip reveal">
<p class="clients-label">مورد اعتماد کسب‌وکارهای برتر</p>
<div class="clients-logos">
<div class="client-logo"><span class="client-logo-text">TradeCo</span></div>
<div class="client-logo"><span class="client-logo-text">NiloofarEx</span></div>
<div class="client-logo"><span class="client-logo-text">ParsShip</span></div>
<div class="client-logo"><span class="client-logo-text">IranTrade</span></div>
<div class="client-logo"><span class="client-logo-text">GlobeCargo</span></div>
</div>
</div>
</div>
</section>
<!-- ════════════════════════════════════════════════
CTA SECTION
════════════════════════════════════════════════ -->
<section class="cta-section" id="contact">
<div class="container">
<div class="cta-inner">
<div>
<h2 class="cta-heading">آماده ارسال مرسوله هستید؟</h2>
<p class="cta-desc">همین امروز با ما تماس بگیرید یا حساب کاربری رایگان بسازید</p>
<div class="cta-buttons">
<a href="#" class="btn btn-white btn-lg">شروع رایگان</a>
<a href="tel:+982100000000" class="btn btn-outline-white btn-lg">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" width="18" height="18"><path d="M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07A19.5 19.5 0 0 1 4.69 12 19.79 19.79 0 0 1 1.61 3.42C1.56 2.32 2.33 1.3 3.42 1.13A2 2 0 0 1 5 1.15l2 .89a2 2 0 0 1 1.09 2.34L7.39 6.5a2 2 0 0 0 .46 1.98l7.67 7.67a2 2 0 0 0 1.98.46l2.12-.7a2 2 0 0 1 2.34 1.09z"/></svg>
تماس با ما
</a>
</div>
</div>
<div class="cta-contact">
<div class="cta-contact-item">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07A19.5 19.5 0 0 1 4.69 12 19.79 19.79 0 0 1 1.61 3.42C1.56 2.32 2.33 1.3 3.42 1.13A2 2 0 0 1 5 1.15l2 .89a2 2 0 0 1 1.09 2.34L7.39 6.5a2 2 0 0 0 .46 1.98l7.67 7.67a2 2 0 0 0 1.98.46l2.12-.7a2 2 0 0 1 2.34 1.09z"/></svg>
+98 21 0000 0000
</div>
<div class="cta-contact-item">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M4 4h16c1.1 0 2 .9 2 2v12c0 1.1-.9 2-2 2H4c-1.1 0-2-.9-2-2V6c0-1.1.9-2 2-2z"/><polyline points="22,6 12,13 2,6"/></svg>
info@ifnex.com
</div>
<div class="cta-contact-item">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 10c0 7-9 13-9 13s-9-6-9-13a9 9 0 0 1 18 0z"/><circle cx="12" cy="10" r="3"/></svg>
تهران، ایران
</div>
</div>
</div>
</div>
</section>
<!-- ════════════════════════════════════════════════
FOOTER
════════════════════════════════════════════════ -->
<footer class="site-footer" role="contentinfo">
<div class="container">
<div class="footer-grid">
<!-- Brand -->
<div class="footer-brand">
<a href="#" class="logo">
<div class="logo-icon">
<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
<path d="M20 8h-3V4H3c-1.1 0-2 .9-2 2v11h2c0 1.66 1.34 3 3 3s3-1.34 3-3h6c0 1.66 1.34 3 3 3s3-1.34 3-3h2v-5l-3-4zM6 18.5c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zm13.5-9l1.96 2.5H17V9.5h2.5zm-1.5 9c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5z"/>
</svg>
</div>
<div class="logo-text">
<span class="logo-name">IF<span>NEX</span></span>
<span class="logo-tagline">Global Logistics</span>
</div>
</a>
<p class="footer-desc">
IFNEX ارائه‌دهنده خدمات لجستیک بین‌المللی با بیش از ۱۰ سال تجربه در ارسال مرسولات تجاری و شخصی به سراسر جهان.
</p>
<div class="footer-social">
<a href="#" class="social-btn" aria-label="Instagram">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="2" y="2" width="20" height="20" rx="5" ry="5"/><path d="M16 11.37A4 4 0 1 1 12.63 8 4 4 0 0 1 16 11.37z"/><line x1="17.5" y1="6.5" x2="17.51" y2="6.5"/></svg>
</a>
<a href="#" class="social-btn" aria-label="Telegram">
<svg viewBox="0 0 24 24" fill="currentColor"><path d="M12 0C5.373 0 0 5.373 0 12s5.373 12 12 12 12-5.373 12-12S18.627 0 12 0zm5.562 8.248-2.04 9.61c-.153.686-.553.854-1.12.53l-3.1-2.284-1.496 1.44c-.165.165-.304.304-.623.304l.223-3.162 5.755-5.197c.25-.222-.054-.346-.387-.124L7.54 14.29l-3.067-.957c-.666-.208-.68-.666.139-.987l11.97-4.616c.555-.2 1.04.135.98.518z"/></svg>
</a>
<a href="#" class="social-btn" aria-label="LinkedIn">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M16 8a6 6 0 0 1 6 6v7h-4v-7a2 2 0 0 0-2-2 2 2 0 0 0-2 2v7h-4v-7a6 6 0 0 1 6-6z"/><rect x="2" y="9" width="4" height="12"/><circle cx="4" cy="4" r="2"/></svg>
</a>
<a href="#" class="social-btn" aria-label="WhatsApp">
<svg viewBox="0 0 24 24" fill="currentColor"><path d="M12.04 2C6.58 2 2.13 6.45 2.13 11.91c0 1.75.46 3.38 1.26 4.79L2.05 22l5.43-1.42c1.36.73 2.9 1.15 4.56 1.15h.01c5.45 0 9.9-4.45 9.9-9.91C21.95 6.45 17.5 2 12.04 2zm4.87 13.56c-.21.59-1.2 1.12-1.67 1.18-.43.06-.97.08-1.56-.1-.36-.11-.82-.26-1.41-.51-2.47-1.07-4.09-3.55-4.21-3.71-.12-.16-.97-1.29-.97-2.46 0-1.17.61-1.75.83-1.98.21-.23.46-.29.61-.29.16 0 .31.01.44.01.14.01.34-.05.53.4.21.48.7 1.72.76 1.85.06.12.1.27.02.43-.08.16-.12.26-.24.4-.12.14-.25.31-.36.42-.12.12-.24.24-.1.47.14.23.62.99 1.33 1.6.92.8 1.69 1.05 1.92 1.17.23.12.37.1.51-.06.14-.16.59-.69.75-.93.16-.24.32-.2.54-.12.22.08 1.4.66 1.64.78.24.12.4.18.46.28.06.1.06.56-.15 1.15z"/></svg>
</a>
</div>
</div>
<!-- Services -->
<div>
<h3 class="footer-col-title">خدمات</h3>
<ul class="footer-links">
<li><a href="#">ارسال بین‌المللی</a></li>
<li><a href="#">ارسال داخلی</a></li>
<li><a href="#">سفارش آنلاین</a></li>
<li><a href="#">ردیابی مرسوله</a></li>
<li><a href="#">محاسبه هزینه</a></li>
<li><a href="#">بیمه مرسولات</a></li>
</ul>
</div>
<!-- Support -->
<div>
<h3 class="footer-col-title">پشتیبانی</h3>
<ul class="footer-links">
<li><a href="#">مرکز راهنمایی</a></li>
<li><a href="#">سوالات متداول</a></li>
<li><a href="#">پیگیری مرسوله</a></li>
<li><a href="#">قوانین و مقررات</a></li>
<li><a href="#">حریم خصوصی</a></li>
<li><a href="#">تماس با ما</a></li>
</ul>
<!-- Newsletter -->
<div class="footer-newsletter">
<p style="font-size:.82rem;color:rgba(255,255,255,.55);margin-bottom:4px;">دریافت اخبار و تخفیفات:</p>
<form class="newsletter-form" id="newsletterForm" novalidate>
<input type="email" class="newsletter-input" placeholder="آدرس ایمیل شما" dir="ltr" />
<button type="submit" class="newsletter-btn">ثبت</button>
</form>
</div>
</div>
<!-- Contact -->
<div>
<h3 class="footer-col-title">تماس با ما</h3>
<ul class="footer-contact-list">
<li class="footer-contact-item">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 10c0 7-9 13-9 13s-9-6-9-13a9 9 0 0 1 18 0z"/><circle cx="12" cy="10" r="3"/></svg>
تهران، خیابان ولیعصر، پلاک ۱۲۳
</li>
<li class="footer-contact-item">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07A19.5 19.5 0 0 1 4.69 12 19.79 19.79 0 0 1 1.61 3.42C1.56 2.32 2.33 1.3 3.42 1.13A2 2 0 0 1 5 1.15l2 .89a2 2 0 0 1 1.09 2.34L7.39 6.5a2 2 0 0 0 .46 1.98l7.67 7.67a2 2 0 0 0 1.98.46l2.12-.7a2 2 0 0 1 2.34 1.09z"/></svg>
+98 21 0000 0000
</li>
<li class="footer-contact-item">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M4 4h16c1.1 0 2 .9 2 2v12c0 1.1-.9 2-2 2H4c-1.1 0-2-.9-2-2V6c0-1.1.9-2 2-2z"/><polyline points="22,6 12,13 2,6"/></svg>
info@ifnex.com
</li>
<li class="footer-contact-item">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><polyline points="12 6 12 12 16 14"/></svg>
ساعات پشتیبانی: ۲۴/۷
</li>
</ul>
<!-- Transactions shortcode -->
<div class="plugin-zone" style="margin-top:20px;">
<div class="plugin-zone-label">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" width="13" height="13"><rect x="3" y="3" width="18" height="18" rx="2"/><path d="M9 9h6M9 12h6M9 15h4"/></svg>
WordPress
</div>
<code>[ifnex_transactions]</code>
</div>
</div>
</div>
<!-- Footer Bottom -->
<div class="footer-bottom">
<span>
&copy; ۲۰۲۶ <a href="#">IFNEX Logistics</a> — تمامی حقوق محفوظ است
</span>
<span>
طراحی شده با &#10084; برای کسب‌وکارهای ایرانی |
<a href="#">IFNEX Bridge Plugin</a>
</span>
</div>
</div>
</footer>
<!-- WordPress plugin badge -->
<div class="wp-badge" title="IFNEX Bridge WordPress Plugin Active">
<span class="wp-badge-dot"></span>
WP Plugin Active
</div>
<!-- Scroll to top -->
<button class="scroll-top" aria-label="Scroll to top">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">
<path d="M18 15l-6-6-6 6"/>
</svg>
</button>
<script src="./script.js"></script>
</body>
</html>

View File

@ -0,0 +1,955 @@
/* IFNEX Logistics - Main Stylesheet */
@import url('https://fonts.googleapis.com/css2?family=Vazirmatn:wght@300;400;500;600;700;800;900&display=swap');
/* ─── Design Tokens ───────────────────────────────── */
:root {
--primary: #f59e0b;
--primary-dark: #d97706;
--primary-light: #fef3c7;
--success: #059669;
--danger: #dc2626;
--info: #2563eb;
--gray-900: #111827;
--gray-800: #1f2937;
--gray-700: #374151;
--gray-600: #4b5563;
--gray-500: #6b7280;
--gray-400: #9ca3af;
--gray-300: #d1d5db;
--gray-200: #e5e7eb;
--gray-100: #f3f4f6;
--white: #ffffff;
--radius-sm: 6px;
--radius-md: 12px;
--radius-lg: 20px;
--shadow-sm: 0 1px 3px rgba(0,0,0,.08), 0 1px 2px rgba(0,0,0,.06);
--shadow-md: 0 4px 16px rgba(0,0,0,.10), 0 2px 6px rgba(0,0,0,.06);
--shadow-lg: 0 10px 40px rgba(0,0,0,.14), 0 4px 12px rgba(0,0,0,.08);
--shadow-amber: 0 8px 32px rgba(245,158,11,.35);
--transition: 0.25s cubic-bezier(.4,0,.2,1);
}
/* ─── Reset & Base ────────────────────────────────── */
*,*::before,*::after { box-sizing: border-box; margin: 0; padding: 0; }
html { scroll-behavior: smooth; direction: rtl; font-size: 16px; }
body {
font-family: 'Vazirmatn', 'IranYekan', Tahoma, sans-serif;
background: var(--white);
color: var(--gray-900);
line-height: 1.6;
overflow-x: hidden;
}
a { text-decoration: none; color: inherit; }
ul,ol { list-style: none; }
img { max-width: 100%; display: block; }
button { cursor: pointer; font-family: inherit; border: none; background: none; }
.container {
max-width: 1200px;
margin: 0 auto;
padding: 0 24px;
}
/* ─── Buttons ─────────────────────────────────────── */
.btn {
display: inline-flex;
align-items: center;
gap: 8px;
padding: 11px 24px;
border-radius: var(--radius-sm);
font-size: 0.9rem;
font-weight: 600;
transition: var(--transition);
white-space: nowrap;
line-height: 1;
border: 1.5px solid transparent;
}
.btn-primary {
background: var(--primary);
color: var(--white);
border-color: var(--primary);
box-shadow: var(--shadow-amber);
}
.btn-primary:hover {
background: var(--primary-dark);
border-color: var(--primary-dark);
transform: translateY(-1px);
box-shadow: 0 10px 36px rgba(245,158,11,.45);
}
.btn-secondary {
background: transparent;
color: var(--gray-700);
border-color: var(--gray-300);
}
.btn-secondary:hover {
border-color: var(--primary);
color: var(--primary-dark);
background: var(--primary-light);
}
.btn-white {
background: var(--white);
color: var(--primary-dark);
font-weight: 700;
border-color: var(--white);
box-shadow: var(--shadow-md);
}
.btn-white:hover {
background: var(--primary-light);
transform: translateY(-1px);
}
.btn-outline-white {
background: transparent;
color: var(--white);
border-color: rgba(255,255,255,.6);
}
.btn-outline-white:hover {
background: rgba(255,255,255,.12);
border-color: var(--white);
}
.btn-lg {
padding: 15px 36px;
font-size: 1rem;
border-radius: var(--radius-md);
}
/* ─── Header ──────────────────────────────────────── */
.site-header {
position: fixed;
top: 0; right: 0; left: 0;
z-index: 1000;
background: rgba(255,255,255,0.92);
backdrop-filter: blur(16px);
-webkit-backdrop-filter: blur(16px);
border-bottom: 1px solid transparent;
transition: box-shadow var(--transition), border-color var(--transition);
}
.site-header.scrolled {
box-shadow: 0 2px 24px rgba(0,0,0,.10);
border-bottom-color: var(--gray-200);
}
.header-inner {
display: flex;
align-items: center;
justify-content: space-between;
height: 72px;
gap: 24px;
}
.logo {
display: flex;
align-items: center;
gap: 10px;
flex-shrink: 0;
}
.logo-icon {
width: 44px;
height: 44px;
background: linear-gradient(135deg, var(--primary) 0%, var(--primary-dark) 100%);
border-radius: 10px;
display: flex;
align-items: center;
justify-content: center;
box-shadow: 0 4px 12px rgba(245,158,11,.4);
}
.logo-icon svg { width: 26px; height: 26px; fill: white; }
.logo-text { display: flex; flex-direction: column; line-height: 1.1; }
.logo-name { font-size: 1.4rem; font-weight: 900; color: var(--gray-900); letter-spacing: -0.5px; }
.logo-name span { color: var(--primary); }
.logo-tagline { font-size: 0.65rem; color: var(--gray-500); font-weight: 500; letter-spacing: 0.5px; }
.main-nav { flex: 1; }
.nav-list {
display: flex;
align-items: center;
gap: 4px;
justify-content: center;
}
.nav-list a {
padding: 7px 14px;
border-radius: var(--radius-sm);
font-size: 0.9rem;
font-weight: 500;
color: var(--gray-700);
transition: var(--transition);
}
.nav-list a:hover, .nav-list a.active {
color: var(--primary-dark);
background: var(--primary-light);
}
.header-actions {
display: flex;
align-items: center;
gap: 10px;
flex-shrink: 0;
}
.hamburger {
display: none;
flex-direction: column;
justify-content: center;
align-items: center;
width: 40px;
height: 40px;
border-radius: var(--radius-sm);
gap: 5px;
background: var(--gray-100);
transition: var(--transition);
}
.hamburger span {
display: block;
width: 22px;
height: 2px;
background: var(--gray-700);
border-radius: 2px;
transition: var(--transition);
}
.hamburger.open span:nth-child(1) { transform: translateY(7px) rotate(45deg); }
.hamburger.open span:nth-child(2) { opacity: 0; transform: scaleX(0); }
.hamburger.open span:nth-child(3) { transform: translateY(-7px) rotate(-45deg); }
/* Mobile Drawer */
.mobile-drawer {
display: none;
position: fixed;
top: 72px; right: 0; left: 0; bottom: 0;
background: var(--white);
z-index: 999;
padding: 24px;
flex-direction: column;
gap: 8px;
transform: translateX(100%);
transition: transform 0.3s cubic-bezier(.4,0,.2,1);
overflow-y: auto;
border-top: 1px solid var(--gray-200);
}
.mobile-drawer.open { transform: translateX(0); }
.mobile-drawer a {
display: block;
padding: 14px 16px;
border-radius: var(--radius-md);
font-size: 1rem;
font-weight: 600;
color: var(--gray-700);
border: 1px solid var(--gray-200);
transition: var(--transition);
}
.mobile-drawer a:hover {
background: var(--primary-light);
border-color: var(--primary);
color: var(--primary-dark);
}
.mobile-drawer-actions {
margin-top: 16px;
display: flex;
gap: 12px;
flex-direction: column;
}
/* ─── Hero ────────────────────────────────────────── */
.hero {
padding-top: 72px;
position: relative;
overflow: hidden;
background: linear-gradient(135deg, #1a0a00 0%, #3d1a00 30%, #7c3100 60%, #d97706 85%, #f59e0b 100%);
min-height: 100vh;
display: flex;
flex-direction: column;
}
.hero-bg-grid {
position: absolute;
inset: 0;
opacity: 0.04;
background-image:
linear-gradient(rgba(255,255,255,.5) 1px, transparent 1px),
linear-gradient(90deg, rgba(255,255,255,.5) 1px, transparent 1px);
background-size: 80px 80px;
}
.hero-bg-dots {
position: absolute;
inset: 0;
opacity: 0.05;
background-image: radial-gradient(circle, rgba(255,255,255,1) 1px, transparent 1px);
background-size: 40px 40px;
}
.hero-content {
position: relative;
z-index: 2;
flex: 1;
display: flex;
align-items: center;
padding: 80px 0 60px;
}
.hero-layout {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 64px;
align-items: center;
}
.hero-badge {
display: inline-flex;
align-items: center;
gap: 8px;
background: rgba(255,255,255,.12);
border: 1px solid rgba(255,255,255,.2);
color: rgba(255,255,255,.9);
font-size: 0.8rem;
font-weight: 600;
padding: 6px 14px;
border-radius: 100px;
margin-bottom: 20px;
backdrop-filter: blur(8px);
}
.hero-badge-dot {
width: 7px;
height: 7px;
background: #4ade80;
border-radius: 50%;
box-shadow: 0 0 8px #4ade80;
animation: pulseGreen 2s infinite;
}
@keyframes pulseGreen {
0%,100% { opacity: 1; transform: scale(1); }
50% { opacity: .7; transform: scale(1.3); }
}
.hero-heading {
font-size: clamp(2rem, 4vw, 3rem);
font-weight: 900;
color: var(--white);
line-height: 1.2;
margin-bottom: 8px;
letter-spacing: -1px;
}
.hero-heading span { color: var(--primary); display: block; }
.hero-subheading {
font-size: 1.1rem;
color: rgba(255,255,255,.75);
margin-bottom: 32px;
}
.hero-trust {
display: flex;
align-items: center;
gap: 20px;
margin-top: 28px;
flex-wrap: wrap;
}
.trust-item {
display: flex;
align-items: center;
gap: 7px;
color: rgba(255,255,255,.8);
font-size: 0.85rem;
font-weight: 500;
}
.trust-item svg { width: 16px; height: 16px; color: #4ade80; flex-shrink: 0; }
/* Tracking Card */
.hero-card {
background: rgba(255,255,255,.97);
border-radius: var(--radius-lg);
padding: 36px;
box-shadow: 0 24px 80px rgba(0,0,0,.25);
border: 1px solid rgba(255,255,255,.3);
}
.hero-card-title { font-size: 1.1rem; font-weight: 700; color: var(--gray-900); margin-bottom: 4px; }
.hero-card-subtitle { font-size: 0.85rem; color: var(--gray-500); margin-bottom: 24px; }
.tracking-form { display: flex; flex-direction: column; gap: 14px; }
.tracking-input-wrap { position: relative; }
.tracking-input {
width: 100%;
padding: 14px 16px 14px 48px;
border: 1.5px solid var(--gray-300);
border-radius: var(--radius-md);
font-size: 0.95rem;
font-family: inherit;
color: var(--gray-900);
transition: var(--transition);
background: var(--white);
direction: ltr;
text-align: right;
}
.tracking-input::placeholder { color: var(--gray-400); }
.tracking-input:focus {
outline: none;
border-color: var(--primary);
box-shadow: 0 0 0 3px rgba(245,158,11,.15);
}
.tracking-input-icon {
position: absolute;
left: 14px;
top: 50%;
transform: translateY(-50%);
color: var(--gray-400);
pointer-events: none;
}
.tracking-input-icon svg { width: 18px; height: 18px; }
.tracking-btn { width: 100%; justify-content: center; padding: 14px; font-size: 1rem; border-radius: var(--radius-md); }
.divider-row {
display: flex;
align-items: center;
gap: 12px;
color: var(--gray-400);
font-size: 0.8rem;
margin: 2px 0;
}
.divider-row::before, .divider-row::after {
content: '';
flex: 1;
height: 1px;
background: var(--gray-200);
}
.hero-card-stats {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 12px;
margin-top: 24px;
padding-top: 20px;
border-top: 1px solid var(--gray-100);
}
.h-stat { text-align: center; }
.h-stat-num {
font-size: 1.35rem;
font-weight: 800;
color: var(--primary-dark);
display: block;
line-height: 1;
margin-bottom: 4px;
}
.h-stat-label { font-size: 0.7rem; color: var(--gray-500); font-weight: 500; }
/* Hero Wave */
.hero-wave { position: relative; z-index: 2; line-height: 0; margin-top: auto; }
.hero-wave svg { display: block; width: 100%; }
/* ─── Section Titles ──────────────────────────────── */
.section-label {
display: inline-flex;
align-items: center;
gap: 8px;
font-size: 0.78rem;
font-weight: 700;
color: var(--primary-dark);
text-transform: uppercase;
letter-spacing: 1.5px;
background: var(--primary-light);
padding: 5px 14px;
border-radius: 100px;
margin-bottom: 12px;
}
.section-title {
font-size: clamp(1.6rem, 3vw, 2.2rem);
font-weight: 800;
color: var(--gray-900);
line-height: 1.25;
letter-spacing: -0.5px;
}
.section-title span { color: var(--primary); }
.section-desc {
font-size: 1rem;
color: var(--gray-500);
margin-top: 10px;
max-width: 560px;
}
.section-line {
display: block;
width: 48px;
height: 4px;
background: linear-gradient(90deg, var(--primary) 0%, var(--primary-dark) 100%);
border-radius: 2px;
margin-top: 12px;
}
.section-head { margin-bottom: 48px; }
.section-head.center { text-align: center; }
.section-head.center .section-desc { margin: 10px auto 0; }
.section-head.center .section-line { margin: 12px auto 0; }
/* ─── Services ────────────────────────────────────── */
.services {
padding: 96px 0;
background: var(--gray-100);
}
.services-grid {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 24px;
}
.service-card {
background: var(--white);
border-radius: var(--radius-md);
padding: 32px 24px;
box-shadow: var(--shadow-sm);
border: 1px solid var(--gray-200);
transition: transform var(--transition), box-shadow var(--transition);
position: relative;
overflow: hidden;
}
.service-card::after {
content: '';
position: absolute;
bottom: 0; right: 0; left: 0;
height: 3px;
background: linear-gradient(90deg, var(--primary) 0%, var(--primary-dark) 100%);
transform: scaleX(0);
transform-origin: right;
transition: transform var(--transition);
}
.service-card:hover { transform: translateY(-6px); box-shadow: var(--shadow-lg); }
.service-card:hover::after { transform: scaleX(1); }
.service-icon {
width: 56px;
height: 56px;
background: linear-gradient(135deg, var(--primary-light) 0%, #fde68a 100%);
border-radius: var(--radius-md);
display: flex;
align-items: center;
justify-content: center;
margin-bottom: 20px;
transition: var(--transition);
}
.service-card:hover .service-icon { background: linear-gradient(135deg, var(--primary) 0%, var(--primary-dark) 100%); }
.service-icon svg { width: 28px; height: 28px; color: var(--primary-dark); transition: color var(--transition); }
.service-card:hover .service-icon svg { color: var(--white); }
.service-title { font-size: 1rem; font-weight: 700; color: var(--gray-900); margin-bottom: 8px; }
.service-desc { font-size: 0.85rem; color: var(--gray-500); line-height: 1.65; margin-bottom: 18px; }
.service-link {
font-size: 0.85rem;
font-weight: 600;
color: var(--primary-dark);
display: inline-flex;
align-items: center;
gap: 5px;
transition: gap var(--transition);
}
.service-link:hover { gap: 10px; }
.service-link svg { width: 14px; height: 14px; transform: rotate(180deg); }
/* ─── How It Works ────────────────────────────────── */
.how-it-works { padding: 96px 0; background: var(--white); }
.steps-grid {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 0;
position: relative;
}
.steps-grid::before {
content: '';
position: absolute;
top: 36px;
right: 12.5%;
left: 12.5%;
height: 2px;
background: linear-gradient(90deg, var(--primary) 0%, var(--primary-light) 100%);
z-index: 0;
}
.step-item { text-align: center; padding: 0 16px; position: relative; z-index: 1; }
.step-circle {
width: 72px;
height: 72px;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
margin: 0 auto 20px;
background: var(--white);
border: 3px solid var(--gray-200);
position: relative;
transition: var(--transition);
}
.step-item:hover .step-circle {
border-color: var(--primary);
box-shadow: 0 0 0 8px var(--primary-light);
}
.step-num {
position: absolute;
top: -6px; left: -6px;
width: 22px; height: 22px;
background: var(--primary);
color: var(--white);
border-radius: 50%;
font-size: 0.65rem;
font-weight: 800;
display: flex;
align-items: center;
justify-content: center;
}
.step-circle svg { width: 30px; height: 30px; color: var(--gray-600); transition: color var(--transition); }
.step-item:hover .step-circle svg { color: var(--primary); }
.step-title { font-size: 0.95rem; font-weight: 700; color: var(--gray-900); margin-bottom: 8px; }
.step-desc { font-size: 0.82rem; color: var(--gray-500); line-height: 1.6; }
/* ─── Stats ───────────────────────────────────────── */
.stats {
padding: 80px 0;
background: linear-gradient(135deg, var(--gray-900) 0%, var(--gray-800) 100%);
position: relative;
overflow: hidden;
}
.stats::before {
content: '';
position: absolute;
inset: 0;
background: radial-gradient(circle at 70% 50%, rgba(245,158,11,.12) 0%, transparent 60%);
}
.stats-grid {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 40px;
position: relative;
z-index: 1;
}
.stat-item {
text-align: center;
padding: 24px 16px;
border-right: 1px solid rgba(255,255,255,.08);
}
.stat-item:last-child { border-right: none; }
.stat-number {
font-size: 2.8rem;
font-weight: 900;
color: var(--primary);
line-height: 1;
margin-bottom: 6px;
display: flex;
align-items: baseline;
justify-content: center;
gap: 2px;
}
.stat-suffix { font-size: 1.4rem; font-weight: 700; }
.stat-label { font-size: 0.9rem; color: rgba(255,255,255,.7); font-weight: 500; }
.stat-sub { font-size: 0.75rem; color: rgba(255,255,255,.4); margin-top: 4px; }
/* ─── Testimonials ────────────────────────────────── */
.testimonials { padding: 96px 0; background: var(--gray-100); }
.testimonials-grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 24px;
}
.testimonial-card {
background: var(--white);
border-radius: var(--radius-md);
padding: 28px;
box-shadow: var(--shadow-sm);
border: 1px solid var(--gray-200);
transition: box-shadow var(--transition), transform var(--transition);
}
.testimonial-card:hover { box-shadow: var(--shadow-lg); transform: translateY(-4px); }
.testimonial-stars { display: flex; gap: 3px; margin-bottom: 14px; flex-direction: row-reverse; }
.testimonial-stars svg { width: 16px; height: 16px; color: var(--primary); fill: var(--primary); }
.testimonial-text { font-size: 0.9rem; color: var(--gray-600); line-height: 1.7; margin-bottom: 20px; font-style: italic; }
.testimonial-author { display: flex; align-items: center; gap: 12px; }
.author-avatar {
width: 44px; height: 44px;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
font-size: 1rem;
font-weight: 700;
color: var(--white);
flex-shrink: 0;
}
.author-name { font-size: 0.9rem; font-weight: 700; color: var(--gray-900); }
.author-role { font-size: 0.78rem; color: var(--gray-500); }
/* Client Logos */
.clients-strip {
margin-top: 56px;
padding-top: 40px;
border-top: 1px solid var(--gray-200);
}
.clients-label {
text-align: center;
font-size: 0.82rem;
color: var(--gray-400);
font-weight: 600;
letter-spacing: 1px;
text-transform: uppercase;
margin-bottom: 24px;
}
.clients-logos {
display: flex;
align-items: center;
justify-content: center;
gap: 20px;
flex-wrap: wrap;
}
.client-logo {
display: flex;
align-items: center;
justify-content: center;
padding: 10px 20px;
background: var(--white);
border: 1px solid var(--gray-200);
border-radius: var(--radius-sm);
opacity: 0.6;
transition: opacity var(--transition);
}
.client-logo:hover { opacity: 1; }
.client-logo-text { font-size: 0.9rem; font-weight: 700; color: var(--gray-500); }
/* ─── CTA Section ─────────────────────────────────── */
.cta-section {
padding: 96px 0;
background: linear-gradient(135deg, var(--primary) 0%, var(--primary-dark) 100%);
position: relative;
overflow: hidden;
}
.cta-section::before {
content: '';
position: absolute;
top: -50%; right: -10%;
width: 500px; height: 500px;
border-radius: 50%;
background: rgba(255,255,255,.07);
}
.cta-section::after {
content: '';
position: absolute;
bottom: -40%; left: 5%;
width: 400px; height: 400px;
border-radius: 50%;
background: rgba(0,0,0,.06);
}
.cta-inner {
position: relative;
z-index: 1;
display: grid;
grid-template-columns: 1fr auto;
gap: 40px;
align-items: center;
}
.cta-heading {
font-size: clamp(1.6rem, 3vw, 2.2rem);
font-weight: 800;
color: var(--white);
margin-bottom: 10px;
line-height: 1.25;
}
.cta-desc { font-size: 1rem; color: rgba(255,255,255,.8); }
.cta-contact { display: flex; flex-direction: column; gap: 10px; }
.cta-contact-item {
display: flex;
align-items: center;
gap: 10px;
color: rgba(255,255,255,.9);
font-size: 0.9rem;
font-weight: 500;
}
.cta-contact-item svg { width: 18px; height: 18px; flex-shrink: 0; opacity: .8; }
.cta-buttons { display: flex; gap: 12px; margin-top: 24px; flex-wrap: wrap; }
/* ─── Footer ──────────────────────────────────────── */
.site-footer {
background: var(--gray-900);
color: rgba(255,255,255,.75);
padding: 72px 0 0;
}
.footer-grid {
display: grid;
grid-template-columns: 1.5fr 1fr 1fr 1fr;
gap: 48px;
padding-bottom: 56px;
border-bottom: 1px solid rgba(255,255,255,.08);
}
.footer-brand .logo { margin-bottom: 16px; }
.footer-brand .logo-name { color: var(--white); }
.footer-brand .logo-tagline { color: rgba(255,255,255,.4); }
.footer-desc { font-size: 0.85rem; line-height: 1.7; color: rgba(255,255,255,.55); margin-bottom: 20px; }
.footer-social { display: flex; gap: 10px; }
.social-btn {
width: 36px; height: 36px;
border-radius: 8px;
background: rgba(255,255,255,.08);
border: 1px solid rgba(255,255,255,.1);
display: flex;
align-items: center;
justify-content: center;
transition: var(--transition);
color: rgba(255,255,255,.7);
}
.social-btn:hover { background: var(--primary); border-color: var(--primary); color: var(--white); }
.social-btn svg { width: 16px; height: 16px; }
.footer-col-title {
font-size: 0.9rem;
font-weight: 700;
color: var(--white);
margin-bottom: 20px;
padding-bottom: 10px;
border-bottom: 2px solid var(--primary);
display: inline-block;
}
.footer-links { display: flex; flex-direction: column; gap: 10px; }
.footer-links a {
font-size: 0.85rem;
color: rgba(255,255,255,.55);
transition: color var(--transition);
display: flex;
align-items: center;
gap: 6px;
}
.footer-links a::before { content: ""; color: var(--primary); font-weight: 700; }
.footer-links a:hover { color: var(--primary); }
.footer-contact-list { display: flex; flex-direction: column; gap: 14px; }
.footer-contact-item {
display: flex;
align-items: flex-start;
gap: 10px;
font-size: 0.85rem;
color: rgba(255,255,255,.55);
}
.footer-contact-item svg { width: 16px; height: 16px; color: var(--primary); flex-shrink: 0; margin-top: 2px; }
.footer-newsletter { margin-top: 16px; }
.newsletter-form { display: flex; gap: 8px; margin-top: 10px; }
.newsletter-input {
flex: 1;
padding: 10px 14px;
background: rgba(255,255,255,.07);
border: 1px solid rgba(255,255,255,.15);
border-radius: var(--radius-sm);
color: var(--white);
font-size: 0.85rem;
font-family: inherit;
transition: var(--transition);
direction: rtl;
}
.newsletter-input::placeholder { color: rgba(255,255,255,.35); }
.newsletter-input:focus {
outline: none;
border-color: var(--primary);
background: rgba(255,255,255,.1);
}
.newsletter-btn {
padding: 10px 16px;
background: var(--primary);
color: var(--white);
border-radius: var(--radius-sm);
font-size: 0.85rem;
font-weight: 600;
font-family: inherit;
transition: var(--transition);
white-space: nowrap;
border: none;
cursor: pointer;
}
.newsletter-btn:hover { background: var(--primary-dark); }
.footer-bottom {
padding: 20px 0;
display: flex;
align-items: center;
justify-content: space-between;
font-size: 0.8rem;
color: rgba(255,255,255,.35);
}
.footer-bottom a { color: var(--primary); }
/* ─── Plugin Shortcode Zones ──────────────────────── */
.plugin-zone {
background: linear-gradient(135deg, var(--primary-light) 0%, #fef9ee 100%);
border: 2px dashed var(--primary);
border-radius: var(--radius-md);
padding: 20px 24px;
margin-top: 24px;
font-size: 0.82rem;
color: var(--primary-dark);
font-weight: 600;
}
.plugin-zone-label {
display: flex;
align-items: center;
gap: 8px;
margin-bottom: 8px;
opacity: .65;
font-size: 0.73rem;
text-transform: uppercase;
letter-spacing: 1px;
}
.plugin-zone code {
background: rgba(245,158,11,.15);
padding: 3px 8px;
border-radius: 4px;
font-family: monospace;
font-size: 0.88rem;
display: block;
margin-top: 6px;
color: var(--gray-800);
}
/* ─── Scroll Top ──────────────────────────────────── */
.scroll-top {
position: fixed;
bottom: 24px; right: 24px;
width: 44px; height: 44px;
background: var(--primary);
color: var(--white);
border-radius: var(--radius-sm);
display: flex;
align-items: center;
justify-content: center;
box-shadow: var(--shadow-amber);
opacity: 0;
pointer-events: none;
transition: opacity var(--transition), transform var(--transition);
z-index: 500;
border: none;
cursor: pointer;
}
.scroll-top.visible { opacity: 1; pointer-events: all; }
.scroll-top:hover { transform: translateY(-3px); }
.scroll-top svg { width: 20px; height: 20px; }
/* ─── Animations ──────────────────────────────────── */
.reveal {
opacity: 0;
transform: translateY(24px);
transition: opacity 0.55s ease, transform 0.55s ease;
}
.reveal.visible { opacity: 1; transform: translateY(0); }
.reveal-d1 { transition-delay: 0.1s; }
.reveal-d2 { transition-delay: 0.2s; }
.reveal-d3 { transition-delay: 0.3s; }
.reveal-d4 { transition-delay: 0.4s; }
/* Hero entrance */
.hero-text-anim { animation: heroUp .7s .1s ease both; }
.hero-card-anim { animation: heroUp .7s .3s ease both; }
@keyframes heroUp {
from { opacity: 0; transform: translateY(32px); }
to { opacity: 1; transform: translateY(0); }
}
/* ─── Responsive ──────────────────────────────────── */
@media (max-width: 1024px) {
.services-grid { grid-template-columns: repeat(2, 1fr); }
.steps-grid::before { display: none; }
.steps-grid { grid-template-columns: repeat(2, 1fr); gap: 32px; }
.stats-grid { grid-template-columns: repeat(2, 1fr); gap: 0; }
.stat-item { border-right: none; border-bottom: 1px solid rgba(255,255,255,.08); }
.stat-item:nth-child(odd) { border-right: 1px solid rgba(255,255,255,.08); }
.testimonials-grid { grid-template-columns: repeat(2, 1fr); }
.footer-grid { grid-template-columns: 1fr 1fr; gap: 32px; }
.cta-inner { grid-template-columns: 1fr; gap: 24px; }
.hero-layout { gap: 36px; }
}
@media (max-width: 768px) {
.header-actions .btn-secondary { display: none; }
.main-nav { display: none; }
.hamburger { display: flex; }
.mobile-drawer { display: flex; }
.hero-layout { grid-template-columns: 1fr; gap: 32px; }
.hero-content { padding: 40px 0 32px; }
.hero-card { padding: 24px; }
.services-grid { grid-template-columns: 1fr; gap: 16px; }
.steps-grid { grid-template-columns: 1fr; gap: 24px; }
.stats-grid { grid-template-columns: repeat(2, 1fr); }
.testimonials-grid { grid-template-columns: 1fr; }
.footer-grid { grid-template-columns: 1fr; gap: 28px; }
.footer-bottom { flex-direction: column; gap: 8px; text-align: center; }
.clients-logos { gap: 12px; }
.cta-buttons { flex-direction: column; }
.cta-buttons .btn { justify-content: center; }
.services, .how-it-works, .testimonials, .cta-section { padding: 64px 0; }
.stats { padding: 56px 0; }
}
@media (max-width: 480px) {
.hero-trust { flex-direction: column; align-items: flex-start; gap: 10px; }
.hero-card-stats { grid-template-columns: 1fr; }
.stat-number { font-size: 2.2rem; }
.cta-section { padding: 56px 0; }
}

View File

@ -0,0 +1,93 @@
<!-- Footer -->
<footer class="site-footer">
<div class="container">
<div class="footer-grid">
<!-- Brand -->
<div class="footer-brand">
<a href="<?php echo esc_url(home_url('/')); ?>" class="logo">
<div class="logo-icon">
<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
<path d="M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z" fill="none" stroke="white" stroke-width="1.5"/>
<polyline points="3.27 6.96 12 12.01 20.73 6.96" fill="none" stroke="white" stroke-width="1.5"/>
<line x1="12" y1="22.08" x2="12" y2="12" stroke="white" stroke-width="1.5"/>
</svg>
</div>
<div class="logo-text">
<span class="logo-name">IFNEX<span>Global Logistics</span></span>
<span class="logo-tagline">حمل و نقل بین‌المللی</span>
</div>
</a>
<p class="footer-desc"><?php echo esc_html(ifnex_get_option('footer_desc', 'IFNEX ارائه‌دهنده خدمات لجستیک بین‌المللی با بیش از ۱۰ سال تجربه در ارسال مرسولات تجاری و شخصی به سراسر جهان.')); ?></p>
</div>
<!-- Services Links -->
<div>
<h3 class="footer-col-title">خدمات</h3>
<?php
wp_nav_menu([
'theme_location' => 'footer_services',
'container' => false,
'menu_class' => 'footer-links',
'fallback_cb' => false,
]);
?>
</div>
<!-- Support Links -->
<div>
<h3 class="footer-col-title">پشتیبانی</h3>
<?php
wp_nav_menu([
'theme_location' => 'footer_support',
'container' => false,
'menu_class' => 'footer-links',
'fallback_cb' => false,
]);
?>
</div>
<!-- Contact + Newsletter -->
<div>
<h3 class="footer-col-title">تماس با ما</h3>
<div class="footer-contact-list">
<div class="footer-contact-item">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M21 10c0 7-9 13-9 13s-9-6-9-13a9 9 0 0 1 18 0z"/><circle cx="12" cy="10" r="3"/></svg>
<span><?php echo esc_html(ifnex_get_option('address', 'تهران، خیابان ولیعصر، پلاک ۱۲۳')); ?></span>
</div>
<div class="footer-contact-item">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6 19.79 19.79 0 0 1-3.07-8.67A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72c.127.96.361 1.903.7 2.81a2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45c.907.339 1.85.573 2.81.7A2 2 0 0 1 22 16.92z"/></svg>
<span><?php echo esc_html(ifnex_get_option('phone', '+98 21 0000 0000')); ?></span>
</div>
<div class="footer-contact-item">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M4 4h16c1.1 0 2 .9 2 2v12c0 1.1-.9 2-2 2H4c-1.1 0-2-.9-2-2V6c0-1.1.9-2 2-2z"/><polyline points="22,6 12,13 2,6"/></svg>
<span><?php echo esc_html(ifnex_get_option('email', 'info@ifnex.com')); ?></span>
</div>
</div>
<div class="footer-newsletter">
<span style="font-size:0.82rem;color:rgba(255,255,255,.55);">دریافت اخبار و تخفیفات:</span>
<form class="newsletter-form">
<input type="email" class="newsletter-input" placeholder="ایمیل شما">
<button type="submit" class="newsletter-btn">ثبت</button>
</form>
</div>
</div>
</div>
<!-- Footer Bottom -->
<div class="footer-bottom">
<span>© <?php echo date('Y'); ?> <a href="<?php echo esc_url(home_url('/')); ?>">IFNEX Logistics</a> — تمامی حقوق محفوظ است</span>
<span>طراحی شده با برای کسب‌وکارهای ایرانی</span>
</div>
</div>
</footer>
<!-- Scroll Top Button -->
<button class="scroll-top" id="scroll-top" aria-label="بازگشت به بالا">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="18 15 12 9 6 15"/></svg>
</button>
</main><!-- /.site-main -->
<?php wp_footer(); ?>
</body>
</html>

View File

@ -0,0 +1,357 @@
<?php get_header(); ?>
<!-- ═══════════════════════════════════════════════════
HERO SECTION
════════════════════════════════════════════════════ -->
<section class="hero" id="hero">
<div class="hero-bg-grid"></div>
<div class="hero-bg-dots"></div>
<div class="hero-content">
<div class="container">
<div class="hero-layout">
<!-- Text -->
<div class="hero-text hero-text-anim">
<div class="hero-badge">
<span class="hero-badge-dot"></span>
آنلاین و فعال · خدمات ۲۴/۷
</div>
<h1 class="hero-heading">
ارسال مرسوله به سراسر جهان
<span>Fast, Secure &amp; Reliable Global Shipping</span>
</h1>
<p class="hero-subheading">سریع، امن و قابل اعتماد از ایران به هر نقطه از دنیا</p>
<div class="hero-buttons">
<a href="#tracking" class="btn btn-white btn-lg">ردیابی مرسوله</a>
<a href="#" class="btn btn-outline-white btn-lg">شروع ارسال</a>
</div>
<div class="hero-trust">
<div class="trust-item">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="20 6 9 17 4 12"/></svg>
بیش از ۵۰۰ کسب‌وکار فعال
</div>
<div class="trust-item">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="20 6 9 17 4 12"/></svg>
پشتیبانی ۲۴ ساعته
</div>
<div class="trust-item">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="20 6 9 17 4 12"/></svg>
بیمه کامل مرسولات
</div>
</div>
</div>
<!-- Tracking Card -->
<div class="hero-card hero-card-anim" id="tracking">
<h2 class="hero-card-title">ردیابی مرسوله</h2>
<p class="hero-card-subtitle">شماره AWB یا بارنامه خود را وارد کنید</p>
<div class="tracking-form">
<div class="tracking-input-wrap">
<input type="text" class="tracking-input" placeholder="مثال: IFN-2026-12345" dir="ltr">
<div class="tracking-input-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="11" cy="11" r="8"/><line x1="21" y1="21" x2="16.65" y2="16.65"/></svg>
</div>
</div>
<button class="btn btn-primary tracking-btn">ردیابی مرسوله</button>
</div>
<div class="divider-row">یا</div>
<a href="#" class="btn btn-secondary" style="justify-content:center;">ثبت سفارش جدید</a>
<a href="#" class="btn btn-secondary" style="justify-content:center;">محاسبه هزینه ارسال</a>
<div class="hero-card-stats">
<div class="h-stat">
<span class="h-stat-num">+۱۵۰</span>
<span class="h-stat-label">کشور مقصد</span>
</div>
<div class="h-stat">
<span class="h-stat-num">+۵۰۰</span>
<span class="h-stat-label">مشتری فعال</span>
</div>
<div class="h-stat">
<span class="h-stat-num">۹۸٪</span>
<span class="h-stat-label">رضایتمندی</span>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="hero-wave">
<svg viewBox="0 0 1440 100" preserveAspectRatio="none" style="height:80px;">
<path d="M0,60 C360,100 720,0 1080,60 C1260,90 1380,70 1440,60 L1440,100 L0,100 Z" fill="#f3f4f6"/>
</svg>
</div>
</section>
<!-- ═══════════════════════════════════════════════════
SERVICES SECTION
════════════════════════════════════════════════════ -->
<section class="services" id="services">
<div class="container">
<div class="section-head center reveal">
<span class="section-label">خدمات ما</span>
<h2 class="section-title">راه‌حل‌های جامع <span>لجستیک</span></h2>
<p class="section-desc">از ارسال بین‌المللی تا ردیابی لحظه‌ای همه چیز در یک پلتفرم یکپارچه</p>
<span class="section-line"></span>
</div>
<div class="services-grid">
<!-- Service 1 -->
<div class="service-card reveal reveal-d1">
<div class="service-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="10"/><line x1="2" y1="12" x2="22" y2="12"/><path d="M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z"/></svg>
</div>
<h3 class="service-title">ارسال بین‌المللی (صادرات)</h3>
<p class="service-desc">ارسال مرسولات تجاری و شخصی به بیش از ۱۵۰ کشور جهان با سریع‌ترین مسیرهای هوایی و زمینی.</p>
<a href="#" class="service-link">
بیشتر بدانید
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="19" y1="12" x2="5" y2="12"/><polyline points="12 19 5 12 12 5"/></svg>
</a>
</div>
<!-- Service 2 -->
<div class="service-card reveal reveal-d2">
<div class="service-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"/><polyline points="7 10 12 15 17 10"/><line x1="12" y1="15" x2="12" y2="3"/></svg>
</div>
<h3 class="service-title">ارسال داخلی (واردات)</h3>
<p class="service-desc">دریافت مرسولات از سراسر دنیا و تحویل سریع در ایران با سیستم ردیابی دقیق و بیمه کامل.</p>
<a href="#" class="service-link">
بیشتر بدانید
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="19" y1="12" x2="5" y2="12"/><polyline points="12 19 5 12 12 5"/></svg>
</a>
</div>
<!-- Service 3 -->
<div class="service-card reveal reveal-d3">
<div class="service-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="9" cy="21" r="1"/><circle cx="20" cy="21" r="1"/><path d="M1 1h4l2.68 13.39a2 2 0 0 0 2 1.61h9.72a2 2 0 0 0 2-1.61L23 6H6"/></svg>
</div>
<h3 class="service-title">سفارش آنلاین</h3>
<p class="service-desc">ثبت سفارش ارسال به صورت آنلاین، پرداخت امن، و پیگیری لحظه‌ای از طریق پنل کاربری اختصاصی.</p>
<a href="#" class="service-link">
بیشتر بدانید
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="19" y1="12" x2="5" y2="12"/><polyline points="12 19 5 12 12 5"/></svg>
</a>
</div>
<!-- Service 4 -->
<div class="service-card reveal reveal-d4">
<div class="service-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="22 12 18 12 15 21 9 3 6 12 2 12"/></svg>
</div>
<h3 class="service-title">ردیابی مرسوله</h3>
<p class="service-desc">ردیابی آنی مرسولات با شماره AWB از لحظه تحویل تا رسیدن به مقصد، هر گام را ببینید.</p>
<a href="#tracking" class="service-link">
ردیابی کنید
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="19" y1="12" x2="5" y2="12"/><polyline points="12 19 5 12 12 5"/></svg>
</a>
</div>
</div>
</div>
</section>
<!-- ═══════════════════════════════════════════════════
HOW IT WORKS SECTION
════════════════════════════════════════════════════ -->
<section class="how-it-works" id="how-it-works">
<div class="container">
<div class="section-head center reveal">
<span class="section-label">نحوه کار</span>
<h2 class="section-title">در چهار گام ساده <span>ارسال کنید</span></h2>
<p class="section-desc">فرآیند ارسال مرسوله با IFNEX سریع، شفاف و کاملاً آنلاین است</p>
<span class="section-line"></span>
</div>
<div class="steps-grid">
<div class="step-item reveal reveal-d1">
<div class="step-circle">
<span class="step-num">۱</span>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2"/><circle cx="12" cy="7" r="4"/></svg>
</div>
<h3 class="step-title">ثبت‌نام رایگان</h3>
<p class="step-desc">حساب کاربری خود را در کمتر از یک دقیقه بسازید و به پنل مدیریت دسترسی پیدا کنید.</p>
</div>
<div class="step-item reveal reveal-d2">
<div class="step-circle">
<span class="step-num">۲</span>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"/><path d="M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z"/></svg>
</div>
<h3 class="step-title">ثبت سفارش</h3>
<p class="step-desc">اطلاعات فرستنده، گیرنده و مشخصات بسته را وارد کنید و بهترین سرویس را انتخاب نمایید.</p>
</div>
<div class="step-item reveal reveal-d3">
<div class="step-circle">
<span class="step-num">۳</span>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="1" y="4" width="22" height="16" rx="2" ry="2"/><line x1="1" y1="10" x2="23" y2="10"/></svg>
</div>
<h3 class="step-title">پرداخت آنلاین</h3>
<p class="step-desc">هزینه ارسال را از طریق درگاه امن یا کیف پول IFNEX پرداخت کنید و رسید دریافت نمایید.</p>
</div>
<div class="step-item reveal reveal-d4">
<div class="step-circle">
<span class="step-num">۴</span>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polygon points="3 11 22 2 13 21 11 13 3 11"/></svg>
</div>
<h3 class="step-title">ردیابی آنی</h3>
<p class="step-desc">با شماره AWB اختصاصی، مسیر مرسوله خود را در هر لحظه پیگیری کنید.</p>
</div>
</div>
</div>
</section>
<!-- ═══════════════════════════════════════════════════
STATS SECTION
════════════════════════════════════════════════════ -->
<section class="stats">
<div class="container">
<div class="stats-grid">
<div class="stat-item reveal">
<div class="stat-number"><span class="stat-suffix">+</span>۱۰</div>
<div class="stat-label">سال تجربه</div>
<div class="stat-sub">Years of Experience</div>
</div>
<div class="stat-item reveal reveal-d1">
<div class="stat-number"><span class="stat-suffix">+</span>۱۵۰</div>
<div class="stat-label">کشور مقصد</div>
<div class="stat-sub">Countries Served</div>
</div>
<div class="stat-item reveal reveal-d2">
<div class="stat-number"><span class="stat-suffix">+</span>۱۰,۰۰۰</div>
<div class="stat-label">مرسوله تحویل‌شده</div>
<div class="stat-sub">Packages Delivered</div>
</div>
<div class="stat-item reveal reveal-d3">
<div class="stat-number">۹۸<span class="stat-suffix">٪</span></div>
<div class="stat-label">رضایت مشتریان</div>
<div class="stat-sub">Customer Satisfaction</div>
</div>
</div>
</div>
</section>
<!-- ═══════════════════════════════════════════════════
TESTIMONIALS SECTION
════════════════════════════════════════════════════ -->
<section class="testimonials">
<div class="container">
<div class="section-head center reveal">
<span class="section-label">نظر مشتریان</span>
<h2 class="section-title">آنچه مشتریان ما <span>می‌گویند</span></h2>
<p class="section-desc">بیش از ۵۰۰ کسب‌وکار به IFNEX اعتماد کرده‌اند</p>
<span class="section-line"></span>
</div>
<div class="testimonials-grid">
<div class="testimonial-card reveal reveal-d1">
<div class="testimonial-stars">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><polygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><polygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><polygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><polygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><polygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2"/></svg>
</div>
<p class="testimonial-text">"با IFNEX ارسال بین‌المللی کالاهایمان به اروپا خیلی ساده‌تر شد. پنل آنلاین عالی است و پیگیری لحظه‌ای واقعاً کمک می‌کند."</p>
<div class="testimonial-author">
<div class="author-avatar" style="background:#f59e0b;">م</div>
<div>
<div class="author-name">محمد رضایی</div>
<div class="author-role">مدیر صادرات، شرکت تجاری نیلوفر</div>
</div>
</div>
</div>
<div class="testimonial-card reveal reveal-d2">
<div class="testimonial-stars">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><polygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><polygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><polygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><polygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><polygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2"/></svg>
</div>
<p class="testimonial-text">"پشتیبانی IFNEX فوق‌العاده است. هر بار که سوال داشتم سریع جواب گرفتم. قیمت‌ها هم رقابتی هستند."</p>
<div class="testimonial-author">
<div class="author-avatar" style="background:#059669;">س</div>
<div>
<div class="author-name">سارا احمدی</div>
<div class="author-role">کارآفرین، فروشگاه اینترنتی</div>
</div>
</div>
</div>
<div class="testimonial-card reveal reveal-d3">
<div class="testimonial-stars">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><polygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><polygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><polygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><polygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><polygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2"/></svg>
</div>
<p class="testimonial-text">"ادغام IFNEX Bridge با وردپرس خیلی راحت بود. سیستم ردیابی و کیف پول به طور خودکار در سایتم نمایش داده می‌شود."</p>
<div class="testimonial-author">
<div class="author-avatar" style="background:#2563eb;">ع</div>
<div>
<div class="author-name">علی کریمی</div>
<div class="author-role">توسعه‌دهنده وردپرس</div>
</div>
</div>
</div>
</div>
<!-- Client Logos -->
<div class="clients-strip reveal">
<div class="clients-label">مورد اعتماد کسب‌وکارهای برتر</div>
<div class="clients-logos">
<div class="client-logo"><span class="client-logo-text">TradeCo</span></div>
<div class="client-logo"><span class="client-logo-text">NiloofarEx</span></div>
<div class="client-logo"><span class="client-logo-text">ParsShip</span></div>
<div class="client-logo"><span class="client-logo-text">IranTrade</span></div>
<div class="client-logo"><span class="client-logo-text">GlobeCargo</span></div>
</div>
</div>
</div>
</section>
<!-- ═══════════════════════════════════════════════════
CTA SECTION
════════════════════════════════════════════════════ -->
<section class="cta-section" id="contact">
<div class="container">
<div class="cta-inner">
<div>
<h2 class="cta-heading">آماده ارسال مرسوله هستید؟</h2>
<p class="cta-desc">همین امروز با ما تماس بگیرید یا حساب کاربری رایگان بسازید</p>
<div class="cta-buttons">
<a href="#" class="btn btn-white btn-lg">شروع رایگان</a>
<a href="tel:+982100000000" class="btn btn-outline-white btn-lg">تماس با ما</a>
</div>
</div>
<div class="cta-contact">
<div class="cta-contact-item">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6 19.79 19.79 0 0 1-3.07-8.67A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72c.127.96.361 1.903.7 2.81a2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45c.907.339 1.85.573 2.81.7A2 2 0 0 1 22 16.92z"/></svg>
+98 21 0000 0000
</div>
<div class="cta-contact-item">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M4 4h16c1.1 0 2 .9 2 2v12c0 1.1-.9 2-2 2H4c-1.1 0-2-.9-2-2V6c0-1.1.9-2 2-2z"/><polyline points="22,6 12,13 2,6"/></svg>
info@ifnex.com
</div>
<div class="cta-contact-item">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M21 10c0 7-9 13-9 13s-9-6-9-13a9 9 0 0 1 18 0z"/><circle cx="12" cy="10" r="3"/></svg>
تهران، ایران
</div>
</div>
</div>
</div>
</section>
<?php get_footer(); ?>

View File

@ -0,0 +1,86 @@
<?php
/**
* IFNEX Logistics Theme
*/
defined('ABSPATH') || exit;
// ─── تابع کمکی ─────────────────────────────────────────
function ifnex_get_option($key, $default = '') {
return get_theme_mod("ifnex_{$key}", $default);
}
// ─── Theme Setup ───────────────────────────────────────
function ifnex_theme_setup() {
add_theme_support('title-tag');
add_theme_support('post-thumbnails');
add_theme_support('custom-logo', [
'height' => 44, 'width' => 44,
'flex-height' => true, 'flex-width' => true,
]);
add_theme_support('html5', ['search-form', 'comment-form', 'gallery', 'caption']);
add_theme_support('responsive-embeds');
register_nav_menus([
'primary' => __('منوی اصلی', 'ifnex'),
'footer_services' => __('منوی فوتر — خدمات', 'ifnex'),
'footer_support' => __('منوی فوتر — پشتیبانی', 'ifnex'),
]);
}
add_action('after_setup_theme', 'ifnex_theme_setup');
// ─── بارگذاری فایل‌های کمکی ──────────────────────────
$ifnex_includes = ['/inc/customizer.php'];
foreach ($ifnex_includes as $file) {
$filepath = get_template_directory() . $file;
if (file_exists($filepath)) require_once $filepath;
}
// ─── Enqueue Assets ────────────────────────────────────
function ifnex_enqueue_assets() {
wp_enqueue_style('vazirmatn', 'https://fonts.googleapis.com/css2?family=Vazirmatn:wght@300;400;500;600;700;800;900&display=swap', [], null);
wp_enqueue_style('ifnex-main', get_stylesheet_uri(), ['vazirmatn'], '1.0.1'); // نسخه افزایش یافت برای کش
wp_enqueue_script('ifnex-main', get_template_directory_uri() . '/assets/js/main.js', [], '1.0.0', true);
wp_localize_script('ifnex-main', 'ifnexConfig', [
'ajaxUrl' => admin_url('admin-ajax.php'),
'apiUrl' => get_option('ifnex_api_url', 'http://localhost:8000/api/v1'),
'homeUrl' => home_url('/'),
]);
}
add_action('wp_enqueue_scripts', 'ifnex_enqueue_assets');
// ─── Helper Function برای منوی اصلی (ساده‌تر و تمیزتر از Walker) ──
function ifnex_render_primary_menu() {
wp_nav_menu([
'theme_location' => 'primary',
'container' => false,
'menu_class' => 'nav-list',
'items_wrap' => '<ul id="%1$s" class="%2$s">%3$s</ul>',
'link_before' => '',
'link_after' => '',
'fallback_cb' => false,
]);
}
// ─── حذف کلاس‌های پیش‌فرض وردپرس از منو ──────────────
add_filter('nav_menu_css_class', function($classes) {
return array_filter($classes, function($class) {
return in_array($class, ['current-menu-item', 'menu-item-has-children']);
});
});
// ─── حذف آیدی‌های پیش‌فرض از آیتم‌های منو ────────────
add_filter('nav_menu_item_id', '__return_null');
// ─── حذف موارد اضافی وردپرس (سرعت) ──────────────────
remove_action('wp_head', 'wp_generator');
remove_action('wp_head', 'wlwmanifest_link');
remove_action('wp_head', 'rsd_link');
remove_action('wp_head', 'wp_shortlink_wp_head');
function ifnex_disable_emojis() {
remove_action('wp_head', 'print_emoji_detection_script', 7);
remove_action('wp_print_styles', 'print_emoji_styles');
}
add_action('init', 'ifnex_disable_emojis');

View File

@ -0,0 +1,61 @@
<!DOCTYPE html>
<html <?php language_attributes(); ?> dir="rtl">
<head>
<meta charset="<?php bloginfo('charset'); ?>">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="theme-color" content="#f59e0b">
<?php wp_head(); ?>
</head>
<body <?php body_class(); ?>>
<?php wp_body_open(); ?>
<!-- Header -->
<header class="site-header" id="site-header">
<div class="container">
<div class="header-inner">
<!-- Logo -->
<a href="<?php echo esc_url(home_url('/')); ?>" class="logo" aria-label="IFNEX">
<div class="logo-icon">
<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
<path d="M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z" fill="none" stroke="white" stroke-width="1.5"/>
<polyline points="3.27 6.96 12 12.01 20.73 6.96" fill="none" stroke="white" stroke-width="1.5"/>
<line x1="12" y1="22.08" x2="12" y2="12" stroke="white" stroke-width="1.5"/>
</svg>
</div>
<div class="logo-text">
<span class="logo-name">IFNEX</span>
<span class="logo-tagline"><?php echo esc_html(ifnex_get_option('tagline', 'حمل و نقل بین‌المللی')); ?></span>
</div>
</a>
<!-- Navigation -->
<nav class="main-nav" aria-label="منوی اصلی">
<?php ifnex_render_primary_menu(); ?>
</nav>
<!-- Actions -->
<div class="header-actions">
<a href="<?php echo esc_url(ifnex_get_option('login_url', '#')); ?>" class="btn btn-secondary">ورود مشتریان</a>
<a href="<?php echo esc_url(ifnex_get_option('order_url', '#')); ?>" class="btn btn-primary">سفارش جدید</a>
<button class="hamburger" id="hamburger" aria-label="منو" aria-expanded="false">
<span></span><span></span><span></span>
</button>
</div>
</div>
</div>
</header>
<!-- Mobile Drawer -->
<div class="mobile-drawer" id="mobile-drawer" aria-hidden="true">
<nav class="mobile-nav" aria-label="منوی موبایل">
<?php ifnex_render_primary_menu(); ?>
</nav>
<div class="mobile-drawer-actions">
<a href="<?php echo esc_url(ifnex_get_option('login_url', '#')); ?>" class="btn btn-secondary">ورود مشتریان</a>
<a href="<?php echo esc_url(ifnex_get_option('order_url', '#')); ?>" class="btn btn-primary">سفارش جدید</a>
</div>
</div>
<!-- Main content wrapper -->
<main id="main-content" class="site-main">

View File

@ -0,0 +1,92 @@
<?php
/**
* IFNEX Customizer Settings
*/
defined('ABSPATH') || exit;
function ifnex_customize_register($wp_customize) {
// ─── بخش Hero ───
$wp_customize->add_section('ifnex_hero', [
'title' => '🏠 بخش Hero (بالای صفحه)',
'priority' => 30,
]);
$wp_customize->add_setting('ifnex_hero_title', ['default' => 'ارسال مرسوله به سراسر جهان', 'sanitize_callback' => 'sanitize_text_field']);
$wp_customize->add_control('ifnex_hero_title', ['label' => 'عنوان اصلی', 'section' => 'ifnex_hero', 'type' => 'text']);
$wp_customize->add_setting('ifnex_hero_subtitle', ['default' => 'سریع، امن و قابل اعتماد — از ایران به هر نقطه از دنیا', 'sanitize_callback' => 'sanitize_textarea_field']);
$wp_customize->add_control('ifnex_hero_subtitle', ['label' => 'زیرعنوان', 'section' => 'ifnex_hero', 'type' => 'textarea']);
// ─── بخش آمار ───
$wp_customize->add_section('ifnex_stats', [
'title' => '📊 آمار و ارقام',
'priority' => 31,
]);
$stats = [
'years' => ['label' => 'سال تجربه', 'default' => '۱۰'],
'countries' => ['label' => 'تعداد کشورها', 'default' => '۱۵۰'],
'clients' => ['label' => 'تعداد مشتریان', 'default' => '۵۰۰'],
'packages' => ['label' => 'مرسولات تحویل‌شده', 'default' => '۱۰,۰۰۰'],
'satisfaction' => ['label' => 'درصد رضایت', 'default' => '۹۸'],
];
foreach ($stats as $key => $stat) {
$wp_customize->add_setting("ifnex_stat_{$key}", ['default' => $stat['default'], 'sanitize_callback' => 'sanitize_text_field']);
$wp_customize->add_control("ifnex_stat_{$key}", ['label' => $stat['label'], 'section' => 'ifnex_stats', 'type' => 'text']);
}
// ─── بخش اطلاعات تماس ───
$wp_customize->add_section('ifnex_contact', [
'title' => '📞 اطلاعات تماس',
'priority' => 32,
]);
$wp_customize->add_setting('ifnex_phone', ['default' => '+98 21 0000 0000', 'sanitize_callback' => 'sanitize_text_field']);
$wp_customize->add_control('ifnex_phone', ['label' => 'شماره تماس', 'section' => 'ifnex_contact', 'type' => 'text']);
$wp_customize->add_setting('ifnex_email', ['default' => 'info@ifnex.com', 'sanitize_callback' => 'sanitize_email']);
$wp_customize->add_control('ifnex_email', ['label' => 'ایمیل', 'section' => 'ifnex_contact', 'type' => 'email']);
$wp_customize->add_setting('ifnex_address', ['default' => 'تهران، خیابان ولیعصر، پلاک ۱۲۳', 'sanitize_callback' => 'sanitize_textarea_field']);
$wp_customize->add_control('ifnex_address', ['label' => 'آدرس', 'section' => 'ifnex_contact', 'type' => 'textarea']);
// ─── بخش لینک‌ها ───
$wp_customize->add_section('ifnex_links', [
'title' => '🔗 لینک‌های مهم',
'priority' => 33,
]);
$wp_customize->add_setting('ifnex_login_url', ['default' => '#', 'sanitize_callback' => 'esc_url_raw']);
$wp_customize->add_control('ifnex_login_url', ['label' => 'URL ورود مشتریان', 'section' => 'ifnex_links', 'type' => 'url']);
$wp_customize->add_setting('ifnex_order_url', ['default' => '#', 'sanitize_callback' => 'esc_url_raw']);
$wp_customize->add_control('ifnex_order_url', ['label' => 'URL سفارش جدید', 'section' => 'ifnex_links', 'type' => 'url']);
// ─── بخش CTA ───
$wp_customize->add_section('ifnex_cta', [
'title' => '📢 بخش CTA',
'priority' => 34,
]);
$wp_customize->add_setting('ifnex_cta_title', ['default' => 'آماده ارسال مرسوله هستید؟', 'sanitize_callback' => 'sanitize_text_field']);
$wp_customize->add_control('ifnex_cta_title', ['label' => 'عنوان CTA', 'section' => 'ifnex_cta', 'type' => 'text']);
$wp_customize->add_setting('ifnex_cta_desc', ['default' => 'همین امروز با ما تماس بگیرید یا حساب کاربری رایگان بسازید', 'sanitize_callback' => 'sanitize_textarea_field']);
$wp_customize->add_control('ifnex_cta_desc', ['label' => 'توضیح CTA', 'section' => 'ifnex_cta', 'type' => 'textarea']);
// ─── بخش فوتر ───
$wp_customize->add_section('ifnex_footer', [
'title' => '📋 فوتر',
'priority' => 35,
]);
$wp_customize->add_setting('ifnex_footer_desc', ['default' => 'IFNEX ارائه‌دهنده خدمات لجستیک بین‌المللی با بیش از ۱۰ سال تجربه در ارسال مرسولات تجاری و شخصی به سراسر جهان.', 'sanitize_callback' => 'sanitize_textarea_field']);
$wp_customize->add_control('ifnex_footer_desc', ['label' => 'توضیح فوتر', 'section' => 'ifnex_footer', 'type' => 'textarea']);
$wp_customize->add_setting('ifnex_tagline', ['default' => 'حمل و نقل بین‌المللی', 'sanitize_callback' => 'sanitize_text_field']);
$wp_customize->add_control('ifnex_tagline', ['label' => 'تگلاین (زیر لوگو)', 'section' => 'ifnex_footer', 'type' => 'text']);
}
add_action('customize_register', 'ifnex_customize_register');

View File

@ -0,0 +1,4 @@
<?php
defined('ABSPATH') || exit;
// فایل بارگذاری CSS و JS
// بارگذاری اصلی در functions.php انجام می‌شود

View File

@ -0,0 +1,16 @@
<?php get_header(); ?>
<main class="container" style="padding: 120px 24px 80px;">
<?php if (have_posts()) : ?>
<?php while (have_posts()) : the_post(); ?>
<article <?php post_class(); ?>>
<h1><?php the_title(); ?></h1>
<div><?php the_content(); ?></div>
</article>
<?php endwhile; ?>
<?php else : ?>
<p>محتوایی یافت نشد.</p>
<?php endif; ?>
</main>
<?php get_footer(); ?>

View File

@ -0,0 +1,12 @@
<?php get_header(); ?>
<main class="container" style="padding: 120px 24px 80px;">
<?php while (have_posts()) : the_post(); ?>
<article>
<h1><?php the_title(); ?></h1>
<div><?php the_content(); ?></div>
</article>
<?php endwhile; ?>
</main>
<?php get_footer(); ?>

View File

@ -0,0 +1,20 @@
<?php get_header(); ?>
<main class="container" style="padding: 120px 24px 80px; max-width: 800px;">
<?php while (have_posts()) : the_post(); ?>
<article>
<h1><?php the_title(); ?></h1>
<div style="color:var(--gray-500);font-size:0.85rem;margin-bottom:24px;">
<?php echo get_the_date(); ?> · <?php the_author(); ?>
</div>
<?php if (has_post_thumbnail()) : ?>
<div style="margin-bottom:24px;border-radius:var(--radius-md);overflow:hidden;">
<?php the_post_thumbnail('large'); ?>
</div>
<?php endif; ?>
<div><?php the_content(); ?></div>
</article>
<?php endwhile; ?>
</main>
<?php get_footer(); ?>

View File

@ -0,0 +1,827 @@
/*
Theme Name: IFNEX Logistics
Theme URI: https://ifnex.com
Author: VernaSoft Group Kazem Alghasi
Author URI: https://vernasoft.group
Description: تم اختصاصی شرکت حمل و نقل بین‌المللی IFNEX طراحی مدرن، سریع و بهینه برای سئو
Version: 1.0.0
Requires at least: 6.0
Tested up to: 6.7
Requires PHP: 8.0
License: Proprietary
License URI: https://ifnex.com/license
Text Domain: ifnex
Tags: logistics, rtl, custom-menu, custom-logo, translation-ready
*/
/* ─── Design Tokens ───────────────────────────────── */
:root {
--primary: #f59e0b;
--primary-dark: #d97706;
--primary-light: #fef3c7;
--success: #059669;
--danger: #dc2626;
--info: #2563eb;
--gray-900: #111827;
--gray-800: #1f2937;
--gray-700: #374151;
--gray-600: #4b5563;
--gray-500: #6b7280;
--gray-400: #9ca3af;
--gray-300: #d1d5db;
--gray-200: #e5e7eb;
--gray-100: #f3f4f6;
--white: #ffffff;
--radius-sm: 6px;
--radius-md: 12px;
--radius-lg: 20px;
--shadow-sm: 0 1px 3px rgba(0,0,0,.08), 0 1px 2px rgba(0,0,0,.06);
--shadow-md: 0 4px 16px rgba(0,0,0,.10), 0 2px 6px rgba(0,0,0,.06);
--shadow-lg: 0 10px 40px rgba(0,0,0,.14), 0 4px 12px rgba(0,0,0,.08);
--shadow-amber: 0 8px 32px rgba(245,158,11,.35);
--transition: 0.25s cubic-bezier(.4,0,.2,1);
}
/* ─── Reset & Base ────────────────────────────────── */
*,::before,::after { box-sizing: border-box; margin: 0; padding: 0; }
html { scroll-behavior: smooth; direction: rtl; font-size: 16px; }
body {
font-family: 'Vazirmatn', 'IranYekan', Tahoma, sans-serif;
background: var(--white);
color: var(--gray-900);
line-height: 1.6;
overflow-x: hidden;
}
a { text-decoration: none; color: inherit; }
ul,ol { list-style: none; }
img { max-width: 100%; display: block; }
button { cursor: pointer; font-family: inherit; border: none; background: none; }
.container { max-width: 1200px; margin: 0 auto; padding: 0 24px; }
/* ─── Buttons ─────────────────────────────────────── */
.btn {
display: inline-flex; align-items: center; gap: 8px;
padding: 11px 24px; border-radius: var(--radius-sm);
font-size: 0.9rem; font-weight: 600; transition: var(--transition);
white-space: nowrap; line-height: 1; border: 1.5px solid transparent;
}
.btn-primary {
background: var(--primary); color: var(--white);
border-color: var(--primary); box-shadow: var(--shadow-amber);
}
.btn-primary:hover {
background: var(--primary-dark); border-color: var(--primary-dark);
transform: translateY(-1px); box-shadow: 0 10px 36px rgba(245,158,11,.45);
}
.btn-secondary {
background: transparent; color: var(--gray-700); border-color: var(--gray-300);
}
.btn-secondary:hover {
border-color: var(--primary); color: var(--primary-dark); background: var(--primary-light);
}
.btn-white {
background: var(--white); color: var(--primary-dark);
font-weight: 700; border-color: var(--white); box-shadow: var(--shadow-md);
}
.btn-white:hover { background: var(--primary-light); transform: translateY(-1px); }
.btn-outline-white {
background: transparent; color: var(--white); border-color: rgba(255,255,255,.6);
}
.btn-outline-white:hover { background: rgba(255,255,255,.12); border-color: var(--white); }
.btn-lg { padding: 15px 36px; font-size: 1rem; border-radius: var(--radius-md); }
/* ─── Header ──────────────────────────────────────── */
.site-header {
position: fixed;
top: 0; right: 0; left: 0;
z-index: 1000;
background: rgba(255, 255, 255, 0.95);
backdrop-filter: blur(16px);
-webkit-backdrop-filter: blur(16px);
border-bottom: 1px solid transparent;
transition: box-shadow var(--transition), border-color var(--transition), background var(--transition);
}
.site-header.scrolled {
box-shadow: 0 2px 24px rgba(0, 0, 0, 0.08);
border-bottom-color: var(--gray-200);
background: rgba(255, 255, 255, 0.98);
}
.header-inner {
display: flex;
align-items: center;
justify-content: space-between;
height: 72px;
gap: 32px;
}
/* ─── Logo ─── */
.logo {
display: flex;
align-items: center;
gap: 12px;
flex-shrink: 0;
text-decoration: none;
}
.logo-icon {
width: 44px;
height: 44px;
background: linear-gradient(135deg, var(--primary) 0%, var(--primary-dark) 100%);
border-radius: 10px;
display: flex;
align-items: center;
justify-content: center;
box-shadow: 0 4px 12px rgba(245, 158, 11, 0.4);
flex-shrink: 0;
}
.logo-icon svg { width: 26px; height: 26px; }
.logo-text {
display: flex;
flex-direction: column;
line-height: 1.1;
gap: 2px;
}
.logo-name {
font-size: 1.35rem;
font-weight: 900;
color: var(--gray-900);
letter-spacing: -0.5px;
}
.logo-tagline {
font-size: 0.68rem;
color: var(--gray-500);
font-weight: 500;
letter-spacing: 0.3px;
}
/* ─── Main Navigation ─── */
.main-nav {
flex: 1;
display: flex;
justify-content: center;
}
.nav-list {
display: flex;
align-items: center;
gap: 4px;
list-style: none;
margin: 0;
padding: 0;
}
.nav-list li {
margin: 0;
padding: 0;
list-style: none;
}
.nav-list a {
display: inline-flex;
align-items: center;
padding: 8px 16px;
border-radius: var(--radius-sm);
font-size: 0.9rem;
font-weight: 500;
color: var(--gray-700);
text-decoration: none;
transition: color var(--transition), background var(--transition);
white-space: nowrap;
line-height: 1.4;
}
.nav-list a:hover {
color: var(--primary-dark);
background: var(--primary-light);
}
.nav-list li.current-menu-item > a {
color: var(--primary-dark);
background: var(--primary-light);
font-weight: 600;
}
/* ─── Header Actions ─── */
.header-actions {
display: flex;
align-items: center;
gap: 10px;
flex-shrink: 0;
}
/* ─── Hamburger ─── */
.hamburger {
display: none;
flex-direction: column;
justify-content: center;
align-items: center;
width: 40px;
height: 40px;
border-radius: var(--radius-sm);
gap: 5px;
background: var(--gray-100);
border: none;
cursor: pointer;
transition: background var(--transition);
padding: 0;
}
.hamburger:hover {
background: var(--gray-200);
}
.hamburger span {
display: block;
width: 20px;
height: 2px;
background: var(--gray-700);
border-radius: 2px;
transition: transform var(--transition), opacity var(--transition);
}
.hamburger.open span:nth-child(1) {
transform: translateY(7px) rotate(45deg);
}
.hamburger.open span:nth-child(2) {
opacity: 0;
transform: scaleX(0);
}
.hamburger.open span:nth-child(3) {
transform: translateY(-7px) rotate(-45deg);
}
/* ─── Mobile Drawer ─── */
.mobile-drawer {
display: none;
position: fixed;
top: 72px;
right: 0;
left: 0;
bottom: 0;
background: var(--white);
z-index: 999;
padding: 24px;
flex-direction: column;
gap: 8px;
transform: translateX(100%);
transition: transform 0.3s cubic-bezier(.4, 0, .2, 1);
overflow-y: auto;
border-top: 1px solid var(--gray-200);
}
.mobile-drawer.open {
transform: translateX(0);
}
.mobile-drawer .nav-list {
display: flex;
flex-direction: column;
gap: 4px;
width: 100%;
}
.mobile-drawer .nav-list a {
display: block;
padding: 14px 16px;
border-radius: var(--radius-md);
font-size: 1rem;
font-weight: 600;
color: var(--gray-700);
border: 1px solid var(--gray-200);
transition: all var(--transition);
text-align: right;
}
.mobile-drawer .nav-list a:hover,
.mobile-drawer .nav-list li.current-menu-item > a {
background: var(--primary-light);
border-color: var(--primary);
color: var(--primary-dark);
}
.mobile-drawer-actions {
margin-top: 16px;
display: flex;
gap: 12px;
flex-direction: column;
}
.mobile-drawer-actions .btn {
justify-content: center;
width: 100%;
}
/* Mobile Drawer */
.mobile-drawer {
display: none; position: fixed; top: 72px; right: 0; left: 0; bottom: 0;
background: var(--white); z-index: 999; padding: 24px;
flex-direction: column; gap: 8px; transform: translateX(100%);
transition: transform 0.3s cubic-bezier(.4,0,.2,1);
overflow-y: auto; border-top: 1px solid var(--gray-200);
}
.mobile-drawer.open { transform: translateX(0); }
.mobile-drawer a {
display: block; padding: 14px 16px; border-radius: var(--radius-md);
font-size: 1rem; font-weight: 600; color: var(--gray-700);
border: 1px solid var(--gray-200); transition: var(--transition);
}
.mobile-drawer a:hover {
background: var(--primary-light); border-color: var(--primary); color: var(--primary-dark);
}
.mobile-drawer-actions { margin-top: 16px; display: flex; gap: 12px; flex-direction: column; }
/* ─── Hero ────────────────────────────────────────── */
.hero {
padding-top: 72px; position: relative; overflow: hidden;
background: linear-gradient(135deg, #1a0a00 0%, #3d1a00 30%, #7c3100 60%, #d97706 85%, #f59e0b 100%);
min-height: 100vh; display: flex; flex-direction: column;
}
.hero-bg-grid {
position: absolute; inset: 0; opacity: 0.04;
background-image:
linear-gradient(rgba(255,255,255,.5) 1px, transparent 1px),
linear-gradient(90deg, rgba(255,255,255,.5) 1px, transparent 1px);
background-size: 80px 80px;
}
.hero-bg-dots {
position: absolute; inset: 0; opacity: 0.05;
background-image: radial-gradient(circle, rgba(255,255,255,1) 1px, transparent 1px);
background-size: 40px 40px;
}
.hero-content {
position: relative; z-index: 2; flex: 1;
display: flex; align-items: center; padding: 80px 0 60px;
}
.hero-layout { display: grid; grid-template-columns: 1fr 1fr; gap: 64px; align-items: center; }
.hero-badge {
display: inline-flex; align-items: center; gap: 8px;
background: rgba(255,255,255,.12); border: 1px solid rgba(255,255,255,.2);
color: rgba(255,255,255,.9); font-size: 0.8rem; font-weight: 600;
padding: 6px 14px; border-radius: 100px; margin-bottom: 20px;
backdrop-filter: blur(8px);
}
.hero-badge-dot {
width: 7px; height: 7px; background: #4ade80; border-radius: 50%;
box-shadow: 0 0 8px #4ade80; animation: pulseGreen 2s infinite;
}
@keyframes pulseGreen {
0%,100% { opacity: 1; transform: scale(1); }
50% { opacity: .7; transform: scale(1.3); }
}
.hero-heading {
font-size: clamp(2rem, 4vw, 3rem); font-weight: 900; color: var(--white);
line-height: 1.2; margin-bottom: 8px; letter-spacing: -1px;
}
.hero-heading span { color: var(--primary); display: block; }
.hero-subheading { font-size: 1.1rem; color: rgba(255,255,255,.75); margin-bottom: 32px; }
.hero-buttons { display: flex; gap: 12px; flex-wrap: wrap; }
.hero-trust {
display: flex; align-items: center; gap: 20px; margin-top: 28px; flex-wrap: wrap;
}
.trust-item {
display: flex; align-items: center; gap: 7px;
color: rgba(255,255,255,.8); font-size: 0.85rem; font-weight: 500;
}
.trust-item svg { width: 16px; height: 16px; color: #4ade80; flex-shrink: 0; }
/* Tracking Card */
.hero-card {
background: rgba(255,255,255,.97); border-radius: var(--radius-lg);
padding: 36px; box-shadow: 0 24px 80px rgba(0,0,0,.25);
border: 1px solid rgba(255,255,255,.3);
}
.hero-card-title { font-size: 1.1rem; font-weight: 700; color: var(--gray-900); margin-bottom: 4px; }
.hero-card-subtitle { font-size: 0.85rem; color: var(--gray-500); margin-bottom: 24px; }
.tracking-form { display: flex; flex-direction: column; gap: 14px; }
.tracking-input-wrap { position: relative; }
.tracking-input {
width: 100%; padding: 14px 16px 14px 48px;
border: 1.5px solid var(--gray-300); border-radius: var(--radius-md);
font-size: 0.95rem; font-family: inherit; color: var(--gray-900);
transition: var(--transition); background: var(--white);
direction: ltr; text-align: right;
}
.tracking-input::placeholder { color: var(--gray-400); }
.tracking-input:focus {
outline: none; border-color: var(--primary);
box-shadow: 0 0 0 3px rgba(245,158,11,.15);
}
.tracking-input-icon {
position: absolute; left: 14px; top: 50%; transform: translateY(-50%);
color: var(--gray-400); pointer-events: none;
}
.tracking-input-icon svg { width: 18px; height: 18px; }
.tracking-btn { width: 100%; justify-content: center; padding: 14px; font-size: 1rem; border-radius: var(--radius-md); }
.divider-row {
display: flex; align-items: center; gap: 12px;
color: var(--gray-400); font-size: 0.8rem; margin: 2px 0;
}
.divider-row::before, .divider-row::after {
content: ''; flex: 1; height: 1px; background: var(--gray-200);
}
.hero-card-stats {
display: grid; grid-template-columns: repeat(3, 1fr); gap: 12px;
margin-top: 24px; padding-top: 20px; border-top: 1px solid var(--gray-100);
}
.h-stat { text-align: center; }
.h-stat-num {
font-size: 1.35rem; font-weight: 800; color: var(--primary-dark);
display: block; line-height: 1; margin-bottom: 4px;
}
.h-stat-label { font-size: 0.7rem; color: var(--gray-500); font-weight: 500; }
/* Hero Wave */
.hero-wave { position: relative; z-index: 2; line-height: 0; margin-top: auto; }
.hero-wave svg { display: block; width: 100%; }
/* ─── Section Titles ──────────────────────────────── */
.section-label {
display: inline-flex; align-items: center; gap: 8px;
font-size: 0.78rem; font-weight: 700; color: var(--primary-dark);
text-transform: uppercase; letter-spacing: 1.5px;
background: var(--primary-light); padding: 5px 14px; border-radius: 100px;
margin-bottom: 12px;
}
.section-title {
font-size: clamp(1.6rem, 3vw, 2.2rem); font-weight: 800;
color: var(--gray-900); line-height: 1.25; letter-spacing: -0.5px;
}
.section-title span { color: var(--primary); }
.section-desc { font-size: 1rem; color: var(--gray-500); margin-top: 10px; max-width: 560px; }
.section-line {
display: block; width: 48px; height: 4px;
background: linear-gradient(90deg, var(--primary) 0%, var(--primary-dark) 100%);
border-radius: 2px; margin-top: 12px;
}
.section-head { margin-bottom: 48px; }
.section-head.center { text-align: center; }
.section-head.center .section-desc { margin: 10px auto 0; }
.section-head.center .section-line { margin: 12px auto 0; }
/* ─── Services ────────────────────────────────────── */
.services { padding: 96px 0; background: var(--gray-100); }
.services-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 24px; }
.service-card {
background: var(--white); border-radius: var(--radius-md);
padding: 32px 24px; box-shadow: var(--shadow-sm);
border: 1px solid var(--gray-200);
transition: transform var(--transition), box-shadow var(--transition);
position: relative; overflow: hidden;
}
.service-card::after {
content: ''; position: absolute; bottom: 0; right: 0; left: 0; height: 3px;
background: linear-gradient(90deg, var(--primary) 0%, var(--primary-dark) 100%);
transform: scaleX(0); transform-origin: right; transition: transform var(--transition);
}
.service-card:hover { transform: translateY(-6px); box-shadow: var(--shadow-lg); }
.service-card:hover::after { transform: scaleX(1); }
.service-icon {
width: 56px; height: 56px;
background: linear-gradient(135deg, var(--primary-light) 0%, #fde68a 100%);
border-radius: var(--radius-md); display: flex; align-items: center;
justify-content: center; margin-bottom: 20px; transition: var(--transition);
}
.service-card:hover .service-icon {
background: linear-gradient(135deg, var(--primary) 0%, var(--primary-dark) 100%);
}
.service-icon svg { width: 28px; height: 28px; color: var(--primary-dark); transition: color var(--transition); }
.service-card:hover .service-icon svg { color: var(--white); }
.service-title { font-size: 1rem; font-weight: 700; color: var(--gray-900); margin-bottom: 8px; }
.service-desc { font-size: 0.85rem; color: var(--gray-500); line-height: 1.65; margin-bottom: 18px; }
.service-link {
font-size: 0.85rem; font-weight: 600; color: var(--primary-dark);
display: inline-flex; align-items: center; gap: 5px; transition: gap var(--transition);
}
.service-link:hover { gap: 10px; }
.service-link svg { width: 14px; height: 14px; transform: rotate(180deg); }
/* ─── How It Works ────────────────────────────────── */
.how-it-works { padding: 96px 0; background: var(--white); }
.steps-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 0; position: relative; }
.steps-grid::before {
content: ''; position: absolute; top: 36px; right: 12.5%; left: 12.5%;
height: 2px; background: linear-gradient(90deg, var(--primary) 0%, var(--primary-light) 100%);
z-index: 0;
}
.step-item { text-align: center; padding: 0 16px; position: relative; z-index: 1; }
.step-circle {
width: 72px; height: 72px; border-radius: 50%;
display: flex; align-items: center; justify-content: center;
margin: 0 auto 20px; background: var(--white);
border: 3px solid var(--gray-200); position: relative; transition: var(--transition);
}
.step-item:hover .step-circle { border-color: var(--primary); box-shadow: 0 0 0 8px var(--primary-light); }
.step-num {
position: absolute; top: -6px; left: -6px; width: 22px; height: 22px;
background: var(--primary); color: var(--white); border-radius: 50%;
font-size: 0.65rem; font-weight: 800; display: flex; align-items: center; justify-content: center;
}
.step-circle svg { width: 30px; height: 30px; color: var(--gray-600); transition: color var(--transition); }
.step-item:hover .step-circle svg { color: var(--primary); }
.step-title { font-size: 0.95rem; font-weight: 700; color: var(--gray-900); margin-bottom: 8px; }
.step-desc { font-size: 0.82rem; color: var(--gray-500); line-height: 1.6; }
/* ─── Stats ───────────────────────────────────────── */
.stats {
padding: 80px 0;
background: linear-gradient(135deg, var(--gray-900) 0%, var(--gray-800) 100%);
position: relative; overflow: hidden;
}
.stats::before {
content: ''; position: absolute; inset: 0;
background: radial-gradient(circle at 70% 50%, rgba(245,158,11,.12) 0%, transparent 60%);
}
.stats-grid {
display: grid; grid-template-columns: repeat(4, 1fr); gap: 40px;
position: relative; z-index: 1;
}
.stat-item {
text-align: center; padding: 24px 16px;
border-right: 1px solid rgba(255,255,255,.08);
}
.stat-item:last-child { border-right: none; }
.stat-number {
font-size: 2.8rem; font-weight: 900; color: var(--primary);
line-height: 1; margin-bottom: 6px;
display: flex; align-items: baseline; justify-content: center; gap: 2px;
}
.stat-suffix { font-size: 1.4rem; font-weight: 700; }
.stat-label { font-size: 0.9rem; color: rgba(255,255,255,.7); font-weight: 500; }
.stat-sub { font-size: 0.75rem; color: rgba(255,255,255,.4); margin-top: 4px; }
/* ─── Testimonials ────────────────────────────────── */
.testimonials { padding: 96px 0; background: var(--gray-100); }
.testimonials-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 24px; }
.testimonial-card {
background: var(--white); border-radius: var(--radius-md); padding: 28px;
box-shadow: var(--shadow-sm); border: 1px solid var(--gray-200);
transition: box-shadow var(--transition), transform var(--transition);
}
.testimonial-card:hover { box-shadow: var(--shadow-lg); transform: translateY(-4px); }
.testimonial-stars { display: flex; gap: 3px; margin-bottom: 14px; flex-direction: row-reverse; }
.testimonial-stars svg { width: 16px; height: 16px; color: var(--primary); fill: var(--primary); }
.testimonial-text { font-size: 0.9rem; color: var(--gray-600); line-height: 1.7; margin-bottom: 20px; font-style: italic; }
.testimonial-author { display: flex; align-items: center; gap: 12px; }
.author-avatar {
width: 44px; height: 44px; border-radius: 50%;
display: flex; align-items: center; justify-content: center;
font-size: 1rem; font-weight: 700; color: var(--white); flex-shrink: 0;
}
.author-name { font-size: 0.9rem; font-weight: 700; color: var(--gray-900); }
.author-role { font-size: 0.78rem; color: var(--gray-500); }
/* Client Logos */
.clients-strip { margin-top: 56px; padding-top: 40px; border-top: 1px solid var(--gray-200); }
.clients-label {
text-align: center; font-size: 0.82rem; color: var(--gray-400);
font-weight: 600; letter-spacing: 1px; text-transform: uppercase; margin-bottom: 24px;
}
.clients-logos { display: flex; align-items: center; justify-content: center; gap: 20px; flex-wrap: wrap; }
.client-logo {
display: flex; align-items: center; justify-content: center;
padding: 10px 20px; background: var(--white); border: 1px solid var(--gray-200);
border-radius: var(--radius-sm); opacity: 0.6; transition: opacity var(--transition);
}
.client-logo:hover { opacity: 1; }
.client-logo-text { font-size: 0.9rem; font-weight: 700; color: var(--gray-500); }
/* ─── CTA Section ─────────────────────────────────── */
.cta-section {
padding: 96px 0;
background: linear-gradient(135deg, var(--primary) 0%, var(--primary-dark) 100%);
position: relative; overflow: hidden;
}
.cta-section::before {
content: ''; position: absolute; top: -50%; right: -10%;
width: 500px; height: 500px; border-radius: 50%; background: rgba(255,255,255,.07);
}
.cta-section::after {
content: ''; position: absolute; bottom: -40%; left: 5%;
width: 400px; height: 400px; border-radius: 50%; background: rgba(0,0,0,.06);
}
.cta-inner {
position: relative; z-index: 1; display: grid;
grid-template-columns: 1fr auto; gap: 40px; align-items: center;
}
.cta-heading {
font-size: clamp(1.6rem, 3vw, 2.2rem); font-weight: 800;
color: var(--white); margin-bottom: 10px; line-height: 1.25;
}
.cta-desc { font-size: 1rem; color: rgba(255,255,255,.8); }
.cta-contact { display: flex; flex-direction: column; gap: 10px; }
.cta-contact-item {
display: flex; align-items: center; gap: 10px;
color: rgba(255,255,255,.9); font-size: 0.9rem; font-weight: 500;
}
.cta-contact-item svg { width: 18px; height: 18px; flex-shrink: 0; opacity: .8; }
.cta-buttons { display: flex; gap: 12px; margin-top: 24px; flex-wrap: wrap; }
/* ─── Footer ──────────────────────────────────────── */
.site-footer { background: var(--gray-900); color: rgba(255,255,255,.75); padding: 72px 0 0; }
.footer-grid {
display: grid; grid-template-columns: 1.5fr 1fr 1fr 1fr; gap: 48px;
padding-bottom: 56px; border-bottom: 1px solid rgba(255,255,255,.08);
}
.footer-brand .logo { margin-bottom: 16px; }
.footer-brand .logo-name { color: var(--white); }
.footer-brand .logo-tagline { color: rgba(255,255,255,.4); }
.footer-desc { font-size: 0.85rem; line-height: 1.7; color: rgba(255,255,255,.55); margin-bottom: 20px; }
.footer-social { display: flex; gap: 10px; }
.social-btn {
width: 36px; height: 36px; border-radius: 8px;
background: rgba(255,255,255,.08); border: 1px solid rgba(255,255,255,.1);
display: flex; align-items: center; justify-content: center;
transition: var(--transition); color: rgba(255,255,255,.7);
}
.social-btn:hover { background: var(--primary); border-color: var(--primary); color: var(--white); }
.social-btn svg { width: 16px; height: 16px; }
.footer-col-title {
font-size: 0.9rem; font-weight: 700; color: var(--white);
margin-bottom: 20px; padding-bottom: 10px;
border-bottom: 2px solid var(--primary); display: inline-block;
}
.footer-links { display: flex; flex-direction: column; gap: 10px; }
.footer-links a {
font-size: 0.85rem; color: rgba(255,255,255,.55);
transition: color var(--transition); display: flex; align-items: center; gap: 6px;
}
.footer-links a::before { content: ""; color: var(--primary); font-weight: 700; }
.footer-links a:hover { color: var(--primary); }
.footer-contact-list { display: flex; flex-direction: column; gap: 14px; }
.footer-contact-item {
display: flex; align-items: flex-start; gap: 10px;
font-size: 0.85rem; color: rgba(255,255,255,.55);
}
.footer-contact-item svg { width: 16px; height: 16px; color: var(--primary); flex-shrink: 0; margin-top: 2px; }
.footer-newsletter { margin-top: 16px; }
.newsletter-form { display: flex; gap: 8px; margin-top: 10px; }
.newsletter-input {
flex: 1; padding: 10px 14px; background: rgba(255,255,255,.07);
border: 1px solid rgba(255,255,255,.15); border-radius: var(--radius-sm);
color: var(--white); font-size: 0.85rem; font-family: inherit;
transition: var(--transition); direction: rtl;
}
.newsletter-input::placeholder { color: rgba(255,255,255,.35); }
.newsletter-input:focus { outline: none; border-color: var(--primary); background: rgba(255,255,255,.1); }
.newsletter-btn {
padding: 10px 16px; background: var(--primary); color: var(--white);
border-radius: var(--radius-sm); font-size: 0.85rem; font-weight: 600;
font-family: inherit; transition: var(--transition); white-space: nowrap;
border: none; cursor: pointer;
}
.newsletter-btn:hover { background: var(--primary-dark); }
.footer-bottom {
padding: 20px 0; display: flex; align-items: center;
justify-content: space-between; font-size: 0.8rem; color: rgba(255,255,255,.35);
}
.footer-bottom a { color: var(--primary); }
/* ─── Plugin Shortcode Zones ──────────────────────── */
.plugin-zone {
background: linear-gradient(135deg, var(--primary-light) 0%, #fef9ee 100%);
border: 2px dashed var(--primary); border-radius: var(--radius-md);
padding: 20px 24px; margin-top: 24px; font-size: 0.82rem;
color: var(--primary-dark); font-weight: 600;
}
.plugin-zone-label {
display: flex; align-items: center; gap: 8px; margin-bottom: 8px;
opacity: .65; font-size: 0.73rem; text-transform: uppercase; letter-spacing: 1px;
}
.plugin-zone code {
background: rgba(245,158,11,.15); padding: 3px 8px; border-radius: 4px;
font-family: monospace; font-size: 0.88rem; display: block; margin-top: 6px;
color: var(--gray-800);
}
/* ─── Scroll Top ──────────────────────────────────── */
.scroll-top {
position: fixed; bottom: 24px; right: 24px; width: 44px; height: 44px;
background: var(--primary); color: var(--white); border-radius: var(--radius-sm);
display: flex; align-items: center; justify-content: center;
box-shadow: var(--shadow-amber); opacity: 0; pointer-events: none;
transition: opacity var(--transition), transform var(--transition);
z-index: 500; border: none; cursor: pointer;
}
.scroll-top.visible { opacity: 1; pointer-events: all; }
.scroll-top:hover { transform: translateY(-3px); }
.scroll-top svg { width: 20px; height: 20px; }
/* ─── Animations ──────────────────────────────────── */
.reveal { opacity: 0; transform: translateY(24px); transition: opacity 0.55s ease, transform 0.55s ease; }
.reveal.visible { opacity: 1; transform: translateY(0); }
.reveal-d1 { transition-delay: 0.1s; }
.reveal-d2 { transition-delay: 0.2s; }
.reveal-d3 { transition-delay: 0.3s; }
.reveal-d4 { transition-delay: 0.4s; }
.hero-text-anim { animation: heroUp .7s .1s ease both; }
.hero-card-anim { animation: heroUp .7s .3s ease both; }
@keyframes heroUp {
from { opacity: 0; transform: translateY(32px); }
to { opacity: 1; transform: translateY(0); }
}
/*
ADMIN BAR OFFSET (WordPress Fix)
*/
/* Desktop: Admin Bar 32px */
.admin-bar .site-header {
top: 32px;
}
.admin-bar .mobile-drawer {
top: 104px; /* 72px header + 32px admin bar */
}
.admin-bar .hero {
padding-top: 104px; /* 72px + 32px */
}
/* Mobile: Admin Bar 46px */
@media screen and (max-width: 782px) {
.admin-bar .site-header {
top: 46px;
}
.admin-bar .mobile-drawer {
top: 118px; /* 72px + 46px */
}
.admin-bar .hero {
padding-top: 118px; /* 72px + 46px */
}
}
/* برای صفحات غیر hero (مثل صفحات داخلی) */
.admin-bar .site-main > *:first-child:not(.hero) {
padding-top: 72px;
}
/* هماهنگی Admin Bar با تم IFNEX */
#wpadminbar {
background: var(--gray-900) !important;
}
#wpadminbar .ab-top-menu > li > .ab-item {
color: rgba(255,255,255,.7) !important;
}
#wpadminbar .ab-top-menu > li:hover > .ab-item,
#wpadminbar .ab-top-menu > li > .ab-item:focus {
background: var(--primary-dark) !important;
color: var(--white) !important;
}
#wpadminbar .ab-top-menu > li.hover > .ab-item,
#wpadminbar .ab-top-menu > li > .ab-item:hover {
background: var(--primary-dark) !important;
color: var(--white) !important;
}
/* ─── Responsive ──────────────────────────────────── */
@media (max-width: 1024px) {
.services-grid { grid-template-columns: repeat(2, 1fr); }
.steps-grid::before { display: none; }
.steps-grid { grid-template-columns: repeat(2, 1fr); gap: 32px; }
.stats-grid { grid-template-columns: repeat(2, 1fr); gap: 0; }
.stat-item { border-right: none; border-bottom: 1px solid rgba(255,255,255,.08); }
.stat-item:nth-child(odd) { border-right: 1px solid rgba(255,255,255,.08); }
.testimonials-grid { grid-template-columns: repeat(2, 1fr); }
.footer-grid { grid-template-columns: 1fr 1fr; gap: 32px; }
.cta-inner { grid-template-columns: 1fr; gap: 24px; }
.hero-layout { gap: 36px; }
}
@media (max-width: 768px) {
.header-actions .btn-secondary { display: none; }
.main-nav { display: none; }
.hamburger { display: flex; }
.mobile-drawer { display: flex; }
.hero-layout { grid-template-columns: 1fr; gap: 32px; }
.hero-content { padding: 40px 0 32px; }
.hero-card { padding: 24px; }
.services-grid { grid-template-columns: 1fr; gap: 16px; }
.steps-grid { grid-template-columns: 1fr; gap: 24px; }
.stats-grid { grid-template-columns: repeat(2, 1fr); }
.testimonials-grid { grid-template-columns: 1fr; }
.footer-grid { grid-template-columns: 1fr; gap: 28px; }
.footer-bottom { flex-direction: column; gap: 8px; text-align: center; }
.clients-logos { gap: 12px; }
.cta-buttons { flex-direction: column; }
.cta-buttons .btn { justify-content: center; }
.services, .how-it-works, .testimonials, .cta-section { padding: 64px 0; }
.stats { padding: 56px 0; }
}
@media (max-width: 480px) {
.hero-trust { flex-direction: column; align-items: flex-start; gap: 10px; }
.hero-card-stats { grid-template-columns: 1fr; }
.stat-number { font-size: 2.2rem; }
.cta-section { padding: 56px 0; }
}

View File

@ -0,0 +1,28 @@
<section class="cta-section" id="contact">
<div class="container">
<div class="cta-inner">
<div>
<h2 class="cta-heading"><?php echo esc_html(ifnex_get_option('cta_title', 'آماده ارسال مرسوله هستید؟')); ?></h2>
<p class="cta-desc"><?php echo esc_html(ifnex_get_option('cta_desc', 'همین امروز با ما تماس بگیرید یا حساب کاربری رایگان بسازید')); ?></p>
<div class="cta-buttons">
<a href="<?php echo esc_url(ifnex_get_option('order_url', '#')); ?>" class="btn btn-white btn-lg">شروع رایگان</a>
<a href="tel:<?php echo esc_attr(str_replace(' ', '', ifnex_get_option('phone', '+982100000000'))); ?>" class="btn btn-outline-white btn-lg">تماس با ما</a>
</div>
</div>
<div class="cta-contact">
<div class="cta-contact-item">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6 19.79 19.79 0 0 1-3.07-8.67A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72c.127.96.361 1.903.7 2.81a2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45c.907.339 1.85.573 2.81.7A2 2 0 0 1 22 16.92z"/></svg>
<?php echo esc_html(ifnex_get_option('phone', '+98 21 0000 0000')); ?>
</div>
<div class="cta-contact-item">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M4 4h16c1.1 0 2 .9 2 2v12c0 1.1-.9 2-2 2H4c-1.1 0-2-.9-2-2V6c0-1.1.9-2 2-2z"/><polyline points="22,6 12,13 2,6"/></svg>
<?php echo esc_html(ifnex_get_option('email', 'info@ifnex.com')); ?>
</div>
<div class="cta-contact-item">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M21 10c0 7-9 13-9 13s-9-6-9-13a9 9 0 0 1 18 0z"/><circle cx="12" cy="10" r="3"/></svg>
<?php echo esc_html(ifnex_get_option('address', 'تهران، ایران')); ?>
</div>
</div>
</div>
</div>
</section>

View File

@ -0,0 +1,80 @@
<section class="hero" id="hero">
<div class="hero-bg-grid"></div>
<div class="hero-bg-dots"></div>
<div class="hero-content">
<div class="container">
<div class="hero-layout">
<!-- Text -->
<div class="hero-text hero-text-anim">
<div class="hero-badge">
<span class="hero-badge-dot"></span>
آنلاین و فعال · خدمات ۲۴/۷
</div>
<h1 class="hero-heading">
<?php echo esc_html(ifnex_get_option('hero_title', 'ارسال مرسوله به سراسر جهان')); ?>
<span>Fast, Secure & Reliable Global Shipping</span>
</h1>
<p class="hero-subheading"><?php echo esc_html(ifnex_get_option('hero_subtitle', 'سریع، امن و قابل اعتماد — از ایران به هر نقطه از دنیا')); ?></p>
<div class="hero-buttons">
<a href="#tracking" class="btn btn-white btn-lg">ردیابی مرسوله</a>
<a href="<?php echo esc_url(ifnex_get_option('order_url', '#')); ?>" class="btn btn-outline-white btn-lg">شروع ارسال</a>
</div>
<div class="hero-trust">
<div class="trust-item">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="20 6 9 17 4 12"/></svg>
بیش از ۵۰۰ کسب‌وکار فعال
</div>
<div class="trust-item">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="20 6 9 17 4 12"/></svg>
پشتیبانی ۲۴ ساعته
</div>
<div class="trust-item">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="20 6 9 17 4 12"/></svg>
بیمه کامل مرسولات
</div>
</div>
</div>
<!-- Tracking Card -->
<div class="hero-card hero-card-anim" id="tracking">
<h2 class="hero-card-title">ردیابی مرسوله</h2>
<p class="hero-card-subtitle">شماره AWB یا بارنامه خود را وارد کنید</p>
<!-- شورت‌کد IFNEX Bridge -->
<?php echo do_shortcode('[ifnex_tracking_form]'); ?>
<div class="divider-row">یا</div>
<a href="<?php echo esc_url(ifnex_get_option('order_url', '#')); ?>" class="btn btn-secondary" style="justify-content:center;">ثبت سفارش جدید</a>
<a href="#" class="btn btn-secondary" style="justify-content:center;">محاسبه هزینه ارسال</a>
<div class="hero-card-stats">
<div class="h-stat">
<span class="h-stat-num">+<?php echo esc_html(ifnex_get_option('stat_countries', '۱۵۰')); ?></span>
<span class="h-stat-label">کشور مقصد</span>
</div>
<div class="h-stat">
<span class="h-stat-num">+<?php echo esc_html(ifnex_get_option('stat_clients', '۵۰۰')); ?></span>
<span class="h-stat-label">مشتری فعال</span>
</div>
<div class="h-stat">
<span class="h-stat-num"><?php echo esc_html(ifnex_get_option('stat_satisfaction', '۹۸٪')); ?></span>
<span class="h-stat-label">رضایتمندی</span>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Wave -->
<div class="hero-wave">
<svg viewBox="0 0 1440 100" preserveAspectRatio="none" style="height:80px;">
<path d="M0,60 C360,100 720,0 1080,60 C1260,90 1380,70 1440,60 L1440,100 L0,100 Z" fill="#f3f4f6"/>
</svg>
</div>
</section>

View File

@ -0,0 +1,40 @@
<section class="how-it-works" id="how-it-works">
<div class="container">
<div class="section-head center reveal">
<span class="section-label">نحوه کار</span>
<h2 class="section-title">در چهار گام ساده <span>ارسال کنید</span></h2>
<p class="section-desc">فرآیند ارسال مرسوله با IFNEX سریع، شفاف و کاملاً آنلاین است</p>
<span class="section-line"></span>
</div>
<div class="steps-grid">
<?php
$steps = [
['num' => '۱', 'title' => 'ثبت‌نام رایگان', 'desc' => 'حساب کاربری خود را در کمتر از یک دقیقه بسازید و به پنل مدیریت دسترسی پیدا کنید.', 'icon' => 'user'],
['num' => '۲', 'title' => 'ثبت سفارش', 'desc' => 'اطلاعات فرستنده، گیرنده و مشخصات بسته را وارد کنید و بهترین سرویس را انتخاب نمایید.', 'icon' => 'edit'],
['num' => '۳', 'title' => 'پرداخت آنلاین', 'desc' => 'هزینه ارسال را از طریق درگاه امن یا کیف پول IFNEX پرداخت کنید و رسید دریافت نمایید.', 'icon' => 'card'],
['num' => '۴', 'title' => 'ردیابی آنی', 'desc' => 'با شماره AWB اختصاصی، مسیر مرسوله خود را در هر لحظه پیگیری کنید.', 'icon' => 'map'],
];
foreach ($steps as $i => $step) :
?>
<div class="step-item reveal reveal-d<?php echo $i + 1; ?>">
<div class="step-circle">
<span class="step-num"><?php echo esc_html($step['num']); ?></span>
<?php if ($step['icon'] === 'user') : ?>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2"/><circle cx="12" cy="7" r="4"/></svg>
<?php elseif ($step['icon'] === 'edit') : ?>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"/><path d="M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z"/></svg>
<?php elseif ($step['icon'] === 'card') : ?>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="1" y="4" width="22" height="16" rx="2" ry="2"/><line x1="1" y1="10" x2="23" y2="10"/></svg>
<?php else : ?>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polygon points="3 11 22 2 13 21 11 13 3 11"/></svg>
<?php endif; ?>
</div>
<h3 class="step-title"><?php echo esc_html($step['title']); ?></h3>
<p class="step-desc"><?php echo esc_html($step['desc']); ?></p>
</div>
<?php endforeach; ?>
</div>
</div>
</section>

View File

@ -0,0 +1,43 @@
<section class="services" id="services">
<div class="container">
<div class="section-head center reveal">
<span class="section-label">خدمات ما</span>
<h2 class="section-title">راه‌حل‌های جامع <span>لجستیک</span></h2>
<p class="section-desc">از ارسال بین‌المللی تا ردیابی لحظه‌ای همه چیز در یک پلتفرم یکپارچه</p>
<span class="section-line"></span>
</div>
<div class="services-grid">
<?php
$services = [
['title' => 'ارسال بین‌المللی (صادرات)', 'desc' => 'ارسال مرسولات تجاری و شخصی به بیش از ۱۵۰ کشور جهان با سریع‌ترین مسیرهای هوایی و زمینی.', 'icon' => 'globe'],
['title' => 'ارسال داخلی (واردات)', 'desc' => 'دریافت مرسولات از سراسر دنیا و تحویل سریع در ایران با سیستم ردیابی دقیق و بیمه کامل.', 'icon' => 'download'],
['title' => 'سفارش آنلاین', 'desc' => 'ثبت سفارش ارسال به صورت آنلاین، پرداخت امن، و پیگیری لحظه‌ای از طریق پنل کاربری اختصاصی.', 'icon' => 'cart'],
['title' => 'ردیابی مرسوله', 'desc' => 'ردیابی آنی مرسولات با شماره AWB — از لحظه تحویل تا رسیدن به مقصد، هر گام را ببینید.', 'icon' => 'tracking'],
];
foreach ($services as $i => $service) :
?>
<div class="service-card reveal reveal-d<?php echo $i + 1; ?>">
<div class="service-icon">
<?php if ($service['icon'] === 'globe') : ?>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="10"/><line x1="2" y1="12" x2="22" y2="12"/><path d="M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z"/></svg>
<?php elseif ($service['icon'] === 'download') : ?>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"/><polyline points="7 10 12 15 17 10"/><line x1="12" y1="15" x2="12" y2="3"/></svg>
<?php elseif ($service['icon'] === 'cart') : ?>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="9" cy="21" r="1"/><circle cx="20" cy="21" r="1"/><path d="M1 1h4l2.68 13.39a2 2 0 0 0 2 1.61h9.72a2 2 0 0 0 2-1.61L23 6H6"/></svg>
<?php else : ?>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="22 12 18 12 15 21 9 3 6 12 2 12"/></svg>
<?php endif; ?>
</div>
<h3 class="service-title"><?php echo esc_html($service['title']); ?></h3>
<p class="service-desc"><?php echo esc_html($service['desc']); ?></p>
<a href="#" class="service-link">
بیشتر بدانید
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="19" y1="12" x2="5" y2="12"/><polyline points="12 19 5 12 12 5"/></svg>
</a>
</div>
<?php endforeach; ?>
</div>
</div>
</section>

View File

@ -0,0 +1,26 @@
<section class="stats">
<div class="container">
<div class="stats-grid">
<div class="stat-item reveal">
<div class="stat-number"><span class="stat-suffix">+</span><?php echo esc_html(ifnex_get_option('stat_years', '۱۰')); ?></div>
<div class="stat-label">سال تجربه</div>
<div class="stat-sub">Years of Experience</div>
</div>
<div class="stat-item reveal reveal-d1">
<div class="stat-number"><span class="stat-suffix">+</span><?php echo esc_html(ifnex_get_option('stat_countries', '۱۵۰')); ?></div>
<div class="stat-label">کشور مقصد</div>
<div class="stat-sub">Countries Served</div>
</div>
<div class="stat-item reveal reveal-d2">
<div class="stat-number"><span class="stat-suffix">+</span><?php echo esc_html(ifnex_get_option('stat_packages', '۱۰,۰۰۰')); ?></div>
<div class="stat-label">مرسوله تحویل‌شده</div>
<div class="stat-sub">Packages Delivered</div>
</div>
<div class="stat-item reveal reveal-d3">
<div class="stat-number"><?php echo esc_html(ifnex_get_option('stat_satisfaction', '۹۸')); ?><span class="stat-suffix">٪</span></div>
<div class="stat-label">رضایت مشتریان</div>
<div class="stat-sub">Customer Satisfaction</div>
</div>
</div>
</div>
</section>

View File

@ -0,0 +1,50 @@
<section class="testimonials">
<div class="container">
<div class="section-head center reveal">
<span class="section-label">نظر مشتریان</span>
<h2 class="section-title">آنچه مشتریان ما <span>می‌گویند</span></h2>
<p class="section-desc">بیش از ۵۰۰ کسب‌وکار به IFNEX اعتماد کرده‌اند</p>
<span class="section-line"></span>
</div>
<div class="testimonials-grid">
<?php
$testimonials = [
['text' => 'با IFNEX ارسال بین‌المللی کالاهایمان به اروپا خیلی ساده‌تر شد. پنل آنلاین عالی است و پیگیری لحظه‌ای واقعاً کمک می‌کند.', 'name' => 'محمد رضایی', 'role' => 'مدیر صادرات، شرکت تجاری نیلوفر', 'color' => '#f59e0b'],
['text' => 'پشتیبانی IFNEX فوق‌العاده است. هر بار که سوال داشتم سریع جواب گرفتم. قیمت‌ها هم رقابتی هستند.', 'name' => 'سارا احمدی', 'role' => 'کارآفرین، فروشگاه اینترنتی', 'color' => '#059669'],
['text' => 'ادغام IFNEX Bridge با وردپرس خیلی راحت بود. سیستم ردیابی و کیف پول به طور خودکار در سایتم نمایش داده می‌شود.', 'name' => 'علی کریمی', 'role' => 'توسعه‌دهنده وردپرس', 'color' => '#2563eb'],
];
foreach ($testimonials as $i => $t) :
?>
<div class="testimonial-card reveal reveal-d<?php echo $i + 1; ?>">
<div class="testimonial-stars">
<?php for ($s = 0; $s < 5; $s++) : ?>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><polygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2"/></svg>
<?php endfor; ?>
</div>
<p class="testimonial-text">"<?php echo esc_html($t['text']); ?>"</p>
<div class="testimonial-author">
<div class="author-avatar" style="background:<?php echo $t['color']; ?>;"><?php echo mb_substr($t['name'], 0, 1, 'fa'); ?></div>
<div>
<div class="author-name"><?php echo esc_html($t['name']); ?></div>
<div class="author-role"><?php echo esc_html($t['role']); ?></div>
</div>
</div>
</div>
<?php endforeach; ?>
</div>
<!-- Client Logos -->
<div class="clients-strip reveal">
<div class="clients-label">مورد اعتماد کسب‌وکارهای برتر</div>
<div class="clients-logos">
<div class="client-logo"><span class="client-logo-text">TradeCo</span></div>
<div class="client-logo"><span class="client-logo-text">NiloofarEx</span></div>
<div class="client-logo"><span class="client-logo-text">ParsShip</span></div>
<div class="client-logo"><span class="client-logo-text">IranTrade</span></div>
<div class="client-logo"><span class="client-logo-text">GlobeCargo</span></div>
</div>
</div>
</div>
</section>

View File

@ -120,7 +120,10 @@ function render_block_core_latest_comments( $attributes ) {
}
$list_items_markup .= '</footer>';
if ( 'full' === $display_content ) {
$list_items_markup .= '<div class="wp-block-latest-comments__comment-excerpt">' . wpautop( get_comment_text( $comment ) ) . '</div>';
$comment_text = post_password_required( $comment->comment_post_ID )
? __( 'Password protected' )
: get_comment_text( $comment );
$list_items_markup .= '<div class="wp-block-latest-comments__comment-excerpt">' . wpautop( $comment_text ) . '</div>';
} elseif ( 'excerpt' === $display_content ) {
$list_items_markup .= '<div class="wp-block-latest-comments__comment-excerpt">' . wpautop( get_comment_excerpt( $comment ) ) . '</div>';
}

View File

@ -56,8 +56,18 @@ function render_block_core_post_content( $attributes, $content, $block ) {
$tag_name = 'div';
if ( ! empty( $attributes['tagName'] ) && tag_escape( $attributes['tagName'] ) === $attributes['tagName'] ) {
$tag_name = $attributes['tagName'];
if ( isset( $attributes['tagName'] ) && is_string( $attributes['tagName'] ) ) {
/**
* The allowed tag names match the options offered in the editor.
*
* @see packages/block-library/src/post-content/edit.js
*/
$allowed_tag_names = array( 'div', 'main', 'section', 'article' );
$normalized_tag_name = strtolower( $attributes['tagName'] );
if ( in_array( $normalized_tag_name, $allowed_tag_names, true ) ) {
$tag_name = $normalized_tag_name;
}
}
$wrapper_attributes = get_block_wrapper_attributes( array( 'class' => 'entry-content' ) );

View File

@ -81,10 +81,10 @@ function render_block_core_post_date( $attributes, $content, $block ) {
$wrapper_attributes = get_block_wrapper_attributes( array( 'class' => implode( ' ', $classes ) ) );
$time_tag = sprintf( '<time datetime="%1$s">%2$s</time>', $unformatted_date, $formatted_date );
$time_tag = sprintf( '<time datetime="%1$s">%2$s</time>', esc_attr( $unformatted_date ), esc_html( $formatted_date ) );
if ( isset( $attributes['isLink'] ) && $attributes['isLink'] && isset( $block->context['postId'] ) ) {
$time_tag = sprintf( '<a href="%1s">%2s</a>', get_the_permalink( $block->context['postId'] ), $time_tag );
$time_tag = sprintf( '<a href="%1$s">%2$s</a>', esc_url( get_the_permalink( $block->context['postId'] ) ), $time_tag );
}
return sprintf( '<div %1$s>%2$s</div>', $wrapper_attributes, $time_tag );

View File

@ -985,7 +985,7 @@ function redirect_guess_404_permalink() {
if ( empty( $post_types ) ) {
return false;
}
$where .= " AND post_type IN ('" . join( "', '", esc_sql( get_query_var( 'post_type' ) ) ) . "')";
$where .= " AND post_type IN ('" . join( "', '", esc_sql( $post_types ) ) . "')";
} else {
if ( ! in_array( get_query_var( 'post_type' ), $publicly_viewable_post_types, true ) ) {
return false;

View File

@ -2815,11 +2815,11 @@ class WP_Query {
if ( $this->is_comment_feed && ! $this->is_singular ) {
if ( $this->is_archive || $this->is_search ) {
$cjoin = "JOIN {$wpdb->posts} ON ( {$wpdb->comments}.comment_post_ID = {$wpdb->posts}.ID ) $join ";
$cwhere = "WHERE comment_approved = '1' $where";
$cwhere = "WHERE comment_approved = '1' AND {$wpdb->comments}.comment_type != 'note' $where";
$cgroupby = "{$wpdb->comments}.comment_id";
} else { // Other non-singular, e.g. front.
$cjoin = "JOIN {$wpdb->posts} ON ( {$wpdb->comments}.comment_post_ID = {$wpdb->posts}.ID )";
$cwhere = "WHERE ( post_status = 'publish' OR ( post_status = 'inherit' AND post_type = 'attachment' ) ) AND comment_approved = '1'";
$cwhere = "WHERE ( post_status = 'publish' OR ( post_status = 'inherit' AND post_type = 'attachment' ) ) AND comment_approved = '1' AND {$wpdb->comments}.comment_type != 'note'";
$cgroupby = '';
}
@ -3477,7 +3477,7 @@ class WP_Query {
$cjoin = apply_filters_ref_array( 'comment_feed_join', array( '', &$this ) );
/** This filter is documented in wp-includes/class-wp-query.php */
$cwhere = apply_filters_ref_array( 'comment_feed_where', array( "WHERE comment_post_ID = '{$this->posts[0]->ID}' AND comment_approved = '1'", &$this ) );
$cwhere = apply_filters_ref_array( 'comment_feed_where', array( "WHERE comment_post_ID = '{$this->posts[0]->ID}' AND comment_approved = '1' AND {$wpdb->comments}.comment_type != 'note'", &$this ) );
/** This filter is documented in wp-includes/class-wp-query.php */
$cgroupby = apply_filters_ref_array( 'comment_feed_groupby', array( '', &$this ) );

View File

@ -1058,15 +1058,16 @@ class WP_Script_Modules {
* The data for a given Script Module, if provided, will be JSON serialized in a script
* tag with an ID of the form `wp-script-module-data-{$module_id}`.
*
* The data can be read on the client with a pattern like this:
* The data can be read on the client with a pattern like the following; you are encouraged
* to use this pattern _verbatim_ to avoid common pitfalls or vulnerabilities:
*
* Example:
*
* const dataContainer = document.getElementById( 'wp-script-module-data-MyScriptModuleID' );
* const dataContainer = document.querySelector( 'script[id="wp-script-module-data-MyScriptModuleID"]' );
* let data = {};
* if ( dataContainer ) {
* if ( dataContainer instanceof HTMLScriptElement ) {
* try {
* data = JSON.parse( dataContainer.textContent );
* data = JSON.parse( dataContainer.text );
* } catch {}
* }
* // data.dataForClient === 'ok';

View File

@ -595,9 +595,30 @@ function wp_http_validate_url( $url ) {
}
if ( $ip ) {
$parts = array_map( 'intval', explode( '.', $ip ) );
if ( 127 === $parts[0] || 10 === $parts[0] || 0 === $parts[0]
|| ( 172 === $parts[0] && 16 <= $parts[1] && 31 >= $parts[1] )
|| ( 192 === $parts[0] && 168 === $parts[1] )
/*
* These IP address ranges are not considered valid external hosts for HTTP requests.
*
* If the host resolves to an IP address in these ranges, the request will be rejected unless the 'http_request_host_is_external' filter allows it.
*
* References:
*
* - IPv4 Special-Purpose Address Space: https://www.iana.org/assignments/iana-ipv4-special-registry/iana-ipv4-special-registry.xhtml
* - IPv4 Multicast Address Assignments: https://www.rfc-editor.org/rfc/rfc5771.html
*/
if ( 127 === $parts[0] || 10 === $parts[0] || 0 === $parts[0] // 127.0.0.0/8 (loopback), 10.0.0.0/8 (private), 0.0.0.0/8 (this network).
|| ( 172 === $parts[0] && 16 <= $parts[1] && 31 >= $parts[1] ) // 172.16.0.0/12 (private).
|| ( 192 === $parts[0] && 168 === $parts[1] ) // 192.168.0.0/16 (private).
|| ( 192 === $parts[0] && 0 === $parts[1] && 0 === $parts[2] ) // 192.0.0.0/24 (IETF protocol assignments).
|| ( 192 === $parts[0] && 0 === $parts[1] && 2 === $parts[2] ) // 192.0.2.0/24 (TEST-NET-1).
|| ( 192 === $parts[0] && 88 === $parts[1] && 99 === $parts[2] ) // 192.88.99.0/24 (6to4 relay anycast).
|| ( 198 === $parts[0] && 51 === $parts[1] && 100 === $parts[2] ) // 198.51.100.0/24 (TEST-NET-2).
|| ( 203 === $parts[0] && 0 === $parts[1] && 113 === $parts[2] ) // 203.0.113.0/24 (TEST-NET-3).
|| ( 169 === $parts[0] && 254 === $parts[1] ) // 169.254.0.0/16 (link-local and cloud metadata).
|| ( 100 === $parts[0] && 64 <= $parts[1] && 127 >= $parts[1] ) // 100.64.0.0/10 (CGNAT).
|| ( 198 === $parts[0] && 18 <= $parts[1] && 19 >= $parts[1] ) // 198.18.0.0/15 (benchmarking).
|| ( 224 <= $parts[0] && 239 >= $parts[0] ) // 224.0.0.0/4 (multicast).
|| 240 <= $parts[0] // 240.0.0.0/4 (reserved, includes 255.255.255.255 broadcast).
) {
// If host appears local, reject unless specifically allowed.
/**

View File

@ -16,9 +16,12 @@
* @property {?string} source.wpemoji
*/
const settings = /** @type {WPEmojiSettings} */ (
JSON.parse( document.getElementById( 'wp-emoji-settings' ).textContent )
);
const selector = 'script#wp-emoji-settings';
const script = document.querySelector( selector );
if ( ! ( script instanceof HTMLScriptElement ) ) {
throw new Error( `Element missing: ${ selector }`);
}
const settings = /** @type {WPEmojiSettings} */ ( JSON.parse( script.text ) );
// For compatibility with other scripts that read from this global, in particular wp-includes/js/wp-emoji.js (source file: js/_enqueues/wp/emoji.js).
window._wpemojiSettings = settings;

View File

@ -1,2 +1,2 @@
/*! This file is auto-generated */
const a=JSON.parse(document.getElementById("wp-emoji-settings").textContent),o=(window._wpemojiSettings=a,"wpEmojiSettingsSupports"),s=["flag","emoji"];function i(e){try{var t={supportTests:e,timestamp:(new Date).valueOf()};sessionStorage.setItem(o,JSON.stringify(t))}catch(e){}}function c(e,t,n){e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(t,0,0);t=new Uint32Array(e.getImageData(0,0,e.canvas.width,e.canvas.height).data);e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(n,0,0);const a=new Uint32Array(e.getImageData(0,0,e.canvas.width,e.canvas.height).data);return t.every((e,t)=>e===a[t])}function p(e,t){e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(t,0,0);var n=e.getImageData(16,16,1,1);for(let e=0;e<n.data.length;e++)if(0!==n.data[e])return!1;return!0}function u(e,t,n,a){switch(t){case"flag":return n(e,"\ud83c\udff3\ufe0f\u200d\u26a7\ufe0f","\ud83c\udff3\ufe0f\u200b\u26a7\ufe0f")?!1:!n(e,"\ud83c\udde8\ud83c\uddf6","\ud83c\udde8\u200b\ud83c\uddf6")&&!n(e,"\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc65\udb40\udc6e\udb40\udc67\udb40\udc7f","\ud83c\udff4\u200b\udb40\udc67\u200b\udb40\udc62\u200b\udb40\udc65\u200b\udb40\udc6e\u200b\udb40\udc67\u200b\udb40\udc7f");case"emoji":return!a(e,"\ud83e\u1fac8")}return!1}function f(e,t,n,a){let r;const o=(r="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?new OffscreenCanvas(300,150):document.createElement("canvas")).getContext("2d",{willReadFrequently:!0}),s=(o.textBaseline="top",o.font="600 32px Arial",{});return e.forEach(e=>{s[e]=t(o,e,n,a)}),s}function r(e){var t=document.createElement("script");t.src=e,t.defer=!0,document.head.appendChild(t)}a.supports={everything:!0,everythingExceptFlag:!0},new Promise(t=>{let n=function(){try{var e=JSON.parse(sessionStorage.getItem(o));if("object"==typeof e&&"number"==typeof e.timestamp&&(new Date).valueOf()<e.timestamp+604800&&"object"==typeof e.supportTests)return e.supportTests}catch(e){}return null}();if(!n){if("undefined"!=typeof Worker&&"undefined"!=typeof OffscreenCanvas&&"undefined"!=typeof URL&&URL.createObjectURL&&"undefined"!=typeof Blob)try{var e="postMessage("+f.toString()+"("+[JSON.stringify(s),u.toString(),c.toString(),p.toString()].join(",")+"));",a=new Blob([e],{type:"text/javascript"});const r=new Worker(URL.createObjectURL(a),{name:"wpTestEmojiSupports"});return void(r.onmessage=e=>{i(n=e.data),r.terminate(),t(n)})}catch(e){}i(n=f(s,u,c,p))}t(n)}).then(e=>{for(const n in e)a.supports[n]=e[n],a.supports.everything=a.supports.everything&&a.supports[n],"flag"!==n&&(a.supports.everythingExceptFlag=a.supports.everythingExceptFlag&&a.supports[n]);var t;a.supports.everythingExceptFlag=a.supports.everythingExceptFlag&&!a.supports.flag,a.supports.everything||((t=a.source||{}).concatemoji?r(t.concatemoji):t.wpemoji&&t.twemoji&&(r(t.twemoji),r(t.wpemoji)))});
var e="script#wp-emoji-settings",t=document.querySelector(e);if(!(t instanceof HTMLScriptElement))throw new Error("Element missing: "+e);const r=JSON.parse(t.text),s=(window._wpemojiSettings=r,"wpEmojiSettingsSupports"),o=["flag","emoji"];function i(e){try{var t={supportTests:e,timestamp:(new Date).valueOf()};sessionStorage.setItem(s,JSON.stringify(t))}catch(e){}}function c(e,t,n){e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(t,0,0);t=new Uint32Array(e.getImageData(0,0,e.canvas.width,e.canvas.height).data);e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(n,0,0);const r=new Uint32Array(e.getImageData(0,0,e.canvas.width,e.canvas.height).data);return t.every((e,t)=>e===r[t])}function p(e,t){e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(t,0,0);var n=e.getImageData(16,16,1,1);for(let e=0;e<n.data.length;e++)if(0!==n.data[e])return!1;return!0}function u(e,t,n,r){switch(t){case"flag":return n(e,"\ud83c\udff3\ufe0f\u200d\u26a7\ufe0f","\ud83c\udff3\ufe0f\u200b\u26a7\ufe0f")?!1:!n(e,"\ud83c\udde8\ud83c\uddf6","\ud83c\udde8\u200b\ud83c\uddf6")&&!n(e,"\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc65\udb40\udc6e\udb40\udc67\udb40\udc7f","\ud83c\udff4\u200b\udb40\udc67\u200b\udb40\udc62\u200b\udb40\udc65\u200b\udb40\udc6e\u200b\udb40\udc67\u200b\udb40\udc7f");case"emoji":return!r(e,"\ud83e\u1fac8")}return!1}function f(e,t,n,r){let a;const s=(a="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?new OffscreenCanvas(300,150):document.createElement("canvas")).getContext("2d",{willReadFrequently:!0}),o=(s.textBaseline="top",s.font="600 32px Arial",{});return e.forEach(e=>{o[e]=t(s,e,n,r)}),o}function a(e){var t=document.createElement("script");t.src=e,t.defer=!0,document.head.appendChild(t)}r.supports={everything:!0,everythingExceptFlag:!0},new Promise(t=>{let n=function(){try{var e=JSON.parse(sessionStorage.getItem(s));if("object"==typeof e&&"number"==typeof e.timestamp&&(new Date).valueOf()<e.timestamp+604800&&"object"==typeof e.supportTests)return e.supportTests}catch(e){}return null}();if(!n){if("undefined"!=typeof Worker&&"undefined"!=typeof OffscreenCanvas&&"undefined"!=typeof URL&&URL.createObjectURL&&"undefined"!=typeof Blob)try{var e="postMessage("+f.toString()+"("+[JSON.stringify(o),u.toString(),c.toString(),p.toString()].join(",")+"));",r=new Blob([e],{type:"text/javascript"});const a=new Worker(URL.createObjectURL(r),{name:"wpTestEmojiSupports"});return void(a.onmessage=e=>{i(n=e.data),a.terminate(),t(n)})}catch(e){}i(n=f(o,u,c,p))}t(n)}).then(e=>{for(const n in e)r.supports[n]=e[n],r.supports.everything=r.supports.everything&&r.supports[n],"flag"!==n&&(r.supports.everythingExceptFlag=r.supports.everythingExceptFlag&&r.supports[n]);var t;r.supports.everythingExceptFlag=r.supports.everythingExceptFlag&&!r.supports.flag,r.supports.everything||((t=r.source||{}).concatemoji?a(t.concatemoji):t.wpemoji&&t.twemoji&&(a(t.twemoji),a(t.wpemoji)))});

View File

@ -2856,11 +2856,16 @@ function safecss_filter_attr( $css, $deprecated = '' ) {
$css_test_string
);
// Bail if the recursive function stripping hit a PCRE error (e.g. stack/backtrack limit).
if ( null === $css_test_string ) {
continue;
}
/*
* Disallow CSS containing \ ( & } = or comments, except for within url(), var(), calc(), etc.
* which were removed from the test string above.
*/
$allow_css = ! preg_match( '%[\\\(&=}]|/\*%', $css_test_string );
$allow_css = 0 === preg_match( '%[\\\(&=}]|/\*%', $css_test_string );
/**
* Filters the check for unsafe CSS in `safecss_filter_attr`.

View File

@ -186,7 +186,7 @@ function wp_authenticate_username_password(
sprintf(
/* translators: %s: User name. */
__( '<strong>Error:</strong> The username <strong>%s</strong> is not registered on this site. If you are unsure of your username, try your email address instead.' ),
$username
esc_html( $username )
)
);
}
@ -213,7 +213,7 @@ function wp_authenticate_username_password(
sprintf(
/* translators: %s: User name. */
__( '<strong>Error:</strong> The password you entered for the username %s is incorrect.' ),
'<strong>' . $username . '</strong>'
'<strong>' . esc_html( $username ) . '</strong>'
) .
' <a href="' . wp_lostpassword_url() . '">' .
__( 'Lost your password?' ) .
@ -296,7 +296,7 @@ function wp_authenticate_email_password(
sprintf(
/* translators: %s: Email address. */
__( '<strong>Error:</strong> The password you entered for the email address %s is incorrect.' ),
'<strong>' . $email . '</strong>'
'<strong>' . esc_html( $email ) . '</strong>'
) .
' <a href="' . wp_lostpassword_url() . '">' .
__( 'Lost your password?' ) .
@ -3568,7 +3568,7 @@ function register_new_user( $user_login, $user_email ) {
sprintf(
/* translators: %s: Link to the login page. */
__( '<strong>Error:</strong> This email address is already registered. <a href="%s">Log in</a> with this address or choose another one.' ),
wp_login_url()
esc_url( wp_login_url() )
)
);
}
@ -3616,7 +3616,7 @@ function register_new_user( $user_login, $user_email ) {
sprintf(
/* translators: %s: Admin email address. */
__( '<strong>Error:</strong> Could not register you&hellip; please contact the <a href="mailto:%s">site admin</a>!' ),
get_option( 'admin_email' )
esc_attr( get_option( 'admin_email' ) )
)
);
return $errors;
@ -3839,18 +3839,26 @@ function _wp_get_current_user() {
*
* @since 3.0.0
* @since 4.9.0 This function was moved from wp-admin/includes/ms.php so it's no longer Multisite specific.
* @since 7.0.3 Added the `$user_id` parameter, which is sent with the `personal_options_update` action.
*
* @param int $user_id Optional. The ID of the user whose email is being changed. Defaults to `$_POST['user_id']` if set, otherwise 0.
*
* @global WP_Error $errors WP_Error object.
*/
function send_confirmation_on_profile_email() {
function send_confirmation_on_profile_email( $user_id = 0 ) {
global $errors;
// Maintain backward compatibility for those relying on a check based on $_POST['user_id'].
if ( ! $user_id && isset( $_POST['user_id'] ) ) {
$user_id = absint( $_POST['user_id'] );
}
$current_user = wp_get_current_user();
if ( ! is_object( $errors ) ) {
$errors = new WP_Error();
}
if ( $current_user->ID !== (int) $_POST['user_id'] ) {
if ( 0 === $current_user->ID || $current_user->ID !== (int) $user_id ) {
return false;
}
@ -3864,6 +3872,7 @@ function send_confirmation_on_profile_email() {
)
);
$_POST['email'] = addslashes( $current_user->user_email );
return;
}
@ -3877,6 +3886,7 @@ function send_confirmation_on_profile_email() {
);
delete_user_meta( $current_user->ID, '_new_email' );
$_POST['email'] = addslashes( $current_user->user_email );
return;
}

View File

@ -16,7 +16,7 @@
*
* @global string $wp_version
*/
$wp_version = '7.0.2';
$wp_version = '7.0.3';
/**
* Holds the WordPress DB revision, increments when changes are made to the WordPress DB schema.

View File

@ -1220,7 +1220,7 @@ switch ( $action ) {
sprintf(
/* translators: %s: Link to the login page. */
__( 'Check your email for the confirmation link, then visit the <a href="%s">login page</a>.' ),
wp_login_url()
esc_url( wp_login_url() )
),
'message'
);
@ -1230,7 +1230,7 @@ switch ( $action ) {
sprintf(
/* translators: %s: Link to the login page. */
__( 'Registration complete. Please check your email, then visit the <a href="%s">login page</a>.' ),
wp_login_url()
esc_url( wp_login_url() )
),
'message'
);

View File

@ -999,7 +999,11 @@ if ( 'none' === $active_signup ) {
}
break;
case 'gimmeanotherblog':
validate_another_blog_signup();
if ( 'all' === $active_signup || 'blog' === $active_signup ) {
validate_another_blog_signup();
} else {
_e( 'Site registration has been disabled.' );
}
break;
case 'default':
default: