python-lucide 0.4.0__tar.gz → 0.5.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (24) hide show
  1. {python_lucide-0.4.0 → python_lucide-0.5.1}/PKG-INFO +57 -1
  2. {python_lucide-0.4.0 → python_lucide-0.5.1}/README.md +55 -0
  3. {python_lucide-0.4.0 → python_lucide-0.5.1}/pyproject.toml +8 -3
  4. {python_lucide-0.4.0 → python_lucide-0.5.1}/src/lucide/cli.py +134 -29
  5. {python_lucide-0.4.0 → python_lucide-0.5.1}/src/lucide/config.py +11 -12
  6. {python_lucide-0.4.0 → python_lucide-0.5.1}/src/lucide/data/gemini-icon-descriptions.jsonl +35 -0
  7. {python_lucide-0.4.0 → python_lucide-0.5.1}/src/lucide/data/lucide-icon-clusters.json +4829 -4674
  8. python_lucide-0.5.1/src/lucide/data/lucide-icons.db +0 -0
  9. {python_lucide-0.4.0 → python_lucide-0.5.1}/src/lucide/search.py +1 -1
  10. {python_lucide-0.4.0 → python_lucide-0.5.1}/tests/cli_test.py +105 -0
  11. python_lucide-0.4.0/src/lucide/data/lucide-icons.db +0 -0
  12. {python_lucide-0.4.0 → python_lucide-0.5.1}/src/lucide/__init__.py +0 -0
  13. {python_lucide-0.4.0 → python_lucide-0.5.1}/src/lucide/build_clusters.py +0 -0
  14. {python_lucide-0.4.0 → python_lucide-0.5.1}/src/lucide/build_search.py +0 -0
  15. {python_lucide-0.4.0 → python_lucide-0.5.1}/src/lucide/core.py +0 -0
  16. {python_lucide-0.4.0 → python_lucide-0.5.1}/src/lucide/data/__init__.py +0 -0
  17. {python_lucide-0.4.0 → python_lucide-0.5.1}/src/lucide/db.py +0 -0
  18. {python_lucide-0.4.0 → python_lucide-0.5.1}/src/lucide/dev_utils.py +0 -0
  19. {python_lucide-0.4.0 → python_lucide-0.5.1}/tests/__init__.py +0 -0
  20. {python_lucide-0.4.0 → python_lucide-0.5.1}/tests/build_clusters_test.py +0 -0
  21. {python_lucide-0.4.0 → python_lucide-0.5.1}/tests/build_search_test.py +0 -0
  22. {python_lucide-0.4.0 → python_lucide-0.5.1}/tests/conftest.py +0 -0
  23. {python_lucide-0.4.0 → python_lucide-0.5.1}/tests/core_test.py +0 -0
  24. {python_lucide-0.4.0 → python_lucide-0.5.1}/tests/search_test.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: python-lucide
3
- Version: 0.4.0
3
+ Version: 0.5.1
4
4
  Summary: A Python package for working with Lucide icons
5
5
  Keywords: lucide,icons,svg,sqlite
6
6
  Author: Mike Macpherson
@@ -15,6 +15,7 @@ Classifier: Programming Language :: Python :: 3.12
15
15
  Classifier: Programming Language :: Python :: 3.13
16
16
  Classifier: Programming Language :: Python :: 3.14
17
17
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
18
+ Requires-Dist: cairosvg>=2.7.0 ; extra == 'search'
18
19
  Requires-Dist: fastembed>=0.4.0 ; extra == 'search'
19
20
  Requires-Python: >=3.10
20
21
  Project-URL: Bug Tracker, https://github.com/mmacpherson/python-lucide/issues
@@ -43,6 +44,7 @@ in your Python projects, with no javascript in sight.
43
44
 
44
45
  ## Features
45
46
  - 🎨 **Access 1600+ Lucide icons** directly from Python
