@tslite/react 1.4.0 → 1.5.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.
package/dist/full.d.cts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { Extension } from '@codemirror/state';
2
- import { F as FieldLayout, S as SegmenterOption, U as UseExpressionFieldOptions } from './useExpressionField-BfIHCVtU.cjs';
2
+ import { F as FieldLayout, S as SegmenterOption, U as UseExpressionFieldOptions } from './useExpressionField-Dsh6-SIB.cjs';
3
3
  export { searchEditing } from '@tslite/codemirror/search';
4
4
  export { tsliteTokenStyles } from '@tslite/editor';
5
5
  import 'react';
package/dist/full.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { Extension } from '@codemirror/state';
2
- import { F as FieldLayout, S as SegmenterOption, U as UseExpressionFieldOptions } from './useExpressionField-BfIHCVtU.js';
2
+ import { F as FieldLayout, S as SegmenterOption, U as UseExpressionFieldOptions } from './useExpressionField-Dsh6-SIB.js';
3
3
  export { searchEditing } from '@tslite/codemirror/search';
4
4
  export { tsliteTokenStyles } from '@tslite/editor';
5
5
  import 'react';
package/dist/index.cjs CHANGED
@@ -1 +1 @@
1
- 'use strict';var n=require('react'),state=require('@codemirror/state'),view=require('@codemirror/view'),commands=require('@codemirror/commands'),autocomplete=require('@codemirror/autocomplete'),codemirror=require('@tslite/codemirror'),editor=require('@tslite/editor'),languageService=require('@tslite/language-service'),jsxRuntime=require('react/jsx-runtime');function _interopNamespace(e){if(e&&e.__esModule)return e;var n=Object.create(null);if(e){Object.keys(e).forEach(function(k){if(k!=='default'){var d=Object.getOwnPropertyDescriptor(e,k);Object.defineProperty(n,k,d.get?d:{enumerable:true,get:function(){return e[k]}});}})}n.default=e;return Object.freeze(n)}var n__namespace=/*#__PURE__*/_interopNamespace(n);var ae={mustache:languageService.mustache,whole:languageService.whole},ce=t=>typeof t=="function"?t:ae[t];function I(t){let{world:o,service:c,segmenter:i="mustache",mode:s="expression",type:l,optional:d,profile:p,guards:a}=t,u=n__namespace.useMemo(()=>{if(c||!o)return null;let x={world:o,...l!==void 0?{type:l}:{},...d?{optional:d}:{}},S={...p?{profile:p}:{},...a?{guards:a}:{}};return s==="template"?editor.createHostService({...x,...S,mode:s}):editor.createHostService({...x,...S,segmenter:ce(i),mode:s})},[c,o,i,s,l,d,p,a]);return n__namespace.useEffect(()=>u?()=>u.dispose():void 0,[u]),c??u}var we=view.EditorView.theme({".cm-scroller":{overflowX:"auto",overflowY:"hidden"},".cm-content":{padding:"6px 8px"},".cm-line":{padding:"0"},"&.cm-focused":{outline:"none"}}),z=6,Oe=view.EditorView.theme({".cm-scroller":{overflowY:"auto"},".cm-content":{padding:`${z}px 8px`},".cm-line":{padding:"0"},"&.cm-focused":{outline:"none"}}),Ce=(t,o)=>`${o*t.defaultLineHeight+2*z}px`,Le=view.EditorView.theme({"&":{height:"100%"},".cm-scroller":{overflowY:"auto"},".cm-content":{padding:"8px"},"&.cm-focused":{outline:"none"}}),$=t=>t.replace(/\r?\n/g," "),Te=(t,o)=>{if(t===false)return [];let c=o==="block"?{}:{tab:false,indentOnInput:false};return codemirror.codeEditing(typeof t=="object"?{...c,...t}:c)},ke=t=>t?codemirror.gutters(typeof t=="object"?t:{}):[];function V(t){let{value:o,onChange:c,onCommit:i,layout:s="inline",maxLines:l,wrap:d=s!=="inline",editing:p,gutters:a,readOnly:u=false,placeholder:x,features:S,tooltipParent:T,onTokenAction:_,isTokenActionable:U,definition:k,extensions:ee}=t,h=I(t),H=n__namespace.useRef(null),v=n__namespace.useRef(null),[Y,G]=n__namespace.useState(null),[te,oe]=n__namespace.useState(false),R=n__namespace.useRef({value:o,onChange:c,onCommit:i,onTokenAction:_,isTokenActionable:U});R.current={value:o,onChange:c,onCommit:i,onTokenAction:_,isTokenActionable:U};let P=n__namespace.useCallback(e=>{let{value:r,onCommit:y}=R.current;if(!y)return;let g=e.state.doc.toString();g!==r&&y(g);},[]),f=n__namespace.useRef({service:new state.Compartment,layout:new state.Compartment,editable:new state.Compartment,actions:new state.Compartment}).current,M=n__namespace.useCallback(e=>e?codemirror.languageService(e,{theme:editor.tsliteTokenStyles,...T!==null?{tooltipParent:T??(typeof document<"u"?document.body:void 0)}:{},...S}):[],[S,T]),N=n__namespace.useCallback(e=>autocomplete.completionStatus(e.state)==="active"?autocomplete.acceptCompletion(e)||true:(P(e),true),[P]),A=n__namespace.useCallback((e,r,y,g)=>[e==="block"?[...r?[view.EditorView.lineWrapping]:[],Le]:e==="grow"?[...r?[view.EditorView.lineWrapping]:[],Oe,state.Prec.highest(view.keymap.of([{key:"Enter",run:N},{key:"Shift-Enter",run:commands.insertNewlineAndIndent}]))]:[codemirror.singleLine,we],Te(y,e),ke(g)],[N]),D=n__namespace.useCallback(()=>{let e=[];return R.current.onTokenAction&&e.push(codemirror.tokenAction({actionable:r=>R.current.isTokenActionable?.(r)??true,onAction:r=>R.current.onTokenAction?.(r)})),k&&h?.definitionAt&&e.push(codemirror.gotoDefinition(k)),e},[k,h]);n__namespace.useEffect(()=>{if(!H.current)return;let e=new view.EditorView({parent:H.current,state:state.EditorState.create({doc:s==="inline"?$(o):o,extensions:[commands.history(),f.service.of(M(h)),f.layout.of(A(s,d,p,a)),f.editable.of(view.EditorView.editable.of(!u)),f.actions.of(D()),...x?[view.placeholder(x)]:[],view.keymap.of([...commands.historyKeymap,...commands.defaultKeymap]),view.EditorView.updateListener.of(r=>{if(r.focusChanged&&oe(r.view.hasFocus),!r.docChanged)return;r.transactions.some(g=>g.annotation(codemirror.externalChange))||R.current.onChange?.(r.state.doc.toString());}),view.EditorView.contentAttributes.of({"aria-label":x??"expression"}),view.EditorView.domEventHandlers({blur:(r,y)=>{let g=r.relatedTarget;return g instanceof Element&&(y.dom.contains(g)||g.closest(".cm-tooltip"))||P(y),false}}),...ee??[]]})});return v.current=e,G(e),()=>{e.destroy(),v.current=null,G(null);}},[]),n__namespace.useEffect(()=>{v.current?.dispatch({effects:f.service.reconfigure(M(h))});},[h,M,f]),n__namespace.useEffect(()=>{v.current?.dispatch({effects:f.layout.reconfigure(A(s,d,p,a))});},[s,d,p,a,A,f]),n__namespace.useEffect(()=>{v.current?.dispatch({effects:f.editable.reconfigure(view.EditorView.editable.of(!u))});},[u,f]),n__namespace.useEffect(()=>{let e=v.current;e&&(e.scrollDOM.style.maxHeight=s==="grow"&&l!==void 0&&l>0?Ce(e,l):"");},[s,l,Y]),n__namespace.useEffect(()=>{v.current?.dispatch({effects:f.actions.reconfigure(D())});},[D,f]),n__namespace.useEffect(()=>{let e=v.current;if(!e)return;let r=s==="inline"?$(o):o;if(r===e.state.doc.toString())return;let{anchor:y,head:g}=e.state.selection.main,K=re=>Math.min(re,r.length);e.dispatch({changes:{from:0,to:e.state.doc.length,insert:r},selection:{anchor:K(y),head:K(g)},annotations:codemirror.externalChange.of(true)});},[o,s]);let ne=n__namespace.useCallback(()=>v.current?.focus(),[]);return {ref:H,view:Y,focused:te,service:h,focus:ne}}var X=n__namespace.createContext(null);function q(){let t=n__namespace.useContext(X);if(!t)throw new Error("useFieldContext must be used inside <ExpressionField.Root>");return t}var He=["value","onChange","onCommit","layout","maxLines","wrap","editing","gutters","readOnly","placeholder","features","tooltipParent","onTokenAction","isTokenActionable","definition","extensions","world","service","segmenter","mode","type","optional","profile","guards"];var J=n__namespace.forwardRef(function(o,c){let{children:i,...s}=o,l={},d={};for(let[a,u]of Object.entries(s))(He.includes(a)?l:d)[a]=u;let p=V(l);return jsxRuntime.jsx(X.Provider,{value:p,children:jsxRuntime.jsx("div",{ref:c,...d,children:typeof i=="function"?i(p):i})})}),Q=n__namespace.forwardRef(function(o,c){let i=q();return jsxRuntime.jsx("div",{ref:i.ref,...o})}),Z=n__namespace.forwardRef(function({children:o,...c},i){return jsxRuntime.jsx("button",{ref:i,type:"button",...c,children:o})}),F={Root:J,Editor:Q,ExpandTrigger:Z};var E={fg:"var(--foreground, #cccccc)",mutedFg:"var(--muted-foreground, #8b8b8b)",border:"var(--border, #2b2b2b)",ring:"var(--ring, #0078d4)",input:"var(--input, transparent)",destructive:"var(--destructive, #f14c4c)",font:"var(--font-mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace)"},Pe=["--foreground","--muted-foreground","--border","--ring","--input","--destructive","--font-mono","--muted","--popover","--popover-foreground","--primary","--primary-foreground","--secondary","--accent"];var Me=jsxRuntime.jsx("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",children:jsxRuntime.jsx("path",{d:"M15 3h6v6M9 21H3v-6M21 3l-7 7M3 21l7-7"})});function Ae({invalid:t,className:o,style:c,onExpand:i,expandIcon:s,multiline:l,layout:d,...p}){let a=d??(l?"block":"inline");return jsxRuntime.jsx(F.Root,{...p,layout:a,className:o,children:u=>jsxRuntime.jsxs("div",{style:{position:"relative",border:`1px solid ${t?E.destructive:u.focused?E.ring:E.border}`,borderRadius:"6px",backgroundColor:E.input,color:E.fg,fontFamily:E.font,fontSize:"13px",overflow:"hidden",...a==="block"?{height:"100%",display:"flex",flexDirection:"column"}:{},...c},children:[jsxRuntime.jsx(F.Editor,{style:a==="block"?{flex:1,minHeight:0}:a==="grow"?{paddingRight:i?"28px":void 0}:{paddingRight:i?"24px":void 0}}),i&&jsxRuntime.jsx(F.ExpandTrigger,{onClick:i,"aria-label":"Expandir",title:"Expandir",onMouseEnter:x=>x.currentTarget.style.opacity="1",onMouseLeave:x=>x.currentTarget.style.opacity="0.55",style:{position:"absolute",top:a==="inline"?"50%":"6px",right:"4px",transform:a==="inline"?"translateY(-50%)":void 0,display:"flex",alignItems:"center",justifyContent:"center",width:"20px",height:"20px",padding:0,lineHeight:0,border:"none",borderRadius:"4px",background:E.input,color:E.mutedFg,cursor:"pointer",opacity:.55},children:s??Me})]})})}var Ie="1.4.0";exports.CSS_VARS=Pe;exports.ExpressionField=F;exports.ExpressionFieldEditor=Q;exports.ExpressionFieldExpandTrigger=Z;exports.ExpressionFieldRoot=J;exports.ExpressionInput=Ae;exports.V=E;exports.useExpressionField=V;exports.useFieldContext=q;exports.useLanguageService=I;exports.version=Ie;
1
+ 'use strict';var n=require('react'),state=require('@codemirror/state'),view=require('@codemirror/view'),commands=require('@codemirror/commands'),autocomplete=require('@codemirror/autocomplete'),codemirror=require('@tslite/codemirror'),editor=require('@tslite/editor'),languageService=require('@tslite/language-service'),jsxRuntime=require('react/jsx-runtime');function _interopNamespace(e){if(e&&e.__esModule)return e;var n=Object.create(null);if(e){Object.keys(e).forEach(function(k){if(k!=='default'){var d=Object.getOwnPropertyDescriptor(e,k);Object.defineProperty(n,k,d.get?d:{enumerable:true,get:function(){return e[k]}});}})}n.default=e;return Object.freeze(n)}var n__namespace=/*#__PURE__*/_interopNamespace(n);var xe={mustache:languageService.mustache,whole:languageService.whole},ye=t=>typeof t=="function"?t:xe[t];function N(t){let{world:o,service:s,segmenter:a="mustache",mode:m="expression",type:i,optional:d,profile:u,guards:c}=t,f=n__namespace.useMemo(()=>{if(s||!o)return null;let y={world:o,...i!==void 0?{type:i}:{},...d?{optional:d}:{}},R={...u?{profile:u}:{},...c?{guards:c}:{}};return m==="template"?editor.createHostService({...y,...R,mode:m}):editor.createHostService({...y,...R,segmenter:ye(a),mode:m})},[s,o,a,m,i,d,u,c]);return n__namespace.useEffect(()=>f?()=>f.dispose():void 0,[f]),s??f}var Pe=view.EditorView.theme({".cm-scroller":{overflowX:"auto",overflowY:"hidden"},".cm-content":{padding:"6px 8px"},".cm-line":{padding:"0"},"&.cm-focused":{outline:"none"}}),ne=6,Me=view.EditorView.theme({".cm-scroller":{overflowY:"auto"},".cm-content":{padding:`${ne}px 8px`},".cm-line":{padding:"0"},"&.cm-focused":{outline:"none"}}),Ae=(t,o)=>`${o*t.defaultLineHeight+2*ne}px`,De=view.EditorView.theme({"&":{height:"100%"},".cm-scroller":{overflowY:"auto"},".cm-content":{padding:"8px"},"&.cm-focused":{outline:"none"}}),Ie=t=>t.replace(/\r?\n/g," "),S=(t,o)=>o==="inline"?Ie(t):t,Ve=(t,o)=>{if(t===false)return [];let s=o==="block"?{}:{tab:false,indentOnInput:false};return codemirror.codeEditing(typeof t=="object"?{...s,...t}:s)},_e=t=>t?codemirror.gutters(typeof t=="object"?t:{}):[];function B(t){let{value:o,onChange:s,onCommit:a,onFinish:m,layout:i="inline",maxLines:d,wrap:u=i!=="inline",editing:c,gutters:f,readOnly:y=false,placeholder:R,features:W,tooltipParent:A,onTokenAction:$,isTokenActionable:z,definition:D,extensions:le}=t,F=N(t),I=n__namespace.useRef(null),v=n__namespace.useRef(null),[X,q]=n__namespace.useState(null),[de,pe]=n__namespace.useState(false),h=n__namespace.useRef({value:o,layout:i,onChange:s,onCommit:a,onFinish:m,onTokenAction:$,isTokenActionable:z});h.current={value:o,layout:i,onChange:s,onCommit:a,onFinish:m,onTokenAction:$,isTokenActionable:z};let O=n__namespace.useCallback(e=>{let{value:r,layout:l}=h.current;return e.state.doc.toString()!==S(r,l)},[]),V=n__namespace.useCallback((e,r)=>{let l=O(e);l&&h.current.onCommit?.(e.state.doc.toString()),h.current.onFinish?.({via:r,dirty:l});},[O]),_=n__namespace.useCallback(e=>{let{onFinish:r,value:l,layout:p}=h.current;if(!r||autocomplete.completionStatus(e.state)==="active")return false;let L=O(e);if(L){let T=S(l,p);e.dispatch({changes:{from:0,to:e.state.doc.length,insert:T},selection:{anchor:T.length},annotations:codemirror.externalChange.of(true)});}return r({via:"escape",dirty:L}),true},[O]),g=n__namespace.useRef({service:new state.Compartment,layout:new state.Compartment,editable:new state.Compartment,actions:new state.Compartment}).current,U=n__namespace.useCallback(e=>e?codemirror.languageService(e,{theme:editor.tsliteTokenStyles,...A!==null?{tooltipParent:A??(typeof document<"u"?document.body:void 0)}:{},...W}):[],[W,A]),J=n__namespace.useCallback(e=>autocomplete.completionStatus(e.state)==="active"?autocomplete.acceptCompletion(e)||true:(V(e,"enter"),true),[V]),Y=n__namespace.useCallback((e,r,l,p)=>[e==="block"?[...r?[view.EditorView.lineWrapping]:[],De]:e==="grow"?[...r?[view.EditorView.lineWrapping]:[],Me,state.Prec.highest(view.keymap.of([{key:"Enter",run:J},{key:"Shift-Enter",run:commands.insertNewlineAndIndent},{key:"Escape",run:_}]))]:[codemirror.singleLine,Pe,state.Prec.highest(view.keymap.of([{key:"Escape",run:_}]))],Ve(l,e),_e(p)],[J,_]),G=n__namespace.useCallback(()=>{let e=[];return h.current.onTokenAction&&e.push(codemirror.tokenAction({actionable:r=>h.current.isTokenActionable?.(r)??true,onAction:r=>h.current.onTokenAction?.(r)})),D&&F?.definitionAt&&e.push(codemirror.gotoDefinition(D)),e},[D,F]);n__namespace.useEffect(()=>{if(!I.current)return;let e=new view.EditorView({parent:I.current,state:state.EditorState.create({doc:S(o,i),extensions:[commands.history(),g.service.of(U(F)),g.layout.of(Y(i,u,c,f)),g.editable.of(view.EditorView.editable.of(!y)),g.actions.of(G()),...R?[view.placeholder(R)]:[],view.keymap.of([...commands.historyKeymap,...commands.defaultKeymap]),view.EditorView.updateListener.of(r=>{if(r.focusChanged&&pe(r.view.hasFocus),!r.docChanged)return;r.transactions.some(p=>p.annotation(codemirror.externalChange))||h.current.onChange?.(r.state.doc.toString());}),view.EditorView.contentAttributes.of({"aria-label":R??"expression"}),view.EditorView.domEventHandlers({blur:(r,l)=>{let p=r.relatedTarget;return p instanceof Element&&(l.dom.contains(p)||p.closest(".cm-tooltip"))||V(l,"blur"),false}}),...le??[]]})});return v.current=e,q(e),()=>{e.destroy(),v.current=null,q(null);}},[]),n__namespace.useEffect(()=>{v.current?.dispatch({effects:g.service.reconfigure(U(F))});},[F,U,g]),n__namespace.useEffect(()=>{v.current?.dispatch({effects:g.layout.reconfigure(Y(i,u,c,f))});},[i,u,c,f,Y,g]),n__namespace.useEffect(()=>{v.current?.dispatch({effects:g.editable.reconfigure(view.EditorView.editable.of(!y))});},[y,g]),n__namespace.useEffect(()=>{let e=v.current;e&&(e.scrollDOM.style.maxHeight=i==="grow"&&d!==void 0&&d>0?Ae(e,d):"");},[i,d,X]),n__namespace.useEffect(()=>{v.current?.dispatch({effects:g.actions.reconfigure(G())});},[G,g]);let Q=n__namespace.useRef({value:o,layout:i});n__namespace.useEffect(()=>{let e=v.current;if(!e)return;let r=Q.current;Q.current={value:o,layout:i};let l=e.state.doc.toString(),p=o!==r.value||l===S(o,r.layout)?S(o,i):S(l,i);if(p===l)return;let{anchor:L,head:T}=e.state.selection.main,Z=fe=>Math.min(fe,p.length);e.dispatch({changes:{from:0,to:e.state.doc.length,insert:p},selection:{anchor:Z(L),head:Z(T)},annotations:codemirror.externalChange.of(true)});},[o,i]);let ue=n__namespace.useCallback(()=>v.current?.focus(),[]);return {ref:I,view:X,focused:de,service:F,focus:ue}}var w=class extends Error{constructor(o,s){super(s),this.name="ExpressionFieldError",this.code=o;}};var re=n__namespace.createContext(null);function ie(){let t=n__namespace.useContext(re);if(!t)throw new w("outside-root","useFieldContext must be used inside <ExpressionField.Root>");return t}var Ue=["value","onChange","onCommit","onFinish","layout","maxLines","wrap","editing","gutters","readOnly","placeholder","features","tooltipParent","onTokenAction","isTokenActionable","definition","extensions","world","service","segmenter","mode","type","optional","profile","guards"];var se=n__namespace.forwardRef(function(o,s){let{children:a,...m}=o,i={},d={};for(let[c,f]of Object.entries(m))(Ue.includes(c)?i:d)[c]=f;let u=B(i);return jsxRuntime.jsx(re.Provider,{value:u,children:jsxRuntime.jsx("div",{ref:s,...d,children:typeof a=="function"?a(u):a})})}),ae=n__namespace.forwardRef(function(o,s){let a=ie();return jsxRuntime.jsx("div",{ref:a.ref,...o})}),ce=n__namespace.forwardRef(function({children:o,...s},a){return jsxRuntime.jsx("button",{ref:a,type:"button",...s,children:o})}),C={Root:se,Editor:ae,ExpandTrigger:ce};var E={fg:"var(--foreground, #cccccc)",mutedFg:"var(--muted-foreground, #8b8b8b)",border:"var(--border, #2b2b2b)",ring:"var(--ring, #0078d4)",input:"var(--input, transparent)",destructive:"var(--destructive, #f14c4c)",font:"var(--font-mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace)"},Ye=["--foreground","--muted-foreground","--border","--ring","--input","--destructive","--font-mono","--muted","--popover","--popover-foreground","--primary","--primary-foreground","--secondary","--accent"];var Ge=jsxRuntime.jsx("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",children:jsxRuntime.jsx("path",{d:"M15 3h6v6M9 21H3v-6M21 3l-7 7M3 21l7-7"})});function Ne({invalid:t,className:o,style:s,onExpand:a,expandIcon:m,multiline:i,layout:d,...u}){let c=d??(i?"block":"inline");return jsxRuntime.jsx(C.Root,{...u,layout:c,className:o,children:f=>jsxRuntime.jsxs("div",{style:{position:"relative",border:`1px solid ${t?E.destructive:f.focused?E.ring:E.border}`,borderRadius:"6px",backgroundColor:E.input,color:E.fg,fontFamily:E.font,fontSize:"13px",overflow:"hidden",...c==="block"?{height:"100%",display:"flex",flexDirection:"column"}:{},...s},children:[jsxRuntime.jsx(C.Editor,{style:c==="block"?{flex:1,minHeight:0}:c==="grow"?{paddingRight:a?"28px":void 0}:{paddingRight:a?"24px":void 0}}),a&&jsxRuntime.jsx(C.ExpandTrigger,{onClick:a,"aria-label":"Expandir",title:"Expandir",onMouseEnter:y=>y.currentTarget.style.opacity="1",onMouseLeave:y=>y.currentTarget.style.opacity="0.55",style:{position:"absolute",top:c==="inline"?"50%":"6px",right:"4px",transform:c==="inline"?"translateY(-50%)":void 0,display:"flex",alignItems:"center",justifyContent:"center",width:"20px",height:"20px",padding:0,lineHeight:0,border:"none",borderRadius:"4px",background:E.input,color:E.mutedFg,cursor:"pointer",opacity:.55},children:m??Ge})]})})}var je="1.5.0";exports.CSS_VARS=Ye;exports.ExpressionField=C;exports.ExpressionFieldEditor=ae;exports.ExpressionFieldError=w;exports.ExpressionFieldExpandTrigger=ce;exports.ExpressionFieldRoot=se;exports.ExpressionInput=Ne;exports.V=E;exports.useExpressionField=B;exports.useFieldContext=ie;exports.useLanguageService=N;exports.version=je;
package/dist/index.d.cts CHANGED
@@ -1,6 +1,6 @@
1
1
  import * as React from 'react';
