From 1dd880ea3d4e7a4aca0ce786030fb85812815731 Mon Sep 17 00:00:00 2001 From: Vaggelis Kapetanakis Date: Wed, 1 Apr 2026 15:06:18 +0300 Subject: [PATCH] Add custom-radio-group component --- components/custom-radio-group/README.md | 320 ++++++++++ components/custom-radio-group/cover.png | Bin 0 -> 95165 bytes components/custom-radio-group/metadata.json | 7 + components/custom-radio-group/package.json | 45 ++ .../custom-radio-group/src/RadioGroup.tsx | 569 ++++++++++++++++++ .../src/components/GroupHeader.tsx | 47 ++ .../src/components/RadioOption.tsx | 362 +++++++++++ components/custom-radio-group/src/index.tsx | 1 + .../custom-radio-group/src/types/index.ts | 47 ++ .../custom-radio-group/src/utils/theme.ts | 15 + .../src/utils/typeGuards.ts | 59 ++ components/custom-radio-group/tsconfig.json | 15 + 12 files changed, 1487 insertions(+) create mode 100644 components/custom-radio-group/README.md create mode 100644 components/custom-radio-group/cover.png create mode 100644 components/custom-radio-group/metadata.json create mode 100644 components/custom-radio-group/package.json create mode 100644 components/custom-radio-group/src/RadioGroup.tsx create mode 100644 components/custom-radio-group/src/components/GroupHeader.tsx create mode 100644 components/custom-radio-group/src/components/RadioOption.tsx create mode 100644 components/custom-radio-group/src/index.tsx create mode 100644 components/custom-radio-group/src/types/index.ts create mode 100644 components/custom-radio-group/src/utils/theme.ts create mode 100644 components/custom-radio-group/src/utils/typeGuards.ts create mode 100644 components/custom-radio-group/tsconfig.json diff --git a/components/custom-radio-group/README.md b/components/custom-radio-group/README.md new file mode 100644 index 0000000..8cffa1c --- /dev/null +++ b/components/custom-radio-group/README.md @@ -0,0 +1,320 @@ +# RadioGroup Component for Retool + +A powerful, feature-rich radio/checkbox group component for Retool applications. Build beautiful selection interfaces with single or multiple choice, icons, badges, conditional display, and flexible layouts. + +## Features + +### Core Functionality +- **Single & Multiple Selection** - Switch between radio (single) and checkbox (multiple) behavior +- **Rich Content** - Support for titles, descriptions, and HTML rendering +- **Flexible Layouts** - Vertical, horizontal, grid, or justified arrangements +- **Button Positioning** - Place buttons on left, right, top, or bottom + +### Visual Customization +- **Multiple Button Shapes** - Bullet (circle), square, rounded square, or diamond +- **Icon Support** - Add emojis or custom icons with left/right positioning +- **Badges** - Highlight options with customizable badges +- **Typography Control** - Customize font sizes and text alignment +- **Full Color Customization** - Control all colors including primary, borders, backgrounds, and hover states + +### Advanced Features +- **Option Groups** - Organize options with section headers +- **Conditional Display** - Show/hide options based on JavaScript expressions +- **Smart Tooltips** - Automatic tooltips for truncated text +- **Line Clamp** - Truncate long descriptions with ellipsis +- **HTML Rendering** - Render rich formatted content +- **Keyboard Accessible** - Full keyboard navigation support +- **Disabled State** - Individual option-level disabling + +## Installation + +This component is part of the Librarium custom component library for Retool. + +### Prerequisites +- Node.js >= 20.0.0 +- Retool account with custom component support +- `retool-ccl` CLI tool + +### Setup + +1. **Install dependencies:** +```bash +npm install +``` + +2. **Login to Retool:** +```bash +npx retool-ccl login +``` + +3. **Deploy to Retool:** +```bash +npm run deploy +``` + +For development with live reload: +```bash +npm run dev +``` + +## Quick Start + +### Basic Radio Group + +```json +{ + "options": [ + { + "id": "option1", + "title": "Option 1", + "description": "This is the first option" + }, + { + "id": "option2", + "title": "Option 2", + "description": "This is the second option" + }, + { + "id": "option3", + "title": "Option 3", + "description": "This is the third option" + } + ], + "defaultValue": "option1" +} +``` + +### Yes/No Decision + +```json +{ + "options": [ + { "id": "yes", "title": "Yes", "icon": "✓" }, + { "id": "no", "title": "No", "icon": "✗" } + ], + "layout": "horizontal", + "buttonPosition": "top", + "titleTextAlign": "center" +} +``` + +### Multiple Selection with Icons + +```json +{ + "options": [ + { + "id": "email", + "title": "Email Notifications", + "icon": "📧", + "badge": "Recommended", + "badgeColor": "#10b981" + }, + { + "id": "sms", + "title": "SMS Alerts", + "icon": "📱" + }, + { + "id": "push", + "title": "Push Notifications", + "icon": "🔔", + "badge": "New", + "badgeColor": "#3b82f6" + } + ], + "multipleSelect": true, + "defaultValues": ["email"] +} +``` + +### Grid Layout with Groups + +```json +{ + "options": [ + { "type": "header", "title": "Basic Features" }, + { "id": "feature1", "title": "Feature 1", "description": "Description 1" }, + { "id": "feature2", "title": "Feature 2", "description": "Description 2" }, + { "type": "header", "title": "Premium Features" }, + { "id": "feature3", "title": "Feature 3", "description": "Description 3", "badge": "+$10/mo" }, + { "id": "feature4", "title": "Feature 4", "description": "Description 4", "badge": "+$20/mo" } + ], + "layout": "grid", + "gridColumns": 2 +} +``` + +## Configuration + +### Core Properties + +| Property | Type | Default | Description | +|------------------|---------|------------|-------------------------------------------------------| +| `options` | Array | [] | Array of option objects or group headers | +| `multipleSelect` | Boolean | false | Enable multiple selection (checkbox mode) | +| `defaultValue` | String | "" | Default selected option ID (single select) | +| `defaultValues` | Array | [] | Default selected option IDs (multiple select) | + +### Layout & Positioning + +| Property | Type | Default | Description | +|------------------|--------|------------|-------------------------------------------------------| +| `layout` | Enum | "vertical" | Layout mode: vertical, horizontal, grid, justified | +| `gridColumns` | Number | 2 | Number of columns for grid layout | +| `buttonPosition` | Enum | "left" | Button position: left, right, top, bottom | + +### Button Styling + +| Property | Type | Default | Description | +|---------------|--------|----------|-------------------------------------------------------| +| `buttonShape` | Enum | "bullet" | Shape: bullet, square, rounded-square, diamond | +| `buttonSize` | Number | 24 | Button size in pixels | + +### Typography + +| Property | Type | Default | Description | +|-------------------------|--------|---------|------------------------------------------------| +| `titleFontSize` | Number | 16 | Title font size in pixels | +| `descriptionFontSize` | Number | 14 | Description font size in pixels | +| `titleTextAlign` | Enum | "left" | Title alignment: left, center, right, justify | +| `descriptionTextAlign` | Enum | "left" | Description alignment | +| `lineClamp` | Number | 0 | Max lines for descriptions (0 = unlimited) | + +### Colors + +| Property | Type | Default | Description | +|--------------------|--------|----------|------------------------------------| +| `primary` | String | #f97316 | Primary color for selected state | +| `primaryLight` | String | #fb923c | Lighter shade for hover | +| `background` | String | #ffffff | Background color | +| `borderColor` | String | #d1d5db | Border and unselected button color | +| `titleColor` | String | #1f2937 | Title text color | +| `descriptionColor` | String | #6b7280 | Description text color | +| `disabledColor` | String | #9ca3af | Disabled option color | +| `hoverColor` | String | #fee2e2 | Hover background color | + +### Output States + +| Property | Type | Description | +|------------------|--------|------------------------------------------------| +| `selectedValue` | String | Currently selected option ID (single select) | +| `selectedValues` | Array | Currently selected option IDs (multiple select)| + +### Events + +| Event | Description | +|-------------------|--------------------------------------| +| `selectionChange` | Triggered when selection changes | + +## Option Structure + +### Standard Option + +```typescript +{ + id: string // Required: Unique identifier + title: string // Required: Option title + description?: string // Optional: Description text + disabled?: boolean // Optional: Disable this option + renderAsHtml?: boolean // Optional: Render as HTML + icon?: string // Optional: Icon/emoji + iconPosition?: 'left' | 'right' // Optional: Icon position + badge?: string // Optional: Badge text + badgeColor?: string // Optional: Badge color + showIf?: string // Optional: Conditional display expression +} +``` + +### Group Header + +```typescript +{ + type: 'header' // Required: Identifies as header + title: string // Required: Header text +} +``` + +## Use Cases + +### Single Select +- Plan selection (pricing tiers) +- Preference settings +- Survey questions +- Filter selection +- Shipping method selection +- Payment method selection + +### Multiple Select +- Feature selection (add-ons) +- User permissions +- Category assignment +- Tag selection +- Notification preferences +- Filter combinations + +## Browser Support + +- Chrome (latest) +- Firefox (latest) +- Safari (latest) +- Edge (latest) + +**Note**: The diamond button shape uses CSS `clip-path` which is well-supported in modern browsers. + +## Performance + +- Optimized for up to 100 options +- Conditional rendering with `showIf` expressions +- Smart tooltip detection (only shows when text is truncated) +- Efficient re-renders with React hooks + +## Accessibility + +- Full keyboard navigation (Tab, Enter, Space) +- ARIA labels for screen readers +- Disabled state properly announced +- High contrast support +- Focus indicators + +## Development + +```bash +# Install dependencies +npm install + +# Start development server with live reload +npm run dev + +# Build for production +npm run deploy + +# Run linter +npx eslint src/ + +# Format code +npx prettier --write . +``` + +## Tech Stack + +- **React** - UI framework +- **TypeScript** - Type safety +- **@tryretool/custom-component-support** - Retool SDK +- **CSS-in-JS** - Inline styles with TypeScript + +### Latest Features +- **Button Position Control** - Position buttons on all four sides +- **Layout Modes** - Vertical, horizontal, grid, and justified layouts +- **Grid Layout** - Configurable column count +- **Icon Support** - Add icons with flexible positioning +- **Badges** - Highlight special options +- **Option Groups** - Organize with headers +- **Conditional Display** - Show/hide based on expressions +- **Smart Tooltips** - Auto-show for truncated text + +--- + +## License + +Created by [Stackdrop](https://stackdrop.co) diff --git a/components/custom-radio-group/cover.png b/components/custom-radio-group/cover.png new file mode 100644 index 0000000000000000000000000000000000000000..a6e6caa85eeac260fca57080fa5107e940034bb2 GIT binary patch literal 95165 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 literal 0 HcmV?d00001 diff --git a/components/custom-radio-group/metadata.json b/components/custom-radio-group/metadata.json new file mode 100644 index 0000000..d1d6a4b --- /dev/null +++ b/components/custom-radio-group/metadata.json @@ -0,0 +1,7 @@ +{ + "id": "custom-radio-group", + "title": "Custom Radio Group", + "author": "@vagkap", + "shortDescription": "A custom radio group component for Retool.", + "tags": ["UI Components", "React", "Custom"] +} diff --git a/components/custom-radio-group/package.json b/components/custom-radio-group/package.json new file mode 100644 index 0000000..742d25f --- /dev/null +++ b/components/custom-radio-group/package.json @@ -0,0 +1,45 @@ +{ + "name": "custom-radio-group-retool-component", + "version": "0.1.0", + "private": true, + "dependencies": { + "@tryretool/custom-component-support": "latest", + "react": "^18.2.0", + "react-dom": "^18.2.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "scripts": { + "dev": "npx retool-ccl dev", + "deploy": "npx retool-ccl deploy" + }, + "browserslist": { + "production": [ + ">0.2%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + }, + "devDependencies": { + "@types/react": "^18.2.55", + "@typescript-eslint/eslint-plugin": "^7.3.1", + "@typescript-eslint/parser": "^7.3.1", + "eslint": "^8.57.0", + "eslint-plugin-react": "^7.34.1", + "postcss-modules": "^6.0.0", + "prettier": "^3.0.3" + }, + "retoolCustomComponentLibraryConfig": { + "name": "CustomRadioGroup", + "label": "Custom Radio Group", + "description": "A customizable radio group component for Retool.", + "entryPoint": "src/index.tsx", + "outputPath": "dist" + } +} \ No newline at end of file diff --git a/components/custom-radio-group/src/RadioGroup.tsx b/components/custom-radio-group/src/RadioGroup.tsx new file mode 100644 index 0000000..d12196d --- /dev/null +++ b/components/custom-radio-group/src/RadioGroup.tsx @@ -0,0 +1,569 @@ +import React, { useState, useEffect, useMemo, useCallback, useRef } from 'react' +import { Retool } from '@tryretool/custom-component-support' +import { RadioOption } from './components/RadioOption' +import { GroupHeader } from './components/GroupHeader' +import { DEFAULT_COLORS } from './utils/theme' +import { isGroupHeader, isValidRadioOption, evaluateShowIf } from './utils/typeGuards' +import type { + RadioOption as RadioOptionType, + GroupHeader as GroupHeaderType, + ColorConfig, + ButtonShape, + ButtonPosition, + LayoutMode +} from './types' + +export const RadioGroup: React.FC = () => { + // ======================================== + // SECTION 1: Options Configuration + // ======================================== + const [options] = Retool.useStateArray({ + name: 'options', + initialValue: [ + { + id: '1', + title: 'Option 1', + description: 'This is the first option', + disabled: false + }, + { + id: '2', + title: 'Option 2', + description: 'This is the second option', + disabled: false + }, + { + id: '3', + title: 'Option 3', + description: 'This is the third option', + disabled: false + } + ], + label: 'Options', + description: + 'Array of radio options: [{ id: "1", title: "Title", description: "Description", disabled: false, renderAsHtml: false }]', + inspector: 'text' + }) + + const [multipleSelect] = Retool.useStateBoolean({ + name: 'multipleSelect', + initialValue: false, + label: 'Multiple Select', + description: 'Allow selecting multiple options (transforms radio group to checkbox group)', + inspector: 'checkbox' + }) + + const [defaultValue] = Retool.useStateString({ + name: 'defaultValue', + initialValue: '', + label: 'Default Value (Single)', + description: 'ID of the option to select by default in single select mode (e.g., "1")', + inspector: 'text' + }) + + const [defaultValues] = Retool.useStateArray({ + name: 'defaultValues', + initialValue: [], + label: 'Default Values (Multiple)', + description: 'Array of IDs to select by default when Multiple Select is enabled (e.g., ["1", "2"])', + inspector: 'text' + }) + + // ======================================== + // SECTION 2: Button Configuration + // ======================================== + const [buttonShape] = Retool.useStateEnumeration({ + name: 'buttonShape', + initialValue: 'bullet', + enumDefinition: ['bullet', 'square', 'rounded-square', 'diamond'], + enumLabels: { + bullet: 'Bullet (Circle)', + square: 'Square', + 'rounded-square': 'Rounded Square', + diamond: 'Diamond' + }, + label: 'Button Shape', + description: 'Shape of the radio button', + inspector: 'select' + }) + + const [buttonSize] = Retool.useStateNumber({ + name: 'buttonSize', + initialValue: 24, + label: 'Button Size', + description: 'Size of the radio button in pixels (default: 24)', + inspector: 'text' + }) + + const [buttonPosition] = Retool.useStateEnumeration({ + name: 'buttonPosition', + initialValue: 'left', + enumDefinition: ['left', 'right', 'top', 'bottom'], + enumLabels: { + left: 'Left', + right: 'Right', + top: 'Top', + bottom: 'Bottom' + }, + label: 'Button Position', + description: 'Position of the radio button relative to the text (default: left)', + inspector: 'segmented' + }) + + const [layout] = Retool.useStateEnumeration({ + name: 'layout', + initialValue: 'vertical', + enumDefinition: ['vertical', 'horizontal', 'grid', 'justified'], + enumLabels: { + vertical: 'Vertical (Stacked)', + horizontal: 'Horizontal (Row)', + grid: 'Grid', + justified: 'Justified (Space Between)' + }, + label: 'Layout', + description: 'How to arrange multiple options (default: vertical)', + inspector: 'select' + }) + + const [gridColumns] = Retool.useStateNumber({ + name: 'gridColumns', + initialValue: 2, + label: 'Grid Columns', + description: 'Number of columns when layout is set to "grid" (default: 2)', + inspector: 'text' + }) + + // ======================================== + // SECTION 3: Typography + // ======================================== + const [titleFontSize] = Retool.useStateNumber({ + name: 'titleFontSize', + initialValue: 16, + label: 'Title Font Size', + description: 'Font size for option titles in pixels (default: 16)', + inspector: 'text' + }) + + const [descriptionFontSize] = Retool.useStateNumber({ + name: 'descriptionFontSize', + initialValue: 14, + label: 'Description Font Size', + description: 'Font size for option descriptions in pixels (default: 14)', + inspector: 'text' + }) + + const [titleTextAlign] = Retool.useStateEnumeration({ + name: 'titleTextAlign', + initialValue: 'left', + enumDefinition: ['left', 'center', 'right', 'justify'], + enumLabels: { + left: 'Left', + center: 'Center', + right: 'Right', + justify: 'Justify' + }, + label: 'Title Text Align', + description: 'Text alignment for option titles (default: left)', + inspector: 'segmented' + }) + + const [descriptionTextAlign] = Retool.useStateEnumeration({ + name: 'descriptionTextAlign', + initialValue: 'left', + enumDefinition: ['left', 'center', 'right', 'justify'], + enumLabels: { + left: 'Left', + center: 'Center', + right: 'Right', + justify: 'Justify' + }, + label: 'Description Text Align', + description: 'Text alignment for option descriptions (default: left)', + inspector: 'segmented' + }) + + const [lineClamp] = Retool.useStateNumber({ + name: 'lineClamp', + initialValue: 0, + label: 'Line Clamp', + description: 'Number of lines to show for descriptions before adding ellipsis. Set to 0 to show all text (default: 0)', + inspector: 'text' + }) + + // ======================================== + // SECTION 4: Colors + // ======================================== + const [primary] = Retool.useStateString({ + name: 'primary', + initialValue: '#f97316', + label: 'Primary Color', + description: 'Main color for selected state', + inspector: 'text' + }) + + const [primaryLight] = Retool.useStateString({ + name: 'primaryLight', + initialValue: '#fb923c', + label: 'Primary Light Color', + description: 'Lighter shade of primary color for hover states', + inspector: 'text' + }) + + const [background] = Retool.useStateString({ + name: 'background', + initialValue: '#ffffff', + label: 'Background Color', + description: 'Background color for radio options', + inspector: 'text' + }) + + const [borderColor] = Retool.useStateString({ + name: 'borderColor', + initialValue: '#d1d5db', + label: 'Border Color', + description: 'Color for borders and unselected radio buttons', + inspector: 'text' + }) + + const [titleColor] = Retool.useStateString({ + name: 'titleColor', + initialValue: '#1f2937', + label: 'Title Color', + description: 'Color for option titles', + inspector: 'text' + }) + + const [descriptionColor] = Retool.useStateString({ + name: 'descriptionColor', + initialValue: '#6b7280', + label: 'Description Color', + description: 'Color for option descriptions', + inspector: 'text' + }) + + const [disabledColor] = Retool.useStateString({ + name: 'disabledColor', + initialValue: '#9ca3af', + label: 'Disabled Color', + description: 'Color for disabled options', + inspector: 'text' + }) + + const [hoverColor] = Retool.useStateString({ + name: 'hoverColor', + initialValue: '#fee2e2', + label: 'Hover Color', + description: 'Background color on hover and selected state', + inspector: 'text' + }) + + // ======================================== + // SECTION 5: Output States + // ======================================== + const [_selectedValue, setSelectedValue] = Retool.useStateString({ + name: 'selectedValue', + initialValue: '', + label: 'Selected Value', + description: 'Currently selected option ID (single select mode)', + inspector: 'text' + }) + + const [_selectedValues, setSelectedValues] = Retool.useStateArray({ + name: 'selectedValues', + initialValue: [], + label: 'Selected Values', + description: 'Currently selected option IDs (multiple select mode)', + inspector: 'text' + }) + + // Component settings for responsive sizing + Retool.useComponentSettings({ + defaultHeight: 12, + defaultWidth: 6, + }) + + // Event callbacks + const onSelectionChange = Retool.useEventCallback({ name: 'selectionChange' }) + + // Track if we've initialized from defaults + const hasInitialized = useRef(false) + + // Local state for selected values (supports both single and multiple) + const [selectedIds, setSelectedIds] = useState>(new Set()) + + // Initialize selected value(s) from default (only once on mount) + useEffect(() => { + if (hasInitialized.current) { + return + } + + if (multipleSelect) { + // Multiple select mode: initialize from defaultValues array + if (defaultValues && Array.isArray(defaultValues) && defaultValues.length > 0) { + const validIds = defaultValues + .filter((id) => typeof id === 'string' || typeof id === 'number') + .map((id) => String(id)) + if (validIds.length > 0) { + setSelectedIds(new Set(validIds)) + setSelectedValues(validIds) + } + } + } else { + // Single select mode: initialize from defaultValue string + if (defaultValue && typeof defaultValue === 'string' && defaultValue.trim()) { + const id = defaultValue.trim() + setSelectedIds(new Set([id])) + setSelectedValue(id) + } + } + + hasInitialized.current = true + }, [defaultValue, defaultValues, multipleSelect, setSelectedValue, setSelectedValues]) + + // Build color configuration + const colors: ColorConfig = useMemo(() => { + return { + primary: primary || DEFAULT_COLORS.primary, + primaryLight: primaryLight || DEFAULT_COLORS.primaryLight, + background: background || DEFAULT_COLORS.background, + borderColor: borderColor || DEFAULT_COLORS.borderColor, + titleColor: titleColor || DEFAULT_COLORS.titleColor, + descriptionColor: descriptionColor || DEFAULT_COLORS.descriptionColor, + disabledColor: disabledColor || DEFAULT_COLORS.disabledColor, + hoverColor: hoverColor || DEFAULT_COLORS.hoverColor + } + }, [ + primary, + primaryLight, + background, + borderColor, + titleColor, + descriptionColor, + disabledColor, + hoverColor + ]) + + // Parse and validate options (including group headers) + const validItems = useMemo(() => { + if (!options || !Array.isArray(options)) { + return [] + } + + return options + .map((item) => { + // Handle group headers + if (isGroupHeader(item)) { + return { + type: 'header', + title: String(item.title), + id: item.id ? String(item.id) : undefined + } as GroupHeaderType + } + + // Handle regular options + if (isValidRadioOption(item)) { + const option = { + id: String(item.id), + title: String(item.title), + description: item.description ? String(item.description) : undefined, + disabled: Boolean(item.disabled), + renderAsHtml: Boolean(item.renderAsHtml), + icon: item.icon ? String(item.icon) : undefined, + iconPosition: (item.iconPosition === 'right' ? 'right' : 'left') as 'left' | 'right', + badge: item.badge ? String(item.badge) : undefined, + badgeColor: item.badgeColor ? String(item.badgeColor) : undefined, + showIf: item.showIf ? String(item.showIf) : undefined + } as RadioOptionType + + // Apply conditional display logic + if (option.showIf && !evaluateShowIf(option.showIf)) { + return null + } + + return option + } + + return null + }) + .filter((item): item is RadioOptionType | GroupHeaderType => item !== null) + }, [options]) + + // Extract only the radio options (excluding headers) for selection logic + const validOptions = useMemo(() => { + return validItems.filter( + (item): item is RadioOptionType => !('type' in item && item.type === 'header') + ) + }, [validItems]) + + // Handle selection + const handleSelect = useCallback( + (id: string) => { + if (multipleSelect) { + // Multiple select mode: toggle selection + setSelectedIds((prev) => { + const newSet = new Set(prev) + if (newSet.has(id)) { + newSet.delete(id) + } else { + newSet.add(id) + } + const selectedArray = Array.from(newSet) + setSelectedValues(selectedArray) + return newSet + }) + } else { + // Single select mode: replace selection + setSelectedIds(new Set([id])) + setSelectedValue(id) + } + onSelectionChange() + }, + [multipleSelect, setSelectedValue, setSelectedValues, onSelectionChange] + ) + + // Get the shape as ButtonShape type + const shape: ButtonShape = (buttonShape as ButtonShape) || 'bullet' + + // Get the button position with validation + const position: ButtonPosition = (buttonPosition as ButtonPosition) || 'left' + + // Get the layout mode with validation + const layoutMode: LayoutMode = (layout as LayoutMode) || 'vertical' + + // Get the size with validation + const size = typeof buttonSize === 'number' && buttonSize > 0 ? buttonSize : 24 + + // Get grid columns with validation + const columns = typeof gridColumns === 'number' && gridColumns > 0 ? Math.floor(gridColumns) : 2 + + // Get font sizes with validation + const validTitleFontSize = typeof titleFontSize === 'number' && titleFontSize > 0 ? titleFontSize : 16 + const validDescriptionFontSize = typeof descriptionFontSize === 'number' && descriptionFontSize > 0 ? descriptionFontSize : 14 + + // Get text alignment with validation + const validTitleTextAlign = (titleTextAlign === 'left' || titleTextAlign === 'center' || titleTextAlign === 'right' || titleTextAlign === 'justify') ? titleTextAlign : 'left' + const validDescriptionTextAlign = (descriptionTextAlign === 'left' || descriptionTextAlign === 'center' || descriptionTextAlign === 'right' || descriptionTextAlign === 'justify') ? descriptionTextAlign : 'left' + + // Get line clamp with validation (0 or positive integer) + const validLineClamp = typeof lineClamp === 'number' && lineClamp >= 0 ? Math.floor(lineClamp) : 0 + + // Get container styles based on layout mode + const getContainerStyles = (): React.CSSProperties => { + const baseStyles: React.CSSProperties = { + width: '99%', + height: 'auto', + fontFamily: "'Lexend', sans-serif, Inter, -apple-system, BlinkMacSystemFont, system-ui, sans-serif", + padding: '0px 0px 16px 0px' + } + + switch (layoutMode) { + case 'horizontal': + return { + ...baseStyles, + display: 'flex', + flexDirection: 'row', + flexWrap: 'wrap', + gap: '12px', + alignItems: 'stretch' + } + case 'grid': + return { + ...baseStyles, + display: 'grid', + gridTemplateColumns: `repeat(${columns}, 1fr)`, + gap: '12px' + } + case 'justified': + return { + ...baseStyles, + display: 'flex', + flexDirection: 'row', + flexWrap: 'wrap', + justifyContent: 'space-between', + gap: '12px', + alignItems: 'stretch' + } + case 'vertical': + default: + return baseStyles + } + } + + if (validOptions.length === 0) { + return ( +

