@nuralyui/textarea 0.1.4 → 0.1.5

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.
package/bundle.js CHANGED
@@ -330,22 +330,22 @@ import{css as t,LitElement as e,html as r}from"lit";import{query as a,property a
330
330
  * Copyright 2023 Nuraly, Laabidi Aymen
331
331
  * SPDX-License-Identifier: MIT
332
332
  */
333
- class c{constructor(t){this._host=t,this._host.addController(this)}get host(){return this._host}hostConnected(){}hostDisconnected(){}hostUpdated(){}hostUpdate(){}handleError(t,e){console.error(`[${this.constructor.name}] Error in ${e}:`,t);const r=new CustomEvent("textarea-controller-error",{detail:{error:t.message,context:e,controller:this.constructor.name},bubbles:!0,composed:!0});this._host.dispatchEvent(r)}safeExecute(t,e,r){try{return t()}catch(t){return this.handleError(t,e),r}}requestHostUpdate(){this.safeExecute((()=>this._host.requestUpdate()),"requestHostUpdate")}debounce(t,e){let r;return(...a)=>{clearTimeout(r),r=setTimeout((()=>t.apply(this,a)),e)}}}
333
+ class c{constructor(t){this._host=t,this._host.addController(this)}get host(){return this._host}hostConnected(){}hostDisconnected(){}hostUpdated(){}hostUpdate(){}handleError(t,e){console.error(`[${this.constructor.name}] Error in ${e}:`,t);const r=new CustomEvent("textarea-controller-error",{detail:{error:t.message,context:e,controller:this.constructor.name},bubbles:!0,composed:!0});this._host.dispatchEvent(r)}safeExecute(t,e,r){try{return t()}catch(t){return this.handleError(t,e),r}}requestHostUpdate(){this.safeExecute(()=>this._host.requestUpdate(),"requestHostUpdate")}debounce(t,e){let r;return(...a)=>{clearTimeout(r),r=setTimeout(()=>t.apply(this,a),e)}}}
334
334
  /**
335
335
  * @license
336
336
  * Copyright 2023 Nuraly, Laabidi Aymen
337
337
  * SPDX-License-Identifier: MIT
338
- */var u=function(t,e,r,a){return new(r||(r=Promise))((function(i,o){function s(t){try{l(a.next(t))}catch(t){o(t)}}function n(t){try{l(a.throw(t))}catch(t){o(t)}}function l(t){var e;t.done?i(t.value):(e=t.value,e instanceof r?e:new r((function(t){t(e)}))).then(s,n)}l((a=a.apply(t,e||[])).next())}))};class v extends c{constructor(t){super(t),this._validationDebounceMs=300}get validationHost(){return this._host}get validationResult(){return this._validationResult}setValidationDebounce(t){this._validationDebounceMs=t}validate(t){return u(this,void 0,void 0,(function*(){const e=null!=t?t:this.validationHost.value,r=this.validationHost.rules||[];if(0===r.length)return this._validationResult=void 0,{isValid:!0,messages:[],level:"success",blocking:!1};const a=[];let i=!1,o=!1,s=!1;for(const t of r)try{(yield t.validator(e))||(a.push(t.message),"error"!==t.level&&t.level?"warning"===t.level&&(o=!0):(i=!0,!1!==t.blocking&&(s=!0)))}catch(t){this.handleError(t,"validation"),a.push(`Validation error: ${t}`),i=!0,s=!0}const n=i?"error":o?"warning":"success";return this._validationResult={isValid:!i&&!o,messages:a,level:n,blocking:s},this.updateHostValidationState(),this.dispatchValidationEvent(),this._validationResult}))}validateDebounced(t){return new Promise((e=>{this._validationTimeout&&clearTimeout(this._validationTimeout),this._validationTimeout=setTimeout((()=>u(this,void 0,void 0,(function*(){const r=yield this.validate(t);e(r)}))),this._validationDebounceMs)}))}validateOnChangeIfEnabled(t){return u(this,void 0,void 0,(function*(){if(this.validationHost.validateOnChange&&(this.validationHost.rules||[]).length>0)return yield this.validateDebounced(t)}))}validateOnBlurIfEnabled(t){return u(this,void 0,void 0,(function*(){if(this.validationHost.validateOnBlur&&(this.validationHost.rules||[]).length>0)return yield this.validate(t)}))}clearValidation(){this._validationResult=void 0,this._validationTimeout&&(clearTimeout(this._validationTimeout),this._validationTimeout=void 0),"default"!==this.validationHost.state&&(this.validationHost.state="default",this.requestHostUpdate()),this.dispatchValidationEvent()}isValid(){var t,e;return null===(e=null===(t=this._validationResult)||void 0===t?void 0:t.isValid)||void 0===e||e}isBlocking(){var t,e;return null!==(e=null===(t=this._validationResult)||void 0===t?void 0:t.blocking)&&void 0!==e&&e}getValidationMessages(){var t,e;return null!==(e=null===(t=this._validationResult)||void 0===t?void 0:t.messages)&&void 0!==e?e:[]}addRule(t){const e=this.validationHost.rules||[];e.push(t),this.validationHost.rules=e,this.requestHostUpdate()}removeRule(t){const e=this.validationHost.rules||[];this.validationHost.rules=e.filter((e=>!t(e))),this.requestHostUpdate()}clearRules(){this.validationHost.rules=[],this.clearValidation()}static createRequiredRule(t="This field is required"){return{validator:t=>t.trim().length>0,message:t,level:"error",blocking:!0}}static createMinLengthRule(t,e){return{validator:e=>e.length>=t,message:e||`Minimum ${t} characters required`,level:"error",blocking:!0}}static createMaxLengthRule(t,e){return{validator:e=>e.length<=t,message:e||`Maximum ${t} characters allowed`,level:"error",blocking:!0}}static createPatternRule(t,e){return{validator:e=>t.test(e),message:e,level:"error",blocking:!0}}updateHostValidationState(){if(!this._validationResult)return;const{level:t}=this._validationResult;"error"===t?this.validationHost.state="error":"warning"===t?this.validationHost.state="warning":this.validationHost.rules.length>0&&(this.validationHost.state="success"),this.requestHostUpdate()}dispatchValidationEvent(){var t,e,r,a,i,o,s,n;const l={isValid:null===(e=null===(t=this._validationResult)||void 0===t?void 0:t.isValid)||void 0===e||e,validationMessage:null!==(a=null===(r=this._validationResult)||void 0===r?void 0:r.messages.join(", "))&&void 0!==a?a:"",errors:null!==(o=null===(i=this._validationResult)||void 0===i?void 0:i.messages.filter((()=>{var t;return"error"===(null===(t=this._validationResult)||void 0===t?void 0:t.level)})))&&void 0!==o?o:[],warnings:null!==(n=null===(s=this._validationResult)||void 0===s?void 0:s.messages.filter((()=>{var t;return"warning"===(null===(t=this._validationResult)||void 0===t?void 0:t.level)})))&&void 0!==n?n:[],validationResult:this._validationResult||{isValid:!0,messages:[],level:"success",blocking:!1}},d=new CustomEvent("textarea-validation",{detail:l,bubbles:!0,composed:!0});this.safeExecute((()=>this._host.dispatchEvent(d)),"dispatchValidationEvent")}hostDisconnected(){this._validationTimeout&&(clearTimeout(this._validationTimeout),this._validationTimeout=void 0)}}
338
+ */var u=function(t,e,r,a){return new(r||(r=Promise))(function(i,o){function s(t){try{l(a.next(t))}catch(t){o(t)}}function n(t){try{l(a.throw(t))}catch(t){o(t)}}function l(t){var e;t.done?i(t.value):(e=t.value,e instanceof r?e:new r(function(t){t(e)})).then(s,n)}l((a=a.apply(t,e||[])).next())})};class v extends c{constructor(t){super(t),this._validationDebounceMs=300}get validationHost(){return this._host}get validationResult(){return this._validationResult}setValidationDebounce(t){this._validationDebounceMs=t}validate(t){return u(this,void 0,void 0,function*(){const e=null!=t?t:this.validationHost.value,r=this.validationHost.rules||[];if(0===r.length)return this._validationResult=void 0,{isValid:!0,messages:[],level:"success",blocking:!1};const a=[];let i=!1,o=!1,s=!1;for(const t of r)try{(yield t.validator(e))||(a.push(t.message),"error"!==t.level&&t.level?"warning"===t.level&&(o=!0):(i=!0,!1!==t.blocking&&(s=!0)))}catch(t){this.handleError(t,"validation"),a.push(`Validation error: ${t}`),i=!0,s=!0}const n=i?"error":o?"warning":"success";return this._validationResult={isValid:!i&&!o,messages:a,level:n,blocking:s},this.updateHostValidationState(),this.dispatchValidationEvent(),this._validationResult})}validateDebounced(t){return new Promise(e=>{this._validationTimeout&&clearTimeout(this._validationTimeout),this._validationTimeout=setTimeout(()=>u(this,void 0,void 0,function*(){const r=yield this.validate(t);e(r)}),this._validationDebounceMs)})}validateOnChangeIfEnabled(t){return u(this,void 0,void 0,function*(){if(this.validationHost.validateOnChange&&(this.validationHost.rules||[]).length>0)return yield this.validateDebounced(t)})}validateOnBlurIfEnabled(t){return u(this,void 0,void 0,function*(){if(this.validationHost.validateOnBlur&&(this.validationHost.rules||[]).length>0)return yield this.validate(t)})}clearValidation(){this._validationResult=void 0,this._validationTimeout&&(clearTimeout(this._validationTimeout),this._validationTimeout=void 0),"default"!==this.validationHost.state&&(this.validationHost.state="default",this.requestHostUpdate()),this.dispatchValidationEvent()}isValid(){var t,e;return null===(e=null===(t=this._validationResult)||void 0===t?void 0:t.isValid)||void 0===e||e}isBlocking(){var t,e;return null!==(e=null===(t=this._validationResult)||void 0===t?void 0:t.blocking)&&void 0!==e&&e}getValidationMessages(){var t,e;return null!==(e=null===(t=this._validationResult)||void 0===t?void 0:t.messages)&&void 0!==e?e:[]}addRule(t){const e=this.validationHost.rules||[];e.push(t),this.validationHost.rules=e,this.requestHostUpdate()}removeRule(t){const e=this.validationHost.rules||[];this.validationHost.rules=e.filter(e=>!t(e)),this.requestHostUpdate()}clearRules(){this.validationHost.rules=[],this.clearValidation()}static createRequiredRule(t="This field is required"){return{validator:t=>t.trim().length>0,message:t,level:"error",blocking:!0}}static createMinLengthRule(t,e){return{validator:e=>e.length>=t,message:e||`Minimum ${t} characters required`,level:"error",blocking:!0}}static createMaxLengthRule(t,e){return{validator:e=>e.length<=t,message:e||`Maximum ${t} characters allowed`,level:"error",blocking:!0}}static createPatternRule(t,e){return{validator:e=>t.test(e),message:e,level:"error",blocking:!0}}updateHostValidationState(){if(!this._validationResult)return;const{level:t}=this._validationResult;"error"===t?this.validationHost.state="error":"warning"===t?this.validationHost.state="warning":this.validationHost.rules.length>0&&(this.validationHost.state="success"),this.requestHostUpdate()}dispatchValidationEvent(){var t,e,r,a,i,o,s,n;const l={isValid:null===(e=null===(t=this._validationResult)||void 0===t?void 0:t.isValid)||void 0===e||e,validationMessage:null!==(a=null===(r=this._validationResult)||void 0===r?void 0:r.messages.join(", "))&&void 0!==a?a:"",errors:null!==(o=null===(i=this._validationResult)||void 0===i?void 0:i.messages.filter(()=>{var t;return"error"===(null===(t=this._validationResult)||void 0===t?void 0:t.level)}))&&void 0!==o?o:[],warnings:null!==(n=null===(s=this._validationResult)||void 0===s?void 0:s.messages.filter(()=>{var t;return"warning"===(null===(t=this._validationResult)||void 0===t?void 0:t.level)}))&&void 0!==n?n:[],validationResult:this._validationResult||{isValid:!0,messages:[],level:"success",blocking:!1}},d=new CustomEvent("textarea-validation",{detail:l,bubbles:!0,composed:!0});this.safeExecute(()=>this._host.dispatchEvent(d),"dispatchValidationEvent")}hostDisconnected(){this._validationTimeout&&(clearTimeout(this._validationTimeout),this._validationTimeout=void 0)}}
339
339
  /**
340
340
  * @license
341
341
  * Copyright 2023 Nuraly, Laabidi Aymen
342
342
  * SPDX-License-Identifier: MIT
343
- */class p extends c{constructor(t){super(t),this._hasFocus=!1,this._inputDebounceMs=150}get eventHost(){return this._host}get hasFocus(){return this._hasFocus}setInputDebounce(t){this._inputDebounceMs=t}hostConnected(){super.hostConnected(),this.setupEventListeners()}hostDisconnected(){super.hostDisconnected(),this.cleanupEventListeners()}setupEventListeners(){this.safeExecute((()=>{var t,e;const r=this._host;this._textareaElement=null===(t=r.shadowRoot)||void 0===t?void 0:t.querySelector("textarea"),this._clearButtonElement=null===(e=r.shadowRoot)||void 0===e?void 0:e.querySelector(".clear-button"),this._textareaElement&&this.addTextareaEventListeners(),this._clearButtonElement&&this.eventHost.clearable&&this.addClearButtonEventListeners()}),"setupEventListeners")}cleanupEventListeners(){this._inputTimeout&&(clearTimeout(this._inputTimeout),this._inputTimeout=void 0)}handleInput(t){if(this.eventHost.readonly||this.eventHost.disabled)return;const e=t.target,r=e.value;this._inputTimeout&&clearTimeout(this._inputTimeout),this.eventHost.value=r,this.eventHost.autoResize&&this.handleAutoResize(e),this._inputTimeout=setTimeout((()=>{this.dispatchInputEvent(r,t)}),this._inputDebounceMs),this.requestHostUpdate()}handleFocus(t){this.eventHost.disabled||(this._hasFocus=!0,this.requestHostUpdate(),this.dispatchFocusEvent(t))}handleBlur(t){this._hasFocus=!1,this.requestHostUpdate(),this.dispatchBlurEvent(t)}handleKeyDown(t){if(this.eventHost.readonly||this.eventHost.disabled)return;const{key:e,ctrlKey:r,metaKey:a}=t;"Escape"!==e?"Enter"!==e||!r&&!a?this.dispatchKeydownEvent(t):this.handleSubmit(t):this.handleEscape(t)}handleKeyUp(t){this.dispatchKeyupEvent(t)}handlePaste(t){this.eventHost.readonly||this.eventHost.disabled?t.preventDefault():this.dispatchPasteEvent(t)}handleClear(t){if(this.eventHost.readonly||this.eventHost.disabled)return;const e=this.eventHost.value;this.eventHost.value="",this._textareaElement&&this._textareaElement.focus(),this.requestHostUpdate(),this.dispatchClearEvent(e,t)}handleAutoResize(t){if(!this.eventHost.autoResize)return;const e=t||this._textareaElement;e&&this.safeExecute((()=>{e.style.height="auto",e.style.height=`${e.scrollHeight}px`}),"handleAutoResize")}focus(){this.safeExecute((()=>{var t;null===(t=this._textareaElement)||void 0===t||t.focus()}),"focus")}blur(){this.safeExecute((()=>{var t;null===(t=this._textareaElement)||void 0===t||t.blur()}),"blur")}selectAll(){this.safeExecute((()=>{var t;null===(t=this._textareaElement)||void 0===t||t.select()}),"selectAll")}setCursorPosition(t){this.safeExecute((()=>{this._textareaElement&&this._textareaElement.setSelectionRange(t,t)}),"setCursorPosition")}getCursorPosition(){var t,e;return null!==(e=null===(t=this._textareaElement)||void 0===t?void 0:t.selectionStart)&&void 0!==e?e:0}addTextareaEventListeners(){if(!this._textareaElement)return;const t=this._textareaElement;t.addEventListener("input",this.handleInput.bind(this)),t.addEventListener("focus",this.handleFocus.bind(this)),t.addEventListener("blur",this.handleBlur.bind(this)),t.addEventListener("keydown",this.handleKeyDown.bind(this)),t.addEventListener("keyup",this.handleKeyUp.bind(this)),t.addEventListener("paste",this.handlePaste.bind(this))}addClearButtonEventListeners(){this._clearButtonElement&&this._clearButtonElement.addEventListener("click",this.handleClear.bind(this))}handleEscape(t){this.blur(),this.dispatchEscapeEvent(t)}handleSubmit(t){this.dispatchSubmitEvent(t)}dispatchInputEvent(t,e){const r=new CustomEvent("textarea-input",{detail:{value:t,originalEvent:e,cursorPosition:this.getCursorPosition()},bubbles:!0,composed:!0});this.safeExecute((()=>this._host.dispatchEvent(r)),"dispatchInputEvent")}dispatchFocusEvent(t){const e=new CustomEvent("textarea-focus",{detail:{originalEvent:t,value:this.eventHost.value},bubbles:!0,composed:!0});this.safeExecute((()=>this._host.dispatchEvent(e)),"dispatchFocusEvent")}dispatchBlurEvent(t){const e=new CustomEvent("textarea-blur",{detail:{originalEvent:t,value:this.eventHost.value},bubbles:!0,composed:!0});this.safeExecute((()=>this._host.dispatchEvent(e)),"dispatchBlurEvent")}dispatchKeydownEvent(t){const e=new CustomEvent("textarea-keydown",{detail:{originalEvent:t,key:t.key,ctrlKey:t.ctrlKey,metaKey:t.metaKey,value:this.eventHost.value},bubbles:!0,composed:!0});this.safeExecute((()=>this._host.dispatchEvent(e)),"dispatchKeydownEvent")}dispatchKeyupEvent(t){const e=new CustomEvent("textarea-keyup",{detail:{originalEvent:t,key:t.key,value:this.eventHost.value},bubbles:!0,composed:!0});this.safeExecute((()=>this._host.dispatchEvent(e)),"dispatchKeyupEvent")}dispatchPasteEvent(t){const e=new CustomEvent("textarea-paste",{detail:{originalEvent:t,value:this.eventHost.value},bubbles:!0,composed:!0});this.safeExecute((()=>this._host.dispatchEvent(e)),"dispatchPasteEvent")}dispatchClearEvent(t,e){const r=new CustomEvent("textarea-clear",{detail:{previousValue:t,originalEvent:e,value:this.eventHost.value},bubbles:!0,composed:!0});this.safeExecute((()=>this._host.dispatchEvent(r)),"dispatchClearEvent")}dispatchEscapeEvent(t){const e=new CustomEvent("textarea-escape",{detail:{originalEvent:t,value:this.eventHost.value},bubbles:!0,composed:!0});this.safeExecute((()=>this._host.dispatchEvent(e)),"dispatchEscapeEvent")}dispatchSubmitEvent(t){const e=new CustomEvent("textarea-submit",{detail:{originalEvent:t,value:this.eventHost.value},bubbles:!0,composed:!0});this.safeExecute((()=>this._host.dispatchEvent(e)),"dispatchSubmitEvent")}}
343
+ */class p extends c{constructor(t){super(t),this._hasFocus=!1,this._inputDebounceMs=150}get eventHost(){return this._host}get hasFocus(){return this._hasFocus}setInputDebounce(t){this._inputDebounceMs=t}hostConnected(){super.hostConnected(),this.setupEventListeners()}hostDisconnected(){super.hostDisconnected(),this.cleanupEventListeners()}setupEventListeners(){this.safeExecute(()=>{var t,e;const r=this._host;this._textareaElement=null===(t=r.shadowRoot)||void 0===t?void 0:t.querySelector("textarea"),this._clearButtonElement=null===(e=r.shadowRoot)||void 0===e?void 0:e.querySelector(".clear-button"),this._textareaElement&&this.addTextareaEventListeners(),this._clearButtonElement&&this.eventHost.clearable&&this.addClearButtonEventListeners()},"setupEventListeners")}cleanupEventListeners(){this._inputTimeout&&(clearTimeout(this._inputTimeout),this._inputTimeout=void 0)}handleInput(t){if(this.eventHost.readonly||this.eventHost.disabled)return;const e=t.target,r=e.value;this._inputTimeout&&clearTimeout(this._inputTimeout),this.eventHost.value=r,this.eventHost.autoResize&&this.handleAutoResize(e),this._inputTimeout=setTimeout(()=>{this.dispatchInputEvent(r,t)},this._inputDebounceMs),this.requestHostUpdate()}handleFocus(t){this.eventHost.disabled||(this._hasFocus=!0,this.requestHostUpdate(),this.dispatchFocusEvent(t))}handleBlur(t){this._hasFocus=!1,this.requestHostUpdate(),this.dispatchBlurEvent(t)}handleKeyDown(t){if(this.eventHost.readonly||this.eventHost.disabled)return;const{key:e,ctrlKey:r,metaKey:a}=t;"Escape"!==e?"Enter"!==e||!r&&!a?this.dispatchKeydownEvent(t):this.handleSubmit(t):this.handleEscape(t)}handleKeyUp(t){this.dispatchKeyupEvent(t)}handlePaste(t){this.eventHost.readonly||this.eventHost.disabled?t.preventDefault():this.dispatchPasteEvent(t)}handleClear(t){if(this.eventHost.readonly||this.eventHost.disabled)return;const e=this.eventHost.value;this.eventHost.value="",this._textareaElement&&this._textareaElement.focus(),this.requestHostUpdate(),this.dispatchClearEvent(e,t)}handleAutoResize(t){if(!this.eventHost.autoResize)return;const e=t||this._textareaElement;e&&this.safeExecute(()=>{e.style.height="auto",e.style.height=`${e.scrollHeight}px`},"handleAutoResize")}focus(){this.safeExecute(()=>{var t;null===(t=this._textareaElement)||void 0===t||t.focus()},"focus")}blur(){this.safeExecute(()=>{var t;null===(t=this._textareaElement)||void 0===t||t.blur()},"blur")}selectAll(){this.safeExecute(()=>{var t;null===(t=this._textareaElement)||void 0===t||t.select()},"selectAll")}setCursorPosition(t){this.safeExecute(()=>{this._textareaElement&&this._textareaElement.setSelectionRange(t,t)},"setCursorPosition")}getCursorPosition(){var t,e;return null!==(e=null===(t=this._textareaElement)||void 0===t?void 0:t.selectionStart)&&void 0!==e?e:0}addTextareaEventListeners(){if(!this._textareaElement)return;const t=this._textareaElement;t.addEventListener("input",this.handleInput.bind(this)),t.addEventListener("focus",this.handleFocus.bind(this)),t.addEventListener("blur",this.handleBlur.bind(this)),t.addEventListener("keydown",this.handleKeyDown.bind(this)),t.addEventListener("keyup",this.handleKeyUp.bind(this)),t.addEventListener("paste",this.handlePaste.bind(this))}addClearButtonEventListeners(){this._clearButtonElement&&this._clearButtonElement.addEventListener("click",this.handleClear.bind(this))}handleEscape(t){this.blur(),this.dispatchEscapeEvent(t)}handleSubmit(t){this.dispatchSubmitEvent(t)}dispatchInputEvent(t,e){const r=new CustomEvent("textarea-input",{detail:{value:t,originalEvent:e,cursorPosition:this.getCursorPosition()},bubbles:!0,composed:!0});this.safeExecute(()=>this._host.dispatchEvent(r),"dispatchInputEvent")}dispatchFocusEvent(t){const e=new CustomEvent("textarea-focus",{detail:{originalEvent:t,value:this.eventHost.value},bubbles:!0,composed:!0});this.safeExecute(()=>this._host.dispatchEvent(e),"dispatchFocusEvent")}dispatchBlurEvent(t){const e=new CustomEvent("textarea-blur",{detail:{originalEvent:t,value:this.eventHost.value},bubbles:!0,composed:!0});this.safeExecute(()=>this._host.dispatchEvent(e),"dispatchBlurEvent")}dispatchKeydownEvent(t){const e=new CustomEvent("textarea-keydown",{detail:{originalEvent:t,key:t.key,ctrlKey:t.ctrlKey,metaKey:t.metaKey,value:this.eventHost.value},bubbles:!0,composed:!0});this.safeExecute(()=>this._host.dispatchEvent(e),"dispatchKeydownEvent")}dispatchKeyupEvent(t){const e=new CustomEvent("textarea-keyup",{detail:{originalEvent:t,key:t.key,value:this.eventHost.value},bubbles:!0,composed:!0});this.safeExecute(()=>this._host.dispatchEvent(e),"dispatchKeyupEvent")}dispatchPasteEvent(t){const e=new CustomEvent("textarea-paste",{detail:{originalEvent:t,value:this.eventHost.value},bubbles:!0,composed:!0});this.safeExecute(()=>this._host.dispatchEvent(e),"dispatchPasteEvent")}dispatchClearEvent(t,e){const r=new CustomEvent("textarea-clear",{detail:{previousValue:t,originalEvent:e,value:this.eventHost.value},bubbles:!0,composed:!0});this.safeExecute(()=>this._host.dispatchEvent(r),"dispatchClearEvent")}dispatchEscapeEvent(t){const e=new CustomEvent("textarea-escape",{detail:{originalEvent:t,value:this.eventHost.value},bubbles:!0,composed:!0});this.safeExecute(()=>this._host.dispatchEvent(e),"dispatchEscapeEvent")}dispatchSubmitEvent(t){const e=new CustomEvent("textarea-submit",{detail:{originalEvent:t,value:this.eventHost.value},bubbles:!0,composed:!0});this.safeExecute(()=>this._host.dispatchEvent(e),"dispatchSubmitEvent")}}
344
344
  /**
345
345
  * @license
346
346
  * Copyright 2023 Nuraly, Laabidi Aymen
347
347
  * SPDX-License-Identifier: MIT
348
- */var b=function(t,e,r,a){for(var i,o=arguments.length,s=o<3?e:null===a?a=Object.getOwnPropertyDescriptor(e,r):a,n=t.length-1;n>=0;n--)(i=t[n])&&(s=(o<3?i(s):o>3?i(e,r,s):i(e,r))||s);return o>3&&s&&Object.defineProperty(e,r,s),s},x=function(t,e,r,a){return new(r||(r=Promise))((function(i,o){function s(t){try{l(a.next(t))}catch(t){o(t)}}function n(t){try{l(a.throw(t))}catch(t){o(t)}}function l(t){var e;t.done?i(t.value):(e=t.value,e instanceof r?e:new r((function(t){t(e)}))).then(s,n)}l((a=a.apply(t,e||[])).next())}))};let f=class extends(n(e)){constructor(){super(),this.validationController=new v(this),this.eventController=new p(this),this.disabled=!1,this.readonly=!1,this.state="default",this.value="",this.size="medium",this.variant="underlined",this.resize="vertical",this.rows=d,this.cols=h,this.placeholder="",this.autocomplete="off",this.allowClear=!1,this.showCount=!1,this.autoResize=!1,this.rules=[],this.validateOnChange=!0,this.validateOnBlur=!0,this.hasFeedback=!1,this.isFocused=!1,this.characterCount=0,this.characterCount=this.value.length,this.setupControllerListeners()}get clearable(){return this.allowClear}setupControllerListeners(){this.addEventListener("textarea-validation",(t=>{this.validationResult=t.detail.validationResult})),this.addEventListener("textarea-input",(t=>{this.handleControllerInput(t.detail.value)})),this.addEventListener("textarea-focus",(()=>{this.isFocused=!0})),this.addEventListener("textarea-blur",(()=>{this.isFocused=!1,this.validateOnBlur&&this.validationController.validateOnBlurIfEnabled()})),this.addEventListener("textarea-clear",(t=>{this.handleControllerClear(t.detail.previousValue)}))}handleControllerInput(t){this.maxLength&&t.length>this.maxLength?this.value=t.slice(0,this.maxLength):this.value=t,this.characterCount=this.value.length,this.autoResizeIfNeeded(),this.dispatchChangeEvent(),this.validateOnChange&&this.validationController.validateOnChangeIfEnabled(this.value)}handleControllerClear(t){this.characterCount=0,this.dispatchChangeEvent(),this.dispatchEvent(new CustomEvent("nr-clear",{detail:{value:this.value,previousValue:t},bubbles:!0}))}connectedCallback(){super.connectedCallback(),this.setupResizeObserver()}disconnectedCallback(){super.disconnectedCallback(),this.cleanupResizeObserver()}firstUpdated(t){super.firstUpdated(t),this.updateTextareaValue(),this.autoResizeIfNeeded(),this.resizeObserver&&this.textareaElement&&this.resizeObserver.observe(this.textareaElement),this.eventController.setupEventListeners()}updated(t){super.updated(t),t.has("value")&&(this.characterCount=this.value.length,this.updateTextareaValue(),this.autoResizeIfNeeded()),t.has("autoResize")&&this.autoResizeIfNeeded(),t.has("rules")&&(this.validationController.clearValidation(),this.rules.length>0&&this.value&&this.validationController.validate(this.value))}setupResizeObserver(){"undefined"!=typeof ResizeObserver&&(this.resizeObserver=new ResizeObserver((t=>{for(const e of t){const{width:t,height:r}=e.contentRect;this.dispatchResizeEvent(t,r)}})))}cleanupResizeObserver(){this.resizeObserver&&(this.resizeObserver.disconnect(),this.resizeObserver=void 0)}updateTextareaValue(){this.textareaElement&&this.textareaElement.value!==this.value&&(this.textareaElement.value=this.value)}autoResizeIfNeeded(){if(!this.autoResize||!this.textareaElement)return;this.textareaElement.style.height="auto";let t=this.textareaElement.scrollHeight;this.minHeight&&t<this.minHeight&&(t=this.minHeight),this.maxHeight&&t>this.maxHeight&&(t=this.maxHeight),this.textareaElement.style.height=`${t}px`}handleInput(t){this.eventController.handleInput(t)}handleFocus(t){this.eventController.handleFocus(t),this.dispatchEvent(new CustomEvent("nr-focus",{detail:{focused:!0,originalEvent:t},bubbles:!0}))}handleBlur(t){this.eventController.handleBlur(t),this.dispatchEvent(new CustomEvent("nr-blur",{detail:{focused:!1,originalEvent:t},bubbles:!0}))}handleClear(){this.eventController.handleClear()}dispatchChangeEvent(){const t={value:this.value,length:this.characterCount,exceedsMaxLength:!!this.maxLength&&this.characterCount>this.maxLength,validation:this.validationResult};this.dispatchEvent(new CustomEvent("nr-textarea-change",{detail:t,bubbles:!0}))}dispatchResizeEvent(t,e){const r={width:t,height:e,direction:this.resize};this.dispatchEvent(new CustomEvent("nr-resize",{detail:r,bubbles:!0}))}focus(t){this.eventController.focus(),(void 0!==(null==t?void 0:t.cursor)||(null==t?void 0:t.select))&&setTimeout((()=>{this.textareaElement&&(void 0!==(null==t?void 0:t.cursor)?"number"==typeof t.cursor?this.eventController.setCursorPosition(t.cursor):"start"===t.cursor?this.eventController.setCursorPosition(0):"end"===t.cursor?this.eventController.setCursorPosition(this.value.length):"all"===t.cursor&&this.eventController.selectAll():(null==t?void 0:t.select)&&this.eventController.selectAll())}))}blur(){this.eventController.blur()}getValidationResult(){return this.validationController.validationResult}validate(){return x(this,void 0,void 0,(function*(){return(yield this.validationController.validate(this.value)).isValid}))}clearValidation(){this.validationController.clearValidation()}clear(){this.eventController.handleClear()}addRule(t){this.validationController.addRule(t)}removeRule(t){this.validationController.removeRule(t)}clearRules(){this.validationController.clearRules()}getValidationStatus(){var t;const e=this.validationController.validationResult;return{isValid:null===(t=null==e?void 0:e.isValid)||void 0===t||t,errors:"error"===(null==e?void 0:e.level)?e.messages:[],warnings:"warning"===(null==e?void 0:e.level)?e.messages:[]}}isValid(){return this.validationController.isValid()}checkValidity(){return this.validationController.isValid()}reportValidity(){const t=this.validationController.isValid();return t||this.validationController.validate(this.value),t}setCustomValidity(t){t?this.validationController.addRule({validator:()=>!1,message:t,level:"error",blocking:!0}):this.validationController.removeRule((e=>e.message===t))}validateTextarea(){return x(this,void 0,void 0,(function*(){return(yield this.validationController.validate(this.value)).isValid}))}setValidationStatus(t){this.validationResult=t,"error"===t.level?this.state="error":"warning"===t.level?this.state="warning":t.isValid&&(this.state="success"),this.requestUpdate()}renderLabel(){return r`
348
+ */var b=function(t,e,r,a){for(var i,o=arguments.length,s=o<3?e:null===a?a=Object.getOwnPropertyDescriptor(e,r):a,n=t.length-1;n>=0;n--)(i=t[n])&&(s=(o<3?i(s):o>3?i(e,r,s):i(e,r))||s);return o>3&&s&&Object.defineProperty(e,r,s),s},x=function(t,e,r,a){return new(r||(r=Promise))(function(i,o){function s(t){try{l(a.next(t))}catch(t){o(t)}}function n(t){try{l(a.throw(t))}catch(t){o(t)}}function l(t){var e;t.done?i(t.value):(e=t.value,e instanceof r?e:new r(function(t){t(e)})).then(s,n)}l((a=a.apply(t,e||[])).next())})};let f=class extends(n(e)){constructor(){super(),this.validationController=new v(this),this.eventController=new p(this),this.disabled=!1,this.readonly=!1,this.state="default",this.value="",this.size="medium",this.variant="underlined",this.resize="vertical",this.rows=d,this.cols=h,this.placeholder="",this.autocomplete="off",this.allowClear=!1,this.showCount=!1,this.autoResize=!1,this.rules=[],this.validateOnChange=!0,this.validateOnBlur=!0,this.hasFeedback=!1,this.isFocused=!1,this.characterCount=0,this.characterCount=this.value.length,this.setupControllerListeners()}get clearable(){return this.allowClear}setupControllerListeners(){this.addEventListener("textarea-validation",t=>{this.validationResult=t.detail.validationResult}),this.addEventListener("textarea-input",t=>{this.handleControllerInput(t.detail.value)}),this.addEventListener("textarea-focus",()=>{this.isFocused=!0}),this.addEventListener("textarea-blur",()=>{this.isFocused=!1,this.validateOnBlur&&this.validationController.validateOnBlurIfEnabled()}),this.addEventListener("textarea-clear",t=>{this.handleControllerClear(t.detail.previousValue)})}handleControllerInput(t){this.maxLength&&t.length>this.maxLength?this.value=t.slice(0,this.maxLength):this.value=t,this.characterCount=this.value.length,this.autoResizeIfNeeded(),this.dispatchChangeEvent(),this.validateOnChange&&this.validationController.validateOnChangeIfEnabled(this.value)}handleControllerClear(t){this.characterCount=0,this.dispatchChangeEvent(),this.dispatchEvent(new CustomEvent("nr-clear",{detail:{value:this.value,previousValue:t},bubbles:!0}))}connectedCallback(){super.connectedCallback(),this.setupResizeObserver()}disconnectedCallback(){super.disconnectedCallback(),this.cleanupResizeObserver()}firstUpdated(t){super.firstUpdated(t),this.updateTextareaValue(),this.autoResizeIfNeeded(),this.resizeObserver&&this.textareaElement&&this.resizeObserver.observe(this.textareaElement),this.eventController.setupEventListeners()}updated(t){super.updated(t),t.has("value")&&(this.characterCount=this.value.length,this.updateTextareaValue(),this.autoResizeIfNeeded()),t.has("autoResize")&&this.autoResizeIfNeeded(),t.has("rules")&&(this.validationController.clearValidation(),this.rules.length>0&&this.value&&this.validationController.validate(this.value))}setupResizeObserver(){"undefined"!=typeof ResizeObserver&&(this.resizeObserver=new ResizeObserver(t=>{for(const e of t){const{width:t,height:r}=e.contentRect;this.dispatchResizeEvent(t,r)}}))}cleanupResizeObserver(){this.resizeObserver&&(this.resizeObserver.disconnect(),this.resizeObserver=void 0)}updateTextareaValue(){this.textareaElement&&this.textareaElement.value!==this.value&&(this.textareaElement.value=this.value)}autoResizeIfNeeded(){if(!this.autoResize||!this.textareaElement)return;this.textareaElement.style.height="auto";let t=this.textareaElement.scrollHeight;this.minHeight&&t<this.minHeight&&(t=this.minHeight),this.maxHeight&&t>this.maxHeight&&(t=this.maxHeight),this.textareaElement.style.height=`${t}px`}handleInput(t){this.eventController.handleInput(t)}handleFocus(t){this.eventController.handleFocus(t),this.dispatchEvent(new CustomEvent("nr-focus",{detail:{focused:!0,originalEvent:t},bubbles:!0}))}handleBlur(t){this.eventController.handleBlur(t),this.dispatchEvent(new CustomEvent("nr-blur",{detail:{focused:!1,originalEvent:t},bubbles:!0}))}handleClear(){this.eventController.handleClear()}dispatchChangeEvent(){const t={value:this.value,length:this.characterCount,exceedsMaxLength:!!this.maxLength&&this.characterCount>this.maxLength,validation:this.validationResult};this.dispatchEvent(new CustomEvent("nr-textarea-change",{detail:t,bubbles:!0}))}dispatchResizeEvent(t,e){const r={width:t,height:e,direction:this.resize};this.dispatchEvent(new CustomEvent("nr-resize",{detail:r,bubbles:!0}))}focus(t){this.eventController.focus(),(void 0!==(null==t?void 0:t.cursor)||(null==t?void 0:t.select))&&setTimeout(()=>{this.textareaElement&&(void 0!==(null==t?void 0:t.cursor)?"number"==typeof t.cursor?this.eventController.setCursorPosition(t.cursor):"start"===t.cursor?this.eventController.setCursorPosition(0):"end"===t.cursor?this.eventController.setCursorPosition(this.value.length):"all"===t.cursor&&this.eventController.selectAll():(null==t?void 0:t.select)&&this.eventController.selectAll())})}blur(){this.eventController.blur()}getValidationResult(){return this.validationController.validationResult}validate(){return x(this,void 0,void 0,function*(){return(yield this.validationController.validate(this.value)).isValid})}clearValidation(){this.validationController.clearValidation()}clear(){this.eventController.handleClear()}addRule(t){this.validationController.addRule(t)}removeRule(t){this.validationController.removeRule(t)}clearRules(){this.validationController.clearRules()}getValidationStatus(){var t;const e=this.validationController.validationResult;return{isValid:null===(t=null==e?void 0:e.isValid)||void 0===t||t,errors:"error"===(null==e?void 0:e.level)?e.messages:[],warnings:"warning"===(null==e?void 0:e.level)?e.messages:[]}}isValid(){return this.validationController.isValid()}checkValidity(){return this.validationController.isValid()}reportValidity(){const t=this.validationController.isValid();return t||this.validationController.validate(this.value),t}setCustomValidity(t){t?this.validationController.addRule({validator:()=>!1,message:t,level:"error",blocking:!0}):this.validationController.removeRule(e=>e.message===t)}validateTextarea(){return x(this,void 0,void 0,function*(){return(yield this.validationController.validate(this.value)).isValid})}setValidationStatus(t){this.validationResult=t,"error"===t.level?this.state="error":"warning"===t.level?this.state="warning":t.isValid&&(this.state="success"),this.requestUpdate()}renderLabel(){return r`
349
349
  <div class="textarea-label">
350
350
  <slot name="label"></slot>
351
351
  ${this.required?r`<span class="required-indicator">*</span>`:""}
@@ -389,7 +389,7 @@ class c{constructor(t){this._host=t,this._host.addController(this)}get host(){re
389
389
  </div>
390
390
  `}renderHelperText(){var t,e;const a=null===(t=this.shadowRoot)||void 0===t?void 0:t.querySelector('slot[name="helper-text"]'),i=null==a?void 0:a.assignedNodes().length,o=null===(e=this.validationResult)||void 0===e?void 0:e.messages.length;return i||o?r`
391
391
  <div class="helper-text">
392
- ${o?this.validationResult.messages.map((t=>r`<div class="validation-message ${this.validationResult.level}">${t}</div>`)):r`<slot name="helper-text"></slot>`}
392
+ ${o?this.validationResult.messages.map(t=>r`<div class="validation-message ${this.validationResult.level}">${t}</div>`):r`<slot name="helper-text"></slot>`}
393
393
  </div>
394
394
  `:""}render(){const t=["textarea-container",`size-${this.size}`,`variant-${this.variant}`,`state-${this.state}`,this.isFocused?"focused":"",this.disabled?"disabled":"",this.readonly?"readonly":"",this.validationResult?`validation-${this.validationResult.level}`:""].filter(Boolean).join(" ");return r`
395
395
  <div class="${t}">
package/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/textarea/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC","sourcesContent":["/**\n * @license\n * Copyright 2023 Nuraly, Laabidi Aymen\n * SPDX-License-Identifier: MIT\n */\n\nexport { NrTextareaElement } from './textarea.component.js';\nexport type {\n TEXTAREA_STATE,\n TEXTAREA_SIZE,\n TEXTAREA_VARIANT,\n TEXTAREA_RESIZE,\n ValidationRule,\n TextareaValidationResult,\n TextareaChangeEvent,\n TextareaResizeEvent,\n FocusOptions,\n BlurOptions\n} from './textarea.types.js';"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/components/textarea/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC","sourcesContent":["/**\n * @license\n * Copyright 2023 Nuraly, Laabidi Aymen\n * SPDX-License-Identifier: MIT\n */\n\nexport { NrTextareaElement } from './textarea.component.js';\nexport type {\n TEXTAREA_STATE,\n TEXTAREA_SIZE,\n TEXTAREA_VARIANT,\n TEXTAREA_RESIZE,\n ValidationRule,\n TextareaValidationResult,\n TextareaChangeEvent,\n TextareaResizeEvent,\n FocusOptions,\n BlurOptions\n} from './textarea.types.js';"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nuralyui/textarea",
3
- "version": "0.1.4",
3
+ "version": "0.1.5",
4
4
  "description": "Textarea component for Nuraly UI Library with validation, resize options, and interactive features",
5
5
  "main": "index.js",
6
6
  "type": "module",
package/react.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"react.js","sourceRoot":"","sources":["../../../src/components/textarea/react.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAE5D,MAAM,CAAC,MAAM,UAAU,GAAG,eAAe,CAAC;IACxC,OAAO,EAAE,aAAa;IACtB,YAAY,EAAE,iBAAiB;IAC/B,KAAK,EAAE,KAAK;IACZ,MAAM,EAAE;QACN,gBAAgB,EAAE,oBAAoB;QACtC,OAAO,EAAE,UAAU;QACnB,MAAM,EAAE,SAAS;QACjB,OAAO,EAAE,UAAU;QACnB,QAAQ,EAAE,WAAW;KACtB;CACF,CAAC,CAAC","sourcesContent":["import { createComponent } from '@lit-labs/react';\nimport * as React from 'react';\nimport { NrTextareaElement } from './textarea.component.js';\n\nexport const NrTextarea = createComponent({\n tagName: 'nr-textarea',\n elementClass: NrTextareaElement,\n react: React,\n events: {\n nrTextareaChange: 'nr-textarea-change',\n nrFocus: 'nr-focus',\n nrBlur: 'nr-blur',\n nrClear: 'nr-clear',\n nrResize: 'nr-resize'\n },\n});"]}
1
+ {"version":3,"file":"react.js","sourceRoot":"","sources":["../../../../src/components/textarea/react.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAE5D,MAAM,CAAC,MAAM,UAAU,GAAG,eAAe,CAAC;IACxC,OAAO,EAAE,aAAa;IACtB,YAAY,EAAE,iBAAiB;IAC/B,KAAK,EAAE,KAAK;IACZ,MAAM,EAAE;QACN,gBAAgB,EAAE,oBAAoB;QACtC,OAAO,EAAE,UAAU;QACnB,MAAM,EAAE,SAAS;QACjB,OAAO,EAAE,UAAU;QACnB,QAAQ,EAAE,WAAW;KACtB;CACF,CAAC,CAAC","sourcesContent":["import { createComponent } from '@lit-labs/react';\nimport * as React from 'react';\nimport { NrTextareaElement } from './textarea.component.js';\n\nexport const NrTextarea = createComponent({\n tagName: 'nr-textarea',\n elementClass: NrTextareaElement,\n react: React,\n events: {\n nrTextareaChange: 'nr-textarea-change',\n nrFocus: 'nr-focus',\n nrBlur: 'nr-blur',\n nrClear: 'nr-clear',\n nrResize: 'nr-resize'\n },\n});"]}
@@ -3,7 +3,7 @@
3
3
  * Copyright 2023 Nuraly, Laabidi Aymen
4
4
  * SPDX-License-Identifier: MIT
5
5
  */
6
- import { LitElement, PropertyValues } from 'lit';
6
+ import { LitElement, type PropertyValues } from 'lit';
7
7
  import { TEXTAREA_STATE, TEXTAREA_SIZE, TEXTAREA_VARIANT, TEXTAREA_RESIZE, ValidationRule, TextareaValidationResult, FocusOptions } from './textarea.types.js';
8
8
  import { ValidatableComponent, ValidationStatus } from '@nuralyui/common/mixins';
9
9
  import { type TextareaValidationHost, type TextareaEventHost } from './controllers/index.js';
@@ -197,7 +197,7 @@ export declare class NrTextareaElement extends NrTextareaElement_base implements
197
197
  private renderClearButton;
198
198
  private renderCharacterCount;
199
199
  private renderHelperText;
200
- render(): import("lit").TemplateResult<1>;
200
+ render(): import("lit-html").TemplateResult<1>;
201
201
  }
202
202
  export {};
203
203
  //# sourceMappingURL=textarea.component.d.ts.map
@@ -1 +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 {\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 '@nuralyui/common/mixins';\nimport { ValidatableComponent, ValidationStatus } from '@nuralyui/common/mixins';\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}"]}
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, html, type PropertyValues } from 'lit';\nimport { customElement, property, state, query } from 'lit/decorators.js';\nimport { styles } from './textarea.style.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 '@nuralyui/common/mixins';\nimport { ValidatableComponent, ValidationStatus } from '@nuralyui/common/mixins';\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}"]}
@@ -1 +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`;"]}
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`;"]}
@@ -1 +1 @@
1
- {"version":3,"file":"textarea.types.js","sourceRoot":"","sources":["../../../src/components/textarea/textarea.types.ts"],"names":[],"mappings":"AAmGA,MAAM,CAAC,MAAM,YAAY,GAAG,EAAE,CAAC;AAE/B;;GAEG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,IAAI,EAAE,CAAC;IACP,IAAI,EAAE,EAAE;IACR,UAAU,EAAE,IAAI;IAChB,MAAM,2CAA0B;IAChC,IAAI,qCAAsB;IAC1B,KAAK,wCAAwB;IAC7B,OAAO,gDAA6B;CAC5B,CAAC","sourcesContent":["export const enum TEXTAREA_STATE {\n Default = 'default',\n Error = 'error',\n Warning = 'warning',\n Success = 'success',\n}\n\nexport const enum TEXTAREA_SIZE {\n Large = 'large',\n Medium = 'medium',\n Small = 'small',\n}\n\nexport const enum TEXTAREA_VARIANT {\n Default = '',\n Outlined = 'outlined',\n Filled = 'filled',\n Borderless = 'borderless',\n Underlined = 'underlined',\n}\n\nexport const enum TEXTAREA_RESIZE {\n None = 'none',\n Vertical = 'vertical',\n Horizontal = 'horizontal',\n Both = 'both',\n}\n\nexport interface FocusOptions {\n preventScroll?: boolean;\n cursor?: 'start' | 'end' | 'all' | number;\n select?: boolean;\n}\n\nexport interface BlurOptions {\n preventScroll?: boolean;\n restoreCursor?: boolean;\n}\n\nexport interface FocusChangeEvent {\n focused: boolean;\n cursorPosition?: number;\n selectedText?: string;\n}\n\n/**\n * Validation rule interface\n */\nexport interface ValidationRule {\n /** Validation function that returns true if valid */\n validator: (value: string) => boolean | Promise<boolean>;\n /** Error message to display if validation fails */\n message: string;\n /** Rule severity level */\n level?: 'error' | 'warning';\n /** Whether this rule should block form submission */\n blocking?: boolean;\n}\n\n/**\n * Validation result interface\n */\nexport interface TextareaValidationResult {\n /** Whether the current value is valid */\n isValid: boolean;\n /** Array of validation messages (errors/warnings) */\n messages: string[];\n /** Validation level (error or warning) */\n level: 'error' | 'warning' | 'success';\n /** Whether validation is blocking */\n blocking: boolean;\n}\n\n/**\n * Textarea change event detail interface\n */\nexport interface TextareaChangeEvent {\n /** Current textarea value */\n value: string;\n /** Character count */\n length: number;\n /** Whether max length is exceeded */\n exceedsMaxLength: boolean;\n /** Validation result */\n validation?: TextareaValidationResult;\n}\n\n/**\n * Textarea resize event detail interface\n */\nexport interface TextareaResizeEvent {\n /** New width in pixels */\n width: number;\n /** New height in pixels */\n height: number;\n /** Resize direction */\n direction: 'horizontal' | 'vertical' | 'both';\n}\n\nexport const EMPTY_STRING = '';\n\n/**\n * Common textarea configuration constants\n */\nexport const TEXTAREA_DEFAULTS = {\n ROWS: 3,\n COLS: 50,\n MAX_LENGTH: 1000,\n RESIZE: TEXTAREA_RESIZE.Vertical,\n SIZE: TEXTAREA_SIZE.Medium,\n STATE: TEXTAREA_STATE.Default,\n VARIANT: TEXTAREA_VARIANT.Underlined,\n} as const;"]}
1
+ {"version":3,"file":"textarea.types.js","sourceRoot":"","sources":["../../../../src/components/textarea/textarea.types.ts"],"names":[],"mappings":"AAmGA,MAAM,CAAC,MAAM,YAAY,GAAG,EAAE,CAAC;AAE/B;;GAEG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,IAAI,EAAE,CAAC;IACP,IAAI,EAAE,EAAE;IACR,UAAU,EAAE,IAAI;IAChB,MAAM,2CAA0B;IAChC,IAAI,qCAAsB;IAC1B,KAAK,wCAAwB;IAC7B,OAAO,gDAA6B;CAC5B,CAAC","sourcesContent":["export const enum TEXTAREA_STATE {\n Default = 'default',\n Error = 'error',\n Warning = 'warning',\n Success = 'success',\n}\n\nexport const enum TEXTAREA_SIZE {\n Large = 'large',\n Medium = 'medium',\n Small = 'small',\n}\n\nexport const enum TEXTAREA_VARIANT {\n Default = '',\n Outlined = 'outlined',\n Filled = 'filled',\n Borderless = 'borderless',\n Underlined = 'underlined',\n}\n\nexport const enum TEXTAREA_RESIZE {\n None = 'none',\n Vertical = 'vertical',\n Horizontal = 'horizontal',\n Both = 'both',\n}\n\nexport interface FocusOptions {\n preventScroll?: boolean;\n cursor?: 'start' | 'end' | 'all' | number;\n select?: boolean;\n}\n\nexport interface BlurOptions {\n preventScroll?: boolean;\n restoreCursor?: boolean;\n}\n\nexport interface FocusChangeEvent {\n focused: boolean;\n cursorPosition?: number;\n selectedText?: string;\n}\n\n/**\n * Validation rule interface\n */\nexport interface ValidationRule {\n /** Validation function that returns true if valid */\n validator: (value: string) => boolean | Promise<boolean>;\n /** Error message to display if validation fails */\n message: string;\n /** Rule severity level */\n level?: 'error' | 'warning';\n /** Whether this rule should block form submission */\n blocking?: boolean;\n}\n\n/**\n * Validation result interface\n */\nexport interface TextareaValidationResult {\n /** Whether the current value is valid */\n isValid: boolean;\n /** Array of validation messages (errors/warnings) */\n messages: string[];\n /** Validation level (error or warning) */\n level: 'error' | 'warning' | 'success';\n /** Whether validation is blocking */\n blocking: boolean;\n}\n\n/**\n * Textarea change event detail interface\n */\nexport interface TextareaChangeEvent {\n /** Current textarea value */\n value: string;\n /** Character count */\n length: number;\n /** Whether max length is exceeded */\n exceedsMaxLength: boolean;\n /** Validation result */\n validation?: TextareaValidationResult;\n}\n\n/**\n * Textarea resize event detail interface\n */\nexport interface TextareaResizeEvent {\n /** New width in pixels */\n width: number;\n /** New height in pixels */\n height: number;\n /** Resize direction */\n direction: 'horizontal' | 'vertical' | 'both';\n}\n\nexport const EMPTY_STRING = '';\n\n/**\n * Common textarea configuration constants\n */\nexport const TEXTAREA_DEFAULTS = {\n ROWS: 3,\n COLS: 50,\n MAX_LENGTH: 1000,\n RESIZE: TEXTAREA_RESIZE.Vertical,\n SIZE: TEXTAREA_SIZE.Medium,\n STATE: TEXTAREA_STATE.Default,\n VARIANT: TEXTAREA_VARIANT.Underlined,\n} as const;"]}