Docs Components Commerce

CouponInput

React example follows below.
ts
import * as React from "react";
const couponInputFixture = {
id: "coupon-input",
placeholder: "Promo code",
validCode: "GRASSROOT",
appliedMessage: "10% off applied.",
errorMessage: "Try GRASSROOT.",
} satisfies {
id: string;
placeholder: string;
validCode: string;
appliedMessage: string;
errorMessage: string;
};
import { CouponInput } from "@grassroot/ui-react";
export default function CouponInputDemo() {
const [status, setStatus] = React.useState<"idle" | "applied" | "error">("idle");
const [message, setMessage] = React.useState<string | undefined>(undefined);
return (
<div>
<CouponInput
status={status}
message={message}
placeholder={couponInputFixture.placeholder}
onApply={(code) => {
const ok = code.trim().toUpperCase() === couponInputFixture.validCode;
setStatus(ok ? "applied" : "error");
setMessage(ok ? couponInputFixture.appliedMessage : couponInputFixture.errorMessage);
}}
/>
</div>
);
}
ts
<script setup lang="ts">
import { ref } from "vue";
const couponInputFixture = {
id: "coupon-input",
placeholder: "Promo code",
validCode: "GRASSROOT",
appliedMessage: "10% off applied.",
errorMessage: "Try GRASSROOT.",
} satisfies {
id: string;
placeholder: string;
validCode: string;
appliedMessage: string;
errorMessage: string;
};
import { CouponInput } from "@grassroot/ui-vue";
const status = ref<"idle" | "applied" | "error">("idle");
const message = ref<string | undefined>(undefined);
</script>
<template>
<div>
<CouponInput
:status="status"
:message="message"
:placeholder="couponInputFixture.placeholder"
@apply="
(code) => {
const ok = code.trim().toUpperCase() === couponInputFixture.validCode;
status = ok ? 'applied' : 'error';
message = ok ? couponInputFixture.appliedMessage : couponInputFixture.errorMessage;
}
"
/>
</div>
</template>
ts
import { Component, signal } from "@angular/core";
const couponInputFixture = {
id: "coupon-input",
placeholder: "Promo code",
validCode: "GRASSROOT",
appliedMessage: "10% off applied.",
errorMessage: "Try GRASSROOT.",
} satisfies {
id: string;
placeholder: string;
validCode: string;
appliedMessage: string;
errorMessage: string;
};
import { GrassrootCouponInput } from "@grassroot/ui-angular";
@Component({
selector: "app-coupon-input-demo",
standalone: true,
imports: [GrassrootCouponInput],
template: `
<div>
<grassroot-coupon-input
[status]="status()"
[message]="message()"
[placeholder]="fixture.placeholder"
(apply)="onApply($event)"
/>
</div>
`,
})
export class CouponInputDemoComponent {
protected readonly fixture = couponInputFixture;
readonly status = signal<"idle" | "applied" | "error">("idle");
readonly message = signal<string | undefined>(undefined);
onApply(code: string): void {
const ok = code.trim().toUpperCase() === this.fixture.validCode;
this.status.set(ok ? "applied" : "error");
this.message.set(ok ? this.fixture.appliedMessage : this.fixture.errorMessage);
}
}
export default CouponInputDemoComponent;
ts
<script lang="ts">
import { CouponInput } from "@grassroot/ui-svelte";
const couponInputFixture = {
id: "coupon-input",
placeholder: "Promo code",
validCode: "GRASSROOT",
appliedMessage: "10% off applied.",
errorMessage: "Try GRASSROOT.",
} satisfies {
id: string;
placeholder: string;
validCode: string;
appliedMessage: string;
errorMessage: string;
};
let status = $state<"idle" | "applied" | "error">("idle");
let message = $state<string | undefined>(undefined);
</script>
<div>
<CouponInput
{status}
{message}
placeholder={couponInputFixture.placeholder}
onApply={(code) => {
const ok = code.trim().toUpperCase() === couponInputFixture.validCode;
status = ok ? "applied" : "error";
message = ok ? couponInputFixture.appliedMessage : couponInputFixture.errorMessage;
}}
/>
</div>
ts
/** @jsxImportSource solid-js */
import { createSignal } from "solid-js";
const couponInputFixture = {
id: "coupon-input",
placeholder: "Promo code",
validCode: "GRASSROOT",
appliedMessage: "10% off applied.",
errorMessage: "Try GRASSROOT.",
} satisfies {
id: string;
placeholder: string;
validCode: string;
appliedMessage: string;
errorMessage: string;
};
import { CouponInput } from "@grassroot/ui-solid";
export default function CouponInputDemo() {
const [status, setStatus] = createSignal<"idle" | "applied" | "error">("idle");
const [message, setMessage] = createSignal<string | undefined>(undefined);
return (
<div>
<CouponInput
status={status()}
message={message()}
placeholder={couponInputFixture.placeholder}
onApply={(code) => {
const ok = code.trim().toUpperCase() === couponInputFixture.validCode;
setStatus(ok ? "applied" : "error");
setMessage(ok ? couponInputFixture.appliedMessage : couponInputFixture.errorMessage);
}}
/>
</div>
);
}

