improve rollup configuration

This commit is contained in:
Younes ENNAJI
2025-03-08 17:03:12 +00:00
parent 8fa6054ada
commit b047c9016a
243 changed files with 4176 additions and 2453 deletions
+4 -1
View File
@@ -1,4 +1,7 @@
{ {
"upgrade": true, "upgrade": true,
"target": "semver" "target": "semver",
"format": "group",
"color": true,
"root": true
} }
Executable
+675
View File
@@ -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
File diff suppressed because one or more lines are too long
+38 -38
View File
@@ -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"
} }
File diff suppressed because one or more lines are too long
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">&times;</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">&times;</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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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) {
+2254 -1862
View File
File diff suppressed because it is too large Load Diff
+8 -6
View File
@@ -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
View File
@@ -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(),
]
+140
View File
@@ -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
View File
@@ -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,
},
]
}
+246
View File
@@ -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
},
},
]
}
+163
View File
@@ -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 -1
View File
@@ -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 -1
View File
@@ -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'
+5
View File
@@ -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';
+5
View File
@@ -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 -1
View File
@@ -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'
+1 -1
View File
@@ -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 -1
View File
@@ -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'
+5
View File
@@ -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 {
+5
View File
@@ -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) :
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -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 -1
View File
@@ -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 -1
View File
@@ -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
View File
@@ -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 -1
View File
@@ -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 -1
View File
@@ -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 -1
View File
@@ -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 -1
View File
@@ -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 -1
View File
@@ -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 -1
View File
@@ -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