2
- import { U as UseExpressionFieldOptions, E as ExpressionFieldHandle } from './useExpressionField-BfIHCVtU.cjs';
3
- export { F as FieldLayout, L as LanguageServiceOptions, S as SegmenterOption, u as useExpressionField, a as useLanguageService } from './useExpressionField-BfIHCVtU.cjs';
2
+ import { U as UseExpressionFieldOptions, E as ExpressionFieldHandle } from './useExpressionField-Dsh6-SIB.cjs';
3
+ export { a as FieldFinish, F as FieldLayout, L as LanguageServiceOptions, S as SegmenterOption, u as useExpressionField, b as useLanguageService } from './useExpressionField-Dsh6-SIB.cjs';
4
4
  export { TokenActionTarget } from '@tslite/codemirror';
5
5
  import '@codemirror/state';
6
6
  import '@codemirror/view';
@@ -79,6 +79,16 @@ declare const ExpressionField: {
79
79
  ExpandTrigger: React.ForwardRefExoticComponent<ExpandTriggerProps & React.RefAttributes<HTMLButtonElement>>;
80
80
  };
81
81
 
82
+ /** O motivo de uma recusa. */
83
+ type ExpressionFieldErrorCode =
84
+ /** O `useFieldContext` foi chamado fora de uma `<ExpressionField.Root>`. */
85
+ "outside-root";
86
+ /** O uso errado das peças do campo. É erro de quem monta a tela, e não do autor. */
87
+ declare class ExpressionFieldError extends Error {
88
+ readonly code: ExpressionFieldErrorCode;
89
+ constructor(code: ExpressionFieldErrorCode, message: string);
90
+ }
91
+
82
92
  /** As cores de chrome. Exportadas para o consumidor reusar no que ele desenhar. */