Installation

API Reference

Import

import * as React from "react";
import { CouponInput } from "@grassroot/ui-react";

Props

Prop
Type
Default
Requirement
onApply
(code: string) => void | Promise<void>
required
status
"error" | "idle" | "applied" | undefined
optional
message
string | undefined
optional
placeholder
string | undefined
optional
className
string | undefined
optional
Prop
onApply
Type
(code: string) => void | Promise<void>
Default
Requirement
required
Prop
status
Type
"error" | "idle" | "applied" | undefined
Default
Requirement
optional
Prop
message
Type
string | undefined
Default
Requirement
optional
Prop
placeholder
Type
string | undefined
Default
Requirement
optional
Prop
className
Type
string | undefined
Default
Requirement
optional

Events

EventPayload
onApply(code: string) => void | Promise<void>

Import

import { ref } from "vue";
import { CouponInput } from "@grassroot/ui-vue";

Props

Prop
Type
Default
Requirement
status
"idle" | "applied" | "error" | undefined
"idle"
optional
message
string | undefined
optional
placeholder
string | undefined
"Promo code"
optional
pending
boolean | undefined
false
optional
Prop
status
Type
"idle" | "applied" | "error" | undefined
Default
"idle"
Requirement
optional
Prop
message
Type
string | undefined
Default
Requirement
optional
Prop
placeholder
Type
string | undefined
Default
"Promo code"
Requirement
optional
Prop
pending
Type
boolean | undefined
Default
false
Requirement
optional

Events

EventPayload
apply[code: string]

Import

import { Component, signal } from "@angular/core";
import { GrassrootCouponInput } from "@grassroot/ui-angular";

Props

Prop
Type
Default
Requirement
status
"idle" | "applied" | "error"
"idle"
optional
message
string
optional
placeholder
string
"Promo code"
optional
pending
boolean
false
optional
Prop
status
Type
"idle" | "applied" | "error"
Default
"idle"
Requirement
optional
Prop
message
Type
string
Default
Requirement
optional
Prop
placeholder
Type
string
Default
"Promo code"
Requirement
optional
Prop
pending
Type
boolean
Default
false
Requirement
optional

Events

EventPayload
applystring

Import

import { CouponInput } from "@grassroot/ui-svelte";

Props

Prop
Type
Default
Requirement
onApply
(code: string) => void | Promise<void>
required
status
"idle" | "applied" | "error"
"idle"
optional
message
string
optional
placeholder
string
"Promo code"
optional
pending
boolean
false
optional
className
string
optional
Prop
onApply
Type
(code: string) => void | Promise<void>
Default
Requirement
required
Prop
status
Type
"idle" | "applied" | "error"
Default
"idle"
Requirement
optional
Prop
message
Type
string
Default
Requirement
optional
Prop
placeholder
Type
string
Default
"Promo code"
Requirement
optional
Prop
pending
Type
boolean
Default
false
Requirement
optional
Prop
className
Type
string
Default
Requirement
optional

Events

EventPayload
onApply(code: string) => void | Promise<void>

Import

import { createSignal } from "solid-js";
import { CouponInput } from "@grassroot/ui-solid";

Props

Prop
Type
Default
Requirement
onApply
(code: string) => void | Promise<void>
required
status
"idle" | "applied" | "error"
optional
message
string
optional
placeholder
string
"Promo code"
optional
className
string
optional
Prop
onApply
Type
(code: string) => void | Promise<void>
Default
Requirement
required
Prop
status
Type
"idle" | "applied" | "error"
Default
Requirement
optional
Prop
message
Type
string
Default
Requirement
optional
Prop
placeholder
Type
string
Default
"Promo code"
Requirement
optional
Prop
className
Type
string
Default
Requirement
optional

Events

EventPayload
onApply(code: string) => void | Promise<void>