@authhero/widget 0.2.2 → 0.4.1
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/dist/authhero-widget/authhero-widget.esm.js +1 -0
- package/dist/authhero-widget/index.esm.js +1 -0
- package/dist/authhero-widget/p-2e93c814.entry.js +1 -0
- package/dist/authhero-widget/p-539fc666.entry.js +1 -0
- package/dist/authhero-widget/p-DQuL1Twl.js +1 -0
- package/dist/authhero-widget/p-Doiemx6o.js +2 -0
- package/dist/cjs/app-globals-V2Kpy_OQ.js +5 -0
- package/dist/cjs/authhero-node.cjs.entry.js +255 -0
- package/dist/cjs/authhero-widget.cjs.entry.js +577 -0
- package/dist/cjs/authhero-widget.cjs.js +25 -0
- package/dist/cjs/index-D0xitTOL.js +3788 -0
- package/dist/cjs/index.cjs.js +8123 -0
- package/dist/cjs/loader.cjs.js +13 -0
- package/dist/collection/collection-manifest.json +13 -0
- package/dist/collection/components/authhero-node/authhero-node.css +298 -0
- package/dist/collection/components/authhero-node/authhero-node.js +360 -0
- package/dist/collection/components/authhero-widget/authhero-widget.css +186 -0
- package/dist/collection/components/authhero-widget/authhero-widget.js +628 -0
- package/dist/collection/index.js +2 -0
- package/dist/collection/server/index.js +453 -0
- package/dist/collection/themes/index.js +71 -0
- package/dist/collection/types/components.js +8 -0
- package/dist/collection/utils/branding.js +248 -0
- package/dist/components/authhero-node.d.ts +11 -0
- package/dist/components/authhero-node.js +1 -0
- package/dist/components/authhero-widget.d.ts +11 -0
- package/dist/components/authhero-widget.js +1 -0
- package/dist/components/index.d.ts +35 -0
- package/dist/components/index.js +1 -0
- package/dist/components/p-086EZrPM.js +1 -0
- package/dist/components/p-DS6y_iDJ.js +1 -0
- package/dist/esm/app-globals-DQuL1Twl.js +3 -0
- package/dist/esm/authhero-node.entry.js +253 -0
- package/dist/esm/authhero-widget.entry.js +575 -0
- package/dist/esm/authhero-widget.js +21 -0
- package/dist/esm/index-Doiemx6o.js +3780 -0
- package/dist/esm/index.js +8122 -0
- package/dist/esm/loader.js +11 -0
- package/dist/index.cjs.js +1 -0
- package/dist/index.js +1 -0
- package/dist/types/components/authhero-node/authhero-node.d.ts +72 -0
- package/dist/types/components/authhero-widget/authhero-widget.d.ts +172 -0
- package/dist/types/components.d.ts +215 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/server/index.d.ts +85 -0
- package/dist/types/stencil-public-runtime.d.ts +1839 -0
- package/dist/types/themes/index.d.ts +40 -0
- package/dist/types/types/components.d.ts +8 -0
- package/dist/types/utils/branding.d.ts +119 -0
- package/hydrate/index.d.ts +287 -0
- package/hydrate/index.js +23729 -0
- package/hydrate/index.mjs +23719 -0
- package/hydrate/package.json +12 -0
- package/loader/cdn.js +1 -0
- package/loader/index.cjs.js +1 -0
- package/loader/index.d.ts +24 -0
- package/loader/index.es2017.js +1 -0
- package/loader/index.js +2 -0
- package/package.json +2 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{t as e,p as r,H as t,c as a,h as i}from"./p-086EZrPM.js";const s=r(class extends t{constructor(e){super(),!1!==e&&this.__registerHost(),this.__attachShadow(),this.fieldChange=a(this,"fieldChange"),this.buttonClick=a(this,"buttonClick")}component;value;disabled=!1;fieldChange;buttonClick;handleInput=e=>{this.fieldChange.emit({id:this.component.id,value:e.target.value})};handleCheckbox=e=>{this.fieldChange.emit({id:this.component.id,value:e.target.checked?"true":"false"})};handleButtonClick=(e,r,t)=>{"submit"!==r&&e.preventDefault(),this.buttonClick.emit({id:this.component.id,type:r,value:t})};getErrors(){const e=this.component;return e.messages?.filter((e=>"error"===e.type))||[]}renderLabel(e,r,t){return e?i("label",{class:"input-label",part:"label",htmlFor:r},e,t&&i("span",{class:"required"},"*")):null}renderErrors(){return this.getErrors().map((e=>i("span",{class:"error-text",part:"error-text",key:e.id??e.text},e.text)))}renderHint(e){return e?i("span",{class:"helper-text",part:"helper-text"},e):null}renderDivider(){return i("hr",{class:"divider",part:"divider"})}renderHtml(e){return i("div",{class:"html-content",part:"html-content",innerHTML:e.config?.content??""})}renderImage(e){const{src:r,alt:t,width:a,height:s}=e.config??{};return r?i("img",{class:"image",part:"image",src:r,alt:t??"",width:a,height:s,loading:"lazy"}):null}renderRichText(e){return i("div",{class:"rich-text",part:"rich-text",innerHTML:e.config?.content??""})}renderNextButton(e){return i("button",{type:"submit",class:"btn btn-primary",part:"button button-primary",disabled:this.disabled,onClick:e=>this.handleButtonClick(e,"submit","next")},e.config.text??"Continue")}renderPreviousButton(e){return i("button",{type:"button",class:"btn btn-secondary",part:"button button-secondary",disabled:this.disabled,onClick:e=>this.handleButtonClick(e,"previous","back")},e.config.text??"Back")}renderJumpButton(e){return i("button",{type:"button",class:"btn btn-link",part:"button button-link",disabled:this.disabled,onClick:r=>this.handleButtonClick(r,"jump",e.config.target_step)},e.config.text??"Go")}renderResendButton(e){return i("button",{type:"button",class:"btn btn-link",part:"button button-link",disabled:this.disabled,onClick:r=>this.handleButtonClick(r,"resend",e.config.resend_action)},e.config.text??"Resend")}renderTextField(e){const r=`input-${e.id}`,t=this.getErrors(),{placeholder:a,multiline:s,max_length:o}=e.config??{};return i("div",{class:"input-wrapper",part:"input-wrapper"},this.renderLabel(e.label,r,e.required),s?i("textarea",{id:r,class:{"input-field":!0,"has-error":t.length>0},part:"input textarea",name:e.id,placeholder:a,required:e.required,disabled:this.disabled,maxLength:o,onInput:this.handleInput},this.value??""):i("input",{id:r,class:{"input-field":!0,"has-error":t.length>0},part:"input",type:e.sensitive?"password":"text",name:e.id,value:this.value??"",placeholder:a,required:e.required,disabled:this.disabled,maxLength:o,onInput:this.handleInput}),this.renderErrors(),0===t.length&&this.renderHint(e.hint))}renderEmailField(e){const r=`input-${e.id}`,t=this.getErrors();return i("div",{class:"input-wrapper",part:"input-wrapper"},this.renderLabel(e.label,r,e.required),i("input",{id:r,class:{"input-field":!0,"has-error":t.length>0},part:"input",type:"email",name:e.id,value:this.value??"",placeholder:e.config?.placeholder,required:e.required,disabled:this.disabled,autocomplete:"email",onInput:this.handleInput}),this.renderErrors(),0===t.length&&this.renderHint(e.hint))}renderPasswordField(e){const r=`input-${e.id}`,t=this.getErrors();return i("div",{class:"input-wrapper",part:"input-wrapper"},this.renderLabel(e.label,r,e.required),i("input",{id:r,class:{"input-field":!0,"has-error":t.length>0},part:"input",type:"password",name:e.id,value:this.value??"",placeholder:e.config?.placeholder,required:e.required,disabled:this.disabled,minLength:e.config?.min_length,autocomplete:"current-password",onInput:this.handleInput}),this.renderErrors(),0===t.length&&this.renderHint(e.hint))}renderNumberField(e){const r=`input-${e.id}`,t=this.getErrors(),{placeholder:a,min:s,max:o,step:n}=e.config??{};return i("div",{class:"input-wrapper",part:"input-wrapper"},this.renderLabel(e.label,r,e.required),i("input",{id:r,class:{"input-field":!0,"has-error":t.length>0},part:"input",type:"number",name:e.id,value:this.value??"",placeholder:a,required:e.required,disabled:this.disabled,min:s,max:o,step:n,onInput:this.handleInput}),this.renderErrors(),0===t.length&&this.renderHint(e.hint))}renderTelField(e){const r=`input-${e.id}`,t=this.getErrors();return i("div",{class:"input-wrapper",part:"input-wrapper"},this.renderLabel(e.label,r,e.required),i("input",{id:r,class:{"input-field":!0,"has-error":t.length>0},part:"input",type:"tel",name:e.id,value:this.value??"",placeholder:e.config?.placeholder,required:e.required,disabled:this.disabled,autocomplete:"tel",onInput:this.handleInput}),this.renderErrors(),0===t.length&&this.renderHint(e.hint))}renderUrlField(e){const r=`input-${e.id}`,t=this.getErrors();return i("div",{class:"input-wrapper",part:"input-wrapper"},this.renderLabel(e.label,r,e.required),i("input",{id:r,class:{"input-field":!0,"has-error":t.length>0},part:"input",type:"url",name:e.id,value:this.value??"",placeholder:e.config?.placeholder,required:e.required,disabled:this.disabled,onInput:this.handleInput}),this.renderErrors(),0===t.length&&this.renderHint(e.hint))}renderDateField(e){const r=`input-${e.id}`,t=this.getErrors(),{min:a,max:s}=e.config??{};return i("div",{class:"input-wrapper",part:"input-wrapper"},this.renderLabel(e.label,r,e.required),i("input",{id:r,class:{"input-field":!0,"has-error":t.length>0},part:"input",type:"date",name:e.id,value:this.value??"",required:e.required,disabled:this.disabled,min:a,max:s,onInput:this.handleInput}),this.renderErrors(),0===t.length&&this.renderHint(e.hint))}renderBooleanField(e){return i("label",{class:"checkbox-wrapper",part:"checkbox-wrapper"},i("input",{type:"checkbox",part:"checkbox",name:e.id,checked:"true"===this.value||!0===e.config?.default_value,required:e.required,disabled:this.disabled,onChange:this.handleCheckbox}),i("span",{class:"checkbox-label",part:"checkbox-label"},e.label))}renderLegalField(e){const r=e.config?.text??e.label??"",t=!0===e.config?.html;return i("label",{class:"checkbox-wrapper",part:"checkbox-wrapper"},i("input",{type:"checkbox",part:"checkbox",name:e.id,checked:"true"===this.value,required:e.required,disabled:this.disabled,onChange:this.handleCheckbox}),t?i("span",{class:"checkbox-label",part:"checkbox-label",innerHTML:r}):i("span",{class:"checkbox-label",part:"checkbox-label"},r))}renderDropdownField(e){const r=`input-${e.id}`,t=this.getErrors(),{options:a,placeholder:s}=e.config??{};return i("div",{class:"input-wrapper",part:"input-wrapper"},this.renderLabel(e.label,r,e.required),i("select",{id:r,class:{"input-field":!0,"has-error":t.length>0},part:"input select",name:e.id,required:e.required,disabled:this.disabled,onChange:this.handleInput},s&&i("option",{value:"",disabled:!0,selected:!this.value},s),a?.map((e=>i("option",{value:e.value,selected:this.value===e.value,key:e.value},e.label)))),this.renderErrors(),0===t.length&&this.renderHint(e.hint))}renderChoiceField(e){const r=this.getErrors(),{options:t,display:a}=e.config??{},s="checkbox"===a,o=s?"checkbox":"radio";return i("div",{class:"choice-wrapper",part:"choice-wrapper"},e.label&&i("span",{class:"choice-label",part:"choice-label"},e.label,e.required&&i("span",{class:"required"},"*")),i("div",{class:"choice-options",part:"choice-options"},t?.map((r=>i("label",{class:"choice-option",part:"choice-option",key:r.value},i("input",{type:o,part:o,name:e.id,value:r.value,checked:this.value===r.value,required:e.required&&!s,disabled:this.disabled,onChange:this.handleInput}),i("span",null,r.label))))),this.renderErrors(),0===r.length&&this.renderHint(e.hint))}renderSocialField(e){return i("div",{class:"social-buttons",part:"social-buttons"},(e.config?.providers??[]).map((e=>i("button",{type:"button",class:"btn btn-secondary btn-social",part:"button button-secondary button-social","data-provider":e,disabled:this.disabled,onClick:r=>this.handleButtonClick(r,"social",e),key:e},"Continue with ",e.charAt(0).toUpperCase()+e.slice(1)))))}render(){if(!this.component)return null;if(!1===this.component.visible)return null;switch(this.component.type){case"DIVIDER":return this.renderDivider();case"HTML":return this.renderHtml(this.component);case"IMAGE":return this.renderImage(this.component);case"RICH_TEXT":return this.renderRichText(this.component);case"NEXT_BUTTON":return this.renderNextButton(this.component);case"PREVIOUS_BUTTON":return this.renderPreviousButton(this.component);case"JUMP_BUTTON":return this.renderJumpButton(this.component);case"RESEND_BUTTON":return this.renderResendButton(this.component);case"TEXT":return this.renderTextField(this.component);case"EMAIL":return this.renderEmailField(this.component);case"PASSWORD":return this.renderPasswordField(this.component);case"NUMBER":return this.renderNumberField(this.component);case"TEL":return this.renderTelField(this.component);case"URL":return this.renderUrlField(this.component);case"DATE":return this.renderDateField(this.component);case"BOOLEAN":return this.renderBooleanField(this.component);case"LEGAL":return this.renderLegalField(this.component);case"DROPDOWN":return this.renderDropdownField(this.component);case"CHOICE":return this.renderChoiceField(this.component);case"SOCIAL":return this.renderSocialField(this.component);case"AUTH0_VERIFIABLE_CREDENTIALS":case"GMAPS_ADDRESS":case"RECAPTCHA":return console.warn(`Widget component "${this.component.type}" not yet implemented`),null;case"CARDS":case"CUSTOM":case"FILE":case"PAYMENT":return console.warn(`Component "${this.component.type}" not yet implemented`),null;default:return console.warn(`Unknown component type: ${this.component.type}`),null}}static get style(){return":host{display:block}.input-wrapper{display:flex;flex-direction:column;gap:var(--ah-space-1, 0.25rem)}.input-label{font-size:var(--ah-font-size-sm, 0.875rem);font-weight:var(--ah-font-weight-medium, 500);color:var(--ah-color-text-label, #374151);line-height:var(--ah-line-height-normal, 1.5)}.required{color:var(--ah-color-error, #dc2626);margin-left:var(--ah-space-1, 0.25rem)}.input-field{padding:var(--ah-input-padding-y, 0.75rem) var(--ah-input-padding-x, 1rem);font-size:var(--ah-font-size-base, 1rem);font-family:inherit;color:var(--ah-color-text, #1f2937);background-color:var(--ah-color-bg, #ffffff);border:var(--ah-input-border-width, 1px) solid var(--ah-color-border, #d1d5db);border-radius:var(--ah-input-radius, 6px);outline:none;transition:border-color var(--ah-transition-base, 200ms ease), box-shadow var(--ah-transition-base, 200ms ease)}.input-field::placeholder{color:var(--ah-color-text-muted, #9ca3af)}.input-field:focus{border-color:var(--ah-color-primary, #0066cc);box-shadow:0 0 0 3px var(--ah-color-primary-focus-ring, rgba(0, 102, 204, 0.1))}.input-field.has-error{border-color:var(--ah-color-error, #dc2626)}.input-field.has-error:focus{box-shadow:0 0 0 3px rgba(220, 38, 38, 0.1)}.input-field:disabled{background-color:var(--ah-color-bg-disabled, #f3f4f6);cursor:not-allowed;opacity:0.7}.error-text{font-size:var(--ah-font-size-xs, 0.75rem);color:var(--ah-color-error, #dc2626);margin-top:var(--ah-space-1, 0.25rem)}.helper-text{font-size:var(--ah-font-size-xs, 0.75rem);color:var(--ah-color-text-muted, #6b7280);margin-top:var(--ah-space-1, 0.25rem)}.checkbox-wrapper{display:flex;align-items:flex-start;gap:var(--ah-space-2, 0.5rem);cursor:pointer}.checkbox-wrapper input[type='checkbox']{width:1rem;height:1rem;margin-top:0.125rem;accent-color:var(--ah-color-primary, #0066cc);cursor:pointer}.checkbox-label{font-size:var(--ah-font-size-sm, 0.875rem);color:var(--ah-color-text-label, #374151);line-height:var(--ah-line-height-normal, 1.5)}.btn{display:inline-flex;align-items:center;justify-content:center;gap:var(--ah-space-2, 0.5rem);width:100%;padding:var(--ah-btn-padding-y, 0.875rem) var(--ah-btn-padding-x, 1.5rem);font-size:var(--ah-font-size-base, 1rem);font-weight:var(--ah-btn-font-weight, 500);font-family:inherit;line-height:var(--ah-line-height-tight, 1.25);text-align:center;text-decoration:none;border:none;border-radius:var(--ah-btn-radius, 8px);cursor:pointer;transition:background-color var(--ah-transition-base, 200ms ease), transform var(--ah-transition-fast, 150ms ease), box-shadow var(--ah-transition-base, 200ms ease)}.btn:disabled{opacity:0.6;cursor:not-allowed}.btn:not(:disabled):active{transform:scale(0.98)}.btn:focus-visible{outline:2px solid var(--ah-color-primary, #0066cc);outline-offset:2px}.btn-primary{background-color:var(--ah-color-primary, #0066cc);color:var(--ah-color-text-on-primary, #ffffff)}.btn-primary:not(:disabled):hover{background-color:var(--ah-color-primary-hover, #0052a3)}.btn-secondary{background-color:var(--ah-color-bg, #ffffff);color:var(--ah-color-text, #374151);border:1px solid var(--ah-color-border-muted, #e5e7eb)}.btn-secondary:not(:disabled):hover{background-color:var(--ah-color-bg-muted, #f9fafb);border-color:var(--ah-color-border, #d1d5db)}.text-title{font-size:var(--ah-font-size-xl, 1.25rem);font-weight:var(--ah-font-weight-semibold, 600);color:var(--ah-color-text, #1f2937);margin:var(--ah-space-2, 0.5rem) 0;line-height:var(--ah-line-height-tight, 1.25)}.text-title.text-success{color:var(--ah-color-success, #16a34a)}.text-description{font-size:var(--ah-font-size-sm, 0.875rem);color:var(--ah-color-text-muted, #6b7280);margin:var(--ah-space-1, 0.25rem) 0;line-height:var(--ah-line-height-normal, 1.5)}.image{display:block;max-width:100%;height:auto;border-radius:var(--ah-radius-lg, 8px)}.image-centered{margin:0 auto var(--ah-space-4, 1rem);width:var(--ah-logo-size, 48px);height:var(--ah-logo-size, 48px);object-fit:contain}.link{color:var(--ah-color-primary, #0066cc);text-decoration:none;font-size:var(--ah-font-size-sm, 0.875rem);transition:color var(--ah-transition-fast, 150ms ease)}.link:hover{text-decoration:underline}.link:focus-visible{outline:2px solid var(--ah-color-primary, #0066cc);outline-offset:2px}.node-error{padding:var(--ah-space-3, 0.75rem) var(--ah-space-4, 1rem);background-color:var(--ah-color-error-bg, #fee2e2);color:var(--ah-color-error, #dc2626);border:1px solid var(--ah-color-error-border, #fecaca);border-radius:var(--ah-radius-md, 6px);font-size:var(--ah-font-size-sm, 0.875rem)}.node-success{padding:var(--ah-space-3, 0.75rem) var(--ah-space-4, 1rem);background-color:var(--ah-color-success-bg, #dcfce7);color:var(--ah-color-success, #16a34a);border:1px solid var(--ah-color-success-border, #bbf7d0);border-radius:var(--ah-radius-md, 6px);font-size:var(--ah-font-size-sm, 0.875rem)}.divider{display:flex;align-items:center;text-align:center;margin:var(--ah-space-4, 1rem) 0}.divider::before,.divider::after{content:'';flex:1;border-bottom:1px solid var(--ah-color-border-muted, #e5e7eb)}.divider-text{padding:0 var(--ah-space-4, 1rem);font-size:var(--ah-font-size-sm, 0.875rem);color:var(--ah-color-text-muted, #9ca3af);text-transform:uppercase;letter-spacing:0.05em}"}},[513,"authhero-node",{component:[16],value:[1],disabled:[4]}]);function o(){"undefined"!=typeof customElements&&["authhero-node"].forEach((r=>{"authhero-node"===r&&(customElements.get(e(r))||customElements.define(e(r),s))}))}o();export{s as A,o as d}
|
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
import { r as registerInstance, c as createEvent, h } from './index-Doiemx6o.js';
|
|
2
|
+
|
|
3
|
+
const authheroNodeCss = () => `:host{display:block}.input-wrapper{display:flex;flex-direction:column;gap:var(--ah-space-1, 0.25rem)}.input-label{font-size:var(--ah-font-size-sm, 0.875rem);font-weight:var(--ah-font-weight-medium, 500);color:var(--ah-color-text-label, #374151);line-height:var(--ah-line-height-normal, 1.5)}.required{color:var(--ah-color-error, #dc2626);margin-left:var(--ah-space-1, 0.25rem)}.input-field{padding:var(--ah-input-padding-y, 0.75rem) var(--ah-input-padding-x, 1rem);font-size:var(--ah-font-size-base, 1rem);font-family:inherit;color:var(--ah-color-text, #1f2937);background-color:var(--ah-color-bg, #ffffff);border:var(--ah-input-border-width, 1px) solid var(--ah-color-border, #d1d5db);border-radius:var(--ah-input-radius, 6px);outline:none;transition:border-color var(--ah-transition-base, 200ms ease), box-shadow var(--ah-transition-base, 200ms ease)}.input-field::placeholder{color:var(--ah-color-text-muted, #9ca3af)}.input-field:focus{border-color:var(--ah-color-primary, #0066cc);box-shadow:0 0 0 3px var(--ah-color-primary-focus-ring, rgba(0, 102, 204, 0.1))}.input-field.has-error{border-color:var(--ah-color-error, #dc2626)}.input-field.has-error:focus{box-shadow:0 0 0 3px rgba(220, 38, 38, 0.1)}.input-field:disabled{background-color:var(--ah-color-bg-disabled, #f3f4f6);cursor:not-allowed;opacity:0.7}.error-text{font-size:var(--ah-font-size-xs, 0.75rem);color:var(--ah-color-error, #dc2626);margin-top:var(--ah-space-1, 0.25rem)}.helper-text{font-size:var(--ah-font-size-xs, 0.75rem);color:var(--ah-color-text-muted, #6b7280);margin-top:var(--ah-space-1, 0.25rem)}.checkbox-wrapper{display:flex;align-items:flex-start;gap:var(--ah-space-2, 0.5rem);cursor:pointer}.checkbox-wrapper input[type='checkbox']{width:1rem;height:1rem;margin-top:0.125rem;accent-color:var(--ah-color-primary, #0066cc);cursor:pointer}.checkbox-label{font-size:var(--ah-font-size-sm, 0.875rem);color:var(--ah-color-text-label, #374151);line-height:var(--ah-line-height-normal, 1.5)}.btn{display:inline-flex;align-items:center;justify-content:center;gap:var(--ah-space-2, 0.5rem);width:100%;padding:var(--ah-btn-padding-y, 0.875rem) var(--ah-btn-padding-x, 1.5rem);font-size:var(--ah-font-size-base, 1rem);font-weight:var(--ah-btn-font-weight, 500);font-family:inherit;line-height:var(--ah-line-height-tight, 1.25);text-align:center;text-decoration:none;border:none;border-radius:var(--ah-btn-radius, 8px);cursor:pointer;transition:background-color var(--ah-transition-base, 200ms ease), transform var(--ah-transition-fast, 150ms ease), box-shadow var(--ah-transition-base, 200ms ease)}.btn:disabled{opacity:0.6;cursor:not-allowed}.btn:not(:disabled):active{transform:scale(0.98)}.btn:focus-visible{outline:2px solid var(--ah-color-primary, #0066cc);outline-offset:2px}.btn-primary{background-color:var(--ah-color-primary, #0066cc);color:var(--ah-color-text-on-primary, #ffffff)}.btn-primary:not(:disabled):hover{background-color:var(--ah-color-primary-hover, #0052a3)}.btn-secondary{background-color:var(--ah-color-bg, #ffffff);color:var(--ah-color-text, #374151);border:1px solid var(--ah-color-border-muted, #e5e7eb)}.btn-secondary:not(:disabled):hover{background-color:var(--ah-color-bg-muted, #f9fafb);border-color:var(--ah-color-border, #d1d5db)}.text-title{font-size:var(--ah-font-size-xl, 1.25rem);font-weight:var(--ah-font-weight-semibold, 600);color:var(--ah-color-text, #1f2937);margin:var(--ah-space-2, 0.5rem) 0;line-height:var(--ah-line-height-tight, 1.25)}.text-title.text-success{color:var(--ah-color-success, #16a34a)}.text-description{font-size:var(--ah-font-size-sm, 0.875rem);color:var(--ah-color-text-muted, #6b7280);margin:var(--ah-space-1, 0.25rem) 0;line-height:var(--ah-line-height-normal, 1.5)}.image{display:block;max-width:100%;height:auto;border-radius:var(--ah-radius-lg, 8px)}.image-centered{margin:0 auto var(--ah-space-4, 1rem);width:var(--ah-logo-size, 48px);height:var(--ah-logo-size, 48px);object-fit:contain}.link{color:var(--ah-color-primary, #0066cc);text-decoration:none;font-size:var(--ah-font-size-sm, 0.875rem);transition:color var(--ah-transition-fast, 150ms ease)}.link:hover{text-decoration:underline}.link:focus-visible{outline:2px solid var(--ah-color-primary, #0066cc);outline-offset:2px}.node-error{padding:var(--ah-space-3, 0.75rem) var(--ah-space-4, 1rem);background-color:var(--ah-color-error-bg, #fee2e2);color:var(--ah-color-error, #dc2626);border:1px solid var(--ah-color-error-border, #fecaca);border-radius:var(--ah-radius-md, 6px);font-size:var(--ah-font-size-sm, 0.875rem)}.node-success{padding:var(--ah-space-3, 0.75rem) var(--ah-space-4, 1rem);background-color:var(--ah-color-success-bg, #dcfce7);color:var(--ah-color-success, #16a34a);border:1px solid var(--ah-color-success-border, #bbf7d0);border-radius:var(--ah-radius-md, 6px);font-size:var(--ah-font-size-sm, 0.875rem)}.divider{display:flex;align-items:center;text-align:center;margin:var(--ah-space-4, 1rem) 0}.divider::before,.divider::after{content:'';flex:1;border-bottom:1px solid var(--ah-color-border-muted, #e5e7eb)}.divider-text{padding:0 var(--ah-space-4, 1rem);font-size:var(--ah-font-size-sm, 0.875rem);color:var(--ah-color-text-muted, #9ca3af);text-transform:uppercase;letter-spacing:0.05em}`;
|
|
4
|
+
|
|
5
|
+
const AuthheroNode = class {
|
|
6
|
+
constructor(hostRef) {
|
|
7
|
+
registerInstance(this, hostRef);
|
|
8
|
+
this.fieldChange = createEvent(this, "fieldChange");
|
|
9
|
+
this.buttonClick = createEvent(this, "buttonClick");
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* The component configuration to render.
|
|
13
|
+
* Follows Auth0 Forms component schema.
|
|
14
|
+
*/
|
|
15
|
+
component;
|
|
16
|
+
/**
|
|
17
|
+
* Current value for field components.
|
|
18
|
+
*/
|
|
19
|
+
value;
|
|
20
|
+
/**
|
|
21
|
+
* Whether the component is disabled.
|
|
22
|
+
*/
|
|
23
|
+
disabled = false;
|
|
24
|
+
/**
|
|
25
|
+
* Emitted when a field value changes.
|
|
26
|
+
*/
|
|
27
|
+
fieldChange;
|
|
28
|
+
/**
|
|
29
|
+
* Emitted when a button is clicked.
|
|
30
|
+
*/
|
|
31
|
+
buttonClick;
|
|
32
|
+
handleInput = (e) => {
|
|
33
|
+
const target = e.target;
|
|
34
|
+
this.fieldChange.emit({ id: this.component.id, value: target.value });
|
|
35
|
+
};
|
|
36
|
+
handleCheckbox = (e) => {
|
|
37
|
+
const target = e.target;
|
|
38
|
+
this.fieldChange.emit({
|
|
39
|
+
id: this.component.id,
|
|
40
|
+
value: target.checked ? "true" : "false",
|
|
41
|
+
});
|
|
42
|
+
};
|
|
43
|
+
handleButtonClick = (e, type, value) => {
|
|
44
|
+
if (type !== "submit") {
|
|
45
|
+
e.preventDefault();
|
|
46
|
+
}
|
|
47
|
+
this.buttonClick.emit({ id: this.component.id, type, value });
|
|
48
|
+
};
|
|
49
|
+
/**
|
|
50
|
+
* Get error messages from the component.
|
|
51
|
+
*/
|
|
52
|
+
getErrors() {
|
|
53
|
+
const runtimeComp = this.component;
|
|
54
|
+
return (runtimeComp.messages?.filter((m) => m.type === "error") || []);
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Render a label for a field.
|
|
58
|
+
*/
|
|
59
|
+
renderLabel(text, inputId, required) {
|
|
60
|
+
if (!text)
|
|
61
|
+
return null;
|
|
62
|
+
return (h("label", { class: "input-label", part: "label", htmlFor: inputId }, text, required && h("span", { class: "required" }, "*")));
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Render error messages.
|
|
66
|
+
*/
|
|
67
|
+
renderErrors() {
|
|
68
|
+
const errors = this.getErrors();
|
|
69
|
+
return errors.map((err) => (h("span", { class: "error-text", part: "error-text", key: err.id ?? err.text }, err.text)));
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Render hint text.
|
|
73
|
+
*/
|
|
74
|
+
renderHint(hint) {
|
|
75
|
+
if (!hint)
|
|
76
|
+
return null;
|
|
77
|
+
return (h("span", { class: "helper-text", part: "helper-text" }, hint));
|
|
78
|
+
}
|
|
79
|
+
// ===========================================================================
|
|
80
|
+
// BLOCK Component Renderers
|
|
81
|
+
// ===========================================================================
|
|
82
|
+
renderDivider() {
|
|
83
|
+
return h("hr", { class: "divider", part: "divider" });
|
|
84
|
+
}
|
|
85
|
+
renderHtml(component) {
|
|
86
|
+
return (h("div", { class: "html-content", part: "html-content", innerHTML: component.config?.content ?? "" }));
|
|
87
|
+
}
|
|
88
|
+
renderImage(component) {
|
|
89
|
+
const { src, alt, width, height } = component.config ?? {};
|
|
90
|
+
if (!src)
|
|
91
|
+
return null;
|
|
92
|
+
return (h("img", { class: "image", part: "image", src: src, alt: alt ?? "", width: width, height: height, loading: "lazy" }));
|
|
93
|
+
}
|
|
94
|
+
renderRichText(component) {
|
|
95
|
+
return (h("div", { class: "rich-text", part: "rich-text", innerHTML: component.config?.content ?? "" }));
|
|
96
|
+
}
|
|
97
|
+
renderNextButton(component) {
|
|
98
|
+
return (h("button", { type: "submit", class: "btn btn-primary", part: "button button-primary", disabled: this.disabled, onClick: (e) => this.handleButtonClick(e, "submit", "next") }, component.config.text ?? "Continue"));
|
|
99
|
+
}
|
|
100
|
+
renderPreviousButton(component) {
|
|
101
|
+
return (h("button", { type: "button", class: "btn btn-secondary", part: "button button-secondary", disabled: this.disabled, onClick: (e) => this.handleButtonClick(e, "previous", "back") }, component.config.text ?? "Back"));
|
|
102
|
+
}
|
|
103
|
+
renderJumpButton(component) {
|
|
104
|
+
return (h("button", { type: "button", class: "btn btn-link", part: "button button-link", disabled: this.disabled, onClick: (e) => this.handleButtonClick(e, "jump", component.config.target_step) }, component.config.text ?? "Go"));
|
|
105
|
+
}
|
|
106
|
+
renderResendButton(component) {
|
|
107
|
+
return (h("button", { type: "button", class: "btn btn-link", part: "button button-link", disabled: this.disabled, onClick: (e) => this.handleButtonClick(e, "resend", component.config.resend_action) }, component.config.text ?? "Resend"));
|
|
108
|
+
}
|
|
109
|
+
// ===========================================================================
|
|
110
|
+
// FIELD Component Renderers
|
|
111
|
+
// ===========================================================================
|
|
112
|
+
renderTextField(component) {
|
|
113
|
+
const inputId = `input-${component.id}`;
|
|
114
|
+
const errors = this.getErrors();
|
|
115
|
+
const { placeholder, multiline, max_length } = component.config ?? {};
|
|
116
|
+
if (multiline) {
|
|
117
|
+
return (h("div", { class: "input-wrapper", part: "input-wrapper" }, this.renderLabel(component.label, inputId, component.required), h("textarea", { id: inputId, class: { "input-field": true, "has-error": errors.length > 0 }, part: "input textarea", name: component.id, placeholder: placeholder, required: component.required, disabled: this.disabled, maxLength: max_length, onInput: this.handleInput }, this.value ?? ""), this.renderErrors(), errors.length === 0 && this.renderHint(component.hint)));
|
|
118
|
+
}
|
|
119
|
+
return (h("div", { class: "input-wrapper", part: "input-wrapper" }, this.renderLabel(component.label, inputId, component.required), h("input", { id: inputId, class: { "input-field": true, "has-error": errors.length > 0 }, part: "input", type: component.sensitive ? "password" : "text", name: component.id, value: this.value ?? "", placeholder: placeholder, required: component.required, disabled: this.disabled, maxLength: max_length, onInput: this.handleInput }), this.renderErrors(), errors.length === 0 && this.renderHint(component.hint)));
|
|
120
|
+
}
|
|
121
|
+
renderEmailField(component) {
|
|
122
|
+
const inputId = `input-${component.id}`;
|
|
123
|
+
const errors = this.getErrors();
|
|
124
|
+
return (h("div", { class: "input-wrapper", part: "input-wrapper" }, this.renderLabel(component.label, inputId, component.required), h("input", { id: inputId, class: { "input-field": true, "has-error": errors.length > 0 }, part: "input", type: "email", name: component.id, value: this.value ?? "", placeholder: component.config?.placeholder, required: component.required, disabled: this.disabled, autocomplete: "email", onInput: this.handleInput }), this.renderErrors(), errors.length === 0 && this.renderHint(component.hint)));
|
|
125
|
+
}
|
|
126
|
+
renderPasswordField(component) {
|
|
127
|
+
const inputId = `input-${component.id}`;
|
|
128
|
+
const errors = this.getErrors();
|
|
129
|
+
return (h("div", { class: "input-wrapper", part: "input-wrapper" }, this.renderLabel(component.label, inputId, component.required), h("input", { id: inputId, class: { "input-field": true, "has-error": errors.length > 0 }, part: "input", type: "password", name: component.id, value: this.value ?? "", placeholder: component.config?.placeholder, required: component.required, disabled: this.disabled, minLength: component.config?.min_length, autocomplete: "current-password", onInput: this.handleInput }), this.renderErrors(), errors.length === 0 && this.renderHint(component.hint)));
|
|
130
|
+
}
|
|
131
|
+
renderNumberField(component) {
|
|
132
|
+
const inputId = `input-${component.id}`;
|
|
133
|
+
const errors = this.getErrors();
|
|
134
|
+
const { placeholder, min, max, step } = component.config ?? {};
|
|
135
|
+
return (h("div", { class: "input-wrapper", part: "input-wrapper" }, this.renderLabel(component.label, inputId, component.required), h("input", { id: inputId, class: { "input-field": true, "has-error": errors.length > 0 }, part: "input", type: "number", name: component.id, value: this.value ?? "", placeholder: placeholder, required: component.required, disabled: this.disabled, min: min, max: max, step: step, onInput: this.handleInput }), this.renderErrors(), errors.length === 0 && this.renderHint(component.hint)));
|
|
136
|
+
}
|
|
137
|
+
renderTelField(component) {
|
|
138
|
+
const inputId = `input-${component.id}`;
|
|
139
|
+
const errors = this.getErrors();
|
|
140
|
+
return (h("div", { class: "input-wrapper", part: "input-wrapper" }, this.renderLabel(component.label, inputId, component.required), h("input", { id: inputId, class: { "input-field": true, "has-error": errors.length > 0 }, part: "input", type: "tel", name: component.id, value: this.value ?? "", placeholder: component.config?.placeholder, required: component.required, disabled: this.disabled, autocomplete: "tel", onInput: this.handleInput }), this.renderErrors(), errors.length === 0 && this.renderHint(component.hint)));
|
|
141
|
+
}
|
|
142
|
+
renderUrlField(component) {
|
|
143
|
+
const inputId = `input-${component.id}`;
|
|
144
|
+
const errors = this.getErrors();
|
|
145
|
+
return (h("div", { class: "input-wrapper", part: "input-wrapper" }, this.renderLabel(component.label, inputId, component.required), h("input", { id: inputId, class: { "input-field": true, "has-error": errors.length > 0 }, part: "input", type: "url", name: component.id, value: this.value ?? "", placeholder: component.config?.placeholder, required: component.required, disabled: this.disabled, onInput: this.handleInput }), this.renderErrors(), errors.length === 0 && this.renderHint(component.hint)));
|
|
146
|
+
}
|
|
147
|
+
renderDateField(component) {
|
|
148
|
+
const inputId = `input-${component.id}`;
|
|
149
|
+
const errors = this.getErrors();
|
|
150
|
+
const { min, max } = component.config ?? {};
|
|
151
|
+
return (h("div", { class: "input-wrapper", part: "input-wrapper" }, this.renderLabel(component.label, inputId, component.required), h("input", { id: inputId, class: { "input-field": true, "has-error": errors.length > 0 }, part: "input", type: "date", name: component.id, value: this.value ?? "", required: component.required, disabled: this.disabled, min: min, max: max, onInput: this.handleInput }), this.renderErrors(), errors.length === 0 && this.renderHint(component.hint)));
|
|
152
|
+
}
|
|
153
|
+
renderBooleanField(component) {
|
|
154
|
+
return (h("label", { class: "checkbox-wrapper", part: "checkbox-wrapper" }, h("input", { type: "checkbox", part: "checkbox", name: component.id, checked: this.value === "true" || component.config?.default_value === true, required: component.required, disabled: this.disabled, onChange: this.handleCheckbox }), h("span", { class: "checkbox-label", part: "checkbox-label" }, component.label)));
|
|
155
|
+
}
|
|
156
|
+
renderLegalField(component) {
|
|
157
|
+
const text = component.config?.text ?? component.label ?? "";
|
|
158
|
+
const isHtml = component.config?.html === true;
|
|
159
|
+
return (h("label", { class: "checkbox-wrapper", part: "checkbox-wrapper" }, h("input", { type: "checkbox", part: "checkbox", name: component.id, checked: this.value === "true", required: component.required, disabled: this.disabled, onChange: this.handleCheckbox }), isHtml ? (h("span", { class: "checkbox-label", part: "checkbox-label", innerHTML: text })) : (h("span", { class: "checkbox-label", part: "checkbox-label" }, text))));
|
|
160
|
+
}
|
|
161
|
+
renderDropdownField(component) {
|
|
162
|
+
const inputId = `input-${component.id}`;
|
|
163
|
+
const errors = this.getErrors();
|
|
164
|
+
const { options, placeholder } = component.config ?? {};
|
|
165
|
+
return (h("div", { class: "input-wrapper", part: "input-wrapper" }, this.renderLabel(component.label, inputId, component.required), h("select", { id: inputId, class: { "input-field": true, "has-error": errors.length > 0 }, part: "input select", name: component.id, required: component.required, disabled: this.disabled, onChange: this.handleInput }, placeholder && (h("option", { value: "", disabled: true, selected: !this.value }, placeholder)), options?.map((opt) => (h("option", { value: opt.value, selected: this.value === opt.value, key: opt.value }, opt.label)))), this.renderErrors(), errors.length === 0 && this.renderHint(component.hint)));
|
|
166
|
+
}
|
|
167
|
+
renderChoiceField(component) {
|
|
168
|
+
const errors = this.getErrors();
|
|
169
|
+
const { options, display } = component.config ?? {};
|
|
170
|
+
const isCheckbox = display === "checkbox";
|
|
171
|
+
const inputType = isCheckbox ? "checkbox" : "radio";
|
|
172
|
+
return (h("div", { class: "choice-wrapper", part: "choice-wrapper" }, component.label && (h("span", { class: "choice-label", part: "choice-label" }, component.label, component.required && h("span", { class: "required" }, "*"))), h("div", { class: "choice-options", part: "choice-options" }, options?.map((opt) => (h("label", { class: "choice-option", part: "choice-option", key: opt.value }, h("input", { type: inputType, part: inputType, name: component.id, value: opt.value, checked: this.value === opt.value, required: component.required && !isCheckbox, disabled: this.disabled, onChange: this.handleInput }), h("span", null, opt.label))))), this.renderErrors(), errors.length === 0 && this.renderHint(component.hint)));
|
|
173
|
+
}
|
|
174
|
+
renderSocialField(component) {
|
|
175
|
+
const providers = component.config?.providers ?? [];
|
|
176
|
+
return (h("div", { class: "social-buttons", part: "social-buttons" }, providers.map((provider) => (h("button", { type: "button", class: "btn btn-secondary btn-social", part: "button button-secondary button-social", "data-provider": provider, disabled: this.disabled, onClick: (e) => this.handleButtonClick(e, "social", provider), key: provider }, "Continue with ", provider.charAt(0).toUpperCase() + provider.slice(1))))));
|
|
177
|
+
}
|
|
178
|
+
// ===========================================================================
|
|
179
|
+
// Main Render
|
|
180
|
+
// ===========================================================================
|
|
181
|
+
render() {
|
|
182
|
+
if (!this.component) {
|
|
183
|
+
return null;
|
|
184
|
+
}
|
|
185
|
+
// Hidden components
|
|
186
|
+
if (this.component.visible === false) {
|
|
187
|
+
return null;
|
|
188
|
+
}
|
|
189
|
+
switch (this.component.type) {
|
|
190
|
+
// BLOCK components
|
|
191
|
+
case "DIVIDER":
|
|
192
|
+
return this.renderDivider();
|
|
193
|
+
case "HTML":
|
|
194
|
+
return this.renderHtml(this.component);
|
|
195
|
+
case "IMAGE":
|
|
196
|
+
return this.renderImage(this.component);
|
|
197
|
+
case "RICH_TEXT":
|
|
198
|
+
return this.renderRichText(this.component);
|
|
199
|
+
case "NEXT_BUTTON":
|
|
200
|
+
return this.renderNextButton(this.component);
|
|
201
|
+
case "PREVIOUS_BUTTON":
|
|
202
|
+
return this.renderPreviousButton(this.component);
|
|
203
|
+
case "JUMP_BUTTON":
|
|
204
|
+
return this.renderJumpButton(this.component);
|
|
205
|
+
case "RESEND_BUTTON":
|
|
206
|
+
return this.renderResendButton(this.component);
|
|
207
|
+
// FIELD components
|
|
208
|
+
case "TEXT":
|
|
209
|
+
return this.renderTextField(this.component);
|
|
210
|
+
case "EMAIL":
|
|
211
|
+
return this.renderEmailField(this.component);
|
|
212
|
+
case "PASSWORD":
|
|
213
|
+
return this.renderPasswordField(this.component);
|
|
214
|
+
case "NUMBER":
|
|
215
|
+
return this.renderNumberField(this.component);
|
|
216
|
+
case "TEL":
|
|
217
|
+
return this.renderTelField(this.component);
|
|
218
|
+
case "URL":
|
|
219
|
+
return this.renderUrlField(this.component);
|
|
220
|
+
case "DATE":
|
|
221
|
+
return this.renderDateField(this.component);
|
|
222
|
+
case "BOOLEAN":
|
|
223
|
+
return this.renderBooleanField(this.component);
|
|
224
|
+
case "LEGAL":
|
|
225
|
+
return this.renderLegalField(this.component);
|
|
226
|
+
case "DROPDOWN":
|
|
227
|
+
return this.renderDropdownField(this.component);
|
|
228
|
+
case "CHOICE":
|
|
229
|
+
return this.renderChoiceField(this.component);
|
|
230
|
+
case "SOCIAL":
|
|
231
|
+
return this.renderSocialField(this.component);
|
|
232
|
+
// WIDGET components (not yet implemented)
|
|
233
|
+
case "AUTH0_VERIFIABLE_CREDENTIALS":
|
|
234
|
+
case "GMAPS_ADDRESS":
|
|
235
|
+
case "RECAPTCHA":
|
|
236
|
+
console.warn(`Widget component "${this.component.type}" not yet implemented`);
|
|
237
|
+
return null;
|
|
238
|
+
// Other FIELD components (not yet implemented)
|
|
239
|
+
case "CARDS":
|
|
240
|
+
case "CUSTOM":
|
|
241
|
+
case "FILE":
|
|
242
|
+
case "PAYMENT":
|
|
243
|
+
console.warn(`Component "${this.component.type}" not yet implemented`);
|
|
244
|
+
return null;
|
|
245
|
+
default:
|
|
246
|
+
console.warn(`Unknown component type: ${this.component.type}`);
|
|
247
|
+
return null;
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
};
|
|
251
|
+
AuthheroNode.style = authheroNodeCss();
|
|
252
|
+
|
|
253
|
+
export { AuthheroNode as authhero_node };
|