feat: Expand EmojiIconPicker with additional curated emoji groups and enhance functionality for custom groups
This commit is contained in:
parent
5aae999a65
commit
2101080719
|
|
@ -2,37 +2,197 @@ import { useState, useId } from 'react'
|
||||||
import { ChevronDown, ChevronUp } from 'lucide-react'
|
import { ChevronDown, ChevronUp } from 'lucide-react'
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Kuratierte Emoji-Gruppen für Sport, Körper, Ernährung usw.
|
* Kuratierte Emoji-Gruppen (viele Einzel-Glyphen für breite OS-Unterstützung).
|
||||||
* Kann bei Bedarf erweitert werden (z. B. prop `extraGroups`).
|
* Erste Sport-Gruppe: typische Vereins-/Breitensportarten in Deutschland (DOSB/Nischensport mit abgedeckt).
|
||||||
|
* Erweiterbar: prop `extraGroups` an EmojiIconPicker, oder diese Konstante editieren.
|
||||||
*/
|
*/
|
||||||
export const EMOJI_ICON_GROUPS = [
|
export const EMOJI_ICON_GROUPS = [
|
||||||
{
|
{
|
||||||
label: 'Training & Sport',
|
label: 'Sportarten (typisch Deutschland)',
|
||||||
emojis: [
|
emojis: [
|
||||||
'🏃', '🚴', '🏊', '🧘', '🏋️', '⛷️', '🤸', '🥊', '🎾', '⚽', '🏀', '🤺',
|
// Vereins- & Breitensport (Reihenfolge: Fußball, Handball, Kampfsport Gi = Karate/Judo/…, …)
|
||||||
'🚶', '🧗', '⛰️', '🏄', '🤿', '🥋', '🤼', '⛹️', '🤾', '🏌️', '🎿', '🧗♂️'
|
'⚽',
|
||||||
|
'🤾',
|
||||||
|
'🤾♂️',
|
||||||
|
'🤾♀️',
|
||||||
|
'🥋',
|
||||||
|
'🏐',
|
||||||
|
'🏀',
|
||||||
|
'🎾',
|
||||||
|
'🏓',
|
||||||
|
'🏸',
|
||||||
|
'🏒',
|
||||||
|
'🏑',
|
||||||
|
'🥍',
|
||||||
|
'🏈',
|
||||||
|
'🏉',
|
||||||
|
'⚾',
|
||||||
|
'🥎',
|
||||||
|
'⛹️',
|
||||||
|
'⛹️♂️',
|
||||||
|
'⛹️♀️',
|
||||||
|
'🥅',
|
||||||
|
'⛷️',
|
||||||
|
'🎿',
|
||||||
|
'🏂',
|
||||||
|
'🛷',
|
||||||
|
'⛸️',
|
||||||
|
'🥌',
|
||||||
|
'🚴',
|
||||||
|
'🚴♂️',
|
||||||
|
'🚴♀️',
|
||||||
|
'🚵',
|
||||||
|
'🚵♂️',
|
||||||
|
'🚵♀️',
|
||||||
|
'🏃',
|
||||||
|
'🏃♂️',
|
||||||
|
'🏃♀️',
|
||||||
|
'🏃➡️',
|
||||||
|
'🚶',
|
||||||
|
'🥾',
|
||||||
|
'🏊',
|
||||||
|
'🏊♂️',
|
||||||
|
'🏊♀️',
|
||||||
|
'🤽',
|
||||||
|
'🤽♂️',
|
||||||
|
'🤽♀️',
|
||||||
|
'🤿',
|
||||||
|
'🏄',
|
||||||
|
'🏄♂️',
|
||||||
|
'🏄♀️',
|
||||||
|
'🚣',
|
||||||
|
'🚣♂️',
|
||||||
|
'🚣♀️',
|
||||||
|
'⛵',
|
||||||
|
'🧗',
|
||||||
|
'🧗♂️',
|
||||||
|
'🧗♀️',
|
||||||
|
'🏋️',
|
||||||
|
'🏋️♂️',
|
||||||
|
'🏋️♀️',
|
||||||
|
'🤸',
|
||||||
|
'🤸♂️',
|
||||||
|
'🤸♀️',
|
||||||
|
'🥊',
|
||||||
|
'🤼',
|
||||||
|
'🤺',
|
||||||
|
'🏇',
|
||||||
|
'⛳',
|
||||||
|
'🏌️',
|
||||||
|
'🏌️♂️',
|
||||||
|
'🏌️♀️',
|
||||||
|
'💃',
|
||||||
|
'🕺',
|
||||||
|
'🧘',
|
||||||
|
'🧘♂️',
|
||||||
|
'🧘♀️',
|
||||||
|
'🛼',
|
||||||
|
'🛹',
|
||||||
|
'🎯',
|
||||||
|
'🎳',
|
||||||
|
'🏟️',
|
||||||
|
'🏆',
|
||||||
|
'🥇',
|
||||||
|
'🥈',
|
||||||
|
'🥉'
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: 'Körper & Gesundheit',
|
label: 'Weitere Sportarten & Hobbysport',
|
||||||
emojis: [
|
emojis: [
|
||||||
'💪', '❤️', '🫀', '🦵', '🧠', '👁️', '⚖️', '📏', '🩺', '💊', '🌡️', '🫁'
|
'🎱',
|
||||||
|
'🎣',
|
||||||
|
'🤹',
|
||||||
|
'🪁',
|
||||||
|
'🥏',
|
||||||
|
'🛶',
|
||||||
|
'🏹',
|
||||||
|
'🌊',
|
||||||
|
'🏖️',
|
||||||
|
'🛣️',
|
||||||
|
'🧭',
|
||||||
|
'🏕️',
|
||||||
|
'⛺'
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: 'Ernährung',
|
label: 'Yoga, Geist, Balance',
|
||||||
emojis: [
|
emojis: [
|
||||||
'🍎', '🥩', '🥗', '🍽️', '💧', '☕', '🥤', '🥛', '🍌', '🥑', '🍞', '🐟'
|
'🧘', '🧘♂️', '🧘♀️', '🪷', '☯️', '🕉️', '🙏', '🧎', '🧍', '💭', '📿', '🎼',
|
||||||
|
'🎹', '🥁', '🎸', '🎺', '🔔', '✨', '🌟', '💫', '🔮'
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: 'Outdoor & Natur',
|
||||||
|
emojis: [
|
||||||
|
'⛰️', '🏔️', '🗻', '🌋', '🏕️', '⛺', '🧭', '🗺️', '🌲', '🌳', '🌴', '🍃',
|
||||||
|
'🍂', '🌿', '☘️', '🪨', '🏞️', '🏜️', '🏖️', '🌅', '🌄', '🌈', '⛅', '🌤️',
|
||||||
|
'☀️', '🌙', '⭐', '🌠', '❄️', '☃️', '⛄'
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: 'Körper & Medizin',
|
||||||
|
emojis: [
|
||||||
|
'💪', '🦾', '🦵', '🦶', '🖐️', '✋', '👣', '❤️', '🩷', '💙', '💚', '🫀',
|
||||||
|
'🫁', '🧠', '👁️', '👂', '🦷', '🦴', '🧬', '⚕️', '🩺', '🩹', '🩼', '💊',
|
||||||
|
'🌡️', '🔬', '🧪', '🧫', '♿', '⚖️', '📏', '📐'
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: 'Ernährung & Getränke',
|
||||||
|
emojis: [
|
||||||
|
'🍎', '🍐', '🍊', '🍋', '🍌', '🍉', '🍇', '🍓', '🫐', '🍒', '🍑', '🥭',
|
||||||
|
'🍍', '🥝', '🍅', '🥑', '🥦', '🥬', '🥒', '🌶️', '🫑', '🌽', '🥕', '🫒',
|
||||||
|
'🧄', '🧅', '🥔', '🍠', '🥐', '🍞', '🥖', '🥨', '🧀', '🥚', '🍳', '🧈',
|
||||||
|
'🥞', '🧇', '🥓', '🥩', '🍗', '🍖', '🌭', '🍔', '🍟', '🍕', '🫓', '🥙',
|
||||||
|
'🌮', '🌯', '🥗', '🍝', '🍜', '🍲', '🍛', '🍣', '🍱', '🥟', '🦪', '🍤',
|
||||||
|
'🍙', '🍚', '🍘', '🍥', '🥠', '🥮', '🍢', '🍡', '🍧', '🍨', '🍦', '🥧',
|
||||||
|
'🧁', '🍰', '🎂', '🍮', '🍭', '🍬', '🍫', '🍿', '🍩', '🍪', '🌰', '🥜',
|
||||||
|
'🍯', '🥛', '🍼', '🫖', '☕', '🍵', '🧃', '🥤', '🧋', '🍶', '🍺', '🍻',
|
||||||
|
'🥂', '🍷', '🥃', '🍸', '🍹', '🧉', '🍾', '💧', '🧊'
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: 'Schlaf & Erholung',
|
label: 'Schlaf & Erholung',
|
||||||
emojis: ['😴', '🌙', '🛌', '💤', '🧖', '☀️', '🌿']
|
emojis: [
|
||||||
|
'😴', '🛌', '🛏️', '💤', '🌙', '🌛', '🌜', '💆', '💆♂️', '💆♀️', '🧖', '🧖♂️',
|
||||||
|
'🧖♀️', '🧴', '🛁', '🚿', '🪥', '🩴', '🧘', '🕯️'
|
||||||
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: 'Allgemein',
|
label: 'Stimmung & Motivation Smileys',
|
||||||
emojis: [
|
emojis: [
|
||||||
'🎯', '📊', '🔥', '⭐', '✨', '🎵', '📌', '🧭', '📝', '✅', '💡', '🪄'
|
'😊', '🙂', '😌', '😎', '🤩', '🥳', '😤', '💯', '🙌', '👏', '🤝', '👍',
|
||||||
|
'👎', '✊', '🤛', '🤜', '💪', '🦵', '🧗', '🔥', '💥', '⚡', '🎉', '🏆',
|
||||||
|
'🥇', '🥈', '🥉', '🎖️', '🏅', '😅', '🤔', '🧐', '😇'
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: 'Tiere (Maskottchen)',
|
||||||
|
emojis: [
|
||||||
|
'🐶', '🐱', '🐭', '🐹', '🐰', '🦊', '🐻', '🐼', '🐨', '🐯', '🦁', '🐮',
|
||||||
|
'🐷', '🐸', '🐵', '🐔', '🐧', '🐦', '🐤', '🦆', '🦅', '🦉', '🦇', '🐺',
|
||||||
|
'🐗', '🐴', '🦄', '🐝', '🐛', '🦋', '🐌', '🐞', '🐜', '🦗', '🕷️', '🦂',
|
||||||
|
'🐢', '🐍', '🦎', '🦖', '🦕', '🐙', '🦑', '🦐', '🦞', '🐠', '🐟', '🐬',
|
||||||
|
'🐳', '🐋', '🦈', '🐊'
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: 'Symbole & Pointers',
|
||||||
|
emojis: [
|
||||||
|
'🎯', '📊', '📈', '📉', '🧮', '📋', '📌', '📍', '🔖', '🏷️', '✏️', '✒️',
|
||||||
|
'🖊️', '📎', '🔗', '⛓️', '🔒', '🔓', '🔑', '🗝️', '🔨', '🛠️', '⚙️', '🧰',
|
||||||
|
'💡', '🔦', '🏮', '🪔', '📣', '📢', '🔔', '🔕', '⏱️', '⏰', '🕐', '📅',
|
||||||
|
'🗓️', '✅', '☑️', '✔️', '❌', '⭕', '❗', '❓', '💬', '🗨️', '📝', '📖',
|
||||||
|
'🪄', '🎪', '🎭', '🎬', '🎨', '🖼️', '🧩', '♟️', '🎲', '🧸'
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: 'Fahrzeuge & Weg',
|
||||||
|
emojis: [
|
||||||
|
'🚗', '🚕', '🚙', '🚌', '🚎', '🏎️', '🚓', '🚑', '🚒', '🚐', '🛻', '🚚',
|
||||||
|
'🚛', '🚜', '🛵', '🏍️', '🛺', '🚲', '🛴', '🛹', '🚁', '✈️', '🛫', '🛬',
|
||||||
|
'🪂', '🚀', '🛶', '⛵', '🚤', '🛥️', '🛳️', '⛴️', '🚢', '⚓', '🗼', '🏟️'
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
@ -48,6 +208,7 @@ export const EMOJI_ICON_GROUPS = [
|
||||||
* @param {boolean} [disabled]
|
* @param {boolean} [disabled]
|
||||||
* @param {string} [id] – optionale ID für das Textfeld (Label for=)
|
* @param {string} [id] – optionale ID für das Textfeld (Label for=)
|
||||||
* @param {boolean} [defaultExpanded=false] – Vorschlags-Bereich initial offen
|
* @param {boolean} [defaultExpanded=false] – Vorschlags-Bereich initial offen
|
||||||
|
* @param {{ label: string, emojis: string[] }[]} [extraGroups=[]] – eigene Gruppe(n) anhängen (z. B. Projekt-Favoriten)
|
||||||
*/
|
*/
|
||||||
export default function EmojiIconPicker({
|
export default function EmojiIconPicker({
|
||||||
value,
|
value,
|
||||||
|
|
@ -56,11 +217,14 @@ export default function EmojiIconPicker({
|
||||||
maxLength = 10,
|
maxLength = 10,
|
||||||
disabled = false,
|
disabled = false,
|
||||||
id: idProp,
|
id: idProp,
|
||||||
defaultExpanded = false
|
defaultExpanded = false,
|
||||||
|
extraGroups = []
|
||||||
}) {
|
}) {
|
||||||
const uid = useId()
|
const uid = useId()
|
||||||
const inputId = idProp || `emoji-icon-${uid}`
|
const inputId = idProp || `emoji-icon-${uid}`
|
||||||
const [open, setOpen] = useState(defaultExpanded)
|
const [open, setOpen] = useState(defaultExpanded)
|
||||||
|
const groups =
|
||||||
|
extraGroups.length > 0 ? [...EMOJI_ICON_GROUPS, ...extraGroups] : EMOJI_ICON_GROUPS
|
||||||
|
|
||||||
const handleInput = (e) => {
|
const handleInput = (e) => {
|
||||||
onChange(e.target.value.slice(0, maxLength))
|
onChange(e.target.value.slice(0, maxLength))
|
||||||
|
|
@ -144,12 +308,12 @@ export default function EmojiIconPicker({
|
||||||
background: 'var(--surface2)',
|
background: 'var(--surface2)',
|
||||||
borderRadius: 12,
|
borderRadius: 12,
|
||||||
border: '1px solid var(--border)',
|
border: '1px solid var(--border)',
|
||||||
maxHeight: 280,
|
maxHeight: 'min(72vh, 420px)',
|
||||||
overflowY: 'auto'
|
overflowY: 'auto'
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
{EMOJI_ICON_GROUPS.map((group) => (
|
{groups.map((group, gi) => (
|
||||||
<div key={group.label} style={{ marginBottom: 14 }}>
|
<div key={`${group.label}-${gi}`} style={{ marginBottom: 14 }}>
|
||||||
<div
|
<div
|
||||||
style={{
|
style={{
|
||||||
fontSize: 11,
|
fontSize: 11,
|
||||||
|
|
@ -169,9 +333,9 @@ export default function EmojiIconPicker({
|
||||||
gap: 6
|
gap: 6
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
{group.emojis.map((em) => (
|
{group.emojis.map((em, ei) => (
|
||||||
<button
|
<button
|
||||||
key={`${group.label}-${em}`}
|
key={`${group.label}-${gi}-${ei}-${em}`}
|
||||||
type="button"
|
type="button"
|
||||||
onClick={() => pick(em)}
|
onClick={() => pick(em)}
|
||||||
disabled={disabled}
|
disabled={disabled}
|
||||||
|
|
@ -197,7 +361,9 @@ export default function EmojiIconPicker({
|
||||||
))}
|
))}
|
||||||
<p style={{ fontSize: 11, color: 'var(--text3)', margin: 0, lineHeight: 1.5 }}>
|
<p style={{ fontSize: 11, color: 'var(--text3)', margin: 0, lineHeight: 1.5 }}>
|
||||||
Du kannst auch direkt in das Feld tippen oder das Betriebssystem-Emoji-Menü nutzen
|
Du kannst auch direkt in das Feld tippen oder das Betriebssystem-Emoji-Menü nutzen
|
||||||
(z. B. Win + . unter Windows).
|
(z. B. Win + . unter Windows).{' '}
|
||||||
|
<strong>Inline Skating:</strong> Es gibt kein separates Inliner-Emoji; 🛼 (Rollschuh) wird dafür oft genutzt.{' '}
|
||||||
|
<strong>Karate / Kampfsport mit Gi:</strong> 🥋 (gemeinsames Unicode-Symbol für u. a. Karate, Judo, Ju-Jitsu).
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user