47
+ - 🔍 **Semantic search** - find icons by meaning, in the terminal or [in the browser](https://mmacpherson.github.io/python-lucide/)
46
48
  - 🛠 **Customize icons** with classes, sizes, colors, and other SVG attributes
47
49
  - 🚀 **Framework-friendly** with examples for FastHTML, Flask, Django, and more
48
50
  - 📦 **Lightweight** with minimal dependencies
@@ -83,6 +85,60 @@ lucide_icon("user", fill="currentColor") # Inherit color from CSS
83
85
  lucide_icon("user", stroke="#ff6b6b") # Hex colors work too
84
86
  ```
85
87
 
88
+ ## Semantic Search
89
+
90
+ Find icons by describing what you mean, not what they're called — in English
91
+ or [50+ languages](https://mmacpherson.github.io/python-lucide/):
92
+
93
+ <p align="center">
94
+ <a href="https://mmacpherson.github.io/python-lucide/">
95
+ <img src="https://raw.githubusercontent.com/mmacpherson/python-lucide/main/.github/images/search-english.png" width="49%" alt="Searching &quot;celebrate a big achievement&quot; returns trophy, award, medal, party-popper">
96
+ <img src="https://raw.githubusercontent.com/mmacpherson/python-lucide/main/.github/images/search-multilingual.png" width="49%" alt="Searching in Japanese with the multilingual model returns key, user-key, lock icons">
97
+ </a>
98
+ </p>
99
+
100
+ ```bash
101
+ # One-off, no install (requires uv)
102
+ uvx --from "python-lucide[search]" lucide search "waiting for a download"
103
+
104
+ # Or install the search extra
105
+ pip install "python-lucide[search]"
106
+ lucide search "celebrate a big achievement"
107
+ ```
108
+
109
+ <img src="https://raw.githubusercontent.com/mmacpherson/python-lucide/main/.github/images/search-cli.png" width="360" alt="Terminal output of lucide search: each result icon renders inline next to its name and match score">
110
+
111
+ In terminals supporting the Kitty graphics protocol (kitty, Ghostty,
112
+ WezTerm), the icons render inline as above — inside tmux too, with
113
+ `tmux set -g allow-passthrough on`. Elsewhere you get the plain text
114
+ list. (Rendering uses the cairo system library; if it's missing, the
115
+ CLI prints a hint.)
116
+
117
+ Icons are matched against AI-generated descriptions using the same embedding
118
+ model the [web app](https://mmacpherson.github.io/python-lucide/) uses,
119
+ so descriptive phrases ("an idea just occurred to me") work better than
120
+ keywords. Options:
121
+
122
+ - `--model multilingual` — search in 50+ languages (default `bge-small` ranks
123
+ best for English)
124
+ - `--limit N` — number of results; `--verbose` — include each icon's description
125
+
126
+ The first search downloads the embedding model (~67 MB) and the pre-built
127
+ search index (11 MB); both are cached, and every search after that runs
128
+ locally in well under a second.
129
+
130
+ The same search is available as a Python API:
131
+
132
+ ```python
133
+ from lucide.search import search_icons
134
+
135
+ for r in search_icons("secure login", limit=5):
136
+ print(r.name, r.score)
137
+ ```
138
+
139
+ Prefer not to install anything? The [browser version](https://mmacpherson.github.io/python-lucide/)
140
+ runs the whole pipeline client-side.
141
+
86
142
  ## Framework Integration Examples
87
143
 
88
144
  ### Starlette
@@ -18,6 +18,7 @@ in your Python projects, with no javascript in sight.
18
18
 
19
19
  ## Features
20
20
  - 🎨 **Access 1600+ Lucide icons** directly from Python
21
+ - 🔍 **Semantic search** - find icons by meaning, in the terminal or [in the browser](https://mmacpherson.github.io/python-lucide/)
21
22
  - 🛠 **Customize icons** with classes, sizes, colors, and other SVG attributes
22
23
  - 🚀 **Framework-friendly** with examples for FastHTML, Flask, Django, and more
23
24
  - 📦 **Lightweight** with minimal dependencies
@@ -58,6 +59,60 @@ lucide_icon("user", fill="currentColor") # Inherit color from CSS
58
59
  lucide_icon("user", stroke="#ff6b6b") # Hex colors work too
59
60
  ```
60
61
 
62
+ ## Semantic Search
63
+
64
+ Find icons by describing what you mean, not what they're called — in English
65
+ or [50+ languages](https://mmacpherson.github.io/python-lucide/):
66
+
67
+ <p align="center">
68
+ <a href="https://mmacpherson.github.io/python-lucide/">
69
+ <img src="https://raw.githubusercontent.com/mmacpherson/python-lucide/main/.github/images/search-english.png" width="49%" alt="Searching &quot;celebrate a big achievement&quot; returns trophy, award, medal, party-popper">
70
+ <img src="https://raw.githubusercontent.com/mmacpherson/python-lucide/main/.github/images/search-multilingual.png" width="49%" alt="Searching in Japanese with the multilingual model returns key, user-key, lock icons">
71
+ </a>
72
+ </p>
73
+
74
+ ```bash
75
+ # One-off, no install (requires uv)
76
+ uvx --from "python-lucide[search]" lucide search "waiting for a download"
77
+
78
+ # Or install the search extra
79
+ pip install "python-lucide[search]"
80
+ lucide search "celebrate a big achievement"
81
+ ```
82
+
83
+ <img src="https://raw.githubusercontent.com/mmacpherson/python-lucide/main/.github/images/search-cli.png" width="360" alt="Terminal output of lucide search: each result icon renders inline next to its name and match score">
84
+
85
+ In terminals supporting the Kitty graphics protocol (kitty, Ghostty,
86
+ WezTerm), the icons render inline as above — inside tmux too, with
87
+ `tmux set -g allow-passthrough on`. Elsewhere you get the plain text
88
+ list. (Rendering uses the cairo system library; if it's missing, the
89
+ CLI prints a hint.)
90
+
91
+ Icons are matched against AI-generated descriptions using the same embedding
92
+ model the [web app](https://mmacpherson.github.io/python-lucide/) uses,
93
+ so descriptive phrases ("an idea just occurred to me") work better than
94
+ keywords. Options:
95
+
96
+ - `--model multilingual` — search in 50+ languages (default `bge-small` ranks
97
+ best for English)
98
+ - `--limit N` — number of results; `--verbose` — include each icon's description
99
+
100
+ The first search downloads the embedding model (~67 MB) and the pre-built
101
+ search index (11 MB); both are cached, and every search after that runs
102
+ locally in well under a second.
103
+
104
+ The same search is available as a Python API:
105
+
106
+ ```python
107
+ from lucide.search import search_icons
108
+
109
+ for r in search_icons("secure login", limit=5):
110
+ print(r.name, r.score)
111
+ ```
112
+
113
+ Prefer not to install anything? The [browser version](https://mmacpherson.github.io/python-lucide/)
114
+ runs the whole pipeline client-side.
115
+
61
116
  ## Framework Integration Examples
62
117
 
63
118
  ### Starlette
@@ -9,9 +9,14 @@ dev = [
9
9
  "hdbscan>=0.8.0",
10
10
  "mypy-extensions>=1.0.0",
11
11
  "mypy>=1.0.0",
12
+ # Floor keeps the resolver off ancient numba/llvmlite, which fail to build
13
+ # from source when numpy resolves above modern numba's cap.
14
+ "numba>=0.60",
12
15
  "plotly>=5.0.0",
13
16
  "pre-commit>=3.0.0",
14
- "pydantic-ai-slim[google]>=1.0.0",
17
+ # Cap below 2: pydantic-ai v2 removed Agent(output_retries=...), which
18
+ # build_clusters.py relies on. Lift the cap when migrating to the v2 API.
19
+ "pydantic-ai-slim[google]>=1.0.0,<2",
15
20
  "pytest-cov>=4.0.0",
16
21
  "pytest>=7.0.0",
17
22
  "ruff>=0.1.0",
@@ -41,10 +46,10 @@ license = {text = "MIT"}
41
46
  name = "python-lucide"
42
47
  readme = "README.md"
43
48
  requires-python = ">=3.10"
44
- version = "0.4.0"
49
+ version = "0.5.1"
45
50
 
46
51
  [project.optional-dependencies]
47
- search = ["fastembed>=0.4.0"]
52
+ search = ["cairosvg>=2.7.0", "fastembed>=0.4.0"]
48
53
 
49
54
  [project.scripts]
50
55
  check-lucide-version = "lucide.dev_utils:print_version_status"
@@ -529,6 +529,40 @@ def _cmd_build_search(args: argparse.Namespace) -> int:
529
529
  return 0
530
530
 
531
531
 
532
+ def _first_run_downloads(model: str) -> list[str]:
533
+ """Human-readable one-time downloads the next search will trigger.
534
+
535
+ Best-effort: peeks at fastembed's model cache and the search-DB cache;
536
+ any surprise in their layout just means the notice is skipped.
537
+ """
538
+ from .search import search_available # noqa: PLC0415
539
+
540
+ pending = []
541
+ try:
542
+ from fastembed import TextEmbedding # noqa: PLC0415
543
+ from fastembed.common.utils import define_cache_dir # noqa: PLC0415
544
+
545
+ fastembed_name = EMBEDDING_MODELS[model].fastembed_model
546
+ meta = next(
547
+ m
548
+ for m in TextEmbedding.list_supported_models()
549
+ if m["model"] == fastembed_name
550
+ )
551
+ hf_repo = (meta.get("sources") or {}).get("hf") or ""
552
+ size_mb = round(meta["size_in_GB"] * 1000)
553
+ model_dir = (
554
+ pathlib.Path(define_cache_dir(None))
555
+ / f"models--{hf_repo.replace('/', '--')}"
556
+ )
557
+ if hf_repo and not model_dir.exists():
558
+ pending.append(f"embedding model (~{size_mb} MB)")
559
+ except Exception:
560
+ pass
561
+ if not search_available():
562
+ pending.append("search index (11 MB)")
563
+ return pending
564
+
565
+
532
566
  def _cmd_search(args: argparse.Namespace) -> int:
533
567
  """Handle ``lucide search``."""
534
568
  import os # noqa: PLC0415
@@ -549,6 +583,19 @@ def _cmd_search(args: argparse.Namespace) -> int:
549
583
  if candidate.exists():
550
584
  os.environ["LUCIDE_SEARCH_DB_PATH"] = str(candidate)
551
585
 
586
+ # Downloading without a token is expected here; the hf_xet download
587
+ # backend's HF_TOKEN nudge reads like an error mid-download, so keep
588
+ # warnings from its logger out of the way
589
+ logging.getLogger("hf_xet").setLevel(logging.ERROR)
590
+
591
+ pending = _first_run_downloads(args.model)
592
+ if pending:
593
+ print(
594
+ f"First run: downloading {' and '.join(pending)} — "
595
+ "cached for future searches.",
596
+ file=sys.stderr,
597
+ )
598
+
552
599
  try:
553
600
  results = search_icons(args.query, limit=args.limit, model=args.model)
554
601
  except Exception as e:
@@ -559,7 +606,9 @@ def _cmd_search(args: argparse.Namespace) -> int:
559
606
  print("No results found.")
560
607
  return 0
561
608
 
562
- show_icons = _terminal_supports_graphics()
609
+ show_icons, graphics_tip = _graphics_support()
610
+ if graphics_tip:
611
+ print(graphics_tip, file=sys.stderr)
563
612
  svgs: dict[str, str] = {}
564
613
  if show_icons:
565
614
  svgs = _load_svgs_for_results([r.name for r in results])
@@ -570,36 +619,77 @@ def _cmd_search(args: argparse.Namespace) -> int:
570
619
  cyan = "\033[38;2;100;200;220m"
571
620
 
572
621
  for r in results:
573
- if show_icons and r.name in svgs:
574
- _display_kitty_image(svgs[r.name])
575
- print(f" {bold}{cyan}{r.name}{reset} {dim}{r.score:.3f}{reset}")
622
+ prefix = " "
623
+ if show_icons:
624
+ drawn = r.name in svgs and _display_kitty_image(svgs[r.name])
625
+ # The image sits in columns 1-2 (cursor untouched, C=1), so
626
+ # step over it to keep names aligned whether or not it drew
627
+ prefix = "\033[3C" if drawn else " "
628
+ print(f"{prefix}{bold}{cyan}{r.name}{reset} {dim}{r.score:.0%}{reset}")
576
629
  if args.verbose and r.description:
577
630
  print(f" {dim}{r.description[:100]}{reset}")
578
- if show_icons:
579
- print()
580
631
 
581
632
  return 0
582
633
 
583
634
 
584
- def _terminal_supports_graphics() -> bool:
585
- """Check if the terminal supports the Kitty graphics protocol.
635
+ def _graphics_support() -> tuple[bool, str | None]:
636
+ """Decide whether to render inline icons via the Kitty graphics protocol.
586
637
 
587
- Note: tmux passthrough (allow-passthrough on) theoretically supports
588
- Kitty graphics, but cursor positioning is unreliable. Disabled for
589
- now — see python-lucide-TODO (beads).
638
+ Returns:
639
+ A ``(show_icons, tip)`` pair. *tip* is a one-line stderr hint for
640
+ the cases where the terminal could show icons but something the
641
+ user can fix is in the way (tmux passthrough off, cairosvg not
642
+ installed) — silently dropping the feature proved confusing.
590
643
  """
591
644
  import os # noqa: PLC0415
592
645
 
593
- # tmux blocks reliable graphics rendering
594
- if os.environ.get("TMUX") or "screen" in os.environ.get("TERM", ""):
595
- return False
596
-
597
646
  term = os.environ.get("TERM_PROGRAM", "")
598
- if term in ("ghostty", "kitty", "WezTerm"):
599
- return True
600
- if os.environ.get("GHOSTTY_RESOURCES_DIR"):
601
- return True
602
- return "kitty" in os.environ.get("TERM", "")
647
+ host_capable = (
648
+ term in ("ghostty", "kitty", "WezTerm")
649
+ or bool(os.environ.get("GHOSTTY_RESOURCES_DIR"))
650
+ or bool(os.environ.get("KITTY_WINDOW_ID"))
651
+ or "kitty" in os.environ.get("TERM", "")
652
+ )
653
+ if not host_capable:
654
+ return False, None
655
+
656
+ if os.environ.get("TMUX") and not _tmux_allows_passthrough():
657
+ return False, (
658
+ "Tip: your terminal can show icons inline, but tmux blocks "
659
+ "them — run: tmux set -g allow-passthrough on"
660
+ )
661
+
662
+ try:
663
+ import cairosvg # noqa: F401, PLC0415
664
+ except ImportError:
665
+ return False, (
666
+ "Tip: your terminal can show icons inline — install cairosvg "
667
+ "to enable (pip install cairosvg, or uvx --with cairosvg)."
668
+ )
669
+ except OSError:
670
+ # cairosvg is installed but the native cairo library is absent;
671
+ # cairocffi raises OSError (not ImportError) from its dlopen
672
+ return False, (
673
+ "Tip: inline icons need the cairo system library "
674
+ "(e.g. apt install libcairo2, or brew install cairo)."
675
+ )
676
+
677
+ return True, None
678
+
679
+
680
+ def _tmux_allows_passthrough() -> bool:
681
+ """Check whether the current tmux pane permits escape passthrough."""
682
+ try:
683
+ proc = subprocess.run(
684
+ ["tmux", "show", "-Apv", "allow-passthrough"],
685
+ capture_output=True,
686
+ text=True,
687
+ timeout=2,
688
+ check=False,
689
+ )
690
+ except Exception:
691
+ return False
692
+ return proc.stdout.strip() in ("on", "all")
603
693
 
604
694
 
605
695
  def _load_svgs_for_results(names: list[str]) -> dict[str, str]:
@@ -619,30 +709,45 @@ def _load_svgs_for_results(names: list[str]) -> dict[str, str]:
619
709
  return svgs
620
710
 
621
711
 
622
- def _display_kitty_image(svg_content: str) -> None:
623
- """Render an SVG and display it inline via the Kitty graphics protocol."""
712
+ def _display_kitty_image(svg_content: str) -> bool:
713
+ """Render an SVG as a one-row inline image at the cursor position.
714
+
715
+ Emits with ``C=1`` so the cursor stays put and the caller controls
716
+ layout with ordinary cursor movement — which is also what makes tmux
717
+ passthrough safe: tmux never sees the image escape, and everything
718
+ that *does* move the cursor goes through tmux normally.
719
+
720
+ Returns:
721
+ True if an image escape was written.
722
+ """
624
723
  import base64 # noqa: PLC0415
625
- import sys # noqa: PLC0415
724
+ import os # noqa: PLC0415
626
725
 
627
726
  try:
628
727
  import cairosvg # noqa: PLC0415
629
- except ImportError:
630
- return
728
+ except (ImportError, OSError):
729
+ return False
631
730
 
632
731
  try:
633
732
  # Insert a white background rect so icons show on any terminal bg
634
733
  bg_rect = '<rect width="100%" height="100%" fill="white" rx="3"/>'
635
734
  padded_svg = svg_content.replace(">", f">{bg_rect}", 1)
735
+ # Rendered larger than displayed; the terminal downscales, which
736
+ # keeps strokes crisp on hidpi displays
636
737
  png_data: bytes = cairosvg.svg2png(
637
738
  bytestring=padded_svg.encode("utf-8"),
638
- output_width=48,
639
- output_height=48,
739
+ output_width=96,
740
+ output_height=96,
640
741
  )
641
742
  b64 = base64.b64encode(png_data).decode("ascii")
642
- sys.stdout.write(f"\033_Gf=100,t=d,a=T,r=2,c=4,q=2;{b64}\033\\\n")
743
+ seq = f"\033_Gf=100,t=d,a=T,r=1,c=2,C=1,q=2;{b64}\033\\"
744
+ if os.environ.get("TMUX"):
745
+ seq = "\033Ptmux;" + seq.replace("\033", "\033\033") + "\033\\"
746
+ sys.stdout.write(seq)
643
747
  sys.stdout.flush()
644
748
  except Exception:
645
- pass
749
+ return False
750
+ return True
646
751
 
647
752
 
648
753
  def _cmd_cluster(args: argparse.Namespace) -> int:
@@ -6,7 +6,7 @@ This module contains default configuration values used throughout the package.
6
6
  from dataclasses import dataclass
7
7
 
8
8
  # Default Lucide tag to use when building the icon database
9
- DEFAULT_LUCIDE_TAG = "1.17.0"
9
+ DEFAULT_LUCIDE_TAG = "1.25.0"
10
10
 
11
11
  # Default size for the LRU cache used by lucide_icon function
12
12
  DEFAULT_ICON_CACHE_SIZE = 128
@@ -35,8 +35,10 @@ class EmbeddingModelConfig:
35
35
  pooling: transformers.js pooling mode ("mean" or "cls").
36
36
  web_dtype: transformers.js quantization. Document vectors always
37
37
  come from fastembed (fp32), so a quantized browser model only
38
- perturbs the query vector — q8 stays ~0.994 cosine to fp32,
39
- which is ranking-equivalent, and roughly quarters the download.
38
+ perturbs the query vector — q8 stays ~0.985-0.996 cosine to
39
+ fp32 across our models, which is ranking-equivalent (top-1
40
+ changes are swaps between near-tied results), and roughly
41
+ quarters the download.
40
42
  query_prefix: Prefix prepended to queries (asymmetric retrieval).
41
43
  document_prefix: Prefix prepended to documents at build time.
42
44
  label: Human-facing label for the web UI model toggle.
@@ -53,23 +55,20 @@ class EmbeddingModelConfig:
53
55
  label: str = ""
54
56
 
55
57
 
58
+ # Two models, not three: at q8 bge-small is 33 MB, close enough to
59
+ # all-MiniLM's 22 MB that a separate "Faster" tier bought nothing —
60
+ # evaluated against bge-base and arctic-embed-m (both ~104 MB q8) too,
61
+ # and neither beat bge-small on this corpus.
56
62
  EMBEDDING_MODELS: dict[str, EmbeddingModelConfig] = {
57
- "minilm": EmbeddingModelConfig(
58
- id="minilm",
59
- fastembed_model="sentence-transformers/all-MiniLM-L6-v2",
60
- web_model="Xenova/all-MiniLM-L6-v2",
61
- dim=384,
62
- pooling="mean",
63
- label="Faster",
64
- ),
65
63
  "bge-small": EmbeddingModelConfig(
66
64
  id="bge-small",
67
65
  fastembed_model="BAAI/bge-small-en-v1.5",
68
66
  web_model="Xenova/bge-small-en-v1.5",
69
67
  dim=384,
70
68
  pooling="cls",
69
+ web_dtype="q8",
71
70
  query_prefix="Represent this sentence for searching relevant passages: ",
72
- label="Better",
71
+ label="English",
73
72
  ),
74
73
  "multilingual": EmbeddingModelConfig(
75
74
  id="multilingual",
@@ -1731,3 +1731,38 @@
1731
1731
  {"name": "astroid", "description": "This icon depicts a stylized four-pointed star with smooth, curved edges, resembling a rounded diamond. It symbolizes abstract shapes, mathematical concepts, and perhaps the spark of artificial intelligence or innovation.", "model": "gemini-2.5-flash-lite", "prompt_template_hash": "7ae15a902cba", "lucide_version": "1.17.0", "tags": ["star", "math", "shape", "curve", "sharp", "four-pointed", "hypocycloid", "ai", "artificial intelligence"], "categories": ["shapes", "math"], "timestamp": "2026-06-10T05:07:55.847698+00:00"}
1732
1732
  {"name": "heart-x", "description": "This icon depicts a heart shape with a large \"X\" superimposed on its right side. It visually represents the removal or cancellation of a liked or favored item, signifying rejection, dismissal, or the act of clearing a selection.", "model": "gemini-2.5-flash-lite", "prompt_template_hash": "7ae15a902cba", "lucide_version": "1.17.0", "tags": ["unlike", "unfavorite", "remove", "reject", "dismiss", "delete", "clear"], "categories": ["social", "multimedia", "design", "shapes"], "timestamp": "2026-06-10T05:07:56.077791+00:00"}
1733
1733
  {"name": "waves-vertical", "description": "Three wavy vertical lines ascend, representing rising steam or heat. This icon conveys concepts of warmth, boiling, and the presence of vapor or smoke, suggesting a hot or steamy environment.", "model": "gemini-2.5-flash-lite", "prompt_template_hash": "7ae15a902cba", "lucide_version": "1.17.0", "tags": ["steam", "warmth", "temperature", "burn", "hot", "boiling", "heat", "smoke", "vapor", "smell", "aroma", "sauna"], "categories": ["weather", "sustainability"], "timestamp": "2026-06-10T05:07:56.583232+00:00"}
1734
+ {"name": "banknote-check", "description": "This icon depicts a banknote with a checkmark. It represents successful financial transactions, verified payments, or the completion of a monetary task. It conveys a sense of approval, accuracy, and completion in financial contexts.", "model": "gemini-2.5-flash-lite", "prompt_template_hash": "7ae15a902cba", "lucide_version": "1.25.0", "tags": ["banknote", "bill", "currency", "payment", "money", "finance", "document", "verification", "tick", "verified", "accepted", "done", "complete", "found", "paid", "task", "check", "success"], "categories": ["finance"], "timestamp": "2026-07-20T17:53:14.910658+00:00"}
1735
+ {"name": "list-sort-ascending", "description": "This icon visually depicts three horizontal lines of increasing length, stacked from shortest to longest. It represents the concept of ascending order, arranging items from smallest to largest, or a rising sequence.", "model": "gemini-2.5-flash-lite", "prompt_template_hash": "7ae15a902cba", "lucide_version": "1.25.0", "tags": ["list", "order", "arrangement", "organization", "sequence", "ranking", "categories", "presentation", "filter", "sort", "ascending", "descending", "increasing", "decreasing", "rising", "falling"], "categories": ["text", "layout"], "timestamp": "2026-07-20T17:53:14.963694+00:00"}
1736
+ {"name": "pencil-sparkles", "description": "This icon visually depicts a pencil with subtle sparkles. It represents creativity, inspiration, and the magical touch of artistry in editing, writing, or design. It evokes a sense of enhanced creation and effortless ingenuity.", "model": "gemini-2.5-flash-lite", "prompt_template_hash": "7ae15a902cba", "lucide_version": "1.25.0", "tags": ["edit", "ai", "tools", "smart", "create", "draw", "sketch", "draft", "writer", "writing", "stationery", "artist", "magic", "wizard", "magician"], "categories": ["design", "cursors", "tools", "text", "photography"], "timestamp": "2026-07-20T17:53:15.018806+00:00"}
1737
+ {"name": "ad", "description": "This icon visually represents a bordered rectangle containing the bold letters \"AD\". It symbolizes advertising, promotions, and paid content, often associated with marketing campaigns, monetization, and brand partnerships.", "model": "gemini-2.5-flash-lite", "prompt_template_hash": "7ae15a902cba", "lucide_version": "1.25.0", "tags": ["advert", "affiliate", "brand", "campaign", "commercial", "marketing", "monetize", "paid", "partner", "promo", "sponsor"], "categories": ["multimedia", "notifications"], "timestamp": "2026-07-20T17:53:15.032154+00:00"}
1738
+ {"name": "phi", "description": "This icon visually represents the Greek letter Phi (Φ or φ). It symbolizes mathematical constants like the golden ratio, representing harmony and proportion, and concepts in physics such as magnetic flux. It evokes ideas of balance, flow, and fundamental scientific principles.", "model": "gemini-2.5-flash-lite", "prompt_template_hash": "7ae15a902cba", "lucide_version": "1.25.0", "tags": ["math", "golden-ratio", "symbol", "greek", "letter", "typography", "constant", "flux", "magnetic-flux"], "categories": ["math", "science"], "timestamp": "2026-07-20T17:53:15.065751+00:00"}
1739
+ {"name": "clock-arrow-right", "description": "This icon visually represents a clock face with its second hand transformed into an arrow pointing right. It symbolizes the passage of time, moving forward, or a time-based action to be completed.", "model": "gemini-2.5-flash-lite", "prompt_template_hash": "7ae15a902cba", "lucide_version": "1.25.0", "tags": ["time", "watch", "alarm", "range", "unassign"], "categories": ["time", "people", "arrows"], "timestamp": "2026-07-20T17:53:15.099878+00:00"}
1740
+ {"name": "circle-euro", "description": "This icon features the euro symbol (€) enclosed within a circle. It visually represents the European currency, symbolizing finance, economics, and transactions related to money and payments within the European context.", "model": "gemini-2.5-flash-lite", "prompt_template_hash": "7ae15a902cba", "lucide_version": "1.25.0", "tags": ["symbol", "economy", "banking", "europe", "€", "euro", "currency", "money", "payment", "coin", "finance", "financial", "exchange"], "categories": ["shopping", "finance"], "timestamp": "2026-07-20T17:53:15.100276+00:00"}
1741
+ {"name": "paper-bag", "description": "This icon visually represents a simple, folded paper bag with a handle. It conveys concepts of takeout food, packaging, storage, and eco-friendly shopping, suggesting a convenient way to carry goods or leftovers.", "model": "gemini-2.5-flash-lite", "prompt_template_hash": "7ae15a902cba", "lucide_version": "1.25.0", "tags": ["storage", "package", "lunch", "takeout", "eco-friendly", "kraft", "retail", "doggybag"], "categories": ["food-beverage", "shopping"], "timestamp": "2026-07-20T17:53:15.118516+00:00"}
1742
+ {"name": "database-minus", "description": "This icon depicts a cylindrical database symbol with a horizontal line underneath, signifying removal. It represents actions like deleting data, reducing storage, or subtracting from a dataset, conveying a sense of data management and reduction.", "model": "gemini-2.5-flash-lite", "prompt_template_hash": "7ae15a902cba", "lucide_version": "1.25.0", "tags": ["storage", "memory", "bytes", "server", "minus", "remove", "delete", "reduce"], "categories": ["devices", "development"], "timestamp": "2026-07-20T17:53:15.119427+00:00"}
1743
+ {"name": "database-arrow-down", "description": "This icon depicts a stack of database cylinders with an arrow pointing downwards from the lowest cylinder. It represents the action of downloading or exporting data from storage, signifying backup, retrieval, or data transfer operations.", "model": "gemini-2.5-flash-lite", "prompt_template_hash": "7ae15a902cba", "lucide_version": "1.25.0", "tags": ["storage", "memory", "bytes", "server", "export", "download", "backup", "pull", "downsize"], "categories": ["devices", "development"], "timestamp": "2026-07-20T17:53:15.154519+00:00"}
1744
+ {"name": "database-check", "description": "This icon visually represents a database cylinder with a checkmark beside it. It signifies successful data storage, verification, confirmation, or completion of a database operation, conveying a sense of reliability and achieved validation.", "model": "gemini-2.5-flash-lite", "prompt_template_hash": "7ae15a902cba", "lucide_version": "1.25.0", "tags": ["storage", "memory", "bytes", "server", "check", "success", "valid", "verified", "confirmed", "complete"], "categories": ["devices", "development"], "timestamp": "2026-07-20T17:53:15.167795+00:00"}
1745
+ {"name": "database-x", "description": "This icon depicts a database cylinder with a prominent \"x\" mark overlaid. It represents a corrupted, invalid, or inaccessible database, signifying an error, failure, or the act of denying or removing access to stored information.", "model": "gemini-2.5-flash-lite", "prompt_template_hash": "7ae15a902cba", "lucide_version": "1.25.0", "tags": ["storage", "memory", "bytes", "server", "x", "error", "failed", "invalid", "rejected", "denied", "clear", "remove", "disconnect"], "categories": ["devices", "development"], "timestamp": "2026-07-20T17:53:15.168865+00:00"}
1746
+ {"name": "eye-dashed", "description": "This icon visually represents an eye with a dashed outline, suggesting something obscured or partially visible. It evokes concepts of hiddenness, invisibility, or a protected view, hinting at concealed information or the act of masking something from sight.", "model": "gemini-2.5-flash-lite", "prompt_template_hash": "7ae15a902cba", "lucide_version": "1.25.0", "tags": ["view", "watch", "see", "hide", "conceal", "mask", "hidden", "invisible", "visibility", "vision"], "categories": ["accessibility", "photography", "design", "security"], "timestamp": "2026-07-20T17:53:15.200901+00:00"}
1747
+ {"name": "podium", "description": "This icon depicts a three-tiered podium with the number \"1\" prominently displayed above the highest step. It symbolizes victory, achievement, and recognition of top rankings in competitions, representing success and the celebration of winners.", "model": "gemini-2.5-flash-lite", "prompt_template_hash": "7ae15a902cba", "lucide_version": "1.25.0", "tags": ["award", "stage", "winner", "celebration", "performance", "medal", "success", "achievement", "highlight", "ranking", "winning", "place", "placing", "leaderboard", "first", "second", "third", "gold", "silver", "bronze"], "categories": ["sports", "gaming"], "timestamp": "2026-07-20T17:53:15.202102+00:00"}
1748
+ {"name": "database-arrow-up", "description": "This icon depicts a stack of database cylinders with an upward-pointing arrow emerging from them. It visually represents the action of uploading, backing up, or importing data from a storage source, signifying data transfer and data augmentation.", "model": "gemini-2.5-flash-lite", "prompt_template_hash": "7ae15a902cba", "lucide_version": "1.25.0", "tags": ["storage", "memory", "bytes", "server", "import", "upload", "backup", "push", "upscale"], "categories": ["devices", "development"], "timestamp": "2026-07-20T17:53:15.223015+00:00"}
1749
+ {"name": "clock-arrow-left", "description": "This icon visually represents a clock face with an arrow pointing counter-clockwise. It symbolizes the concept of time moving backward, or a rewind action. It can also suggest returning to a previous state or a reset of time.", "model": "gemini-2.5-flash-lite", "prompt_template_hash": "7ae15a902cba", "lucide_version": "1.25.0", "tags": ["time", "watch", "alarm", "assign", "range"], "categories": ["time"], "timestamp": "2026-07-20T17:53:15.235044+00:00"}
1750
+ {"name": "database-plus", "description": "This icon depicts a stacked database cylinder with a plus symbol. It represents the act of adding new data or expanding storage capacity, signifying creation and new entries for a server or memory system.", "model": "gemini-2.5-flash-lite", "prompt_template_hash": "7ae15a902cba", "lucide_version": "1.25.0", "tags": ["storage", "memory", "bytes", "server", "plus", "add", "create", "insert", "new", "expand"], "categories": ["devices", "development"], "timestamp": "2026-07-20T17:53:15.235119+00:00"}
1751
+ {"name": "play-off", "description": "This icon depicts a play button with a diagonal line through it. It visually signifies that playback is off, disabled, or forbidden. It represents a state of being unable to start or run an audio or video function.", "model": "gemini-2.5-flash-lite", "prompt_template_hash": "7ae15a902cba", "lucide_version": "1.25.0", "tags": ["audio", "video", "music", "start", "run", "off", "disabled", "blocked", "forbidden"], "categories": ["multimedia"], "timestamp": "2026-07-20T17:53:15.253653+00:00"}
1752
+ {"name": "bone-fracture", "description": "This icon visually represents a fractured bone, depicted as two distinct pieces with radiating lines suggesting impact or breakage. It signifies injury, trauma, and the concept of a broken bone, commonly associated with medical contexts, orthopedics, and veterinary care.", "model": "gemini-2.5-flash-lite", "prompt_template_hash": "7ae15a902cba", "lucide_version": "1.25.0", "tags": ["bone", "fracture", "injury", "orthopedic", "medical", "anatomy", "skeletal", "broken", "xray", "trauma", "health", "vet", "veterinary", "crack", "break", "damage"], "categories": ["medical", "animals"], "timestamp": "2026-07-20T17:53:15.255641+00:00"}
1753
+ {"name": "list-sort-descending", "description": "This icon shows three horizontal lines of decreasing length, stacked vertically. It represents descending order, filtering, or arranging content from largest to smallest. It signifies a structured decrease in size or rank.", "model": "gemini-2.5-flash-lite", "prompt_template_hash": "7ae15a902cba", "lucide_version": "1.25.0", "tags": ["list", "order", "arrangement", "organization", "sequence", "ranking", "categories", "presentation", "filter", "sort", "ascending", "descending", "increasing", "decreasing", "rising", "falling"], "categories": ["text", "layout"], "timestamp": "2026-07-20T17:53:15.422187+00:00"}
1754
+ {"name": "star-minus", "description": "This icon depicts a stylized star with a minus sign attached to its lower right. It represents the action of removing a favorite item, deselecting a rating, or reducing a score. It signifies taking away from a positive or valued element.", "model": "gemini-2.5-flash-lite", "prompt_template_hash": "7ae15a902cba", "lucide_version": "1.25.0", "tags": ["bookmark", "favorite", "like", "review", "rating", "minus", "remove", "deselect", "star"], "categories": ["account", "social", "shapes", "multimedia", "weather", "emoji", "gaming"], "timestamp": "2026-07-20T17:53:15.796047+00:00"}
1755
+ {"name": "scan-box", "description": "This icon visually depicts a 3D cube framed by corner brackets, suggesting a scanning or capture process. It represents augmented reality, object detection, and spatial computing, symbolizing the identification, mapping, and recognition of objects in three-dimensional space.", "model": "gemini-2.5-flash-lite", "prompt_template_hash": "7ae15a902cba", "lucide_version": "1.25.0", "tags": ["ar", "augmented reality", "3d", "object detection", "object recognition", "tracking", "spatial computing", "capture", "cube", "bounding box", "camera", "frame", "shape", "boundary", "lidar", "depth", "scanning", "mapping", "placement"], "categories": ["design", "devices", "shopping", "gaming"], "timestamp": "2026-07-20T17:53:15.813023+00:00"}
1756
+ {"name": "save-pen", "description": "This icon depicts a document or file being edited. It represents the action of modifying, updating, or saving changes to text or data. The imagery evokes concepts of writing, editing, and the finalization of content.", "model": "gemini-2.5-flash-lite", "prompt_template_hash": "7ae15a902cba", "lucide_version": "1.25.0", "tags": ["floppy disk", "directory", "rename"], "categories": ["text", "files"], "timestamp": "2026-07-20T17:53:15.829837+00:00"}
1757
+ {"name": "save-check", "description": "This icon depicts a document with a checkmark, symbolizing a successful save or confirmation. It represents the action of storing information, indicating completion, validation, or that data has been securely recorded. It conveys a sense of accomplishment and finality.", "model": "gemini-2.5-flash-lite", "prompt_template_hash": "7ae15a902cba", "lucide_version": "1.25.0", "tags": ["save", "save-check", "floppy-disk", "saved", "check", "save-success"], "categories": ["text", "files", "development"], "timestamp": "2026-07-20T17:53:15.832582+00:00"}
1758
+ {"name": "server-plus", "description": "This icon depicts two stacked server racks with a plus symbol overlaid on the right. It represents adding or creating new server resources, symbolizing expansion, growth, and the addition of new components to a computing or storage system.", "model": "gemini-2.5-flash-lite", "prompt_template_hash": "7ae15a902cba", "lucide_version": "1.25.0", "tags": ["add", "create", "new", "cloud", "storage", "computing"], "categories": ["development", "devices"], "timestamp": "2026-07-20T17:53:15.881080+00:00"}
1759
+ {"name": "star-check", "description": "This icon depicts a stylized star with a checkmark integrated into its lower right corner. It represents completion, validation, or a positive affirmation of a favorite item, rating, or a successfully bookmarked selection.", "model": "gemini-2.5-flash-lite", "prompt_template_hash": "7ae15a902cba", "lucide_version": "1.25.0", "tags": ["bookmark", "favorite", "like", "review", "rating", "check", "star"], "categories": ["account", "social", "shapes", "multimedia", "weather", "emoji", "gaming"], "timestamp": "2026-07-20T17:53:15.930729+00:00"}
1760
+ {"name": "tag-plus", "description": "This icon visually represents a tag or label with a plus sign, suggesting the addition of a new item. It conveys concepts of creating, marking, or labeling something, often indicating a new addition or a way to categorize.", "model": "gemini-2.5-flash-lite", "prompt_template_hash": "7ae15a902cba", "lucide_version": "1.25.0", "tags": ["label", "badge", "ticket", "mark", "new", "add", "create", "+"], "categories": ["account"], "timestamp": "2026-07-20T17:53:15.965525+00:00"}
1761
+ {"name": "webcam-off", "description": "This icon depicts a webcam with a diagonal line through it, indicating it is disabled or not functioning. It represents the concept of privacy, the absence of visual recording, or a device being turned off and unavailable for video transmission.", "model": "gemini-2.5-flash-lite", "prompt_template_hash": "7ae15a902cba", "lucide_version": "1.25.0", "tags": ["camera", "security"], "categories": ["connectivity", "devices", "communication"], "timestamp": "2026-07-20T17:53:15.982681+00:00"}
1762
+ {"name": "star-x", "description": "This icon features a five-pointed star with an \"X\" symbol superimposed on its right side. It signifies the removal or cancellation of a favorite, a rejected rating, or the unmarking of something previously designated as special.", "model": "gemini-2.5-flash-lite", "prompt_template_hash": "7ae15a902cba", "lucide_version": "1.25.0", "tags": ["mark", "symbol", "shape", "vector", "design", "graphic", "bookmark", "favorite", "like", "review", "rating", "x", "cancel", "reject", "star"], "categories": ["account", "social", "shapes", "multimedia", "weather", "emoji", "gaming"], "timestamp": "2026-07-20T17:53:15.985835+00:00"}
1763
+ {"name": "save-plus", "description": "This icon visually combines a document or file symbol with a plus sign. It represents the action of saving new content, adding a file, creating a document, or updating existing information with a new version or entry.", "model": "gemini-2.5-flash-lite", "prompt_template_hash": "7ae15a902cba", "lucide_version": "1.25.0", "tags": ["floppy disk", "save", "plus", "add", "update", "create"], "categories": ["text", "files"], "timestamp": "2026-07-20T17:53:15.999587+00:00"}
1764
+ {"name": "summary", "description": "The icon visually represents a stack of horizontal lines, suggesting text or data, with an arrow pointing outwards from the right. It signifies a concise overview, abstract, or condensed version of information, implying summarization and extraction of key points.", "model": "gemini-2.5-flash-lite", "prompt_template_hash": "7ae15a902cba", "lucide_version": "1.25.0", "tags": ["brief", "abstract", "synopsis", "report", "digest", "outline", "recap", "condensation", "summary", "ai", "text", "overview"], "categories": ["text"], "timestamp": "2026-07-20T17:53:16.017688+00:00"}
1765
+ {"name": "wrench-off", "description": "This icon depicts a wrench crossed out by a diagonal line, symbolizing the deactivation or unavailability of tools, maintenance, or settings. It represents a state of being off, disabled, or not in service, suggesting a pause in work or a feature that is currently inactive.", "model": "gemini-2.5-flash-lite", "prompt_template_hash": "7ae15a902cba", "lucide_version": "1.25.0", "tags": ["account", "settings", "spanner", "diy", "toolbox", "build", "construction", "off", "service", "maintenance", "disabled"], "categories": ["account", "development", "tools"], "timestamp": "2026-07-20T17:53:16.068219+00:00"}
1766
+ {"name": "tag-x", "description": "This icon visually represents a tag or label with an \"X\" mark overlaid. It signifies actions like removing, deleting, or canceling a tag, label, or item. It conveys a sense of dismissal or negation related to identification.", "model": "gemini-2.5-flash-lite", "prompt_template_hash": "7ae15a902cba", "lucide_version": "1.25.0", "tags": ["label", "badge", "ticket", "mark", "x", "delete", "remove"], "categories": ["account"], "timestamp": "2026-07-20T17:53:16.071366+00:00"}
1767
+ {"name": "user-round-arrow-left", "description": "This icon depicts a stylized human figure with an arrow pointing inwards towards it. It represents concepts like receiving, assignment, or a return to self. It can signify an incoming item or action directed towards a person or profile.", "model": "gemini-2.5-flash-lite", "prompt_template_hash": "7ae15a902cba", "lucide_version": "1.25.0", "tags": ["person", "assign", "move", "give", "setup", "self", "me", "myself", "profile", "avatar", "incoming", "recipient", "assignee", "inbound"], "categories": ["account", "people", "arrows"], "timestamp": "2026-07-20T17:53:16.086902+00:00"}
1768
+ {"name": "star-plus", "description": "This icon visually represents a star outline with a plus symbol integrated into its lower right corner. It signifies adding a favorite, bookmarking an item, expressing a liking, or enhancing a rating. It also conveys the concept of joining or increasing something positive.", "model": "gemini-2.5-flash-lite", "prompt_template_hash": "7ae15a902cba", "lucide_version": "1.25.0", "tags": ["bookmark", "favorite", "like", "review", "rating", "plus", "add", "join", "star"], "categories": ["account", "social", "shapes", "multimedia", "weather", "emoji", "gaming"], "timestamp": "2026-07-20T17:53:16.103103+00:00"}