mirror of
https://github.com/php-flasher/php-flasher.git
synced 2026-03-31 15:07:47 +01:00
improve rollup configuration
This commit is contained in:
@@ -1,4 +1,7 @@
|
|||||||
{
|
{
|
||||||
"upgrade": true,
|
"upgrade": true,
|
||||||
"target": "semver"
|
"target": "semver",
|
||||||
|
"format": "group",
|
||||||
|
"color": true,
|
||||||
|
"root": true
|
||||||
}
|
}
|
||||||
|
|||||||
Executable
+675
@@ -0,0 +1,675 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# =========================================================================
|
||||||
|
# Build System for PHP-Flasher
|
||||||
|
# =========================================================================
|
||||||
|
#
|
||||||
|
# This script provides an elegant build process for PHP-Flasher assets
|
||||||
|
# with comprehensive reporting and flexible configuration options.
|
||||||
|
#
|
||||||
|
# Author: Younes ENNAJI
|
||||||
|
# =========================================================================
|
||||||
|
|
||||||
|
# Strict error handling
|
||||||
|
set -o pipefail
|
||||||
|
|
||||||
|
# =========================================================================
|
||||||
|
# CONSTANTS AND CONFIGURATION
|
||||||
|
# =========================================================================
|
||||||
|
|
||||||
|
# Colors and styles
|
||||||
|
readonly RESET='\033[0m'
|
||||||
|
readonly BOLD='\033[1m'
|
||||||
|
readonly DIM='\033[2m'
|
||||||
|
readonly UNDERLINE='\033[4m'
|
||||||
|
readonly BLUE='\033[34m'
|
||||||
|
readonly GREEN='\033[32m'
|
||||||
|
readonly RED='\033[31m'
|
||||||
|
readonly YELLOW='\033[33m'
|
||||||
|
readonly CYAN='\033[36m'
|
||||||
|
readonly MAGENTA='\033[35m'
|
||||||
|
readonly WHITE='\033[37m'
|
||||||
|
|
||||||
|
# Emoji indicators
|
||||||
|
readonly ROCKET="🚀"
|
||||||
|
readonly PACKAGE="📦"
|
||||||
|
readonly CHECK="✓"
|
||||||
|
readonly ERROR="❌"
|
||||||
|
readonly WARNING="⚠️"
|
||||||
|
readonly HAMMER="🏗️"
|
||||||
|
readonly CHART="📊"
|
||||||
|
readonly SPARKLES="✨"
|
||||||
|
readonly HOURGLASS="⏳"
|
||||||
|
readonly PALETTE="🎨"
|
||||||
|
|
||||||
|
# File paths
|
||||||
|
readonly SRC_DIR="src"
|
||||||
|
readonly PRIME_PATH="${SRC_DIR}/Prime/Resources"
|
||||||
|
readonly TEMP_DIR="/tmp/php-flasher-build-$$"
|
||||||
|
readonly BUILD_LOG="${TEMP_DIR}/build.log"
|
||||||
|
readonly SIZE_DATA="${TEMP_DIR}/sizes.data"
|
||||||
|
|
||||||
|
# Default configuration
|
||||||
|
VERBOSE=false
|
||||||
|
WATCH_MODE=false
|
||||||
|
THEME_ONLY=false
|
||||||
|
MODULE_ONLY=false
|
||||||
|
ANALYZE=false
|
||||||
|
DEEP_ANALYZE=false
|
||||||
|
SKIP_CLEAR=false
|
||||||
|
NODE_ENV="production"
|
||||||
|
|
||||||
|
# =========================================================================
|
||||||
|
# UTILITY FUNCTIONS
|
||||||
|
# =========================================================================
|
||||||
|
|
||||||
|
cleanup() {
|
||||||
|
# Clean up temporary files when the script exits
|
||||||
|
rm -rf "${TEMP_DIR}" 2>/dev/null
|
||||||
|
}
|
||||||
|
|
||||||
|
trap cleanup EXIT
|
||||||
|
|
||||||
|
mkdir -p "${TEMP_DIR}"
|
||||||
|
|
||||||
|
print_header() {
|
||||||
|
echo -e "\n${BOLD}Date : ${RESET}${CYAN}$(date -u '+%Y-%m-%d %H:%M:%S') UTC${RESET}"
|
||||||
|
echo -e "${BOLD}User : ${RESET}${MAGENTA}$(whoami)${RESET}"
|
||||||
|
echo -e "${BOLD}Branch : ${RESET}${GREEN}$(git rev-parse --abbrev-ref HEAD 2>/dev/null || echo "unknown")${RESET}"
|
||||||
|
echo -e "${BOLD}Directory : ${RESET}${BLUE}$(pwd)${RESET}"
|
||||||
|
|
||||||
|
if [ "$NODE_ENV" != "production" ]; then
|
||||||
|
echo -e "${BOLD}Mode : ${RESET}${YELLOW}${NODE_ENV}${RESET}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$WATCH_MODE" = true ]; then
|
||||||
|
echo -e "${BOLD}Watch : ${RESET}${CYAN}enabled${RESET}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$THEME_ONLY" = true ]; then
|
||||||
|
echo -e "${BOLD}Scope : ${RESET}${MAGENTA}themes only${RESET}"
|
||||||
|
elif [ "$MODULE_ONLY" = true ]; then
|
||||||
|
echo -e "${BOLD}Scope : ${RESET}${MAGENTA}modules only${RESET}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo
|
||||||
|
}
|
||||||
|
|
||||||
|
print_section() {
|
||||||
|
echo -e "\n${BOLD}${CYAN}┌─ $1 ${2:-}${RESET}"
|
||||||
|
}
|
||||||
|
|
||||||
|
success_msg() {
|
||||||
|
echo -e "${GREEN}${CHECK} $*${RESET}"
|
||||||
|
}
|
||||||
|
|
||||||
|
error_msg() {
|
||||||
|
echo -e "${RED}${ERROR} $*${RESET}"
|
||||||
|
}
|
||||||
|
|
||||||
|
warning_msg() {
|
||||||
|
echo -e "${YELLOW}${WARNING} $*${RESET}"
|
||||||
|
}
|
||||||
|
|
||||||
|
info_msg() {
|
||||||
|
echo -e "${BLUE}${HOURGLASS} $*${RESET}"
|
||||||
|
}
|
||||||
|
|
||||||
|
print_usage() {
|
||||||
|
echo -e "${BOLD}Usage:${RESET} $0 [options]"
|
||||||
|
echo
|
||||||
|
echo -e "${BOLD}Options:${RESET}"
|
||||||
|
echo -e " ${GREEN}-h, --help${RESET} Show this help message"
|
||||||
|
echo -e " ${GREEN}-v, --verbose${RESET} Display detailed build output"
|
||||||
|
echo -e " ${GREEN}-w, --watch${RESET} Run in watch mode"
|
||||||
|
echo -e " ${GREEN}-d, --development${RESET} Build in development mode (unminified)"
|
||||||
|
echo -e " ${GREEN}-t, --themes-only${RESET} Build only themes"
|
||||||
|
echo -e " ${GREEN}-m, --modules-only${RESET} Build only modules (core and plugins)"
|
||||||
|
echo -e " ${GREEN}-a, --analyze${RESET} Show detailed size analysis in table format"
|
||||||
|
echo -e " ${GREEN}-D, --deep-analyze${RESET} Perform deep analysis of files (checksums, content inspection)"
|
||||||
|
echo -e " ${GREEN}--skip-clear${RESET} Skip clearing output directories"
|
||||||
|
echo
|
||||||
|
}
|
||||||
|
|
||||||
|
parse_args() {
|
||||||
|
while [ "$#" -gt 0 ]; do
|
||||||
|
case "$1" in
|
||||||
|
-h|--help)
|
||||||
|
print_usage
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
-v|--verbose)
|
||||||
|
VERBOSE=true
|
||||||
|
;;
|
||||||
|
-w|--watch)
|
||||||
|
WATCH_MODE=true
|
||||||
|
NODE_ENV="development"
|
||||||
|
;;
|
||||||
|
-d|--development)
|
||||||
|
NODE_ENV="development"
|
||||||
|
;;
|
||||||
|
-t|--themes-only)
|
||||||
|
THEME_ONLY=true
|
||||||
|
;;
|
||||||
|
-m|--modules-only)
|
||||||
|
MODULE_ONLY=true
|
||||||
|
;;
|
||||||
|
-a|--analyze)
|
||||||
|
ANALYZE=true
|
||||||
|
;;
|
||||||
|
-D|--deep-analyze)
|
||||||
|
ANALYZE=true
|
||||||
|
DEEP_ANALYZE=true
|
||||||
|
;;
|
||||||
|
--skip-clear)
|
||||||
|
SKIP_CLEAR=true
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
warning_msg "Unknown option: $1"
|
||||||
|
print_usage
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
|
||||||
|
# Validate conflicting options
|
||||||
|
if [ "$THEME_ONLY" = true ] && [ "$MODULE_ONLY" = true ]; then
|
||||||
|
error_msg "Cannot specify both --themes-only and --modules-only"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Configure build mode
|
||||||
|
if [ "$WATCH_MODE" = true ]; then
|
||||||
|
ROLLUP_ARGS="-c -w"
|
||||||
|
else
|
||||||
|
ROLLUP_ARGS="-c"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# When analyzing, we turn off verbosity for rollup
|
||||||
|
if [ "$ANALYZE" = true ]; then
|
||||||
|
export FILESIZE_SILENT=true
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# =========================================================================
|
||||||
|
# BUILD FUNCTIONS
|
||||||
|
# =========================================================================
|
||||||
|
|
||||||
|
get_size_info() {
|
||||||
|
local file="$1"
|
||||||
|
# Get precise byte count for more accurate comparison
|
||||||
|
local bytes=$(wc -c < "$file")
|
||||||
|
local size=$(du -h "$file" | awk '{print $1}')
|
||||||
|
local gzip=$(gzip -c "$file" | wc -c | numfmt --to=iec --format="%.1f")
|
||||||
|
local brotli_size=$(brotli -c "$file" 2>/dev/null | wc -c | numfmt --to=iec --format="%.1f" || echo "N/A")
|
||||||
|
|
||||||
|
echo "$size|$gzip|$bytes|$brotli_size"
|
||||||
|
}
|
||||||
|
|
||||||
|
get_file_hash() {
|
||||||
|
local file="$1"
|
||||||
|
if command -v sha256sum &> /dev/null; then
|
||||||
|
sha256sum "$file" | awk '{print $1}'
|
||||||
|
elif command -v shasum &> /dev/null; then
|
||||||
|
shasum -a 256 "$file" | awk '{print $1}'
|
||||||
|
else
|
||||||
|
echo "HASH_UNAVAILABLE"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
analyze_file_content() {
|
||||||
|
local file="$1"
|
||||||
|
local filename=$(basename "$file")
|
||||||
|
local dir="${TEMP_DIR}/analysis/$(dirname "$file" | sed 's/\//_/g')"
|
||||||
|
mkdir -p "$dir"
|
||||||
|
|
||||||
|
# Get first 10 lines for a quick look
|
||||||
|
head -n 10 "$file" > "${dir}/${filename}.head"
|
||||||
|
|
||||||
|
# Get hash for exact comparison
|
||||||
|
local hash=$(get_file_hash "$file")
|
||||||
|
echo "$hash" > "${dir}/${filename}.hash"
|
||||||
|
|
||||||
|
# For CSS/JS, try to determine if it's minified
|
||||||
|
if [[ "$file" == *.css || "$file" == *.js ]]; then
|
||||||
|
# Count semicolons to help identify if minified
|
||||||
|
local semicolons=$(grep -o ";" "$file" | wc -l)
|
||||||
|
# Count newlines
|
||||||
|
local newlines=$(grep -c $'\n' "$file")
|
||||||
|
|
||||||
|
# Simple heuristic: if few newlines relative to semicolons, likely minified
|
||||||
|
if [ "$newlines" -lt 10 ] || [ "$semicolons" -gt "$((newlines * 5))" ]; then
|
||||||
|
echo "MINIFIED:YES semicolons:$semicolons newlines:$newlines" > "${dir}/${filename}.analysis"
|
||||||
|
else
|
||||||
|
echo "MINIFIED:NO semicolons:$semicolons newlines:$newlines" > "${dir}/${filename}.analysis"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "$hash"
|
||||||
|
}
|
||||||
|
|
||||||
|
collect_build_statistics() {
|
||||||
|
local modules_count=0
|
||||||
|
local themes_count=0
|
||||||
|
declare -a theme_names=()
|
||||||
|
local unique_css_hashes=0
|
||||||
|
local unique_js_hashes=0
|
||||||
|
declare -A css_hashes=()
|
||||||
|
declare -A js_hashes=()
|
||||||
|
|
||||||
|
# Create temporary directory for data
|
||||||
|
mkdir -p "${TEMP_DIR}/modules"
|
||||||
|
mkdir -p "${TEMP_DIR}/themes"
|
||||||
|
mkdir -p "${TEMP_DIR}/analysis"
|
||||||
|
|
||||||
|
echo "DEBUG: Looking for modules and themes..." >> "${BUILD_LOG}"
|
||||||
|
|
||||||
|
# Check for core flasher module first
|
||||||
|
if [ -f "${PRIME_PATH}/dist/flasher.min.js" ]; then
|
||||||
|
local size_info=$(get_size_info "${PRIME_PATH}/dist/flasher.min.js")
|
||||||
|
local hash="N/A"
|
||||||
|
if [ "$DEEP_ANALYZE" = true ]; then
|
||||||
|
hash=$(analyze_file_content "${PRIME_PATH}/dist/flasher.min.js")
|
||||||
|
js_hashes["$hash"]=1
|
||||||
|
((unique_js_hashes++))
|
||||||
|
fi
|
||||||
|
echo "flasher:$size_info:$hash" >> "${TEMP_DIR}/modules/data"
|
||||||
|
((modules_count++))
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Collect module statistics - FIXED to avoid subshell issue
|
||||||
|
# Store filenames to process in a temporary file
|
||||||
|
find ${SRC_DIR}/*/Prime/Resources/dist -name "*.min.js" | grep -v themes > "${TEMP_DIR}/module_files.txt" 2>/dev/null
|
||||||
|
|
||||||
|
# Process each module file
|
||||||
|
while IFS= read -r file; do
|
||||||
|
local module=$(basename "$file" .min.js)
|
||||||
|
local size_info=$(get_size_info "$file")
|
||||||
|
local hash="N/A"
|
||||||
|
if [ "$DEEP_ANALYZE" = true ]; then
|
||||||
|
hash=$(analyze_file_content "$file")
|
||||||
|
js_hashes["$hash"]=1
|
||||||
|
((unique_js_hashes++))
|
||||||
|
fi
|
||||||
|
echo "$module:$size_info:$hash" >> "${TEMP_DIR}/modules/data"
|
||||||
|
((modules_count++))
|
||||||
|
echo "DEBUG: Found module: $module in $file (${size_info})" >> "${BUILD_LOG}"
|
||||||
|
done < "${TEMP_DIR}/module_files.txt"
|
||||||
|
|
||||||
|
# Collect theme statistics - FIXED to avoid subshell issue
|
||||||
|
if [ -d "${PRIME_PATH}/dist/themes" ]; then
|
||||||
|
# Store theme files in a temporary file
|
||||||
|
find ${PRIME_PATH}/dist/themes -name "*.min.js" > "${TEMP_DIR}/theme_files.txt" 2>/dev/null
|
||||||
|
|
||||||
|
# Process each theme file
|
||||||
|
while IFS= read -r file; do
|
||||||
|
local theme=$(basename "$(dirname "$file")")
|
||||||
|
local size_info=$(get_size_info "$file")
|
||||||
|
local js_hash="N/A"
|
||||||
|
local css_hash="N/A"
|
||||||
|
|
||||||
|
# Also get the CSS file size and analyze it
|
||||||
|
local css_file="${PRIME_PATH}/dist/themes/${theme}/${theme}.min.css"
|
||||||
|
local css_size_info="N/A"
|
||||||
|
if [ -f "$css_file" ]; then
|
||||||
|
css_size_info=$(get_size_info "$css_file")
|
||||||
|
|
||||||
|
if [ "$DEEP_ANALYZE" = true ]; then
|
||||||
|
css_hash=$(analyze_file_content "$css_file")
|
||||||
|
if [ -z "${css_hashes[$css_hash]}" ]; then
|
||||||
|
css_hashes["$css_hash"]=1
|
||||||
|
((unique_css_hashes++))
|
||||||
|
else
|
||||||
|
css_hashes["$css_hash"]=$((css_hashes["$css_hash"] + 1))
|
||||||
|
fi
|
||||||
|
|
||||||
|
js_hash=$(analyze_file_content "$file")
|
||||||
|
if [ -z "${js_hashes[$js_hash]}" ]; then
|
||||||
|
js_hashes["$js_hash"]=1
|
||||||
|
else
|
||||||
|
js_hashes["$js_hash"]=$((js_hashes["$js_hash"] + 1))
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "DEBUG: Theme $theme JS: $size_info, CSS: $css_size_info" >> "${BUILD_LOG}"
|
||||||
|
else
|
||||||
|
echo "DEBUG: No CSS file found for theme $theme" >> "${BUILD_LOG}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "$theme:$size_info:$js_hash:$css_size_info:$css_hash" >> "${TEMP_DIR}/themes/data"
|
||||||
|
theme_names+=("$theme")
|
||||||
|
((themes_count++))
|
||||||
|
done < "${TEMP_DIR}/theme_files.txt"
|
||||||
|
|
||||||
|
# Sort theme names alphabetically
|
||||||
|
if [ ${#theme_names[@]} -gt 0 ]; then
|
||||||
|
printf "%s\n" "${theme_names[@]}" | sort > "${TEMP_DIR}/theme_names"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Store counts for summary
|
||||||
|
echo "$modules_count" > "${TEMP_DIR}/modules_count"
|
||||||
|
echo "$themes_count" > "${TEMP_DIR}/themes_count"
|
||||||
|
echo "$unique_js_hashes" > "${TEMP_DIR}/unique_js_hashes"
|
||||||
|
echo "$unique_css_hashes" > "${TEMP_DIR}/unique_css_hashes"
|
||||||
|
|
||||||
|
# Write hash statistics if deep analysis was enabled
|
||||||
|
if [ "$DEEP_ANALYZE" = true ]; then
|
||||||
|
echo "JS Hash Distribution:" > "${TEMP_DIR}/hash_stats.txt"
|
||||||
|
for hash in "${!js_hashes[@]}"; do
|
||||||
|
echo " $hash: ${js_hashes[$hash]} files" >> "${TEMP_DIR}/hash_stats.txt"
|
||||||
|
done
|
||||||
|
|
||||||
|
echo -e "\nCSS Hash Distribution:" >> "${TEMP_DIR}/hash_stats.txt"
|
||||||
|
for hash in "${!css_hashes[@]}"; do
|
||||||
|
echo " $hash: ${css_hashes[$hash]} files" >> "${TEMP_DIR}/hash_stats.txt"
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
run_build() {
|
||||||
|
print_section "Starting Build Process" "${HAMMER}"
|
||||||
|
|
||||||
|
info_msg "Environment: ${NODE_ENV}"
|
||||||
|
info_msg "Building PHP-Flasher assets..."
|
||||||
|
|
||||||
|
# Set environment variables
|
||||||
|
export NODE_ENV="$NODE_ENV"
|
||||||
|
export ANALYZE="$ANALYZE"
|
||||||
|
export DEEP_ANALYZE="$DEEP_ANALYZE"
|
||||||
|
|
||||||
|
# Determine which parts to build based on flags
|
||||||
|
local rollup_args="$ROLLUP_ARGS"
|
||||||
|
if [ "$THEME_ONLY" = true ]; then
|
||||||
|
info_msg "Building themes only"
|
||||||
|
# Here we'd need to extend rollup to support theme-only builds
|
||||||
|
# For now, we'll complete the full build
|
||||||
|
elif [ "$MODULE_ONLY" = true ]; then
|
||||||
|
info_msg "Building modules only"
|
||||||
|
# Similarly, we'd need to extend rollup
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Execute rollup with appropriate flags
|
||||||
|
if [ "$VERBOSE" = true ]; then
|
||||||
|
if npx rollup $rollup_args; then
|
||||||
|
success_msg "Build process completed"
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
error_msg "Build process failed"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
# Capture output for non-verbose mode
|
||||||
|
if npx rollup $rollup_args > "$BUILD_LOG" 2>&1; then
|
||||||
|
success_msg "Build process completed"
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
error_msg "Build process failed"
|
||||||
|
cat "$BUILD_LOG"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# =========================================================================
|
||||||
|
# REPORTING FUNCTIONS
|
||||||
|
# =========================================================================
|
||||||
|
|
||||||
|
print_size_table() {
|
||||||
|
local title="$1"
|
||||||
|
local data_file="$2"
|
||||||
|
local max_name_len=20
|
||||||
|
|
||||||
|
if [ ! -f "$data_file" ] || [ ! -s "$data_file" ]; then
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo -e "\n${BOLD}${WHITE}${title}${RESET}\n"
|
||||||
|
|
||||||
|
# Print table header with or without hashes based on deep analysis
|
||||||
|
if [ "$DEEP_ANALYZE" = true ]; then
|
||||||
|
printf "${BOLD}%-${max_name_len}s %-10s %-10s %-10s %-10s${RESET}\n" "Component" "Size" "Gzip" "Bytes" "Hash"
|
||||||
|
else
|
||||||
|
printf "${BOLD}%-${max_name_len}s %-10s %-10s %-10s${RESET}\n" "Component" "Size" "Gzip" "Bytes"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo -e "${DIM}$(printf '%.0s─' {1..70})${RESET}"
|
||||||
|
|
||||||
|
# Print table rows
|
||||||
|
while IFS=: read -r line; do
|
||||||
|
# Split the line into fields
|
||||||
|
local fields=()
|
||||||
|
while IFS=: read -ra parts; do
|
||||||
|
fields=("${parts[@]}")
|
||||||
|
done <<< "$line"
|
||||||
|
|
||||||
|
local name="${fields[0]}"
|
||||||
|
local size_data="${fields[1]}"
|
||||||
|
local hash="N/A"
|
||||||
|
if [ "${#fields[@]}" -gt 2 ]; then
|
||||||
|
hash="${fields[2]}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
IFS='|' read -r size gzip bytes brotli <<< "$size_data"
|
||||||
|
|
||||||
|
if [ "$DEEP_ANALYZE" = true ]; then
|
||||||
|
printf "%-${max_name_len}s ${GREEN}%-10s${RESET} ${BLUE}%-10s${RESET} ${YELLOW}%-10s${RESET} ${DIM}%.8s${RESET}\n" \
|
||||||
|
"$name" "$size" "$gzip" "$bytes" "$hash"
|
||||||
|
else
|
||||||
|
printf "%-${max_name_len}s ${GREEN}%-10s${RESET} ${BLUE}%-10s${RESET} ${YELLOW}%-10s${RESET}\n" \
|
||||||
|
"$name" "$size" "$gzip" "$bytes"
|
||||||
|
fi
|
||||||
|
done < "$data_file"
|
||||||
|
}
|
||||||
|
|
||||||
|
print_theme_table() {
|
||||||
|
local data_file="$1"
|
||||||
|
local max_name_len=15
|
||||||
|
|
||||||
|
if [ ! -f "$data_file" ] || [ ! -s "$data_file" ]; then
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo -e "\n${BOLD}${WHITE}Theme Sizes${RESET}\n"
|
||||||
|
|
||||||
|
# Print table header
|
||||||
|
printf "${BOLD}%-${max_name_len}s %-10s %-10s %-10s %-10s${RESET}\n" "Theme" "JS Size" "CSS Size" "JS Bytes" "CSS Bytes"
|
||||||
|
echo -e "${DIM}$(printf '%.0s─' {1..70})${RESET}"
|
||||||
|
|
||||||
|
# Print table rows
|
||||||
|
while IFS=: read -r line; do
|
||||||
|
# Split the line into fields
|
||||||
|
local fields=()
|
||||||
|
while IFS=: read -ra parts; do
|
||||||
|
fields=("${parts[@]}")
|
||||||
|
done <<< "$line"
|
||||||
|
|
||||||
|
local name="${fields[0]}"
|
||||||
|
local js_size_data="${fields[1]}"
|
||||||
|
local js_hash="N/A"
|
||||||
|
local css_size_data="N/A"
|
||||||
|
local css_hash="N/A"
|
||||||
|
|
||||||
|
if [ "${#fields[@]}" -gt 2 ]; then
|
||||||
|
js_hash="${fields[2]}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "${#fields[@]}" -gt 3 ]; then
|
||||||
|
css_size_data="${fields[3]}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "${#fields[@]}" -gt 4 ]; then
|
||||||
|
css_hash="${fields[4]}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
IFS='|' read -r js_size js_gzip js_bytes js_brotli <<< "$js_size_data"
|
||||||
|
|
||||||
|
local css_size="N/A"
|
||||||
|
local css_bytes="N/A"
|
||||||
|
|
||||||
|
if [ "$css_size_data" != "N/A" ]; then
|
||||||
|
IFS='|' read -r css_size css_gzip css_bytes css_brotli <<< "$css_size_data"
|
||||||
|
fi
|
||||||
|
|
||||||
|
printf "%-${max_name_len}s ${GREEN}%-10s${RESET} ${MAGENTA}%-10s${RESET} ${YELLOW}%-10s${RESET} ${BLUE}%-10s${RESET}\n" \
|
||||||
|
"$name" "$js_size" "$css_size" "$js_bytes" "$css_bytes"
|
||||||
|
done < "$data_file"
|
||||||
|
}
|
||||||
|
|
||||||
|
print_theme_grid() {
|
||||||
|
local theme_names_file="$1"
|
||||||
|
if [ ! -f "$theme_names_file" ] || [ ! -s "$theme_names_file" ]; then
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo -e "\n${BOLD}${MAGENTA}${PALETTE} Themes:${RESET}"
|
||||||
|
|
||||||
|
# Define grid parameters
|
||||||
|
local columns=3
|
||||||
|
local max_width=15
|
||||||
|
local count=0
|
||||||
|
|
||||||
|
# Print themes in a grid
|
||||||
|
while read -r theme; do
|
||||||
|
if [ $((count % columns)) -eq 0 ]; then
|
||||||
|
echo -ne " "
|
||||||
|
fi
|
||||||
|
|
||||||
|
printf "• %-${max_width}s" "$theme"
|
||||||
|
count=$((count + 1))
|
||||||
|
|
||||||
|
if [ $((count % columns)) -eq 0 ]; then
|
||||||
|
echo
|
||||||
|
fi
|
||||||
|
done < "$theme_names_file"
|
||||||
|
|
||||||
|
# Add a newline if the last row wasn't complete
|
||||||
|
if [ $((count % columns)) -ne 0 ]; then
|
||||||
|
echo
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
print_deep_analysis() {
|
||||||
|
if [ ! -d "${TEMP_DIR}/analysis" ]; then
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
local unique_js=0
|
||||||
|
local unique_css=0
|
||||||
|
|
||||||
|
if [ -f "${TEMP_DIR}/unique_js_hashes" ]; then
|
||||||
|
unique_js=$(cat "${TEMP_DIR}/unique_js_hashes")
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -f "${TEMP_DIR}/unique_css_hashes" ]; then
|
||||||
|
unique_css=$(cat "${TEMP_DIR}/unique_css_hashes")
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo -e "\n${BOLD}${WHITE}Deep File Analysis${RESET}"
|
||||||
|
echo -e "${DIM}$(printf '%.0s─' {1..50})${RESET}"
|
||||||
|
|
||||||
|
echo -e "Unique JavaScript files: ${YELLOW}${unique_js}${RESET}"
|
||||||
|
echo -e "Unique CSS files: ${MAGENTA}${unique_css}${RESET}"
|
||||||
|
|
||||||
|
if [ -f "${TEMP_DIR}/hash_stats.txt" ]; then
|
||||||
|
echo -e "\n${BOLD}Hash Distribution:${RESET}"
|
||||||
|
local top_5=$(head -n 10 "${TEMP_DIR}/hash_stats.txt")
|
||||||
|
echo -e "${DIM}$top_5${RESET}"
|
||||||
|
echo -e "${DIM}(See ${TEMP_DIR}/hash_stats.txt for full details)${RESET}"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
print_summary() {
|
||||||
|
local success=$1
|
||||||
|
local duration=$2
|
||||||
|
|
||||||
|
# Read statistics
|
||||||
|
local modules_count=0
|
||||||
|
local themes_count=0
|
||||||
|
|
||||||
|
if [ -f "${TEMP_DIR}/modules_count" ]; then
|
||||||
|
modules_count=$(cat "${TEMP_DIR}/modules_count")
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -f "${TEMP_DIR}/themes_count" ]; then
|
||||||
|
themes_count=$(cat "${TEMP_DIR}/themes_count")
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Print summary header
|
||||||
|
echo -e "\n${BOLD}${PACKAGE} Build Summary${RESET}"
|
||||||
|
echo -e "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||||
|
|
||||||
|
# Print statistics
|
||||||
|
if [ "$MODULE_ONLY" = false ]; then
|
||||||
|
echo -e "${CHECK} Modules/Plugins: ${BOLD}${CYAN}${modules_count}${RESET}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$THEME_ONLY" = false ]; then
|
||||||
|
echo -e "${CHECK} Themes: ${BOLD}${MAGENTA}${themes_count}${RESET}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo -e "${CHECK} Build completed in ${BOLD}${YELLOW}${duration}s${RESET}"
|
||||||
|
|
||||||
|
# Print theme names if available
|
||||||
|
if [ -f "${TEMP_DIR}/theme_names" ]; then
|
||||||
|
print_theme_grid "${TEMP_DIR}/theme_names"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Show size analysis if requested
|
||||||
|
if [ "$ANALYZE" = true ]; then
|
||||||
|
echo -e "\n${BOLD}${CHART} Size Analysis:${RESET}"
|
||||||
|
print_size_table "Module Sizes" "${TEMP_DIR}/modules/data"
|
||||||
|
|
||||||
|
if [ "$DEEP_ANALYZE" = true ]; then
|
||||||
|
print_theme_table "${TEMP_DIR}/themes/data"
|
||||||
|
print_deep_analysis
|
||||||
|
else
|
||||||
|
print_size_table "Theme Sizes" "${TEMP_DIR}/themes/data"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Add option to view detailed logs
|
||||||
|
echo -e "\nFor detailed build info, run: ${CYAN}cat $BUILD_LOG${RESET}"
|
||||||
|
echo -e "Temporary files at: ${CYAN}${TEMP_DIR}${RESET}"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# =========================================================================
|
||||||
|
# MAIN EXECUTION
|
||||||
|
# =========================================================================
|
||||||
|
|
||||||
|
main() {
|
||||||
|
local start_time=$(date +%s)
|
||||||
|
local build_success=true
|
||||||
|
|
||||||
|
# Parse command-line arguments
|
||||||
|
parse_args "$@"
|
||||||
|
|
||||||
|
# Show header
|
||||||
|
print_header
|
||||||
|
|
||||||
|
# Run the build process
|
||||||
|
run_build || build_success=false
|
||||||
|
|
||||||
|
# Only collect statistics if build was successful and not in watch mode
|
||||||
|
if [ "$WATCH_MODE" = false ] && [ "$build_success" = true ]; then
|
||||||
|
if [ "$ANALYZE" = true ] || [ ! -t 1 ]; then
|
||||||
|
print_section "Analyzing Build Output" "${CHART}"
|
||||||
|
fi
|
||||||
|
collect_build_statistics
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Print summary (unless in watch mode)
|
||||||
|
if [ "$WATCH_MODE" = false ]; then
|
||||||
|
local end_time=$(date +%s)
|
||||||
|
local duration=$((end_time - start_time))
|
||||||
|
|
||||||
|
print_summary "$build_success" "$duration"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Exit with appropriate code
|
||||||
|
[ "$build_success" = true ] && exit 0 || exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
# Execute main function with all arguments
|
||||||
|
main "$@"
|
||||||
File diff suppressed because one or more lines are too long
+18
-18
File diff suppressed because one or more lines are too long
+38
-38
@@ -1,51 +1,51 @@
|
|||||||
{
|
{
|
||||||
"/vendor/flasher/flasher.min.js": "/vendor/flasher/flasher.min.js?id=2d20fa21f78414571c3878794170542b",
|
"/vendor/flasher/flasher.min.js": "/vendor/flasher/flasher.min.js?id=2d20fa21f78414571c3878794170542b",
|
||||||
"/vendor/flasher/flasher.min.css": "/vendor/flasher/flasher.min.css?id=9ca8061ffa988c921675331af27e55b9",
|
"/vendor/flasher/flasher.min.css": "/vendor/flasher/flasher.min.css?id=2ec8e2ef9e675401b21bea5e5fc4869e",
|
||||||
"/vendor/flasher/themes/amazon/amazon.min.css": "/vendor/flasher/themes/amazon/amazon.min.css?id=623a3ecb638606497a685a7e94255c09",
|
"/vendor/flasher/themes/amazon/amazon.min.css": "/vendor/flasher/themes/amazon/amazon.min.css?id=9382a41bbc9522b14fa2ffb7df0f0568",
|
||||||
"/vendor/flasher/themes/amazon/amazon.min.js": "/vendor/flasher/themes/amazon/amazon.min.js?id=94817ca77f2d8c2f48608dd37ae2dff4",
|
"/vendor/flasher/themes/amazon/amazon.min.js": "/vendor/flasher/themes/amazon/amazon.min.js?id=2e8cbc1a93524a122b8f62f072f2ff71",
|
||||||
"/vendor/flasher/themes/sapphire/sapphire.min.css": "/vendor/flasher/themes/sapphire/sapphire.min.css?id=1bad527f1ceb7cdffba5ac2f376189bf",
|
"/vendor/flasher/themes/sapphire/sapphire.min.css": "/vendor/flasher/themes/sapphire/sapphire.min.css?id=6ec8e39cb6b86690ed7b91d3e6e05249",
|
||||||
"/vendor/flasher/themes/sapphire/sapphire.min.js": "/vendor/flasher/themes/sapphire/sapphire.min.js?id=c3a92eed351e15d41d4a5dd92d6297c7",
|
"/vendor/flasher/themes/sapphire/sapphire.min.js": "/vendor/flasher/themes/sapphire/sapphire.min.js?id=aeaeda5a1eadd052f0c466fdf6c6f7b3",
|
||||||
"/vendor/flasher/themes/google/google.min.js": "/vendor/flasher/themes/google/google.min.js?id=6a452aa9c8dab6d34ccd1aeda9a769f5",
|
"/vendor/flasher/themes/google/google.min.js": "/vendor/flasher/themes/google/google.min.js?id=812cddda9e58967cd46fb1f5a385b8ec",
|
||||||
"/vendor/flasher/themes/google/google.min.css": "/vendor/flasher/themes/google/google.min.css?id=96c08fb2a49adbe69fdee0475db97c06",
|
"/vendor/flasher/themes/google/google.min.css": "/vendor/flasher/themes/google/google.min.css?id=9f1ec427e902cc5cac013ec83b807009",
|
||||||
"/vendor/flasher/themes/flasher/flasher.min.js": "/vendor/flasher/themes/flasher/flasher.min.js?id=205db37e7f508491972d900d0a62922b",
|
"/vendor/flasher/themes/flasher/flasher.min.js": "/vendor/flasher/themes/flasher/flasher.min.js?id=7b56b75dafcf90e2fd3cf243f6e17ede",
|
||||||
"/vendor/flasher/themes/flasher/flasher.min.css": "/vendor/flasher/themes/flasher/flasher.min.css?id=333bca1d86d382d934cd579f6f9ac353",
|
"/vendor/flasher/themes/flasher/flasher.min.css": "/vendor/flasher/themes/flasher/flasher.min.css?id=967ef3aa022e0fe9325c45f95a2c613c",
|
||||||
"/vendor/flasher/themes/aurora/aurora.min.css": "/vendor/flasher/themes/aurora/aurora.min.css?id=52a3279048769655be3f71412d67ac31",
|
"/vendor/flasher/themes/aurora/aurora.min.css": "/vendor/flasher/themes/aurora/aurora.min.css?id=ae3be7d52a558efcd528acd5953e7f9b",
|
||||||
"/vendor/flasher/themes/aurora/aurora.min.js": "/vendor/flasher/themes/aurora/aurora.min.js?id=f813d37daa54a81002496816423b2ec5",
|
"/vendor/flasher/themes/aurora/aurora.min.js": "/vendor/flasher/themes/aurora/aurora.min.js?id=16817691e8c76e7a27ea1be3a9d3e288",
|
||||||
"/vendor/flasher/themes/crystal/crystal.min.css": "/vendor/flasher/themes/crystal/crystal.min.css?id=6f136a98caca6a0c42c0e2f9fd7e9e4b",
|
"/vendor/flasher/themes/crystal/crystal.min.css": "/vendor/flasher/themes/crystal/crystal.min.css?id=50f30960c17127b692157c79e8e2a6bf",
|
||||||
"/vendor/flasher/themes/crystal/crystal.min.js": "/vendor/flasher/themes/crystal/crystal.min.js?id=45a6926e54d296dcdaf5f8a479f38d7a",
|
"/vendor/flasher/themes/crystal/crystal.min.js": "/vendor/flasher/themes/crystal/crystal.min.js?id=b98d586c16df24f556bd509d128d4206",
|
||||||
"/vendor/flasher/themes/minimal/minimal.min.css": "/vendor/flasher/themes/minimal/minimal.min.css?id=e74b9e28c83293a0d79a646f7787da68",
|
"/vendor/flasher/themes/minimal/minimal.min.css": "/vendor/flasher/themes/minimal/minimal.min.css?id=e85909c765088fd771f79722f8044083",
|
||||||
"/vendor/flasher/themes/minimal/minimal.min.js": "/vendor/flasher/themes/minimal/minimal.min.js?id=e33c7625470985224f4f42a8c03b6757",
|
"/vendor/flasher/themes/minimal/minimal.min.js": "/vendor/flasher/themes/minimal/minimal.min.js?id=1497c70c9875d728c439136c92fbca08",
|
||||||
"/vendor/flasher/themes/ios/ios.min.js": "/vendor/flasher/themes/ios/ios.min.js?id=e62854748d31c84a8af058554b9251c3",
|
"/vendor/flasher/themes/ios/ios.min.js": "/vendor/flasher/themes/ios/ios.min.js?id=7149c00236bda6f7aecfd7f0ce18a1f4",
|
||||||
"/vendor/flasher/themes/ios/ios.min.css": "/vendor/flasher/themes/ios/ios.min.css?id=f62e0e8c410b6ed9d06756535782f90f",
|
"/vendor/flasher/themes/ios/ios.min.css": "/vendor/flasher/themes/ios/ios.min.css?id=770dd6b169caba737bb7c815a4beb43c",
|
||||||
"/vendor/flasher/themes/onyx/onyx.min.css": "/vendor/flasher/themes/onyx/onyx.min.css?id=0fc8b9d1a91901a5467028bfd4615d23",
|
"/vendor/flasher/themes/onyx/onyx.min.css": "/vendor/flasher/themes/onyx/onyx.min.css?id=57bf33a47434641e70c12e4677cffe7a",
|
||||||
"/vendor/flasher/themes/onyx/onyx.min.js": "/vendor/flasher/themes/onyx/onyx.min.js?id=21ae12a70bcbf60e2ec664ced0ab6888",
|
"/vendor/flasher/themes/onyx/onyx.min.js": "/vendor/flasher/themes/onyx/onyx.min.js?id=2c8dc59c4abefd370535eb102d4e6711",
|
||||||
"/vendor/flasher/themes/amber/amber.min.js": "/vendor/flasher/themes/amber/amber.min.js?id=245c1730483317901ee25b06ee504ab7",
|
"/vendor/flasher/themes/amber/amber.min.js": "/vendor/flasher/themes/amber/amber.min.js?id=95b57e413d5cb896b47ad9158dd4ef07",
|
||||||
"/vendor/flasher/themes/amber/amber.min.css": "/vendor/flasher/themes/amber/amber.min.css?id=ae7c5d0e9635745db8fe1d03022fd171",
|
"/vendor/flasher/themes/amber/amber.min.css": "/vendor/flasher/themes/amber/amber.min.css?id=e4db7add360531073703b31fcbb68f09",
|
||||||
"/vendor/flasher/themes/facebook/facebook.min.js": "/vendor/flasher/themes/facebook/facebook.min.js?id=5957b8247403ea13fc29293dc0ed8c69",
|
"/vendor/flasher/themes/facebook/facebook.min.js": "/vendor/flasher/themes/facebook/facebook.min.js?id=3080bc5072f5b7379d281c2f98801f86",
|
||||||
"/vendor/flasher/themes/facebook/facebook.min.css": "/vendor/flasher/themes/facebook/facebook.min.css?id=02ef374ba75a182826480db5fec71b79",
|
"/vendor/flasher/themes/facebook/facebook.min.css": "/vendor/flasher/themes/facebook/facebook.min.css?id=de4ddab8b92e5004478621f08364ccf0",
|
||||||
"/vendor/flasher/themes/neon/neon.min.css": "/vendor/flasher/themes/neon/neon.min.css?id=031c06089f46c2acec307459893abc9f",
|
"/vendor/flasher/themes/neon/neon.min.css": "/vendor/flasher/themes/neon/neon.min.css?id=0fa1e1aff230421aab943153f5154461",
|
||||||
"/vendor/flasher/themes/neon/neon.min.js": "/vendor/flasher/themes/neon/neon.min.js?id=cf0a7a4c67660e0c9398274914516e44",
|
"/vendor/flasher/themes/neon/neon.min.js": "/vendor/flasher/themes/neon/neon.min.js?id=01987a2d265f63b2e92fe5f3e4b61496",
|
||||||
"/vendor/flasher/themes/slack/slack.min.js": "/vendor/flasher/themes/slack/slack.min.js?id=c4bf1903174982e322199b9d77c2eeee",
|
"/vendor/flasher/themes/slack/slack.min.js": "/vendor/flasher/themes/slack/slack.min.js?id=6b1ade06f3eb351e9eaef76d402918fb",
|
||||||
"/vendor/flasher/themes/slack/slack.min.css": "/vendor/flasher/themes/slack/slack.min.css?id=4df3ed039e9f95a387e7c6708335f501",
|
"/vendor/flasher/themes/slack/slack.min.css": "/vendor/flasher/themes/slack/slack.min.css?id=6fcab491611c4726877f14842e409dea",
|
||||||
"/vendor/flasher/themes/jade/jade.min.js": "/vendor/flasher/themes/jade/jade.min.js?id=9fb5fc81a13f6228da7bdfb9e8debb09",
|
"/vendor/flasher/themes/jade/jade.min.js": "/vendor/flasher/themes/jade/jade.min.js?id=0fbcab9da8649325269c934da21006cc",
|
||||||
"/vendor/flasher/themes/jade/jade.min.css": "/vendor/flasher/themes/jade/jade.min.css?id=a2a9a00a263f67a7cd6833f7d6e2a015",
|
"/vendor/flasher/themes/jade/jade.min.css": "/vendor/flasher/themes/jade/jade.min.css?id=7d665c1bb7db81e076254ec0ace02ea6",
|
||||||
"/vendor/flasher/themes/material/material.min.js": "/vendor/flasher/themes/material/material.min.js?id=249b7fd595f98f9d30d344760029b2d3",
|
"/vendor/flasher/themes/material/material.min.js": "/vendor/flasher/themes/material/material.min.js?id=0360045692aaa32af12dc9739374fdae",
|
||||||
"/vendor/flasher/themes/material/material.min.css": "/vendor/flasher/themes/material/material.min.css?id=a31663e3a404fa1f00f1914bb49139e7",
|
"/vendor/flasher/themes/material/material.min.css": "/vendor/flasher/themes/material/material.min.css?id=463c4b306917d3ed573126aee949076d",
|
||||||
"/vendor/flasher/themes/ruby/ruby.min.css": "/vendor/flasher/themes/ruby/ruby.min.css?id=408cd06189b57c775678415d3c88ce24",
|
"/vendor/flasher/themes/ruby/ruby.min.css": "/vendor/flasher/themes/ruby/ruby.min.css?id=00a9a89e35cab2959a4d8bc34bb2f174",
|
||||||
"/vendor/flasher/themes/ruby/ruby.min.js": "/vendor/flasher/themes/ruby/ruby.min.js?id=768bec05286e0429512bb64ac688ab33",
|
"/vendor/flasher/themes/ruby/ruby.min.js": "/vendor/flasher/themes/ruby/ruby.min.js?id=7c8e19091329bd9242408f8d5b9890e7",
|
||||||
"/vendor/flasher/themes/emerald/emerald.min.css": "/vendor/flasher/themes/emerald/emerald.min.css?id=f5ef96feac67af325788e22afa644fce",
|
"/vendor/flasher/themes/emerald/emerald.min.css": "/vendor/flasher/themes/emerald/emerald.min.css?id=446415c8c2364cb291a2c6fe576532b2",
|
||||||
"/vendor/flasher/themes/emerald/emerald.min.js": "/vendor/flasher/themes/emerald/emerald.min.js?id=0fbba5d71d9206ab6f452c3b94d51a28",
|
"/vendor/flasher/themes/emerald/emerald.min.js": "/vendor/flasher/themes/emerald/emerald.min.js?id=815113a3e5023948b5f700f5d62253dd",
|
||||||
"/vendor/flasher/mint.css": "/vendor/flasher/mint.css?id=348f135fff639305dde0005c647c1d20",
|
"/vendor/flasher/mint.css": "/vendor/flasher/mint.css?id=348f135fff639305dde0005c647c1d20",
|
||||||
"/vendor/flasher/flasher-noty.min.js": "/vendor/flasher/flasher-noty.min.js?id=745c58b03b20161745f05229c7e0ddad",
|
"/vendor/flasher/flasher-noty.min.js": "/vendor/flasher/flasher-noty.min.js?id=745c58b03b20161745f05229c7e0ddad",
|
||||||
"/vendor/flasher/noty.css": "/vendor/flasher/noty.css?id=bf51111a785e04cc8c86a7786e855484",
|
"/vendor/flasher/noty.css": "/vendor/flasher/noty.css?id=bf51111a785e04cc8c86a7786e855484",
|
||||||
"/vendor/flasher/noty.min.js": "/vendor/flasher/noty.min.js?id=840a31ddb720ff391cfc386c009d3422",
|
"/vendor/flasher/noty.min.js": "/vendor/flasher/noty.min.js?id=840a31ddb720ff391cfc386c009d3422",
|
||||||
"/vendor/flasher/flasher-notyf.min.js": "/vendor/flasher/flasher-notyf.min.js?id=1177c4554468e76e9877ec0fdc133e1a",
|
"/vendor/flasher/flasher-notyf.min.js": "/vendor/flasher/flasher-notyf.min.js?id=1177c4554468e76e9877ec0fdc133e1a",
|
||||||
"/vendor/flasher/flasher-notyf.min.css": "/vendor/flasher/flasher-notyf.min.css?id=53f57ecf59a7045f8029243bde3ed054",
|
"/vendor/flasher/flasher-notyf.min.css": "/vendor/flasher/flasher-notyf.min.css?id=a68d410be6df5aaa1dd8ed3a2798d390",
|
||||||
"/vendor/flasher/toastr.min.css": "/vendor/flasher/toastr.min.css?id=f284028c678041d687c6f1be6968f68a",
|
"/vendor/flasher/toastr.min.css": "/vendor/flasher/toastr.min.css?id=f284028c678041d687c6f1be6968f68a",
|
||||||
"/vendor/flasher/flasher-toastr.min.js": "/vendor/flasher/flasher-toastr.min.js?id=6e79f51a11a2b977b0e0eba8ee37c1d9",
|
"/vendor/flasher/flasher-toastr.min.js": "/vendor/flasher/flasher-toastr.min.js?id=6e79f51a11a2b977b0e0eba8ee37c1d9",
|
||||||
"/vendor/flasher/toastr.min.js": "/vendor/flasher/toastr.min.js?id=8ee1218b09fb02d43fcf0b84e30637ad",
|
"/vendor/flasher/toastr.min.js": "/vendor/flasher/toastr.min.js?id=8ee1218b09fb02d43fcf0b84e30637ad",
|
||||||
"/vendor/flasher/jquery.min.js": "/vendor/flasher/jquery.min.js?id=2c872dbe60f4ba70fb85356113d8b35e",
|
"/vendor/flasher/jquery.min.js": "/vendor/flasher/jquery.min.js?id=2c872dbe60f4ba70fb85356113d8b35e",
|
||||||
"/vendor/flasher/sweetalert2.min.js": "/vendor/flasher/sweetalert2.min.js?id=52e4f161dbe2cf71c99dfef9f94fb1ff",
|
"/vendor/flasher/sweetalert2.min.js": "/vendor/flasher/sweetalert2.min.js?id=bba3afcfe7dcc339fa25fad49842c2bf",
|
||||||
"/vendor/flasher/sweetalert2.min.css": "/vendor/flasher/sweetalert2.min.css?id=a45abfe01a51ef4b1a068fb739f4e540",
|
"/vendor/flasher/sweetalert2.min.css": "/vendor/flasher/sweetalert2.min.css?id=83b54381abbed7676c22f411eba2c61d",
|
||||||
"/vendor/flasher/flasher-sweetalert.min.js": "/vendor/flasher/flasher-sweetalert.min.js?id=bb1df6a783dd98547ccc21338b1c7d5d"
|
"/vendor/flasher/flasher-sweetalert.min.js": "/vendor/flasher/flasher-sweetalert.min.js?id=bb1df6a783dd98547ccc21338b1c7d5d"
|
||||||
}
|
}
|
||||||
+1
-1
File diff suppressed because one or more lines are too long
+2
-2
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
|
|||||||
!function(e,n){"object"==typeof exports&&"undefined"!=typeof module?n(require("../../index.ts")):"function"==typeof define&&define.amd?define(["../../index.ts"],n):n((e="undefined"!=typeof globalThis?globalThis:e||self).flasher)}(this,(function(e){"use strict";e.addTheme("amazon",{render:e=>{const{type:n,message:t}=e,i="error"===n||"warning"===n;return`\n <div class="fl-amazon fl-${n}" role="${i?"alert":"status"}" aria-live="${i?"assertive":"polite"}" aria-atomic="true">\n <div class="fl-amazon-alert">\n <div class="fl-alert-content">\n <div class="fl-icon-container">\n ${(()=>{switch(n){case"success":return'<svg viewBox="0 0 24 24" width="24" height="24">\n <path fill="currentColor" d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z"/>\n </svg>';case"error":return'<svg viewBox="0 0 24 24" width="24" height="24">\n <path fill="currentColor" d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-2h2v2zm0-4h-2V7h2v6z"/>\n </svg>';case"warning":return'<svg viewBox="0 0 24 24" width="24" height="24">\n <path fill="currentColor" d="M1 21h22L12 2 1 21zm12-3h-2v-2h2v2zm0-4h-2v-4h2v4z"/>\n </svg>';case"info":return'<svg viewBox="0 0 24 24" width="24" height="24">\n <path fill="currentColor" d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-6h2v6zm0-8h-2V7h2v2z"/>\n </svg>'}return""})()}\n </div>\n <div class="fl-text-content">\n <div class="fl-alert-title">${(()=>{switch(n){case"success":return"Success!";case"error":return"Problem";case"warning":return"Warning";case"info":return"Information";default:return"Alert"}})()}</div>\n <div class="fl-alert-message">${t}</div>\n </div>\n </div>\n <div class="fl-alert-actions">\n <button class="fl-close" aria-label="Close notification">\n <svg viewBox="0 0 24 24" width="16" height="16">\n <path fill="currentColor" d="M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/>\n </svg>\n </button>\n </div>\n </div>\n </div>`}})}));
|
!function(e,n){"object"==typeof exports&&"undefined"!=typeof module?n(require("@flasher/flasher")):"function"==typeof define&&define.amd?define(["@flasher/flasher"],n):n((e="undefined"!=typeof globalThis?globalThis:e||self).flasher)}(this,(function(e){"use strict";e.addTheme("amazon",{render:e=>{const{type:n,message:t}=e,r="error"===n||"warning"===n;return`\n <div class="fl-amazon fl-${n}" role="${r?"alert":"status"}" aria-live="${r?"assertive":"polite"}" aria-atomic="true">\n <div class="fl-amazon-alert">\n <div class="fl-alert-content">\n <div class="fl-icon-container">\n ${(()=>{switch(n){case"success":return'<svg viewBox="0 0 24 24" width="24" height="24">\n <path fill="currentColor" d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z"/>\n </svg>';case"error":return'<svg viewBox="0 0 24 24" width="24" height="24">\n <path fill="currentColor" d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-2h2v2zm0-4h-2V7h2v6z"/>\n </svg>';case"warning":return'<svg viewBox="0 0 24 24" width="24" height="24">\n <path fill="currentColor" d="M1 21h22L12 2 1 21zm12-3h-2v-2h2v2zm0-4h-2v-4h2v4z"/>\n </svg>';case"info":return'<svg viewBox="0 0 24 24" width="24" height="24">\n <path fill="currentColor" d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-6h2v6zm0-8h-2V7h2v2z"/>\n </svg>'}return""})()}\n </div>\n <div class="fl-text-content">\n <div class="fl-alert-title">${(()=>{switch(n){case"success":return"Success!";case"error":return"Problem";case"warning":return"Warning";case"info":return"Information";default:return"Alert"}})()}</div>\n <div class="fl-alert-message">${t}</div>\n </div>\n </div>\n <div class="fl-alert-actions">\n <button class="fl-close" aria-label="Close notification">\n <svg viewBox="0 0 24 24" width="16" height="16">\n <path fill="currentColor" d="M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/>\n </svg>\n </button>\n </div>\n </div>\n </div>`}})}));
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
.fl-amber{--amber-bg-light:#fff;--amber-bg-dark:#1e293b;--amber-text-light:#4b5563;--amber-text-dark:#f1f5f9;--amber-shadow:0 5px 15px rgba(0,0,0,.08);--amber-shadow-dark:0 5px 15px rgba(0,0,0,.2);--amber-border-radius:0.4rem;--amber-success:#10b981;--amber-info:#3b82f6;--amber-warning:#f59e0b;--amber-error:#ef4444}@-webkit-keyframes amberIn{0%{opacity:0;-webkit-transform:translateY(-12px);transform:translateY(-12px)}to{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@-moz-keyframes amberIn{0%{opacity:0;-moz-transform:translateY(-12px);transform:translateY(-12px)}to{opacity:1;-moz-transform:translateY(0);transform:translateY(0)}}@keyframes amberIn{0%{opacity:0;-webkit-transform:translateY(-12px);-moz-transform:translateY(-12px);transform:translateY(-12px)}to{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);transform:translateY(0)}}.fl-amber{-webkit-animation:amberIn .3s ease-out;-moz-animation:amberIn .3s ease-out;animation:amberIn .3s ease-out;background-color:var(--amber-bg-light);border-radius:var(--amber-border-radius);-webkit-box-shadow:var(--amber-shadow);box-shadow:var(--amber-shadow);color:var(--amber-text-light);font-family:var(--fl-font),serif;margin:.6rem 0;padding:.85rem 1rem;position:relative;will-change:transform,opacity}.fl-amber:last-child{margin-bottom:0}.fl-amber .fl-content{-webkit-box-align:center;-webkit-align-items:center;-moz-box-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-moz-box;display:flex}.fl-amber .fl-icon{font-size:1.85em;margin-right:.8rem}.fl-amber .fl-text{-webkit-box-flex:1;-webkit-flex:1;-moz-box-flex:1;flex:1}.fl-amber .fl-message{font-size:.875em;line-height:1.4}.fl-amber .fl-close{background:none;border:none;color:currentColor;cursor:pointer;-webkit-flex-shrink:0;flex-shrink:0;font-size:1.15rem;margin-left:1rem;opacity:.6;padding:.25rem;touch-action:manipulation;-webkit-transition:opacity .2s;-moz-transition:opacity .2s;transition:opacity .2s}.fl-amber .fl-close:focus,.fl-amber .fl-close:hover{opacity:1}.fl-amber .fl-progress-bar{bottom:0;height:3px;left:0;overflow:hidden;position:absolute;right:0}.fl-amber .fl-progress-bar .fl-progress{height:100%;width:100%}.fl-amber.fl-success .fl-close{color:var(--amber-success)}.fl-amber.fl-info .fl-close{color:var(--amber-info)}.fl-amber.fl-warning .fl-close{color:var(--amber-warning)}.fl-amber.fl-error .fl-close{color:var(--amber-error)}.fl-amber.fl-rtl{direction:rtl}.fl-amber.fl-rtl .fl-icon{margin-left:.8rem;margin-right:0}.fl-amber.fl-rtl .fl-close{margin-left:0;margin-right:1rem}.fl-amber.fl-rtl .fl-progress .fl-progress{-webkit-transform-origin:right center;-moz-transform-origin:right center;-ms-transform-origin:right center;transform-origin:right center}@media (prefers-reduced-motion:reduce){.fl-amber{-webkit-animation:none;-moz-animation:none;animation:none}}.fl-amber.fl-auto-dark,body.fl-dark .fl-amber,html.fl-dark .fl-amber{background-color:var(--amber-bg-dark);-webkit-box-shadow:var(--amber-shadow-dark);box-shadow:var(--amber-shadow-dark);color:var(--amber-text-dark)}
|
.fl-amber{--amber-bg-light:#fff;--amber-bg-dark:#1e293b;--amber-text-light:#4b5563;--amber-text-dark:#f1f5f9;--amber-shadow:0 5px 15px rgba(0,0,0,.08);--amber-shadow-dark:0 5px 15px rgba(0,0,0,.2);--amber-border-radius:0.4rem;--amber-success:#10b981;--amber-info:#3b82f6;--amber-warning:#f59e0b;--amber-error:#ef4444}@keyframes amberIn{0%{opacity:0;transform:translateY(-12px)}to{opacity:1;transform:translateY(0)}}.fl-amber{animation:amberIn .3s ease-out;background-color:var(--amber-bg-light);border-radius:var(--amber-border-radius);box-shadow:var(--amber-shadow);color:var(--amber-text-light);font-family:var(--fl-font),serif;margin:.6rem 0;padding:.85rem 1rem;position:relative;will-change:transform,opacity}.fl-amber:last-child{margin-bottom:0}.fl-amber .fl-content{align-items:center;display:flex}.fl-amber .fl-icon{font-size:1.85em;margin-right:.8rem}.fl-amber .fl-text{flex:1}.fl-amber .fl-message{font-size:.875em;line-height:1.4}.fl-amber .fl-close{background:none;border:none;color:currentColor;cursor:pointer;flex-shrink:0;font-size:1.15rem;margin-left:1rem;opacity:.6;padding:.25rem;touch-action:manipulation;transition:opacity .2s}.fl-amber .fl-close:focus,.fl-amber .fl-close:hover{opacity:1}.fl-amber .fl-progress-bar{bottom:0;height:3px;left:0;overflow:hidden;position:absolute;right:0}.fl-amber .fl-progress-bar .fl-progress{height:100%;width:100%}.fl-amber.fl-success .fl-close{color:var(--amber-success)}.fl-amber.fl-info .fl-close{color:var(--amber-info)}.fl-amber.fl-warning .fl-close{color:var(--amber-warning)}.fl-amber.fl-error .fl-close{color:var(--amber-error)}.fl-amber.fl-rtl{direction:rtl}.fl-amber.fl-rtl .fl-icon{margin-left:.8rem;margin-right:0}.fl-amber.fl-rtl .fl-close{margin-left:0;margin-right:1rem}.fl-amber.fl-rtl .fl-progress .fl-progress{transform-origin:right center}@media (prefers-reduced-motion:reduce){.fl-amber{animation:none}}.fl-amber.fl-auto-dark,body.fl-dark .fl-amber,html.fl-dark .fl-amber{background-color:var(--amber-bg-dark);box-shadow:var(--amber-shadow-dark);color:var(--amber-text-dark)}
|
||||||
@@ -1 +1 @@
|
|||||||
!function(e,s){"object"==typeof exports&&"undefined"!=typeof module?s(require("../../index.ts")):"function"==typeof define&&define.amd?define(["../../index.ts"],s):s((e="undefined"!=typeof globalThis?globalThis:e||self).flasher)}(this,(function(e){"use strict";e.addTheme("amber",{render:e=>{const{type:s,message:i}=e,n="error"===s||"warning"===s;return`\n <div class="fl-amber fl-${s}" role="${n?"alert":"status"}" aria-live="${n?"assertive":"polite"}" aria-atomic="true">\n <div class="fl-content">\n <div class="fl-icon"></div>\n <div class="fl-text">\n <div class="fl-message">${i}</div>\n </div>\n <button class="fl-close" aria-label="Close ${s} message">×</button>\n </div>\n <div class="fl-progress-bar">\n <div class="fl-progress"></div>\n </div>\n </div>`}})}));
|
!function(e,s){"object"==typeof exports&&"undefined"!=typeof module?s(require("@flasher/flasher")):"function"==typeof define&&define.amd?define(["@flasher/flasher"],s):s((e="undefined"!=typeof globalThis?globalThis:e||self).flasher)}(this,(function(e){"use strict";e.addTheme("amber",{render:e=>{const{type:s,message:i}=e,l="error"===s||"warning"===s;return`\n <div class="fl-amber fl-${s}" role="${l?"alert":"status"}" aria-live="${l?"assertive":"polite"}" aria-atomic="true">\n <div class="fl-content">\n <div class="fl-icon"></div>\n <div class="fl-text">\n <div class="fl-message">${i}</div>\n </div>\n <button class="fl-close" aria-label="Close ${s} message">×</button>\n </div>\n <div class="fl-progress-bar">\n <div class="fl-progress"></div>\n </div>\n </div>`}})}));
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
|
|||||||
!function(e,s){"object"==typeof exports&&"undefined"!=typeof module?s(require("../../index.ts")):"function"==typeof define&&define.amd?define(["../../index.ts"],s):s((e="undefined"!=typeof globalThis?globalThis:e||self).flasher)}(this,(function(e){"use strict";e.addTheme("aurora",{render:e=>{const{type:s,message:i}=e,n="error"===s||"warning"===s;return`\n <div class="fl-aurora fl-${s}" role="${n?"alert":"status"}" aria-live="${n?"assertive":"polite"}" aria-atomic="true">\n <div class="fl-content">\n <div class="fl-message">${i}</div>\n <button class="fl-close" aria-label="Close ${s} message">×</button>\n </div>\n <div class="fl-progress-bar">\n <div class="fl-progress"></div>\n </div>\n </div>`}})}));
|
!function(e,s){"object"==typeof exports&&"undefined"!=typeof module?s(require("@flasher/flasher")):"function"==typeof define&&define.amd?define(["@flasher/flasher"],s):s((e="undefined"!=typeof globalThis?globalThis:e||self).flasher)}(this,(function(e){"use strict";e.addTheme("aurora",{render:e=>{const{type:s,message:a}=e,r="error"===s||"warning"===s;return`\n <div class="fl-aurora fl-${s}" role="${r?"alert":"status"}" aria-live="${r?"assertive":"polite"}" aria-atomic="true">\n <div class="fl-content">\n <div class="fl-message">${a}</div>\n <button class="fl-close" aria-label="Close ${s} message">×</button>\n </div>\n <div class="fl-progress-bar">\n <div class="fl-progress"></div>\n </div>\n </div>`}})}));
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
|
|||||||
!function(e,s){"object"==typeof exports&&"undefined"!=typeof module?s(require("../../index.ts")):"function"==typeof define&&define.amd?define(["../../index.ts"],s):s((e="undefined"!=typeof globalThis?globalThis:e||self).flasher)}(this,(function(e){"use strict";e.addTheme("crystal",{render:e=>{const{type:s,message:n}=e,t="error"===s||"warning"===s;return`\n <div class="fl-crystal fl-${s}" role="${t?"alert":"status"}" aria-live="${t?"assertive":"polite"}" aria-atomic="true">\n <div class="fl-content">\n <div class="fl-text">\n <p class="fl-message">${n}</p>\n </div>\n <button class="fl-close" aria-label="Close ${s} message">×</button>\n </div>\n <div class="fl-progress-bar">\n <div class="fl-progress"></div>\n </div>\n </div>`}})}));
|
!function(e,s){"object"==typeof exports&&"undefined"!=typeof module?s(require("@flasher/flasher")):"function"==typeof define&&define.amd?define(["@flasher/flasher"],s):s((e="undefined"!=typeof globalThis?globalThis:e||self).flasher)}(this,(function(e){"use strict";e.addTheme("crystal",{render:e=>{const{type:s,message:l}=e,a="error"===s||"warning"===s;return`\n <div class="fl-crystal fl-${s}" role="${a?"alert":"status"}" aria-live="${a?"assertive":"polite"}" aria-atomic="true">\n <div class="fl-content">\n <div class="fl-text">\n <p class="fl-message">${l}</p>\n </div>\n <button class="fl-close" aria-label="Close ${s} message">×</button>\n </div>\n <div class="fl-progress-bar">\n <div class="fl-progress"></div>\n </div>\n </div>`}})}));
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
.fl-emerald{--emerald-bg-light:hsla(0,0%,100%,.9);--emerald-bg-dark:rgba(30,30,30,.9);--emerald-text-light:#333;--emerald-text-dark:hsla(0,0%,100%,.9);--emerald-shadow:rgba(0,0,0,.1);--emerald-blur:8px;--emerald-success:var(--success-color,#16a085);--emerald-error:var(--error-color,#e74c3c);--emerald-warning:var(--warning-color,#f39c12);--emerald-info:var(--info-color,#3498db)}@-webkit-keyframes emeraldIn{0%{opacity:0;-webkit-transform:scale(.5) translateY(20px);transform:scale(.5) translateY(20px)}60%{opacity:1;-webkit-transform:scale(1.1) translateY(-5px);transform:scale(1.1) translateY(-5px)}to{opacity:1;-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}}@-moz-keyframes emeraldIn{0%{opacity:0;-moz-transform:scale(.5) translateY(20px);transform:scale(.5) translateY(20px)}60%{opacity:1;-moz-transform:scale(1.1) translateY(-5px);transform:scale(1.1) translateY(-5px)}to{opacity:1;-moz-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}}@keyframes emeraldIn{0%{opacity:0;-webkit-transform:scale(.5) translateY(20px);-moz-transform:scale(.5) translateY(20px);transform:scale(.5) translateY(20px)}60%{opacity:1;-webkit-transform:scale(1.1) translateY(-5px);-moz-transform:scale(1.1) translateY(-5px);transform:scale(1.1) translateY(-5px)}to{opacity:1;-webkit-transform:scale(1) translateY(0);-moz-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}}.fl-emerald{-webkit-animation:emeraldIn .5s cubic-bezier(.23,1,.32,1);-moz-animation:emeraldIn .5s cubic-bezier(.23,1,.32,1);animation:emeraldIn .5s cubic-bezier(.23,1,.32,1);backdrop-filter:blur(var(--emerald-blur));-webkit-backdrop-filter:blur(var(--emerald-blur));background:var(--emerald-bg-light);border-radius:10px;-webkit-box-shadow:0 10px 20px var(--emerald-shadow);box-shadow:0 10px 20px var(--emerald-shadow);color:var(--emerald-text-light);font-family:"Inter",var(--fl-font),serif;margin:0 0 .5rem;overflow:hidden;padding:1rem 1.5rem 1rem 1rem;position:relative}.fl-emerald .fl-content{-webkit-box-align:center;-webkit-align-items:center;-moz-box-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-moz-box;display:flex}.fl-emerald .fl-message{-webkit-box-flex:1;-webkit-flex:1;-moz-box-flex:1;flex:1;font-size:.9rem;font-weight:500;line-height:1.4}.fl-emerald .fl-close{background:transparent;border:none;color:currentColor;cursor:pointer;font-size:1.3rem;margin-left:auto;opacity:.7;-webkit-transition:opacity .2s ease;-moz-transition:opacity .2s ease;transition:opacity .2s ease}.fl-emerald .fl-close:focus,.fl-emerald .fl-close:hover{opacity:1}.fl-emerald.fl-success{color:var(--emerald-success)}.fl-emerald.fl-error{color:var(--emerald-error)}.fl-emerald.fl-warning{color:var(--emerald-warning)}.fl-emerald.fl-info{color:var(--emerald-info)}.fl-emerald.fl-rtl{direction:rtl;padding:1rem 1rem 1rem 1.5rem}.fl-emerald.fl-rtl .fl-content{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-moz-box-orient:horizontal;-moz-box-direction:reverse;flex-direction:row-reverse}.fl-emerald.fl-rtl .fl-close{margin-left:0;margin-right:auto}@media (prefers-reduced-motion:reduce){.fl-emerald{-webkit-animation:none;-moz-animation:none;animation:none}}.fl-emerald.fl-auto-dark,body.fl-dark .fl-emerald,html.fl-dark .fl-emerald{background:var(--emerald-bg-dark)}.fl-emerald.fl-auto-dark .fl-message,body.fl-dark .fl-emerald .fl-message,html.fl-dark .fl-emerald .fl-message{color:var(--emerald-text-dark)}
|
.fl-emerald{--emerald-bg-light:hsla(0,0%,100%,.9);--emerald-bg-dark:rgba(30,30,30,.9);--emerald-text-light:#333;--emerald-text-dark:hsla(0,0%,100%,.9);--emerald-shadow:rgba(0,0,0,.1);--emerald-blur:8px;--emerald-success:var(--success-color,#16a085);--emerald-error:var(--error-color,#e74c3c);--emerald-warning:var(--warning-color,#f39c12);--emerald-info:var(--info-color,#3498db)}@keyframes emeraldIn{0%{opacity:0;transform:scale(.5) translateY(20px)}60%{opacity:1;transform:scale(1.1) translateY(-5px)}to{opacity:1;transform:scale(1) translateY(0)}}.fl-emerald{animation:emeraldIn .5s cubic-bezier(.23,1,.32,1);backdrop-filter:blur(var(--emerald-blur));-webkit-backdrop-filter:blur(var(--emerald-blur));background:var(--emerald-bg-light);border-radius:10px;box-shadow:0 10px 20px var(--emerald-shadow);color:var(--emerald-text-light);font-family:"Inter",var(--fl-font),serif;margin:0 0 .5rem;overflow:hidden;padding:1rem 1.5rem 1rem 1rem;position:relative}.fl-emerald .fl-content{align-items:center;display:flex}.fl-emerald .fl-message{flex:1;font-size:.9rem;font-weight:500;line-height:1.4}.fl-emerald .fl-close{background:transparent;border:none;color:currentColor;cursor:pointer;font-size:1.3rem;margin-left:auto;opacity:.7;transition:opacity .2s ease}.fl-emerald .fl-close:focus,.fl-emerald .fl-close:hover{opacity:1}.fl-emerald.fl-success{color:var(--emerald-success)}.fl-emerald.fl-error{color:var(--emerald-error)}.fl-emerald.fl-warning{color:var(--emerald-warning)}.fl-emerald.fl-info{color:var(--emerald-info)}.fl-emerald.fl-rtl{direction:rtl;padding:1rem 1rem 1rem 1.5rem}.fl-emerald.fl-rtl .fl-content{flex-direction:row-reverse}.fl-emerald.fl-rtl .fl-close{margin-left:0;margin-right:auto}@media (prefers-reduced-motion:reduce){.fl-emerald{animation:none}}.fl-emerald.fl-auto-dark,body.fl-dark .fl-emerald,html.fl-dark .fl-emerald{background:var(--emerald-bg-dark)}.fl-emerald.fl-auto-dark .fl-message,body.fl-dark .fl-emerald .fl-message,html.fl-dark .fl-emerald .fl-message{color:var(--emerald-text-dark)}
|
||||||
@@ -1 +1 @@
|
|||||||
!function(e,s){"object"==typeof exports&&"undefined"!=typeof module?s(require("../../index.ts")):"function"==typeof define&&define.amd?define(["../../index.ts"],s):s((e="undefined"!=typeof globalThis?globalThis:e||self).flasher)}(this,(function(e){"use strict";e.addTheme("emerald",{render:e=>{const{type:s,message:n}=e,t="error"===s||"warning"===s;return`\n <div class="fl-emerald fl-${s}" role="${t?"alert":"status"}" aria-live="${t?"assertive":"polite"}" aria-atomic="true">\n <div class="fl-content">\n <div class="fl-message">${n}</div>\n <button class="fl-close" aria-label="Close ${s} message">×</button>\n </div>\n </div>`}})}));
|
!function(e,s){"object"==typeof exports&&"undefined"!=typeof module?s(require("@flasher/flasher")):"function"==typeof define&&define.amd?define(["@flasher/flasher"],s):s((e="undefined"!=typeof globalThis?globalThis:e||self).flasher)}(this,(function(e){"use strict";e.addTheme("emerald",{render:e=>{const{type:s,message:a}=e,l="error"===s||"warning"===s;return`\n <div class="fl-emerald fl-${s}" role="${l?"alert":"status"}" aria-live="${l?"assertive":"polite"}" aria-atomic="true">\n <div class="fl-content">\n <div class="fl-message">${a}</div>\n <button class="fl-close" aria-label="Close ${s} message">×</button>\n </div>\n </div>`}})}));
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
|
|||||||
!function(n,i){"object"==typeof exports&&"undefined"!=typeof module?i(require("../../index.ts")):"function"==typeof define&&define.amd?define(["../../index.ts"],i):i((n="undefined"!=typeof globalThis?globalThis:n||self).flasher)}(this,(function(n){"use strict";const i={render:n=>{var i;const{type:s,message:e}=n,t="error"===s||"warning"===s,l=t?"alert":"status",o=t?"assertive":"polite",c=String((null===(i=n.options)||void 0===i?void 0:i.timestamp)||"2025-03-02 06:49:21").split(" ")[1].substring(0,5);return`\n <div class="fl-facebook fl-${s}" role="${l}" aria-live="${o}" aria-atomic="true">\n <div class="fl-fb-notification">\n <div class="fl-icon-container">\n ${(()=>{switch(s){case"success":return'<div class="fl-fb-icon fl-fb-icon-success">\n <svg viewBox="0 0 24 24" width="16" height="16">\n <path fill="currentColor" d="M12 22C6.477 22 2 17.523 2 12S6.477 2 12 2s10 4.477 10 10-4.477 10-10 10zm-1-11v6h2v-6h-2zm0-4v2h2V7h-2z"/>\n </svg>\n </div>';case"error":return'<div class="fl-fb-icon fl-fb-icon-error">\n <svg viewBox="0 0 24 24" width="16" height="16">\n <path fill="currentColor" d="M12 22C6.477 22 2 17.523 2 12S6.477 2 12 2s10 4.477 10 10-4.477 10-10 10zm0-11.5c-.69 0-1.25.56-1.25 1.25S11.31 13 12 13s1.25-.56 1.25-1.25S12.69 10.5 12 10.5zM12 9c.552 0 1-.448 1-1V7c0-.552-.448-1-1-1s-1 .448-1 1v1c0 .552.448 1 1 1z"/>\n </svg>\n </div>';case"warning":return'<div class="fl-fb-icon fl-fb-icon-warning">\n <svg viewBox="0 0 24 24" width="16" height="16">\n <path fill="currentColor" d="M12.865 3.00017L22.3912 19.5002C22.6674 19.9785 22.5035 20.5901 22.0252 20.8662C21.8732 20.954 21.7008 21.0002 21.5252 21.0002H2.47266C1.92037 21.0002 1.47266 20.5525 1.47266 20.0002C1.47266 19.8246 1.51886 19.6522 1.60663 19.5002L11.1329 3.00017C11.409 2.52187 12.0206 2.358 12.4989 2.63414C12.651 2.72192 12.7772 2.84815 12.865 3.00017ZM11 16.0002V18.0002H13V16.0002H11ZM11 8.00017V14.0002H13V8.00017H11Z"/>\n </svg>\n </div>';case"info":return'<div class="fl-fb-icon fl-fb-icon-info">\n <svg viewBox="0 0 24 24" width="16" height="16">\n <path fill="currentColor" d="M12 22C6.477 22 2 17.523 2 12S6.477 2 12 2s10 4.477 10 10-4.477 10-10 10zm0-2a8 8 0 100-16 8 8 0 000 16zm-1-5h2v-2h-2v2zm0-4h2V7h-2v4z"/>\n </svg>\n </div>'}return""})()}\n </div>\n <div class="fl-content">\n <div class="fl-message">\n ${e}\n </div>\n <div class="fl-meta">\n <span class="fl-time">${c}</span>\n </div>\n </div>\n <div class="fl-actions">\n <button class="fl-button fl-close" aria-label="Close ${s} message">\n <div class="fl-button-icon">\n <svg viewBox="0 0 24 24" width="20" height="20">\n <path fill="currentColor" d="M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41z"/>\n </svg>\n </div>\n </button>\n </div>\n </div>\n </div>`}};n.addTheme("facebook",i)}));
|
!function(n,i){"object"==typeof exports&&"undefined"!=typeof module?i(require("@flasher/flasher")):"function"==typeof define&&define.amd?define(["@flasher/flasher"],i):i((n="undefined"!=typeof globalThis?globalThis:n||self).flasher)}(this,(function(n){"use strict";const i={render:n=>{var i;const{type:s,message:e}=n,l="error"===s||"warning"===s,t=l?"alert":"status",o=l?"assertive":"polite",r=String((null===(i=n.options)||void 0===i?void 0:i.timestamp)||"2025-03-02 06:49:21").split(" ")[1].substring(0,5);return`\n <div class="fl-facebook fl-${s}" role="${t}" aria-live="${o}" aria-atomic="true">\n <div class="fl-fb-notification">\n <div class="fl-icon-container">\n ${(()=>{switch(s){case"success":return'<div class="fl-fb-icon fl-fb-icon-success">\n <svg viewBox="0 0 24 24" width="16" height="16">\n <path fill="currentColor" d="M12 22C6.477 22 2 17.523 2 12S6.477 2 12 2s10 4.477 10 10-4.477 10-10 10zm-1-11v6h2v-6h-2zm0-4v2h2V7h-2z"/>\n </svg>\n </div>';case"error":return'<div class="fl-fb-icon fl-fb-icon-error">\n <svg viewBox="0 0 24 24" width="16" height="16">\n <path fill="currentColor" d="M12 22C6.477 22 2 17.523 2 12S6.477 2 12 2s10 4.477 10 10-4.477 10-10 10zm0-11.5c-.69 0-1.25.56-1.25 1.25S11.31 13 12 13s1.25-.56 1.25-1.25S12.69 10.5 12 10.5zM12 9c.552 0 1-.448 1-1V7c0-.552-.448-1-1-1s-1 .448-1 1v1c0 .552.448 1 1 1z"/>\n </svg>\n </div>';case"warning":return'<div class="fl-fb-icon fl-fb-icon-warning">\n <svg viewBox="0 0 24 24" width="16" height="16">\n <path fill="currentColor" d="M12.865 3.00017L22.3912 19.5002C22.6674 19.9785 22.5035 20.5901 22.0252 20.8662C21.8732 20.954 21.7008 21.0002 21.5252 21.0002H2.47266C1.92037 21.0002 1.47266 20.5525 1.47266 20.0002C1.47266 19.8246 1.51886 19.6522 1.60663 19.5002L11.1329 3.00017C11.409 2.52187 12.0206 2.358 12.4989 2.63414C12.651 2.72192 12.7772 2.84815 12.865 3.00017ZM11 16.0002V18.0002H13V16.0002H11ZM11 8.00017V14.0002H13V8.00017H11Z"/>\n </svg>\n </div>';case"info":return'<div class="fl-fb-icon fl-fb-icon-info">\n <svg viewBox="0 0 24 24" width="16" height="16">\n <path fill="currentColor" d="M12 22C6.477 22 2 17.523 2 12S6.477 2 12 2s10 4.477 10 10-4.477 10-10 10zm0-2a8 8 0 100-16 8 8 0 000 16zm-1-5h2v-2h-2v2zm0-4h2V7h-2v4z"/>\n </svg>\n </div>'}return""})()}\n </div>\n <div class="fl-content">\n <div class="fl-message">\n ${e}\n </div>\n <div class="fl-meta">\n <span class="fl-time">${r}</span>\n </div>\n </div>\n <div class="fl-actions">\n <button class="fl-button fl-close" aria-label="Close ${s} message">\n <div class="fl-button-icon">\n <svg viewBox="0 0 24 24" width="20" height="20">\n <path fill="currentColor" d="M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41z"/>\n </svg>\n </div>\n </button>\n </div>\n </div>\n </div>`}};n.addTheme("facebook",i)}));
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
|
|||||||
!function(e,s){"object"==typeof exports&&"undefined"!=typeof module?s(require("../../index.ts")):"function"==typeof define&&define.amd?define(["../../index.ts"],s):s((e="undefined"!=typeof globalThis?globalThis:e||self).flasher)}(this,(function(e){"use strict";e.addTheme("flasher",{render:e=>{const{type:s,title:n,message:a}=e,t="error"===s||"warning"===s,l=t?"alert":"status",i=t?"assertive":"polite",r=n||s.charAt(0).toUpperCase()+s.slice(1);return`\n <div class="fl-flasher fl-${s}" role="${l}" aria-live="${i}" aria-atomic="true">\n <div class="fl-content">\n <div class="fl-icon"></div>\n <div>\n <strong class="fl-title">${r}</strong>\n <span class="fl-message">${a}</span>\n </div>\n <button class="fl-close" aria-label="Close ${s} message">×</button>\n </div>\n <span class="fl-progress-bar">\n <span class="fl-progress"></span>\n </span>\n </div>`}})}));
|
!function(e,s){"object"==typeof exports&&"undefined"!=typeof module?s(require("@flasher/flasher")):"function"==typeof define&&define.amd?define(["@flasher/flasher"],s):s((e="undefined"!=typeof globalThis?globalThis:e||self).flasher)}(this,(function(e){"use strict";e.addTheme("flasher",{render:e=>{const{type:s,title:n,message:a}=e,l="error"===s||"warning"===s,t=l?"alert":"status",r=l?"assertive":"polite",i=n||s.charAt(0).toUpperCase()+s.slice(1);return`\n <div class="fl-flasher fl-${s}" role="${t}" aria-live="${r}" aria-atomic="true">\n <div class="fl-content">\n <div class="fl-icon"></div>\n <div>\n <strong class="fl-title">${i}</strong>\n <span class="fl-message">${a}</span>\n </div>\n <button class="fl-close" aria-label="Close ${s} message">×</button>\n </div>\n <span class="fl-progress-bar">\n <span class="fl-progress"></span>\n </span>\n </div>`}})}));
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
|
|||||||
!function(s,e){"object"==typeof exports&&"undefined"!=typeof module?e(require("../../index.ts")):"function"==typeof define&&define.amd?define(["../../index.ts"],e):e((s="undefined"!=typeof globalThis?globalThis:s||self).flasher)}(this,(function(s){"use strict";s.addTheme("google",{render:s=>{const{type:e,message:n,title:i}=s,l="error"===e||"warning"===e,t=i?`<div class="fl-title">${i}</div>`:"";return`\n <div class="fl-google fl-${e}" role="${l?"alert":"status"}" aria-live="${l?"assertive":"polite"}" aria-atomic="true">\n <div class="fl-md-card">\n <div class="fl-content">\n <div class="fl-icon-wrapper">\n ${(()=>{switch(e){case"success":return'<svg class="fl-icon-svg" viewBox="0 0 24 24" width="24" height="24">\n <path fill="currentColor" d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z"/>\n </svg>';case"error":return'<svg class="fl-icon-svg" viewBox="0 0 24 24" width="24" height="24">\n <path fill="currentColor" d="M12 2C6.47 2 2 6.47 2 12s4.47 10 10 10 10-4.47 10-10S17.53 2 12 2zm5 13.59L15.59 17 12 13.41 8.41 17 7 15.59 10.59 12 7 8.41 8.41 7 12 10.59 15.59 7 17 8.41 13.41 12 17 15.59z"/>\n </svg>';case"warning":return'<svg class="fl-icon-svg" viewBox="0 0 24 24" width="24" height="24">\n <path fill="currentColor" d="M12 5.99L19.53 19H4.47L12 5.99M12 2L1 21h22L12 2zm1 14h-2v2h2v-2zm0-6h-2v4h2v-4z"/>\n </svg>';case"info":return'<svg class="fl-icon-svg" viewBox="0 0 24 24" width="24" height="24">\n <path fill="currentColor" d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-6h2v6zm0-8h-2V7h2v2z"/>\n </svg>'}return""})()}\n </div>\n <div class="fl-text-content">\n ${t}\n <div class="fl-message">${n}</div>\n </div>\n </div>\n <div class="fl-actions">\n <button class="fl-action-button fl-close" aria-label="Close ${e} message">\n DISMISS\n </button>\n </div>\n </div>\n <div class="fl-progress-bar">\n <div class="fl-progress"></div>\n </div>\n </div>`}})}));
|
!function(s,e){"object"==typeof exports&&"undefined"!=typeof module?e(require("@flasher/flasher")):"function"==typeof define&&define.amd?define(["@flasher/flasher"],e):e((s="undefined"!=typeof globalThis?globalThis:s||self).flasher)}(this,(function(s){"use strict";s.addTheme("google",{render:s=>{const{type:e,message:n,title:l}=s,i="error"===e||"warning"===e,t=l?`<div class="fl-title">${l}</div>`:"";return`\n <div class="fl-google fl-${e}" role="${i?"alert":"status"}" aria-live="${i?"assertive":"polite"}" aria-atomic="true">\n <div class="fl-md-card">\n <div class="fl-content">\n <div class="fl-icon-wrapper">\n ${(()=>{switch(e){case"success":return'<svg class="fl-icon-svg" viewBox="0 0 24 24" width="24" height="24">\n <path fill="currentColor" d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z"/>\n </svg>';case"error":return'<svg class="fl-icon-svg" viewBox="0 0 24 24" width="24" height="24">\n <path fill="currentColor" d="M12 2C6.47 2 2 6.47 2 12s4.47 10 10 10 10-4.47 10-10S17.53 2 12 2zm5 13.59L15.59 17 12 13.41 8.41 17 7 15.59 10.59 12 7 8.41 8.41 7 12 10.59 15.59 7 17 8.41 13.41 12 17 15.59z"/>\n </svg>';case"warning":return'<svg class="fl-icon-svg" viewBox="0 0 24 24" width="24" height="24">\n <path fill="currentColor" d="M12 5.99L19.53 19H4.47L12 5.99M12 2L1 21h22L12 2zm1 14h-2v2h2v-2zm0-6h-2v4h2v-4z"/>\n </svg>';case"info":return'<svg class="fl-icon-svg" viewBox="0 0 24 24" width="24" height="24">\n <path fill="currentColor" d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-6h2v6zm0-8h-2V7h2v2z"/>\n </svg>'}return""})()}\n </div>\n <div class="fl-text-content">\n ${t}\n <div class="fl-message">${n}</div>\n </div>\n </div>\n <div class="fl-actions">\n <button class="fl-action-button fl-close" aria-label="Close ${e} message">\n DISMISS\n </button>\n </div>\n </div>\n <div class="fl-progress-bar">\n <div class="fl-progress"></div>\n </div>\n </div>`}})}));
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
|
|||||||
!function(e,i){"object"==typeof exports&&"undefined"!=typeof module?i(require("../../index.ts")):"function"==typeof define&&define.amd?define(["../../index.ts"],i):i((e="undefined"!=typeof globalThis?globalThis:e||self).flasher)}(this,(function(e){"use strict";const i={render:e=>{const{type:i,message:s,title:n}=e,t="error"===i||"warning"===i,l=t?"alert":"status",a=t?"assertive":"polite",r=(new Date).toLocaleTimeString([],{hour:"numeric",minute:"2-digit"}),o=n||"PHPFlasher";return`\n <div class="fl-ios fl-${i}" role="${l}" aria-live="${a}" aria-atomic="true">\n <div class="fl-ios-notification">\n <div class="fl-header">\n <div class="fl-app-icon">\n ${(()=>{switch(i){case"success":return'<svg class="fl-icon-svg" viewBox="0 0 24 24" width="20" height="20">\n <path fill="currentColor" d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z"/>\n </svg>';case"error":return'<svg class="fl-icon-svg" viewBox="0 0 24 24" width="20" height="20">\n <path fill="currentColor" d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-2h2v2zm0-4h-2V7h2v6z"/>\n </svg>';case"warning":return'<svg class="fl-icon-svg" viewBox="0 0 24 24" width="20" height="20">\n <path fill="currentColor" d="M1 21h22L12 2 1 21zm12-3h-2v-2h2v2zm0-4h-2v-4h2v4z"/>\n </svg>';case"info":return'<svg class="fl-icon-svg" viewBox="0 0 24 24" width="20" height="20">\n <path fill="currentColor" d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-6h2v6zm0-8h-2V7h2v2z"/>\n </svg>'}return""})()}\n </div>\n <div class="fl-app-info">\n <div class="fl-app-name">${o}</div>\n <div class="fl-time">${r}</div>\n </div>\n </div>\n <div class="fl-content">\n <div class="fl-message">${s}</div>\n </div>\n <button class="fl-close" aria-label="Close ${i} message">\n <span aria-hidden="true">×</span>\n </button>\n </div>\n </div>`}};e.addTheme("ios",i)}));
|
!function(e,s){"object"==typeof exports&&"undefined"!=typeof module?s(require("@flasher/flasher")):"function"==typeof define&&define.amd?define(["@flasher/flasher"],s):s((e="undefined"!=typeof globalThis?globalThis:e||self).flasher)}(this,(function(e){"use strict";const s={render:e=>{const{type:s,message:i,title:n}=e,l="error"===s||"warning"===s,t=l?"alert":"status",a=l?"assertive":"polite",r=(new Date).toLocaleTimeString([],{hour:"numeric",minute:"2-digit"}),o=n||"PHPFlasher";return`\n <div class="fl-ios fl-${s}" role="${t}" aria-live="${a}" aria-atomic="true">\n <div class="fl-ios-notification">\n <div class="fl-header">\n <div class="fl-app-icon">\n ${(()=>{switch(s){case"success":return'<svg class="fl-icon-svg" viewBox="0 0 24 24" width="20" height="20">\n <path fill="currentColor" d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z"/>\n </svg>';case"error":return'<svg class="fl-icon-svg" viewBox="0 0 24 24" width="20" height="20">\n <path fill="currentColor" d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-2h2v2zm0-4h-2V7h2v6z"/>\n </svg>';case"warning":return'<svg class="fl-icon-svg" viewBox="0 0 24 24" width="20" height="20">\n <path fill="currentColor" d="M1 21h22L12 2 1 21zm12-3h-2v-2h2v2zm0-4h-2v-4h2v4z"/>\n </svg>';case"info":return'<svg class="fl-icon-svg" viewBox="0 0 24 24" width="20" height="20">\n <path fill="currentColor" d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-6h2v6zm0-8h-2V7h2v2z"/>\n </svg>'}return""})()}\n </div>\n <div class="fl-app-info">\n <div class="fl-app-name">${o}</div>\n <div class="fl-time">${r}</div>\n </div>\n </div>\n <div class="fl-content">\n <div class="fl-message">${i}</div>\n </div>\n <button class="fl-close" aria-label="Close ${s} message">\n <span aria-hidden="true">×</span>\n </button>\n </div>\n </div>`}};e.addTheme("ios",s)}));
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
|
|||||||
!function(e,s){"object"==typeof exports&&"undefined"!=typeof module?s(require("../../index.ts")):"function"==typeof define&&define.amd?define(["../../index.ts"],s):s((e="undefined"!=typeof globalThis?globalThis:e||self).flasher)}(this,(function(e){"use strict";e.addTheme("jade",{render:e=>{const{type:s,message:i}=e,n="error"===s||"warning"===s;return`\n <div class="fl-jade fl-${s}" role="${n?"alert":"status"}" aria-live="${n?"assertive":"polite"}" aria-atomic="true">\n <div class="fl-content">\n <div class="fl-message">${i}</div>\n <button class="fl-close" aria-label="Close ${s} message">×</button>\n </div>\n <div class="fl-progress-bar">\n <div class="fl-progress"></div>\n </div>\n </div>`}})}));
|
!function(e,s){"object"==typeof exports&&"undefined"!=typeof module?s(require("@flasher/flasher")):"function"==typeof define&&define.amd?define(["@flasher/flasher"],s):s((e="undefined"!=typeof globalThis?globalThis:e||self).flasher)}(this,(function(e){"use strict";e.addTheme("jade",{render:e=>{const{type:s,message:a}=e,l="error"===s||"warning"===s;return`\n <div class="fl-jade fl-${s}" role="${l?"alert":"status"}" aria-live="${l?"assertive":"polite"}" aria-atomic="true">\n <div class="fl-content">\n <div class="fl-message">${a}</div>\n <button class="fl-close" aria-label="Close ${s} message">×</button>\n </div>\n <div class="fl-progress-bar">\n <div class="fl-progress"></div>\n </div>\n </div>`}})}));
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
|
|||||||
!function(e,n){"object"==typeof exports&&"undefined"!=typeof module?n(require("../../index.ts")):"function"==typeof define&&define.amd?define(["../../index.ts"],n):n((e="undefined"!=typeof globalThis?globalThis:e||self).flasher)}(this,(function(e){"use strict";e.addTheme("material",{render:e=>{const{type:n,message:s}=e,i="error"===n||"warning"===n;return`\n <div class="fl-material fl-${n}" role="${i?"alert":"status"}" aria-live="${i?"assertive":"polite"}" aria-atomic="true">\n <div class="fl-md-card">\n <div class="fl-content">\n <div class="fl-text-content">\n <div class="fl-message">${s}</div>\n </div>\n </div>\n <div class="fl-actions">\n <button class="fl-action-button fl-close" aria-label="Close ${n} message">\n DISMISS\n </button>\n </div>\n </div>\n <div class="fl-progress-bar">\n <div class="fl-progress"></div>\n </div>\n </div>`}})}));
|
!function(e,s){"object"==typeof exports&&"undefined"!=typeof module?s(require("@flasher/flasher")):"function"==typeof define&&define.amd?define(["@flasher/flasher"],s):s((e="undefined"!=typeof globalThis?globalThis:e||self).flasher)}(this,(function(e){"use strict";e.addTheme("material",{render:e=>{const{type:s,message:n}=e,a="error"===s||"warning"===s;return`\n <div class="fl-material fl-${s}" role="${a?"alert":"status"}" aria-live="${a?"assertive":"polite"}" aria-atomic="true">\n <div class="fl-md-card">\n <div class="fl-content">\n <div class="fl-text-content">\n <div class="fl-message">${n}</div>\n </div>\n </div>\n <div class="fl-actions">\n <button class="fl-action-button fl-close" aria-label="Close ${s} message">\n DISMISS\n </button>\n </div>\n </div>\n <div class="fl-progress-bar">\n <div class="fl-progress"></div>\n </div>\n </div>`}})}));
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
.fl-minimal{--minimal-bg-light:hsla(0,0%,100%,.8);--minimal-bg-dark:rgba(25,25,25,.8);--minimal-text-light:#333;--minimal-text-dark:#f5f5f5;--minimal-shadow:0 2px 8px rgba(0,0,0,.08);--minimal-shadow-dark:0 2px 8px rgba(0,0,0,.15);--minimal-border-radius:6px;--minimal-border-color:rgba(0,0,0,.05);--minimal-border-color-dark:hsla(0,0%,100%,.1);--minimal-success:rgba(34,197,94,.9);--minimal-info:rgba(14,165,233,.9);--minimal-warning:rgba(245,158,11,.9);--minimal-error:rgba(239,68,68,.9)}@-webkit-keyframes minimalIn{0%{opacity:0;-webkit-transform:translateY(-8px);transform:translateY(-8px)}to{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@-moz-keyframes minimalIn{0%{opacity:0;-moz-transform:translateY(-8px);transform:translateY(-8px)}to{opacity:1;-moz-transform:translateY(0);transform:translateY(0)}}@keyframes minimalIn{0%{opacity:0;-webkit-transform:translateY(-8px);-moz-transform:translateY(-8px);transform:translateY(-8px)}to{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);transform:translateY(0)}}.fl-minimal{-webkit-animation:minimalIn .2s ease-out;-moz-animation:minimalIn .2s ease-out;animation:minimalIn .2s ease-out;backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);background-color:var(--minimal-bg-light);border:1px solid var(--minimal-border-color);border-radius:var(--minimal-border-radius);-webkit-box-shadow:var(--minimal-shadow);box-shadow:var(--minimal-shadow);color:var(--minimal-text-light);font-family:-apple-system,BlinkMacSystemFont,var(--fl-font),sans-serif;margin:.5rem 0;max-width:320px;padding:.75rem 1rem;position:relative;will-change:transform,opacity}.fl-minimal:last-child{margin-bottom:0}.fl-minimal .fl-content{-webkit-box-align:center;-webkit-align-items:center;-moz-box-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-moz-box;display:flex;gap:.75rem}.fl-minimal .fl-dot{border-radius:50%;-webkit-flex-shrink:0;flex-shrink:0;height:8px;width:8px}.fl-minimal .fl-message{-webkit-box-flex:1;-webkit-flex:1;-moz-box-flex:1;flex:1;font-size:.875rem;font-weight:450;line-height:1.4;margin:0}.fl-minimal .fl-close{-webkit-box-align:center;-webkit-align-items:center;-moz-box-align:center;align-items:center;background:none;border:none;color:currentColor;cursor:pointer;display:-webkit-box;display:-webkit-flex;display:-moz-box;display:flex;-webkit-flex-shrink:0;flex-shrink:0;font-size:1rem;height:1.5rem;-webkit-box-pack:center;-webkit-justify-content:center;-moz-box-pack:center;justify-content:center;opacity:.5;padding:.25rem;-webkit-transition:opacity .15s;-moz-transition:opacity .15s;transition:opacity .15s;width:1.5rem}.fl-minimal .fl-close:focus,.fl-minimal .fl-close:hover{opacity:.8}.fl-minimal .fl-progress-bar{border-radius:0 0 var(--minimal-border-radius) var(--minimal-border-radius);bottom:0;height:2px;left:0;opacity:.7;overflow:hidden;position:absolute;right:0}.fl-minimal .fl-progress-bar .fl-progress{height:100%;width:100%}.fl-minimal.fl-success .fl-dot,.fl-minimal.fl-success .fl-progress-bar .fl-progress{background-color:var(--minimal-success)}.fl-minimal.fl-info .fl-dot,.fl-minimal.fl-info .fl-progress-bar .fl-progress{background-color:var(--minimal-info)}.fl-minimal.fl-warning .fl-dot,.fl-minimal.fl-warning .fl-progress-bar .fl-progress{background-color:var(--minimal-warning)}.fl-minimal.fl-error .fl-dot,.fl-minimal.fl-error .fl-progress-bar .fl-progress{background-color:var(--minimal-error)}.fl-minimal.fl-rtl{direction:rtl}.fl-minimal.fl-rtl .fl-progress .fl-progress{-webkit-transform-origin:right center;-moz-transform-origin:right center;-ms-transform-origin:right center;transform-origin:right center}@media (prefers-reduced-motion:reduce){.fl-minimal{-webkit-animation:none;-moz-animation:none;animation:none}}.fl-minimal.fl-auto-dark,body.fl-dark .fl-minimal,html.fl-dark .fl-minimal{background-color:var(--minimal-bg-dark);border-color:var(--minimal-border-color-dark);-webkit-box-shadow:var(--minimal-shadow-dark);box-shadow:var(--minimal-shadow-dark);color:var(--minimal-text-dark)}
|
.fl-minimal{--minimal-bg-light:hsla(0,0%,100%,.8);--minimal-bg-dark:rgba(25,25,25,.8);--minimal-text-light:#333;--minimal-text-dark:#f5f5f5;--minimal-shadow:0 2px 8px rgba(0,0,0,.08);--minimal-shadow-dark:0 2px 8px rgba(0,0,0,.15);--minimal-border-radius:6px;--minimal-border-color:rgba(0,0,0,.05);--minimal-border-color-dark:hsla(0,0%,100%,.1);--minimal-success:rgba(34,197,94,.9);--minimal-info:rgba(14,165,233,.9);--minimal-warning:rgba(245,158,11,.9);--minimal-error:rgba(239,68,68,.9)}@keyframes minimalIn{0%{opacity:0;transform:translateY(-8px)}to{opacity:1;transform:translateY(0)}}.fl-minimal{animation:minimalIn .2s ease-out;backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);background-color:var(--minimal-bg-light);border:1px solid var(--minimal-border-color);border-radius:var(--minimal-border-radius);box-shadow:var(--minimal-shadow);color:var(--minimal-text-light);font-family:-apple-system,BlinkMacSystemFont,var(--fl-font),sans-serif;margin:.5rem 0;max-width:320px;padding:.75rem 1rem;position:relative;will-change:transform,opacity}.fl-minimal:last-child{margin-bottom:0}.fl-minimal .fl-content{align-items:center;display:flex;gap:.75rem}.fl-minimal .fl-dot{border-radius:50%;flex-shrink:0;height:8px;width:8px}.fl-minimal .fl-message{flex:1;font-size:.875rem;font-weight:450;line-height:1.4;margin:0}.fl-minimal .fl-close{align-items:center;background:none;border:none;color:currentColor;cursor:pointer;display:flex;flex-shrink:0;font-size:1rem;height:1.5rem;justify-content:center;opacity:.5;padding:.25rem;transition:opacity .15s;width:1.5rem}.fl-minimal .fl-close:focus,.fl-minimal .fl-close:hover{opacity:.8}.fl-minimal .fl-progress-bar{border-radius:0 0 var(--minimal-border-radius) var(--minimal-border-radius);bottom:0;height:2px;left:0;opacity:.7;overflow:hidden;position:absolute;right:0}.fl-minimal .fl-progress-bar .fl-progress{height:100%;width:100%}.fl-minimal.fl-success .fl-dot,.fl-minimal.fl-success .fl-progress-bar .fl-progress{background-color:var(--minimal-success)}.fl-minimal.fl-info .fl-dot,.fl-minimal.fl-info .fl-progress-bar .fl-progress{background-color:var(--minimal-info)}.fl-minimal.fl-warning .fl-dot,.fl-minimal.fl-warning .fl-progress-bar .fl-progress{background-color:var(--minimal-warning)}.fl-minimal.fl-error .fl-dot,.fl-minimal.fl-error .fl-progress-bar .fl-progress{background-color:var(--minimal-error)}.fl-minimal.fl-rtl{direction:rtl}.fl-minimal.fl-rtl .fl-progress .fl-progress{transform-origin:right center}@media (prefers-reduced-motion:reduce){.fl-minimal{animation:none}}.fl-minimal.fl-auto-dark,body.fl-dark .fl-minimal,html.fl-dark .fl-minimal{background-color:var(--minimal-bg-dark);border-color:var(--minimal-border-color-dark);box-shadow:var(--minimal-shadow-dark);color:var(--minimal-text-dark)}
|
||||||
@@ -1 +1 @@
|
|||||||
!function(e,s){"object"==typeof exports&&"undefined"!=typeof module?s(require("../../index.ts")):"function"==typeof define&&define.amd?define(["../../index.ts"],s):s((e="undefined"!=typeof globalThis?globalThis:e||self).flasher)}(this,(function(e){"use strict";e.addTheme("minimal",{render:e=>{const{type:s,message:i}=e,n="error"===s||"warning"===s;return`\n <div class="fl-minimal fl-${s}" role="${n?"alert":"status"}" aria-live="${n?"assertive":"polite"}" aria-atomic="true">\n <div class="fl-content">\n <div class="fl-message">${i}</div>\n <button class="fl-close" aria-label="Close ${s} message">×</button>\n </div>\n <div class="fl-progress-bar">\n <div class="fl-progress"></div>\n </div>\n </div>`}})}));
|
!function(e,s){"object"==typeof exports&&"undefined"!=typeof module?s(require("@flasher/flasher")):"function"==typeof define&&define.amd?define(["@flasher/flasher"],s):s((e="undefined"!=typeof globalThis?globalThis:e||self).flasher)}(this,(function(e){"use strict";e.addTheme("minimal",{render:e=>{const{type:s,message:i}=e,l="error"===s||"warning"===s;return`\n <div class="fl-minimal fl-${s}" role="${l?"alert":"status"}" aria-live="${l?"assertive":"polite"}" aria-atomic="true">\n <div class="fl-content">\n <div class="fl-message">${i}</div>\n <button class="fl-close" aria-label="Close ${s} message">×</button>\n </div>\n <div class="fl-progress-bar">\n <div class="fl-progress"></div>\n </div>\n </div>`}})}));
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
|
|||||||
!function(e,s){"object"==typeof exports&&"undefined"!=typeof module?s(require("../../index.ts")):"function"==typeof define&&define.amd?define(["../../index.ts"],s):s((e="undefined"!=typeof globalThis?globalThis:e||self).flasher)}(this,(function(e){"use strict";e.addTheme("neon",{render:e=>{const{type:s,message:n}=e,i="error"===s||"warning"===s;return`\n <div class="fl-neon fl-${s}" role="${i?"alert":"status"}" aria-live="${i?"assertive":"polite"}" aria-atomic="true">\n <div class="fl-content">\n <div class="fl-message">${n}</div>\n <button class="fl-close" aria-label="Close ${s} message">×</button>\n </div>\n <div class="fl-progress-bar">\n <div class="fl-progress"></div>\n </div>\n </div>`}})}));
|
!function(e,s){"object"==typeof exports&&"undefined"!=typeof module?s(require("@flasher/flasher")):"function"==typeof define&&define.amd?define(["@flasher/flasher"],s):s((e="undefined"!=typeof globalThis?globalThis:e||self).flasher)}(this,(function(e){"use strict";e.addTheme("neon",{render:e=>{const{type:s,message:n}=e,l="error"===s||"warning"===s;return`\n <div class="fl-neon fl-${s}" role="${l?"alert":"status"}" aria-live="${l?"assertive":"polite"}" aria-atomic="true">\n <div class="fl-content">\n <div class="fl-message">${n}</div>\n <button class="fl-close" aria-label="Close ${s} message">×</button>\n </div>\n <div class="fl-progress-bar">\n <div class="fl-progress"></div>\n </div>\n </div>`}})}));
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
.fl-onyx{--onyx-bg-light:#fff;--onyx-bg-dark:#1e1e1e;--onyx-text-light:#333;--onyx-text-dark:#f5f5f5;--onyx-shadow:0 8px 30px rgba(0,0,0,.12);--onyx-shadow-dark:0 8px 30px rgba(0,0,0,.25);--onyx-border-radius:1rem;--onyx-success:#10b981;--onyx-info:#3b82f6;--onyx-warning:#f59e0b;--onyx-error:#ef4444}@-webkit-keyframes onyxIn{0%{-webkit-filter:blur(3px);filter:blur(3px);opacity:0;-webkit-transform:translateY(15px);transform:translateY(15px)}to{-webkit-filter:blur(0);filter:blur(0);opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@-moz-keyframes onyxIn{0%{filter:blur(3px);opacity:0;-moz-transform:translateY(15px);transform:translateY(15px)}to{filter:blur(0);opacity:1;-moz-transform:translateY(0);transform:translateY(0)}}@keyframes onyxIn{0%{-webkit-filter:blur(3px);filter:blur(3px);opacity:0;-webkit-transform:translateY(15px);-moz-transform:translateY(15px);transform:translateY(15px)}to{-webkit-filter:blur(0);filter:blur(0);opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);transform:translateY(0)}}.fl-onyx{-webkit-animation:onyxIn .4s cubic-bezier(.16,1,.3,1);-moz-animation:onyxIn .4s cubic-bezier(.16,1,.3,1);animation:onyxIn .4s cubic-bezier(.16,1,.3,1);background-color:var(--onyx-bg-light);border-radius:var(--onyx-border-radius);-webkit-box-shadow:var(--onyx-shadow);box-shadow:var(--onyx-shadow);color:var(--onyx-text-light);font-family:var(--fl-font),serif;margin:.75rem 0;overflow:hidden;padding:1rem 1.25rem;position:relative;will-change:transform,opacity,filter}.fl-onyx:after,.fl-onyx:before{border-radius:50%;content:"";height:6px;position:absolute;width:6px;z-index:1}.fl-onyx:before{left:10px;top:10px}.fl-onyx:after{bottom:10px;right:10px}.fl-onyx .fl-content{-webkit-box-align:center;-webkit-align-items:center;-moz-box-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-moz-box;display:flex;padding-left:.4rem}.fl-onyx .fl-text{-webkit-box-flex:1;-webkit-flex:1;-moz-box-flex:1;flex:1;position:relative}.fl-onyx .fl-message{font-size:.925rem;font-weight:400;letter-spacing:.01rem;line-height:1.5}.fl-onyx .fl-close{-webkit-box-align:center;-webkit-align-items:center;-moz-box-align:center;align-items:center;background:none;border:none;border-radius:50%;color:currentColor;cursor:pointer;display:-webkit-box;display:-webkit-flex;display:-moz-box;display:flex;-webkit-flex-shrink:0;flex-shrink:0;font-size:1.25rem;height:1.75rem;-webkit-box-pack:center;-webkit-justify-content:center;-moz-box-pack:center;justify-content:center;margin-left:1rem;opacity:.6;padding:.25rem;-webkit-transition:all .2s ease;-moz-transition:all .2s ease;transition:all .2s ease;width:1.75rem}.fl-onyx .fl-close:focus,.fl-onyx .fl-close:hover{background-color:rgba(0,0,0,.05);opacity:1}.fl-onyx .fl-progress-bar{bottom:0;height:3px;left:0;overflow:hidden;position:absolute;right:0}.fl-onyx .fl-progress-bar .fl-progress{height:100%;-webkit-transform-origin:left center;-moz-transform-origin:left center;-ms-transform-origin:left center;transform-origin:left center;width:100%}.fl-onyx.fl-success .fl-progress-bar .fl-progress,.fl-onyx.fl-success:after,.fl-onyx.fl-success:before{background-color:var(--onyx-success)}.fl-onyx.fl-info .fl-progress-bar .fl-progress,.fl-onyx.fl-info:after,.fl-onyx.fl-info:before{background-color:var(--onyx-info)}.fl-onyx.fl-warning .fl-progress-bar .fl-progress,.fl-onyx.fl-warning:after,.fl-onyx.fl-warning:before{background-color:var(--onyx-warning)}.fl-onyx.fl-error .fl-progress-bar .fl-progress,.fl-onyx.fl-error:after,.fl-onyx.fl-error:before{background-color:var(--onyx-error)}.fl-onyx.fl-rtl{direction:rtl}.fl-onyx.fl-rtl .fl-content{padding-left:0;padding-right:.4rem}.fl-onyx.fl-rtl .fl-close{margin-left:0;margin-right:1rem}.fl-onyx.fl-rtl:before{left:auto;right:10px}.fl-onyx.fl-rtl:after{left:10px;right:auto}.fl-onyx.fl-rtl .fl-progress .fl-progress{-webkit-transform-origin:right center;-moz-transform-origin:right center;-ms-transform-origin:right center;transform-origin:right center}@media (prefers-reduced-motion:reduce){.fl-onyx{-webkit-animation:none;-moz-animation:none;animation:none}}.fl-onyx.fl-auto-dark,body.fl-dark .fl-onyx,html.fl-dark .fl-onyx{background-color:var(--onyx-bg-dark);-webkit-box-shadow:var(--onyx-shadow-dark);box-shadow:var(--onyx-shadow-dark);color:var(--onyx-text-dark)}.fl-onyx.fl-auto-dark .fl-close:focus,.fl-onyx.fl-auto-dark .fl-close:hover,body.fl-dark .fl-onyx .fl-close:focus,body.fl-dark .fl-onyx .fl-close:hover,html.fl-dark .fl-onyx .fl-close:focus,html.fl-dark .fl-onyx .fl-close:hover{background-color:hsla(0,0%,100%,.1)}
|
.fl-onyx{--onyx-bg-light:#fff;--onyx-bg-dark:#1e1e1e;--onyx-text-light:#333;--onyx-text-dark:#f5f5f5;--onyx-shadow:0 8px 30px rgba(0,0,0,.12);--onyx-shadow-dark:0 8px 30px rgba(0,0,0,.25);--onyx-border-radius:1rem;--onyx-success:#10b981;--onyx-info:#3b82f6;--onyx-warning:#f59e0b;--onyx-error:#ef4444}@keyframes onyxIn{0%{filter:blur(3px);opacity:0;transform:translateY(15px)}to{filter:blur(0);opacity:1;transform:translateY(0)}}.fl-onyx{animation:onyxIn .4s cubic-bezier(.16,1,.3,1);background-color:var(--onyx-bg-light);border-radius:var(--onyx-border-radius);box-shadow:var(--onyx-shadow);color:var(--onyx-text-light);font-family:var(--fl-font),serif;margin:.75rem 0;overflow:hidden;padding:1rem 1.25rem;position:relative;will-change:transform,opacity,filter}.fl-onyx:after,.fl-onyx:before{border-radius:50%;content:"";height:6px;position:absolute;width:6px;z-index:1}.fl-onyx:before{left:10px;top:10px}.fl-onyx:after{bottom:10px;right:10px}.fl-onyx .fl-content{align-items:center;display:flex;padding-left:.4rem}.fl-onyx .fl-text{flex:1;position:relative}.fl-onyx .fl-message{font-size:.925rem;font-weight:400;letter-spacing:.01rem;line-height:1.5}.fl-onyx .fl-close{align-items:center;background:none;border:none;border-radius:50%;color:currentColor;cursor:pointer;display:flex;flex-shrink:0;font-size:1.25rem;height:1.75rem;justify-content:center;margin-left:1rem;opacity:.6;padding:.25rem;transition:all .2s ease;width:1.75rem}.fl-onyx .fl-close:focus,.fl-onyx .fl-close:hover{background-color:rgba(0,0,0,.05);opacity:1}.fl-onyx .fl-progress-bar{bottom:0;height:3px;left:0;overflow:hidden;position:absolute;right:0}.fl-onyx .fl-progress-bar .fl-progress{height:100%;transform-origin:left center;width:100%}.fl-onyx.fl-success .fl-progress-bar .fl-progress,.fl-onyx.fl-success:after,.fl-onyx.fl-success:before{background-color:var(--onyx-success)}.fl-onyx.fl-info .fl-progress-bar .fl-progress,.fl-onyx.fl-info:after,.fl-onyx.fl-info:before{background-color:var(--onyx-info)}.fl-onyx.fl-warning .fl-progress-bar .fl-progress,.fl-onyx.fl-warning:after,.fl-onyx.fl-warning:before{background-color:var(--onyx-warning)}.fl-onyx.fl-error .fl-progress-bar .fl-progress,.fl-onyx.fl-error:after,.fl-onyx.fl-error:before{background-color:var(--onyx-error)}.fl-onyx.fl-rtl{direction:rtl}.fl-onyx.fl-rtl .fl-content{padding-left:0;padding-right:.4rem}.fl-onyx.fl-rtl .fl-close{margin-left:0;margin-right:1rem}.fl-onyx.fl-rtl:before{left:auto;right:10px}.fl-onyx.fl-rtl:after{left:10px;right:auto}.fl-onyx.fl-rtl .fl-progress .fl-progress{transform-origin:right center}@media (prefers-reduced-motion:reduce){.fl-onyx{animation:none}}.fl-onyx.fl-auto-dark,body.fl-dark .fl-onyx,html.fl-dark .fl-onyx{background-color:var(--onyx-bg-dark);box-shadow:var(--onyx-shadow-dark);color:var(--onyx-text-dark)}.fl-onyx.fl-auto-dark .fl-close:focus,.fl-onyx.fl-auto-dark .fl-close:hover,body.fl-dark .fl-onyx .fl-close:focus,body.fl-dark .fl-onyx .fl-close:hover,html.fl-dark .fl-onyx .fl-close:focus,html.fl-dark .fl-onyx .fl-close:hover{background-color:hsla(0,0%,100%,.1)}
|
||||||
@@ -1 +1 @@
|
|||||||
!function(e,s){"object"==typeof exports&&"undefined"!=typeof module?s(require("../../index.ts")):"function"==typeof define&&define.amd?define(["../../index.ts"],s):s((e="undefined"!=typeof globalThis?globalThis:e||self).flasher)}(this,(function(e){"use strict";e.addTheme("onyx",{render:e=>{const{type:s,message:n}=e,i="error"===s||"warning"===s;return`\n <div class="fl-onyx fl-${s}" role="${i?"alert":"status"}" aria-live="${i?"assertive":"polite"}" aria-atomic="true">\n <div class="fl-content">\n <div class="fl-text">\n <div class="fl-message">${n}</div>\n </div>\n <button class="fl-close" aria-label="Close ${s} message">×</button>\n </div>\n <div class="fl-progress-bar">\n <div class="fl-progress"></div>\n </div>\n </div>`}})}));
|
!function(e,s){"object"==typeof exports&&"undefined"!=typeof module?s(require("@flasher/flasher")):"function"==typeof define&&define.amd?define(["@flasher/flasher"],s):s((e="undefined"!=typeof globalThis?globalThis:e||self).flasher)}(this,(function(e){"use strict";e.addTheme("onyx",{render:e=>{const{type:s,message:n}=e,l="error"===s||"warning"===s;return`\n <div class="fl-onyx fl-${s}" role="${l?"alert":"status"}" aria-live="${l?"assertive":"polite"}" aria-atomic="true">\n <div class="fl-content">\n <div class="fl-text">\n <div class="fl-message">${n}</div>\n </div>\n <button class="fl-close" aria-label="Close ${s} message">×</button>\n </div>\n <div class="fl-progress-bar">\n <div class="fl-progress"></div>\n </div>\n </div>`}})}));
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
|
|||||||
!function(e,s){"object"==typeof exports&&"undefined"!=typeof module?s(require("../../index.ts")):"function"==typeof define&&define.amd?define(["../../index.ts"],s):s((e="undefined"!=typeof globalThis?globalThis:e||self).flasher)}(this,(function(e){"use strict";e.addTheme("ruby",{render:e=>{const{type:s,message:i}=e,n="error"===s||"warning"===s;return`\n <div class="fl-ruby fl-${s}" role="${n?"alert":"status"}" aria-live="${n?"assertive":"polite"}" aria-atomic="true">\n <div class="fl-shine"></div>\n <div class="fl-content">\n <div class="fl-icon-circle">\n <div class="fl-icon"></div>\n </div>\n <div class="fl-text">\n <div class="fl-message">${i}</div>\n </div>\n <button class="fl-close" aria-label="Close ${s} message">×</button>\n </div>\n <div class="fl-progress-bar">\n <div class="fl-progress"></div>\n </div>\n </div>`}})}));
|
!function(e,s){"object"==typeof exports&&"undefined"!=typeof module?s(require("@flasher/flasher")):"function"==typeof define&&define.amd?define(["@flasher/flasher"],s):s((e="undefined"!=typeof globalThis?globalThis:e||self).flasher)}(this,(function(e){"use strict";e.addTheme("ruby",{render:e=>{const{type:s,message:i}=e,l="error"===s||"warning"===s;return`\n <div class="fl-ruby fl-${s}" role="${l?"alert":"status"}" aria-live="${l?"assertive":"polite"}" aria-atomic="true">\n <div class="fl-shine"></div>\n <div class="fl-content">\n <div class="fl-icon-circle">\n <div class="fl-icon"></div>\n </div>\n <div class="fl-text">\n <div class="fl-message">${i}</div>\n </div>\n <button class="fl-close" aria-label="Close ${s} message">×</button>\n </div>\n <div class="fl-progress-bar">\n <div class="fl-progress"></div>\n </div>\n </div>`}})}));
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
.fl-sapphire{--sapphire-bg-base:rgba(30,30,30,.9);--sapphire-text:#f0f0f0;--sapphire-shadow:rgba(0,0,0,.15);--sapphire-progress-bg:hsla(0,0%,100%,.2);--sapphire-progress-fill:hsla(0,0%,100%,.9);--sapphire-success:rgba(16,185,129,.95);--sapphire-error:rgba(239,68,68,.95);--sapphire-warning:rgba(245,158,11,.95);--sapphire-info:rgba(59,130,246,.95);--sapphire-animation:0.4s cubic-bezier(0.25,0.46,0.45,0.94)}@-webkit-keyframes sapphireIn{0%{opacity:0;-webkit-transform:translateY(10px);transform:translateY(10px)}60%{-webkit-transform:translateY(-3px);transform:translateY(-3px)}to{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@-moz-keyframes sapphireIn{0%{opacity:0;-moz-transform:translateY(10px);transform:translateY(10px)}60%{-moz-transform:translateY(-3px);transform:translateY(-3px)}to{opacity:1;-moz-transform:translateY(0);transform:translateY(0)}}@keyframes sapphireIn{0%{opacity:0;-webkit-transform:translateY(10px);-moz-transform:translateY(10px);transform:translateY(10px)}60%{-webkit-transform:translateY(-3px);-moz-transform:translateY(-3px);transform:translateY(-3px)}to{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);transform:translateY(0)}}.fl-sapphire{-webkit-animation:sapphireIn var(--sapphire-animation);-moz-animation:sapphireIn var(--sapphire-animation);animation:sapphireIn var(--sapphire-animation);backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);background-color:var(--sapphire-bg-base);border-radius:.5em;-webkit-box-shadow:0 6px 16px var(--sapphire-shadow);box-shadow:0 6px 16px var(--sapphire-shadow);color:var(--sapphire-text);font-family:Roboto,var(--fl-font),serif;margin:0 0 .75em;min-width:200px;padding:1em 1.5em;position:relative;-webkit-transition:all .3s ease;-moz-transition:all .3s ease;transition:all .3s ease;will-change:transform,opacity}.fl-sapphire:last-child{margin-bottom:0}.fl-sapphire .fl-message{color:var(--sapphire-text);font-size:.925em;line-height:1.4}.fl-sapphire .fl-progress-bar{background-color:var(--sapphire-progress-bg);border-radius:0 0 .375em .375em;bottom:0;height:4px;left:0;overflow:hidden;position:absolute;right:0}.fl-sapphire .fl-progress-bar .fl-progress{background-color:var(--sapphire-progress-fill);height:100%;-webkit-transform-origin:left center;-moz-transform-origin:left center;-ms-transform-origin:left center;transform-origin:left center;width:100%;will-change:transform}.fl-sapphire.fl-success{background-color:var(--sapphire-success)}.fl-sapphire.fl-error{background-color:var(--sapphire-error)}.fl-sapphire.fl-warning{background-color:var(--sapphire-warning)}.fl-sapphire.fl-info{background-color:var(--sapphire-info)}.fl-sapphire.fl-rtl{direction:rtl}.fl-sapphire.fl-rtl .fl-progress .fl-progress{-webkit-transform-origin:right center;-moz-transform-origin:right center;-ms-transform-origin:right center;transform-origin:right center}@media (prefers-reduced-motion:reduce){.fl-sapphire{-webkit-animation:none;-moz-animation:none;animation:none}}
|
.fl-sapphire{--sapphire-bg-base:rgba(30,30,30,.9);--sapphire-text:#f0f0f0;--sapphire-shadow:rgba(0,0,0,.15);--sapphire-progress-bg:hsla(0,0%,100%,.2);--sapphire-progress-fill:hsla(0,0%,100%,.9);--sapphire-success:rgba(16,185,129,.95);--sapphire-error:rgba(239,68,68,.95);--sapphire-warning:rgba(245,158,11,.95);--sapphire-info:rgba(59,130,246,.95);--sapphire-animation:0.4s cubic-bezier(0.25,0.46,0.45,0.94)}@keyframes sapphireIn{0%{opacity:0;transform:translateY(10px)}60%{transform:translateY(-3px)}to{opacity:1;transform:translateY(0)}}.fl-sapphire{animation:sapphireIn var(--sapphire-animation);backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);background-color:var(--sapphire-bg-base);border-radius:.5em;box-shadow:0 6px 16px var(--sapphire-shadow);color:var(--sapphire-text);font-family:Roboto,var(--fl-font),serif;margin:0 0 .75em;min-width:200px;padding:1em 1.5em;position:relative;transition:all .3s ease;will-change:transform,opacity}.fl-sapphire:last-child{margin-bottom:0}.fl-sapphire .fl-message{color:var(--sapphire-text);font-size:.925em;line-height:1.4}.fl-sapphire .fl-progress-bar{background-color:var(--sapphire-progress-bg);border-radius:0 0 .375em .375em;bottom:0;height:4px;left:0;overflow:hidden;position:absolute;right:0}.fl-sapphire .fl-progress-bar .fl-progress{background-color:var(--sapphire-progress-fill);height:100%;transform-origin:left center;width:100%;will-change:transform}.fl-sapphire.fl-success{background-color:var(--sapphire-success)}.fl-sapphire.fl-error{background-color:var(--sapphire-error)}.fl-sapphire.fl-warning{background-color:var(--sapphire-warning)}.fl-sapphire.fl-info{background-color:var(--sapphire-info)}.fl-sapphire.fl-rtl{direction:rtl}.fl-sapphire.fl-rtl .fl-progress .fl-progress{transform-origin:right center}@media (prefers-reduced-motion:reduce){.fl-sapphire{animation:none}}
|
||||||
@@ -1 +1 @@
|
|||||||
!function(e,s){"object"==typeof exports&&"undefined"!=typeof module?s(require("../../index.ts")):"function"==typeof define&&define.amd?define(["../../index.ts"],s):s((e="undefined"!=typeof globalThis?globalThis:e||self).flasher)}(this,(function(e){"use strict";e.addTheme("sapphire",{render:e=>{const{type:s,message:i}=e,n="error"===s||"warning"===s;return`\n <div class="fl-sapphire fl-${s}" role="${n?"alert":"status"}" aria-live="${n?"assertive":"polite"}" aria-atomic="true">\n <div class="fl-content">\n <span class="fl-message">${i}</span>\n </div>\n <div class="fl-progress-bar">\n <div class="fl-progress"></div>\n </div>\n </div>`}})}));
|
!function(e,s){"object"==typeof exports&&"undefined"!=typeof module?s(require("@flasher/flasher")):"function"==typeof define&&define.amd?define(["@flasher/flasher"],s):s((e="undefined"!=typeof globalThis?globalThis:e||self).flasher)}(this,(function(e){"use strict";e.addTheme("sapphire",{render:e=>{const{type:s,message:a}=e,i="error"===s||"warning"===s;return`\n <div class="fl-sapphire fl-${s}" role="${i?"alert":"status"}" aria-live="${i?"assertive":"polite"}" aria-atomic="true">\n <div class="fl-content">\n <span class="fl-message">${a}</span>\n </div>\n <div class="fl-progress-bar">\n <div class="fl-progress"></div>\n </div>\n </div>`}})}));
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
.fl-slack{--slack-bg-light:#fff;--slack-bg-dark:#1a1d21;--slack-hover-light:#f8f8f8;--slack-hover-dark:#222529;--slack-text-light:#1d1c1d;--slack-text-secondary-light:#616061;--slack-text-dark:#e0e0e0;--slack-text-secondary-dark:#ababad;--slack-border-light:#e0e0e0;--slack-border-dark:#393a3e;--slack-shadow:0 1px 0 rgba(0,0,0,.1);--slack-shadow-dark:0 1px 0 rgba(0,0,0,.2);--slack-avatar-size:36px;--slack-success:#2bac76;--slack-info:#1264a3;--slack-warning:#e8912d;--slack-error:#e01e5a;--slack-animation-duration:150ms}@-webkit-keyframes slackFadeIn{0%{opacity:0}to{opacity:1}}@-moz-keyframes slackFadeIn{0%{opacity:0}to{opacity:1}}@keyframes slackFadeIn{0%{opacity:0}to{opacity:1}}.fl-slack{-webkit-animation:slackFadeIn var(--slack-animation-duration) ease-out;-moz-animation:slackFadeIn var(--slack-animation-duration) ease-out;animation:slackFadeIn var(--slack-animation-duration) ease-out;font-family:Lato,Slack-Lato,Helvetica Neue,Helvetica,sans-serif;margin:4px 0;max-width:500px;position:relative;width:100%}.fl-slack .fl-slack-message{-webkit-box-align:start;-webkit-align-items:flex-start;-moz-box-align:start;align-items:flex-start;background-color:var(--slack-bg-light);border:1px solid var(--slack-border-light);border-radius:4px;-webkit-box-shadow:var(--slack-shadow);box-shadow:var(--slack-shadow);color:var(--slack-text-light);display:-webkit-box;display:-webkit-flex;display:-moz-box;display:flex;padding:8px 20px 8px 8px;-webkit-transition:background-color .1s ease;-moz-transition:background-color .1s ease;transition:background-color .1s ease}.fl-slack .fl-slack-message:hover{background-color:var(--slack-hover-light)}.fl-slack .fl-avatar{-webkit-box-align:center;-webkit-align-items:center;-moz-box-align:center;align-items:center;background-color:currentColor;border-radius:4px;display:-webkit-box;display:-webkit-flex;display:-moz-box;display:flex;-webkit-flex-shrink:0;flex-shrink:0;height:var(--slack-avatar-size);-webkit-box-pack:center;-webkit-justify-content:center;-moz-box-pack:center;justify-content:center;margin-right:8px;width:var(--slack-avatar-size)}.fl-slack .fl-type-icon{color:#fff;font-size:16px;font-weight:700}.fl-slack .fl-message-content{-webkit-box-flex:1;-webkit-flex:1;-moz-box-flex:1;flex:1;min-width:0}.fl-slack .fl-message-text{font-size:15px;line-height:1.46668;word-break:break-word}.fl-slack .fl-actions{opacity:0;position:absolute;right:6px;top:8px;-webkit-transition:opacity .1s ease;-moz-transition:opacity .1s ease;transition:opacity .1s ease;visibility:hidden}.fl-slack .fl-slack-message:hover .fl-actions{opacity:1;visibility:visible}.fl-slack .fl-close{-webkit-box-align:center;-webkit-align-items:center;-moz-box-align:center;align-items:center;background:none;border:none;border-radius:4px;color:var(--slack-text-secondary-light);cursor:pointer;display:-webkit-box;display:-webkit-flex;display:-moz-box;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-moz-box-pack:center;justify-content:center;padding:4px}.fl-slack .fl-close:hover{background-color:var(--slack-hover-light);color:var(--slack-text-light)}.fl-slack.fl-success .fl-avatar{color:var(--slack-success)}.fl-slack.fl-info .fl-avatar{color:var(--slack-info)}.fl-slack.fl-warning .fl-avatar{color:var(--slack-warning)}.fl-slack.fl-error .fl-avatar{color:var(--slack-error)}.fl-slack.fl-rtl{direction:rtl}.fl-slack.fl-rtl .fl-avatar{margin-left:8px;margin-right:0}.fl-slack.fl-rtl .fl-username{margin-left:4px;margin-right:0}.fl-slack.fl-rtl .fl-actions{left:6px;right:auto}.fl-slack.fl-rtl .fl-slack-message{padding:8px 8px 8px 20px}@media (prefers-reduced-motion:reduce){.fl-slack{-webkit-animation:none;-moz-animation:none;animation:none}}.fl-slack.fl-auto-dark .fl-slack-message,body.fl-dark .fl-slack .fl-slack-message,html.fl-dark .fl-slack .fl-slack-message{background-color:var(--slack-bg-dark);border-color:var(--slack-border-dark);-webkit-box-shadow:var(--slack-shadow-dark);box-shadow:var(--slack-shadow-dark);color:var(--slack-text-dark)}.fl-slack.fl-auto-dark .fl-slack-message:hover,body.fl-dark .fl-slack .fl-slack-message:hover,html.fl-dark .fl-slack .fl-slack-message:hover{background-color:var(--slack-hover-dark)}.fl-slack.fl-auto-dark .fl-close,body.fl-dark .fl-slack .fl-close,html.fl-dark .fl-slack .fl-close{color:var(--slack-text-secondary-dark)}.fl-slack.fl-auto-dark .fl-close:hover,body.fl-dark .fl-slack .fl-close:hover,html.fl-dark .fl-slack .fl-close:hover{background-color:var(--slack-hover-dark);color:var(--slack-text-dark)}
|
.fl-slack{--slack-bg-light:#fff;--slack-bg-dark:#1a1d21;--slack-hover-light:#f8f8f8;--slack-hover-dark:#222529;--slack-text-light:#1d1c1d;--slack-text-secondary-light:#616061;--slack-text-dark:#e0e0e0;--slack-text-secondary-dark:#ababad;--slack-border-light:#e0e0e0;--slack-border-dark:#393a3e;--slack-shadow:0 1px 0 rgba(0,0,0,.1);--slack-shadow-dark:0 1px 0 rgba(0,0,0,.2);--slack-avatar-size:36px;--slack-success:#2bac76;--slack-info:#1264a3;--slack-warning:#e8912d;--slack-error:#e01e5a;--slack-animation-duration:150ms}@keyframes slackFadeIn{0%{opacity:0}to{opacity:1}}.fl-slack{animation:slackFadeIn var(--slack-animation-duration) ease-out;font-family:Lato,Slack-Lato,Helvetica Neue,Helvetica,sans-serif;margin:4px 0;max-width:500px;position:relative;width:100%}.fl-slack .fl-slack-message{align-items:flex-start;background-color:var(--slack-bg-light);border:1px solid var(--slack-border-light);border-radius:4px;box-shadow:var(--slack-shadow);color:var(--slack-text-light);display:flex;padding:8px 20px 8px 8px;transition:background-color .1s ease}.fl-slack .fl-slack-message:hover{background-color:var(--slack-hover-light)}.fl-slack .fl-avatar{align-items:center;background-color:currentColor;border-radius:4px;display:flex;flex-shrink:0;height:var(--slack-avatar-size);justify-content:center;margin-right:8px;width:var(--slack-avatar-size)}.fl-slack .fl-type-icon{color:#fff;font-size:16px;font-weight:700}.fl-slack .fl-message-content{flex:1;min-width:0}.fl-slack .fl-message-text{font-size:15px;line-height:1.46668;word-break:break-word}.fl-slack .fl-actions{opacity:0;position:absolute;right:6px;top:8px;transition:opacity .1s ease;visibility:hidden}.fl-slack .fl-slack-message:hover .fl-actions{opacity:1;visibility:visible}.fl-slack .fl-close{align-items:center;background:none;border:none;border-radius:4px;color:var(--slack-text-secondary-light);cursor:pointer;display:flex;justify-content:center;padding:4px}.fl-slack .fl-close:hover{background-color:var(--slack-hover-light);color:var(--slack-text-light)}.fl-slack.fl-success .fl-avatar{color:var(--slack-success)}.fl-slack.fl-info .fl-avatar{color:var(--slack-info)}.fl-slack.fl-warning .fl-avatar{color:var(--slack-warning)}.fl-slack.fl-error .fl-avatar{color:var(--slack-error)}.fl-slack.fl-rtl{direction:rtl}.fl-slack.fl-rtl .fl-avatar{margin-left:8px;margin-right:0}.fl-slack.fl-rtl .fl-username{margin-left:4px;margin-right:0}.fl-slack.fl-rtl .fl-actions{left:6px;right:auto}.fl-slack.fl-rtl .fl-slack-message{padding:8px 8px 8px 20px}@media (prefers-reduced-motion:reduce){.fl-slack{animation:none}}.fl-slack.fl-auto-dark .fl-slack-message,body.fl-dark .fl-slack .fl-slack-message,html.fl-dark .fl-slack .fl-slack-message{background-color:var(--slack-bg-dark);border-color:var(--slack-border-dark);box-shadow:var(--slack-shadow-dark);color:var(--slack-text-dark)}.fl-slack.fl-auto-dark .fl-slack-message:hover,body.fl-dark .fl-slack .fl-slack-message:hover,html.fl-dark .fl-slack .fl-slack-message:hover{background-color:var(--slack-hover-dark)}.fl-slack.fl-auto-dark .fl-close,body.fl-dark .fl-slack .fl-close,html.fl-dark .fl-slack .fl-close{color:var(--slack-text-secondary-dark)}.fl-slack.fl-auto-dark .fl-close:hover,body.fl-dark .fl-slack .fl-close:hover,html.fl-dark .fl-slack .fl-close:hover{background-color:var(--slack-hover-dark);color:var(--slack-text-dark)}
|
||||||
@@ -1 +1 @@
|
|||||||
!function(e,s){"object"==typeof exports&&"undefined"!=typeof module?s(require("../../index.ts")):"function"==typeof define&&define.amd?define(["../../index.ts"],s):s((e="undefined"!=typeof globalThis?globalThis:e||self).flasher)}(this,(function(e){"use strict";e.addTheme("slack",{render:e=>{const{type:s,message:i}=e,n="error"===s||"warning"===s;return`\n <div class="fl-slack fl-${s}" role="${n?"alert":"status"}" aria-live="${n?"assertive":"polite"}" aria-atomic="true">\n <div class="fl-slack-message">\n <div class="fl-avatar">\n ${(()=>{switch(s){case"success":return'<div class="fl-type-icon fl-success-icon">✓</div>';case"error":return'<div class="fl-type-icon fl-error-icon">✕</div>';case"warning":return'<div class="fl-type-icon fl-warning-icon">!</div>';case"info":return'<div class="fl-type-icon fl-info-icon">i</div>'}return""})()}\n </div>\n <div class="fl-message-content">\n <div class="fl-message-text">${i}</div>\n </div>\n <div class="fl-actions">\n <button class="fl-close" aria-label="Close ${s} message">\n <svg viewBox="0 0 20 20" width="16" height="16">\n <path fill="currentColor" d="M10 8.586L6.707 5.293a1 1 0 00-1.414 1.414L8.586 10l-3.293 3.293a1 1 0 101.414 1.414L10 11.414l3.293 3.293a1 1 0 001.414-1.414L11.414 10l3.293-3.293a1 1 0 00-1.414-1.414L10 8.586z"/>\n </svg>\n </button>\n </div>\n </div>\n </div>`}})}));
|
!function(e,s){"object"==typeof exports&&"undefined"!=typeof module?s(require("@flasher/flasher")):"function"==typeof define&&define.amd?define(["@flasher/flasher"],s):s((e="undefined"!=typeof globalThis?globalThis:e||self).flasher)}(this,(function(e){"use strict";e.addTheme("slack",{render:e=>{const{type:s,message:i}=e,n="error"===s||"warning"===s;return`\n <div class="fl-slack fl-${s}" role="${n?"alert":"status"}" aria-live="${n?"assertive":"polite"}" aria-atomic="true">\n <div class="fl-slack-message">\n <div class="fl-avatar">\n ${(()=>{switch(s){case"success":return'<div class="fl-type-icon fl-success-icon">✓</div>';case"error":return'<div class="fl-type-icon fl-error-icon">✕</div>';case"warning":return'<div class="fl-type-icon fl-warning-icon">!</div>';case"info":return'<div class="fl-type-icon fl-info-icon">i</div>'}return""})()}\n </div>\n <div class="fl-message-content">\n <div class="fl-message-text">${i}</div>\n </div>\n <div class="fl-actions">\n <button class="fl-close" aria-label="Close ${s} message">\n <svg viewBox="0 0 20 20" width="16" height="16">\n <path fill="currentColor" d="M10 8.586L6.707 5.293a1 1 0 00-1.414 1.414L8.586 10l-3.293 3.293a1 1 0 101.414 1.414L10 11.414l3.293 3.293a1 1 0 001.414-1.414L11.414 10l3.293-3.293a1 1 0 00-1.414-1.414L10 8.586z"/>\n </svg>\n </button>\n </div>\n </div>\n </div>`}})}));
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ class HomeController extends AbstractController
|
|||||||
public function index(): Response
|
public function index(): Response
|
||||||
{
|
{
|
||||||
$themes = [
|
$themes = [
|
||||||
// 'flasher',
|
'flasher',
|
||||||
// 'amber',
|
// 'amber',
|
||||||
// 'sapphire',
|
// 'sapphire',
|
||||||
// 'crystal',
|
// 'crystal',
|
||||||
@@ -24,7 +24,7 @@ class HomeController extends AbstractController
|
|||||||
// 'onyx',
|
// 'onyx',
|
||||||
|
|
||||||
'jade',
|
'jade',
|
||||||
//,'aurora',
|
// 'aurora',
|
||||||
// 'neon',
|
// 'neon',
|
||||||
// 'minimal',
|
// 'minimal',
|
||||||
|
|
||||||
@@ -60,12 +60,12 @@ class HomeController extends AbstractController
|
|||||||
foreach ($messages as $type => $message) {
|
foreach ($messages as $type => $message) {
|
||||||
$position = $positions[$index % \count($positions)];
|
$position = $positions[$index % \count($positions)];
|
||||||
|
|
||||||
// $message = \sprintf('%s: %s', $theme, $message);
|
$message = \sprintf('%s: %s', $theme, $message);
|
||||||
|
|
||||||
// flash()
|
flash()
|
||||||
// ->use("theme.$theme")
|
->use("theme.$theme")
|
||||||
// ->option('position', $position)
|
->option('position', $position)
|
||||||
// ->$type($message);
|
->$type($message);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -73,7 +73,7 @@ class HomeController extends AbstractController
|
|||||||
// 'noty',
|
// 'noty',
|
||||||
// 'notyf',
|
// 'notyf',
|
||||||
// 'sweetalert',
|
// 'sweetalert',
|
||||||
'toastr',
|
// 'toastr',
|
||||||
];
|
];
|
||||||
|
|
||||||
foreach ($plugins as $plugin) {
|
foreach ($plugins as $plugin) {
|
||||||
|
|||||||
Generated
+2255
-1863
File diff suppressed because it is too large
Load Diff
+8
-6
@@ -48,20 +48,21 @@
|
|||||||
"@babel/core": "^7.26.9",
|
"@babel/core": "^7.26.9",
|
||||||
"@babel/preset-env": "^7.26.9",
|
"@babel/preset-env": "^7.26.9",
|
||||||
"@rollup/plugin-babel": "^6.0.4",
|
"@rollup/plugin-babel": "^6.0.4",
|
||||||
"@rollup/plugin-commonjs": "^25.0.8",
|
"@rollup/plugin-commonjs": "^28.0.3",
|
||||||
"@rollup/plugin-eslint": "^9.0.5",
|
"@rollup/plugin-eslint": "^9.0.5",
|
||||||
"@rollup/plugin-node-resolve": "^15.3.1",
|
"@rollup/plugin-node-resolve": "^16.0.0",
|
||||||
"@rollup/plugin-strip": "^3.0.4",
|
"@rollup/plugin-strip": "^3.0.4",
|
||||||
"@rollup/plugin-terser": "^0.4.4",
|
"@rollup/plugin-terser": "^0.4.4",
|
||||||
"@rollup/plugin-typescript": "^11.1.6",
|
"@rollup/plugin-typescript": "^12.1.2",
|
||||||
"@types/node": "^20.17.24",
|
"@types/node": "^22.13.10",
|
||||||
"@typescript-eslint/eslint-plugin": "^7.18.0",
|
"@typescript-eslint/eslint-plugin": "^7.18.0",
|
||||||
"@typescript-eslint/parser": "^7.18.0",
|
"@typescript-eslint/parser": "^7.18.0",
|
||||||
"all-contributors-cli": "^6.26.1",
|
"all-contributors-cli": "^6.26.1",
|
||||||
"autoprefixer": "^10.4.20",
|
"autoprefixer": "^10.4.20",
|
||||||
"browserslist": "^4.24.4",
|
"browserslist": "^4.24.4",
|
||||||
"cross-env": "^7.0.3",
|
"cross-env": "^7.0.3",
|
||||||
"cssnano": "^6.1.2",
|
"cssnano": "^7.0.6",
|
||||||
|
"cssnano-preset-advanced": "^7.0.6",
|
||||||
"eslint": "^8.57.1",
|
"eslint": "^8.57.1",
|
||||||
"eslint-config-airbnb-typescript": "^18.0.0",
|
"eslint-config-airbnb-typescript": "^18.0.0",
|
||||||
"eslint-config-prettier": "^9.1.0",
|
"eslint-config-prettier": "^9.1.0",
|
||||||
@@ -69,7 +70,8 @@
|
|||||||
"eslint-plugin-babel": "^5.3.1",
|
"eslint-plugin-babel": "^5.3.1",
|
||||||
"eslint-plugin-import": "^2.31.0",
|
"eslint-plugin-import": "^2.31.0",
|
||||||
"eslint-plugin-prettier": "^5.2.3",
|
"eslint-plugin-prettier": "^5.2.3",
|
||||||
"postcss-discard-comments": "^6.0.2",
|
"postcss": "^8.5.3",
|
||||||
|
"postcss-discard-comments": "^7.0.3",
|
||||||
"punycode": "^2.3.1",
|
"punycode": "^2.3.1",
|
||||||
"rimraf": "^6.0.1",
|
"rimraf": "^6.0.1",
|
||||||
"rollup": "^4.35.0",
|
"rollup": "^4.35.0",
|
||||||
|
|||||||
+7
-242
@@ -1,244 +1,9 @@
|
|||||||
import path from 'node:path'
|
/**
|
||||||
import process from 'node:process'
|
* @file rollup.config.js
|
||||||
import { fileURLToPath } from 'node:url'
|
* @description Build configuration for PHPFlasher frontend assets
|
||||||
import babel from '@rollup/plugin-babel'
|
* @author Younes ENNAJI
|
||||||
import resolve from '@rollup/plugin-node-resolve'
|
*/
|
||||||
import terser from '@rollup/plugin-terser'
|
|
||||||
import typescript from '@rollup/plugin-typescript'
|
|
||||||
import strip from '@rollup/plugin-strip'
|
|
||||||
import autoprefixer from 'autoprefixer'
|
|
||||||
import cssnano from 'cssnano'
|
|
||||||
import glob from 'glob'
|
|
||||||
import discardComments from 'postcss-discard-comments'
|
|
||||||
import { defineConfig } from 'rollup'
|
|
||||||
import cleanup from 'rollup-plugin-cleanup'
|
|
||||||
import clear from 'rollup-plugin-clear'
|
|
||||||
import copy from 'rollup-plugin-copy'
|
|
||||||
import filesize from 'rollup-plugin-filesize'
|
|
||||||
import postcss from 'rollup-plugin-postcss'
|
|
||||||
import progress from 'rollup-plugin-progress'
|
|
||||||
|
|
||||||
const isProduction = process.env.NODE_ENV === 'production'
|
import { createBuildConfigurations } from './rollup/index.js'
|
||||||
|
|
||||||
const modules = [
|
export default createBuildConfigurations()
|
||||||
{ name: 'flasher', path: 'src/Prime/Resources' },
|
|
||||||
{
|
|
||||||
name: 'noty',
|
|
||||||
path: 'src/Noty/Prime/Resources',
|
|
||||||
globals: { noty: 'Noty' },
|
|
||||||
assets: ['noty/lib/noty.min.js', 'noty/lib/noty.css', 'noty/lib/themes/mint.css'],
|
|
||||||
},
|
|
||||||
{ name: 'notyf', path: 'src/Notyf/Prime/Resources' },
|
|
||||||
{
|
|
||||||
name: 'sweetalert',
|
|
||||||
path: 'src/SweetAlert/Prime/Resources',
|
|
||||||
globals: { sweetalert2: 'Swal' },
|
|
||||||
assets: ['sweetalert2/dist/sweetalert2.min.js', 'sweetalert2/dist/sweetalert2.min.css'],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'toastr',
|
|
||||||
path: 'src/Toastr/Prime/Resources',
|
|
||||||
globals: { toastr: 'toastr' },
|
|
||||||
assets: ['jquery/dist/jquery.min.js', 'toastr/build/toastr.min.js', 'toastr/build/toastr.min.css'],
|
|
||||||
},
|
|
||||||
]
|
|
||||||
|
|
||||||
const postcssPlugins = [
|
|
||||||
cssnano(),
|
|
||||||
discardComments({ removeAll: true }),
|
|
||||||
autoprefixer({ overrideBrowserslist: ['> 0%'] }),
|
|
||||||
]
|
|
||||||
|
|
||||||
const externalFlasherId = fileURLToPath(new URL('src/Prime/Resources/assets/index.ts', import.meta.url))
|
|
||||||
|
|
||||||
function commonPlugins(path) {
|
|
||||||
return [
|
|
||||||
resolve(),
|
|
||||||
typescript({ compilerOptions: { outDir: `${path}/dist` }, include: [`${path}/assets/**/*.ts`] }),
|
|
||||||
babel({ babelHelpers: 'bundled' }),
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
function createConfig(module) {
|
|
||||||
module = { ...module, globals: createGlobals(module) }
|
|
||||||
|
|
||||||
return defineConfig({
|
|
||||||
input: `${module.path}/assets/index.ts`,
|
|
||||||
external: Object.keys(module.globals),
|
|
||||||
plugins: createPlugins(module),
|
|
||||||
output: createOutput(module),
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
function createGlobals(module) {
|
|
||||||
const globals = module.globals || {}
|
|
||||||
|
|
||||||
if (module.name !== 'flasher') {
|
|
||||||
globals['@flasher/flasher'] = 'flasher'
|
|
||||||
}
|
|
||||||
|
|
||||||
return globals
|
|
||||||
}
|
|
||||||
|
|
||||||
function createPlugins({ name, path, assets }) {
|
|
||||||
const filename = name === 'flasher' ? 'flasher.min.css' : `flasher-${name}.min.css`
|
|
||||||
|
|
||||||
const copyAssets = assets
|
|
||||||
? [copy({
|
|
||||||
targets: assets.map((asset) => ({
|
|
||||||
src: asset.startsWith('node_modules') ? asset : `node_modules/${asset}`,
|
|
||||||
dest: `${path}/public`,
|
|
||||||
})),
|
|
||||||
})]
|
|
||||||
: []
|
|
||||||
|
|
||||||
return [
|
|
||||||
progress(),
|
|
||||||
...(isProduction ? [clear({ targets: [`${path}/dist`, `${path}/public`] })] : []),
|
|
||||||
postcss({
|
|
||||||
extract: filename,
|
|
||||||
plugins: isProduction ? postcssPlugins : [],
|
|
||||||
use: { sass: { silenceDeprecations: ['legacy-js-api'] } },
|
|
||||||
}),
|
|
||||||
...commonPlugins(path),
|
|
||||||
...(isProduction ? [strip()] : []),
|
|
||||||
...(isProduction ? [cleanup({ comments: 'none' })] : []),
|
|
||||||
...copyAssets,
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
function createOutput({ name, path, globals }) {
|
|
||||||
const filename = name === 'flasher' ? 'flasher' : `flasher-${name}`
|
|
||||||
const distPath = `${path}/dist`
|
|
||||||
const publicPath = `${path}/public`
|
|
||||||
|
|
||||||
const output = {
|
|
||||||
name,
|
|
||||||
globals,
|
|
||||||
assetFileNames: '[name][extname]',
|
|
||||||
}
|
|
||||||
|
|
||||||
const plugins = [
|
|
||||||
...(isProduction ? [terser({ format: { comments: false } })] : []),
|
|
||||||
copy({
|
|
||||||
targets: [{ src: [`${distPath}/*.min.js`, `${distPath}/*.min.css`], dest: publicPath }],
|
|
||||||
hook: 'writeBundle',
|
|
||||||
}),
|
|
||||||
...(isProduction ? [filesize({ showBrotliSize: true })] : []),
|
|
||||||
]
|
|
||||||
|
|
||||||
return [
|
|
||||||
{ format: 'umd', file: `${distPath}/${filename}.min.js`, plugins, ...output },
|
|
||||||
{ format: 'umd', file: `${distPath}/${filename}.js`, ...output },
|
|
||||||
{ format: 'es', file: `${distPath}/${filename}.esm.js`, ...output },
|
|
||||||
// { format: 'cjs', file: `${distPath}/${filename}.cjs.js`, ...output },
|
|
||||||
// { format: 'iife', file: `${distPath}/${filename}.iife.js`, ...output },
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
function createPrimePlugin() {
|
|
||||||
const path = 'src/Prime/Resources'
|
|
||||||
const filename = `${path}/dist/plugin`
|
|
||||||
|
|
||||||
return defineConfig({
|
|
||||||
input: `${path}/assets/plugin.ts`,
|
|
||||||
plugins: [
|
|
||||||
resolve(),
|
|
||||||
typescript({
|
|
||||||
compilerOptions: {
|
|
||||||
outDir: `${path}/dist`,
|
|
||||||
},
|
|
||||||
include: [`${path}/assets/**/**`],
|
|
||||||
})],
|
|
||||||
output: [
|
|
||||||
{ format: 'es', file: `${filename}.js` },
|
|
||||||
// { format: 'cjs', file: `${filename}.cjs.js` },
|
|
||||||
],
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
function createThemeConfig(file) {
|
|
||||||
const primePath = 'src/Prime/Resources'
|
|
||||||
const themeName = path.basename(path.dirname(file))
|
|
||||||
|
|
||||||
const globals = {
|
|
||||||
'@flasher/flasher': 'flasher',
|
|
||||||
[externalFlasherId]: 'flasher',
|
|
||||||
}
|
|
||||||
|
|
||||||
return defineConfig({
|
|
||||||
input: file,
|
|
||||||
external: Object.keys(globals),
|
|
||||||
plugins: [
|
|
||||||
resolve(),
|
|
||||||
postcss({
|
|
||||||
extract: `${themeName}.min.css`,
|
|
||||||
plugins: isProduction ? postcssPlugins : [],
|
|
||||||
use: { sass: { silenceDeprecations: ['legacy-js-api'] } },
|
|
||||||
}),
|
|
||||||
typescript({
|
|
||||||
compilerOptions: {
|
|
||||||
outDir: `${primePath}/dist/themes/${themeName}`,
|
|
||||||
declaration: false,
|
|
||||||
},
|
|
||||||
include: [
|
|
||||||
`${primePath}/assets/**/*.ts`,
|
|
||||||
],
|
|
||||||
}),
|
|
||||||
babel({ babelHelpers: 'bundled' }),
|
|
||||||
...(isProduction ? [cleanup({ comments: 'none' })] : []),
|
|
||||||
...(isProduction ? [strip()] : []),
|
|
||||||
...(isProduction ? [filesize({ showBrotliSize: true })] : []),
|
|
||||||
],
|
|
||||||
output: [
|
|
||||||
{
|
|
||||||
format: 'umd',
|
|
||||||
file: `${primePath}/dist/themes/${themeName}/${themeName}.min.js`,
|
|
||||||
name: `theme.${themeName}`,
|
|
||||||
globals,
|
|
||||||
plugins: [
|
|
||||||
...isProduction ? [terser({ format: { comments: false } })] : [],
|
|
||||||
copy({
|
|
||||||
targets: [
|
|
||||||
{
|
|
||||||
src: [
|
|
||||||
`${primePath}/dist/themes/${themeName}/${themeName}.min.js`,
|
|
||||||
`${primePath}/dist/themes/${themeName}/${themeName}.min.css`,
|
|
||||||
],
|
|
||||||
dest: `${primePath}/public/themes/${themeName}`,
|
|
||||||
},
|
|
||||||
],
|
|
||||||
hook: 'writeBundle',
|
|
||||||
verbose: false,
|
|
||||||
}),
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
format: 'umd',
|
|
||||||
file: `${primePath}/dist/themes/${themeName}/${themeName}.js`,
|
|
||||||
name: `theme.${themeName}`,
|
|
||||||
globals,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
format: 'es',
|
|
||||||
file: `${primePath}/dist/themes/${themeName}/${themeName}.esm.js`,
|
|
||||||
globals,
|
|
||||||
},
|
|
||||||
],
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
function createThemesConfigs() {
|
|
||||||
const primePath = 'src/Prime/Resources'
|
|
||||||
const themesDir = `${primePath}/assets/themes`
|
|
||||||
|
|
||||||
const themeFiles = glob.sync(`${themesDir}/**/index.ts`).filter((file) => file !== `${themesDir}/index.ts`)
|
|
||||||
|
|
||||||
return themeFiles.map(createThemeConfig)
|
|
||||||
}
|
|
||||||
|
|
||||||
export default [
|
|
||||||
createPrimePlugin(),
|
|
||||||
...modules.map(createConfig),
|
|
||||||
...createThemesConfigs(),
|
|
||||||
]
|
|
||||||
|
|||||||
@@ -0,0 +1,140 @@
|
|||||||
|
/**
|
||||||
|
* @description Central configuration for PHPFlasher build system
|
||||||
|
*/
|
||||||
|
|
||||||
|
import process from 'node:process'
|
||||||
|
import { fileURLToPath } from 'node:url'
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Build environment settings
|
||||||
|
*/
|
||||||
|
const ENV = {
|
||||||
|
isProduction: process.env.NODE_ENV === 'production',
|
||||||
|
isDevelopment: process.env.NODE_ENV !== 'production',
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Path configuration
|
||||||
|
*/
|
||||||
|
const PATHS = {
|
||||||
|
src: 'src',
|
||||||
|
get prime() {
|
||||||
|
return `${this.src}/Prime/Resources`
|
||||||
|
},
|
||||||
|
get themes() {
|
||||||
|
return `${this.prime}/assets/themes`
|
||||||
|
},
|
||||||
|
get nodeModules() {
|
||||||
|
return 'node_modules'
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Output format constants
|
||||||
|
*/
|
||||||
|
const FORMATS = {
|
||||||
|
UMD: 'umd',
|
||||||
|
ESM: 'es',
|
||||||
|
CJS: 'cjs',
|
||||||
|
IIFE: 'iife',
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Module definitions for PHPFlasher
|
||||||
|
*/
|
||||||
|
const MODULES = [
|
||||||
|
// Core flasher module
|
||||||
|
{
|
||||||
|
name: 'flasher',
|
||||||
|
path: PATHS.prime,
|
||||||
|
},
|
||||||
|
|
||||||
|
// Noty notification plugin
|
||||||
|
{
|
||||||
|
name: 'noty',
|
||||||
|
path: `${PATHS.src}/Noty/Prime/Resources`,
|
||||||
|
globals: { noty: 'Noty' },
|
||||||
|
assets: [
|
||||||
|
'noty/lib/noty.min.js',
|
||||||
|
'noty/lib/noty.css',
|
||||||
|
'noty/lib/themes/mint.css',
|
||||||
|
],
|
||||||
|
},
|
||||||
|
|
||||||
|
// Notyf notification plugin
|
||||||
|
{
|
||||||
|
name: 'notyf',
|
||||||
|
path: `${PATHS.src}/Notyf/Prime/Resources`,
|
||||||
|
},
|
||||||
|
|
||||||
|
// SweetAlert notification plugin
|
||||||
|
{
|
||||||
|
name: 'sweetalert',
|
||||||
|
path: `${PATHS.src}/SweetAlert/Prime/Resources`,
|
||||||
|
globals: { sweetalert2: 'Swal' },
|
||||||
|
assets: [
|
||||||
|
'sweetalert2/dist/sweetalert2.min.js',
|
||||||
|
'sweetalert2/dist/sweetalert2.min.css',
|
||||||
|
],
|
||||||
|
},
|
||||||
|
|
||||||
|
// Toastr notification plugin
|
||||||
|
{
|
||||||
|
name: 'toastr',
|
||||||
|
path: `${PATHS.src}/Toastr/Prime/Resources`,
|
||||||
|
globals: { toastr: 'toastr' },
|
||||||
|
assets: [
|
||||||
|
'jquery/dist/jquery.min.js',
|
||||||
|
'toastr/build/toastr.min.js',
|
||||||
|
'toastr/build/toastr.min.css',
|
||||||
|
],
|
||||||
|
},
|
||||||
|
]
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Build options
|
||||||
|
*/
|
||||||
|
const BUILD_OPTIONS = {
|
||||||
|
banner: '/**\n * @package PHPFlasher\n * @author Younes ENNAJI\n * @license MIT\n */',
|
||||||
|
sourceMaps: true,
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Filename generators
|
||||||
|
*/
|
||||||
|
const FILENAME_GENERATORS = {
|
||||||
|
/**
|
||||||
|
* Generate module filename based on name
|
||||||
|
* @param {string} name - Module name
|
||||||
|
* @param {string} suffix - Optional suffix
|
||||||
|
* @returns {string} Formatted filename
|
||||||
|
*/
|
||||||
|
module(name, suffix = '') {
|
||||||
|
return name === 'flasher' ? `flasher${suffix}` : `flasher-${name}${suffix}`
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generate CSS filename based on module name
|
||||||
|
* @param {string} name - Module name
|
||||||
|
* @returns {string} CSS filename
|
||||||
|
*/
|
||||||
|
css(name) {
|
||||||
|
return this.module(name, '.min.css')
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
// Calculate external flasher ID (needed for themes)
|
||||||
|
const FLASHER_ID = fileURLToPath(new URL(`${PATHS.prime}/assets/index.ts`, import.meta.url))
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Exported configuration object
|
||||||
|
*/
|
||||||
|
export const CONFIG = {
|
||||||
|
env: ENV,
|
||||||
|
paths: PATHS,
|
||||||
|
formats: FORMATS,
|
||||||
|
modules: MODULES,
|
||||||
|
build: BUILD_OPTIONS,
|
||||||
|
filenames: FILENAME_GENERATORS,
|
||||||
|
flasherId: FLASHER_ID,
|
||||||
|
}
|
||||||
+112
@@ -0,0 +1,112 @@
|
|||||||
|
/**
|
||||||
|
* @description Core build system for PHPFlasher
|
||||||
|
* Contains consolidated build functions
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { defineConfig } from 'rollup'
|
||||||
|
|
||||||
|
import {
|
||||||
|
createModulePlugins,
|
||||||
|
createOutputPlugins,
|
||||||
|
} from './plugins.js'
|
||||||
|
import {
|
||||||
|
buildPrimePlugin,
|
||||||
|
buildThemesConfigurations,
|
||||||
|
} from './targets.js'
|
||||||
|
import { CONFIG } from './config.js'
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create all build configurations for PHPFlasher
|
||||||
|
* @returns {Array<object>} Combined rollup configurations
|
||||||
|
*/
|
||||||
|
export function createBuildConfigurations() {
|
||||||
|
return [
|
||||||
|
buildPrimePlugin(),
|
||||||
|
...CONFIG.modules.map(buildModuleConfig),
|
||||||
|
...buildThemesConfigurations(),
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Build a complete Rollup configuration for a module
|
||||||
|
* @param {object} moduleConfig - Module configuration object
|
||||||
|
* @returns {object} Rollup configuration object
|
||||||
|
*/
|
||||||
|
function buildModuleConfig(moduleConfig) {
|
||||||
|
// Normalize the module configuration
|
||||||
|
const module = {
|
||||||
|
...moduleConfig,
|
||||||
|
globals: buildGlobalsDictionary(moduleConfig),
|
||||||
|
}
|
||||||
|
|
||||||
|
return defineConfig({
|
||||||
|
input: `${module.path}/assets/index.ts`,
|
||||||
|
external: Object.keys(module.globals),
|
||||||
|
plugins: createModulePlugins(module),
|
||||||
|
output: buildOutputConfigs(module),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Build globals dictionary for module
|
||||||
|
* @param {object} module - Module configuration
|
||||||
|
* @returns {object} Globals mapping for Rollup
|
||||||
|
*/
|
||||||
|
function buildGlobalsDictionary(module) {
|
||||||
|
const globals = module.globals || {}
|
||||||
|
|
||||||
|
// Add flasher as external dependency for all non-core modules
|
||||||
|
if (module.name !== 'flasher') {
|
||||||
|
globals['@flasher/flasher'] = 'flasher'
|
||||||
|
}
|
||||||
|
|
||||||
|
return globals
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Build output configurations for a module
|
||||||
|
* @param {object} module - Module configuration with name, path, globals
|
||||||
|
* @returns {Array} Array of output configurations
|
||||||
|
*/
|
||||||
|
function buildOutputConfigs({ name, path, globals }) {
|
||||||
|
// Generate appropriate filename based on module name
|
||||||
|
const filename = CONFIG.filenames.module(name)
|
||||||
|
const distPath = `${path}/dist`
|
||||||
|
const publicPath = `${path}/public`
|
||||||
|
|
||||||
|
// Base output configuration shared across formats
|
||||||
|
const baseOutput = {
|
||||||
|
name,
|
||||||
|
globals,
|
||||||
|
assetFileNames: '[name][extname]',
|
||||||
|
banner: CONFIG.build.banner,
|
||||||
|
}
|
||||||
|
|
||||||
|
// Output plugins
|
||||||
|
const outputPlugins = createOutputPlugins(distPath, publicPath)
|
||||||
|
|
||||||
|
// Return array of output formats
|
||||||
|
return [
|
||||||
|
// Minified UMD bundle
|
||||||
|
{
|
||||||
|
format: CONFIG.formats.UMD,
|
||||||
|
file: `${distPath}/${filename}.min.js`,
|
||||||
|
plugins: outputPlugins,
|
||||||
|
...baseOutput,
|
||||||
|
},
|
||||||
|
|
||||||
|
// Non-minified UMD bundle
|
||||||
|
{
|
||||||
|
format: CONFIG.formats.UMD,
|
||||||
|
file: `${distPath}/${filename}.js`,
|
||||||
|
...baseOutput,
|
||||||
|
},
|
||||||
|
|
||||||
|
// ESM bundle for modern bundlers
|
||||||
|
{
|
||||||
|
format: CONFIG.formats.ESM,
|
||||||
|
file: `${distPath}/${filename}.esm.js`,
|
||||||
|
...baseOutput,
|
||||||
|
},
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1,246 @@
|
|||||||
|
/**
|
||||||
|
* @description Plugin configurations for PHPFlasher build system
|
||||||
|
* Centralizes all plugin configurations in one place
|
||||||
|
*/
|
||||||
|
|
||||||
|
import autoprefixer from 'autoprefixer'
|
||||||
|
import cssnano from 'cssnano'
|
||||||
|
import discardComments from 'postcss-discard-comments'
|
||||||
|
import babel from '@rollup/plugin-babel'
|
||||||
|
import resolve from '@rollup/plugin-node-resolve'
|
||||||
|
import strip from '@rollup/plugin-strip'
|
||||||
|
import terser from '@rollup/plugin-terser'
|
||||||
|
import typescript from '@rollup/plugin-typescript'
|
||||||
|
import cleanup from 'rollup-plugin-cleanup'
|
||||||
|
import clear from 'rollup-plugin-clear'
|
||||||
|
import copy from 'rollup-plugin-copy'
|
||||||
|
import filesize from 'rollup-plugin-filesize'
|
||||||
|
import postcss from 'rollup-plugin-postcss'
|
||||||
|
import progress from 'rollup-plugin-progress'
|
||||||
|
|
||||||
|
import { CONFIG } from './config.js'
|
||||||
|
|
||||||
|
/**
|
||||||
|
* CSS processing plugins collection
|
||||||
|
*/
|
||||||
|
export const cssPlugins = [
|
||||||
|
// Minify CSS with advanced optimizations
|
||||||
|
cssnano({
|
||||||
|
preset: ['default', {
|
||||||
|
discardComments: {
|
||||||
|
removeAll: true,
|
||||||
|
},
|
||||||
|
}],
|
||||||
|
}),
|
||||||
|
|
||||||
|
// Remove all comments
|
||||||
|
discardComments({
|
||||||
|
removeAll: true,
|
||||||
|
}),
|
||||||
|
|
||||||
|
// Add vendor prefixes for browser compatibility
|
||||||
|
autoprefixer(),
|
||||||
|
]
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a progress indicator plugin
|
||||||
|
* @param {string} name - Module name for display
|
||||||
|
* @returns {Array} Configured plugins
|
||||||
|
*/
|
||||||
|
export function createProgressPlugin(name) {
|
||||||
|
return [
|
||||||
|
progress({
|
||||||
|
clearLine: true,
|
||||||
|
format: `Building ${name} [:bar] :percent`,
|
||||||
|
}),
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create directory cleaning plugins
|
||||||
|
* @param {string} path - Path to clean
|
||||||
|
* @returns {Array} Configured plugins
|
||||||
|
*/
|
||||||
|
export function createCleanPlugin(path) {
|
||||||
|
return CONFIG.env.isProduction
|
||||||
|
? [clear({ targets: [`${path}/dist`, `${path}/public`] })]
|
||||||
|
: []
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create CSS processing plugins
|
||||||
|
* @param {string} name - Module name
|
||||||
|
* @returns {Array} Configured plugins
|
||||||
|
*/
|
||||||
|
export function createCssPlugin(name) {
|
||||||
|
return [
|
||||||
|
postcss({
|
||||||
|
extract: CONFIG.filenames.css(name),
|
||||||
|
plugins: CONFIG.env.isProduction ? cssPlugins : [],
|
||||||
|
use: { sass: { silenceDeprecations: ['legacy-js-api'] } },
|
||||||
|
}),
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create core compilation plugins
|
||||||
|
* @param {string} path - Module path
|
||||||
|
* @returns {Array} Configured plugins
|
||||||
|
*/
|
||||||
|
export function createCompilationPlugins(path) {
|
||||||
|
return [
|
||||||
|
resolve(),
|
||||||
|
typescript({
|
||||||
|
compilerOptions: {
|
||||||
|
outDir: `${path}/dist`,
|
||||||
|
},
|
||||||
|
include: [`${path}/assets/**/*.ts`],
|
||||||
|
}),
|
||||||
|
babel({ babelHelpers: 'bundled' }),
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create code optimization plugins for production
|
||||||
|
* @returns {Array} Configured plugins
|
||||||
|
*/
|
||||||
|
export function createOptimizationPlugins() {
|
||||||
|
return CONFIG.env.isProduction
|
||||||
|
? [
|
||||||
|
strip(),
|
||||||
|
cleanup({ comments: 'none' }),
|
||||||
|
]
|
||||||
|
: []
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create asset copying plugins
|
||||||
|
* @param {string} path - Destination path
|
||||||
|
* @param {Array} assets - Assets to copy
|
||||||
|
* @returns {Array} Configured plugins
|
||||||
|
*/
|
||||||
|
export function createAssetCopyPlugins(path, assets) {
|
||||||
|
return assets
|
||||||
|
? [
|
||||||
|
copy({
|
||||||
|
targets: assets.map((asset) => ({
|
||||||
|
src: asset.startsWith('node_modules') ? asset : `node_modules/${asset}`,
|
||||||
|
dest: `${path}/public`,
|
||||||
|
})),
|
||||||
|
}),
|
||||||
|
]
|
||||||
|
: []
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create output bundle plugins
|
||||||
|
* @param {string} distPath - Distribution path
|
||||||
|
* @param {string} publicPath - Public path
|
||||||
|
* @returns {Array} Configured plugins
|
||||||
|
*/
|
||||||
|
export function createOutputPlugins(distPath, publicPath) {
|
||||||
|
return [
|
||||||
|
// Minify with terser in production mode
|
||||||
|
...(CONFIG.env.isProduction ? [terser({ format: { comments: false } })] : []),
|
||||||
|
|
||||||
|
// Copy minified files to public directory
|
||||||
|
copy({
|
||||||
|
targets: [{
|
||||||
|
src: [`${distPath}/*.min.js`, `${distPath}/*.min.css`],
|
||||||
|
dest: publicPath,
|
||||||
|
}],
|
||||||
|
hook: 'writeBundle',
|
||||||
|
}),
|
||||||
|
|
||||||
|
// Show bundle size information in production
|
||||||
|
...(CONFIG.env.isProduction ? [filesize({ showBrotliSize: true })] : []),
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create metrics reporting plugins
|
||||||
|
* @returns {Array} Configured plugins
|
||||||
|
*/
|
||||||
|
export function createMetricsPlugins() {
|
||||||
|
return CONFIG.env.isProduction
|
||||||
|
? [
|
||||||
|
filesize({
|
||||||
|
showMinifiedSize: true,
|
||||||
|
showGzippedSize: true,
|
||||||
|
showBrotliSize: true,
|
||||||
|
}),
|
||||||
|
]
|
||||||
|
: []
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a complete plugin set for module builds
|
||||||
|
* @param {object} module - Module configuration
|
||||||
|
* @returns {Array} All configured plugins
|
||||||
|
*/
|
||||||
|
export function createModulePlugins({ name, path, assets }) {
|
||||||
|
return [
|
||||||
|
...createProgressPlugin(name),
|
||||||
|
...createCleanPlugin(path),
|
||||||
|
...createCssPlugin(name),
|
||||||
|
...createCompilationPlugins(path),
|
||||||
|
...createOptimizationPlugins(),
|
||||||
|
...createAssetCopyPlugins(path, assets),
|
||||||
|
...createMetricsPlugins(),
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create special theme plugins
|
||||||
|
* @param {string} primePath - Path to prime resources
|
||||||
|
* @param {string} themeName - Theme name
|
||||||
|
* @returns {Array} Theme-specific plugins
|
||||||
|
*/
|
||||||
|
export function createThemePlugins(primePath, themeName) {
|
||||||
|
console.log(`Setting up plugins for theme: ${themeName}`)
|
||||||
|
|
||||||
|
return [
|
||||||
|
{
|
||||||
|
name: 'external-debug',
|
||||||
|
resolveId(source, importer) {
|
||||||
|
console.log(`Import resolution: ${source} from ${importer || 'unknown'}`)
|
||||||
|
return null // Let Rollup continue resolution
|
||||||
|
},
|
||||||
|
},
|
||||||
|
resolve({
|
||||||
|
// This is critical - it ensures that Rollup prioritizes
|
||||||
|
// the external check before trying to resolve
|
||||||
|
preferBuiltins: true,
|
||||||
|
}),
|
||||||
|
// Process theme CSS/SCSS
|
||||||
|
postcss({
|
||||||
|
extract: `${themeName}.min.css`,
|
||||||
|
plugins: CONFIG.env.isProduction ? cssPlugins : [],
|
||||||
|
use: { sass: { silenceDeprecations: ['legacy-js-api'] } },
|
||||||
|
sourceMap: false,
|
||||||
|
}),
|
||||||
|
// TypeScript processing
|
||||||
|
typescript({
|
||||||
|
compilerOptions: {
|
||||||
|
outDir: `${primePath}/dist/themes/${themeName}`,
|
||||||
|
declaration: false,
|
||||||
|
},
|
||||||
|
include: [
|
||||||
|
`${primePath}/assets/**/*.ts`,
|
||||||
|
],
|
||||||
|
}),
|
||||||
|
babel({ babelHelpers: 'bundled' }),
|
||||||
|
// Production optimizations
|
||||||
|
...createOptimizationPlugins(),
|
||||||
|
...createMetricsPlugins(),
|
||||||
|
{
|
||||||
|
name: 'theme-debugger',
|
||||||
|
transform(code, id) {
|
||||||
|
if (id.includes(`themes/${themeName}`)) {
|
||||||
|
console.log(`Building theme: ${themeName} (${id})`)
|
||||||
|
}
|
||||||
|
return null
|
||||||
|
},
|
||||||
|
},
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1,163 @@
|
|||||||
|
/**
|
||||||
|
* @description Specialized build targets
|
||||||
|
* Contains configurations for specific build targets
|
||||||
|
*/
|
||||||
|
|
||||||
|
import path from 'node:path'
|
||||||
|
import { glob } from 'glob'
|
||||||
|
import { defineConfig } from 'rollup'
|
||||||
|
import resolve from '@rollup/plugin-node-resolve'
|
||||||
|
import typescript from '@rollup/plugin-typescript'
|
||||||
|
import copy from 'rollup-plugin-copy'
|
||||||
|
import terser from '@rollup/plugin-terser'
|
||||||
|
|
||||||
|
import { CONFIG } from './config.js'
|
||||||
|
import {
|
||||||
|
createThemePlugins,
|
||||||
|
} from './plugins.js'
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Build configuration for the Prime plugin module
|
||||||
|
* @returns {object} Rollup configuration
|
||||||
|
*/
|
||||||
|
export function buildPrimePlugin() {
|
||||||
|
const primePath = CONFIG.paths.prime
|
||||||
|
const filename = `${primePath}/dist/plugin`
|
||||||
|
|
||||||
|
return defineConfig({
|
||||||
|
input: `${primePath}/assets/plugin.ts`,
|
||||||
|
plugins: [
|
||||||
|
resolve(),
|
||||||
|
typescript({
|
||||||
|
compilerOptions: {
|
||||||
|
outDir: `${primePath}/dist`,
|
||||||
|
},
|
||||||
|
include: [`${primePath}/assets/**/**`],
|
||||||
|
}),
|
||||||
|
],
|
||||||
|
output: [
|
||||||
|
{
|
||||||
|
format: CONFIG.formats.ESM,
|
||||||
|
file: `${filename}.js`,
|
||||||
|
banner: CONFIG.build.banner,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Build configurations for all available themes
|
||||||
|
* @returns {Array<object>} Theme build configurations
|
||||||
|
*/
|
||||||
|
export function buildThemesConfigurations() {
|
||||||
|
// Find all theme entry points but exclude the main themes index
|
||||||
|
const themeFiles = glob.sync(`${CONFIG.paths.themes}/**/index.ts`)
|
||||||
|
.filter((file) => file !== `${CONFIG.paths.themes}/index.ts`)
|
||||||
|
|
||||||
|
// Create a configuration for each theme
|
||||||
|
return themeFiles.map(buildThemeConfig)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Build configuration for a specific theme
|
||||||
|
* @param {string} themePath - Path to theme entry file
|
||||||
|
* @returns {object} Rollup configuration for theme
|
||||||
|
*/
|
||||||
|
function buildThemeConfig(themePath) {
|
||||||
|
const primePath = CONFIG.paths.prime
|
||||||
|
const themeName = path.basename(path.dirname(themePath))
|
||||||
|
|
||||||
|
console.log(`Configuring build for theme: ${themeName} (${themePath})`)
|
||||||
|
|
||||||
|
// Define external dependencies and their global names
|
||||||
|
const globals = {
|
||||||
|
'@flasher/flasher': 'flasher',
|
||||||
|
[CONFIG.flasherId]: 'flasher',
|
||||||
|
}
|
||||||
|
|
||||||
|
return defineConfig({
|
||||||
|
input: themePath,
|
||||||
|
|
||||||
|
// Simplified external check that only looks for specific imports
|
||||||
|
external: Object.keys(globals),
|
||||||
|
|
||||||
|
plugins: [
|
||||||
|
// Add a plugin to rewrite imports to use the package name
|
||||||
|
{
|
||||||
|
name: 'rewrite-imports',
|
||||||
|
resolveId(source, importer) {
|
||||||
|
// Handle relative imports that should be external
|
||||||
|
if (source === '../../index' || source === '../../../index') {
|
||||||
|
console.log(`Rewriting ${source} to @flasher/flasher`)
|
||||||
|
return { id: '@flasher/flasher', external: true }
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handle absolute path to flasher index
|
||||||
|
if (source === CONFIG.flasherId
|
||||||
|
|| (importer && source.includes(path.join(primePath, 'assets/index')))) {
|
||||||
|
console.log(`Rewriting ${source} to @flasher/flasher`)
|
||||||
|
return { id: '@flasher/flasher', external: true }
|
||||||
|
}
|
||||||
|
|
||||||
|
return null
|
||||||
|
},
|
||||||
|
},
|
||||||
|
...createThemePlugins(primePath, themeName),
|
||||||
|
],
|
||||||
|
|
||||||
|
output: [
|
||||||
|
// Minified UMD bundle
|
||||||
|
{
|
||||||
|
format: CONFIG.formats.UMD,
|
||||||
|
file: `${primePath}/dist/themes/${themeName}/${themeName}.min.js`,
|
||||||
|
name: `theme.${themeName}`,
|
||||||
|
globals,
|
||||||
|
banner: CONFIG.build.banner,
|
||||||
|
|
||||||
|
// Fix: Remove the paths option which is causing the issue
|
||||||
|
// Or explicitly force absolute (non-relative) paths:
|
||||||
|
paths: (id) => {
|
||||||
|
if (id === '@flasher/flasher' || id.includes('@flasher/flasher')) {
|
||||||
|
// Ensure we return the exact package name with no modifications
|
||||||
|
return '@flasher/flasher'
|
||||||
|
}
|
||||||
|
// For all other IDs, return as-is
|
||||||
|
return id
|
||||||
|
},
|
||||||
|
|
||||||
|
plugins: [
|
||||||
|
...CONFIG.env.isProduction ? [terser({ format: { comments: false } })] : [],
|
||||||
|
copy({
|
||||||
|
targets: [
|
||||||
|
{
|
||||||
|
src: [
|
||||||
|
`${primePath}/dist/themes/${themeName}/${themeName}.min.js`,
|
||||||
|
`${primePath}/dist/themes/${themeName}/${themeName}.min.css`,
|
||||||
|
],
|
||||||
|
dest: `${primePath}/public/themes/${themeName}`,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
hook: 'writeBundle',
|
||||||
|
verbose: false,
|
||||||
|
}),
|
||||||
|
],
|
||||||
|
},
|
||||||
|
// Use the same fix for non-minified and ESM bundles
|
||||||
|
{
|
||||||
|
format: CONFIG.formats.UMD,
|
||||||
|
file: `${primePath}/dist/themes/${themeName}/${themeName}.js`,
|
||||||
|
name: `theme.${themeName}`,
|
||||||
|
globals,
|
||||||
|
banner: CONFIG.build.banner,
|
||||||
|
paths: (id) => id === '@flasher/flasher' ? '@flasher/flasher' : id,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
format: CONFIG.formats.ESM,
|
||||||
|
file: `${primePath}/dist/themes/${themeName}/${themeName}.esm.js`,
|
||||||
|
globals,
|
||||||
|
banner: CONFIG.build.banner,
|
||||||
|
paths: (id) => id === '@flasher/flasher' ? '@flasher/flasher' : id,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
})
|
||||||
|
}
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* @file Noty Plugin Entry Point
|
* @file Noty Plugin Entry Point
|
||||||
* @description Registers the Noty plugin with PHPFlasher
|
* @description Registers the Noty plugin with PHPFlasher
|
||||||
* @author yoeunes
|
* @author Younes ENNAJI
|
||||||
*/
|
*/
|
||||||
import flasher from '@flasher/flasher'
|
import flasher from '@flasher/flasher'
|
||||||
import NotyPlugin from './noty'
|
import NotyPlugin from './noty'
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* @file Noty Plugin Implementation
|
* @file Noty Plugin Implementation
|
||||||
* @description PHPFlasher integration with the Noty notification library
|
* @description PHPFlasher integration with the Noty notification library
|
||||||
* @author yoeunes
|
* @author Younes ENNAJI
|
||||||
*/
|
*/
|
||||||
import { AbstractPlugin } from '@flasher/flasher/dist/plugin'
|
import { AbstractPlugin } from '@flasher/flasher/dist/plugin'
|
||||||
import type { Envelope, Options } from '@flasher/flasher/dist/types'
|
import type { Envelope, Options } from '@flasher/flasher/dist/types'
|
||||||
|
|||||||
@@ -1,3 +1,8 @@
|
|||||||
|
/**
|
||||||
|
* @package PHPFlasher
|
||||||
|
* @author Younes ENNAJI
|
||||||
|
* @license MIT
|
||||||
|
*/
|
||||||
import flasher from '@flasher/flasher';
|
import flasher from '@flasher/flasher';
|
||||||
import Noty from 'noty';
|
import Noty from 'noty';
|
||||||
|
|
||||||
|
|||||||
@@ -1,3 +1,8 @@
|
|||||||
|
/**
|
||||||
|
* @package PHPFlasher
|
||||||
|
* @author Younes ENNAJI
|
||||||
|
* @license MIT
|
||||||
|
*/
|
||||||
(function (global, factory) {
|
(function (global, factory) {
|
||||||
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('@flasher/flasher'), require('noty')) :
|
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('@flasher/flasher'), require('noty')) :
|
||||||
typeof define === 'function' && define.amd ? define(['@flasher/flasher', 'noty'], factory) :
|
typeof define === 'function' && define.amd ? define(['@flasher/flasher', 'noty'], factory) :
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* @file Notyf Plugin Entry Point
|
* @file Notyf Plugin Entry Point
|
||||||
* @description Registers the Notyf plugin with PHPFlasher
|
* @description Registers the Notyf plugin with PHPFlasher
|
||||||
* @author yoeunes
|
* @author Younes ENNAJI
|
||||||
*/
|
*/
|
||||||
import './notyf.scss'
|
import './notyf.scss'
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
* (info and warning) beyond the default success and error types
|
* (info and warning) beyond the default success and error types
|
||||||
* provided by Notyf.
|
* provided by Notyf.
|
||||||
*
|
*
|
||||||
* @author yoeunes
|
* @author Younes ENNAJI
|
||||||
*/
|
*/
|
||||||
|
|
||||||
.notyf {
|
.notyf {
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* @file Notyf Plugin Implementation
|
* @file Notyf Plugin Implementation
|
||||||
* @description PHPFlasher integration with the Notyf notification library
|
* @description PHPFlasher integration with the Notyf notification library
|
||||||
* @author yoeunes
|
* @author Younes ENNAJI
|
||||||
*/
|
*/
|
||||||
import { AbstractPlugin } from '@flasher/flasher/dist/plugin'
|
import { AbstractPlugin } from '@flasher/flasher/dist/plugin'
|
||||||
import type { Envelope, Options } from '@flasher/flasher/dist/types'
|
import type { Envelope, Options } from '@flasher/flasher/dist/types'
|
||||||
|
|||||||
@@ -1,3 +1,8 @@
|
|||||||
|
/**
|
||||||
|
* @package PHPFlasher
|
||||||
|
* @author Younes ENNAJI
|
||||||
|
* @license MIT
|
||||||
|
*/
|
||||||
import flasher from '@flasher/flasher';
|
import flasher from '@flasher/flasher';
|
||||||
|
|
||||||
class AbstractPlugin {
|
class AbstractPlugin {
|
||||||
|
|||||||
@@ -1,3 +1,8 @@
|
|||||||
|
/**
|
||||||
|
* @package PHPFlasher
|
||||||
|
* @author Younes ENNAJI
|
||||||
|
* @license MIT
|
||||||
|
*/
|
||||||
(function (global, factory) {
|
(function (global, factory) {
|
||||||
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('@flasher/flasher')) :
|
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('@flasher/flasher')) :
|
||||||
typeof define === 'function' && define.amd ? define(['@flasher/flasher'], factory) :
|
typeof define === 'function' && define.amd ? define(['@flasher/flasher'], factory) :
|
||||||
|
|||||||
+2
-2
File diff suppressed because one or more lines are too long
+2
-2
File diff suppressed because one or more lines are too long
@@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* @file PHPFlasher Type Exports
|
* @file PHPFlasher Type Exports
|
||||||
* @description Re-exports types and interfaces for TypeScript users
|
* @description Re-exports types and interfaces for TypeScript users
|
||||||
* @author yoeunes
|
* @author Younes ENNAJI
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* @file FlasherPlugin Implementation
|
* @file FlasherPlugin Implementation
|
||||||
* @description Default implementation for displaying notifications using custom themes
|
* @description Default implementation for displaying notifications using custom themes
|
||||||
* @author yoeunes
|
* @author Younes ENNAJI
|
||||||
*/
|
*/
|
||||||
import './themes/index.scss'
|
import './themes/index.scss'
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* @file Flasher Core
|
* @file Flasher Core
|
||||||
* @description Main orchestration class for the PHPFlasher notification system
|
* @description Main orchestration class for the PHPFlasher notification system
|
||||||
* @author yoeunes
|
* @author Younes ENNAJI
|
||||||
*/
|
*/
|
||||||
import type { Asset, Context, Envelope, Options, PluginInterface, Response, Theme } from './types'
|
import type { Asset, Context, Envelope, Options, PluginInterface, Response, Theme } from './types'
|
||||||
import { AbstractPlugin } from './plugin'
|
import { AbstractPlugin } from './plugin'
|
||||||
|
|||||||
+1
-1
@@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* @file TypeScript Global Declarations
|
* @file TypeScript Global Declarations
|
||||||
* @description Type definitions for global objects
|
* @description Type definitions for global objects
|
||||||
* @author yoeunes
|
* @author Younes ENNAJI
|
||||||
*/
|
*/
|
||||||
import type Flasher from './flasher'
|
import type Flasher from './flasher'
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* @file PHPFlasher Main Entry Point
|
* @file PHPFlasher Main Entry Point
|
||||||
* @description Creates and exports the default PHPFlasher instance
|
* @description Creates and exports the default PHPFlasher instance
|
||||||
* @author yoeunes
|
* @author Younes ENNAJI
|
||||||
*/
|
*/
|
||||||
import Flasher from './flasher'
|
import Flasher from './flasher'
|
||||||
import { flasherTheme } from './themes'
|
import { flasherTheme } from './themes'
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* @file Abstract Plugin Base Class
|
* @file Abstract Plugin Base Class
|
||||||
* @description Base implementation shared by all notification plugins
|
* @description Base implementation shared by all notification plugins
|
||||||
* @author yoeunes
|
* @author Younes ENNAJI
|
||||||
*/
|
*/
|
||||||
import type { Envelope, Options, PluginInterface } from './types'
|
import type { Envelope, Options, PluginInterface } from './types'
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* @file PHPFlasher Amazon Theme Styles
|
* @file PHPFlasher Amazon Theme Styles
|
||||||
* @description CSS styling for Amazon-inspired notifications
|
* @description CSS styling for Amazon-inspired notifications
|
||||||
* @author yoeunes
|
* @author Younes ENNAJI
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* @file PHPFlasher Amazon Theme Implementation
|
* @file PHPFlasher Amazon Theme Implementation
|
||||||
* @description Notification style inspired by Amazon's e-commerce platform
|
* @description Notification style inspired by Amazon's e-commerce platform
|
||||||
* @author yoeunes
|
* @author Younes ENNAJI
|
||||||
*/
|
*/
|
||||||
import './amazon.scss'
|
import './amazon.scss'
|
||||||
import type { Envelope } from '../../types'
|
import type { Envelope } from '../../types'
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* @file PHPFlasher Amazon Theme Registration
|
* @file PHPFlasher Amazon Theme Registration
|
||||||
* @description Registers the Amazon theme with PHPFlasher
|
* @description Registers the Amazon theme with PHPFlasher
|
||||||
* @author yoeunes
|
* @author Younes ENNAJI
|
||||||
*/
|
*/
|
||||||
import flasher from '../../index'
|
import flasher from '../../index'
|
||||||
import { amazonTheme } from './amazon'
|
import { amazonTheme } from './amazon'
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* @file PHPFlasher Amber Theme Styles
|
* @file PHPFlasher Amber Theme Styles
|
||||||
* @description CSS styling for the modern, elegant Amber theme
|
* @description CSS styling for the modern, elegant Amber theme
|
||||||
* @author yoeunes
|
* @author Younes ENNAJI
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* @file PHPFlasher Amber Theme Implementation
|
* @file PHPFlasher Amber Theme Implementation
|
||||||
* @description Modern, elegant notification theme with refined aesthetics
|
* @description Modern, elegant notification theme with refined aesthetics
|
||||||
* @author yoeunes
|
* @author Younes ENNAJI
|
||||||
*/
|
*/
|
||||||
import './amber.scss'
|
import './amber.scss'
|
||||||
import type { Envelope } from '../../types'
|
import type { Envelope } from '../../types'
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* @file PHPFlasher Amber Theme Registration
|
* @file PHPFlasher Amber Theme Registration
|
||||||
* @description Registers the Amber theme with PHPFlasher
|
* @description Registers the Amber theme with PHPFlasher
|
||||||
* @author yoeunes
|
* @author Younes ENNAJI
|
||||||
*/
|
*/
|
||||||
import flasher from '../../index'
|
import flasher from '../../index'
|
||||||
import { amberTheme } from './amber'
|
import { amberTheme } from './amber'
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* @file PHPFlasher Aurora Theme Styles
|
* @file PHPFlasher Aurora Theme Styles
|
||||||
* @description CSS styling for the elegant glass-morphism Aurora theme
|
* @description CSS styling for the elegant glass-morphism Aurora theme
|
||||||
* @author yoeunes
|
* @author Younes ENNAJI
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* @file PHPFlasher Aurora Theme Implementation
|
* @file PHPFlasher Aurora Theme Implementation
|
||||||
* @description Calm, soothing notification style with glass morphism effects
|
* @description Calm, soothing notification style with glass morphism effects
|
||||||
* @author yoeunes
|
* @author Younes ENNAJI
|
||||||
*/
|
*/
|
||||||
import './aurora.scss'
|
import './aurora.scss'
|
||||||
import type { Envelope } from '../../types'
|
import type { Envelope } from '../../types'
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* @file PHPFlasher Aurora Theme Registration
|
* @file PHPFlasher Aurora Theme Registration
|
||||||
* @description Registers the Aurora theme with PHPFlasher
|
* @description Registers the Aurora theme with PHPFlasher
|
||||||
* @author yoeunes
|
* @author Younes ENNAJI
|
||||||
*/
|
*/
|
||||||
import flasher from '../../index'
|
import flasher from '../../index'
|
||||||
import { auroraTheme } from './aurora'
|
import { auroraTheme } from './aurora'
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* @file PHPFlasher Container Styles
|
* @file PHPFlasher Container Styles
|
||||||
* @description Base styling for individual notification elements
|
* @description Base styling for individual notification elements
|
||||||
* @author yoeunes
|
* @author Younes ENNAJI
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* @file PHPFlasher Crystal Theme Styles
|
* @file PHPFlasher Crystal Theme Styles
|
||||||
* @description CSS styling for the elegant Crystal theme
|
* @description CSS styling for the elegant Crystal theme
|
||||||
* @author yoeunes
|
* @author Younes ENNAJI
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* @file PHPFlasher Crystal Theme Implementation
|
* @file PHPFlasher Crystal Theme Implementation
|
||||||
* @description Clean, elegant notification theme with subtle animations
|
* @description Clean, elegant notification theme with subtle animations
|
||||||
* @author yoeunes
|
* @author Younes ENNAJI
|
||||||
*/
|
*/
|
||||||
import './crystal.scss'
|
import './crystal.scss'
|
||||||
import type { Envelope } from '../../types'
|
import type { Envelope } from '../../types'
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* @file PHPFlasher Crystal Theme Registration
|
* @file PHPFlasher Crystal Theme Registration
|
||||||
* @description Registers the Crystal theme with PHPFlasher
|
* @description Registers the Crystal theme with PHPFlasher
|
||||||
* @author yoeunes
|
* @author Younes ENNAJI
|
||||||
*/
|
*/
|
||||||
import flasher from '../../index'
|
import flasher from '../../index'
|
||||||
import { crystalTheme } from './crystal'
|
import { crystalTheme } from './crystal'
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* @file PHPFlasher Emerald Theme Styles
|
* @file PHPFlasher Emerald Theme Styles
|
||||||
* @description CSS styling for the elegant glass-like Emerald theme
|
* @description CSS styling for the elegant glass-like Emerald theme
|
||||||
* @author yoeunes
|
* @author Younes ENNAJI
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* @file PHPFlasher Emerald Theme Implementation
|
* @file PHPFlasher Emerald Theme Implementation
|
||||||
* @description Elegant glass-like notification theme with bounce animation
|
* @description Elegant glass-like notification theme with bounce animation
|
||||||
* @author yoeunes
|
* @author Younes ENNAJI
|
||||||
*/
|
*/
|
||||||
import './emerald.scss'
|
import './emerald.scss'
|
||||||
import type { Envelope } from '../../types'
|
import type { Envelope } from '../../types'
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* @file PHPFlasher Emerald Theme Registration
|
* @file PHPFlasher Emerald Theme Registration
|
||||||
* @description Registers the Emerald theme with PHPFlasher
|
* @description Registers the Emerald theme with PHPFlasher
|
||||||
* @author yoeunes
|
* @author Younes ENNAJI
|
||||||
*/
|
*/
|
||||||
import flasher from '../../index'
|
import flasher from '../../index'
|
||||||
import { emeraldTheme } from './emerald'
|
import { emeraldTheme } from './emerald'
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* @file PHPFlasher Facebook Theme Styles
|
* @file PHPFlasher Facebook Theme Styles
|
||||||
* @description CSS styling for Facebook-inspired notifications
|
* @description CSS styling for Facebook-inspired notifications
|
||||||
* @author yoeunes
|
* @author Younes ENNAJI
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* @file PHPFlasher Facebook Theme Implementation
|
* @file PHPFlasher Facebook Theme Implementation
|
||||||
* @description Social media style notifications inspired by Facebook's interface
|
* @description Social media style notifications inspired by Facebook's interface
|
||||||
* @author yoeunes
|
* @author Younes ENNAJI
|
||||||
*/
|
*/
|
||||||
import './facebook.scss'
|
import './facebook.scss'
|
||||||
import type { Envelope } from '../../types'
|
import type { Envelope } from '../../types'
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* @file PHPFlasher Facebook Theme Registration
|
* @file PHPFlasher Facebook Theme Registration
|
||||||
* @description Registers the Facebook theme with PHPFlasher
|
* @description Registers the Facebook theme with PHPFlasher
|
||||||
* @author yoeunes
|
* @author Younes ENNAJI
|
||||||
*/
|
*/
|
||||||
import flasher from '../../index'
|
import flasher from '../../index'
|
||||||
import { facebookTheme } from './facebook'
|
import { facebookTheme } from './facebook'
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* @file PHPFlasher Default Theme
|
* @file PHPFlasher Default Theme
|
||||||
* @description Classic bordered notification style with colorful accents
|
* @description Classic bordered notification style with colorful accents
|
||||||
* @author yoeunes
|
* @author Younes ENNAJI
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@use "sass:color";
|
@use "sass:color";
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* @file PHPFlasher Default Theme
|
* @file PHPFlasher Default Theme
|
||||||
* @description Theme implementation for the default PHPFlasher notification style
|
* @description Theme implementation for the default PHPFlasher notification style
|
||||||
* @author yoeunes
|
* @author Younes ENNAJI
|
||||||
*/
|
*/
|
||||||
import './flasher.scss'
|
import './flasher.scss'
|
||||||
import type { Envelope } from '../../types'
|
import type { Envelope } from '../../types'
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* @file PHPFlasher Default Theme Registration
|
* @file PHPFlasher Default Theme Registration
|
||||||
* @description Registers the default theme with PHPFlasher
|
* @description Registers the default theme with PHPFlasher
|
||||||
* @author yoeunes
|
* @author Younes ENNAJI
|
||||||
*/
|
*/
|
||||||
import flasher from '../../index'
|
import flasher from '../../index'
|
||||||
import { flasherTheme } from './flasher'
|
import { flasherTheme } from './flasher'
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* @file PHPFlasher Google Theme Styles
|
* @file PHPFlasher Google Theme Styles
|
||||||
* @description CSS styling for Material Design-inspired notifications
|
* @description CSS styling for Material Design-inspired notifications
|
||||||
* @author yoeunes
|
* @author Younes ENNAJI
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* @file PHPFlasher Google Theme Implementation
|
* @file PHPFlasher Google Theme Implementation
|
||||||
* @description Material Design-inspired notification theme
|
* @description Material Design-inspired notification theme
|
||||||
* @author yoeunes
|
* @author Younes ENNAJI
|
||||||
*/
|
*/
|
||||||
import './google.scss'
|
import './google.scss'
|
||||||
import type { Envelope } from '../../types'
|
import type { Envelope } from '../../types'
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* @file PHPFlasher Google Theme Registration
|
* @file PHPFlasher Google Theme Registration
|
||||||
* @description Registers the Google theme with PHPFlasher
|
* @description Registers the Google theme with PHPFlasher
|
||||||
* @author yoeunes
|
* @author Younes ENNAJI
|
||||||
*/
|
*/
|
||||||
import flasher from '../../index'
|
import flasher from '../../index'
|
||||||
import { googleTheme } from './google'
|
import { googleTheme } from './google'
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* @file PHPFlasher Icon Styles
|
* @file PHPFlasher Icon Styles
|
||||||
* @description Icon styling for different notification types
|
* @description Icon styling for different notification types
|
||||||
* @author yoeunes
|
* @author Younes ENNAJI
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* @file PHPFlasher Core Theme Styles
|
* @file PHPFlasher Core Theme Styles
|
||||||
* @description Root styling and CSS variables for the PHPFlasher notification system
|
* @description Root styling and CSS variables for the PHPFlasher notification system
|
||||||
* @author yoeunes
|
* @author Younes ENNAJI
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@use "sass:color";
|
@use "sass:color";
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* @file PHPFlasher Theme Exports
|
* @file PHPFlasher Theme Exports
|
||||||
* @description Exports all available notification themes
|
* @description Exports all available notification themes
|
||||||
* @author yoeunes
|
* @author Younes ENNAJI
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* @file PHPFlasher iOS Theme Registration
|
* @file PHPFlasher iOS Theme Registration
|
||||||
* @description Registers the iOS theme with PHPFlasher
|
* @description Registers the iOS theme with PHPFlasher
|
||||||
* @author yoeunes
|
* @author Younes ENNAJI
|
||||||
*/
|
*/
|
||||||
import flasher from '../../index'
|
import flasher from '../../index'
|
||||||
import { iosTheme } from './ios'
|
import { iosTheme } from './ios'
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* @file PHPFlasher iOS Theme Styles
|
* @file PHPFlasher iOS Theme Styles
|
||||||
* @description CSS styling for Apple iOS-inspired notifications
|
* @description CSS styling for Apple iOS-inspired notifications
|
||||||
* @author yoeunes
|
* @author Younes ENNAJI
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* @file PHPFlasher iOS Theme Implementation
|
* @file PHPFlasher iOS Theme Implementation
|
||||||
* @description Apple iOS-style notification interface
|
* @description Apple iOS-style notification interface
|
||||||
* @author yoeunes
|
* @author Younes ENNAJI
|
||||||
*/
|
*/
|
||||||
import './ios.scss'
|
import './ios.scss'
|
||||||
import type { Envelope } from '../../types'
|
import type { Envelope } from '../../types'
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* @file PHPFlasher Jade Theme Registration
|
* @file PHPFlasher Jade Theme Registration
|
||||||
* @description Registers the Jade theme with PHPFlasher
|
* @description Registers the Jade theme with PHPFlasher
|
||||||
* @author yoeunes
|
* @author Younes ENNAJI
|
||||||
*/
|
*/
|
||||||
import flasher from '../../index'
|
import flasher from '../../index'
|
||||||
import { jadeTheme } from './jade'
|
import { jadeTheme } from './jade'
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* @file PHPFlasher Jade Theme Styles
|
* @file PHPFlasher Jade Theme Styles
|
||||||
* @description CSS styling for minimalist Jade theme
|
* @description CSS styling for minimalist Jade theme
|
||||||
* @author yoeunes
|
* @author Younes ENNAJI
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* @file PHPFlasher Jade Theme Implementation
|
* @file PHPFlasher Jade Theme Implementation
|
||||||
* @description Minimalist notification theme with soft, natural aesthetics
|
* @description Minimalist notification theme with soft, natural aesthetics
|
||||||
* @author yoeunes
|
* @author Younes ENNAJI
|
||||||
*/
|
*/
|
||||||
import './jade.scss'
|
import './jade.scss'
|
||||||
import type { Envelope } from '../../types'
|
import type { Envelope } from '../../types'
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user