+
+## Documentation
+
+* [Docs](https://docs.rs/leptos_form)
+* [GitHub repository](https://github.com/tlowerison/leptos_form)
+* [Cargo package](https://crates.io/crates/leptos_form)
+
+## Features
+
+* Automatic form parsing -- focus on how your data is represented and not on how to get it in and out of html
+* Easy specification of label and input classes, great for Tailwind integration
+* Labels are derived from struct fields and can be given form-wide casing
+* DOM layout customization through attributes
+* Integration with popular crates
+
+## Crate features
+
+This crate offers the following features, all of which are not activated by default:
+
+- `bigdecimal`: Provides impls for [`BigDecimal`](https://docs.rs/bigdecimal/latest/bigdecimal/struct.BigDecimal.html)
+- `chrono`: Provides impls for [`DateTime`](https://docs.rs/chrono/latest/chrono/struct.DateTime.html), [`NaiveDate`](https://docs.rs/chrono/latest/chrono/naive/struct.NaiveDate.html), [`NaiveDateTime`](https://docs.rs/chrono/latest/chrono/naive/struct.NaiveDateTime.html)
+- `num-bigint`: Provides impls for [`BigInt`](https://docs.rs/num-bigint/latest/num_bigint/struct.BigInt.html) and [`BigUint`](https://docs.rs/num-bigint/latest/num_bigint/struct.BigUint.html)
+- `uuid`: Provides impls for [`Uuid`](https://docs.rs/uuid/latest/uuid/struct.Uuid.html)
+
+## Example
+
+```rust
+mod my_crate {
+ use leptos::*;
+ use leptos_form::prelude::*;
+ use serde::*;
+
+ #[derive(Clone, Debug, Default, Deserialize, Form, Serialize)]
+ #[form(
+ component(
+ action = create_my_data(my_data),
+ submit = view!(),
+ on_success = |DbMyData { id, .. }, _| view!(
{format!("Created {id}")}
),
+ reset_on_success,
+ ),
+ label(wrap(class = "my-class", rename_all = "Title Case")),
+ )]
+ pub struct MyData {
+ pub my_name: String,
+ }
+
+ #[derive(Clone, Debug, Deserialize, Serialize)]
+ pub struct DbMyData {
+ pub id: i32,
+ pub name: String,
+ }
+
+ #[component]
+ pub fn MyComponent() -> impl IntoView {
+ view!()
+ }
+
+ #[server]
+ async fn create_my_data(my_data: MyData) -> Result {
+ todo!()
+ }
+}
+```
diff --git a/cliff.toml b/cliff.toml
new file mode 100644
index 0000000..7beeaca
--- /dev/null
+++ b/cliff.toml
@@ -0,0 +1,83 @@
+# git-cliff ~ default configuration file
+# https://git-cliff.org/docs/configuration
+#
+# Lines starting with "#" are comments.
+# Configuration options are organized into tables and keys.
+# See documentation for more information on available options.
+
+[changelog]
+# changelog header
+header = """
+# Changelog\n
+All notable changes to this project will be documented in this file.\n
+"""
+# template for the changelog body
+# https://keats.github.io/tera/docs/#introduction
+body = """
+{% if version %}\
+ ## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }}
+{% else %}\
+ ## [unreleased]
+{% endif %}\
+{% for group, commits in commits | group_by(attribute="group") %}
+ ### {{ group | upper_first }}
+ {% for commit in commits %}
+ - {% if commit.breaking %}[**breaking**] {% endif %}{{ commit.message | upper_first }}\
+ {% endfor %}
+{% endfor %}\n
+"""
+# remove the leading and trailing whitespace from the template
+trim = true
+# changelog footer
+footer = """
+
+"""
+# postprocessors
+postprocessors = [
+ # { pattern = '', replace = "https://github.com/orhun/git-cliff" }, # replace repository URL
+]
+[git]
+# parse the commits based on https://www.conventionalcommits.org
+conventional_commits = true
+# filter out the commits that are not conventional
+filter_unconventional = true
+# process each line of a commit as an individual commit
+split_commits = false
+# regex for preprocessing the commit messages
+commit_preprocessors = [
+ # { pattern = '\((\w+\s)?#([0-9]+)\)', replace = "([#${2}](/issues/${2}))"}, # replace issue numbers
+]
+# regex for parsing and grouping commits
+commit_parsers = [
+ { message = "^feat", group = "Features" },
+ { message = "^fix", group = "Bug Fixes" },
+ { message = "^doc", group = "Documentation" },
+ { message = "^perf", group = "Performance" },
+ { message = "^refactor", group = "Refactor" },
+ { message = "^style", group = "Styling" },
+ { message = "^test", group = "Testing" },
+ { message = "^chore\\(release\\): prepare for", skip = true },
+ { message = "^chore\\(deps\\)", skip = true },
+ { message = "^chore\\(pr\\)", skip = true },
+ { message = "^chore\\(pull\\)", skip = true },
+ { message = "^chore|ci", group = "Miscellaneous Tasks" },
+ { body = ".*security", group = "Security" },
+ { message = "^revert", group = "Revert" },
+]
+# protect breaking changes from being skipped due to matching a skipping commit_parser
+protect_breaking_commits = false
+# filter out the commits that are not matched by commit parsers
+filter_commits = false
+# regex for matching git tags
+tag_pattern = "v[0-9].*"
+
+# regex for skipping tags
+skip_tags = "v0.1.0-beta.1"
+# regex for ignoring tags
+ignore_tags = ""
+# sort the tags topologically
+topo_order = false
+# sort the commits inside sections by oldest/newest order
+sort_commits = "oldest"
+# limit the number of commits included in the changelog.
+# limit_commits = 42
diff --git a/core/Cargo.toml b/core/Cargo.toml
index c0fc911..923995c 100644
--- a/core/Cargo.toml
+++ b/core/Cargo.toml
@@ -3,7 +3,7 @@ name = "leptos_form_core"
version.workspace = true
edition.workspace = true
authors.workspace = true
-rust-version = "1.75.0"
+repository.workspace = true
[dependencies]
derivative.workspace = true
diff --git a/leptos_form/Cargo.toml b/leptos_form/Cargo.toml
index fcbc0ad..eafd087 100644
--- a/leptos_form/Cargo.toml
+++ b/leptos_form/Cargo.toml
@@ -3,11 +3,12 @@ name = "leptos_form"
version.workspace = true
edition.workspace = true
authors.workspace = true
+repository.workspace = true
[dependencies]
leptos.workspace = true
-leptos_form_core.path = "../core"
-leptos_form_proc_macros.path = "../proc_macros"
+leptos_form_core.workspace = true
+leptos_form_proc_macros.workspace = true
leptos_router.workspace = true
wasm-bindgen.workspace = true
diff --git a/leptos_form/Crate.md b/leptos_form/Crate.md
deleted file mode 100644
index e5f47eb..0000000
--- a/leptos_form/Crate.md
+++ /dev/null
@@ -1,89 +0,0 @@
-# Derive leptos forms from rust structs
-
-
-
-## Documentation
-
-* [Docs](https://docs.rs/leptos_form)
-* [GitHub repository](https://github.com/tlowerison/leptos_form)
-
-## Features
-
-* Automatic form parsing -- focus on how your data is represented and not on how to get it in and out of html
-* Easy specification of label and input classes, great for Tailwind integration
-* Labels are derived from struct fields, and can be set to a form-wide casing
-* DOM layout customization through attributes
-* Integration with popular crates
-
-## Crate features
-
-This crate offers the following features, all of which are not activated by default:
-
-- `bigdecimal`: Provides impls for [`BigDecimal`](https://docs.rs/bigdecimal/latest/bigdecimal/struct.BigDecimal.html)
-- `chrono`: Provides impls for [`DateTime`](https://docs.rs/chrono/latest/chrono/struct.DateTime.html), [`NaiveDate`](https://docs.rs/chrono/latest/chrono/naive/struct.NaiveDate.html), [`NaiveDateTime`](https://docs.rs/chrono/latest/chrono/naive/struct.NaiveDateTime.html)
-- `num-bigint`: Provides impls for [`BigInt`](https://docs.rs/num-bigint/latest/num_bigint/struct.BigInt.html) and [`BigUint`](https://docs.rs/num-bigint/latest/num_bigint/struct.BigUint.html)
-- `uuid`: Provides impls for [`Uuid`](https://docs.rs/uuid/latest/uuid/struct.Uuid.html)
-
-## Example
-
-```rust
-mod my_crate {
- use leptos::*;
- use leptos_form::prelude::*;
- use serde::*;
-
- #[derive(Clone, Debug, Default, Deserialize, Form, Serialize)]
- #[form(
- component(
- action = create_my_data(my_data),
- submit = view!(),
- on_success = |db_my_data, _| view!(