83
93
  declare const V: {
84
94
  readonly fg: "var(--foreground, #cccccc)";
@@ -93,6 +103,6 @@ declare const V: {
93
103
  declare const CSS_VARS: readonly ["--foreground", "--muted-foreground", "--border", "--ring", "--input", "--destructive", "--font-mono", "--muted", "--popover", "--popover-foreground", "--primary", "--primary-foreground", "--secondary", "--accent"];
94
104
 
95
105
  /** A versão deste package, a do módulo de fato carregado. */
96
- declare const version = "1.4.0";
106
+ declare const version = "1.5.0";
97
107
 
98
- export { CSS_VARS, ExpressionField, Editor as ExpressionFieldEditor, type EditorProps as ExpressionFieldEditorProps, ExpandTrigger as ExpressionFieldExpandTrigger, type ExpandTriggerProps as ExpressionFieldExpandTriggerProps, ExpressionFieldHandle, Root as ExpressionFieldRoot, type RootProps as ExpressionFieldRootProps, ExpressionInput, type ExpressionInputProps, UseExpressionFieldOptions, V, useFieldContext, version };
108
+ export { CSS_VARS, ExpressionField, Editor as ExpressionFieldEditor, type EditorProps as ExpressionFieldEditorProps, ExpressionFieldError, type ExpressionFieldErrorCode, ExpandTrigger as ExpressionFieldExpandTrigger, type ExpandTriggerProps as ExpressionFieldExpandTriggerProps, ExpressionFieldHandle, Root as ExpressionFieldRoot, type RootProps as ExpressionFieldRootProps, ExpressionInput, type ExpressionInputProps, UseExpressionFieldOptions, V, useFieldContext, version };
package/dist/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import * as React from 'react';
2
- import { U as UseExpressionFieldOptions, E as ExpressionFieldHandle } from './useExpressionField-BfIHCVtU.js';
3
- export { F as FieldLayout, L as LanguageServiceOptions, S as SegmenterOption, u as useExpressionField, a as useLanguageService } from './useExpressionField-BfIHCVtU.js';
2
+ import { U as UseExpressionFieldOptions, E as ExpressionFieldHandle } from './useExpressionField-Dsh6-SIB.js';
3
+ export { a as FieldFinish, F as FieldLayout, L as LanguageServiceOptions, S as SegmenterOption, u as useExpressionField, b as useLanguageService } from './useExpressionField-Dsh6-SIB.js';
4
4
  export { TokenActionTarget } from '@tslite/codemirror';
5
5
  import '@codemirror/state';
6
6
  import '@codemirror/view';
@@ -79,6 +79,16 @@ declare const ExpressionField: {
79
79
  ExpandTrigger: React.ForwardRefExoticComponent<ExpandTriggerProps & React.RefAttributes<HTMLButtonElement>>;
80
80
  };
81
81
 
82
+ /** O motivo de uma recusa. */
83
+ type ExpressionFieldErrorCode =
84
+ /** O `useFieldContext` foi chamado fora de uma `<ExpressionField.Root>`. */
85
+ "outside-root";
86
+ /** O uso errado das peças do campo. É erro de quem monta a tela, e não do autor. */
87
+ declare class ExpressionFieldError extends Error {
88
+ readonly code: ExpressionFieldErrorCode;
89
+ constructor(code: ExpressionFieldErrorCode, message: string);
90
+ }
91
+
82
92
  /** As cores de chrome. Exportadas para o consumidor reusar no que ele desenhar. */
83
93
  declare const V: {
84
94
  readonly fg: "var(--foreground, #cccccc)";
@@ -93,6 +103,6 @@ declare const V: {
93
103
  declare const CSS_VARS: readonly ["--foreground", "--muted-foreground", "--border", "--ring", "--input", "--destructive", "--font-mono", "--muted", "--popover", "--popover-foreground", "--primary", "--primary-foreground", "--secondary", "--accent"];
94
104
 
95
105
  /** A versão deste package, a do módulo de fato carregado. */
96
- declare const version = "1.4.0";
106
+ declare const version = "1.5.0";
97
107
 
98
- export { CSS_VARS, ExpressionField, Editor as ExpressionFieldEditor, type EditorProps as ExpressionFieldEditorProps, ExpandTrigger as ExpressionFieldExpandTrigger, type ExpandTriggerProps as ExpressionFieldExpandTriggerProps, ExpressionFieldHandle, Root as ExpressionFieldRoot, type RootProps as ExpressionFieldRootProps, ExpressionInput, type ExpressionInputProps, UseExpressionFieldOptions, V, useFieldContext, version };
108
+ export { CSS_VARS, ExpressionField, Editor as ExpressionFieldEditor, type EditorProps as ExpressionFieldEditorProps, ExpressionFieldError, type ExpressionFieldErrorCode, ExpandTrigger as ExpressionFieldExpandTrigger, type ExpandTriggerProps as ExpressionFieldExpandTriggerProps, ExpressionFieldHandle, Root as ExpressionFieldRoot, type RootProps as ExpressionFieldRootProps, ExpressionInput, type ExpressionInputProps, UseExpressionFieldOptions, V, useFieldContext, version };
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- import*as n from'react';import {Compartment,Prec,EditorState}from'@codemirror/state';import {EditorView,keymap,placeholder}from'@codemirror/view';import {insertNewlineAndIndent,history,historyKeymap,defaultKeymap}from'@codemirror/commands';import {completionStatus,acceptCompletion}from'@codemirror/autocomplete';import {languageService,singleLine,tokenAction,gotoDefinition,externalChange,codeEditing,gutters}from'@tslite/codemirror';import {tsliteTokenStyles,createHostService}from'@tslite/editor';import {whole,mustache}from'@tslite/language-service';import {jsx,jsxs}from'react/jsx-runtime';var ae={mustache:mustache,whole:whole},ce=t=>typeof t=="function"?t:ae[t];function I(t){let{world:o,service:c,segmenter:i="mustache",mode:s="expression",type:l,optional:d,profile:p,guards:a}=t,u=n.useMemo(()=>{if(c||!o)return null;let x={world:o,...l!==void 0?{type:l}:{},...d?{optional:d}:{}},S={...p?{profile:p}:{},...a?{guards:a}:{}};return s==="template"?createHostService({...x,...S,mode:s}):createHostService({...x,...S,segmenter:ce(i),mode:s})},[c,o,i,s,l,d,p,a]);return n.useEffect(()=>u?()=>u.dispose():void 0,[u]),c??u}var we=EditorView.theme({".cm-scroller":{overflowX:"auto",overflowY:"hidden"},".cm-content":{padding:"6px 8px"},".cm-line":{padding:"0"},"&.cm-focused":{outline:"none"}}),z=6,Oe=EditorView.theme({".cm-scroller":{overflowY:"auto"},".cm-content":{padding:`${z}px 8px`},".cm-line":{padding:"0"},"&.cm-focused":{outline:"none"}}),Ce=(t,o)=>`${o*t.defaultLineHeight+2*z}px`,Le=EditorView.theme({"&":{height:"100%"},".cm-scroller":{overflowY:"auto"},".cm-content":{padding:"8px"},"&.cm-focused":{outline:"none"}}),$=t=>t.replace(/\r?\n/g," "),Te=(t,o)=>{if(t===false)return [];let c=o==="block"?{}:{tab:false,indentOnInput:false};return codeEditing(typeof t=="object"?{...c,...t}:c)},ke=t=>t?gutters(typeof t=="object"?t:{}):[];function V(t){let{value:o,onChange:c,onCommit:i,layout:s="inline",maxLines:l,wrap:d=s!=="inline",editing:p,gutters:a,readOnly:u=false,placeholder:x,features:S,tooltipParent:T,onTokenAction:_,isTokenActionable:U,definition:k,extensions:ee}=t,h=I(t),H=n.useRef(null),v=n.useRef(null),[Y,G]=n.useState(null),[te,oe]=n.useState(false),R=n.useRef({value:o,onChange:c,onCommit:i,onTokenAction:_,isTokenActionable:U});R.current={value:o,onChange:c,onCommit:i,onTokenAction:_,isTokenActionable:U};let P=n.useCallback(e=>{let{value:r,onCommit:y}=R.current;if(!y)return;let g=e.state.doc.toString();g!==r&&y(g);},[]),f=n.useRef({service:new Compartment,layout:new Compartment,editable:new Compartment,actions:new Compartment}).current,M=n.useCallback(e=>e?languageService(e,{theme:tsliteTokenStyles,...T!==null?{tooltipParent:T??(typeof document<"u"?document.body:void 0)}:{},...S}):[],[S,T]),N=n.useCallback(e=>completionStatus(e.state)==="active"?acceptCompletion(e)||true:(P(e),true),[P]),A=n.useCallback((e,r,y,g)=>[e==="block"?[...r?[EditorView.lineWrapping]:[],Le]:e==="grow"?[...r?[EditorView.lineWrapping]:[],Oe,Prec.highest(keymap.of([{key:"Enter",run:N},{key:"Shift-Enter",run:insertNewlineAndIndent}]))]:[singleLine,we],Te(y,e),ke(g)],[N]),D=n.useCallback(()=>{let e=[];return R.current.onTokenAction&&e.push(tokenAction({actionable:r=>R.current.isTokenActionable?.(r)??true,onAction:r=>R.current.onTokenAction?.(r)})),k&&h?.definitionAt&&e.push(gotoDefinition(k)),e},[k,h]);n.useEffect(()=>{if(!H.current)return;let e=new EditorView({parent:H.current,state:EditorState.create({doc:s==="inline"?$(o):o,extensions:[history(),f.service.of(M(h)),f.layout.of(A(s,d,p,a)),f.editable.of(EditorView.editable.of(!u)),f.actions.of(D()),...x?[placeholder(x)]:[],keymap.of([...historyKeymap,...defaultKeymap]),EditorView.updateListener.of(r=>{if(r.focusChanged&&oe(r.view.hasFocus),!r.docChanged)return;r.transactions.some(g=>g.annotation(externalChange))||R.current.onChange?.(r.state.doc.toString());}),EditorView.contentAttributes.of({"aria-label":x??"expression"}),EditorView.domEventHandlers({blur:(r,y)=>{let g=r.relatedTarget;return g instanceof Element&&(y.dom.contains(g)||g.closest(".cm-tooltip"))||P(y),false}}),...ee??[]]})});return v.current=e,G(e),()=>{e.destroy(),v.current=null,G(null);}},[]),n.useEffect(()=>{v.current?.dispatch({effects:f.service.reconfigure(M(h))});},[h,M,f]),n.useEffect(()=>{v.current?.dispatch({effects:f.layout.reconfigure(A(s,d,p,a))});},[s,d,p,a,A,f]),n.useEffect(()=>{v.current?.dispatch({effects:f.editable.reconfigure(EditorView.editable.of(!u))});},[u,f]),n.useEffect(()=>{let e=v.current;e&&(e.scrollDOM.style.maxHeight=s==="grow"&&l!==void 0&&l>0?Ce(e,l):"");},[s,l,Y]),n.useEffect(()=>{v.current?.dispatch({effects:f.actions.reconfigure(D())});},[D,f]),n.useEffect(()=>{let e=v.current;if(!e)return;let r=s==="inline"?$(o):o;if(r===e.state.doc.toString())return;let{anchor:y,head:g}=e.state.selection.main,K=re=>Math.min(re,r.length);e.dispatch({changes:{from:0,to:e.state.doc.length,insert:r},selection:{anchor:K(y),head:K(g)},annotations:externalChange.of(true)});},[o,s]);let ne=n.useCallback(()=>v.current?.focus(),[]);return {ref:H,view:Y,focused:te,service:h,focus:ne}}var X=n.createContext(null);function q(){let t=n.useContext(X);if(!t)throw new Error("useFieldContext must be used inside <ExpressionField.Root>");return t}var He=["value","onChange","onCommit","layout","maxLines","wrap","editing","gutters","readOnly","placeholder","features","tooltipParent","onTokenAction","isTokenActionable","definition","extensions","world","service","segmenter","mode","type","optional","profile","guards"];var J=n.forwardRef(function(o,c){let{children:i,...s}=o,l={},d={};for(let[a,u]of Object.entries(s))(He.includes(a)?l:d)[a]=u;let p=V(l);return jsx(X.Provider,{value:p,children:jsx("div",{ref:c,...d,children:typeof i=="function"?i(p):i})})}),Q=n.forwardRef(function(o,c){let i=q();return jsx("div",{ref:i.ref,...o})}),Z=n.forwardRef(function({children:o,...c},i){return jsx("button",{ref:i,type:"button",...c,children:o})}),F={Root:J,Editor:Q,ExpandTrigger:Z};var E={fg:"var(--foreground, #cccccc)",mutedFg:"var(--muted-foreground, #8b8b8b)",border:"var(--border, #2b2b2b)",ring:"var(--ring, #0078d4)",input:"var(--input, transparent)",destructive:"var(--destructive, #f14c4c)",font:"var(--font-mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace)"},Pe=["--foreground","--muted-foreground","--border","--ring","--input","--destructive","--font-mono","--muted","--popover","--popover-foreground","--primary","--primary-foreground","--secondary","--accent"];var Me=jsx("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",children:jsx("path",{d:"M15 3h6v6M9 21H3v-6M21 3l-7 7M3 21l7-7"})});function Ae({invalid:t,className:o,style:c,onExpand:i,expandIcon:s,multiline:l,layout:d,...p}){let a=d??(l?"block":"inline");return jsx(F.Root,{...p,layout:a,className:o,children:u=>jsxs("div",{style:{position:"relative",border:`1px solid ${t?E.destructive:u.focused?E.ring:E.border}`,borderRadius:"6px",backgroundColor:E.input,color:E.fg,fontFamily:E.font,fontSize:"13px",overflow:"hidden",...a==="block"?{height:"100%",display:"flex",flexDirection:"column"}:{},...c},children:[jsx(F.Editor,{style:a==="block"?{flex:1,minHeight:0}:a==="grow"?{paddingRight:i?"28px":void 0}:{paddingRight:i?"24px":void 0}}),i&&jsx(F.ExpandTrigger,{onClick:i,"aria-label":"Expandir",title:"Expandir",onMouseEnter:x=>x.currentTarget.style.opacity="1",onMouseLeave:x=>x.currentTarget.style.opacity="0.55",style:{position:"absolute",top:a==="inline"?"50%":"6px",right:"4px",transform:a==="inline"?"translateY(-50%)":void 0,display:"flex",alignItems:"center",justifyContent:"center",width:"20px",height:"20px",padding:0,lineHeight:0,border:"none",borderRadius:"4px",background:E.input,color:E.mutedFg,cursor:"pointer",opacity:.55},children:s??Me})]})})}var Ie="1.4.0";export{Pe as CSS_VARS,F as ExpressionField,Q as ExpressionFieldEditor,Z as ExpressionFieldExpandTrigger,J as ExpressionFieldRoot,Ae as ExpressionInput,E as V,V as useExpressionField,q as useFieldContext,I as useLanguageService,Ie as version};
1
+ import*as n from'react';import {Compartment,Prec,EditorState}from'@codemirror/state';import {EditorView,keymap,placeholder}from'@codemirror/view';import {insertNewlineAndIndent,history,historyKeymap,defaultKeymap}from'@codemirror/commands';import {completionStatus,acceptCompletion}from'@codemirror/autocomplete';import {externalChange,languageService,singleLine,tokenAction,gotoDefinition,codeEditing,gutters}from'@tslite/codemirror';import {tsliteTokenStyles,createHostService}from'@tslite/editor';import {whole,mustache}from'@tslite/language-service';import {jsx,jsxs}from'react/jsx-runtime';var xe={mustache:mustache,whole:whole},ye=t=>typeof t=="function"?t:xe[t];function N(t){let{world:o,service:s,segmenter:a="mustache",mode:m="expression",type:i,optional:d,profile:u,guards:c}=t,f=n.useMemo(()=>{if(s||!o)return null;let y={world:o,...i!==void 0?{type:i}:{},...d?{optional:d}:{}},R={...u?{profile:u}:{},...c?{guards:c}:{}};return m==="template"?createHostService({...y,...R,mode:m}):createHostService({...y,...R,segmenter:ye(a),mode:m})},[s,o,a,m,i,d,u,c]);return n.useEffect(()=>f?()=>f.dispose():void 0,[f]),s??f}var Pe=EditorView.theme({".cm-scroller":{overflowX:"auto",overflowY:"hidden"},".cm-content":{padding:"6px 8px"},".cm-line":{padding:"0"},"&.cm-focused":{outline:"none"}}),ne=6,Me=EditorView.theme({".cm-scroller":{overflowY:"auto"},".cm-content":{padding:`${ne}px 8px`},".cm-line":{padding:"0"},"&.cm-focused":{outline:"none"}}),Ae=(t,o)=>`${o*t.defaultLineHeight+2*ne}px`,De=EditorView.theme({"&":{height:"100%"},".cm-scroller":{overflowY:"auto"},".cm-content":{padding:"8px"},"&.cm-focused":{outline:"none"}}),Ie=t=>t.replace(/\r?\n/g," "),S=(t,o)=>o==="inline"?Ie(t):t,Ve=(t,o)=>{if(t===false)return [];let s=o==="block"?{}:{tab:false,indentOnInput:false};return codeEditing(typeof t=="object"?{...s,...t}:s)},_e=t=>t?gutters(typeof t=="object"?t:{}):[];function B(t){let{value:o,onChange:s,onCommit:a,onFinish:m,layout:i="inline",maxLines:d,wrap:u=i!=="inline",editing:c,gutters:f,readOnly:y=false,placeholder:R,features:W,tooltipParent:A,onTokenAction:$,isTokenActionable:z,definition:D,extensions:le}=t,F=N(t),I=n.useRef(null),v=n.useRef(null),[X,q]=n.useState(null),[de,pe]=n.useState(false),h=n.useRef({value:o,layout:i,onChange:s,onCommit:a,onFinish:m,onTokenAction:$,isTokenActionable:z});h.current={value:o,layout:i,onChange:s,onCommit:a,onFinish:m,onTokenAction:$,isTokenActionable:z};let O=n.useCallback(e=>{let{value:r,layout:l}=h.current;return e.state.doc.toString()!==S(r,l)},[]),V=n.useCallback((e,r)=>{let l=O(e);l&&h.current.onCommit?.(e.state.doc.toString()),h.current.onFinish?.({via:r,dirty:l});},[O]),_=n.useCallback(e=>{let{onFinish:r,value:l,layout:p}=h.current;if(!r||completionStatus(e.state)==="active")return false;let L=O(e);if(L){let T=S(l,p);e.dispatch({changes:{from:0,to:e.state.doc.length,insert:T},selection:{anchor:T.length},annotations:externalChange.of(true)});}return r({via:"escape",dirty:L}),true},[O]),g=n.useRef({service:new Compartment,layout:new Compartment,editable:new Compartment,actions:new Compartment}).current,U=n.useCallback(e=>e?languageService(e,{theme:tsliteTokenStyles,...A!==null?{tooltipParent:A??(typeof document<"u"?document.body:void 0)}:{},...W}):[],[W,A]),J=n.useCallback(e=>completionStatus(e.state)==="active"?acceptCompletion(e)||true:(V(e,"enter"),true),[V]),Y=n.useCallback((e,r,l,p)=>[e==="block"?[...r?[EditorView.lineWrapping]:[],De]:e==="grow"?[...r?[EditorView.lineWrapping]:[],Me,Prec.highest(keymap.of([{key:"Enter",run:J},{key:"Shift-Enter",run:insertNewlineAndIndent},{key:"Escape",run:_}]))]:[singleLine,Pe,Prec.highest(keymap.of([{key:"Escape",run:_}]))],Ve(l,e),_e(p)],[J,_]),G=n.useCallback(()=>{let e=[];return h.current.onTokenAction&&e.push(tokenAction({actionable:r=>h.current.isTokenActionable?.(r)??true,onAction:r=>h.current.onTokenAction?.(r)})),D&&F?.definitionAt&&e.push(gotoDefinition(D)),e},[D,F]);n.useEffect(()=>{if(!I.current)return;let e=new EditorView({parent:I.current,state:EditorState.create({doc:S(o,i),extensions:[history(),g.service.of(U(F)),g.layout.of(Y(i,u,c,f)),g.editable.of(EditorView.editable.of(!y)),g.actions.of(G()),...R?[placeholder(R)]:[],keymap.of([...historyKeymap,...defaultKeymap]),EditorView.updateListener.of(r=>{if(r.focusChanged&&pe(r.view.hasFocus),!r.docChanged)return;r.transactions.some(p=>p.annotation(externalChange))||h.current.onChange?.(r.state.doc.toString());}),EditorView.contentAttributes.of({"aria-label":R??"expression"}),EditorView.domEventHandlers({blur:(r,l)=>{let p=r.relatedTarget;return p instanceof Element&&(l.dom.contains(p)||p.closest(".cm-tooltip"))||V(l,"blur"),false}}),...le??[]]})});return v.current=e,q(e),()=>{e.destroy(),v.current=null,q(null);}},[]),n.useEffect(()=>{v.current?.dispatch({effects:g.service.reconfigure(U(F))});},[F,U,g]),n.useEffect(()=>{v.current?.dispatch({effects:g.layout.reconfigure(Y(i,u,c,f))});},[i,u,c,f,Y,g]),n.useEffect(()=>{v.current?.dispatch({effects:g.editable.reconfigure(EditorView.editable.of(!y))});},[y,g]),n.useEffect(()=>{let e=v.current;e&&(e.scrollDOM.style.maxHeight=i==="grow"&&d!==void 0&&d>0?Ae(e,d):"");},[i,d,X]),n.useEffect(()=>{v.current?.dispatch({effects:g.actions.reconfigure(G())});},[G,g]);let Q=n.useRef({value:o,layout:i});n.useEffect(()=>{let e=v.current;if(!e)return;let r=Q.current;Q.current={value:o,layout:i};let l=e.state.doc.toString(),p=o!==r.value||l===S(o,r.layout)?S(o,i):S(l,i);if(p===l)return;let{anchor:L,head:T}=e.state.selection.main,Z=fe=>Math.min(fe,p.length);e.dispatch({changes:{from:0,to:e.state.doc.length,insert:p},selection:{anchor:Z(L),head:Z(T)},annotations:externalChange.of(true)});},[o,i]);let ue=n.useCallback(()=>v.current?.focus(),[]);return {ref:I,view:X,focused:de,service:F,focus:ue}}var w=class extends Error{constructor(o,s){super(s),this.name="ExpressionFieldError",this.code=o;}};var re=n.createContext(null);function ie(){let t=n.useContext(re);if(!t)throw new w("outside-root","useFieldContext must be used inside <ExpressionField.Root>");return t}var Ue=["value","onChange","onCommit","onFinish","layout","maxLines","wrap","editing","gutters","readOnly","placeholder","features","tooltipParent","onTokenAction","isTokenActionable","definition","extensions","world","service","segmenter","mode","type","optional","profile","guards"];var se=n.forwardRef(function(o,s){let{children:a,...m}=o,i={},d={};for(let[c,f]of Object.entries(m))(Ue.includes(c)?i:d)[c]=f;let u=B(i);return jsx(re.Provider,{value:u,children:jsx("div",{ref:s,...d,children:typeof a=="function"?a(u):a})})}),ae=n.forwardRef(function(o,s){let a=ie();return jsx("div",{ref:a.ref,...o})}),ce=n.forwardRef(function({children:o,...s},a){return jsx("button",{ref:a,type:"button",...s,children:o})}),C={Root:se,Editor:ae,ExpandTrigger:ce};var E={fg:"var(--foreground, #cccccc)",mutedFg:"var(--muted-foreground, #8b8b8b)",border:"var(--border, #2b2b2b)",ring:"var(--ring, #0078d4)",input:"var(--input, transparent)",destructive:"var(--destructive, #f14c4c)",font:"var(--font-mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace)"},Ye=["--foreground","--muted-foreground","--border","--ring","--input","--destructive","--font-mono","--muted","--popover","--popover-foreground","--primary","--primary-foreground","--secondary","--accent"];var Ge=jsx("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",children:jsx("path",{d:"M15 3h6v6M9 21H3v-6M21 3l-7 7M3 21l7-7"})});function Ne({invalid:t,className:o,style:s,onExpand:a,expandIcon:m,multiline:i,layout:d,...u}){let c=d??(i?"block":"inline");return jsx(C.Root,{...u,layout:c,className:o,children:f=>jsxs("div",{style:{position:"relative",border:`1px solid ${t?E.destructive:f.focused?E.ring:E.border}`,borderRadius:"6px",backgroundColor:E.input,color:E.fg,fontFamily:E.font,fontSize:"13px",overflow:"hidden",...c==="block"?{height:"100%",display:"flex",flexDirection:"column"}:{},...s},children:[jsx(C.Editor,{style:c==="block"?{flex:1,minHeight:0}:c==="grow"?{paddingRight:a?"28px":void 0}:{paddingRight:a?"24px":void 0}}),a&&jsx(C.ExpandTrigger,{onClick:a,"aria-label":"Expandir",title:"Expandir",onMouseEnter:y=>y.currentTarget.style.opacity="1",onMouseLeave:y=>y.currentTarget.style.opacity="0.55",style:{position:"absolute",top:c==="inline"?"50%":"6px",right:"4px",transform:c==="inline"?"translateY(-50%)":void 0,display:"flex",alignItems:"center",justifyContent:"center",width:"20px",height:"20px",padding:0,lineHeight:0,border:"none",borderRadius:"4px",background:E.input,color:E.mutedFg,cursor:"pointer",opacity:.55},children:m??Ge})]})})}var je="1.5.0";export{Ye as CSS_VARS,C as ExpressionField,ae as ExpressionFieldEditor,w as ExpressionFieldError,ce as ExpressionFieldExpandTrigger,se as ExpressionFieldRoot,Ne as ExpressionInput,E as V,B as useExpressionField,ie as useFieldContext,N as useLanguageService,je as version};
@@ -131,6 +131,20 @@ interface UseExpressionFieldOptions extends LanguageServiceOptions {
131
131
  * não é o autor terminando, e não commita.
132
132
  */
133
133
  readonly onCommit?: (text: string) => void;
134
+ /**
135
+ * O GESTO com que o autor terminou: o `Enter` que termina (layout `"grow"`), o
136
+ * `Escape` que cancela (layouts `"inline"` e `"grow"`) ou o foco que sai. Dispara
137
+ * também quando nada mudou, com `dirty` dizendo se havia rascunho diferente do
138
+ * `value` naquele instante (R19).
139
+ *
140
+ * No `Enter` e no blur, ele vem depois do `onCommit` (quando há o que commitar):
141
+ * quem recusa o texto no `onCommit` já recusou quando o gesto chega. O `Escape`
142
+ * volta o rascunho ao `value`, sem `onChange` nem `onCommit`, e avisa. A tecla
143
+ * que a lista de sugestões consome (o `Enter` que aceita, o `Escape` que fecha)
144
+ * não é o autor terminando, e não dispara. Sem esta função, o `Escape` não é do
145
+ * campo.
146
+ */
147
+ readonly onFinish?: (finish: FieldFinish) => void;
134
148
  /** Como o campo se apresenta. Padrão: `"inline"`. */
135
149
  readonly layout?: FieldLayout;
136
150
  /**
@@ -211,6 +225,13 @@ interface UseExpressionFieldOptions extends LanguageServiceOptions {
211
225
  /** Extensões extras do CodeMirror — a escotilha de fuga. */
212
226
  readonly extensions?: readonly Extension[];
213
227
  }
228
+ /** Como o autor terminou a edição do campo (R19). */
229
+ interface FieldFinish {
230
+ /** O gesto: o `Enter` que termina, o `Escape` que cancela, ou o foco que sai. */
231
+ readonly via: "enter" | "escape" | "blur";
232
+ /** Havia rascunho diferente do `value` quando o autor terminou. */
233
+ readonly dirty: boolean;
234
+ }
214
235
  /** O que o hook devolve. */
215
236
  interface ExpressionFieldHandle {
216
237
  /** Ponha num elemento vazio: é onde o editor monta. */
@@ -226,4 +247,4 @@ interface ExpressionFieldHandle {
226
247
  }
227
248
  declare function useExpressionField(options: UseExpressionFieldOptions): ExpressionFieldHandle;
228
249
 
229
- export { type ExpressionFieldHandle as E, type FieldLayout as F, type LanguageServiceOptions as L, type SegmenterOption as S, type UseExpressionFieldOptions as U, useLanguageService as a, useExpressionField as u };
250
+ export { type ExpressionFieldHandle as E, type FieldLayout as F, type LanguageServiceOptions as L, type SegmenterOption as S, type UseExpressionFieldOptions as U, type FieldFinish as a, useLanguageService as b, useExpressionField as u };
@@ -131,6 +131,20 @@ interface UseExpressionFieldOptions extends LanguageServiceOptions {
131
131
  * não é o autor terminando, e não commita.
132
132
  */
133
133
  readonly onCommit?: (text: string) => void;
134
+ /**
135
+ * O GESTO com que o autor terminou: o `Enter` que termina (layout `"grow"`), o
136
+ * `Escape` que cancela (layouts `"inline"` e `"grow"`) ou o foco que sai. Dispara
137
+ * também quando nada mudou, com `dirty` dizendo se havia rascunho diferente do
138
+ * `value` naquele instante (R19).
139
+ *
140
+ * No `Enter` e no blur, ele vem depois do `onCommit` (quando há o que commitar):
141
+ * quem recusa o texto no `onCommit` já recusou quando o gesto chega. O `Escape`
142
+ * volta o rascunho ao `value`, sem `onChange` nem `onCommit`, e avisa. A tecla
143
+ * que a lista de sugestões consome (o `Enter` que aceita, o `Escape` que fecha)
144
+ * não é o autor terminando, e não dispara. Sem esta função, o `Escape` não é do
145
+ * campo.
146
+ */
147
+ readonly onFinish?: (finish: FieldFinish) => void;
134
148
  /** Como o campo se apresenta. Padrão: `"inline"`. */
135
149
  readonly layout?: FieldLayout;
136
150
  /**
@@ -211,6 +225,13 @@ interface UseExpressionFieldOptions extends LanguageServiceOptions {
211
225
  /** Extensões extras do CodeMirror — a escotilha de fuga. */
212
226
  readonly extensions?: readonly Extension[];
213
227
  }
228
+ /** Como o autor terminou a edição do campo (R19). */
229
+ interface FieldFinish {
230
+ /** O gesto: o `Enter` que termina, o `Escape` que cancela, ou o foco que sai. */
231
+ readonly via: "enter" | "escape" | "blur";
232
+ /** Havia rascunho diferente do `value` quando o autor terminou. */
233
+ readonly dirty: boolean;
234
+ }
214
235
  /** O que o hook devolve. */
215
236
  interface ExpressionFieldHandle {
216
237
  /** Ponha num elemento vazio: é onde o editor monta. */
@@ -226,4 +247,4 @@ interface ExpressionFieldHandle {
226
247
  }
227
248
  declare function useExpressionField(options: UseExpressionFieldOptions): ExpressionFieldHandle;
228
249
 
229
- export { type ExpressionFieldHandle as E, type FieldLayout as F, type LanguageServiceOptions as L, type SegmenterOption as S, type UseExpressionFieldOptions as U, useLanguageService as a, useExpressionField as u };
250
+ export { type ExpressionFieldHandle as E, type FieldLayout as F, type LanguageServiceOptions as L, type SegmenterOption as S, type UseExpressionFieldOptions as U, type FieldFinish as a, useLanguageService as b, useExpressionField as u };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tslite/react",
3
- "version": "1.4.0",
3
+ "version": "1.5.0",
4
4
  "description": "React bindings for TSLite — a headless expression field (CodeMirror 6) with type-aware highlighting, completion, diagnostics and quick-fixes, driven by the TypeScript language service ported to TSLite.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -47,9 +47,9 @@
47
47
  "access": "public"
48
48
  },
49
49
  "dependencies": {
50
- "@tslite/editor": "^1.6.0",
51
- "@tslite/language-service": "^1.2.0",
52
- "@tslite/codemirror": "^1.3.0"
50
+ "@tslite/codemirror": "^1.3.0",
51
+ "@tslite/editor": "^1.7.0",
52
+ "@tslite/language-service": "^1.2.0"
53
53
  },
54
54
  "peerDependencies": {
55
55
  "@codemirror/autocomplete": "^6.0.0",
@@ -75,8 +75,8 @@
75
75
  "@types/react-dom": "^18.3.1",
76
76
  "react": "^18.3.1",
77
77
  "react-dom": "^18.3.1",
78
- "@tslite/std": "1.4.0",
79
- "@tslite/checker": "1.12.0"
78
+ "@tslite/checker": "1.13.0",
79
+ "@tslite/std": "1.4.0"
80
80
  },
81
81
  "peerDependenciesMeta": {
82
82
  "@codemirror/search": {