diff --git a/backend/internal/web/ui/input.css b/backend/internal/web/ui/input.css
new file mode 100644
index 0000000..222d7fa
--- /dev/null
+++ b/backend/internal/web/ui/input.css
@@ -0,0 +1,22 @@
+.ui-input {
+ appearance: none;
+ background: var(--color-surface-default);
+ border: 1px solid var(--color-border-default);
+ border-radius: 0.75rem;
+ color: var(--color-text-primary);
+ font: inherit;
+ line-height: 1.4;
+ min-height: 44px;
+ padding: 0.75rem 0.95rem;
+ width: 100%;
+}
+
+.ui-input::placeholder {
+ color: var(--color-text-faint);
+}
+
+.ui-input:focus {
+ border-color: var(--color-brand-focus);
+ box-shadow: 0 0 0 3px var(--color-focus-ring-strong);
+ outline: none;
+}
diff --git a/backend/internal/web/ui/input.templ b/backend/internal/web/ui/input.templ
new file mode 100644
index 0000000..0245aaf
--- /dev/null
+++ b/backend/internal/web/ui/input.templ
@@ -0,0 +1,30 @@
+package ui
+
+type InputProps struct {
+ ID string
+ Name string
+ Value string
+ Placeholder string
+ Type string
+ Disabled bool
+ Required bool
+ Attrs templ.Attributes
+}
+
+templ Input(props InputProps) {
+
+}
diff --git a/backend/internal/web/ui/textarea.css b/backend/internal/web/ui/textarea.css
new file mode 100644
index 0000000..7142068
--- /dev/null
+++ b/backend/internal/web/ui/textarea.css
@@ -0,0 +1,23 @@
+.ui-textarea {
+ appearance: none;
+ background: var(--color-surface-default);
+ border: 1px solid var(--color-border-default);
+ border-radius: 0.75rem;
+ color: var(--color-text-primary);
+ font: inherit;
+ line-height: 1.4;
+ min-height: 7rem;
+ padding: 0.85rem 0.95rem;
+ resize: vertical;
+ width: 100%;
+}
+
+.ui-textarea::placeholder {
+ color: var(--color-text-faint);
+}
+
+.ui-textarea:focus {
+ border-color: var(--color-brand-focus);
+ box-shadow: 0 0 0 3px var(--color-focus-ring-strong);
+ outline: none;
+}
diff --git a/backend/internal/web/ui/textarea.templ b/backend/internal/web/ui/textarea.templ
new file mode 100644
index 0000000..74c6216
--- /dev/null
+++ b/backend/internal/web/ui/textarea.templ
@@ -0,0 +1,29 @@
+package ui
+
+type TextareaProps struct {
+ ID string
+ Name string
+ Value string
+ Placeholder string
+ Rows int
+ Disabled bool
+ Required bool
+ Attrs templ.Attributes
+}
+
+templ Textarea(props TextareaProps) {
+
+}
diff --git a/backend/tailwind.input.css b/backend/tailwind.input.css
index c4d4ac6..7e17912 100644
--- a/backend/tailwind.input.css
+++ b/backend/tailwind.input.css
@@ -7,5 +7,7 @@
@import "./internal/web/ui/base.css";
@import "./internal/web/ui/auth.css";
@import "./internal/web/ui/button.css";
-@import "./internal/web/ui/card.css";
@import "./internal/web/ui/badge.css";
+@import "./internal/web/ui/card.css";
+@import "./internal/web/ui/input.css";
+@import "./internal/web/ui/textarea.css";