@nuralyui/textarea 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"textarea.component.js","sourceRoot":"","sources":["../../../src/components/textarea/textarea.component.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @license\n * Copyright 2023 Nuraly, Laabidi Aymen\n * SPDX-License-Identifier: MIT\n */\n\nimport { LitElement, PropertyValues, html } from 'lit';\nimport { customElement, property, state, query } from 'lit/decorators.js';\nimport { styles } from './textarea.style.js';\nimport '../icon/icon.component.js';\nimport {\n TEXTAREA_STATE,\n TEXTAREA_SIZE,\n TEXTAREA_VARIANT,\n TEXTAREA_RESIZE,\n TEXTAREA_DEFAULTS,\n EMPTY_STRING,\n ValidationRule,\n TextareaValidationResult,\n TextareaChangeEvent,\n TextareaResizeEvent,\n FocusOptions\n} from './textarea.types.js';\nimport { NuralyUIBaseMixin } from '../../shared/base-mixin.js';\nimport { ValidatableComponent, ValidationStatus } from '../../shared/validation.types.js';\nimport {\n TextareaValidationController,\n TextareaEventController,\n type TextareaValidationHost,\n type TextareaEventHost\n} from './controllers/index.js';\n\n/**\n * Versatile textarea component with validation, resize options, and interactive features.\n * \n * @example\n * ```html\n * <nr-textarea placeholder=\"Enter your message\"></nr-textarea>\n * <nr-textarea rows=\"5\" resize=\"vertical\"></nr-textarea>\n * <nr-textarea max-length=\"500\" show-count></nr-textarea>\n * ```\n * \n * @fires nr-textarea-change - Value changes\n * @fires nr-focus - Textarea focused\n * @fires nr-blur - Textarea blurred \n * @fires nr-clear - Clear button clicked\n * @fires nr-resize - Textarea resized\n * \n * @slot label - Textarea label\n * @slot helper-text - Helper text\n * @slot addon-before - Content before textarea\n * @slot addon-after - Content after textarea\n */\n@customElement('nr-textarea')\nexport class NrTextareaElement extends NuralyUIBaseMixin(LitElement) \n implements TextareaValidationHost, TextareaEventHost, ValidatableComponent {\n static override styles = styles;\n\n @query('textarea')\n private textareaElement!: HTMLTextAreaElement;\n\n // Controllers\n private validationController = new TextareaValidationController(this);\n private eventController = new TextareaEventController(this);\n\n /** Disables the textarea */\n @property({ type: Boolean, reflect: true })\n disabled = false;\n\n /** Makes the textarea read-only */\n @property({ type: Boolean, reflect: true })\n readonly = false;\n\n /** Visual state (default, success, warning, error) */\n @property({ type: String, reflect: true })\n state = TEXTAREA_STATE.Default;\n\n /** Current textarea value */\n @property({ type: String })\n value = EMPTY_STRING;\n\n /** Textarea size (small, medium, large) */\n @property({ type: String })\n size = TEXTAREA_SIZE.Medium;\n\n /** Visual variant (outlined, underlined, filled) */\n @property({ type: String, reflect: true })\n variant = TEXTAREA_VARIANT.Underlined;\n\n /** Resize behavior (none, vertical, horizontal, both) */\n @property({ type: String })\n resize = TEXTAREA_RESIZE.Vertical;\n\n /** Number of visible text lines */\n @property({ type: Number })\n rows = TEXTAREA_DEFAULTS.ROWS;\n\n /** Number of visible character columns */\n @property({ type: Number })\n cols = TEXTAREA_DEFAULTS.COLS;\n\n /** Placeholder text */\n @property({ type: String })\n placeholder = EMPTY_STRING;\n\n /** HTML autocomplete attribute */\n @property({ type: String })\n autocomplete = 'off';\n\n /** Field name for form submission */\n @property({ type: String })\n name?: string;\n\n /** Required field indicator */\n @property({ type: Boolean })\n required?: boolean;\n\n /** Shows clear button */\n @property({ type: Boolean, reflect: true })\n allowClear = false;\n\n /** Clearable alias for controller interface compatibility */\n get clearable(): boolean {\n return this.allowClear;\n }\n\n /** Shows character counter */\n @property({ type: Boolean, reflect: true })\n showCount = false;\n\n /** Maximum character limit */\n @property({ type: Number })\n maxLength?: number;\n\n /** Minimum height for auto-resize */\n @property({ type: Number })\n minHeight?: number;\n\n /** Maximum height for auto-resize */\n @property({ type: Number })\n maxHeight?: number;\n\n /** Auto-resize textarea based on content */\n @property({ type: Boolean })\n autoResize = false;\n\n /** Array of validation rules */\n @property({ type: Array })\n rules: ValidationRule[] = [];\n\n /** Validate on change */\n @property({ type: Boolean, attribute: 'validate-on-change' })\n validateOnChange = true;\n\n /** Validate on blur */\n @property({ type: Boolean, attribute: 'validate-on-blur' })\n validateOnBlur = true;\n\n /** Show validation status icon */\n @property({ type: Boolean, attribute: 'has-feedback' })\n hasFeedback = false;\n\n /** Custom validation message */\n @property({ type: String, attribute: 'validation-message' })\n validationMessage?: string;\n\n @state()\n private isFocused = false;\n\n @state()\n private validationResult?: TextareaValidationResult;\n\n @state()\n private characterCount = 0;\n\n private resizeObserver?: ResizeObserver;\n\n constructor() {\n super();\n // Initialize character count based on initial value\n this.characterCount = this.value.length;\n \n // Setup controller event listeners\n this.setupControllerListeners();\n }\n\n /**\n * Setup controller event listeners\n */\n private setupControllerListeners(): void {\n // Validation events\n this.addEventListener('textarea-validation', (e: any) => {\n this.validationResult = e.detail.validationResult;\n });\n\n // Input events \n this.addEventListener('textarea-input', (e: any) => {\n this.handleControllerInput(e.detail.value);\n });\n\n // Focus/blur events\n this.addEventListener('textarea-focus', () => {\n this.isFocused = true;\n });\n\n this.addEventListener('textarea-blur', () => {\n this.isFocused = false;\n if (this.validateOnBlur) {\n this.validationController.validateOnBlurIfEnabled();\n }\n });\n\n // Clear events\n this.addEventListener('textarea-clear', (e: any) => {\n this.handleControllerClear(e.detail.previousValue);\n });\n }\n\n /**\n * Handle input from controller\n */\n private handleControllerInput(newValue: string): void {\n // Handle max length\n if (this.maxLength && newValue.length > this.maxLength) {\n this.value = newValue.slice(0, this.maxLength);\n } else {\n this.value = newValue;\n }\n\n this.characterCount = this.value.length;\n this.autoResizeIfNeeded();\n this.dispatchChangeEvent();\n\n // Validate if change validation is enabled\n if (this.validateOnChange) {\n this.validationController.validateOnChangeIfEnabled(this.value);\n }\n }\n\n /**\n * Handle clear from controller\n */\n private handleControllerClear(previousValue: string): void {\n this.characterCount = 0;\n this.dispatchChangeEvent();\n \n // Custom clear event for backward compatibility\n this.dispatchEvent(new CustomEvent('nr-clear', {\n detail: { value: this.value, previousValue },\n bubbles: true\n }));\n }\n\n override connectedCallback() {\n super.connectedCallback();\n this.setupResizeObserver();\n }\n\n override disconnectedCallback() {\n super.disconnectedCallback();\n this.cleanupResizeObserver();\n }\n\n override firstUpdated(changedProperties: PropertyValues) {\n super.firstUpdated(changedProperties);\n this.updateTextareaValue();\n this.autoResizeIfNeeded();\n \n // Setup resize observer for the textarea element\n if (this.resizeObserver && this.textareaElement) {\n this.resizeObserver.observe(this.textareaElement);\n }\n\n // Setup event controllers with DOM elements\n this.eventController.setupEventListeners();\n }\n\n override updated(changedProperties: PropertyValues) {\n super.updated(changedProperties);\n\n if (changedProperties.has('value')) {\n this.characterCount = this.value.length;\n this.updateTextareaValue();\n this.autoResizeIfNeeded();\n }\n\n if (changedProperties.has('autoResize')) {\n this.autoResizeIfNeeded();\n }\n\n // Update validation rules if they changed\n if (changedProperties.has('rules')) {\n this.validationController.clearValidation();\n if (this.rules.length > 0 && this.value) {\n this.validationController.validate(this.value);\n }\n }\n }\n\n private setupResizeObserver() {\n if (typeof ResizeObserver !== 'undefined') {\n this.resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const { width, height } = entry.contentRect;\n this.dispatchResizeEvent(width, height);\n }\n });\n }\n }\n\n private cleanupResizeObserver() {\n if (this.resizeObserver) {\n this.resizeObserver.disconnect();\n this.resizeObserver = undefined;\n }\n }\n\n private updateTextareaValue() {\n if (this.textareaElement && this.textareaElement.value !== this.value) {\n this.textareaElement.value = this.value;\n }\n }\n\n private autoResizeIfNeeded() {\n if (!this.autoResize || !this.textareaElement) return;\n\n // Reset height to auto to get the natural scroll height\n this.textareaElement.style.height = 'auto';\n const scrollHeight = this.textareaElement.scrollHeight;\n\n // Apply min/max height constraints\n let newHeight = scrollHeight;\n if (this.minHeight && newHeight < this.minHeight) {\n newHeight = this.minHeight;\n }\n if (this.maxHeight && newHeight > this.maxHeight) {\n newHeight = this.maxHeight;\n }\n\n this.textareaElement.style.height = `${newHeight}px`;\n }\n\n /**\n * Handle input event (now delegated to event controller via addEventListener)\n */\n private handleInput(e: Event) {\n // This method is kept for backward compatibility but actual handling\n // is now done through the event controller\n this.eventController.handleInput(e);\n }\n\n /**\n * Handle focus event (now delegated to event controller)\n */\n private handleFocus(e: FocusEvent) {\n this.eventController.handleFocus(e);\n \n // Dispatch legacy event for backward compatibility\n this.dispatchEvent(new CustomEvent('nr-focus', {\n detail: { \n focused: true,\n originalEvent: e\n },\n bubbles: true\n }));\n }\n\n /**\n * Handle blur event (now delegated to event controller)\n */\n private handleBlur(e: FocusEvent) {\n this.eventController.handleBlur(e);\n \n // Dispatch legacy event for backward compatibility\n this.dispatchEvent(new CustomEvent('nr-blur', {\n detail: { \n focused: false,\n originalEvent: e\n },\n bubbles: true\n }));\n }\n\n /**\n * Handle clear event (now delegated to event controller)\n */\n private handleClear() {\n this.eventController.handleClear();\n }\n\n private dispatchChangeEvent() {\n const detail: TextareaChangeEvent = {\n value: this.value,\n length: this.characterCount,\n exceedsMaxLength: this.maxLength ? this.characterCount > this.maxLength : false,\n validation: this.validationResult\n };\n\n this.dispatchEvent(new CustomEvent('nr-textarea-change', {\n detail,\n bubbles: true\n }));\n }\n\n private dispatchResizeEvent(width: number, height: number) {\n const detail: TextareaResizeEvent = {\n width,\n height,\n direction: this.resize as any\n };\n\n this.dispatchEvent(new CustomEvent('nr-resize', {\n detail,\n bubbles: true\n }));\n }\n\n /**\n * Focus the textarea with optional configuration\n */\n override focus(options?: FocusOptions) {\n this.eventController.focus();\n \n // Handle cursor positioning if needed\n if (options?.cursor !== undefined || options?.select) {\n setTimeout(() => {\n if (!this.textareaElement) return;\n\n if (options?.cursor !== undefined) {\n if (typeof options.cursor === 'number') {\n this.eventController.setCursorPosition(options.cursor);\n } else if (options.cursor === 'start') {\n this.eventController.setCursorPosition(0);\n } else if (options.cursor === 'end') {\n this.eventController.setCursorPosition(this.value.length);\n } else if (options.cursor === 'all') {\n this.eventController.selectAll();\n }\n } else if (options?.select) {\n this.eventController.selectAll();\n }\n });\n }\n }\n\n /**\n * Blur the textarea\n */\n override blur() {\n this.eventController.blur();\n }\n\n /**\n * Get validation status\n */\n getValidationResult(): TextareaValidationResult | undefined {\n return this.validationController.validationResult;\n }\n\n /**\n * Trigger validation manually (ValidatableComponent interface)\n */\n async validate(): Promise<boolean> {\n const result = await this.validationController.validate(this.value);\n return result.isValid;\n }\n\n /**\n * Clear validation state\n */\n clearValidation() {\n this.validationController.clearValidation();\n }\n\n /**\n * Clear the textarea value\n */\n clear() {\n this.eventController.handleClear();\n }\n\n /**\n * Add a validation rule (ValidatableComponent interface)\n */\n addRule(rule: ValidationRule): void {\n this.validationController.addRule(rule);\n }\n\n /**\n * Remove validation rules matching predicate (ValidatableComponent interface)\n */\n removeRule(predicate: (rule: ValidationRule) => boolean): void {\n this.validationController.removeRule(predicate);\n }\n\n /**\n * Clear all validation rules (ValidatableComponent interface)\n */\n clearRules(): void {\n this.validationController.clearRules();\n }\n\n /**\n * Get current validation status (ValidatableComponent interface)\n */\n getValidationStatus(): ValidationStatus {\n const result = this.validationController.validationResult;\n return {\n isValid: result?.isValid ?? true,\n errors: result?.level === 'error' ? result.messages : [],\n warnings: result?.level === 'warning' ? result.messages : []\n };\n }\n\n /**\n * Check if the textarea value is valid\n */\n isValid(): boolean {\n return this.validationController.isValid();\n }\n\n // Form integration methods (FormFieldCapable interface)\n\n /**\n * Check validity (HTML form API compatibility)\n */\n checkValidity(): boolean {\n return this.validationController.isValid();\n }\n\n /**\n * Report validity (HTML form API compatibility)\n */\n reportValidity(): boolean {\n const isValid = this.validationController.isValid();\n if (!isValid) {\n // Trigger validation to show error messages\n this.validationController.validate(this.value);\n }\n return isValid;\n }\n\n /**\n * Set custom validity message (HTML form API compatibility)\n */\n setCustomValidity(message: string): void {\n if (message) {\n // Add custom validation rule\n this.validationController.addRule({\n validator: () => false,\n message,\n level: 'error',\n blocking: true\n });\n } else {\n // Remove custom validation rules\n this.validationController.removeRule(rule => rule.message === message);\n }\n }\n\n /**\n * Trigger validation manually (enhanced version)\n */\n async validateTextarea(): Promise<boolean> {\n const result = await this.validationController.validate(this.value);\n return result.isValid;\n }\n\n /**\n * Set validation state externally (for form integration)\n */\n setValidationStatus(result: TextareaValidationResult): void {\n this.validationResult = result;\n \n // Update state based on validation result\n if (result.level === 'error') {\n this.state = TEXTAREA_STATE.Error;\n } else if (result.level === 'warning') {\n this.state = TEXTAREA_STATE.Warning;\n } else if (result.isValid) {\n this.state = TEXTAREA_STATE.Success;\n }\n \n this.requestUpdate();\n }\n\n private renderLabel() {\n return html`\n <div class=\"textarea-label\">\n <slot name=\"label\"></slot>\n ${this.required ? html`<span class=\"required-indicator\">*</span>` : ''}\n </div>\n `;\n }\n\n private renderTextarea() {\n return html`\n <textarea\n class=\"textarea-element\"\n .value=${this.value}\n .disabled=${this.disabled}\n .readOnly=${this.readonly}\n .required=${this.required || false}\n .rows=${this.rows}\n .cols=${this.cols}\n .placeholder=${this.placeholder}\n .autocomplete=${this.autocomplete}\n .name=${this.name || ''}\n maxlength=${this.maxLength || ''}\n style=\"resize: ${this.resize}\"\n @input=${this.handleInput}\n @focus=${this.handleFocus}\n @blur=${this.handleBlur}\n ></textarea>\n `;\n }\n\n private renderValidationIcon() {\n if (!this.hasFeedback || !this.validationResult) return '';\n\n const iconName = this.validationResult.level === 'error' ? 'error' :\n this.validationResult.level === 'warning' ? 'warning' : 'check-circle';\n\n return html`\n <nr-icon \n class=\"validation-icon ${this.validationResult.level}\"\n name=\"${iconName}\"\n size=\"small\"\n ></nr-icon>\n `;\n }\n\n private renderClearButton() {\n if (!this.allowClear || !this.value || this.disabled || this.readonly) return '';\n\n return html`\n <button\n class=\"clear-button\"\n type=\"button\"\n @click=${this.handleClear}\n aria-label=\"Clear textarea\"\n >\n <nr-icon name=\"x\" size=\"small\"></nr-icon>\n </button>\n `;\n }\n\n private renderCharacterCount() {\n if (!this.showCount) return '';\n\n const maxText = this.maxLength ? ` / ${this.maxLength}` : '';\n const isOverLimit = this.maxLength && this.characterCount > this.maxLength;\n\n return html`\n <div class=\"character-count ${isOverLimit ? 'over-limit' : ''}\">\n ${this.characterCount}${maxText}\n </div>\n `;\n }\n\n private renderHelperText() {\n const hasHelperSlot = this.shadowRoot?.querySelector('slot[name=\"helper-text\"]') as HTMLSlotElement;\n const hasHelperSlotContent = hasHelperSlot?.assignedNodes().length;\n const hasValidationMessages = this.validationResult?.messages.length;\n\n if (!hasHelperSlotContent && !hasValidationMessages) return '';\n\n return html`\n <div class=\"helper-text\">\n ${hasValidationMessages ? \n this.validationResult!.messages.map(msg => html`<div class=\"validation-message ${this.validationResult!.level}\">${msg}</div>`) :\n html`<slot name=\"helper-text\"></slot>`\n }\n </div>\n `;\n }\n\n override render() {\n const classes = [\n 'textarea-container',\n `size-${this.size}`,\n `variant-${this.variant}`,\n `state-${this.state}`,\n this.isFocused ? 'focused' : '',\n this.disabled ? 'disabled' : '',\n this.readonly ? 'readonly' : '',\n this.validationResult ? `validation-${this.validationResult.level}` : ''\n ].filter(Boolean).join(' ');\n\n return html`\n <div class=\"${classes}\">\n ${this.renderLabel()}\n \n <div class=\"textarea-wrapper\">\n <div class=\"addon-before\">\n <slot name=\"addon-before\"></slot>\n </div>\n \n <div class=\"textarea-input-container\">\n ${this.renderTextarea()}\n ${this.renderValidationIcon()}\n ${this.renderClearButton()}\n </div>\n \n <div class=\"addon-after\">\n <slot name=\"addon-after\"></slot>\n </div>\n </div>\n \n <div class=\"textarea-footer\">\n ${this.renderHelperText()}\n ${this.renderCharacterCount()}\n </div>\n </div>\n `;\n }\n}"]}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Textarea component styles for the Hybrid UI Library
3
+ *
4
+ * This file contains al .textarea-element::placeholder {
5
+ color: var(--nuraly-color-textarea-placeholder, #8c8c8c);
6
+ }
7
+
8
+ .textarea-element:hover {
9
+ border-color: var(--nuraly-color-textarea-border-hover, #7c3aed);
10
+ border-bottom-color: var(--nuraly-color-textarea-border-hover, #7c3aed);
11
+ }
12
+
13
+ .textarea-element:focus {
14
+ border-color: var(--nuraly-color-textarea-border-focus, #7c3aed);
15
+ border-bottom-color: var(--nuraly-color-textarea-border-focus, #7c3aed);
16
+ box-shadow: 0 0 0 1px var(--nuraly-color-textarea-border-focus, #7c3aed); for the nr-textarea component, including:
17
+ * - Base textarea styles with CSS custom properties for theming
18
+ * - Multiple textarea states (default, warning, error)
19
+ * - Size variations (small, medium, large)
20
+ * - Resize behaviors (none, vertical, horizontal, both)
21
+ * - Icon positioning and styling with comprehensive CSS variable overrides
22
+ * - Focus, disabled, and validation states
23
+ * - Auto-resize functionality
24
+ * - Dark theme support
25
+ *
26
+ * Icon Color Customization:
27
+ * The textarea component provides multiple levels of CSS variable overrides for icon colors:
28
+ *
29
+ * Global Level:
30
+ * - --nuraly-color-textarea-icon: Controls all icons in textarea components
31
+ * - --nuraly-size-textarea-icon: Controls size of all icons in textarea components
32
+ * - --nuraly-color-textarea-icon-hover: Hover state for all icons
33
+ * - --nuraly-color-textarea-icon-active: Active state for all icons
34
+ * - --nuraly-color-textarea-icon-disabled: Disabled state for all icons
35
+ *
36
+ * Specific Icon Types:
37
+ * - --nuraly-color-textarea-warning-icon: Warning state icons
38
+ * - --nuraly-color-textarea-error-icon: Error state icons
39
+ * - --nuraly-color-textarea-clear-icon: Clear functionality icons
40
+ * - --nuraly-color-textarea-validation-icon: Validation status icons
41
+ *
42
+ * Usage Examples:
43
+ * ```css
44
+ * :root {
45
+ * --nuraly-color-textarea-icon: #0066cc;
46
+ * --nuraly-color-textarea-error-icon: #cc0000;
47
+ * --nuraly-size-textarea-icon: 20px;
48
+ * }
49
+ *
50
+ * .custom-textarea {
51
+ * --nuraly-color-textarea-icon: #purple;
52
+ * }
53
+ * ```
54
+ *
55
+ * The styling system uses CSS custom properties with fallbacks to allow
56
+ * for both global and local customization of textarea appearance.
57
+ */
58
+ export declare const styles: import("lit").CSSResult;
59
+ //# sourceMappingURL=textarea.style.d.ts.map
@@ -0,0 +1,386 @@
1
+ import { css } from 'lit';
2
+ /**
3
+ * Textarea component styles for the Hybrid UI Library
4
+ *
5
+ * This file contains al .textarea-element::placeholder {
6
+ color: var(--nuraly-color-textarea-placeholder, #8c8c8c);
7
+ }
8
+
9
+ .textarea-element:hover {
10
+ border-color: var(--nuraly-color-textarea-border-hover, #7c3aed);
11
+ border-bottom-color: var(--nuraly-color-textarea-border-hover, #7c3aed);
12
+ }
13
+
14
+ .textarea-element:focus {
15
+ border-color: var(--nuraly-color-textarea-border-focus, #7c3aed);
16
+ border-bottom-color: var(--nuraly-color-textarea-border-focus, #7c3aed);
17
+ box-shadow: 0 0 0 1px var(--nuraly-color-textarea-border-focus, #7c3aed); for the nr-textarea component, including:
18
+ * - Base textarea styles with CSS custom properties for theming
19
+ * - Multiple textarea states (default, warning, error)
20
+ * - Size variations (small, medium, large)
21
+ * - Resize behaviors (none, vertical, horizontal, both)
22
+ * - Icon positioning and styling with comprehensive CSS variable overrides
23
+ * - Focus, disabled, and validation states
24
+ * - Auto-resize functionality
25
+ * - Dark theme support
26
+ *
27
+ * Icon Color Customization:
28
+ * The textarea component provides multiple levels of CSS variable overrides for icon colors:
29
+ *
30
+ * Global Level:
31
+ * - --nuraly-color-textarea-icon: Controls all icons in textarea components
32
+ * - --nuraly-size-textarea-icon: Controls size of all icons in textarea components
33
+ * - --nuraly-color-textarea-icon-hover: Hover state for all icons
34
+ * - --nuraly-color-textarea-icon-active: Active state for all icons
35
+ * - --nuraly-color-textarea-icon-disabled: Disabled state for all icons
36
+ *
37
+ * Specific Icon Types:
38
+ * - --nuraly-color-textarea-warning-icon: Warning state icons
39
+ * - --nuraly-color-textarea-error-icon: Error state icons
40
+ * - --nuraly-color-textarea-clear-icon: Clear functionality icons
41
+ * - --nuraly-color-textarea-validation-icon: Validation status icons
42
+ *
43
+ * Usage Examples:
44
+ * ```css
45
+ * :root {
46
+ * --nuraly-color-textarea-icon: #0066cc;
47
+ * --nuraly-color-textarea-error-icon: #cc0000;
48
+ * --nuraly-size-textarea-icon: 20px;
49
+ * }
50
+ *
51
+ * .custom-textarea {
52
+ * --nuraly-color-textarea-icon: #purple;
53
+ * }
54
+ * ```
55
+ *
56
+ * The styling system uses CSS custom properties with fallbacks to allow
57
+ * for both global and local customization of textarea appearance.
58
+ */
59
+ export const styles = css `
60
+ :host {
61
+ display: block;
62
+ position: relative;
63
+ font-family: var(--nuraly-font-family-textarea, Inter, ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, Ubuntu, Cantarell, "Noto Sans", sans-serif);
64
+ }
65
+
66
+ .textarea-container {
67
+ display: flex;
68
+ flex-direction: column;
69
+ gap: var(--nuraly-spacing-textarea-gap, 8px);
70
+ width: 100%;
71
+ }
72
+
73
+ .textarea-label {
74
+ display: flex;
75
+ align-items: center;
76
+ gap: 4px;
77
+ font-size: var(--nuraly-font-size-textarea, 16px);
78
+ font-weight: 500;
79
+ color: var(--nuraly-color-textarea-label, #262626);
80
+ line-height: var(--nuraly-line-height-textarea, 1.5);
81
+ }
82
+
83
+ .required-indicator {
84
+ color: var(--nuraly-color-textarea-error, #ef4444);
85
+ font-weight: 600;
86
+ }
87
+
88
+ .textarea-wrapper {
89
+ display: flex;
90
+ align-items: flex-start;
91
+ gap: var(--nuraly-spacing-textarea-gap, 8px);
92
+ position: relative;
93
+ }
94
+
95
+ .addon-before,
96
+ .addon-after {
97
+ display: flex;
98
+ align-items: flex-start;
99
+ padding-top: var(--nuraly-padding-textarea, 12px);
100
+ }
101
+
102
+ .textarea-input-container {
103
+ position: relative;
104
+ flex: 1;
105
+ display: flex;
106
+ align-items: flex-start;
107
+ }
108
+
109
+ .textarea-element {
110
+ width: 100%;
111
+ min-height: 80px;
112
+ padding: var(--nuraly-padding-textarea, 12px);
113
+ border-top: var(--nuraly-border-width-textarea, 1px) solid var(--nuraly-color-textarea-border, #d9d9d9);
114
+ border-left: var(--nuraly-border-width-textarea, 1px) solid var(--nuraly-color-textarea-border, #d9d9d9);
115
+ border-right: var(--nuraly-border-width-textarea, 1px) solid var(--nuraly-color-textarea-border, #d9d9d9);
116
+ border-bottom: var(--nuraly-border-width-textarea, 1px) solid var(--nuraly-color-textarea-border-bottom, var(--nuraly-color-textarea-border, #d9d9d9));
117
+ border-radius: var(--nuraly-border-radius-textarea, 6px);
118
+ background-color: var(--nuraly-color-textarea-background, #ffffff);
119
+ color: var(--nuraly-color-textarea-text, #262626);
120
+ font-family: var(--nuraly-font-family-textarea, Inter, ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, Ubuntu, Cantarell, "Noto Sans", sans-serif);
121
+ font-size: var(--nuraly-font-size-textarea, 16px);
122
+ line-height: var(--nuraly-line-height-textarea, 1.5);
123
+ outline: none;
124
+ transition: border-color 0.2s ease-in-out;
125
+ box-sizing: border-box;
126
+ }
127
+
128
+ .textarea-element::placeholder {
129
+ color: var(--nuraly-color-textarea-placeholder, #8c8c8c);
130
+ }
131
+
132
+ .textarea-element:hover:not(:disabled):not(:focus) {
133
+ border-top-color: var(--nuraly-color-textarea-border-hover, #7c3aed);
134
+ border-left-color: var(--nuraly-color-textarea-border-hover, #7c3aed);
135
+ border-right-color: var(--nuraly-color-textarea-border-hover, #7c3aed);
136
+ border-bottom-color: var(--nuraly-color-textarea-border-hover, #7c3aed);
137
+ }
138
+
139
+ .textarea-element:focus {
140
+ border-top-color: var(--nuraly-color-textarea-border-focus, #7c3aed);
141
+ border-left-color: var(--nuraly-color-textarea-border-focus, #7c3aed);
142
+ border-right-color: var(--nuraly-color-textarea-border-focus, #7c3aed);
143
+ border-bottom-color: var(--nuraly-color-textarea-border-focus, #7c3aed);
144
+ box-shadow: 0 0 0 1px var(--nuraly-color-textarea-border-focus, #7c3aed);
145
+ }
146
+
147
+ .textarea-element:disabled {
148
+ background-color: var(--nuraly-color-surface-disabled, #f5f5f5);
149
+ color: var(--nuraly-color-text-disabled, #8c8c8c);
150
+ border-color: var(--nuraly-color-border-disabled, #d9d9d9);
151
+ cursor: not-allowed;
152
+ resize: none;
153
+ }
154
+
155
+ .textarea-element:disabled {
156
+ background-color: var(--nuraly-color-surface-disabled, #f5f5f5);
157
+ color: var(--nuraly-color-text-disabled, #8c8c8c);
158
+ border-color: var(--nuraly-color-border-disabled, #d9d9d9);
159
+ cursor: not-allowed;
160
+ resize: none;
161
+ }
162
+
163
+ .textarea-element:read-only {
164
+ background-color: var(--nuraly-color-surface-readonly, #f9f9f9);
165
+ cursor: default;
166
+ }
167
+
168
+ /* Size variants */
169
+ .size-small .textarea-element {
170
+ font-size: var(--nuraly-font-size-textarea-small, 14px);
171
+ padding: calc(var(--nuraly-padding-textarea, 12px) * 0.75);
172
+ min-height: 60px;
173
+ }
174
+
175
+ .size-large .textarea-element {
176
+ font-size: var(--nuraly-font-size-textarea-large, 18px);
177
+ padding: calc(var(--nuraly-padding-textarea, 12px) * 1.25);
178
+ min-height: 100px;
179
+ }
180
+
181
+ /* Variant styles */
182
+ .variant-outlined .textarea-element {
183
+ border: var(--nuraly-border-width-textarea, 1px) solid var(--nuraly-color-textarea-border, #d9d9d9);
184
+ background-color: var(--nuraly-color-textarea-background, #ffffff);
185
+ }
186
+
187
+ .variant-filled .textarea-element {
188
+ border: var(--nuraly-border-width-textarea, 1px) solid transparent;
189
+ background-color: var(--nuraly-color-surface-secondary, #f5f5f5);
190
+ }
191
+
192
+ .variant-filled .textarea-element:focus {
193
+ background-color: var(--nuraly-color-textarea-background, #ffffff);
194
+ border-color: var(--nuraly-color-textarea-border-focus, #7c3aed);
195
+ }
196
+
197
+ .variant-borderless .textarea-element {
198
+ border: none;
199
+ background-color: transparent;
200
+ padding-left: 0;
201
+ padding-right: 0;
202
+ }
203
+
204
+ .variant-underlined .textarea-element {
205
+ border: none;
206
+ border-bottom: var(--nuraly-border-width-textarea, 1px) solid var(--nuraly-color-textarea-border, #d9d9d9);
207
+ border-radius: 0;
208
+ background-color: transparent;
209
+ padding-left: 0;
210
+ padding-right: 0;
211
+ }
212
+
213
+ .variant-underlined .textarea-element:focus {
214
+ border-bottom-color: var(--nuraly-color-textarea-border-focus, #7c3aed);
215
+ box-shadow: none;
216
+ }
217
+
218
+ /* State styles */
219
+ .state-error .textarea-element,
220
+ .validation-error .textarea-element {
221
+ border-color: var(--nuraly-color-textarea-error, #ef4444);
222
+ }
223
+
224
+ .state-error .textarea-element:focus,
225
+ .validation-error .textarea-element:focus {
226
+ border-color: var(--nuraly-color-textarea-error, #ef4444);
227
+ box-shadow: 0 0 0 1px var(--nuraly-color-textarea-error, #ef4444);
228
+ }
229
+
230
+ .state-warning .textarea-element,
231
+ .validation-warning .textarea-element {
232
+ border-color: var(--nuraly-color-textarea-warning, #f59e0b);
233
+ }
234
+
235
+ .state-warning .textarea-element:focus,
236
+ .validation-warning .textarea-element:focus {
237
+ border-color: var(--nuraly-color-textarea-warning, #f59e0b);
238
+ box-shadow: 0 0 0 1px var(--nuraly-color-textarea-warning, #f59e0b);
239
+ }
240
+
241
+ /* Icons */
242
+ .validation-icon,
243
+ .clear-button {
244
+ position: absolute;
245
+ top: var(--nuraly-padding-textarea, 12px);
246
+ right: var(--nuraly-padding-textarea, 12px);
247
+ z-index: 1;
248
+ }
249
+
250
+ .validation-icon {
251
+ color: var(--nuraly-color-textarea-icon, #8c8c8c);
252
+ pointer-events: none;
253
+ }
254
+
255
+ .validation-icon.error {
256
+ color: var(--nuraly-color-textarea-error, #ef4444);
257
+ }
258
+
259
+ .validation-icon.warning {
260
+ color: var(--nuraly-color-textarea-warning, #f59e0b);
261
+ }
262
+
263
+ .validation-icon.success {
264
+ color: var(--nuraly-color-textarea-success, #10b981);
265
+ }
266
+
267
+ .clear-button {
268
+ display: flex;
269
+ align-items: center;
270
+ justify-content: center;
271
+ background: none;
272
+ border: none;
273
+ cursor: pointer;
274
+ color: var(--nuraly-color-textarea-icon, #8c8c8c);
275
+ padding: 2px;
276
+ border-radius: 4px;
277
+ transition: color 0.2s ease-in-out, background-color 0.2s ease-in-out;
278
+ }
279
+
280
+ .clear-button:hover {
281
+ color: var(--nuraly-color-textarea-icon-hover, #7c3aed);
282
+ background-color: var(--nuraly-color-surface-hover, rgba(0, 0, 0, 0.05));
283
+ }
284
+
285
+ .clear-button:active {
286
+ color: var(--nuraly-color-textarea-icon-active, #6d28d9);
287
+ }
288
+
289
+ /* Adjust textarea padding when icons are present */
290
+ :host([allow-clear]) .textarea-element,
291
+ :host([has-feedback]) .textarea-element {
292
+ padding-right: calc(var(--nuraly-padding-textarea, 12px) + 16px + 8px);
293
+ }
294
+
295
+ /* Footer */
296
+ .textarea-footer {
297
+ display: flex;
298
+ justify-content: space-between;
299
+ align-items: flex-start;
300
+ gap: var(--nuraly-spacing-textarea-gap, 8px);
301
+ min-height: 20px;
302
+ }
303
+
304
+ .helper-text {
305
+ flex: 1;
306
+ font-size: var(--nuraly-font-size-textarea-small, 14px);
307
+ line-height: 1.4;
308
+ color: var(--nuraly-color-textarea-helper-text, #666666);
309
+ }
310
+
311
+ .validation-message {
312
+ margin-bottom: 4px;
313
+ }
314
+
315
+ .validation-message:last-child {
316
+ margin-bottom: 0;
317
+ }
318
+
319
+ .validation-message.error {
320
+ color: var(--nuraly-color-textarea-error, #ef4444);
321
+ }
322
+
323
+ .validation-message.warning {
324
+ color: var(--nuraly-color-textarea-warning, #f59e0b);
325
+ }
326
+
327
+ .validation-message.success {
328
+ color: var(--nuraly-color-textarea-success, #10b981);
329
+ }
330
+
331
+ .character-count {
332
+ font-size: var(--nuraly-font-size-textarea-small, 14px);
333
+ color: var(--nuraly-color-textarea-counter, #666666);
334
+ white-space: nowrap;
335
+ line-height: 1.4;
336
+ }
337
+
338
+ .character-count.over-limit {
339
+ color: var(--nuraly-color-textarea-counter-over, #ef4444);
340
+ font-weight: 500;
341
+ }
342
+
343
+ /* Responsive adjustments */
344
+ @media (max-width: 640px) {
345
+ .textarea-footer {
346
+ flex-direction: column;
347
+ align-items: stretch;
348
+ }
349
+
350
+ .character-count {
351
+ text-align: right;
352
+ }
353
+ }
354
+
355
+ /* Focus-visible for accessibility */
356
+ .textarea-element:focus-visible {
357
+ outline: 2px solid var(--nuraly-color-textarea-border-focus, #7c3aed);
358
+ outline-offset: 2px;
359
+ }
360
+
361
+ /* High contrast mode support */
362
+ @media (prefers-contrast: high) {
363
+ .textarea-element {
364
+ border-width: 2px;
365
+ }
366
+
367
+ .textarea-element:focus {
368
+ box-shadow: 0 0 0 2px var(--nuraly-color-textarea-border-focus, #7c3aed);
369
+ }
370
+ }
371
+
372
+ /* Reduced motion support */
373
+ @media (prefers-reduced-motion: reduce) {
374
+ .textarea-element,
375
+ .clear-button {
376
+ transition: none;
377
+ }
378
+ }
379
+
380
+ /* ========================================
381
+ * THEME SPECIFIC OVERRIDES
382
+ * ======================================== */
383
+
384
+ /* No theme-specific overrides - themes handle styling through CSS variables */
385
+ `;
386
+ //# sourceMappingURL=textarea.style.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"textarea.style.js","sourceRoot":"","sources":["../../../src/components/textarea/textarea.style.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAE1B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwDG;AAEH,MAAM,CAAC,MAAM,MAAM,GAAG,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsUxB,CAAC","sourcesContent":["import { css } from 'lit';\n\n/**\n * Textarea component styles for the Hybrid UI Library\n * \n * This file contains al .textarea-element::placeholder {\n color: var(--nuraly-color-textarea-placeholder, #8c8c8c);\n }\n\n .textarea-element:hover {\n border-color: var(--nuraly-color-textarea-border-hover, #7c3aed);\n border-bottom-color: var(--nuraly-color-textarea-border-hover, #7c3aed);\n }\n\n .textarea-element:focus {\n border-color: var(--nuraly-color-textarea-border-focus, #7c3aed);\n border-bottom-color: var(--nuraly-color-textarea-border-focus, #7c3aed);\n box-shadow: 0 0 0 1px var(--nuraly-color-textarea-border-focus, #7c3aed); for the nr-textarea component, including:\n * - Base textarea styles with CSS custom properties for theming\n * - Multiple textarea states (default, warning, error)\n * - Size variations (small, medium, large)\n * - Resize behaviors (none, vertical, horizontal, both)\n * - Icon positioning and styling with comprehensive CSS variable overrides\n * - Focus, disabled, and validation states\n * - Auto-resize functionality\n * - Dark theme support\n * \n * Icon Color Customization:\n * The textarea component provides multiple levels of CSS variable overrides for icon colors:\n * \n * Global Level:\n * - --nuraly-color-textarea-icon: Controls all icons in textarea components\n * - --nuraly-size-textarea-icon: Controls size of all icons in textarea components\n * - --nuraly-color-textarea-icon-hover: Hover state for all icons\n * - --nuraly-color-textarea-icon-active: Active state for all icons\n * - --nuraly-color-textarea-icon-disabled: Disabled state for all icons\n * \n * Specific Icon Types:\n * - --nuraly-color-textarea-warning-icon: Warning state icons\n * - --nuraly-color-textarea-error-icon: Error state icons\n * - --nuraly-color-textarea-clear-icon: Clear functionality icons\n * - --nuraly-color-textarea-validation-icon: Validation status icons\n * \n * Usage Examples:\n * ```css\n * :root {\n * --nuraly-color-textarea-icon: #0066cc;\n * --nuraly-color-textarea-error-icon: #cc0000;\n * --nuraly-size-textarea-icon: 20px;\n * }\n * \n * .custom-textarea {\n * --nuraly-color-textarea-icon: #purple;\n * }\n * ```\n * \n * The styling system uses CSS custom properties with fallbacks to allow\n * for both global and local customization of textarea appearance.\n */\n\nexport const styles = css`\n :host {\n display: block;\n position: relative;\n font-family: var(--nuraly-font-family-textarea, Inter, ui-sans-serif, system-ui, -apple-system, \"Segoe UI\", Roboto, Ubuntu, Cantarell, \"Noto Sans\", sans-serif);\n }\n\n .textarea-container {\n display: flex;\n flex-direction: column;\n gap: var(--nuraly-spacing-textarea-gap, 8px);\n width: 100%;\n }\n\n .textarea-label {\n display: flex;\n align-items: center;\n gap: 4px;\n font-size: var(--nuraly-font-size-textarea, 16px);\n font-weight: 500;\n color: var(--nuraly-color-textarea-label, #262626);\n line-height: var(--nuraly-line-height-textarea, 1.5);\n }\n\n .required-indicator {\n color: var(--nuraly-color-textarea-error, #ef4444);\n font-weight: 600;\n }\n\n .textarea-wrapper {\n display: flex;\n align-items: flex-start;\n gap: var(--nuraly-spacing-textarea-gap, 8px);\n position: relative;\n }\n\n .addon-before,\n .addon-after {\n display: flex;\n align-items: flex-start;\n padding-top: var(--nuraly-padding-textarea, 12px);\n }\n\n .textarea-input-container {\n position: relative;\n flex: 1;\n display: flex;\n align-items: flex-start;\n }\n\n .textarea-element {\n width: 100%;\n min-height: 80px;\n padding: var(--nuraly-padding-textarea, 12px);\n border-top: var(--nuraly-border-width-textarea, 1px) solid var(--nuraly-color-textarea-border, #d9d9d9);\n border-left: var(--nuraly-border-width-textarea, 1px) solid var(--nuraly-color-textarea-border, #d9d9d9);\n border-right: var(--nuraly-border-width-textarea, 1px) solid var(--nuraly-color-textarea-border, #d9d9d9);\n border-bottom: var(--nuraly-border-width-textarea, 1px) solid var(--nuraly-color-textarea-border-bottom, var(--nuraly-color-textarea-border, #d9d9d9));\n border-radius: var(--nuraly-border-radius-textarea, 6px);\n background-color: var(--nuraly-color-textarea-background, #ffffff);\n color: var(--nuraly-color-textarea-text, #262626);\n font-family: var(--nuraly-font-family-textarea, Inter, ui-sans-serif, system-ui, -apple-system, \"Segoe UI\", Roboto, Ubuntu, Cantarell, \"Noto Sans\", sans-serif);\n font-size: var(--nuraly-font-size-textarea, 16px);\n line-height: var(--nuraly-line-height-textarea, 1.5);\n outline: none;\n transition: border-color 0.2s ease-in-out;\n box-sizing: border-box;\n }\n\n .textarea-element::placeholder {\n color: var(--nuraly-color-textarea-placeholder, #8c8c8c);\n }\n\n .textarea-element:hover:not(:disabled):not(:focus) {\n border-top-color: var(--nuraly-color-textarea-border-hover, #7c3aed);\n border-left-color: var(--nuraly-color-textarea-border-hover, #7c3aed);\n border-right-color: var(--nuraly-color-textarea-border-hover, #7c3aed);\n border-bottom-color: var(--nuraly-color-textarea-border-hover, #7c3aed);\n }\n\n .textarea-element:focus {\n border-top-color: var(--nuraly-color-textarea-border-focus, #7c3aed);\n border-left-color: var(--nuraly-color-textarea-border-focus, #7c3aed);\n border-right-color: var(--nuraly-color-textarea-border-focus, #7c3aed);\n border-bottom-color: var(--nuraly-color-textarea-border-focus, #7c3aed);\n box-shadow: 0 0 0 1px var(--nuraly-color-textarea-border-focus, #7c3aed);\n }\n\n .textarea-element:disabled {\n background-color: var(--nuraly-color-surface-disabled, #f5f5f5);\n color: var(--nuraly-color-text-disabled, #8c8c8c);\n border-color: var(--nuraly-color-border-disabled, #d9d9d9);\n cursor: not-allowed;\n resize: none;\n }\n\n .textarea-element:disabled {\n background-color: var(--nuraly-color-surface-disabled, #f5f5f5);\n color: var(--nuraly-color-text-disabled, #8c8c8c);\n border-color: var(--nuraly-color-border-disabled, #d9d9d9);\n cursor: not-allowed;\n resize: none;\n }\n\n .textarea-element:read-only {\n background-color: var(--nuraly-color-surface-readonly, #f9f9f9);\n cursor: default;\n }\n\n /* Size variants */\n .size-small .textarea-element {\n font-size: var(--nuraly-font-size-textarea-small, 14px);\n padding: calc(var(--nuraly-padding-textarea, 12px) * 0.75);\n min-height: 60px;\n }\n\n .size-large .textarea-element {\n font-size: var(--nuraly-font-size-textarea-large, 18px);\n padding: calc(var(--nuraly-padding-textarea, 12px) * 1.25);\n min-height: 100px;\n }\n\n /* Variant styles */\n .variant-outlined .textarea-element {\n border: var(--nuraly-border-width-textarea, 1px) solid var(--nuraly-color-textarea-border, #d9d9d9);\n background-color: var(--nuraly-color-textarea-background, #ffffff);\n }\n\n .variant-filled .textarea-element {\n border: var(--nuraly-border-width-textarea, 1px) solid transparent;\n background-color: var(--nuraly-color-surface-secondary, #f5f5f5);\n }\n\n .variant-filled .textarea-element:focus {\n background-color: var(--nuraly-color-textarea-background, #ffffff);\n border-color: var(--nuraly-color-textarea-border-focus, #7c3aed);\n }\n\n .variant-borderless .textarea-element {\n border: none;\n background-color: transparent;\n padding-left: 0;\n padding-right: 0;\n }\n\n .variant-underlined .textarea-element {\n border: none;\n border-bottom: var(--nuraly-border-width-textarea, 1px) solid var(--nuraly-color-textarea-border, #d9d9d9);\n border-radius: 0;\n background-color: transparent;\n padding-left: 0;\n padding-right: 0;\n }\n\n .variant-underlined .textarea-element:focus {\n border-bottom-color: var(--nuraly-color-textarea-border-focus, #7c3aed);\n box-shadow: none;\n }\n\n /* State styles */\n .state-error .textarea-element,\n .validation-error .textarea-element {\n border-color: var(--nuraly-color-textarea-error, #ef4444);\n }\n\n .state-error .textarea-element:focus,\n .validation-error .textarea-element:focus {\n border-color: var(--nuraly-color-textarea-error, #ef4444);\n box-shadow: 0 0 0 1px var(--nuraly-color-textarea-error, #ef4444);\n }\n\n .state-warning .textarea-element,\n .validation-warning .textarea-element {\n border-color: var(--nuraly-color-textarea-warning, #f59e0b);\n }\n\n .state-warning .textarea-element:focus,\n .validation-warning .textarea-element:focus {\n border-color: var(--nuraly-color-textarea-warning, #f59e0b);\n box-shadow: 0 0 0 1px var(--nuraly-color-textarea-warning, #f59e0b);\n }\n\n /* Icons */\n .validation-icon,\n .clear-button {\n position: absolute;\n top: var(--nuraly-padding-textarea, 12px);\n right: var(--nuraly-padding-textarea, 12px);\n z-index: 1;\n }\n\n .validation-icon {\n color: var(--nuraly-color-textarea-icon, #8c8c8c);\n pointer-events: none;\n }\n\n .validation-icon.error {\n color: var(--nuraly-color-textarea-error, #ef4444);\n }\n\n .validation-icon.warning {\n color: var(--nuraly-color-textarea-warning, #f59e0b);\n }\n\n .validation-icon.success {\n color: var(--nuraly-color-textarea-success, #10b981);\n }\n\n .clear-button {\n display: flex;\n align-items: center;\n justify-content: center;\n background: none;\n border: none;\n cursor: pointer;\n color: var(--nuraly-color-textarea-icon, #8c8c8c);\n padding: 2px;\n border-radius: 4px;\n transition: color 0.2s ease-in-out, background-color 0.2s ease-in-out;\n }\n\n .clear-button:hover {\n color: var(--nuraly-color-textarea-icon-hover, #7c3aed);\n background-color: var(--nuraly-color-surface-hover, rgba(0, 0, 0, 0.05));\n }\n\n .clear-button:active {\n color: var(--nuraly-color-textarea-icon-active, #6d28d9);\n }\n\n /* Adjust textarea padding when icons are present */\n :host([allow-clear]) .textarea-element,\n :host([has-feedback]) .textarea-element {\n padding-right: calc(var(--nuraly-padding-textarea, 12px) + 16px + 8px);\n }\n\n /* Footer */\n .textarea-footer {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n gap: var(--nuraly-spacing-textarea-gap, 8px);\n min-height: 20px;\n }\n\n .helper-text {\n flex: 1;\n font-size: var(--nuraly-font-size-textarea-small, 14px);\n line-height: 1.4;\n color: var(--nuraly-color-textarea-helper-text, #666666);\n }\n\n .validation-message {\n margin-bottom: 4px;\n }\n\n .validation-message:last-child {\n margin-bottom: 0;\n }\n\n .validation-message.error {\n color: var(--nuraly-color-textarea-error, #ef4444);\n }\n\n .validation-message.warning {\n color: var(--nuraly-color-textarea-warning, #f59e0b);\n }\n\n .validation-message.success {\n color: var(--nuraly-color-textarea-success, #10b981);\n }\n\n .character-count {\n font-size: var(--nuraly-font-size-textarea-small, 14px);\n color: var(--nuraly-color-textarea-counter, #666666);\n white-space: nowrap;\n line-height: 1.4;\n }\n\n .character-count.over-limit {\n color: var(--nuraly-color-textarea-counter-over, #ef4444);\n font-weight: 500;\n }\n\n /* Responsive adjustments */\n @media (max-width: 640px) {\n .textarea-footer {\n flex-direction: column;\n align-items: stretch;\n }\n \n .character-count {\n text-align: right;\n }\n }\n\n /* Focus-visible for accessibility */\n .textarea-element:focus-visible {\n outline: 2px solid var(--nuraly-color-textarea-border-focus, #7c3aed);\n outline-offset: 2px;\n }\n\n /* High contrast mode support */\n @media (prefers-contrast: high) {\n .textarea-element {\n border-width: 2px;\n }\n \n .textarea-element:focus {\n box-shadow: 0 0 0 2px var(--nuraly-color-textarea-border-focus, #7c3aed);\n }\n }\n\n /* Reduced motion support */\n @media (prefers-reduced-motion: reduce) {\n .textarea-element,\n .clear-button {\n transition: none;\n }\n }\n\n /* ========================================\n * THEME SPECIFIC OVERRIDES\n * ======================================== */\n\n /* No theme-specific overrides - themes handle styling through CSS variables */\n`;"]}
@@ -0,0 +1,102 @@
1
+ export declare const enum TEXTAREA_STATE {
2
+ Default = "default",
3
+ Error = "error",
4
+ Warning = "warning",
5
+ Success = "success"
6
+ }
7
+ export declare const enum TEXTAREA_SIZE {
8
+ Large = "large",
9
+ Medium = "medium",
10
+ Small = "small"
11
+ }
12
+ export declare const enum TEXTAREA_VARIANT {
13
+ Default = "",
14
+ Outlined = "outlined",
15
+ Filled = "filled",
16
+ Borderless = "borderless",
17
+ Underlined = "underlined"
18
+ }
19
+ export declare const enum TEXTAREA_RESIZE {
20
+ None = "none",
21
+ Vertical = "vertical",
22
+ Horizontal = "horizontal",
23
+ Both = "both"
24
+ }
25
+ export interface FocusOptions {
26
+ preventScroll?: boolean;
27
+ cursor?: 'start' | 'end' | 'all' | number;
28
+ select?: boolean;
29
+ }
30
+ export interface BlurOptions {
31
+ preventScroll?: boolean;
32
+ restoreCursor?: boolean;
33
+ }
34
+ export interface FocusChangeEvent {
35
+ focused: boolean;
36
+ cursorPosition?: number;
37
+ selectedText?: string;
38
+ }
39
+ /**
40
+ * Validation rule interface
41
+ */
42
+ export interface ValidationRule {
43
+ /** Validation function that returns true if valid */
44
+ validator: (value: string) => boolean | Promise<boolean>;
45
+ /** Error message to display if validation fails */
46
+ message: string;
47
+ /** Rule severity level */
48
+ level?: 'error' | 'warning';
49
+ /** Whether this rule should block form submission */
50
+ blocking?: boolean;
51
+ }
52
+ /**
53
+ * Validation result interface
54
+ */
55
+ export interface TextareaValidationResult {
56
+ /** Whether the current value is valid */
57
+ isValid: boolean;
58
+ /** Array of validation messages (errors/warnings) */
59
+ messages: string[];
60
+ /** Validation level (error or warning) */
61
+ level: 'error' | 'warning' | 'success';
62
+ /** Whether validation is blocking */
63
+ blocking: boolean;
64
+ }
65
+ /**
66
+ * Textarea change event detail interface
67
+ */
68
+ export interface TextareaChangeEvent {
69
+ /** Current textarea value */
70
+ value: string;
71
+ /** Character count */
72
+ length: number;
73
+ /** Whether max length is exceeded */
74
+ exceedsMaxLength: boolean;
75
+ /** Validation result */
76
+ validation?: TextareaValidationResult;
77
+ }
78
+ /**
79
+ * Textarea resize event detail interface
80
+ */
81
+ export interface TextareaResizeEvent {
82
+ /** New width in pixels */
83
+ width: number;
84
+ /** New height in pixels */
85
+ height: number;
86
+ /** Resize direction */
87
+ direction: 'horizontal' | 'vertical' | 'both';
88
+ }
89
+ export declare const EMPTY_STRING = "";
90
+ /**
91
+ * Common textarea configuration constants
92
+ */
93
+ export declare const TEXTAREA_DEFAULTS: {
94
+ readonly ROWS: 3;
95
+ readonly COLS: 50;
96
+ readonly MAX_LENGTH: 1000;
97
+ readonly RESIZE: TEXTAREA_RESIZE.Vertical;
98
+ readonly SIZE: TEXTAREA_SIZE.Medium;
99
+ readonly STATE: TEXTAREA_STATE.Default;
100
+ readonly VARIANT: TEXTAREA_VARIANT.Underlined;
101
+ };
102
+ //# sourceMappingURL=textarea.types.d.ts.map
@@ -0,0 +1,14 @@
1
+ export const EMPTY_STRING = '';
2
+ /**
3
+ * Common textarea configuration constants
4
+ */
5
+ export const TEXTAREA_DEFAULTS = {
6
+ ROWS: 3,
7
+ COLS: 50,
8
+ MAX_LENGTH: 1000,
9
+ RESIZE: "vertical" /* TEXTAREA_RESIZE.Vertical */,
10
+ SIZE: "medium" /* TEXTAREA_SIZE.Medium */,
11
+ STATE: "default" /* TEXTAREA_STATE.Default */,
12
+ VARIANT: "underlined" /* TEXTAREA_VARIANT.Underlined */,
13
+ };
14
+ //# sourceMappingURL=textarea.types.js.map