@tempots/beatui 0.68.0 → 0.71.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (98) hide show
  1. package/dist/{ar-aMLQTGVh.js → ar-BbgpGwJp.js} +1 -1
  2. package/dist/auth/index.cjs.js +1 -1
  3. package/dist/auth/index.es.js +106 -105
  4. package/dist/beatui.css +401 -0
  5. package/dist/beatui.tailwind.css +401 -0
  6. package/dist/{de-DBFOC44R.js → de-R7lPfyZ4.js} +1 -1
  7. package/dist/deep-merge-CQQCMLwG.js +1636 -0
  8. package/dist/deep-merge-DZxfgKqX.cjs +1 -0
  9. package/dist/duration-input-D-SIoDoo.cjs +1 -0
  10. package/dist/duration-input-DKxZ6OCa.js +277 -0
  11. package/dist/{es-C4xOThaT.js → es-DV0Jr_BZ.js} +1 -1
  12. package/dist/{fa-B7X_xydY.js → fa-DXvHejs9.js} +1 -1
  13. package/dist/{fr-AmjzbxN_.js → fr-D8FOMX0o.js} +1 -1
  14. package/dist/{he-DY-9yiOC.js → he-B19Qsx-u.js} +1 -1
  15. package/dist/{hi-Clkyp5Fu.js → hi-DozFnE3b.js} +1 -1
  16. package/dist/{index-GLoRnI6r.js → index-CYb1YxDX.js} +1 -1
  17. package/dist/{index-CzuXAuLZ.js → index-DdpYvBeh.js} +3 -3
  18. package/dist/index.cjs.js +4 -4
  19. package/dist/index.es.js +2830 -3079
  20. package/dist/{it-BC32WmGF.js → it-But8uzNi.js} +1 -1
  21. package/dist/{ja-JNSZS_Hv.js → ja-DkwTnFdU.js} +1 -1
  22. package/dist/json-schema/index.cjs.js +6 -6
  23. package/dist/json-schema/index.es.js +3459 -3333
  24. package/dist/json-structure/index.cjs.js +1 -0
  25. package/dist/json-structure/index.es.js +3157 -0
  26. package/dist/{ko-B8l0TJp0.js → ko-Cqv-IjhX.js} +1 -1
  27. package/dist/modal-5P9mU_a4.cjs +1 -0
  28. package/dist/{modal-DJWj5M5e.js → modal-MofsfmAe.js} +2 -2
  29. package/dist/{nl-BpYESHP8.js → nl-YSiU3rFI.js} +1 -1
  30. package/dist/notice-Cqq8g17n.js +209 -0
  31. package/dist/notice-DP209Ed8.cjs +1 -0
  32. package/dist/{pl-_sWhGdrs.js → pl-DXmHc2Nh.js} +1 -1
  33. package/dist/prosemirror/index.es.js +1 -1
  34. package/dist/{pt-BmiQvHUz.js → pt-Bf3z_-26.js} +1 -1
  35. package/dist/{ru-DacnqexG.js → ru-Sy00qUeG.js} +1 -1
  36. package/dist/tailwind/vite-plugin.es.js +1 -0
  37. package/dist/{toolbar-Bk5-22ln.js → toolbar-C_Ec0_XC.js} +1 -1
  38. package/dist/{tr-BSS5b_v6.js → tr-BDxG3qd6.js} +1 -1
  39. package/dist/{translations-zGwuSQWQ.js → translations-BmsRhth7.js} +1 -1
  40. package/dist/{translations-BUTBIDsS.js → translations-DQxouiBG.js} +24 -24
  41. package/dist/types/components/form/index.d.ts +1 -0
  42. package/dist/types/components/form/utils/deep-merge.d.ts +27 -0
  43. package/dist/types/components/form/utils/index.d.ts +1 -0
  44. package/dist/types/components/json-schema/controls/generic-control.d.ts +2 -1
  45. package/dist/types/components/json-schema/controls/shared-utils.d.ts +17 -1
  46. package/dist/types/components/json-schema/index.d.ts +2 -0
  47. package/dist/types/components/json-schema/json-schema-form.d.ts +25 -3
  48. package/dist/types/components/json-schema/schema-context.d.ts +3 -0
  49. package/dist/types/components/json-schema/schema-defaults.d.ts +39 -0
  50. package/dist/types/components/json-schema/widgets/widget-customization.d.ts +55 -0
  51. package/dist/types/components/json-structure/controls/any-control.d.ts +15 -0
  52. package/dist/types/components/json-structure/controls/array-control.d.ts +15 -0
  53. package/dist/types/components/json-structure/controls/binary-control.d.ts +15 -0
  54. package/dist/types/components/json-structure/controls/boolean-control.d.ts +15 -0
  55. package/dist/types/components/json-structure/controls/choice-control.d.ts +19 -0
  56. package/dist/types/components/json-structure/controls/decimal-control.d.ts +17 -0
  57. package/dist/types/components/json-structure/controls/deprecation-utils.d.ts +14 -0
  58. package/dist/types/components/json-structure/controls/enum-const-controls.d.ts +22 -0
  59. package/dist/types/components/json-structure/controls/generic-control.d.ts +31 -0
  60. package/dist/types/components/json-structure/controls/index.d.ts +21 -0
  61. package/dist/types/components/json-structure/controls/integer-control.d.ts +18 -0
  62. package/dist/types/components/json-structure/controls/map-control.d.ts +17 -0
  63. package/dist/types/components/json-structure/controls/object-control.d.ts +17 -0
  64. package/dist/types/components/json-structure/controls/set-control.d.ts +15 -0
  65. package/dist/types/components/json-structure/controls/string-control.d.ts +15 -0
  66. package/dist/types/components/json-structure/controls/temporal-control.d.ts +18 -0
  67. package/dist/types/components/json-structure/controls/tuple-control.d.ts +19 -0
  68. package/dist/types/components/json-structure/controls/union-control.d.ts +15 -0
  69. package/dist/types/components/json-structure/controls/uri-control.d.ts +15 -0
  70. package/dist/types/components/json-structure/controls/uuid-control.d.ts +15 -0
  71. package/dist/types/components/json-structure/extends-utils.d.ts +36 -0
  72. package/dist/types/components/json-structure/index.d.ts +25 -0
  73. package/dist/types/components/json-structure/json-structure-form.d.ts +96 -0
  74. package/dist/types/components/json-structure/ref-utils.d.ts +55 -0
  75. package/dist/types/components/json-structure/structure-context.d.ts +176 -0
  76. package/dist/types/components/json-structure/structure-defaults.d.ts +46 -0
  77. package/dist/types/components/json-structure/structure-types.d.ts +173 -0
  78. package/dist/types/components/json-structure/validation/error-transform.d.ts +56 -0
  79. package/dist/types/components/json-structure/validation/index.d.ts +5 -0
  80. package/dist/types/components/json-structure/validation/sdk-validator.d.ts +46 -0
  81. package/dist/types/components/json-structure/widgets/default-widgets.d.ts +27 -0
  82. package/dist/types/components/json-structure/widgets/index.d.ts +6 -0
  83. package/dist/types/components/json-structure/widgets/widget-registry.d.ts +143 -0
  84. package/dist/types/components/json-structure/widgets/widget-utils.d.ts +79 -0
  85. package/dist/types/index.d.ts +1 -0
  86. package/dist/types/json-structure/index.d.ts +9 -0
  87. package/dist/{ur-C6Ky6OCl.js → ur-55zdT2TQ.js} +1 -1
  88. package/dist/{notice-Um1LwKBF.js → use-form-B7A865EM.js} +329 -532
  89. package/dist/use-form-DVJXMMoN.cjs +2 -0
  90. package/dist/{vi-Bx2gx2S0.js → vi-C7K7W0hM.js} +1 -1
  91. package/dist/widget-customization-29Hl2gKT.js +1171 -0
  92. package/dist/widget-customization-BXiewbt-.cjs +1 -0
  93. package/dist/{zh-eixtg-Ce.js → zh-DvJBV9D8.js} +1 -1
  94. package/package.json +10 -2
  95. package/dist/modal-D_paG9Sr.cjs +0 -1
  96. package/dist/notice-CgT9ma2m.cjs +0 -2
  97. package/dist/utils-7JQljUYX.js +0 -2554
  98. package/dist/utils-CPtkOy9f.cjs +0 -1
