Metadata-Version: 2.4
Name: iskg
Version: 0.4.4
Summary: IFAZ Widget Toolkit — widgets Python livianos sobre pywebview
Author: Iskander-mlander
License-Expression: GPL-3.0-or-later
Project-URL: Homepage, https://github.com/Iskander-mlander/iskg
Project-URL: Repository, https://github.com/Iskander-mlander/iskg
Project-URL: Documentation, https://github.com/Iskander-mlander/iskg#readme
Keywords: gui,widgets,pywebview,tactical,ifaz
Classifier: Development Status :: 3 - Alpha
Classifier: Intended Audience :: Developers
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Programming Language :: Python :: 3.14
Classifier: Topic :: Software Development :: User Interfaces
Requires-Python: >=3.10
Description-Content-Type: text/markdown
License-File: LICENSE
Requires-Dist: pywebview>=5.0
Provides-Extra: dev
Requires-Dist: ruff>=0.4; extra == "dev"
Requires-Dist: build; extra == "dev"
Requires-Dist: twine; extra == "dev"
Requires-Dist: pytest>=7; extra == "dev"
Requires-Dist: pytest-cov>=5; extra == "dev"
Requires-Dist: pyright>=1.1; extra == "dev"
Provides-Extra: docs
Requires-Dist: sphinx>=7; extra == "docs"
Requires-Dist: sphinx-rtd-theme>=2; extra == "docs"
Requires-Dist: sphinx-rtd-dark-mode>=1.3; extra == "docs"
Requires-Dist: sphinx-autobuild; extra == "docs"
Dynamic: license-file

