'house', 'building-2' => 'building', 'trash-2' => 'trash', 'circle-help' => 'circle-question-mark', 'help-circle' => 'circle-question-mark', 'alert-triangle' => 'triangle-alert', 'check-circle' => 'circle-check', 'x-circle' => 'circle-x', 'file' => 'file', 'book' => 'book-open', 'message' => 'message-square', 'bag' => 'shopping-bag', 'check' => 'square-check-big', 'external' => 'external-link', 'grid' => 'layout-grid', 'wp' => 'layout-dashboard', 'circle' => 'circle', 'menu' => 'menu', 'x' => 'x', 'moon' => 'moon', 'sun' => 'sun', 'link' => 'link', ); /** Icons offered before a search in the picker: the ones member dashboards actually use. */ public const SUGGESTED = array( 'house', 'layout-dashboard', 'book-open', 'graduation-cap', 'life-buoy', 'message-square', 'mail', 'bell', 'shopping-bag', 'shopping-cart', 'credit-card', 'receipt', 'file-text', 'files', 'folder', 'download', 'video', 'play', 'calendar', 'clock', 'square-check-big', 'list-todo', 'clipboard-list', 'users', 'user', 'building', 'briefcase', 'settings', 'sliders-horizontal', 'star', 'heart', 'trophy', 'award', 'gift', 'tag', 'ticket', 'link', 'globe', 'map-pin', 'phone', 'wrench', 'hammer', 'chart-column', 'chart-line', 'pie-chart', 'database', 'shield-check', 'lock', 'key-round', 'bookmark', 'flag', 'sparkles', 'rocket', 'smile', 'handshake', 'megaphone', 'newspaper', 'image', 'camera', 'mic', 'headphones', 'lightbulb', 'compass', ); /** @return array */ private static function map(): array { static $map = null; if ( null === $map ) { $map = include DASHBREAD_PATH . 'assets/icons/lucide.php'; $map = (array) apply_filters( 'dashbread_icons', is_array( $map ) ? $map : array() ); } return $map; } public static function resolve( string $name ): string { $name = sanitize_key( $name ); $name = self::ALIASES[ $name ] ?? $name; return isset( self::map()[ $name ] ) ? $name : 'circle'; } /** @return string[] */ public static function names(): array { return array_keys( self::map() ); } public static function svg( string $name, string $class = 'sui-i' ): string { return ''; } /** Inner SVG markup (paths only) for any icon in the set, for scripts that draw their own . */ public static function inner( string $name ): string { return self::map()[ self::resolve( $name ) ] ?? ''; } /** Inner markup for each name, keyed by the name asked for and by the name it resolves to. @param string[] $names @return array */ public static function inner_map( array $names ): array { $out = array(); foreach ( array_unique( $names ) as $n ) { $n = (string) $n; $out[ $n ] = self::inner( $n ); $out[ self::resolve( $n ) ] = $out[ $n ]; } return $out; } /** The admin icon picker: hidden input, selected preview, search, suggested grid. Powered by icon-picker.js. */ public static function picker( string $field_name, string $value ): string { $value = '' === $value ? '' : self::resolve( $value ); return '
' . '' . '
' . ( '' !== $value ? self::svg( $value ) : '' ) . '' . esc_html( '' !== $value ? $value : __( 'No icon', 'dashbread' ) ) . '' . esc_html__( 'Selected icon', 'dashbread' ) . '
' . '' . '

' . esc_html( sprintf( /* translators: %s: number of icons */ __( 'Showing suggested icons. Search to browse all %s Lucide icons.', 'dashbread' ), number_format_i18n( count( self::map() ) ) ) ) . '

' . '
' . '
'; } public static function enqueue_picker(): void { wp_enqueue_style( 'dashbread-icon-picker', DASHBREAD_URL . 'assets/css/icon-picker.css', array(), DASHBREAD_VERSION ); wp_enqueue_script( 'dashbread-icon-picker', DASHBREAD_URL . 'assets/js/icon-picker.js', array(), DASHBREAD_VERSION, true ); \Dashbread\Core\I18n::script( 'dashbread-icon-picker' ); wp_localize_script( 'dashbread-icon-picker', 'dashbreadIcons', array( 'json' => DASHBREAD_URL . 'assets/icons/lucide.json', 'suggested' => self::SUGGESTED, 'i18n' => array( 'none' => __( 'No icon', 'dashbread' ), 'noResults' => __( 'No icons match.', 'dashbread' ), 'showing' => /* translators: 1: shown count, 2: total matches */ __( 'Showing %1$d of %2$d matches.', 'dashbread' ), 'suggested' => /* translators: %s: number of icons */ __( 'Showing suggested icons. Search to browse all %s Lucide icons.', 'dashbread' ) ) ) ); } }