#!/bin/bash # Leptos Component Generator v2 # Usage: ./scripts/generate_component_v2.sh set -e # Colors for output GREEN='\033[0;32m' BLUE='\033[0;34m' NC='\033[0m' print_status() { echo -e "${GREEN}[INFO]${NC} $1" } print_header() { echo -e "${BLUE}================================${NC}" echo -e "${BLUE} Component Generator v2${NC}" echo -e "${BLUE}================================${NC}" } if [ $# -lt 2 ]; then echo "Usage: $0 " echo "Types: basic, form, interactive, layout, feedback" exit 1 fi COMPONENT_NAME=$1 COMPONENT_TYPE=$2 COMPONENT_DIR="packages/leptos/$COMPONENT_NAME" # Component name mapping case $COMPONENT_NAME in "input") COMPONENT_NAME_PASCAL="Input" ;; "label") COMPONENT_NAME_PASCAL="Label" ;; "button") COMPONENT_NAME_PASCAL="Button" ;; "card") COMPONENT_NAME_PASCAL="Card" ;; "radio-group") COMPONENT_NAME_PASCAL="RadioGroup" ;; "select") COMPONENT_NAME_PASCAL="Select" ;; "tooltip") COMPONENT_NAME_PASCAL="Tooltip" ;; "textarea") COMPONENT_NAME_PASCAL="Textarea" ;; "separator") COMPONENT_NAME_PASCAL="Separator" ;; "avatar") COMPONENT_NAME_PASCAL="Avatar" ;; "progress") COMPONENT_NAME_PASCAL="Progress" ;; "skeleton") COMPONENT_NAME_PASCAL="Skeleton" ;; "switch") COMPONENT_NAME_PASCAL="Switch" ;; "slider") COMPONENT_NAME_PASCAL="Slider" ;; "breadcrumb") COMPONENT_NAME_PASCAL="Breadcrumb" ;; "alert") COMPONENT_NAME_PASCAL="Alert" ;; "badge") COMPONENT_NAME_PASCAL="Badge" ;; "checkbox") COMPONENT_NAME_PASCAL="Checkbox" ;; "dialog") COMPONENT_NAME_PASCAL="Dialog" ;; "dropdown-menu") COMPONENT_NAME_PASCAL="DropdownMenu" ;; "form") COMPONENT_NAME_PASCAL="Form" ;; "hover-card") COMPONENT_NAME_PASCAL="HoverCard" ;; "menubar") COMPONENT_NAME_PASCAL="Menubar" ;; "navigation-menu") COMPONENT_NAME_PASCAL="NavigationMenu" ;; "popover") COMPONENT_NAME_PASCAL="Popover" ;; "scroll-area") COMPONENT_NAME_PASCAL="ScrollArea" ;; "sheet") COMPONENT_NAME_PASCAL="Sheet" ;; "table") COMPONENT_NAME_PASCAL="Table" ;; "tabs") COMPONENT_NAME_PASCAL="Tabs" ;; "toast") COMPONENT_NAME_PASCAL="Toast" ;; "toggle") COMPONENT_NAME_PASCAL="Toggle" ;; *) # Fallback: capitalize first letter and remove hyphens COMPONENT_NAME_PASCAL=$(echo "$COMPONENT_NAME" | sed 's/-//g' | sed 's/^./\U&/') ;; esac print_header print_status "Generating $COMPONENT_NAME ($COMPONENT_TYPE) -> $COMPONENT_NAME_PASCAL" # Create directory mkdir -p "$COMPONENT_DIR/src" # Generate Cargo.toml cat > "$COMPONENT_DIR/Cargo.toml" << EOF [package] name = "shadcn-ui-leptos-$COMPONENT_NAME" description = "Leptos port of shadcn/ui $COMPONENT_NAME" homepage = "https://shadcn-ui.rustforweb.org/components/$COMPONENT_NAME.html" publish = false authors.workspace = true edition.workspace = true license.workspace = true repository.workspace = true version.workspace = true [dependencies] leptos.workspace = true leptos-node-ref.workspace = true leptos-struct-component.workspace = true leptos-style.workspace = true tailwind_fuse.workspace = true web-sys.workspace = true [features] default = [] new_york = [] [dev-dependencies] shadcn-ui-test-utils = { path = "../../test-utils" } wasm-bindgen-test = { workspace = true } EOF # Generate lib.rs cat > "$COMPONENT_DIR/src/lib.rs" << EOF //! Leptos port of shadcn/ui $COMPONENT_NAME pub mod default; pub mod new_york; pub use default::{$COMPONENT_NAME_PASCAL}; pub use new_york::{$COMPONENT_NAME_PASCAL as ${COMPONENT_NAME_PASCAL}NewYork}; #[cfg(test)] mod tests; EOF # Generate default.rs based on type case $COMPONENT_TYPE in "form") cat > "$COMPONENT_DIR/src/default.rs" << EOF use leptos::{ev::Event, prelude::*}; use leptos_style::Style; use leptos::wasm_bindgen::JsCast; const ${COMPONENT_NAME_PASCAL}_CLASS: &str = "flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50"; #[component] pub fn $COMPONENT_NAME_PASCAL( #[prop(into, optional)] value: MaybeProp, #[prop(into, optional)] on_change: Option>, #[prop(into, optional)] placeholder: MaybeProp, #[prop(into, optional)] disabled: Signal, #[prop(into, optional)] input_type: MaybeProp, #[prop(into, optional)] class: MaybeProp, #[prop(into, optional)] id: MaybeProp, #[prop(into, optional)] style: Signal