frostmark 0.1.0

HTML/Markdown renderer for the Iced GUI framework
Documentation
# 🧊 Frostmark

**An HTML + Markdown viewer for [iced](https://iced.rs/)**

Render rich text in your `iced` app at lightning-fast speeds using plain HTML or Markdown!

![Demo showing HTML and Markdown together](./examples/assets/live_edit.png)

---

## Usage

1. Create a `MarkState` and **store it in your application state**.

```txt
MarkState::with_html_and_markdown(YOUR_TEXT)
// or if you just want HTML
MarkState::with_html(YOUR_TEXT)
```

2. In your `view` function use a `MarkWidget`.

```txt
iced::widget::container( // just an example
    MarkWidget::new(&self.mark_state)
)
.padding(10)
```

## Example

You can find runnable examples [here](examples/README.md)

<details>
<summary>Click to expand a fully fledged code example</summary>

```rust
use frostmark::{MarkState, MarkWidget};
use iced::{widget, Element, Task};

#[derive(Debug, Clone)]
enum Message {}

struct App {
    state: MarkState,
}

impl App {
    fn update(&mut self, _: Message) -> Task<Message> {
        Task::none()
    }

    fn view(&self) -> Element<'_, Message> {
        widget::container(MarkWidget::new(&self.state))
            .padding(10)
            .into()
    }
}

fn main() {
    iced::application("Hello World", App::update, App::view)
        .run_with(|| {
            (
                App {
                    state: MarkState::with_html_and_markdown(YOUR_TEXT),
                },
                Task::none(),
            )
        })
        .unwrap();
}

const YOUR_TEXT: &str = "Hello from **markdown** and <b>HTML</b>!";
```

</details>
<br>

**Note:** Markdown support is optional and you can disable the `markdown`
feature to have more lightweight, HTML-only support.

## How does this work

- Markdown (if present) is converted to HTML using `comrak`.
- HTML is parsed using [`html5ever`]https://crates.io/crates/html5ever/, from the [Servo]https://servo.org/ project.
- The resulting DOM is rendered **directly to `iced` widgets** using a custom renderer.

**No custom widget types** - everything is built from standard iced components like:
`column`, `row`, `rich_text`, `button`, `horizontal_bar`, etc.

Rendering happens right inside `impl Into<Element> for MarkWidget`.

## Roadmap

- Better widget styling options.
- Quick “render and cache” API
- Support for more elements (eg: superscript)
- Ensure stability, and publish on [crates.io]https://crates.io/

# Contributing

This library is experimental.
Bug reports and pull requests are welcome;
contributions are appreciated!

- **License**: Dual licensed under MIT and Apache 2.0.