@@ -1,4 +1,4 @@
1
- import { f as r } from "./translations-BUTBIDsS.js";
1
+ import { f as r } from "./translations-DQxouiBG.js";
2
2
  const d = {
3
3
  loadingExtended: "로딩 중입니다. 잠시만 기다려 주세요",
4
4
  loadingShort: "로딩 중...",
@@ -0,0 +1 @@
1
+ "use strict";const r=require("@tempots/dom"),w=require("./timer-DK_yKNwE.cjs"),q=require("./use-form-DVJXMMoN.cjs"),O=require("./translations-hMQlZmD4.cjs"),_=["a[href]","button:not([disabled])","input:not([disabled])","select:not([disabled])","textarea:not([disabled])",'[tabindex]:not([tabindex="-1"])','[contenteditable="true"]',"audio[controls]","video[controls]","details > summary:first-of-type","details[open]"].join(", ");function P(o){return Array.from(o.querySelectorAll(_)).filter(t=>{const s=t;return s.offsetWidth>0&&s.offsetHeight>0&&!s.hasAttribute("inert")&&window.getComputedStyle(s).visibility!=="hidden"})}function V(o={}){const{active:t=!0,escapeDeactivates:s=!0,onEscape:e,initialFocus:n,returnFocus:a,clickOutsideDeactivates:i=!1,onClickOutside:d}=o;return r.WithElement(p=>{let f=t,h=null,c=[];typeof document<"u"&&(h=document.activeElement);const v=()=>{c=P(p)},b=u=>{if(f){if(s&&u.key==="Escape"){u.preventDefault(),e?.();return}if(u.key==="Tab"){if(v(),c.length===0){u.preventDefault();return}const l=c.indexOf(document.activeElement);u.shiftKey?l<=0&&(u.preventDefault(),c[c.length-1]?.focus()):l>=c.length-1&&(u.preventDefault(),c[0]?.focus())}}},g=u=>{if(!f||!i)return;const l=u.target;p.contains(l)||d?.()},y=()=>{if(!f)return;v();let u=null;typeof n=="function"?u=n():n?u=n:c.length>0&&(u=c[0]),u&&setTimeout(()=>{u?.focus()},50),document.addEventListener("keydown",b,!0),i&&document.addEventListener("click",g,!0)},A=()=>{f=!1,document.removeEventListener("keydown",b,!0),document.removeEventListener("click",g,!0);let u=null;typeof a=="function"?u=a():a?u=a:h&&(u=h),u&&document.body.contains(u)&&setTimeout(()=>{u?.focus()},0)};return setTimeout(()=>y(),0),r.OnDispose(()=>{A()})})}function U(o={}){return{activate:()=>V({...o,active:!0}),deactivate:()=>V({...o,active:!1})}}function B({initialStatus:o="closed",openedAfter:t,closedAfter:s}){const e=r.prop(o),n=()=>{e.set("start-opening")},a=()=>{e.set("start-closing")},i=e.map(l=>l!=="closed"&&l!=="start-closing"&&l!=="closing"),d=l=>{l?n():a()},p=()=>{d(!i.value)},f=[],h=l=>{f.push(e.on(x=>{x==="closed"&&l()}))};let c=()=>{};e.on(l=>{switch(c(),l){case"start-opening":c=w.g(()=>e.set("opening"));break;case"opening":c=t(()=>e.set("opened"));break;case"start-closing":c=w.g(()=>e.set("closing"));break;case"closing":c=s(()=>e.set("closed"));break;case"closed":c=()=>{};break}}),e.onDispose(()=>{f.forEach(l=>l()),c()});const v=e.map(l=>l==="closed"),b=e.map(l=>l==="start-opening"),g=e.map(l=>l==="opening"),y=e.map(l=>l==="opened"),A=e.map(l=>l==="closing"),u=e.map(l=>l==="start-closing");return{status:e,open:n,close:a,toggle:p,setOpen:d,display:i,isClosed:v,isStartOpening:b,isOpening:g,isOpened:y,isClosing:A,isStartClosing:u,dispose:()=>e.dispose(),listenOnClosed:h}}function z({initialStatus:o="closed",duration:t,openDuration:s=t??500,closeDuration:e=t??500}={}){return B({initialStatus:o,openedAfter:n=>w.T(n,s),closedAfter:n=>w.T(n,e)})}function M(o,t){let s=!1,e=null;function n(){s||(s=!0,o.removeEventListener("transitionend",a),o.removeEventListener("animationend",i),e&&(clearTimeout(e),e=null),t())}function a(f){f.target===o&&n()}function i(f){f.target===o&&n()}const d=()=>{if(typeof o.getAnimations>"u"){e=setTimeout(n,16);return}o.addEventListener("transitionend",a),o.addEventListener("animationend",i),o.getAnimations().length===0&&(e=setTimeout(n,1e3))},p=w.g(d);return()=>{s=!0,p(),e&&(clearTimeout(e),e=null),o.removeEventListener("transitionend",a),o.removeEventListener("animationend",i)}}function F({initialStatus:o="closed",element:t}={}){let s=t;return{setElement:e=>{s=e},...B({initialStatus:o,openedAfter:e=>s==null?(e(),()=>{}):M(s,e),closedAfter:e=>s==null?(e(),()=>{}):M(s,e)})}}function R(o){if(o==null)return"";const t=[];return o.fade&&t.push("fade"),o.slide&&t.push(`slide-${o.slide}`),o.scale!=null&&t.push("scale"),t.length>0?t.join(" "):"none"}function H(o){if(o==null)return"";const t=[];return o.scale!=null&&typeof o.scale=="number"&&t.push(`--scale-factor: ${o.scale}`),o.transformOrigin!=null&&t.push(`--transform-origin: ${o.transformOrigin}`),o.duration!=null&&t.push(`--animation-duration: ${o.duration}ms`),o.easing!=null&&t.push(`--animation-easing: ${o.easing}`),t.join("; ")}function D({animation:o,status:t}){const s=r.computedOf(o,t)((n,a)=>{if(n==null)return`bc-animated-toggle bc-animated-toggle--${a}`;const i=a==="start-opening"||a==="opening"||a==="opened";let d;return"enter"in n||"exit"in n?d=i?n.enter:n.exit:d=n,`bc-animated-toggle bc-animated-toggle--${R(d)} bc-animated-toggle--${a}`}),e=r.computedOf(o,t)((n,a)=>{if(n==null)return"";const i=a==="start-opening"||a==="opening"||a==="opened";let d;return"enter"in n||"exit"in n?d=i?n.enter:n.exit:d=n,H(d)});return r.Fragment(r.attr.class(s),r.attr.style(e))}function K({initialStatus:o="closed",animation:t},s){return r.WithElement(e=>{const{setElement:n,dispose:a,...i}=F({initialStatus:o,element:e});return n(e),r.Fragment(D({status:i.status,animation:t}),r.OnDispose(a),s(i))})}function j(o){return{"~standard":{version:1,vendor:"beatui-custom",validate:s=>{const e=o.validate(s);return e.success?{value:e.data}:{issues:e.errors.map(n=>({message:n.message,path:n.path}))}},types:void 0},safeParse:s=>{const e=o.validate(s);return e.success?{success:!0,data:e.data}:{success:!1,error:{errors:e.errors.map(n=>({message:n.message,path:n.path?.map(a=>typeof a=="object"&&"key"in a?a.key.toString():a.toString())||[]}))}}}}}class k{optional(){return new N(this)}default(t){return new G(this,t)}schema(){return j(this)}}class T extends k{minLength;maxLength;pattern;customValidations=[];validate(t){if(typeof t!="string")return{success:!1,errors:[{message:"Expected string"}]};const s=[];this.minLength!==void 0&&t.length<this.minLength&&s.push({message:`Must be at least ${this.minLength} characters`}),this.maxLength!==void 0&&t.length>this.maxLength&&s.push({message:`Must be at most ${this.maxLength} characters`}),this.pattern&&!this.pattern.test(t)&&s.push({message:"Invalid format"});for(const e of this.customValidations){const n=e(t);n&&s.push({message:n})}return s.length>0?{success:!1,errors:s}:{success:!0,data:t}}min(t,s){const e=new T;return e.minLength=t,e.maxLength=this.maxLength,e.pattern=this.pattern,e.customValidations=[...this.customValidations],s&&e.customValidations.push(n=>n.length<t?s:null),e}max(t,s){const e=new T;return e.minLength=this.minLength,e.maxLength=t,e.pattern=this.pattern,e.customValidations=[...this.customValidations],s&&e.customValidations.push(n=>n.length>t?s:null),e}regex(t,s){const e=new T;return e.minLength=this.minLength,e.maxLength=this.maxLength,e.pattern=t,e.customValidations=[...this.customValidations],s&&e.customValidations.push(n=>t.test(n)?null:s),e}email(t="Please enter a valid email address"){const s=/^[^\s@]+@[^\s@]+\.[^\s@]+$/,e=new T;return e.minLength=this.minLength,e.maxLength=this.maxLength,e.pattern=this.pattern,e.customValidations=[...this.customValidations,n=>s.test(n)?null:t],e}refine(t){const s=new T;return s.minLength=this.minLength,s.maxLength=this.maxLength,s.pattern=this.pattern,s.customValidations=[...this.customValidations,t],s}}class C extends k{mustBeTrue=!1;trueMessage;validate(t){return typeof t!="boolean"?{success:!1,errors:[{message:"Expected boolean"}]}:this.mustBeTrue&&t!==!0?{success:!1,errors:[{message:this.trueMessage||"Must be true"}]}:{success:!0,data:t}}refine(t,s){const e=new C;e.mustBeTrue=this.mustBeTrue,e.trueMessage=this.trueMessage;const n=e.validate.bind(e);return e.validate=a=>{const i=n(a);return i.success?t(i.data)?i:{success:!1,errors:[{message:s}]}:i},e}literal(t,s){const e=new C;return e.mustBeTrue=!0,e.trueMessage=s,e}}class N extends k{constructor(t){super(),this.inner=t}validate(t){if(t===void 0)return{success:!0,data:void 0};const s=this.inner.validate(t);return s.success?{success:!0,data:s.data}:{success:!1,errors:s.errors}}}class G extends k{constructor(t,s){super(),this.inner=t,this.defaultValue=s}validate(t){return t===void 0?{success:!0,data:this.defaultValue}:this.inner.validate(t)}}class $ extends k{constructor(t){super(),this.shape=t}validate(t){if(typeof t!="object"||t===null||Array.isArray(t))return{success:!1,errors:[{message:"Expected object"}]};const s=t,e={},n=[];for(const[a,i]of Object.entries(this.shape)){const d=i.validate(s[a]);if(d.success)e[a]=d.data;else for(const p of d.errors)n.push({message:p.message,path:[a,...p.path||[]]})}return n.length>0?{success:!1,errors:n}:{success:!0,data:e}}refine(t,s){const e=new $(this.shape),n=e.validate.bind(e);return e.validate=a=>{const i=n(a);if(!i.success)return i;const d=t(i.data);return d?{success:!1,errors:[{message:d,path:s?.path}]}:{success:!0,data:i.data}},e}}const J=()=>new T,Q=()=>new C,X=o=>new $(o);function I(o){return r.WithBrowserCtx(t=>{const s=[],e=()=>s.forEach(a=>a());return o(({effect:a="opaque",mode:i="capturing",onClickOutside:d,onEscape:p,content:f,container:h="body"})=>{h==="body"&&(t=t.makePortal("body"));const c=F();c.listenOnClosed(e);let v=()=>{},b=()=>{};const g=E=>{E.key==="Escape"&&(p?.(),c.close())},y=()=>{d?.(),c.close()},A=E=>{v(),b(),E==="capturing"?(document.addEventListener("keydown",g),v=()=>document.removeEventListener("keydown",g),t.element.addEventListener("mousedown",y),b=()=>t.element.removeEventListener("mousedown",y)):(v=()=>{},b=()=>{})},u=r.Value.on(i,A);s.push(u),s.push(()=>{c.dispose(),v(),b()});const l=()=>{const E=new Set;for(const m of t.element.querySelectorAll(":scope > :not([data-overlay])"))m.hasAttribute("inert")?E.add(m):m.setAttribute("inert","");return s.push(()=>{for(const m of t.element.querySelectorAll(":scope > :not([data-overlay])"))E.has(m)||m.removeAttribute("inert");E.clear()}),document.activeElement?.blur?.(),r.html.div(r.WithElement(m=>c.setElement(m)),r.dataAttr.status(c.status.map(String)),r.dataAttr.overlay("true"),r.attr.class(r.computedOf(a??"opaque",i)((m,L)=>`bc-overlay bc-overlay--effect-${m} bc-overlay--mode-${L}`)),f)},x=r.render(l(),t.element,{disposeWithParent:!0,clear:!1,providers:t.providers});s.push(x),w.g(()=>c.open())},e)})}function W(o,t){const{size:s="md",dismissable:e=!0,showCloseButton:n=!0,onClose:a,overlayEffect:i="opaque",container:d="body",position:p="center"}=o;return I((f,h)=>{let c=()=>{};return t(g=>{c=h;const y=r.prop("capturing");r.Value.on(e,m=>{y.set(m?"capturing":"non-capturing")});const A=r.computedOf(g.header!=null,n)((m,L)=>m||L),u=q.sessionId("modal"),l=`${u}-header`,x=`${u}-body`,E=r.html.div(r.attr.class(r.computedOf(s,p)((m,L)=>`bc-modal bc-modal--size-${m} bc-modal--container-${d} bc-modal--position-${L}`)),r.attr.role("dialog"),r.aria.modal(!0),...g.header?[r.aria.labelledby(l)]:[],r.aria.describedby(x),r.attr.tabindex(-1),r.attr.id(u),r.dataAttr.focusTrap("true"),r.on.mousedown(m=>m.stopPropagation()),V({escapeDeactivates:!1,initialFocus:()=>{const m=document.getElementById(u);if(!m)return null;const L=m.querySelector('[aria-label="Close modal"]');if(L)return L;const S=m.querySelector('button, input, select, textarea, [tabindex]:not([tabindex="-1"])');return S||m}}),r.html.div(r.attr.class("bc-modal__content"),r.When(A,()=>r.html.div(r.attr.class("bc-modal__header"),r.html.div(r.attr.class("bc-modal__title"),...g.header?[r.attr.id(l)]:[],g.header),r.When(n,()=>r.Use(O.BeatUII18n,m=>q.CloseButton({size:"sm",label:m.$.closeModal,onClick:()=>{c(),h()}}))))),r.html.div(r.attr.class("bc-modal__body"),r.attr.id(x),g.body),g.footer&&r.html.div(r.attr.class("bc-modal__footer"),g.footer)));f({mode:y,effect:i??"opaque",container:d,content:E,onClickOutside:()=>{a?.(),h()},onEscape:()=>{a?.(),h()}})},()=>{c(),h()})})}function Y(o,t){const{confirmText:s,cancelText:e,onConfirm:n,onCancel:a,...i}=o;return r.Use(O.BeatUII18n,d=>W({showCloseButton:!1,...i},(p,f)=>{const h=()=>{n?.(),f()},c=()=>{a?.(),f()};return t(b=>{p({body:b,footer:r.Fragment(r.attr.class("bc-modal__actions"),O.Button({variant:"outline",onClick:c},r.coalesce(e,d.$.cancel)),O.Button({color:"primary",variant:"filled",onClick:h},r.coalesce(s,d.$.confirm)))})},f)}))}exports.AnimatedToggle=K;exports.AnimatedToggleClass=D;exports.BooleanValidator=C;exports.ConfirmModal=Y;exports.FocusTrap=V;exports.Modal=W;exports.ObjectValidator=$;exports.Overlay=I;exports.StringValidator=T;exports.boolean=Q;exports.createStandardSchema=j;exports.object=X;exports.string=J;exports.useAnimatedElementToggle=F;exports.useAnimatedToggle=B;exports.useFocusTrap=U;exports.useTimedToggle=z;
@@ -1,7 +1,7 @@
1
1
  import { WithElement as S, OnDispose as z, prop as R, computedOf as w, Fragment as M, attr as g, WithBrowserCtx as J, Value as U, render as Q, html as k, dataAttr as B, aria as V, on as X, When as q, Use as H, coalesce as I } from "@tempots/dom";
2
2
  import { g as $, T as _ } from "./timer-DzWb416P.js";
3
- import { s as Y, C as Z } from "./notice-Um1LwKBF.js";
4
- import { a as K, B as P } from "./translations-BUTBIDsS.js";
3
+ import { s as Y, C as Z } from "./use-form-B7A865EM.js";
4
+ import { a as K, B as P } from "./translations-DQxouiBG.js";
5
5
  const ee = [
6
6
  "a[href]",
7
7
  "button:not([disabled])",
@@ -1,4 +1,4 @@
1
- import { f as o } from "./translations-BUTBIDsS.js";
1
+ import { f as o } from "./translations-DQxouiBG.js";
2
2
  const s = {
3
3
  loadingExtended: "Laden, even geduld",
4
4
  loadingShort: "Laden...",
@@ -0,0 +1,209 @@
1
+ import { I as j, a as V, b as z, C as O, c as E } from "./translations-DQxouiBG.js";
2
+ import { Use as x, input as A, attr as n, coalesce as F, on as m, Empty as w, emitValue as v, prop as k, computedOf as C, html as p, aria as M, When as T, Fragment as B, Value as g, Unless as R, Ensure as S } from "@tempots/dom";
3
+ import { C as W } from "./use-form-B7A865EM.js";
4
+ const L = (t) => {
5
+ const l = {
6
+ name: "email",
7
+ autocomplete: "email",
8
+ ...t
9
+ }, {
10
+ value: c,
11
+ before: s,
12
+ onBlur: o,
13
+ onChange: d,
14
+ onInput: r,
15
+ placeholder: I
16
+ } = l, b = s ?? j({
17
+ icon: "line-md:email",
18
+ size: t.size,
19
+ color: "neutral"
20
+ });
21
+ return x(
22
+ V,
23
+ (f) => z({
24
+ ...t,
25
+ before: b,
26
+ input: A.email(
27
+ O(l),
28
+ n.placeholder(F(I, f.$.emailPlaceholderText)),
29
+ n.value(c),
30
+ n.class("bc-input"),
31
+ o != null ? m.blur(v(o)) : w,
32
+ d != null ? m.change(v(d)) : w,
33
+ r != null ? m.input(v(r)) : w
34
+ )
35
+ })
36
+ );
37
+ }, Q = (t) => {
38
+ const {
39
+ value: l,
40
+ onBlur: c,
41
+ onChange: s,
42
+ onInput: o,
43
+ before: d,
44
+ after: r,
45
+ hasError: I,
46
+ disabled: b,
47
+ autocomplete: f,
48
+ placeholder: _,
49
+ ...h
50
+ } = t, $ = {
51
+ name: "password",
52
+ disabled: b,
53
+ ...h
54
+ }, i = k(!0), a = C(
55
+ i,
56
+ f
57
+ )((e, u) => e ? u ?? "current-password" : "off");
58
+ return x(V, (e) => {
59
+ const u = C(
60
+ e.$.passwordPlaceholderText,
61
+ i,
62
+ _
63
+ )((y, N, U) => N ? "•••••••••••••••" : U ?? y), P = p.button(
64
+ n.type("button"),
65
+ n.class("bc-input-container__password-toggle"),
66
+ M.label(e.$.togglePasswordVisibility),
67
+ m.click(() => i.update((y) => !y)),
68
+ T(
69
+ i,
70
+ () => E({ icon: "line-md:watch" }),
71
+ () => E({ icon: "line-md:watch-off" })
72
+ )
73
+ );
74
+ return z({
75
+ before: d,
76
+ disabled: b,
77
+ hasError: I,
78
+ input: p.input(
79
+ O({
80
+ ...$,
81
+ autocomplete: a,
82
+ placeholder: u
83
+ }),
84
+ T(
85
+ i,
86
+ () => B(n.type("password")),
87
+ () => B(n.type("text"))
88
+ ),
89
+ n.class("bc-input"),
90
+ n.value(l),
91
+ c != null ? m.blur(v(c)) : w,
92
+ s != null ? m.change(v(s)) : w,
93
+ o != null ? m.input(v(o)) : w
94
+ ),
95
+ after: r != null ? B(P, r) : P
96
+ });
97
+ });
98
+ };
99
+ function q(t) {
100
+ switch (t) {
101
+ case "success":
102
+ return "material-symbols:check-circle-outline";
103
+ case "warning":
104
+ return "material-symbols:warning-outline";
105
+ case "danger":
106
+ return "material-symbols:error-outline";
107
+ case "info":
108
+ default:
109
+ return "material-symbols:info-outline";
110
+ }
111
+ }
112
+ function D(t) {
113
+ switch (t) {
114
+ case "success":
115
+ return "success";
116
+ case "warning":
117
+ return "warning";
118
+ case "danger":
119
+ return "danger";
120
+ case "info":
121
+ default:
122
+ return "info";
123
+ }
124
+ }
125
+ function G(t, l, c, s) {
126
+ const o = [
127
+ "bc-notice",
128
+ `bc-notice--${t}`,
129
+ `bc-notice--tone-${l}`
130
+ ];
131
+ return c && o.push("bc-notice--dismissible"), s && s.length > 0 && o.push(s), o.join(" ");
132
+ }
133
+ function X({
134
+ variant: t = "info",
135
+ tone: l = "subtle",
136
+ role: c,
137
+ title: s,
138
+ icon: o,
139
+ closable: d = !1,
140
+ onDismiss: r,
141
+ class: I
142
+ }, ...b) {
143
+ const f = k(!0);
144
+ return T(f, () => {
145
+ const _ = g.map(
146
+ d,
147
+ (a) => !!a || r != null
148
+ ), h = g.map(t, (a) => a ?? "info"), $ = g.map(l, (a) => a ?? "subtle"), i = C(
149
+ c,
150
+ h
151
+ )(
152
+ (a, e) => a ?? (e === "danger" ? "alert" : "status")
153
+ );
154
+ return x(
155
+ V,
156
+ (a) => p.div(
157
+ n.class(
158
+ C(
159
+ h,
160
+ $,
161
+ _,
162
+ I
163
+ )((e, u, P, y) => G(e, u, P, y))
164
+ ),
165
+ // Accessibility role mapping (always defined)
166
+ n.role(g.map(i, (e) => e)),
167
+ R(
168
+ g.map(o, (e) => e === !1),
169
+ () => p.div(
170
+ n.class("bc-notice__icon"),
171
+ E({
172
+ icon: C(
173
+ o,
174
+ h
175
+ )(
176
+ (e, u) => e === void 0 ? q(u) : String(e)
177
+ ),
178
+ size: "md",
179
+ color: g.map(h, D)
180
+ })
181
+ )
182
+ ),
183
+ p.div(
184
+ n.class("bc-notice__body"),
185
+ S(
186
+ s,
187
+ (e) => p.div(n.class("bc-notice__title"), e)
188
+ ),
189
+ p.div(n.class("bc-notice__content"), ...b)
190
+ ),
191
+ T(
192
+ _,
193
+ () => W({
194
+ size: "xs",
195
+ label: a.$.closeModal,
196
+ onClick: () => {
197
+ f.set(!1), r?.();
198
+ }
199
+ })
200
+ )
201
+ )
202
+ );
203
+ });
204
+ }
205
+ export {
206
+ L as E,
207
+ X as N,
208
+ Q as P
209
+ };
@@ -0,0 +1 @@
1
+ "use strict";const l=require("./translations-hMQlZmD4.cjs"),t=require("@tempots/dom"),C=require("./use-form-DVJXMMoN.cjs"),E=n=>{const r={name:"email",autocomplete:"email",...n},{value:c,before:s,onBlur:a,onChange:p,onInput:i,placeholder:h}=r,d=s??l.InputIcon({icon:"line-md:email",size:n.size,color:"neutral"});return t.Use(l.BeatUII18n,b=>l.InputContainer({...n,before:d,input:t.input.email(l.CommonInputAttributes(r),t.attr.placeholder(t.coalesce(h,b.$.emailPlaceholderText)),t.attr.value(c),t.attr.class("bc-input"),a!=null?t.on.blur(t.emitValue(a)):t.Empty,p!=null?t.on.change(t.emitValue(p)):t.Empty,i!=null?t.on.input(t.emitValue(i)):t.Empty)}))},_=n=>{const{value:r,onBlur:c,onChange:s,onInput:a,before:p,after:i,hasError:h,disabled:d,autocomplete:b,placeholder:I,...f}=n,y={name:"password",disabled:d,...f},u=t.prop(!0),o=t.computedOf(u,b)((e,m)=>e?m??"current-password":"off");return t.Use(l.BeatUII18n,e=>{const m=t.computedOf(e.$.passwordPlaceholderText,u,I)((g,V,v)=>V?"•••••••••••••••":v??g),w=t.html.button(t.attr.type("button"),t.attr.class("bc-input-container__password-toggle"),t.aria.label(e.$.togglePasswordVisibility),t.on.click(()=>u.update(g=>!g)),t.When(u,()=>l.Icon({icon:"line-md:watch"}),()=>l.Icon({icon:"line-md:watch-off"})));return l.InputContainer({before:p,disabled:d,hasError:h,input:t.html.input(l.CommonInputAttributes({...y,autocomplete:o,placeholder:m}),t.When(u,()=>t.Fragment(t.attr.type("password")),()=>t.Fragment(t.attr.type("text"))),t.attr.class("bc-input"),t.attr.value(r),c!=null?t.on.blur(t.emitValue(c)):t.Empty,s!=null?t.on.change(t.emitValue(s)):t.Empty,a!=null?t.on.input(t.emitValue(a)):t.Empty),after:i!=null?t.Fragment(w,i):w})})};function O(n){switch(n){case"success":return"material-symbols:check-circle-outline";case"warning":return"material-symbols:warning-outline";case"danger":return"material-symbols:error-outline";case"info":default:return"material-symbols:info-outline"}}function B(n){switch(n){case"success":return"success";case"warning":return"warning";case"danger":return"danger";case"info":default:return"info"}}function U(n,r,c,s){const a=["bc-notice",`bc-notice--${n}`,`bc-notice--tone-${r}`];return c&&a.push("bc-notice--dismissible"),s&&s.length>0&&a.push(s),a.join(" ")}function P({variant:n="info",tone:r="subtle",role:c,title:s,icon:a,closable:p=!1,onDismiss:i,class:h},...d){const b=t.prop(!0);return t.When(b,()=>{const I=t.Value.map(p,o=>!!o||i!=null),f=t.Value.map(n,o=>o??"info"),y=t.Value.map(r,o=>o??"subtle"),u=t.computedOf(c,f)((o,e)=>o??(e==="danger"?"alert":"status"));return t.Use(l.BeatUII18n,o=>t.html.div(t.attr.class(t.computedOf(f,y,I,h)((e,m,w,g)=>U(e,m,w,g))),t.attr.role(t.Value.map(u,e=>e)),t.Unless(t.Value.map(a,e=>e===!1),()=>t.html.div(t.attr.class("bc-notice__icon"),l.Icon({icon:t.computedOf(a,f)((e,m)=>e===void 0?O(m):String(e)),size:"md",color:t.Value.map(f,B)}))),t.html.div(t.attr.class("bc-notice__body"),t.Ensure(s,e=>t.html.div(t.attr.class("bc-notice__title"),e)),t.html.div(t.attr.class("bc-notice__content"),...d)),t.When(I,()=>C.CloseButton({size:"xs",label:o.$.closeModal,onClick:()=>{b.set(!1),i?.()}}))))})}exports.EmailInput=E;exports.Notice=P;exports.PasswordInput=_;
@@ -1,4 +1,4 @@
1
- import { f as r } from "./translations-BUTBIDsS.js";
1
+ import { f as r } from "./translations-DQxouiBG.js";
2
2
  const s = {
3
3
  loadingExtended: "Ładowanie, proszę czekać",
4
4
  loadingShort: "Ładowanie...",
@@ -1,4 +1,4 @@
1
- import { D as a, P as s, b as e } from "../index-CzuXAuLZ.js";
1
+ import { D as a, P as s, b as e } from "../index-DdpYvBeh.js";
2
2
  export {
3
3
  a as DEFAULT_FEATURES,
4
4
  s as ProseMirrorMarkdownInput,
@@ -1,4 +1,4 @@
1
- import { f as n } from "./translations-BUTBIDsS.js";
1
+ import { f as n } from "./translations-DQxouiBG.js";
2
2
  const s = {
3
3
  loadingExtended: "Carregando, por favor aguarde",
4
4
  loadingShort: "Carregando...",
@@ -1,4 +1,4 @@
1
- import { f as r } from "./translations-BUTBIDsS.js";
1
+ import { f as r } from "./translations-DQxouiBG.js";
2
2
  const d = {
3
3
  loadingExtended: "Загрузка, пожалуйста подождите",
4
4
  loadingShort: "Загрузка...",
@@ -362,6 +362,7 @@ function Le(e = {}) {
362
362
  }
363
363
  if (R.length > 0) {
364
364
  const i = Array.from(
365
+ // eslint-disable-next-line tempots/require-async-signal-disposal -- This is an array, not a Signal
365
366
  new Set(R.map(Q))
366
367
  ), l = await le({
367
368
  projectRoot: t,
@@ -1,5 +1,5 @@
1
1
  import { html as c, attr as n, aria as m, WithElement as v, OnDispose as A } from "@tempots/dom";
2
- import { B as x } from "./translations-BUTBIDsS.js";
2
+ import { B as x } from "./translations-DQxouiBG.js";
3
3
  const l = [
4
4
  "button:not([disabled])",
5
5
  '[role="button"]:not([aria-disabled="true"])',
@@ -1,4 +1,4 @@
1
- import { f as o } from "./translations-BUTBIDsS.js";
1
+ import { f as o } from "./translations-DQxouiBG.js";
2
2
  const d = {
3
3
  loadingExtended: "Yükleniyor, lütfen bekleyin",
4
4
  loadingShort: "Yükleniyor...",
@@ -1,4 +1,4 @@
1
- import { m as s } from "./translations-BUTBIDsS.js";
1
+ import { m as s } from "./translations-DQxouiBG.js";
2
2
  const r = {
3
3
  // Sign In
4
4
  signInTitle: "Sign In",
@@ -803,24 +803,24 @@ function Bt({
803
803
  };
804
804
  }
805
805
  const $t = /* @__PURE__ */ Object.assign({
806
- "./locales/ar.ts": () => import("./ar-aMLQTGVh.js").then((t) => t.default),
807
- "./locales/de.ts": () => import("./de-DBFOC44R.js").then((t) => t.default),
808
- "./locales/es.ts": () => import("./es-C4xOThaT.js").then((t) => t.default),
809
- "./locales/fa.ts": () => import("./fa-B7X_xydY.js").then((t) => t.default),
810
- "./locales/fr.ts": () => import("./fr-AmjzbxN_.js").then((t) => t.default),
811
- "./locales/he.ts": () => import("./he-DY-9yiOC.js").then((t) => t.default),
812
- "./locales/hi.ts": () => import("./hi-Clkyp5Fu.js").then((t) => t.default),
813
- "./locales/it.ts": () => import("./it-BC32WmGF.js").then((t) => t.default),
814
- "./locales/ja.ts": () => import("./ja-JNSZS_Hv.js").then((t) => t.default),
815
- "./locales/ko.ts": () => import("./ko-B8l0TJp0.js").then((t) => t.default),
816
- "./locales/nl.ts": () => import("./nl-BpYESHP8.js").then((t) => t.default),
817
- "./locales/pl.ts": () => import("./pl-_sWhGdrs.js").then((t) => t.default),
818
- "./locales/pt.ts": () => import("./pt-BmiQvHUz.js").then((t) => t.default),
819
- "./locales/ru.ts": () => import("./ru-DacnqexG.js").then((t) => t.default),
820
- "./locales/tr.ts": () => import("./tr-BSS5b_v6.js").then((t) => t.default),
821
- "./locales/ur.ts": () => import("./ur-C6Ky6OCl.js").then((t) => t.default),
822
- "./locales/vi.ts": () => import("./vi-Bx2gx2S0.js").then((t) => t.default),
823
- "./locales/zh.ts": () => import("./zh-eixtg-Ce.js").then((t) => t.default)
806
+ "./locales/ar.ts": () => import("./ar-BbgpGwJp.js").then((t) => t.default),
807
+ "./locales/de.ts": () => import("./de-R7lPfyZ4.js").then((t) => t.default),
808
+ "./locales/es.ts": () => import("./es-DV0Jr_BZ.js").then((t) => t.default),
809
+ "./locales/fa.ts": () => import("./fa-DXvHejs9.js").then((t) => t.default),
810
+ "./locales/fr.ts": () => import("./fr-D8FOMX0o.js").then((t) => t.default),
811
+ "./locales/he.ts": () => import("./he-B19Qsx-u.js").then((t) => t.default),
812
+ "./locales/hi.ts": () => import("./hi-DozFnE3b.js").then((t) => t.default),
813
+ "./locales/it.ts": () => import("./it-But8uzNi.js").then((t) => t.default),
814
+ "./locales/ja.ts": () => import("./ja-DkwTnFdU.js").then((t) => t.default),
815
+ "./locales/ko.ts": () => import("./ko-Cqv-IjhX.js").then((t) => t.default),
816
+ "./locales/nl.ts": () => import("./nl-YSiU3rFI.js").then((t) => t.default),
817
+ "./locales/pl.ts": () => import("./pl-DXmHc2Nh.js").then((t) => t.default),
818
+ "./locales/pt.ts": () => import("./pt-Bf3z_-26.js").then((t) => t.default),
819
+ "./locales/ru.ts": () => import("./ru-Sy00qUeG.js").then((t) => t.default),
820
+ "./locales/tr.ts": () => import("./tr-BDxG3qd6.js").then((t) => t.default),
821
+ "./locales/ur.ts": () => import("./ur-55zdT2TQ.js").then((t) => t.default),
822
+ "./locales/vi.ts": () => import("./vi-C7K7W0hM.js").then((t) => t.default),
823
+ "./locales/zh.ts": () => import("./zh-DvJBV9D8.js").then((t) => t.default)
824
824
  }), H = Bt({
825
825
  defaultLocale: T,
826
826
  defaultMessages: M,
@@ -834,17 +834,17 @@ const $t = /* @__PURE__ */ Object.assign({
834
834
  export {
835
835
  Ft as B,
836
836
  Lt as C,
837
- G as I,
837
+ Rt as I,
838
838
  st as L,
839
839
  Ot as T,
840
840
  H as a,
841
841
  It as b,
842
- Rt as c,
843
- M as d,
844
- x as e,
842
+ G as c,
843
+ x as d,
844
+ F as e,
845
845
  et as f,
846
- yt as g,
847
- F as h,
846
+ M as g,
847
+ yt as h,
848
848
  m as i,
849
849
  xt as j,
850
850
  Ct as k,
@@ -3,3 +3,4 @@ export * from './controller';
3
3
  export * from './input';
4
4
  export * from './schema';
5
5
  export * from './use-form';
6
+ export * from './utils';
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Deep merge utility for form default values.
3
+ *
4
+ * Merges default values with provided values, where provided values take precedence.
5
+ * Only merges where the provided value is undefined.
6
+ */
7
+ /**
8
+ * Deep merge defaults into a target value.
9
+ *
10
+ * - Provided values take precedence over defaults
11
+ * - Only fills in undefined values from defaults
12
+ * - Recursively merges nested objects
13
+ * - Arrays are NOT merged (provided array replaces default)
14
+ *
15
+ * @param defaults - Default values to use when target values are undefined
16
+ * @param provided - Provided values that take precedence
17
+ * @returns Merged result
18
+ *
19
+ * @example
20
+ * ```typescript
21
+ * const defaults = { name: 'John', settings: { theme: 'dark', lang: 'en' } }
22
+ * const provided = { settings: { theme: 'light' } }
23
+ * const result = deepMergeDefaults(defaults, provided)
24
+ * // { name: 'John', settings: { theme: 'light', lang: 'en' } }
25
+ * ```
26
+ */
27
+ export declare function deepMergeDefaults<T>(defaults: unknown, provided: T | undefined | null): T;
@@ -0,0 +1 @@
1
+ export * from './deep-merge';
@@ -11,8 +11,9 @@ export declare function JSONSchemaGenericControl<T>({ ctx, controller, }: {
11
11
  /**
12
12
  * Main entry point for JSON Schema controls
13
13
  */
14
- export declare function JSONSchemaControl<T>({ schema, controller, ajv, }: {
14
+ export declare function JSONSchemaControl<T>({ schema, controller, ajv, widgetRegistry, }: {
15
15
  schema: JSONSchemaDefinition;
16
16
  controller: Controller<T>;
17
17
  ajv?: import('ajv').default;
18
+ widgetRegistry?: import('../widgets/widget-customization').WidgetRegistry;
18
19
  }): Renderable;
@@ -1,5 +1,7 @@
1
1
  import type { JSONSchema } from '../schema-context';
2
- import type { InputWrapperOptions } from '../../form';
2
+ import type { InputWrapperOptions, Controller } from '../../form';
3
+ import type { Renderable } from '@tempots/dom';
4
+ import type { ResolvedWidget } from '../widgets/utils';
3
5
  /**
4
6
  * Convert schema definition to input wrapper options
5
7
  */
@@ -22,3 +24,17 @@ export declare function shouldHideWriteOnly(ctx: import('../schema-context').Sch
22
24
  * Determine if a control should be disabled based on readOnly or deprecated status
23
25
  */
24
26
  export declare function shouldDisableControl(ctx: import('../schema-context').SchemaContext): boolean;
27
+ /**
28
+ * Try to resolve and render a custom widget following the precedence order:
29
+ * 1. Explicit x:ui widget in custom registry (highest priority)
30
+ * 2. Explicit x:ui widget in global registry
31
+ * 3. Matcher-based custom widgets (by priority)
32
+ * 4. Matcher-based global widgets (lowest priority)
33
+ *
34
+ * Returns the rendered widget if found, or null if no custom widget matches
35
+ */
36
+ export declare function tryResolveCustomWidget({ ctx, controller, resolved, }: {
37
+ ctx: import('../schema-context').SchemaContext;
38
+ controller: Controller<unknown>;
39
+ resolved: ResolvedWidget | null | undefined;
40
+ }): Renderable | null;
@@ -3,3 +3,5 @@ export * from './schema-context';
3
3
  export * from './controls';
4
4
  export * from './json-schema-form';
5
5
  export * from './validator';
6
+ export * from './schema-defaults';
7
+ export { type CustomWidgets, type CustomWidgetRegistration, type WidgetFactory, forXUI, forFormat, forTypeAndFormat, } from './widgets/widget-customization';
@@ -1,6 +1,7 @@
1
1
  import { type SchemaObject } from 'ajv';
2
2
  import { Value, Renderable } from '@tempots/dom';
3
3
  import { Controller, ControllerValidation } from '../form';
4
+ import { type CustomWidgets } from './widgets/widget-customization';
4
5
  /**
5
6
  * External reference resolver function type.
6
7
  * Called when the form encounters external $ref URIs that need to be resolved.
@@ -66,13 +67,34 @@ export interface JSONSchemaFormExternalOptions {
66
67
  export interface JSONSchemaFormProps<T> extends JSONSchemaFormExternalOptions {
67
68
  /** The root JSON Schema to render as a form */
68
69
  schema: SchemaObject;
69
- /** Reactive value containing the form data */
70
- initialValue: Value<T>;
70
+ /**
71
+ * Initial value for the form data.
72
+ *
73
+ * When omitted, the form will be auto-populated from schema defaults:
74
+ * - `default` property values (highest priority)
75
+ * - First item from `examples` array (fallback)
76
+ * - Empty object for object schemas (last resort)
77
+ *
78
+ * When provided, schema defaults are merged with the provided value
79
+ * (provided values take precedence) unless `applySchemaDefaults` is false.
80
+ */
81
+ initialValue?: Value<T>;
71
82
  /** Validation behavior */
72
83
  validationMode?: 'onSubmit' | 'eager' | 'onTouched';
73
84
  validateDebounceMs?: number;
85
+ /** Custom widgets for form-scoped widget overrides */
86
+ customWidgets?: CustomWidgets;
87
+ /**
88
+ * Whether to automatically populate form values from schema defaults.
89
+ * When true, extracts `default` values (with `examples[0]` as fallback)
90
+ * from the schema and merges them with the provided initialValue.
91
+ * Provided values take precedence over schema defaults.
92
+ *
93
+ * @default true
94
+ */
95
+ applySchemaDefaults?: boolean;
74
96
  }
75
- export declare function JSONSchemaForm<T>({ schema, initialValue, externalSchemas, refResolver, sanitizeAdditional, validationMode, validateDebounceMs, }: JSONSchemaFormProps<T>, fn: ({ Form, controller, setStatus, }: {
97
+ export declare function JSONSchemaForm<T>({ schema, initialValue, externalSchemas, refResolver, sanitizeAdditional, validationMode, validateDebounceMs, customWidgets, applySchemaDefaults, }: JSONSchemaFormProps<T>, fn: ({ Form, controller, setStatus, }: {
76
98
  Form: Renderable;
77
99
  controller: Controller<T>;
78
100
  setStatus: (result: ControllerValidation) => void;
@@ -1,5 +1,6 @@
1
1
  import type Ajv from 'ajv';
2
2
  import type { JSONSchemaDefinition, JSONSchemaType, SchemaConflict, NotViolation } from './schema-types';
3
+ import type { WidgetRegistry } from './widgets/widget-customization';
3
4
  export type { JSONSchema, JSONSchemaDefinition, JSONSchemaType, SchemaConflict, AllOfMergeResult, NotViolation, } from './schema-types';
4
5
  export { mergeAllOf } from './schema-merge';
5
6
  export { evaluateNotViolation, composeEffectiveObjectSchema, evaluateIfThenElseOverlay, getEvaluatedProperties, } from './schema-conditionals';
@@ -13,6 +14,7 @@ export type SchemaContextOptions = {
13
14
  suppressLabel?: boolean;
14
15
  schemaConflicts?: readonly SchemaConflict[];
15
16
  notViolations?: readonly NotViolation[];
17
+ widgetRegistry?: WidgetRegistry;
16
18
  };
17
19
  export declare class SchemaContext {
18
20
  readonly schema: JSONSchemaDefinition;
@@ -24,6 +26,7 @@ export declare class SchemaContext {
24
26
  readonly suppressLabel: boolean;
25
27
  readonly schemaConflicts: readonly SchemaConflict[];
26
28
  readonly notViolations: readonly NotViolation[];
29
+ readonly widgetRegistry: WidgetRegistry | undefined;
27
30
  constructor(options: SchemaContextOptions);
28
31
  readonly with: (options: Partial<SchemaContextOptions>) => SchemaContext;
29
32
  readonly append: (segment: PropertyKey) => SchemaContext;
@@ -0,0 +1,39 @@
1
+ /**
2
+ * JSON Schema Default Value Extraction
3
+ *
4
+ * Utilities to recursively extract default values from JSON Schema definitions.
5
+ * Priority order:
6
+ * 1. Explicit `default` property (highest)
7
+ * 2. First item of `examples` array
8
+ * 3. `const` value
9
+ * 4. First `enum` value
10
+ * 5. Smart type-based defaults (computed)
11
+ */
12
+ import type { JSONSchemaDefinition } from './schema-types';
13
+ /**
14
+ * Extract default values from a JSON Schema definition.
15
+ *
16
+ * Recursively walks the schema and builds an object containing all defined defaults.
17
+ * For object types, extracts defaults only for required properties.
18
+ * For nullable types (union with null), returns null.
19
+ * For arrays with minItems, generates the minimum required items.
20
+ *
21
+ * @param schema - The JSON Schema to extract defaults from
22
+ * @returns The extracted default value, or undefined if none found
23
+ *
24
+ * @example
25
+ * ```typescript
26
+ * const schema = {
27
+ * type: 'object',
28
+ * properties: {
29
+ * name: { type: 'string' },
30
+ * age: { type: 'integer', minimum: 0, maximum: 120 },
31
+ * active: { type: 'boolean' }
32
+ * },
33
+ * required: ['name', 'age']
34
+ * }
35
+ * const defaults = extractSchemaDefaults(schema)
36
+ * // { name: '', age: 60 } // only required props, smart defaults
37
+ * ```
38
+ */
39
+ export declare function extractSchemaDefaults(schema: JSONSchemaDefinition): unknown;