diff --git a/examples/01-app-demos/bluetooth-scanner/src/main.rs b/examples/01-app-demos/bluetooth-scanner/src/main.rs
index 662449f42..6843c65e4 100644
--- a/examples/01-app-demos/bluetooth-scanner/src/main.rs
+++ b/examples/01-app-demos/bluetooth-scanner/src/main.rs
@@ -43,11 +43,11 @@ fn app() -> Element {
h2 { class: "text-2xl font-bold", "Scan for Bluetooth Devices" }
button {
class: "inline-block w-full md:w-auto px-6 py-3 font-medium text-white bg-indigo-500 hover:bg-indigo-600 rounded transition duration-200",
- disabled: scan.is_pending(),
+ disabled: scan.pending(),
onclick: move |_| {
scan.call();
},
- if scan.is_pending() { "Scanning" } else { "Scan" }
+ if scan.pending() { "Scanning" } else { "Scan" }
}
}
}
@@ -64,8 +64,8 @@ fn app() -> Element {
th { class: "pb-3 px-2 font-medium", "Security" }
}
}
- match scan.result() {
- None if scan.is_pending() => rsx! { "Scanning..." },
+ match scan.value() {
+ None if scan.pending() => rsx! { "Scanning..." },
None => rsx! { "Press Scan to start scanning" },
Some(Err(_err)) => rsx! { "Failed to scan" },
Some(Ok(peripherals)) => rsx! {
diff --git a/examples/01-app-demos/dog_app.rs b/examples/01-app-demos/dog_app.rs
index 020a17842..d60075568 100644
--- a/examples/01-app-demos/dog_app.rs
+++ b/examples/01-app-demos/dog_app.rs
@@ -53,7 +53,7 @@ fn app() -> Element {
}
}
div {
- match breed.result() {
+ match breed.value() {
None => rsx! { div { "Click the button to fetch a dog!" } },
Some(Err(_e)) => rsx! { div { "Failed to fetch a dog, please try again." } },
Some(Ok(res)) => rsx! {
diff --git a/examples/01-app-demos/image_generator_openai.rs b/examples/01-app-demos/image_generator_openai.rs
index 99dc7bc3d..360757021 100644
--- a/examples/01-app-demos/image_generator_openai.rs
+++ b/examples/01-app-demos/image_generator_openai.rs
@@ -69,13 +69,13 @@ fn app() -> Element {
}
button {
class: "button is-primary",
- class: if image.is_pending() { "is-loading" },
+ class: if image.pending() { "is-loading" },
onclick: move |_| {
image.call();
},
"Generate image"
}
- if let Some(image) = image.value() {
+ if let Some(Ok(image)) = image.value() {
for image in image.read().data.as_slice() {
section { class: "is-flex",
div { class: "container is-fluid",
diff --git a/examples/01-app-demos/weather_app.rs b/examples/01-app-demos/weather_app.rs
index 70b09b8b6..2d0069bbc 100644
--- a/examples/01-app-demos/weather_app.rs
+++ b/examples/01-app-demos/weather_app.rs
@@ -20,7 +20,7 @@ fn app() -> Element {
let current_weather = use_loader(move || get_weather(country()));
rsx! {
- Stylesheet { href: "https://unpkg.com/tailwindcss@^2.0/dist/tailwind.min.css" }
+ Stylesheet { href: asset!("/examples/assets/weatherapp.css") }
div { class: "mx-auto p-4 bg-gray-100 h-screen flex justify-center",
div { class: "flex items-center justify-center flex-row",
div { class: "flex items-start justify-center flex-row",
@@ -35,6 +35,11 @@ fn app() -> Element {
weather: weather.cloned(),
}
Forecast { weather: weather.cloned() }
+ div { height: "20px", margin_top: "10px",
+ if weather.loading() {
+ "Fetching weather data..."
+ }
+ }
},
Err(Loading::Pending(_)) => rsx! {
div { "Loading weather data..." }
@@ -56,8 +61,8 @@ fn app() -> Element {
#[component]
fn CountryData(weather: WeatherResponse, country: WeatherLocation) -> Element {
let today = "Today";
- let max_temp = weather.daily.temperature_2m_max.first().unwrap();
- let min_temp = weather.daily.temperature_2m_min.first().unwrap();
+ let max_temp = weather.daily.temperature_2m_max[0];
+ let min_temp = weather.daily.temperature_2m_min[0];
rsx! {
div { class: "flex mb-4 justify-between items-center",
@@ -82,15 +87,11 @@ fn CountryData(weather: WeatherResponse, country: WeatherLocation) -> Element {
#[allow(non_snake_case)]
#[component]
fn Forecast(weather: WeatherResponse) -> Element {
- let today = (weather.daily.temperature_2m_max.first().unwrap()
- + weather.daily.temperature_2m_max.first().unwrap())
- / 2.0;
- let tomorrow = (weather.daily.temperature_2m_max.get(1).unwrap()
- + weather.daily.temperature_2m_max.get(1).unwrap())
- / 2.0;
- let past_tomorrow = (weather.daily.temperature_2m_max.get(2).unwrap()
- + weather.daily.temperature_2m_max.get(2).unwrap())
- / 2.0;
+ let today = (weather.daily.temperature_2m_max[0] + weather.daily.temperature_2m_max[0]) / 2.0;
+ let tomorrow =
+ (weather.daily.temperature_2m_max[1] + weather.daily.temperature_2m_max[1]) / 2.0;
+ let past_tomorrow =
+ (weather.daily.temperature_2m_max[2] + weather.daily.temperature_2m_max[2]) / 2.0;
rsx! {
div { class: "px-6 pt-4 relative",
@@ -117,7 +118,7 @@ fn Forecast(weather: WeatherResponse) -> Element {
#[component]
fn SearchBox(mut country: WriteSignal) -> Element {
let mut input = use_signal(|| "".to_string());
- let locations = use_resource(move || get_locations(input()));
+ let locations = use_loader(move || get_locations(input()));
rsx! {
div {
@@ -145,17 +146,32 @@ fn SearchBox(mut country: WriteSignal) -> Element {
}
}
ul { class: "bg-white border border-gray-100 w-full mt-2 max-h-72 overflow-auto",
- if let Some(Ok(locs)) = locations.read().as_ref() {
- for wl in locs.iter().take(5).cloned() {
- li { class: "pl-8 pr-2 py-1 border-b-2 border-gray-100 relative cursor-pointer hover:bg-yellow-50 hover:text-gray-900",
- onclick: move |_| country.set(wl.clone()),
- MapIcon {}
- b { "{wl.name}" }
- " · {wl.country}"
+ match locations {
+ Ok(locs) if locs.is_empty() => rsx! {
+ li { class: "pl-8 pr-2 py-1 border-b-2 border-gray-100 relative",
+ "No locations found"
+ }
+ },
+ Ok(locs) => rsx! {
+ for wl in locs.read().iter().take(5).cloned() {
+ li { class: "pl-8 pr-2 py-1 border-b-2 border-gray-100 relative cursor-pointer hover:bg-yellow-50 hover:text-gray-900",
+ onclick: move |_| country.set(wl.clone()),
+ MapIcon {}
+ b { "{wl.name}" }
+ " · {wl.country}"
+ }
+ }
+ },
+ Err(Loading::Pending(_)) => rsx! {
+ li { class: "pl-8 pr-2 py-1 border-b-2 border-gray-100 relative",
+ "Searching..."
+ }
+ },
+ Err(Loading::Failed(handle)) => rsx! {
+ li { class: "pl-8 pr-2 py-1 border-b-2 border-gray-100 relative",
+ "Failed to search: {handle.error():?}"
}
}
- } else {
- "loading locations..."
}
}
}
@@ -200,10 +216,11 @@ type WeatherLocations = Vec;
#[derive(Debug, Default, Serialize, Deserialize)]
struct SearchResponse {
+ #[serde(default)]
results: WeatherLocations,
}
-async fn get_locations(input: impl Display) -> reqwest::Result {
+async fn get_locations(input: impl Display) -> Result {
let res = reqwest::get(&format!(
"https://geocoding-api.open-meteo.com/v1/search?name={input}"
))
diff --git a/examples/05-using-async/suspense.rs b/examples/05-using-async/suspense.rs
index dfa8aee32..cf8811bbe 100644
--- a/examples/05-using-async/suspense.rs
+++ b/examples/05-using-async/suspense.rs
@@ -43,8 +43,7 @@ fn Doggo() -> Element {
}
reqwest::get("https://dog.ceo/api/breeds/image/random/")
- .await
- .unwrap()
+ .await?
.json::()
.await
})?;
diff --git a/examples/07-fullstack/auth/src/main.rs b/examples/07-fullstack/auth/src/main.rs
index 30d473dcb..8092f1cc3 100644
--- a/examples/07-fullstack/auth/src/main.rs
+++ b/examples/07-fullstack/auth/src/main.rs
@@ -105,9 +105,9 @@ fn app() -> Element {
"Fetch User Info"
}
- pre { "Logged in: {login.result():?}" }
- pre { "User name: {user_name.result():?}" }
- pre { "Permissions: {permissions.result():?}" }
+ pre { "Logged in: {login.value():?}" }
+ pre { "User name: {user_name.value():?}" }
+ pre { "Permissions: {permissions.value():?}" }
}
}
}
diff --git a/examples/07-fullstack/dog_app_self_hosted.rs b/examples/07-fullstack/dog_app_self_hosted.rs
index 31062ae46..36f91f83c 100644
--- a/examples/07-fullstack/dog_app_self_hosted.rs
+++ b/examples/07-fullstack/dog_app_self_hosted.rs
@@ -22,7 +22,7 @@ fn app() -> Element {
}
}
div {
- match breed.result() {
+ match breed.value() {
None => rsx! { div { "Click the button to fetch a dog!" } },
Some(Err(_e)) => rsx! { div { "Failed to fetch a dog, please try again." } },
Some(Ok(res)) => rsx! { img { max_width: "500px", max_height: "500px", src: "{res}" } },
diff --git a/examples/07-fullstack/handling_errors.rs b/examples/07-fullstack/handling_errors.rs
index b1bc6431f..703f6e7bc 100644
--- a/examples/07-fullstack/handling_errors.rs
+++ b/examples/07-fullstack/handling_errors.rs
@@ -72,12 +72,12 @@ fn main() {
pre { "Dog data: {dog_data.value():#?}" }
pre { "IP data: {ip_data.value():#?}" }
pre { "Custom encoded data: {custom_data.value():#?}" }
- pre { "Error data: {error_data.result():#?}" }
- pre { "Typed error data: {typed_error_data.result():#?}" }
- pre { "HTTP 400 data: {http_error_data.result():#?}" }
- pre { "HTTP 400 (context) data: {http_error_context_data.result():#?}" }
- pre { "Dog error data: {dog_data_err.result():#?}" }
- pre { "Throws ok data: {throws_ok_data.result():#?}" }
+ pre { "Error data: {error_data.value():#?}" }
+ pre { "Typed error data: {typed_error_data.value():#?}" }
+ pre { "HTTP 400 data: {http_error_data.value():#?}" }
+ pre { "HTTP 400 (context) data: {http_error_context_data.value():#?}" }
+ pre { "Dog error data: {dog_data_err.value():#?}" }
+ pre { "Throws ok data: {throws_ok_data.value():#?}" }
}
}
});
diff --git a/examples/07-fullstack/header_map.rs b/examples/07-fullstack/header_map.rs
index cba415b7f..3f187635a 100644
--- a/examples/07-fullstack/header_map.rs
+++ b/examples/07-fullstack/header_map.rs
@@ -21,7 +21,7 @@ fn app() -> Element {
rsx! {
h1 { "Header Map Example" }
button { onclick: move |_| headers.call(), "Get Headers" }
- if let Some(Ok(headers)) = headers.result() {
+ if let Some(Ok(headers)) = headers.value() {
p { "Response from server:" }
pre { "{headers}" }
} else {
diff --git a/examples/07-fullstack/hello-world/src/main.rs b/examples/07-fullstack/hello-world/src/main.rs
index 97eeb9182..9a17f879f 100644
--- a/examples/07-fullstack/hello-world/src/main.rs
+++ b/examples/07-fullstack/hello-world/src/main.rs
@@ -38,7 +38,7 @@ fn app() -> Element {
div { style: "margin: 1rem 0;",
h2 { "Server Greeting" }
button { onclick: move |_| message.call("World".to_string(), 30), "Get Server Greeting" }
- if message.is_pending() {
+ if message.pending() {
p { "Loading..." }
}
p { "{message:#?}" }
diff --git a/examples/07-fullstack/login_form.rs b/examples/07-fullstack/login_form.rs
index d553d7c18..935326d10 100644
--- a/examples/07-fullstack/login_form.rs
+++ b/examples/07-fullstack/login_form.rs
@@ -34,7 +34,7 @@ fn app() -> Element {
},
"Get Sensitive Data",
}
- pre { "Response from locked API: {fetch_sensitive.result():?}"}
+ pre { "Response from locked API: {fetch_sensitive.value():?}"}
form {
onsubmit: move |evt: FormEvent| async move {
// Prevent the browser from navigating away.
diff --git a/examples/07-fullstack/middleware.rs b/examples/07-fullstack/middleware.rs
index 0bd05f187..2f76e31e3 100644
--- a/examples/07-fullstack/middleware.rs
+++ b/examples/07-fullstack/middleware.rs
@@ -37,7 +37,7 @@ fn app() -> Element {
rsx! {
h1 { "Fullstack Middleware Example" }
button { onclick: move |_| per_route.call(), "Fetch Data" }
- pre { "{per_route.result():#?}" }
+ pre { "{per_route.value():#?}" }
}
}
diff --git a/examples/07-fullstack/server_functions.rs b/examples/07-fullstack/server_functions.rs
index 99ead625d..9811376da 100644
--- a/examples/07-fullstack/server_functions.rs
+++ b/examples/07-fullstack/server_functions.rs
@@ -174,13 +174,13 @@ fn app() -> Element {
"Clear results"
}
- pre { "Echo result: {echo_action.result():#?}" }
- pre { "Chat result: {chat_action.result():#?}" }
- pre { "Dog data: {dog_data.result():#?}" }
- pre { "Custom data: {custom_data.result():#?}" }
- pre { "Anonymous: {anonymous_action.result():#?}" }
- pre { "Custom anonymous: {custom_anonymous_action.result():#?}" }
- pre { "Custom response: {custom_response_action.result():#?}" }
+ pre { "Echo result: {echo_action.value():#?}" }
+ pre { "Chat result: {chat_action.value():#?}" }
+ pre { "Dog data: {dog_data.value():#?}" }
+ pre { "Custom data: {custom_data.value():#?}" }
+ pre { "Anonymous: {anonymous_action.value():#?}" }
+ pre { "Custom anonymous: {custom_anonymous_action.value():#?}" }
+ pre { "Custom response: {custom_response_action.value():#?}" }
}
}
}
diff --git a/examples/07-fullstack/server_state.rs b/examples/07-fullstack/server_state.rs
index 5c5ffac48..96ba6e42c 100644
--- a/examples/07-fullstack/server_state.rs
+++ b/examples/07-fullstack/server_state.rs
@@ -108,13 +108,13 @@ fn app() -> Element {
rsx! {
div {
button { onclick: move |_| users.call(), "Get Users" }
- pre { "{users.result():?}" }
+ pre { "{users.value():?}" }
button { onclick: move |_| messages.call(), "Get Messages" }
- pre { "{messages.result():?}" }
+ pre { "{messages.value():?}" }
button { onclick: move |_| broadcast.call(), "Broadcast Message" }
- pre { "{broadcast.result():?}" }
+ pre { "{broadcast.value():?}" }
button { onclick: move |_| add.call(), "Add Message" }
- pre { "{add.result():?}" }
+ pre { "{add.value():?}" }
}
}
}
diff --git a/examples/07-fullstack/ssr-only/src/main.rs b/examples/07-fullstack/ssr-only/src/main.rs
index b04100612..f2f950315 100644
--- a/examples/07-fullstack/ssr-only/src/main.rs
+++ b/examples/07-fullstack/ssr-only/src/main.rs
@@ -36,12 +36,12 @@ fn Home() -> Element {
}
#[component]
-fn Post(id: u32) -> Element {
+fn Post(id: ReadSignal) -> Element {
// You can return `HttpError` to return a specific HTTP status code and message.
// `404 Not Found` will cause the server to return a 404 status code.
//
// `use_loader` will suspend the server-side rendering until the future resolves.
- let post_data = use_loader(move || get_post(id))?;
+ let post_data = use_loader(move || get_post(id()))?;
rsx! {
h1 { "Post {id}" }
diff --git a/examples/07-fullstack/streaming_file_upload.rs b/examples/07-fullstack/streaming_file_upload.rs
index 1aaadeff0..3c9560e32 100644
--- a/examples/07-fullstack/streaming_file_upload.rs
+++ b/examples/07-fullstack/streaming_file_upload.rs
@@ -80,7 +80,7 @@ fn app() -> Element {
},
"Drop files here"
}
- pre { "{upload_as_file_upload.result():?}" }
+ pre { "{upload_as_file_upload.value():?}" }
}
div {
@@ -99,9 +99,9 @@ fn app() -> Element {
div {
h3 { "Download a file from the server" }
button { onclick: move |_| download_file.call(), "Download file" }
- if let Some(Ok(content)) = &download_file.result() {
+ if let Some(Ok(content)) = &download_file.value() {
pre { "{content}" }
- } else if let Some(Err(e)) = &download_file.result() {
+ } else if let Some(Err(e)) = &download_file.value() {
pre { "Error downloading file: {e}" }
}
}
diff --git a/examples/assets/weatherapp.css b/examples/assets/weatherapp.css
new file mode 100644
index 000000000..e9e01796c
--- /dev/null
+++ b/examples/assets/weatherapp.css
@@ -0,0 +1,1523 @@
+/*! tailwindcss v4.1.5 | MIT License | https://tailwindcss.com */
+@layer properties;
+@layer theme, base, components, utilities;
+
+@layer theme {
+
+ :root,
+ :host {
+ --font-sans: ui-sans-serif, system-ui, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol',
+ 'Noto Color Emoji';
+ --font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New',
+ monospace;
+ --color-orange-300: oklch(83.7% 0.128 66.29);
+ --color-orange-400: oklch(75% 0.183 55.934);
+ --color-yellow-50: oklch(98.7% 0.026 102.212);
+ --color-yellow-600: oklch(68.1% 0.162 75.834);
+ --color-green-500: oklch(72.3% 0.219 149.579);
+ --color-blue-300: oklch(80.9% 0.105 251.813);
+ --color-indigo-500: oklch(58.5% 0.233 277.117);
+ --color-indigo-600: oklch(51.1% 0.262 276.966);
+ --color-purple-50: oklch(97.7% 0.014 308.299);
+ --color-purple-500: oklch(62.7% 0.265 303.9);
+ --color-gray-50: oklch(98.5% 0.002 247.839);
+ --color-gray-100: oklch(96.7% 0.003 264.542);
+ --color-gray-200: oklch(92.8% 0.006 264.531);
+ --color-gray-400: oklch(70.7% 0.022 261.325);
+ --color-gray-500: oklch(55.1% 0.027 264.364);
+ --color-gray-600: oklch(44.6% 0.03 256.802);
+ --color-gray-700: oklch(37.3% 0.034 259.733);
+ --color-gray-800: oklch(27.8% 0.033 256.848);
+ --color-gray-900: oklch(21% 0.034 264.665);
+ --color-white: #fff;
+ --spacing: 0.25rem;
+ --container-sm: 24rem;
+ --container-md: 28rem;
+ --container-xl: 36rem;
+ --container-2xl: 42rem;
+ --text-xs: 0.75rem;
+ --text-xs--line-height: calc(1 / 0.75);
+ --text-xl: 1.25rem;
+ --text-xl--line-height: calc(1.75 / 1.25);
+ --text-2xl: 1.5rem;
+ --text-2xl--line-height: calc(2 / 1.5);
+ --text-3xl: 1.875rem;
+ --text-3xl--line-height: calc(2.25 / 1.875);
+ --text-5xl: 3rem;
+ --text-5xl--line-height: 1;
+ --text-6xl: 3.75rem;
+ --text-6xl--line-height: 1;
+ --font-weight-medium: 500;
+ --font-weight-semibold: 600;
+ --font-weight-bold: 700;
+ --radius-md: 0.375rem;
+ --radius-lg: 0.5rem;
+ --default-transition-duration: 150ms;
+ --default-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
+ --default-font-family: var(--font-sans);
+ --default-mono-font-family: var(--font-mono);
+ }
+}
+
+@layer base {
+
+ *,
+ ::after,
+ ::before,
+ ::backdrop,
+ ::file-selector-button {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+ border: 0 solid;
+ }
+
+ html,
+ :host {
+ line-height: 1.5;
+ -webkit-text-size-adjust: 100%;
+ tab-size: 4;
+ font-family: var(--default-font-family, ui-sans-serif, system-ui, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji');
+ font-feature-settings: var(--default-font-feature-settings, normal);
+ font-variation-settings: var(--default-font-variation-settings, normal);
+ -webkit-tap-highlight-color: transparent;
+ }
+
+ hr {
+ height: 0;
+ color: inherit;
+ border-top-width: 1px;
+ }
+
+ abbr:where([title]) {
+ -webkit-text-decoration: underline dotted;
+ text-decoration: underline dotted;
+ }
+
+ h1,
+ h2,
+ h3,
+ h4,
+ h5,
+ h6 {
+ font-size: inherit;
+ font-weight: inherit;
+ }
+
+ a {
+ color: inherit;
+ -webkit-text-decoration: inherit;
+ text-decoration: inherit;
+ }
+
+ b,
+ strong {
+ font-weight: bolder;
+ }
+
+ code,
+ kbd,
+ samp,
+ pre {
+ font-family: var(--default-mono-font-family, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace);
+ font-feature-settings: var(--default-mono-font-feature-settings, normal);
+ font-variation-settings: var(--default-mono-font-variation-settings, normal);
+ font-size: 1em;
+ }
+
+ small {
+ font-size: 80%;
+ }
+
+ sub,
+ sup {
+ font-size: 75%;
+ line-height: 0;
+ position: relative;
+ vertical-align: baseline;
+ }
+
+ sub {
+ bottom: -0.25em;
+ }
+
+ sup {
+ top: -0.5em;
+ }
+
+ table {
+ text-indent: 0;
+ border-color: inherit;
+ border-collapse: collapse;
+ }
+
+ :-moz-focusring {
+ outline: auto;
+ }
+
+ progress {
+ vertical-align: baseline;
+ }
+
+ summary {
+ display: list-item;
+ }
+
+ ol,
+ ul,
+ menu {
+ list-style: none;
+ }
+
+ img,
+ svg,
+ video,
+ canvas,
+ audio,
+ iframe,
+ embed,
+ object {
+ display: block;
+ vertical-align: middle;
+ }
+
+ img,
+ video {
+ max-width: 100%;
+ height: auto;
+ }
+
+ button,
+ input,
+ select,
+ optgroup,
+ textarea,
+ ::file-selector-button {
+ font: inherit;
+ font-feature-settings: inherit;
+ font-variation-settings: inherit;
+ letter-spacing: inherit;
+ color: inherit;
+ border-radius: 0;
+ background-color: transparent;
+ opacity: 1;
+ }
+
+ :where(select:is([multiple], [size])) optgroup {
+ font-weight: bolder;
+ }
+
+ :where(select:is([multiple], [size])) optgroup option {
+ padding-inline-start: 20px;
+ }
+
+ ::file-selector-button {
+ margin-inline-end: 4px;
+ }
+
+ ::placeholder {
+ opacity: 1;
+ }
+
+ @supports (not (-webkit-appearance: -apple-pay-button)) or (contain-intrinsic-size: 1px) {
+ ::placeholder {
+ color: currentcolor;
+
+ @supports (color: color-mix(in lab, red, red)) {
+ color: color-mix(in oklab, currentcolor 50%, transparent);
+ }
+ }
+ }
+
+ textarea {
+ resize: vertical;
+ }
+
+ ::-webkit-search-decoration {
+ -webkit-appearance: none;
+ }
+
+ ::-webkit-date-and-time-value {
+ min-height: 1lh;
+ text-align: inherit;
+ }
+
+ ::-webkit-datetime-edit {
+ display: inline-flex;
+ }
+
+ ::-webkit-datetime-edit-fields-wrapper {
+ padding: 0;
+ }
+
+ ::-webkit-datetime-edit,
+ ::-webkit-datetime-edit-year-field,
+ ::-webkit-datetime-edit-month-field,
+ ::-webkit-datetime-edit-day-field,
+ ::-webkit-datetime-edit-hour-field,
+ ::-webkit-datetime-edit-minute-field,
+ ::-webkit-datetime-edit-second-field,
+ ::-webkit-datetime-edit-millisecond-field,
+ ::-webkit-datetime-edit-meridiem-field {
+ padding-block: 0;
+ }
+
+ :-moz-ui-invalid {
+ box-shadow: none;
+ }
+
+ button,
+ input:where([type='button'], [type='reset'], [type='submit']),
+ ::file-selector-button {
+ appearance: button;
+ }
+
+ ::-webkit-inner-spin-button,
+ ::-webkit-outer-spin-button {
+ height: auto;
+ }
+
+ [hidden]:where(:not([hidden='until-found'])) {
+ display: none !important;
+ }
+}
+
+@layer utilities {
+ .visible {
+ visibility: visible;
+ }
+
+ .absolute {
+ position: absolute;
+ }
+
+ .fixed {
+ position: fixed;
+ }
+
+ .relative {
+ position: relative;
+ }
+
+ .static {
+ position: static;
+ }
+
+ .inset-0 {
+ inset: calc(var(--spacing) * 0);
+ }
+
+ .top-0 {
+ top: calc(var(--spacing) * 0);
+ }
+
+ .top-1\/2 {
+ top: calc(1/2 * 100%);
+ }
+
+ .top-2 {
+ top: calc(var(--spacing) * 2);
+ }
+
+ .top-3\.5 {
+ top: calc(var(--spacing) * 3.5);
+ }
+
+ .right-0 {
+ right: calc(var(--spacing) * 0);
+ }
+
+ .bottom-0 {
+ bottom: calc(var(--spacing) * 0);
+ }
+
+ .left-0 {
+ left: calc(var(--spacing) * 0);
+ }
+
+ .left-2 {
+ left: calc(var(--spacing) * 2);
+ }
+
+ .left-2\.5 {
+ left: calc(var(--spacing) * 2.5);
+ }
+
+ .isolate {
+ isolation: isolate;
+ }
+
+ .z-50 {
+ z-index: 50;
+ }
+
+ .container {
+ width: 100%;
+
+ @media (width >=40rem) {
+ max-width: 40rem;
+ }
+
+ @media (width >=48rem) {
+ max-width: 48rem;
+ }
+
+ @media (width >=64rem) {
+ max-width: 64rem;
+ }
+
+ @media (width >=80rem) {
+ max-width: 80rem;
+ }
+
+ @media (width >=96rem) {
+ max-width: 96rem;
+ }
+ }
+
+ .m-0 {
+ margin: calc(var(--spacing) * 0);
+ }
+
+ .m-2 {
+ margin: calc(var(--spacing) * 2);
+ }
+
+ .-mx-4 {
+ margin-inline: calc(var(--spacing) * -4);
+ }
+
+ .mx-2 {
+ margin-inline: calc(var(--spacing) * 2);
+ }
+
+ .mx-4 {
+ margin-inline: calc(var(--spacing) * 4);
+ }
+
+ .mx-8 {
+ margin-inline: calc(var(--spacing) * 8);
+ }
+
+ .mx-auto {
+ margin-inline: auto;
+ }
+
+ .my-1 {
+ margin-block: calc(var(--spacing) * 1);
+ }
+
+ .mt-2 {
+ margin-top: calc(var(--spacing) * 2);
+ }
+
+ .mt-4 {
+ margin-top: calc(var(--spacing) * 4);
+ }
+
+ .mr-1 {
+ margin-right: calc(var(--spacing) * 1);
+ }
+
+ .mr-2 {
+ margin-right: calc(var(--spacing) * 2);
+ }
+
+ .mr-3 {
+ margin-right: calc(var(--spacing) * 3);
+ }
+
+ .mr-6 {
+ margin-right: calc(var(--spacing) * 6);
+ }
+
+ .mr-8 {
+ margin-right: calc(var(--spacing) * 8);
+ }
+
+ .mr-10 {
+ margin-right: calc(var(--spacing) * 10);
+ }
+
+ .mr-12 {
+ margin-right: calc(var(--spacing) * 12);
+ }
+
+ .mr-14 {
+ margin-right: calc(var(--spacing) * 14);
+ }
+
+ .mr-16 {
+ margin-right: calc(var(--spacing) * 16);
+ }
+
+ .mr-auto {
+ margin-right: auto;
+ }
+
+ .mb-0 {
+ margin-bottom: calc(var(--spacing) * 0);
+ }
+
+ .mb-4 {
+ margin-bottom: calc(var(--spacing) * 4);
+ }
+
+ .mb-6 {
+ margin-bottom: calc(var(--spacing) * 6);
+ }
+
+ .mb-8 {
+ margin-bottom: calc(var(--spacing) * 8);
+ }
+
+ .mb-10 {
+ margin-bottom: calc(var(--spacing) * 10);
+ }
+
+ .mb-12 {
+ margin-bottom: calc(var(--spacing) * 12);
+ }
+
+ .mb-14 {
+ margin-bottom: calc(var(--spacing) * 14);
+ }
+
+ .mb-16 {
+ margin-bottom: calc(var(--spacing) * 16);
+ }
+
+ .mb-24 {
+ margin-bottom: calc(var(--spacing) * 24);
+ }
+
+ .ml-8 {
+ margin-left: calc(var(--spacing) * 8);
+ }
+
+ .block {
+ display: block;
+ }
+
+ .contents {
+ display: contents;
+ }
+
+ .flex {
+ display: flex;
+ }
+
+ .hidden {
+ display: none;
+ }
+
+ .inline-block {
+ display: inline-block;
+ }
+
+ .inline-flex {
+ display: inline-flex;
+ }
+
+ .table {
+ display: table;
+ }
+
+ .h-2 {
+ height: calc(var(--spacing) * 2);
+ }
+
+ .h-4 {
+ height: calc(var(--spacing) * 4);
+ }
+
+ .h-6 {
+ height: calc(var(--spacing) * 6);
+ }
+
+ .h-8 {
+ height: calc(var(--spacing) * 8);
+ }
+
+ .h-9 {
+ height: calc(var(--spacing) * 9);
+ }
+
+ .h-40 {
+ height: calc(var(--spacing) * 40);
+ }
+
+ .h-full {
+ height: 100%;
+ }
+
+ .h-px {
+ height: 1px;
+ }
+
+ .h-screen {
+ height: 100vh;
+ }
+
+ .max-h-72 {
+ max-height: calc(var(--spacing) * 72);
+ }
+
+ .w-1\/2 {
+ width: calc(1/2 * 100%);
+ }
+
+ .w-1\/4 {
+ width: calc(1/4 * 100%);
+ }
+
+ .w-1\/6 {
+ width: calc(1/6 * 100%);
+ }
+
+ .w-2 {
+ width: calc(var(--spacing) * 2);
+ }
+
+ .w-4 {
+ width: calc(var(--spacing) * 4);
+ }
+
+ .w-5\/6 {
+ width: calc(5/6 * 100%);
+ }
+
+ .w-6 {
+ width: calc(var(--spacing) * 6);
+ }
+
+ .w-8 {
+ width: calc(var(--spacing) * 8);
+ }
+
+ .w-12 {
+ width: calc(var(--spacing) * 12);
+ }
+
+ .w-16 {
+ width: calc(var(--spacing) * 16);
+ }
+
+ .w-30 {
+ width: calc(var(--spacing) * 30);
+ }
+
+ .w-full {
+ width: 100%;
+ }
+
+ .max-w-2xl {
+ max-width: var(--container-2xl);
+ }
+
+ .max-w-md {
+ max-width: var(--container-md);
+ }
+
+ .max-w-sm {
+ max-width: var(--container-sm);
+ }
+
+ .max-w-xl {
+ max-width: var(--container-xl);
+ }
+
+ .min-w-0 {
+ min-width: calc(var(--spacing) * 0);
+ }
+
+ .shrink-0 {
+ flex-shrink: 0;
+ }
+
+ .table-auto {
+ table-layout: auto;
+ }
+
+ .translate-1\/2 {
+ --tw-translate-x: calc(1/2 * 100%);
+ --tw-translate-y: calc(1/2 * 100%);
+ translate: var(--tw-translate-x) var(--tw-translate-y);
+ }
+
+ .transform {
+ transform: var(--tw-rotate-x, ) var(--tw-rotate-y, ) var(--tw-rotate-z, ) var(--tw-skew-x, ) var(--tw-skew-y, );
+ }
+
+ .cursor-pointer {
+ cursor: pointer;
+ }
+
+ .flex-col {
+ flex-direction: column;
+ }
+
+ .flex-row {
+ flex-direction: row;
+ }
+
+ .flex-wrap {
+ flex-wrap: wrap;
+ }
+
+ .place-items-center {
+ place-items: center;
+ }
+
+ .items-center {
+ align-items: center;
+ }
+
+ .items-start {
+ align-items: flex-start;
+ }
+
+ .justify-between {
+ justify-content: space-between;
+ }
+
+ .justify-center {
+ justify-content: center;
+ }
+
+ .self-center {
+ align-self: center;
+ }
+
+ .overflow-auto {
+ overflow: auto;
+ }
+
+ .overflow-hidden {
+ overflow: hidden;
+ }
+
+ .overflow-x-auto {
+ overflow-x: auto;
+ }
+
+ .overflow-y-auto {
+ overflow-y: auto;
+ }
+
+ .rounded {
+ border-radius: 0.25rem;
+ }
+
+ .rounded-full {
+ border-radius: calc(infinity * 1px);
+ }
+
+ .rounded-lg {
+ border-radius: var(--radius-lg);
+ }
+
+ .rounded-md {
+ border-radius: var(--radius-md);
+ }
+
+ .border {
+ border-style: var(--tw-border-style);
+ border-width: 1px;
+ }
+
+ .border-0 {
+ border-style: var(--tw-border-style);
+ border-width: 0px;
+ }
+
+ .border-r {
+ border-right-style: var(--tw-border-style);
+ border-right-width: 1px;
+ }
+
+ .border-b {
+ border-bottom-style: var(--tw-border-style);
+ border-bottom-width: 1px;
+ }
+
+ .border-b-2 {
+ border-bottom-style: var(--tw-border-style);
+ border-bottom-width: 2px;
+ }
+
+ .border-l {
+ border-left-style: var(--tw-border-style);
+ border-left-width: 1px;
+ }
+
+ .border-gray-100 {
+ border-color: var(--color-gray-100);
+ }
+
+ .border-gray-200 {
+ border-color: var(--color-gray-200);
+ }
+
+ .border-transparent {
+ border-color: transparent;
+ }
+
+ .bg-gray-50 {
+ background-color: var(--color-gray-50);
+ }
+
+ .bg-gray-100 {
+ background-color: var(--color-gray-100);
+ }
+
+ .bg-gray-200 {
+ background-color: var(--color-gray-200);
+ }
+
+ .bg-gray-800 {
+ background-color: var(--color-gray-800);
+ }
+
+ .bg-gray-900 {
+ background-color: var(--color-gray-900);
+ }
+
+ .bg-green-500 {
+ background-color: var(--color-green-500);
+ }
+
+ .bg-indigo-500 {
+ background-color: var(--color-indigo-500);
+ }
+
+ .bg-orange-300 {
+ background-color: var(--color-orange-300);
+ }
+
+ .bg-purple-50 {
+ background-color: var(--color-purple-50);
+ }
+
+ .bg-white {
+ background-color: var(--color-white);
+ }
+
+ .stroke-current {
+ stroke: currentcolor;
+ }
+
+ .object-cover {
+ object-fit: cover;
+ }
+
+ .object-scale-down {
+ object-fit: scale-down;
+ }
+
+ .p-2 {
+ padding: calc(var(--spacing) * 2);
+ }
+
+ .p-4 {
+ padding: calc(var(--spacing) * 4);
+ }
+
+ .p-10 {
+ padding: calc(var(--spacing) * 10);
+ }
+
+ .px-2 {
+ padding-inline: calc(var(--spacing) * 2);
+ }
+
+ .px-4 {
+ padding-inline: calc(var(--spacing) * 4);
+ }
+
+ .px-6 {
+ padding-inline: calc(var(--spacing) * 6);
+ }
+
+ .px-8 {
+ padding-inline: calc(var(--spacing) * 8);
+ }
+
+ .px-10 {
+ padding-inline: calc(var(--spacing) * 10);
+ }
+
+ .px-12 {
+ padding-inline: calc(var(--spacing) * 12);
+ }
+
+ .py-1 {
+ padding-block: calc(var(--spacing) * 1);
+ }
+
+ .py-2 {
+ padding-block: calc(var(--spacing) * 2);
+ }
+
+ .py-3 {
+ padding-block: calc(var(--spacing) * 3);
+ }
+
+ .py-4 {
+ padding-block: calc(var(--spacing) * 4);
+ }
+
+ .py-5 {
+ padding-block: calc(var(--spacing) * 5);
+ }
+
+ .py-6 {
+ padding-block: calc(var(--spacing) * 6);
+ }
+
+ .py-8 {
+ padding-block: calc(var(--spacing) * 8);
+ }
+
+ .py-20 {
+ padding-block: calc(var(--spacing) * 20);
+ }
+
+ .pt-4 {
+ padding-top: calc(var(--spacing) * 4);
+ }
+
+ .pr-2 {
+ padding-right: calc(var(--spacing) * 2);
+ }
+
+ .pr-10 {
+ padding-right: calc(var(--spacing) * 10);
+ }
+
+ .pb-3 {
+ padding-bottom: calc(var(--spacing) * 3);
+ }
+
+ .pb-10 {
+ padding-bottom: calc(var(--spacing) * 10);
+ }
+
+ .pl-4 {
+ padding-left: calc(var(--spacing) * 4);
+ }
+
+ .pl-6 {
+ padding-left: calc(var(--spacing) * 6);
+ }
+
+ .pl-8 {
+ padding-left: calc(var(--spacing) * 8);
+ }
+
+ .text-center {
+ text-align: center;
+ }
+
+ .text-left {
+ text-align: left;
+ }
+
+ .text-2xl {
+ font-size: var(--text-2xl);
+ line-height: var(--tw-leading, var(--text-2xl--line-height));
+ }
+
+ .text-3xl {
+ font-size: var(--text-3xl);
+ line-height: var(--tw-leading, var(--text-3xl--line-height));
+ }
+
+ .text-5xl {
+ font-size: var(--text-5xl);
+ line-height: var(--tw-leading, var(--text-5xl--line-height));
+ }
+
+ .text-xl {
+ font-size: var(--text-xl);
+ line-height: var(--tw-leading, var(--text-xl--line-height));
+ }
+
+ .text-xs {
+ font-size: var(--text-xs);
+ line-height: var(--tw-leading, var(--text-xs--line-height));
+ }
+
+ .font-bold {
+ --tw-font-weight: var(--font-weight-bold);
+ font-weight: var(--font-weight-bold);
+ }
+
+ .font-medium {
+ --tw-font-weight: var(--font-weight-medium);
+ font-weight: var(--font-weight-medium);
+ }
+
+ .font-semibold {
+ --tw-font-weight: var(--font-weight-semibold);
+ font-weight: var(--font-weight-semibold);
+ }
+
+ .break-words {
+ overflow-wrap: break-word;
+ }
+
+ .text-ellipsis {
+ text-overflow: ellipsis;
+ }
+
+ .text-blue-300 {
+ color: var(--color-blue-300);
+ }
+
+ .text-gray-400 {
+ color: var(--color-gray-400);
+ }
+
+ .text-gray-500 {
+ color: var(--color-gray-500);
+ }
+
+ .text-gray-600 {
+ color: var(--color-gray-600);
+ }
+
+ .text-purple-500 {
+ color: var(--color-purple-500);
+ }
+
+ .text-white {
+ color: var(--color-white);
+ }
+
+ .uppercase {
+ text-transform: uppercase;
+ }
+
+ .placeholder-gray-400 {
+ &::placeholder {
+ color: var(--color-gray-400);
+ }
+ }
+
+ .opacity-25 {
+ opacity: 25%;
+ }
+
+ .shadow {
+ --tw-shadow: 0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1));
+ box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
+ }
+
+ .shadow-2xl {
+ --tw-shadow: 0 25px 50px -12px var(--tw-shadow-color, rgb(0 0 0 / 0.25));
+ box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
+ }
+
+ .shadow-lg {
+ --tw-shadow: 0 10px 15px -3px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 4px 6px -4px var(--tw-shadow-color, rgb(0 0 0 / 0.1));
+ box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
+ }
+
+ .shadow-sm {
+ --tw-shadow: 0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1));
+ box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
+ }
+
+ .ring-1 {
+ --tw-ring-shadow: var(--tw-ring-inset, ) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);
+ box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
+ }
+
+ .filter {
+ filter: var(--tw-blur, ) var(--tw-brightness, ) var(--tw-contrast, ) var(--tw-grayscale, ) var(--tw-hue-rotate, ) var(--tw-invert, ) var(--tw-saturate, ) var(--tw-sepia, ) var(--tw-drop-shadow, );
+ }
+
+ .transition {
+ transition-property: color, background-color, border-color, outline-color, text-decoration-color, fill, stroke, --tw-gradient-from, --tw-gradient-via, --tw-gradient-to, opacity, box-shadow, transform, translate, scale, rotate, filter, -webkit-backdrop-filter, backdrop-filter, display, visibility, content-visibility, overlay, pointer-events;
+ transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));
+ transition-duration: var(--tw-duration, var(--default-transition-duration));
+ }
+
+ .transition-all {
+ transition-property: all;
+ transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));
+ transition-duration: var(--tw-duration, var(--default-transition-duration));
+ }
+
+ .duration-200 {
+ --tw-duration: 200ms;
+ transition-duration: 200ms;
+ }
+
+ .hover\:bg-indigo-600 {
+ &:hover {
+ @media (hover: hover) {
+ background-color: var(--color-indigo-600);
+ }
+ }
+ }
+
+ .hover\:bg-orange-400 {
+ &:hover {
+ @media (hover: hover) {
+ background-color: var(--color-orange-400);
+ }
+ }
+ }
+
+ .hover\:bg-yellow-50 {
+ &:hover {
+ @media (hover: hover) {
+ background-color: var(--color-yellow-50);
+ }
+ }
+ }
+
+ .hover\:text-gray-600 {
+ &:hover {
+ @media (hover: hover) {
+ color: var(--color-gray-600);
+ }
+ }
+ }
+
+ .hover\:text-gray-700 {
+ &:hover {
+ @media (hover: hover) {
+ color: var(--color-gray-700);
+ }
+ }
+ }
+
+ .hover\:text-gray-900 {
+ &:hover {
+ @media (hover: hover) {
+ color: var(--color-gray-900);
+ }
+ }
+ }
+
+ .hover\:shadow-2xl {
+ &:hover {
+ @media (hover: hover) {
+ --tw-shadow: 0 25px 50px -12px var(--tw-shadow-color, rgb(0 0 0 / 0.25));
+ box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
+ }
+ }
+ }
+
+ .hover\:ring-4 {
+ &:hover {
+ @media (hover: hover) {
+ --tw-ring-shadow: var(--tw-ring-inset, ) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);
+ box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
+ }
+ }
+ }
+
+ .focus\:border-blue-300 {
+ &:focus {
+ border-color: var(--color-blue-300);
+ }
+ }
+
+ .focus\:border-transparent {
+ &:focus {
+ border-color: transparent;
+ }
+ }
+
+ .focus\:bg-white {
+ &:focus {
+ background-color: var(--color-white);
+ }
+ }
+
+ .focus\:ring-2 {
+ &:focus {
+ --tw-ring-shadow: var(--tw-ring-inset, ) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);
+ box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
+ }
+ }
+
+ .focus\:ring-blue-300 {
+ &:focus {
+ --tw-ring-color: var(--color-blue-300);
+ }
+ }
+
+ .focus\:ring-transparent {
+ &:focus {
+ --tw-ring-color: transparent;
+ }
+ }
+
+ .focus\:ring-yellow-600 {
+ &:focus {
+ --tw-ring-color: var(--color-yellow-600);
+ }
+ }
+
+ .focus\:outline-hidden {
+ &:focus {
+ --tw-outline-style: none;
+ outline-style: none;
+
+ @media (forced-colors: active) {
+ outline: 2px solid transparent;
+ outline-offset: 2px;
+ }
+ }
+ }
+
+ .focus\:outline-none {
+ &:focus {
+ --tw-outline-style: none;
+ outline-style: none;
+ }
+ }
+
+ .md\:mb-0 {
+ @media (width >=48rem) {
+ margin-bottom: calc(var(--spacing) * 0);
+ }
+ }
+
+ .md\:w-1\/2 {
+ @media (width >=48rem) {
+ width: calc(1/2 * 100%);
+ }
+ }
+
+ .md\:w-auto {
+ @media (width >=48rem) {
+ width: auto;
+ }
+ }
+
+ .md\:text-right {
+ @media (width >=48rem) {
+ text-align: right;
+ }
+ }
+
+ .md\:text-6xl {
+ @media (width >=48rem) {
+ font-size: var(--text-6xl);
+ line-height: var(--tw-leading, var(--text-6xl--line-height));
+ }
+ }
+
+ .lg\:pl-20 {
+ @media (width >=64rem) {
+ padding-left: calc(var(--spacing) * 20);
+ }
+ }
+
+ .xl\:mx-auto {
+ @media (width >=80rem) {
+ margin-inline: auto;
+ }
+ }
+
+ .xl\:mb-0 {
+ @media (width >=80rem) {
+ margin-bottom: calc(var(--spacing) * 0);
+ }
+ }
+
+ .xl\:block {
+ @media (width >=80rem) {
+ display: block;
+ }
+ }
+
+ .xl\:flex {
+ @media (width >=80rem) {
+ display: flex;
+ }
+ }
+
+ .xl\:hidden {
+ @media (width >=80rem) {
+ display: none;
+ }
+ }
+
+ .xl\:inline-block {
+ @media (width >=80rem) {
+ display: inline-block;
+ }
+ }
+
+ .xl\:w-2\/3 {
+ @media (width >=80rem) {
+ width: calc(2/3 * 100%);
+ }
+ }
+
+ .dark\:bg-gray-600 {
+ @media (prefers-color-scheme: dark) {
+ background-color: var(--color-gray-600);
+ }
+ }
+}
+
+@property --tw-translate-x {
+ syntax: "*";
+ inherits: false;
+ initial-value: 0;
+}
+
+@property --tw-translate-y {
+ syntax: "*";
+ inherits: false;
+ initial-value: 0;
+}
+
+@property --tw-translate-z {
+ syntax: "*";
+ inherits: false;
+ initial-value: 0;
+}
+
+@property --tw-rotate-x {
+ syntax: "*";
+ inherits: false;
+}
+
+@property --tw-rotate-y {
+ syntax: "*";
+ inherits: false;
+}
+
+@property --tw-rotate-z {
+ syntax: "*";
+ inherits: false;
+}
+
+@property --tw-skew-x {
+ syntax: "*";
+ inherits: false;
+}
+
+@property --tw-skew-y {
+ syntax: "*";
+ inherits: false;
+}
+
+@property --tw-border-style {
+ syntax: "*";
+ inherits: false;
+ initial-value: solid;
+}
+
+@property --tw-font-weight {
+ syntax: "*";
+ inherits: false;
+}
+
+@property --tw-shadow {
+ syntax: "*";
+ inherits: false;
+ initial-value: 0 0 #0000;
+}
+
+@property --tw-shadow-color {
+ syntax: "*";
+ inherits: false;
+}
+
+@property --tw-shadow-alpha {
+ syntax: "";
+ inherits: false;
+ initial-value: 100%;
+}
+
+@property --tw-inset-shadow {
+ syntax: "*";
+ inherits: false;
+ initial-value: 0 0 #0000;
+}
+
+@property --tw-inset-shadow-color {
+ syntax: "*";
+ inherits: false;
+}
+
+@property --tw-inset-shadow-alpha {
+ syntax: "";
+ inherits: false;
+ initial-value: 100%;
+}
+
+@property --tw-ring-color {
+ syntax: "*";
+ inherits: false;
+}
+
+@property --tw-ring-shadow {
+ syntax: "*";
+ inherits: false;
+ initial-value: 0 0 #0000;
+}
+
+@property --tw-inset-ring-color {
+ syntax: "*";
+ inherits: false;
+}
+
+@property --tw-inset-ring-shadow {
+ syntax: "*";
+ inherits: false;
+ initial-value: 0 0 #0000;
+}
+
+@property --tw-ring-inset {
+ syntax: "*";
+ inherits: false;
+}
+
+@property --tw-ring-offset-width {
+ syntax: "";
+ inherits: false;
+ initial-value: 0px;
+}
+
+@property --tw-ring-offset-color {
+ syntax: "*";
+ inherits: false;
+ initial-value: #fff;
+}
+
+@property --tw-ring-offset-shadow {
+ syntax: "*";
+ inherits: false;
+ initial-value: 0 0 #0000;
+}
+
+@property --tw-blur {
+ syntax: "*";
+ inherits: false;
+}
+
+@property --tw-brightness {
+ syntax: "*";
+ inherits: false;
+}
+
+@property --tw-contrast {
+ syntax: "*";
+ inherits: false;
+}
+
+@property --tw-grayscale {
+ syntax: "*";
+ inherits: false;
+}
+
+@property --tw-hue-rotate {
+ syntax: "*";
+ inherits: false;
+}
+
+@property --tw-invert {
+ syntax: "*";
+ inherits: false;
+}
+
+@property --tw-opacity {
+ syntax: "*";
+ inherits: false;
+}
+
+@property --tw-saturate {
+ syntax: "*";
+ inherits: false;
+}
+
+@property --tw-sepia {
+ syntax: "*";
+ inherits: false;
+}
+
+@property --tw-drop-shadow {
+ syntax: "*";
+ inherits: false;
+}
+
+@property --tw-drop-shadow-color {
+ syntax: "*";
+ inherits: false;
+}
+
+@property --tw-drop-shadow-alpha {
+ syntax: "";
+ inherits: false;
+ initial-value: 100%;
+}
+
+@property --tw-drop-shadow-size {
+ syntax: "*";
+ inherits: false;
+}
+
+@property --tw-duration {
+ syntax: "*";
+ inherits: false;
+}
+
+@layer properties {
+ @supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))) {
+
+ *,
+ ::before,
+ ::after,
+ ::backdrop {
+ --tw-translate-x: 0;
+ --tw-translate-y: 0;
+ --tw-translate-z: 0;
+ --tw-rotate-x: initial;
+ --tw-rotate-y: initial;
+ --tw-rotate-z: initial;
+ --tw-skew-x: initial;
+ --tw-skew-y: initial;
+ --tw-border-style: solid;
+ --tw-font-weight: initial;
+ --tw-shadow: 0 0 #0000;
+ --tw-shadow-color: initial;
+ --tw-shadow-alpha: 100%;
+ --tw-inset-shadow: 0 0 #0000;
+ --tw-inset-shadow-color: initial;
+ --tw-inset-shadow-alpha: 100%;
+ --tw-ring-color: initial;
+ --tw-ring-shadow: 0 0 #0000;
+ --tw-inset-ring-color: initial;
+ --tw-inset-ring-shadow: 0 0 #0000;
+ --tw-ring-inset: initial;
+ --tw-ring-offset-width: 0px;
+ --tw-ring-offset-color: #fff;
+ --tw-ring-offset-shadow: 0 0 #0000;
+ --tw-blur: initial;
+ --tw-brightness: initial;
+ --tw-contrast: initial;
+ --tw-grayscale: initial;
+ --tw-hue-rotate: initial;
+ --tw-invert: initial;
+ --tw-opacity: initial;
+ --tw-saturate: initial;
+ --tw-sepia: initial;
+ --tw-drop-shadow: initial;
+ --tw-drop-shadow-color: initial;
+ --tw-drop-shadow-alpha: 100%;
+ --tw-drop-shadow-size: initial;
+ --tw-duration: initial;
+ }
+ }
+}
diff --git a/packages/fullstack-core/src/loader.rs b/packages/fullstack-core/src/loader.rs
index e8e802934..dccb80878 100644
--- a/packages/fullstack-core/src/loader.rs
+++ b/packages/fullstack-core/src/loader.rs
@@ -1,17 +1,14 @@
-use dioxus_core::{
- spawn, use_hook, Callback, IntoAttributeValue, IntoDynNode, ReactiveContext, Subscribers, Task,
-};
+use dioxus_core::{use_hook, IntoAttributeValue, IntoDynNode, Subscribers};
use dioxus_core::{CapturedError, RenderError, Result, SuspendedFuture};
-use dioxus_hooks::{use_callback, use_signal};
+use dioxus_hooks::{use_resource, use_signal, Resource};
use dioxus_signals::{
read_impls, ReadSignal, Readable, ReadableBoxExt, ReadableExt, ReadableRef, Signal, Writable,
WritableExt, WriteLock,
};
-use futures_util::{future, pin_mut, FutureExt, StreamExt};
use generational_box::{BorrowResult, UnsyncStorage};
use serde::{de::DeserializeOwned, Serialize};
-use std::future::Future;
-use std::{cell::Cell, ops::Deref, rc::Rc};
+use std::ops::Deref;
+use std::{cmp::PartialEq, future::Future};
/// A hook to create a resource that loads data asynchronously.
///
@@ -35,105 +32,118 @@ use std::{cell::Cell, ops::Deref, rc::Rc};
pub fn use_loader(mut future: impl FnMut() -> F + 'static) -> Result, Loading>
where
F: Future
+
+
+