+ No options provided. Add options via the inspector. +
+ ) + } + + return ( +
+ {validItems.map((item, index) => { + // Render group header + if ('type' in item && item.type === 'header') { + // Headers should span full width in grid/horizontal layouts + return ( +
+ +
+ ) + } + + // Render radio option + const option = item as RadioOptionType + return ( + + ) + })} +
+ ) +} diff --git a/components/custom-radio-group/src/components/GroupHeader.tsx b/components/custom-radio-group/src/components/GroupHeader.tsx new file mode 100644 index 0000000..e550b16 --- /dev/null +++ b/components/custom-radio-group/src/components/GroupHeader.tsx @@ -0,0 +1,47 @@ +import React from 'react' + +interface GroupHeaderProps { + title: string + titleColor: string + titleFontSize: number +} + +export const GroupHeader: React.FC = ({ + title, + titleColor, + titleFontSize +}) => { + return ( +
+
+ {title} +
+
+
+ ) +} diff --git a/components/custom-radio-group/src/components/RadioOption.tsx b/components/custom-radio-group/src/components/RadioOption.tsx new file mode 100644 index 0000000..1c8582b --- /dev/null +++ b/components/custom-radio-group/src/components/RadioOption.tsx @@ -0,0 +1,362 @@ +import React, { useState, useRef, useEffect } from 'react' +import type { ColorConfig, ButtonShape, ButtonPosition } from '../types' + +interface RadioOptionProps { + id: string + title: string + description?: string + isSelected: boolean + disabled?: boolean + renderAsHtml?: boolean + buttonSize: number + buttonShape: ButtonShape + buttonPosition: ButtonPosition + colors: ColorConfig + titleFontSize: number + descriptionFontSize: number + titleTextAlign: string + descriptionTextAlign: string + lineClamp: number + icon?: string + iconPosition?: 'left' | 'right' + badge?: string + badgeColor?: string + noMarginBottom?: boolean + onSelect: (id: string) => void +} + +const renderButtonShape = ( + shape: ButtonShape, + size: number, + isSelected: boolean, + colors: ColorConfig +) => { + const commonStyle = { + width: `${size}px`, + height: `${size}px`, + border: `2px solid ${isSelected ? colors.primary : colors.borderColor}`, + transition: 'all 0.2s ease', + flexShrink: 0, + position: 'relative' as const, + backgroundColor: colors.background + } + + const innerDotStyle = { + position: 'absolute' as const, + top: '50%', + left: '50%', + transform: 'translate(-50%, -50%)', + width: `${size * 0.5}px`, + height: `${size * 0.5}px`, + backgroundColor: colors.primary, + transition: 'all 0.2s ease', + opacity: isSelected ? 1 : 0 + } + + switch (shape) { + case 'bullet': + return ( +
+
+
+ ) + case 'square': + return ( +
+
+
+ ) + case 'rounded-square': + return ( +
+
+
+ ) + case 'diamond': + return ( +
+
+
+ ) + default: + return ( +
+
+
+ ) + } +} + +export const RadioOption: React.FC = ({ + id, + title, + description, + isSelected, + disabled = false, + renderAsHtml = false, + buttonSize, + buttonShape, + buttonPosition = 'left', + colors, + titleFontSize, + descriptionFontSize, + titleTextAlign, + descriptionTextAlign, + lineClamp, + icon, + iconPosition = 'left', + badge, + badgeColor, + noMarginBottom = false, + onSelect +}) => { + const descriptionRef = useRef(null) + const [showTooltip, setShowTooltip] = useState(false) + const [isTruncated, setIsTruncated] = useState(false) + + // Check if description is truncated + useEffect(() => { + if (lineClamp > 0 && descriptionRef.current && description) { + const element = descriptionRef.current + setIsTruncated(element.scrollHeight > element.clientHeight) + } + }, [description, lineClamp]) + + const handleClick = () => { + if (!disabled) { + onSelect(id) + } + } + + const handleKeyDown = (e: React.KeyboardEvent) => { + if (!disabled && (e.key === 'Enter' || e.key === ' ')) { + e.preventDefault() + onSelect(id) + } + } + + // Determine flex direction based on button position + const getFlexDirection = (): 'row' | 'row-reverse' | 'column' | 'column-reverse' => { + switch (buttonPosition) { + case 'left': + return 'row' + case 'right': + return 'row-reverse' + case 'top': + return 'column' + case 'bottom': + return 'column-reverse' + default: + return 'row' + } + } + + // Determine alignment based on button position + const getAlignment = () => { + if (buttonPosition === 'top' || buttonPosition === 'bottom') { + return 'center' + } + return 'flex-start' + } + + return ( +
{ + if (!disabled && !isSelected) { + e.currentTarget.style.backgroundColor = colors.hoverColor + } + }} + onMouseLeave={(e) => { + if (!disabled && !isSelected) { + e.currentTarget.style.backgroundColor = colors.background + } + }} + > + {/* Radio button */} +
+ {renderButtonShape(buttonShape, buttonSize, isSelected, colors)} +
+ + {/* Content */} +
+ {/* Title with Icon and Badge */} +
+ {/* Icon (Left) */} + {icon && iconPosition === 'left' && ( + + {icon} + + )} + + {/* Title Text */} +
+ {renderAsHtml ? ( +
+ ) : ( + title + )} +
+ + {/* Icon (Right) */} + {icon && iconPosition === 'right' && ( + + {icon} + + )} + + {/* Badge */} + {badge && ( + + {badge} + + )} +
+ + {/* Description with Tooltip */} + {description && ( +
lineClamp > 0 && isTruncated && setShowTooltip(true)} + onMouseLeave={() => setShowTooltip(false)} + > +
0 && { + display: '-webkit-box', + WebkitLineClamp: lineClamp, + WebkitBoxOrient: 'vertical', + overflow: 'hidden' + }) + }} + > + {renderAsHtml ? ( +
+ ) : ( + description + )} +
+ + {/* Tooltip */} + {showTooltip && lineClamp > 0 && isTruncated && ( +
+ {renderAsHtml ? ( +
+ ) : ( + description + )} +
+ )} +
+ )} +
+
+ ) +} diff --git a/components/custom-radio-group/src/index.tsx b/components/custom-radio-group/src/index.tsx new file mode 100644 index 0000000..6c23765 --- /dev/null +++ b/components/custom-radio-group/src/index.tsx @@ -0,0 +1 @@ +export { RadioGroup } from './RadioGroup' \ No newline at end of file diff --git a/components/custom-radio-group/src/types/index.ts b/components/custom-radio-group/src/types/index.ts new file mode 100644 index 0000000..a30b08b --- /dev/null +++ b/components/custom-radio-group/src/types/index.ts @@ -0,0 +1,47 @@ +export interface RadioOption { + id: string + title: string + description?: string + disabled?: boolean + renderAsHtml?: boolean + icon?: string + iconPosition?: 'left' | 'right' + badge?: string + badgeColor?: string + showIf?: string +} + +export interface GroupHeader { + type: 'header' + title: string + id?: string +} + +export type ButtonShape = + | 'bullet' + | 'square' + | 'diamond' + | 'rounded-square' + +export type ButtonPosition = 'left' | 'right' | 'top' | 'bottom' + +export type LayoutMode = 'vertical' | 'horizontal' | 'grid' | 'justified' + +export interface ColorConfig { + primary: string + primaryLight: string + background: string + borderColor: string + titleColor: string + descriptionColor: string + disabledColor: string + hoverColor: string +} + +export interface RadioGroupModel { + options: RadioOption[] + selectedValue: string + buttonSize: number + buttonShape: ButtonShape + colors: ColorConfig +} diff --git a/components/custom-radio-group/src/utils/theme.ts b/components/custom-radio-group/src/utils/theme.ts new file mode 100644 index 0000000..651542d --- /dev/null +++ b/components/custom-radio-group/src/utils/theme.ts @@ -0,0 +1,15 @@ +import type { ColorConfig } from '../types' + +/** + * Default color theme for the radio group + */ +export const DEFAULT_COLORS: ColorConfig = { + primary: '#f97316', + primaryLight: '#fb923c', + background: '#ffffff', + borderColor: '#d1d5db', + titleColor: '#1f2937', + descriptionColor: '#6b7280', + disabledColor: '#9ca3af', + hoverColor: '#fee2e2' +} diff --git a/components/custom-radio-group/src/utils/typeGuards.ts b/components/custom-radio-group/src/utils/typeGuards.ts new file mode 100644 index 0000000..4ac3033 --- /dev/null +++ b/components/custom-radio-group/src/utils/typeGuards.ts @@ -0,0 +1,59 @@ +import { Retool } from '@tryretool/custom-component-support' + +type SerializableObject = Retool.SerializableObject +type SerializableType = Retool.SerializableType + +/** + * Type guard to check if an item is a group header + * @param item - The item to check + * @returns True if the item is a group header + */ +export const isGroupHeader = ( + item: SerializableType +): item is SerializableObject => { + return ( + item !== null && + typeof item === 'object' && + !Array.isArray(item) && + 'type' in item && + item.type === 'header' + ) +} + +/** + * Type guard to check if an item is a valid radio option + * @param item - The item to check + * @returns True if the item is a valid radio option with required properties + */ +export const isValidRadioOption = ( + item: SerializableType +): item is SerializableObject => { + return ( + item !== null && + typeof item === 'object' && + !Array.isArray(item) && + 'id' in item && + 'title' in item && + !('type' in item && item.type === 'header') + ) +} + +/** + * Evaluates a conditional display expression (showIf) + * @param expression - JavaScript expression string to evaluate + * @returns Boolean result of the expression, or true if evaluation fails + */ +export const evaluateShowIf = (expression: string): boolean => { + if (!expression || typeof expression !== 'string') { + return true + } + try { + // Create a safe evaluation function + // eslint-disable-next-line no-new-func + const evalFunc = new Function('return ' + expression) + return Boolean(evalFunc()) + } catch (error) { + console.warn('Failed to evaluate showIf expression:', expression, error) + return true // Show by default if evaluation fails + } +} diff --git a/components/custom-radio-group/tsconfig.json b/components/custom-radio-group/tsconfig.json new file mode 100644 index 0000000..55be51b --- /dev/null +++ b/components/custom-radio-group/tsconfig.json @@ -0,0 +1,15 @@ +{ + "compilerOptions": { + "target": "ESNext", + "lib": ["dom", "dom.iterable", "esnext"], + "skipLibCheck": true, + "esModuleInterop": true, + "strict": true, + "module": "esnext", + "moduleResolution": "node", + "resolveJsonModule": true, + "noEmit": true, + "jsx": "react-jsx" + }, + "include": ["**/*.tsx", "**/*.ts"] +}