<div align="center">
  <img src="https://raw.githubusercontent.com/Iskander-mlander/ISKG/main/iskg/examples/icon.png" width="80" alt="ISKG logo"/>
  <h1>ISKG</h1>
  <p><b>IFAZ Widget Toolkit</b> — Python GUI framework ligero</p>

  [![CI](https://img.shields.io/github/actions/workflow/status/Iskander-mlander/ISKG/ci.yml?branch=main&label=CI&logo=github)](https://github.com/Iskander-mlander/ISKG/actions)
  [![Python](https://img.shields.io/badge/python-3.10%20|%203.11%20|%203.12%20|%203.13%20|%203.14-blue?logo=python)](https://www.python.org)
  [![License](https://img.shields.io/github/license/Iskander-mlander/ISKG?color=green)](LICENSE)
  [![Release](https://img.shields.io/github/v/release/Iskander-mlander/ISKG?logo=github)](https://github.com/Iskander-mlander/ISKG/releases)
  [![Platform](https://img.shields.io/badge/platform-linux%20|%20windows%20|%20macos-lightgrey)](#)
</div>

---

**ISKG** renders native-looking widgets as HTML/CSS/JS inside a native window via [pywebview](https://github.com/r0x0r/pywebview). 

No browser, no HTTP server — just a Python process and a lightweight WebView.

## Features

- **40 widgets**: Button, Entry, ComboBox, Slider, ProgressBar, Canvas, TreeView, DataGrid, Knob, Gauge, Notebook, MenuBar, TimeSeriesGraph, Sparkline, LogViewer, Clock, DatePicker, and more.
- **Context menus**: right-click menus per widget via `set_menu()` / `popup_menu()` and `bind("contextmenu", cb)`, with submenus, separators, and shortcuts.
- **Live data widgets**: `TimeSeriesGraph`/`Sparkline` (smooth SVG curves, multi-series), colour-coded `LogViewer` with autoscroll, ticking `Clock`, and a `DatePicker` calendar popup.
- **Event bus**: app-wide pub/sub via `app.on(event, cb)` / `app.emit(event, *args)`, with built-in `theme-changed` and `closing` events.
- **Global shortcuts**: `app.bind("<Control-s>")` fires regardless of widget focus.
- **Drag & drop**: `draggable=True` sources and `bind("<<Drop>>", cb)` targets move data between widgets.
- **Layout engines**: `pack`, `grid` (with sticky + weights), `place`.
- **Theming**: 13 built-in themes (ifaz, desert, infinity, cyberdusk, night, warm, cold, light, dracula, nord, gruvbox, monokai, catppuccin), CSS variable system.
- **Cross-platform**: Linux, Windows, macOS (same codebase).
- **Zero HTTP**: No server, no ports, no browser tabs — just a window.
- **JS bridge**: Bidirectional Python ↔ JavaScript calls for real-time UI updates.
- **`.tooltip` on every widget**: Set a tooltip via property or `config()`.
- **`after()` timers**: Cancelable timer objects with `.cancel()` and `.running`.
- **Debug mode**: Pass `debug=True` to `Application()` to log JS errors to stderr.
- **7 embedded fonts** (SIL OFL): [Inter](https://rsms.me/inter/), [JetBrains Mono](https://www.jetbrains.com/lp/mono/), [Nunito](https://fonts.google.com/specimen/Nunito), [Manrope](https://manropefont.com/), [Space Grotesk](https://fonts.google.com/specimen/Space+Grotesk), [Fira Sans](https://fonts.google.com/specimen/Fira+Sans), [Playfair Display](https://fonts.google.com/specimen/Playfair+Display) — no CDN, todo embebido.

## Quick start

```bash
# desde PyPI
pip install iskg

# from GitHub Releases
pip install https://github.com/Iskander-mlander/ISKG/releases/download/v0.4.0/iskg-0.4.0-py3-none-any.whl
```

```python
from iskg import (
    Application, Button, Entry, Label, Frame,
    Slider, ComboBox, ProgressBar, ToggleSwitch,
)

app = Application(title="ISKG Quick Start", width=560, height=420)

# Root frame with a stretchable column 0
root = Frame(parent=None)
root.grid_columnconfigure(0, weight=1)

Label(parent=root, text="ISKG QUICK START", anchor="center",
      font="bold 16px").grid(row=0, column=0, columnspan=2, pady=(8, 4))

# Greet: Entry in column 0, Button in column 1
name = Entry(parent=root, text="world")
name.grid(row=1, column=0, sticky="we", padx=8)

greeting = Label(parent=root, text="Hello, world!")
greeting.grid(row=2, column=0, sticky="w", padx=8)

def on_greet():
    greeting.config(text=f"Hello, {name.text or 'world'}!")

Button(parent=root, text="Greet", command=on_greet).grid(row=1, column=1, padx=8)

# Slider drives the ProgressBar
slider = Slider(parent=root, from_=0, to=100, value=30)
slider.grid(row=3, column=0, sticky="we", padx=8)

progress = ProgressBar(parent=root, max_=100, value=30)
progress.grid(row=4, column=0, sticky="we", padx=8)

def on_slider_change(_data):
    progress.value = slider.value

slider.bind("change", on_slider_change)

# Theme picker + a toggle
combo = ComboBox(
    parent=root,
    values=["ifaz", "desert", "cyberdusk", "night", "warm", "cold", "light"],
    command=lambda _d: app.set_theme(combo.value),
)
combo.grid(row=5, column=0, sticky="we", padx=8)

ToggleSwitch(parent=root, text="Extra").grid(row=5, column=1, padx=8)

Label(parent=root, text="Ready", anchor="center").grid(
    row=6, column=0, columnspan=2, pady=8
)

app.add(root)
app.run()
```

## Installation

```bash
pip install iskg          # desde PyPI (Python 3.10+)
```

**Linux — dependencias del backend (pywebview):** ISKG usa WebKit2GTK, así que
instala las librerías del sistema antes de `app.run()`:

- Arch Linux: `sudo pacman -S gtk3 webkit2gtk-4.1 python-gobject`
- Debian/Ubuntu: `sudo apt install python3-gi gir1.2-webkit2-4.1`

**Arch Linux — PEP 668:** el entorno de Python es *externally-managed*, por lo
que `pip install iskg` falla. Opciones:

- Entorno virtual: `python -m venv .venv && .venv/bin/pip install iskg`
- [pipx](https://pipx.pypa.io): `pipx install iskg`
- Global para el usuario: `pip install --break-system-packages --user iskg`

**Desde el código fuente:**

```bash
pip install git+https://github.com/Iskander-mlander/ISKG.git
```

![ISKG Dashboard](https://raw.githubusercontent.com/Iskander-mlander/ISKG/main/examples/Cap.png)

## Documentation

Full API reference: [github-pages](https://iskander-mlander.github.io/ISKG/)

## License

GPLv3 — see [LICENSE](LICENSE).
