react-bootstrap-plugins 2.2.1 → 2.4.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/README.md +8 -3
- package/dist/AutoDisplay.cjs +2 -0
- package/dist/AutoDisplay.d.cts +15 -0
- package/dist/AutoDisplay.d.ts +15 -0
- package/dist/AutoDisplay.js +2 -0
- package/dist/DatePicker.cjs +1 -1
- package/dist/DatePicker.d.cts +2 -0
- package/dist/DatePicker.d.ts +2 -0
- package/dist/DatePicker.js +1 -1
- package/dist/chunk-2UX7JYM3.js +2 -0
- package/dist/chunk-H2ULQLGP.cjs +2 -0
- package/dist/chunk-LWCY2GIT.js +2 -0
- package/dist/chunk-ZOXIZM63.cjs +2 -0
- package/dist/index.cjs +2 -2
- package/dist/index.d.cts +77 -1
- package/dist/index.d.ts +77 -1
- package/dist/index.js +2 -2
- package/docs/AUTODISPLAY.md +109 -0
- package/docs/DATEPICKER.md +19 -0
- package/docs/INPUTCURRENCY.md +180 -0
- package/package.json +29 -4
- package/dist/chunk-GCPYN7WB.js +0 -2
- package/dist/chunk-R5OO66VE.cjs +0 -2
package/dist/index.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
'use strict';var
|
|
2
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsImZpbGUiOiJpbmRleC5janMifQ==
|
|
1
|
+
'use strict';var chunkZOXIZM63_cjs=require('./chunk-ZOXIZM63.cjs'),chunkAWU5XGMI_cjs=require('./chunk-AWU5XGMI.cjs'),chunk2Q4NZKMX_cjs=require('./chunk-2Q4NZKMX.cjs'),chunk5IOLZUVD_cjs=require('./chunk-5IOLZUVD.cjs'),chunkM3OUUXZG_cjs=require('./chunk-M3OUUXZG.cjs'),chunkG26VJJWL_cjs=require('./chunk-G26VJJWL.cjs'),chunkNPQQDBFB_cjs=require('./chunk-NPQQDBFB.cjs'),chunkH2ULQLGP_cjs=require('./chunk-H2ULQLGP.cjs'),n=require('react'),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 y=n__namespace.forwardRef(({value:r,onChange:b,className:h,name:p,id:C,disabled:P=false,readOnly:I=false,placeholder:N,currency:i="UGX",locale:c="en-UG",decimals:a=0,plain:m=false,onBlur:R,onFocus:L,...D},T)=>{let s=n__namespace.useCallback(e=>{if(e==null||e==="")return "";let t=Number(e);if(Number.isNaN(t))return "";let o=a>0?{minimumFractionDigits:a,maximumFractionDigits:a}:{minimumFractionDigits:0,maximumFractionDigits:0};return m?t.toLocaleString(c,o):t.toLocaleString(c,{style:"currency",currency:i,...o})},[i,c,a,m]),l=n__namespace.useCallback(e=>{if(!e)return "";let t=e.replace(/[^0-9.\-]/g,"");if(t==="-"||t===""||t===".")return "";let o=Number(t);return Number.isNaN(o)?"":a===0?Math.round(o):o},[a]),[f,g]=n__namespace.useState(false),[E,u]=n__namespace.useState(()=>s(r)),d=n__namespace.useRef(r);return n__namespace.useEffect(()=>{!f&&r!==d.current&&u(s(r)),d.current=r;},[r,f,s]),jsxRuntime.jsx("input",{ref:T,type:"text",id:C??p,name:p,value:E,onChange:e=>{let t=e.target.value;u(t);let o=l(t);e.target.value=o,b?.(e);},onFocus:e=>{g(true),r!=null&&r!==""&&u(String(r)),L?.(e);},onBlur:e=>{g(false);let t=l(e.target.value);u(s(t)),R?.(e);},disabled:P,readOnly:I,placeholder:N,inputMode:"decimal",autoComplete:"off",className:chunkNPQQDBFB_cjs.a("form-control",h),...D})});y.displayName="InputCurrency";Object.defineProperty(exports,"DatePicker",{enumerable:true,get:function(){return chunkZOXIZM63_cjs.a}});Object.defineProperty(exports,"SearchSelect",{enumerable:true,get:function(){return chunkAWU5XGMI_cjs.a}});Object.defineProperty(exports,"Label",{enumerable:true,get:function(){return chunk2Q4NZKMX_cjs.a}});Object.defineProperty(exports,"TableLoading",{enumerable:true,get:function(){return chunk5IOLZUVD_cjs.a}});Object.defineProperty(exports,"AutoTextarea",{enumerable:true,get:function(){return chunkM3OUUXZG_cjs.a}});Object.defineProperty(exports,"NavPills",{enumerable:true,get:function(){return chunkG26VJJWL_cjs.a}});Object.defineProperty(exports,"AutoDisplay",{enumerable:true,get:function(){return chunkH2ULQLGP_cjs.a}});exports.InputCurrency=y;//# sourceMappingURL=index.cjs.map
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9jb21wb25lbnRzL0lucHV0Q3VycmVuY3kudHN4Il0sIm5hbWVzIjpbIklucHV0Q3VycmVuY3kiLCJuIiwidmFsdWUiLCJvbkNoYW5nZSIsImNsYXNzTmFtZSIsIm5hbWUiLCJpZCIsImRpc2FibGVkIiwicmVhZE9ubHkiLCJwbGFjZWhvbGRlciIsImN1cnJlbmN5IiwibG9jYWxlIiwiZGVjaW1hbHMiLCJwbGFpbiIsIm9uQmx1ciIsIm9uRm9jdXMiLCJyZXN0IiwicmVmIiwiZm9ybWF0RGlzcGxheSIsInZhbCIsIm51bSIsImZyYWN0aW9uRGlnaXRzIiwicGFyc2VOdW1lcmljIiwicmF3IiwiY2xlYW5lZCIsImZvY3VzZWQiLCJzZXRGb2N1c2VkIiwiaW5uZXIiLCJzZXRJbm5lciIsInByZXZWYWx1ZVJlZiIsImpzeCIsIm51bWVyaWMiLCJjbiJdLCJtYXBwaW5ncyI6ImswQkFvRkEsSUFBTUEsQ0FBQUEsQ0FBc0JDLFlBQUEsQ0FBQSxVQUFBLENBQzFCLENBQ0UsQ0FDRSxLQUFBLENBQUFDLENBQUFBLENBQ0EsUUFBQSxDQUFBQyxDQUFBQSxDQUNBLFVBQUFDLENBQUFBLENBQ0EsSUFBQSxDQUFBQyxDQUFBQSxDQUNBLEVBQUEsQ0FBQUMsRUFDQSxRQUFBLENBQUFDLENBQUFBLENBQVcsS0FBQSxDQUNYLFFBQUEsQ0FBQUMsRUFBVyxLQUFBLENBQ1gsV0FBQSxDQUFBQyxDQUFBQSxDQUNBLFFBQUEsQ0FBQUMsRUFBVyxLQUFBLENBQ1gsTUFBQSxDQUFBQyxDQUFBQSxDQUFTLE9BQUEsQ0FDVCxTQUFBQyxDQUFBQSxDQUFXLENBQUEsQ0FDWCxLQUFBLENBQUFDLENBQUFBLENBQVEsS0FBQSxDQUNSLE1BQUEsQ0FBQUMsQ0FBQUEsQ0FDQSxPQUFBLENBQUFDLEVBQ0EsR0FBR0MsQ0FDTCxDQUFBLENBQ0FDLENBQUFBLEdBQ0csQ0FPSCxJQUFNQyxDQUFBQSxDQUFzQmpCLFlBQUEsQ0FBQSxXQUFBLENBQ3pCa0IsQ0FBQUEsRUFBb0QsQ0FDbkQs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MEIsQ0FBQUEsQ0FBUyxNQUFBLENBQU8xQixDQUFLLENBQUMsQ0FBQSxDQUV4QmEsQ0FBQUEsR0FBVSxDQUFDLEVBQ2IsQ0FBQSxDQXFCSSxNQUFBLENBbkJnQixDQUFBLEVBQTBDLENBQzVEVyxFQUFXLEtBQUssQ0FBQSxDQUVoQixJQUFNSyxDQUFBQSxDQUFVVCxDQUFBQSxDQUFhLENBQUEsQ0FBRSxNQUFBLENBQU8sS0FBSyxFQUMzQ00sQ0FBQUEsQ0FBU1YsQ0FBQUEsQ0FBY2EsQ0FBTyxDQUFDLEVBQy9CakIsQ0FBQUEsR0FBUyxDQUFDLEVBQ1osQ0FBQSxDQWNJLFNBQVVQLENBQUFBLENBQ1YsUUFBQSxDQUFVQyxDQUFBQSxDQUNWLFdBQUEsQ0FBYUMsRUFDYixTQUFBLENBQVUsU0FBQSxDQUNWLFlBQUEsQ0FBYSxLQUFBLENBQ2IsVUFBV3VCLG1CQUFBQSxDQUFHLGNBQUEsQ0FBZ0I1QixDQUFTLENBQUEsQ0FDdEMsR0FBR1ksQ0FBQUEsQ0FDTixDQUVKLENBQ0YsRUFFQWhCLEVBQWMsV0FBQSxDQUFjLGVBQUEiLCJmaWxlIjoiaW5kZXguY2pzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBjbiB9IGZyb20gJy4uL2xpYi9jbi5qcydcblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG4vKiAgVHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuZXhwb3J0IGludGVyZmFjZSBJbnB1dEN1cnJlbmN5UHJvcHNcbiAgZXh0ZW5kcyBPbWl0PFJlYWN0LklucHV0SFRNTEF0dHJpYnV0ZXM8SFRNTElucHV0RWxlbWVudD4sICd2YWx1ZScgfCAnb25DaGFuZ2UnIHwgJ3R5cGUnPiB7XG4gIC8qKlxuICAgKiBOdW1lcmljIHZhbHVlIHRvIGRpc3BsYXkuIEFjY2VwdHMgYG51bWJlcmAgb3IgYHN0cmluZ2AgKHRoZSBjb21wb25lbnRcbiAgICogY29lcmNlcyB0byBgTnVtYmVyYCBpbnRlcm5hbGx5KS4gUGFzcyBgdW5kZWZpbmVkYCAvIGBudWxsYCAvIGAnJ2AgZm9yXG4gICAqIGFuIGVtcHR5IGZpZWxkLlxuICAgKi9cbiAgdmFsdWU/OiBudW1iZXIgfCBzdHJpbmcgfCBudWxsXG4gIC8qKlxuICAgKiBDYWxsZWQgd2l0aCBhIHN5bnRoZXRpYyBpbnB1dCBjaGFuZ2UgZXZlbnQuIGBlLnRhcmdldC52YWx1ZWAgaXNcbiAgICogcmVwbGFjZWQgYnkgdGhlIHBhcnNlZCBudW1lcmljIHZhbHVlIOKAlCBhIGBudW1iZXJgIHdoZW4gdGhlIGlucHV0XG4gICAqIGhvbGRzIGEgdmFsaWQgZmlndXJlLCBvciBgJydgIHdoZW4gdGhlIGZpZWxkIGlzIGNsZWFyZWQuXG4gICAqIGBlLnRhcmdldC5uYW1lYCBpcyBwcmVzZXJ2ZWQgc28gdGhlIHBhcmVudCBjYW4gaWRlbnRpZnkgdGhlIGZpZWxkLlxuICAgKi9cbiAgb25DaGFuZ2U/OiAoZTogUmVhY3QuQ2hhbmdlRXZlbnQ8SFRNTElucHV0RWxlbWVudD4pID0+IHZvaWRcbiAgLyoqIElTTyA0MjE3IGN1cnJlbmN5IGNvZGUgKGRlZmF1bHQgYCdVR1gnYCkgKi9cbiAgY3VycmVuY3k/OiBzdHJpbmdcbiAgLyoqIEJDUCA0NyBsb2NhbGUgdGFnIGZvciBmb3JtYXR0aW5nIChkZWZhdWx0IGAnZW4tVUcnYCkgKi9cbiAgbG9jYWxlPzogc3RyaW5nXG4gIC8qKlxuICAgKiBOdW1iZXIgb2YgZGVjaW1hbCBwbGFjZXMuXG4gICAqIFVHWCA9IDAsIFVTRCA9IDIsIEpQWSA9IDAsIGV0Yy4gKGRlZmF1bHQgYDBgKVxuICAgKi9cbiAgZGVjaW1hbHM/OiBudW1iZXJcbiAgLyoqXG4gICAqIFdoZW4gYHRydWVgLCBmb3JtYXR0aW5nIG9taXRzIHRoZSBjdXJyZW5jeSBzeW1ib2wgYW5kIG91dHB1dHMgYSBwbGFpblxuICAgKiBsb2NhbGUtZm9ybWF0dGVkIG51bWJlciAoZS5nLiBgJzE1MCwwMDAnYCBpbnN0ZWFkIG9mIGAnVUdYIDE1MCwwMDAnYCkuXG4gICAqIFVzZWZ1bCBmb3Igbm9uLW1vbmV0YXJ5IG51bWVyaWMgaW5wdXRzIHRoYXQgc3RpbGwgYmVuZWZpdCBmcm9tXG4gICAqIHRob3VzYW5kLXNlcGFyYXRvciBmb3JtYXR0aW5nLlxuICAgKi9cbiAgcGxhaW4/OiBib29sZWFuXG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuLyogIElucHV0Q3VycmVuY3kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKlxuICogQ29udHJvbGxlZCBjdXJyZW5jeSBpbnB1dCBmb3IgZmluYW5jaWFsIGZvcm1zLlxuICpcbiAqICoqRGF0YSBjb250cmFjdCoqOiBudW1iZXJzIGluLCBudW1iZXJzIG91dC4gVGhlIGNvbXBvbmVudCBtYW5hZ2VzIGFcbiAqIGxvY2FsZS1mb3JtYXR0ZWQgZGlzcGxheSBpbnRlcm5hbGx5IOKAlCB0aGUgY29uc3VtZXIgbmV2ZXIgc2VlcyBjb21tYXNcbiAqIG9yIGN1cnJlbmN5IHN5bWJvbHMgaW4gaXRzIHN0YXRlLlxuICpcbiAqICoqRWRpdGluZyBVWCoqOiB3aGlsZSB0aGUgZmllbGQgaXMgZm9jdXNlZCwgdGhlIHJhdyBudW1iZXIgaXMgc2hvd24gc29cbiAqIHRoZSB1c2VyIGNhbiB0eXBlIHdpdGhvdXQgY29tbWFzIC8gc3ltYm9scyBmaWdodGluZyB0aGVpciBrZXlzdHJva2VzLlxuICogT24gYmx1ciAob3Igd2hlbiB0aGUgZXh0ZXJuYWwgYHZhbHVlYCBwcm9wIGNoYW5nZXMgZnJvbSBhYm92ZSksIHRoZVxuICogZGlzcGxheSBzbmFwcyBiYWNrIHRvIHRoZSBsb2NhbGUtZm9ybWF0dGVkIHN0cmluZy5cbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gVUdYIOKAlCB6ZXJvIGRlY2ltYWwgcGxhY2VzLCBzeW1ib2wgc2hvd25cbiAqIDxJbnB1dEN1cnJlbmN5XG4gKiAgIHZhbHVlPXsxNTAwMDB9XG4gKiAgIG5hbWU9XCJmZWVcIlxuICogICBvbkNoYW5nZT17KGUpID0+IHNldEZlZShlLnRhcmdldC52YWx1ZSl9XG4gKiAvPlxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBVU0Qgd2l0aCBjZW50c1xuICogPElucHV0Q3VycmVuY3lcbiAqICAgdmFsdWU9ezk5Ljk5fVxuICogICBjdXJyZW5jeT1cIlVTRFwiXG4gKiAgIGxvY2FsZT1cImVuLVVTXCJcbiAqICAgZGVjaW1hbHM9ezJ9XG4gKiAgIG5hbWU9XCJwcmljZVwiXG4gKiAgIG9uQ2hhbmdlPXsoZSkgPT4gc2V0UHJpY2UoZS50YXJnZXQudmFsdWUpfVxuICogLz5cbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gUGxhaW4gbG9jYWxlIG51bWJlciDigJQgbm8gY3VycmVuY3kgc3ltYm9sXG4gKiA8SW5wdXRDdXJyZW5jeVxuICogICB2YWx1ZT17NTAwMDB9XG4gKiAgIHBsYWluXG4gKiAgIG5hbWU9XCJjb3VudFwiXG4gKiAgIG9uQ2hhbmdlPXsoZSkgPT4gc2V0Q291bnQoZS50YXJnZXQudmFsdWUpfVxuICogLz5cbiAqL1xuY29uc3QgSW5wdXRDdXJyZW5jeSA9IFJlYWN0LmZvcndhcmRSZWY8SFRNTElucHV0RWxlbWVudCwgSW5wdXRDdXJyZW5jeVByb3BzPihcbiAgKFxuICAgIHtcbiAgICAgIHZhbHVlLFxuICAgICAgb25DaGFuZ2UsXG4gICAgICBjbGFzc05hbWUsXG4gICAgICBuYW1lLFxuICAgICAgaWQsXG4gICAgICBkaXNhYmxlZCA9IGZhbHNlLFxuICAgICAgcmVhZE9ubHkgPSBmYWxzZSxcbiAgICAgIHBsYWNlaG9sZGVyLFxuICAgICAgY3VycmVuY3kgPSAnVUdYJyxcbiAgICAgIGxvY2FsZSA9ICdlbi1VRycsXG4gICAgICBkZWNpbWFscyA9IDAsXG4gICAgICBwbGFpbiA9IGZhbHNlLFxuICAgICAgb25CbHVyLFxuICAgICAgb25Gb2N1cyxcbiAgICAgIC4uLnJlc3RcbiAgICB9LFxuICAgIHJlZixcbiAgKSA9PiB7XG4gICAgLyogLS0tLSBoZWxwZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbiAgICAvKipcbiAgICAgKiBOdW1iZXIg4oaSIGxvY2FsZS1mb3JtYXR0ZWQgZGlzcGxheSBzdHJpbmcuXG4gICAgICogUmV0dXJucyBgJydgIGZvciBudWxsIC8gdW5kZWZpbmVkIC8gTmFOIHNvIHRoZSBpbnB1dCBzaG93cyB0aGUgcGxhY2Vob2xkZXIuXG4gICAgICovXG4gICAgY29uc3QgZm9ybWF0RGlzcGxheSA9IFJlYWN0LnVzZUNhbGxiYWNrKFxuICAgICAgKHZhbDogbnVtYmVyIHwgc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCk6IHN0cmluZyA9PiB7XG4gICAgICAgIGlmICh2YWwgPT09IG51bGwgfHwgdmFsID09PSB1bmRlZmluZWQgfHwgdmFsID09PSAnJykgcmV0dXJuICcnXG4gICAgICAgIGNvbnN0IG51bSA9IE51bWJlcih2YWwpXG4gICAgICAgIGlmIChOdW1iZXIuaXNOYU4obnVtKSkgcmV0dXJuICcnXG5cbiAgICAgICAgY29uc3QgZnJhY3Rpb25EaWdpdHM6IEludGwuTnVtYmVyRm9ybWF0T3B0aW9ucyA9XG4gICAgICAgICAgZGVjaW1hbHMgPiAwXG4gICAgICAgICAgICA/IHsgbWluaW11bUZyYWN0aW9uRGlnaXRzOiBkZWNpbWFscywgbWF4aW11bUZyYWN0aW9uRGlnaXRzOiBkZWNpbWFscyB9XG4gICAgICAgICAgICA6IHsgbWluaW11bUZyYWN0aW9uRGlnaXRzOiAwLCBtYXhpbXVtRnJhY3Rpb25EaWdpdHM6IDAgfVxuXG4gICAgICAgIHJldHVybiBwbGFpblxuICAgICAgICAgID8gbnVtLnRvTG9jYWxlU3RyaW5nKGxvY2FsZSwgZnJhY3Rpb25EaWdpdHMpXG4gICAgICAgICAgOiBudW0udG9Mb2NhbGVTdHJpbmcobG9jYWxlLCB7IHN0eWxlOiAnY3VycmVuY3knLCBjdXJyZW5jeSwgLi4uZnJhY3Rpb25EaWdpdHMgfSlcbiAgICAgIH0sXG4gICAgICBbY3VycmVuY3ksIGxvY2FsZSwgZGVjaW1hbHMsIHBsYWluXSxcbiAgICApXG5cbiAgICAvKipcbiAgICAgKiBSYXcgaW5wdXQgc3RyaW5nIOKGkiBudW1lcmljIHZhbHVlIChgbnVtYmVyIHwgJydgKS5cbiAgICAgKiBTdHJpcHMgZm9ybWF0dGluZyBjaGFyYWN0ZXJzLCBoYW5kbGVzIGVkZ2UgY2FzZXMgbGlrZSBsb25lIGBcIi5cImAgb3IgYFwiLVwiYC5cbiAgICAgKi9cbiAgICBjb25zdCBwYXJzZU51bWVyaWMgPSBSZWFjdC51c2VDYWxsYmFjayhcbiAgICAgIChyYXc6IHN0cmluZyk6IG51bWJlciB8ICcnID0+IHtcbiAgICAgICAgaWYgKCFyYXcpIHJldHVybiAnJ1xuICAgICAgICAvLyBSZW1vdmUgZXZlcnl0aGluZyBleGNlcHQgZGlnaXRzLCBkZWNpbWFsIHBvaW50LCBhbmQgbGVhZGluZyBtaW51c1xuICAgICAgICBjb25zdCBjbGVhbmVkID0gcmF3LnJlcGxhY2UoL1teMC05LlxcLV0vZywgJycpXG4gICAgICAgIC8vIEd1YXJkIGFnYWluc3QgXCItXCIgYWxvbmVcbiAgICAgICAgaWYgKGNsZWFuZWQgPT09ICctJyB8fCBjbGVhbmVkID09PSAnJykgcmV0dXJuICcnXG4gICAgICAgIC8vIEd1YXJkIGFnYWluc3QgbG9uZSBcIi5cIlxuICAgICAgICBpZiAoY2xlYW5lZCA9PT0gJy4nKSByZXR1cm4gJydcbiAgICAgICAgY29uc3QgbnVtID0gTnVtYmVyKGNsZWFuZWQpXG4gICAgICAgIGlmIChOdW1iZXIuaXNOYU4obnVtKSkgcmV0dXJuICcnXG4gICAgICAgIHJldHVybiBkZWNpbWFscyA9PT0gMCA/IE1hdGgucm91bmQobnVtKSA6IG51bVxuICAgICAgfSxcbiAgICAgIFtkZWNpbWFsc10sXG4gICAgKVxuXG4gICAgLyogLS0tLSBkZXJpdmVkIHN0YXRlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbiAgICBjb25zdCBbZm9jdXNlZCwgc2V0Rm9jdXNlZF0gPSBSZWFjdC51c2VTdGF0ZShmYWxzZSlcblxuICAgIC8vIFRoZSBzdHJpbmcgc2hvd24gaW5zaWRlIHRoZSBgPGlucHV0PmAuIFdoaWxlIHRoZSB1c2VyIGlzIGVkaXRpbmcgd2Ugc2hvd1xuICAgIC8vIHRoZSByYXcgbnVtYmVyIHNvIGNvbW1hcyAvIHN5bWJvbHMgZG9uJ3QgZmlnaHQgdGhlaXIga2V5c3Ryb2tlcy4gV2hlblxuICAgIC8vIHRoZXkgbGVhdmUgdGhlIGZpZWxkIChvciB0aGUgZXh0ZXJuYWwgdmFsdWUgY2hhbmdlcyBmcm9tIGFib3ZlKSB3ZVxuICAgIC8vIHJlZm9ybWF0LlxuICAgIGNvbnN0IFtpbm5lciwgc2V0SW5uZXJdID0gUmVhY3QudXNlU3RhdGU8c3RyaW5nPigoKSA9PiBmb3JtYXREaXNwbGF5KHZhbHVlKSlcblxuICAgIC8vIEtlZXAgdGhlIGRpc3BsYXkgaW4gc3luYyB3aGVuIHRoZSBwYXJlbnQgcHVzaGVzIGEgbmV3IHZhbHVlIHdoaWxlIHRoZVxuICAgIC8vIGZpZWxkIGlzIE5PVCBmb2N1c2VkIChlLmcuIGFmdGVyIGEgc3VjY2Vzc2Z1bCBBUEkgY2FsbCB0aGF0IHJlc2V0cyB0aGVcbiAgICAvLyBmb3JtLCBvciBzd2l0Y2hpbmcgYmV0d2VlbiByZWNvcmRzKS5cbiAgICBjb25zdCBwcmV2VmFsdWVSZWYgPSBSZWFjdC51c2VSZWYodmFsdWUpXG4gICAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICAgIGlmICghZm9jdXNlZCAmJiB2YWx1ZSAhPT0gcHJldlZhbHVlUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgc2V0SW5uZXIoZm9ybWF0RGlzcGxheSh2YWx1ZSkpXG4gICAgICB9XG4gICAgICBwcmV2VmFsdWVSZWYuY3VycmVudCA9IHZhbHVlXG4gICAgfSwgW3ZhbHVlLCBmb2N1c2VkLCBmb3JtYXREaXNwbGF5XSlcblxuICAgIC8qIC0tLS0gZXZlbnQgaGFuZGxlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4gICAgY29uc3QgaGFuZGxlQ2hhbmdlID0gKGU6IFJlYWN0LkNoYW5nZUV2ZW50PEhUTUxJbnB1dEVsZW1lbnQ+KSA9PiB7XG4gICAgICBjb25zdCByYXcgPSBlLnRhcmdldC52YWx1ZVxuICAgICAgc2V0SW5uZXIocmF3KSAvLyBsZXQgdGhlIHVzZXIgc2VlIHdoYXQgdGhleSdyZSB0eXBpbmdcblxuICAgICAgY29uc3QgbnVtZXJpYyA9IHBhcnNlTnVtZXJpYyhyYXcpO1xuICAgICAgKGUudGFyZ2V0IGFzIHVua25vd24gYXMgeyB2YWx1ZTogc3RyaW5nIHwgbnVtYmVyIH0pLnZhbHVlID0gbnVtZXJpY1xuICAgICAgb25DaGFuZ2U/LihlKVxuICAgIH1cblxuICAgIGNvbnN0IGhhbmRsZUZvY3VzID0gKGU6IFJlYWN0LkZvY3VzRXZlbnQ8SFRNTElucHV0RWxlbWVudD4pID0+IHtcbiAgICAgIHNldEZvY3VzZWQodHJ1ZSlcbiAgICAgIC8vIFN3aXRjaCBkaXNwbGF5IHRvIHJhdyBudW1iZXIgc28gdGhlIHVzZXIgY2FuIGVkaXQgd2l0aG91dCBmcmljdGlvblxuICAgICAgaWYgKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09ICcnKSB7XG4gICAgICAgIHNldElubmVyKFN0cmluZyh2YWx1ZSkpXG4gICAgICB9XG4gICAgICBvbkZvY3VzPy4oZSlcbiAgICB9XG5cbiAgICBjb25zdCBoYW5kbGVCbHVyID0gKGU6IFJlYWN0LkZvY3VzRXZlbnQ8SFRNTElucHV0RWxlbWVudD4pID0+IHtcbiAgICAgIHNldEZvY3VzZWQoZmFsc2UpXG4gICAgICAvLyBSZS1mb3JtYXQgYmVmb3JlIHRoZSB1c2VyIHNlZXMgdGhlIGZpZWxkIGFnYWluXG4gICAgICBjb25zdCBudW1lcmljID0gcGFyc2VOdW1lcmljKGUudGFyZ2V0LnZhbHVlKVxuICAgICAgc2V0SW5uZXIoZm9ybWF0RGlzcGxheShudW1lcmljKSlcbiAgICAgIG9uQmx1cj8uKGUpXG4gICAgfVxuXG4gICAgLyogLS0tLSByZW5kZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbiAgICByZXR1cm4gKFxuICAgICAgPGlucHV0XG4gICAgICAgIHJlZj17cmVmfVxuICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgIGlkPXtpZCA/PyBuYW1lfVxuICAgICAgICBuYW1lPXtuYW1lfVxuICAgICAgICB2YWx1ZT17aW5uZXJ9XG4gICAgICAgIG9uQ2hhbmdlPXtoYW5kbGVDaGFuZ2V9XG4gICAgICAgIG9uRm9jdXM9e2hhbmRsZUZvY3VzfVxuICAgICAgICBvbkJsdXI9e2hhbmRsZUJsdXJ9XG4gICAgICAgIGRpc2FibGVkPXtkaXNhYmxlZH1cbiAgICAgICAgcmVhZE9ubHk9e3JlYWRPbmx5fVxuICAgICAgICBwbGFjZWhvbGRlcj17cGxhY2Vob2xkZXJ9XG4gICAgICAgIGlucHV0TW9kZT1cImRlY2ltYWxcIlxuICAgICAgICBhdXRvQ29tcGxldGU9XCJvZmZcIlxuICAgICAgICBjbGFzc05hbWU9e2NuKCdmb3JtLWNvbnRyb2wnLCBjbGFzc05hbWUpfVxuICAgICAgICB7Li4ucmVzdH1cbiAgICAgIC8+XG4gICAgKVxuICB9LFxuKVxuXG5JbnB1dEN1cnJlbmN5LmRpc3BsYXlOYW1lID0gJ0lucHV0Q3VycmVuY3knXG5cbmV4cG9ydCB7IElucHV0Q3VycmVuY3kgfVxuZXhwb3J0IGRlZmF1bHQgSW5wdXRDdXJyZW5jeVxuIl19
|
package/dist/index.d.cts
CHANGED
|
@@ -4,4 +4,80 @@ export { Label, LabelProps } from './Label.cjs';
|
|
|
4
4
|
export { TableLoading, TableLoadingProps } from './TableLoading.cjs';
|
|
5
5
|
export { AutoTextarea, AutoTextareaProps } from './AutoTextarea.cjs';
|
|
6
6
|
export { NavPill, NavPills, NavPillsProps } from './NavPills.cjs';
|
|
7
|
-
|
|
7
|
+
export { AutoDisplay, AutoDisplayProps } from './AutoDisplay.cjs';
|
|
8
|
+
import * as React from 'react';
|
|
9
|
+
|
|
10
|
+
interface InputCurrencyProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'value' | 'onChange' | 'type'> {
|
|
11
|
+
/**
|
|
12
|
+
* Numeric value to display. Accepts `number` or `string` (the component
|
|
13
|
+
* coerces to `Number` internally). Pass `undefined` / `null` / `''` for
|
|
14
|
+
* an empty field.
|
|
15
|
+
*/
|
|
16
|
+
value?: number | string | null;
|
|
17
|
+
/**
|
|
18
|
+
* Called with a synthetic input change event. `e.target.value` is
|
|
19
|
+
* replaced by the parsed numeric value — a `number` when the input
|
|
20
|
+
* holds a valid figure, or `''` when the field is cleared.
|
|
21
|
+
* `e.target.name` is preserved so the parent can identify the field.
|
|
22
|
+
*/
|
|
23
|
+
onChange?: (e: React.ChangeEvent<HTMLInputElement>) => void;
|
|
24
|
+
/** ISO 4217 currency code (default `'UGX'`) */
|
|
25
|
+
currency?: string;
|
|
26
|
+
/** BCP 47 locale tag for formatting (default `'en-UG'`) */
|
|
27
|
+
locale?: string;
|
|
28
|
+
/**
|
|
29
|
+
* Number of decimal places.
|
|
30
|
+
* UGX = 0, USD = 2, JPY = 0, etc. (default `0`)
|
|
31
|
+
*/
|
|
32
|
+
decimals?: number;
|
|
33
|
+
/**
|
|
34
|
+
* When `true`, formatting omits the currency symbol and outputs a plain
|
|
35
|
+
* locale-formatted number (e.g. `'150,000'` instead of `'UGX 150,000'`).
|
|
36
|
+
* Useful for non-monetary numeric inputs that still benefit from
|
|
37
|
+
* thousand-separator formatting.
|
|
38
|
+
*/
|
|
39
|
+
plain?: boolean;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Controlled currency input for financial forms.
|
|
43
|
+
*
|
|
44
|
+
* **Data contract**: numbers in, numbers out. The component manages a
|
|
45
|
+
* locale-formatted display internally — the consumer never sees commas
|
|
46
|
+
* or currency symbols in its state.
|
|
47
|
+
*
|
|
48
|
+
* **Editing UX**: while the field is focused, the raw number is shown so
|
|
49
|
+
* the user can type without commas / symbols fighting their keystrokes.
|
|
50
|
+
* On blur (or when the external `value` prop changes from above), the
|
|
51
|
+
* display snaps back to the locale-formatted string.
|
|
52
|
+
*
|
|
53
|
+
* @example
|
|
54
|
+
* // UGX — zero decimal places, symbol shown
|
|
55
|
+
* <InputCurrency
|
|
56
|
+
* value={150000}
|
|
57
|
+
* name="fee"
|
|
58
|
+
* onChange={(e) => setFee(e.target.value)}
|
|
59
|
+
* />
|
|
60
|
+
*
|
|
61
|
+
* @example
|
|
62
|
+
* // USD with cents
|
|
63
|
+
* <InputCurrency
|
|
64
|
+
* value={99.99}
|
|
65
|
+
* currency="USD"
|
|
66
|
+
* locale="en-US"
|
|
67
|
+
* decimals={2}
|
|
68
|
+
* name="price"
|
|
69
|
+
* onChange={(e) => setPrice(e.target.value)}
|
|
70
|
+
* />
|
|
71
|
+
*
|
|
72
|
+
* @example
|
|
73
|
+
* // Plain locale number — no currency symbol
|
|
74
|
+
* <InputCurrency
|
|
75
|
+
* value={50000}
|
|
76
|
+
* plain
|
|
77
|
+
* name="count"
|
|
78
|
+
* onChange={(e) => setCount(e.target.value)}
|
|
79
|
+
* />
|
|
80
|
+
*/
|
|
81
|
+
declare const InputCurrency: React.ForwardRefExoticComponent<InputCurrencyProps & React.RefAttributes<HTMLInputElement>>;
|
|
82
|
+
|
|
83
|
+
export { InputCurrency, type InputCurrencyProps };
|
package/dist/index.d.ts
CHANGED
|
@@ -4,4 +4,80 @@ export { Label, LabelProps } from './Label.js';
|
|
|
4
4
|
export { TableLoading, TableLoadingProps } from './TableLoading.js';
|
|
5
5
|
export { AutoTextarea, AutoTextareaProps } from './AutoTextarea.js';
|
|
6
6
|
export { NavPill, NavPills, NavPillsProps } from './NavPills.js';
|
|
7
|
-
|
|
7
|
+
export { AutoDisplay, AutoDisplayProps } from './AutoDisplay.js';
|
|
8
|
+
import * as React from 'react';
|
|
9
|
+
|
|
10
|
+
interface InputCurrencyProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'value' | 'onChange' | 'type'> {
|
|
11
|
+
/**
|
|
12
|
+
* Numeric value to display. Accepts `number` or `string` (the component
|
|
13
|
+
* coerces to `Number` internally). Pass `undefined` / `null` / `''` for
|
|
14
|
+
* an empty field.
|
|
15
|
+
*/
|
|
16
|
+
value?: number | string | null;
|
|
17
|
+
/**
|
|
18
|
+
* Called with a synthetic input change event. `e.target.value` is
|
|
19
|
+
* replaced by the parsed numeric value — a `number` when the input
|
|
20
|
+
* holds a valid figure, or `''` when the field is cleared.
|
|
21
|
+
* `e.target.name` is preserved so the parent can identify the field.
|
|
22
|
+
*/
|
|
23
|
+
onChange?: (e: React.ChangeEvent<HTMLInputElement>) => void;
|
|
24
|
+
/** ISO 4217 currency code (default `'UGX'`) */
|
|
25
|
+
currency?: string;
|
|
26
|
+
/** BCP 47 locale tag for formatting (default `'en-UG'`) */
|
|
27
|
+
locale?: string;
|
|
28
|
+
/**
|
|
29
|
+
* Number of decimal places.
|
|
30
|
+
* UGX = 0, USD = 2, JPY = 0, etc. (default `0`)
|
|
31
|
+
*/
|
|
32
|
+
decimals?: number;
|
|
33
|
+
/**
|
|
34
|
+
* When `true`, formatting omits the currency symbol and outputs a plain
|
|
35
|
+
* locale-formatted number (e.g. `'150,000'` instead of `'UGX 150,000'`).
|
|
36
|
+
* Useful for non-monetary numeric inputs that still benefit from
|
|
37
|
+
* thousand-separator formatting.
|
|
38
|
+
*/
|
|
39
|
+
plain?: boolean;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Controlled currency input for financial forms.
|
|
43
|
+
*
|
|
44
|
+
* **Data contract**: numbers in, numbers out. The component manages a
|
|
45
|
+
* locale-formatted display internally — the consumer never sees commas
|
|
46
|
+
* or currency symbols in its state.
|
|
47
|
+
*
|
|
48
|
+
* **Editing UX**: while the field is focused, the raw number is shown so
|
|
49
|
+
* the user can type without commas / symbols fighting their keystrokes.
|
|
50
|
+
* On blur (or when the external `value` prop changes from above), the
|
|
51
|
+
* display snaps back to the locale-formatted string.
|
|
52
|
+
*
|
|
53
|
+
* @example
|
|
54
|
+
* // UGX — zero decimal places, symbol shown
|
|
55
|
+
* <InputCurrency
|
|
56
|
+
* value={150000}
|
|
57
|
+
* name="fee"
|
|
58
|
+
* onChange={(e) => setFee(e.target.value)}
|
|
59
|
+
* />
|
|
60
|
+
*
|
|
61
|
+
* @example
|
|
62
|
+
* // USD with cents
|
|
63
|
+
* <InputCurrency
|
|
64
|
+
* value={99.99}
|
|
65
|
+
* currency="USD"
|
|
66
|
+
* locale="en-US"
|
|
67
|
+
* decimals={2}
|
|
68
|
+
* name="price"
|
|
69
|
+
* onChange={(e) => setPrice(e.target.value)}
|
|
70
|
+
* />
|
|
71
|
+
*
|
|
72
|
+
* @example
|
|
73
|
+
* // Plain locale number — no currency symbol
|
|
74
|
+
* <InputCurrency
|
|
75
|
+
* value={50000}
|
|
76
|
+
* plain
|
|
77
|
+
* name="count"
|
|
78
|
+
* onChange={(e) => setCount(e.target.value)}
|
|
79
|
+
* />
|
|
80
|
+
*/
|
|
81
|
+
declare const InputCurrency: React.ForwardRefExoticComponent<InputCurrencyProps & React.RefAttributes<HTMLInputElement>>;
|
|
82
|
+
|
|
83
|
+
export { InputCurrency, type InputCurrencyProps };
|
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export{a as DatePicker}from'./chunk-
|
|
2
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsImZpbGUiOiJpbmRleC5qcyJ9
|
|
1
|
+
export{a as DatePicker}from'./chunk-LWCY2GIT.js';export{a as SearchSelect}from'./chunk-ZCAQ7S2A.js';export{a as Label}from'./chunk-HYB5IGJK.js';export{a as TableLoading}from'./chunk-7LXLWNUR.js';export{a as AutoTextarea}from'./chunk-KKWFIJKN.js';export{a as NavPills}from'./chunk-KVUHNUBG.js';import {a}from'./chunk-RR7TBRGI.js';export{a as AutoDisplay}from'./chunk-2UX7JYM3.js';import*as n from'react';import {jsx}from'react/jsx-runtime';var y=n.forwardRef(({value:r,onChange:b,className:h,name:p,id:C,disabled:P=false,readOnly:I=false,placeholder:N,currency:i="UGX",locale:c="en-UG",decimals:a$1=0,plain:m=false,onBlur:R,onFocus:L,...D},T)=>{let s=n.useCallback(e=>{if(e==null||e==="")return "";let t=Number(e);if(Number.isNaN(t))return "";let o=a$1>0?{minimumFractionDigits:a$1,maximumFractionDigits:a$1}:{minimumFractionDigits:0,maximumFractionDigits:0};return m?t.toLocaleString(c,o):t.toLocaleString(c,{style:"currency",currency:i,...o})},[i,c,a$1,m]),l=n.useCallback(e=>{if(!e)return "";let t=e.replace(/[^0-9.\-]/g,"");if(t==="-"||t===""||t===".")return "";let o=Number(t);return Number.isNaN(o)?"":a$1===0?Math.round(o):o},[a$1]),[f,g]=n.useState(false),[E,u]=n.useState(()=>s(r)),d=n.useRef(r);return n.useEffect(()=>{!f&&r!==d.current&&u(s(r)),d.current=r;},[r,f,s]),jsx("input",{ref:T,type:"text",id:C??p,name:p,value:E,onChange:e=>{let t=e.target.value;u(t);let o=l(t);e.target.value=o,b?.(e);},onFocus:e=>{g(true),r!=null&&r!==""&&u(String(r)),L?.(e);},onBlur:e=>{g(false);let t=l(e.target.value);u(s(t)),R?.(e);},disabled:P,readOnly:I,placeholder:N,inputMode:"decimal",autoComplete:"off",className:a("form-control",h),...D})});y.displayName="InputCurrency";export{y as InputCurrency};//# sourceMappingURL=index.js.map
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9jb21wb25lbnRzL0lucHV0Q3VycmVuY3kudHN4Il0sIm5hbWVzIjpbIklucHV0Q3VycmVuY3kiLCJ2YWx1ZSIsIm9uQ2hhbmdlIiwiY2xhc3NOYW1lIiwibmFtZSIsImlkIiwiZGlzYWJsZWQiLCJyZWFkT25seSIsInBsYWNlaG9sZGVyIiwiY3VycmVuY3kiLCJsb2NhbGUiLCJkZWNpbWFscyIsInBsYWluIiwib25CbHVyIiwib25Gb2N1cyIsInJlc3QiLCJyZWYiLCJmb3JtYXREaXNwbGF5IiwidmFsIiwibnVtIiwiZnJhY3Rpb25EaWdpdHMiLCJwYXJzZU51bWVyaWMiLCJyYXciLCJjbGVhbmVkIiwiZm9jdXNlZCIsInNldEZvY3VzZWQiLCJpbm5lciIsInNldElubmVyIiwicHJldlZhbHVlUmVmIiwianN4IiwibnVtZXJpYyIsImNuIl0sIm1hcHBpbmdzIjoidWJBb0ZBLElBQU1BLENBQUFBLENBQXNCLENBQUEsQ0FBQSxVQUFBLENBQzFCLENBQ0UsQ0FDRSxLQUFBLENBQUFDLENBQUFBLENBQ0EsUUFBQSxDQUFBQyxDQUFBQSxDQUNBLFVBQUFDLENBQUFBLENBQ0EsSUFBQSxDQUFBQyxDQUFBQSxDQUNBLEVBQUEsQ0FBQUMsRUFDQSxRQUFBLENBQUFDLENBQUFBLENBQVcsS0FBQSxDQUNYLFFBQUEsQ0FBQUMsRUFBVyxLQUFBLENBQ1gsV0FBQSxDQUFBQyxDQUFBQSxDQUNBLFFBQUEsQ0FBQUMsRUFBVyxLQUFBLENBQ1gsTUFBQSxDQUFBQyxDQUFBQSxDQUFTLE9BQUEsQ0FDVCxTQUFBQyxHQUFBQSxDQUFXLENBQUEsQ0FDWCxLQUFBLENBQUFDLENBQUFBLENBQVEsS0FBQSxDQUNSLE1BQUEsQ0FBQUMsQ0FBQUEsQ0FDQSxPQUFBLENBQUFDLEVBQ0EsR0FBR0MsQ0FDTCxDQUFBLENBQ0FDLENBQUFBLEdBQ0csQ0FPSCxJQUFNQyxDQUFBQSxDQUFzQixDQUFBLENBQUEsV0FBQSxDQUN6QkMsQ0FBQUEsRUFBb0QsQ0FDbkQsR0FBSUEsQ0FB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QU8xQixDQUFLLENBQUMsQ0FBQSxDQUV4QmEsQ0FBQUEsR0FBVSxDQUFDLEVBQ2IsQ0FBQSxDQXFCSSxNQUFBLENBbkJnQixDQUFBLEVBQTBDLENBQzVEVyxFQUFXLEtBQUssQ0FBQSxDQUVoQixJQUFNSyxDQUFBQSxDQUFVVCxDQUFBQSxDQUFhLENBQUEsQ0FBRSxNQUFBLENBQU8sS0FBSyxFQUMzQ00sQ0FBQUEsQ0FBU1YsQ0FBQUEsQ0FBY2EsQ0FBTyxDQUFDLEVBQy9CakIsQ0FBQUEsR0FBUyxDQUFDLEVBQ1osQ0FBQSxDQWNJLFNBQVVQLENBQUFBLENBQ1YsUUFBQSxDQUFVQyxDQUFBQSxDQUNWLFdBQUEsQ0FBYUMsRUFDYixTQUFBLENBQVUsU0FBQSxDQUNWLFlBQUEsQ0FBYSxLQUFBLENBQ2IsVUFBV3VCLENBQUFBLENBQUcsY0FBQSxDQUFnQjVCLENBQVMsQ0FBQSxDQUN0QyxHQUFHWSxDQUFBQSxDQUNOLENBRUosQ0FDRixFQUVBZixFQUFjLFdBQUEsQ0FBYyxlQUFBIiwiZmlsZSI6ImluZGV4LmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBjbiB9IGZyb20gJy4uL2xpYi9jbi5qcydcblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG4vKiAgVHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuZXhwb3J0IGludGVyZmFjZSBJbnB1dEN1cnJlbmN5UHJvcHNcbiAgZXh0ZW5kcyBPbWl0PFJlYWN0LklucHV0SFRNTEF0dHJpYnV0ZXM8SFRNTElucHV0RWxlbWVudD4sICd2YWx1ZScgfCAnb25DaGFuZ2UnIHwgJ3R5cGUnPiB7XG4gIC8qKlxuICAgKiBOdW1lcmljIHZhbHVlIHRvIGRpc3BsYXkuIEFjY2VwdHMgYG51bWJlcmAgb3IgYHN0cmluZ2AgKHRoZSBjb21wb25lbnRcbiAgICogY29lcmNlcyB0byBgTnVtYmVyYCBpbnRlcm5hbGx5KS4gUGFzcyBgdW5kZWZpbmVkYCAvIGBudWxsYCAvIGAnJ2AgZm9yXG4gICAqIGFuIGVtcHR5IGZpZWxkLlxuICAgKi9cbiAgdmFsdWU/OiBudW1iZXIgfCBzdHJpbmcgfCBudWxsXG4gIC8qKlxuICAgKiBDYWxsZWQgd2l0aCBhIHN5bnRoZXRpYyBpbnB1dCBjaGFuZ2UgZXZlbnQuIGBlLnRhcmdldC52YWx1ZWAgaXNcbiAgICogcmVwbGFjZWQgYnkgdGhlIHBhcnNlZCBudW1lcmljIHZhbHVlIOKAlCBhIGBudW1iZXJgIHdoZW4gdGhlIGlucHV0XG4gICAqIGhvbGRzIGEgdmFsaWQgZmlndXJlLCBvciBgJydgIHdoZW4gdGhlIGZpZWxkIGlzIGNsZWFyZWQuXG4gICAqIGBlLnRhcmdldC5uYW1lYCBpcyBwcmVzZXJ2ZWQgc28gdGhlIHBhcmVudCBjYW4gaWRlbnRpZnkgdGhlIGZpZWxkLlxuICAgKi9cbiAgb25DaGFuZ2U/OiAoZTogUmVhY3QuQ2hhbmdlRXZlbnQ8SFRNTElucHV0RWxlbWVudD4pID0+IHZvaWRcbiAgLyoqIElTTyA0MjE3IGN1cnJlbmN5IGNvZGUgKGRlZmF1bHQgYCdVR1gnYCkgKi9cbiAgY3VycmVuY3k/OiBzdHJpbmdcbiAgLyoqIEJDUCA0NyBsb2NhbGUgdGFnIGZvciBmb3JtYXR0aW5nIChkZWZhdWx0IGAnZW4tVUcnYCkgKi9cbiAgbG9jYWxlPzogc3RyaW5nXG4gIC8qKlxuICAgKiBOdW1iZXIgb2YgZGVjaW1hbCBwbGFjZXMuXG4gICAqIFVHWCA9IDAsIFVTRCA9IDIsIEpQWSA9IDAsIGV0Yy4gKGRlZmF1bHQgYDBgKVxuICAgKi9cbiAgZGVjaW1hbHM/OiBudW1iZXJcbiAgLyoqXG4gICAqIFdoZW4gYHRydWVgLCBmb3JtYXR0aW5nIG9taXRzIHRoZSBjdXJyZW5jeSBzeW1ib2wgYW5kIG91dHB1dHMgYSBwbGFpblxuICAgKiBsb2NhbGUtZm9ybWF0dGVkIG51bWJlciAoZS5nLiBgJzE1MCwwMDAnYCBpbnN0ZWFkIG9mIGAnVUdYIDE1MCwwMDAnYCkuXG4gICAqIFVzZWZ1bCBmb3Igbm9uLW1vbmV0YXJ5IG51bWVyaWMgaW5wdXRzIHRoYXQgc3RpbGwgYmVuZWZpdCBmcm9tXG4gICAqIHRob3VzYW5kLXNlcGFyYXRvciBmb3JtYXR0aW5nLlxuICAgKi9cbiAgcGxhaW4/OiBib29sZWFuXG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuLyogIElucHV0Q3VycmVuY3kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKlxuICogQ29udHJvbGxlZCBjdXJyZW5jeSBpbnB1dCBmb3IgZmluYW5jaWFsIGZvcm1zLlxuICpcbiAqICoqRGF0YSBjb250cmFjdCoqOiBudW1iZXJzIGluLCBudW1iZXJzIG91dC4gVGhlIGNvbXBvbmVudCBtYW5hZ2VzIGFcbiAqIGxvY2FsZS1mb3JtYXR0ZWQgZGlzcGxheSBpbnRlcm5hbGx5IOKAlCB0aGUgY29uc3VtZXIgbmV2ZXIgc2VlcyBjb21tYXNcbiAqIG9yIGN1cnJlbmN5IHN5bWJvbHMgaW4gaXRzIHN0YXRlLlxuICpcbiAqICoqRWRpdGluZyBVWCoqOiB3aGlsZSB0aGUgZmllbGQgaXMgZm9jdXNlZCwgdGhlIHJhdyBudW1iZXIgaXMgc2hvd24gc29cbiAqIHRoZSB1c2VyIGNhbiB0eXBlIHdpdGhvdXQgY29tbWFzIC8gc3ltYm9scyBmaWdodGluZyB0aGVpciBrZXlzdHJva2VzLlxuICogT24gYmx1ciAob3Igd2hlbiB0aGUgZXh0ZXJuYWwgYHZhbHVlYCBwcm9wIGNoYW5nZXMgZnJvbSBhYm92ZSksIHRoZVxuICogZGlzcGxheSBzbmFwcyBiYWNrIHRvIHRoZSBsb2NhbGUtZm9ybWF0dGVkIHN0cmluZy5cbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gVUdYIOKAlCB6ZXJvIGRlY2ltYWwgcGxhY2VzLCBzeW1ib2wgc2hvd25cbiAqIDxJbnB1dEN1cnJlbmN5XG4gKiAgIHZhbHVlPXsxNTAwMDB9XG4gKiAgIG5hbWU9XCJmZWVcIlxuICogICBvbkNoYW5nZT17KGUpID0+IHNldEZlZShlLnRhcmdldC52YWx1ZSl9XG4gKiAvPlxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBVU0Qgd2l0aCBjZW50c1xuICogPElucHV0Q3VycmVuY3lcbiAqICAgdmFsdWU9ezk5Ljk5fVxuICogICBjdXJyZW5jeT1cIlVTRFwiXG4gKiAgIGxvY2FsZT1cImVuLVVTXCJcbiAqICAgZGVjaW1hbHM9ezJ9XG4gKiAgIG5hbWU9XCJwcmljZVwiXG4gKiAgIG9uQ2hhbmdlPXsoZSkgPT4gc2V0UHJpY2UoZS50YXJnZXQudmFsdWUpfVxuICogLz5cbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gUGxhaW4gbG9jYWxlIG51bWJlciDigJQgbm8gY3VycmVuY3kgc3ltYm9sXG4gKiA8SW5wdXRDdXJyZW5jeVxuICogICB2YWx1ZT17NTAwMDB9XG4gKiAgIHBsYWluXG4gKiAgIG5hbWU9XCJjb3VudFwiXG4gKiAgIG9uQ2hhbmdlPXsoZSkgPT4gc2V0Q291bnQoZS50YXJnZXQudmFsdWUpfVxuICogLz5cbiAqL1xuY29uc3QgSW5wdXRDdXJyZW5jeSA9IFJlYWN0LmZvcndhcmRSZWY8SFRNTElucHV0RWxlbWVudCwgSW5wdXRDdXJyZW5jeVByb3BzPihcbiAgKFxuICAgIHtcbiAgICAgIHZhbHVlLFxuICAgICAgb25DaGFuZ2UsXG4gICAgICBjbGFzc05hbWUsXG4gICAgICBuYW1lLFxuICAgICAgaWQsXG4gICAgICBkaXNhYmxlZCA9IGZhbHNlLFxuICAgICAgcmVhZE9ubHkgPSBmYWxzZSxcbiAgICAgIHBsYWNlaG9sZGVyLFxuICAgICAgY3VycmVuY3kgPSAnVUdYJyxcbiAgICAgIGxvY2FsZSA9ICdlbi1VRycsXG4gICAgICBkZWNpbWFscyA9IDAsXG4gICAgICBwbGFpbiA9IGZhbHNlLFxuICAgICAgb25CbHVyLFxuICAgICAgb25Gb2N1cyxcbiAgICAgIC4uLnJlc3RcbiAgICB9LFxuICAgIHJlZixcbiAgKSA9PiB7XG4gICAgLyogLS0tLSBoZWxwZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbiAgICAvKipcbiAgICAgKiBOdW1iZXIg4oaSIGxvY2FsZS1mb3JtYXR0ZWQgZGlzcGxheSBzdHJpbmcuXG4gICAgICogUmV0dXJucyBgJydgIGZvciBudWxsIC8gdW5kZWZpbmVkIC8gTmFOIHNvIHRoZSBpbnB1dCBzaG93cyB0aGUgcGxhY2Vob2xkZXIuXG4gICAgICovXG4gICAgY29uc3QgZm9ybWF0RGlzcGxheSA9IFJlYWN0LnVzZUNhbGxiYWNrKFxuICAgICAgKHZhbDogbnVtYmVyIHwgc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCk6IHN0cmluZyA9PiB7XG4gICAgICAgIGlmICh2YWwgPT09IG51bGwgfHwgdmFsID09PSB1bmRlZmluZWQgfHwgdmFsID09PSAnJykgcmV0dXJuICcnXG4gICAgICAgIGNvbnN0IG51bSA9IE51bWJlcih2YWwpXG4gICAgICAgIGlmIChOdW1iZXIuaXNOYU4obnVtKSkgcmV0dXJuICcnXG5cbiAgICAgICAgY29uc3QgZnJhY3Rpb25EaWdpdHM6IEludGwuTnVtYmVyRm9ybWF0T3B0aW9ucyA9XG4gICAgICAgICAgZGVjaW1hbHMgPiAwXG4gICAgICAgICAgICA/IHsgbWluaW11bUZyYWN0aW9uRGlnaXRzOiBkZWNpbWFscywgbWF4aW11bUZyYWN0aW9uRGlnaXRzOiBkZWNpbWFscyB9XG4gICAgICAgICAgICA6IHsgbWluaW11bUZyYWN0aW9uRGlnaXRzOiAwLCBtYXhpbXVtRnJhY3Rpb25EaWdpdHM6IDAgfVxuXG4gICAgICAgIHJldHVybiBwbGFpblxuICAgICAgICAgID8gbnVtLnRvTG9jYWxlU3RyaW5nKGxvY2FsZSwgZnJhY3Rpb25EaWdpdHMpXG4gICAgICAgICAgOiBudW0udG9Mb2NhbGVTdHJpbmcobG9jYWxlLCB7IHN0eWxlOiAnY3VycmVuY3knLCBjdXJyZW5jeSwgLi4uZnJhY3Rpb25EaWdpdHMgfSlcbiAgICAgIH0sXG4gICAgICBbY3VycmVuY3ksIGxvY2FsZSwgZGVjaW1hbHMsIHBsYWluXSxcbiAgICApXG5cbiAgICAvKipcbiAgICAgKiBSYXcgaW5wdXQgc3RyaW5nIOKGkiBudW1lcmljIHZhbHVlIChgbnVtYmVyIHwgJydgKS5cbiAgICAgKiBTdHJpcHMgZm9ybWF0dGluZyBjaGFyYWN0ZXJzLCBoYW5kbGVzIGVkZ2UgY2FzZXMgbGlrZSBsb25lIGBcIi5cImAgb3IgYFwiLVwiYC5cbiAgICAgKi9cbiAgICBjb25zdCBwYXJzZU51bWVyaWMgPSBSZWFjdC51c2VDYWxsYmFjayhcbiAgICAgIChyYXc6IHN0cmluZyk6IG51bWJlciB8ICcnID0+IHtcbiAgICAgICAgaWYgKCFyYXcpIHJldHVybiAnJ1xuICAgICAgICAvLyBSZW1vdmUgZXZlcnl0aGluZyBleGNlcHQgZGlnaXRzLCBkZWNpbWFsIHBvaW50LCBhbmQgbGVhZGluZyBtaW51c1xuICAgICAgICBjb25zdCBjbGVhbmVkID0gcmF3LnJlcGxhY2UoL1teMC05LlxcLV0vZywgJycpXG4gICAgICAgIC8vIEd1YXJkIGFnYWluc3QgXCItXCIgYWxvbmVcbiAgICAgICAgaWYgKGNsZWFuZWQgPT09ICctJyB8fCBjbGVhbmVkID09PSAnJykgcmV0dXJuICcnXG4gICAgICAgIC8vIEd1YXJkIGFnYWluc3QgbG9uZSBcIi5cIlxuICAgICAgICBpZiAoY2xlYW5lZCA9PT0gJy4nKSByZXR1cm4gJydcbiAgICAgICAgY29uc3QgbnVtID0gTnVtYmVyKGNsZWFuZWQpXG4gICAgICAgIGlmIChOdW1iZXIuaXNOYU4obnVtKSkgcmV0dXJuICcnXG4gICAgICAgIHJldHVybiBkZWNpbWFscyA9PT0gMCA/IE1hdGgucm91bmQobnVtKSA6IG51bVxuICAgICAgfSxcbiAgICAgIFtkZWNpbWFsc10sXG4gICAgKVxuXG4gICAgLyogLS0tLSBkZXJpdmVkIHN0YXRlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbiAgICBjb25zdCBbZm9jdXNlZCwgc2V0Rm9jdXNlZF0gPSBSZWFjdC51c2VTdGF0ZShmYWxzZSlcblxuICAgIC8vIFRoZSBzdHJpbmcgc2hvd24gaW5zaWRlIHRoZSBgPGlucHV0PmAuIFdoaWxlIHRoZSB1c2VyIGlzIGVkaXRpbmcgd2Ugc2hvd1xuICAgIC8vIHRoZSByYXcgbnVtYmVyIHNvIGNvbW1hcyAvIHN5bWJvbHMgZG9uJ3QgZmlnaHQgdGhlaXIga2V5c3Ryb2tlcy4gV2hlblxuICAgIC8vIHRoZXkgbGVhdmUgdGhlIGZpZWxkIChvciB0aGUgZXh0ZXJuYWwgdmFsdWUgY2hhbmdlcyBmcm9tIGFib3ZlKSB3ZVxuICAgIC8vIHJlZm9ybWF0LlxuICAgIGNvbnN0IFtpbm5lciwgc2V0SW5uZXJdID0gUmVhY3QudXNlU3RhdGU8c3RyaW5nPigoKSA9PiBmb3JtYXREaXNwbGF5KHZhbHVlKSlcblxuICAgIC8vIEtlZXAgdGhlIGRpc3BsYXkgaW4gc3luYyB3aGVuIHRoZSBwYXJlbnQgcHVzaGVzIGEgbmV3IHZhbHVlIHdoaWxlIHRoZVxuICAgIC8vIGZpZWxkIGlzIE5PVCBmb2N1c2VkIChlLmcuIGFmdGVyIGEgc3VjY2Vzc2Z1bCBBUEkgY2FsbCB0aGF0IHJlc2V0cyB0aGVcbiAgICAvLyBmb3JtLCBvciBzd2l0Y2hpbmcgYmV0d2VlbiByZWNvcmRzKS5cbiAgICBjb25zdCBwcmV2VmFsdWVSZWYgPSBSZWFjdC51c2VSZWYodmFsdWUpXG4gICAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICAgIGlmICghZm9jdXNlZCAmJiB2YWx1ZSAhPT0gcHJldlZhbHVlUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgc2V0SW5uZXIoZm9ybWF0RGlzcGxheSh2YWx1ZSkpXG4gICAgICB9XG4gICAgICBwcmV2VmFsdWVSZWYuY3VycmVudCA9IHZhbHVlXG4gICAgfSwgW3ZhbHVlLCBmb2N1c2VkLCBmb3JtYXREaXNwbGF5XSlcblxuICAgIC8qIC0tLS0gZXZlbnQgaGFuZGxlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4gICAgY29uc3QgaGFuZGxlQ2hhbmdlID0gKGU6IFJlYWN0LkNoYW5nZUV2ZW50PEhUTUxJbnB1dEVsZW1lbnQ+KSA9PiB7XG4gICAgICBjb25zdCByYXcgPSBlLnRhcmdldC52YWx1ZVxuICAgICAgc2V0SW5uZXIocmF3KSAvLyBsZXQgdGhlIHVzZXIgc2VlIHdoYXQgdGhleSdyZSB0eXBpbmdcblxuICAgICAgY29uc3QgbnVtZXJpYyA9IHBhcnNlTnVtZXJpYyhyYXcpO1xuICAgICAgKGUudGFyZ2V0IGFzIHVua25vd24gYXMgeyB2YWx1ZTogc3RyaW5nIHwgbnVtYmVyIH0pLnZhbHVlID0gbnVtZXJpY1xuICAgICAgb25DaGFuZ2U/LihlKVxuICAgIH1cblxuICAgIGNvbnN0IGhhbmRsZUZvY3VzID0gKGU6IFJlYWN0LkZvY3VzRXZlbnQ8SFRNTElucHV0RWxlbWVudD4pID0+IHtcbiAgICAgIHNldEZvY3VzZWQodHJ1ZSlcbiAgICAgIC8vIFN3aXRjaCBkaXNwbGF5IHRvIHJhdyBudW1iZXIgc28gdGhlIHVzZXIgY2FuIGVkaXQgd2l0aG91dCBmcmljdGlvblxuICAgICAgaWYgKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09ICcnKSB7XG4gICAgICAgIHNldElubmVyKFN0cmluZyh2YWx1ZSkpXG4gICAgICB9XG4gICAgICBvbkZvY3VzPy4oZSlcbiAgICB9XG5cbiAgICBjb25zdCBoYW5kbGVCbHVyID0gKGU6IFJlYWN0LkZvY3VzRXZlbnQ8SFRNTElucHV0RWxlbWVudD4pID0+IHtcbiAgICAgIHNldEZvY3VzZWQoZmFsc2UpXG4gICAgICAvLyBSZS1mb3JtYXQgYmVmb3JlIHRoZSB1c2VyIHNlZXMgdGhlIGZpZWxkIGFnYWluXG4gICAgICBjb25zdCBudW1lcmljID0gcGFyc2VOdW1lcmljKGUudGFyZ2V0LnZhbHVlKVxuICAgICAgc2V0SW5uZXIoZm9ybWF0RGlzcGxheShudW1lcmljKSlcbiAgICAgIG9uQmx1cj8uKGUpXG4gICAgfVxuXG4gICAgLyogLS0tLSByZW5kZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbiAgICByZXR1cm4gKFxuICAgICAgPGlucHV0XG4gICAgICAgIHJlZj17cmVmfVxuICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgIGlkPXtpZCA/PyBuYW1lfVxuICAgICAgICBuYW1lPXtuYW1lfVxuICAgICAgICB2YWx1ZT17aW5uZXJ9XG4gICAgICAgIG9uQ2hhbmdlPXtoYW5kbGVDaGFuZ2V9XG4gICAgICAgIG9uRm9jdXM9e2hhbmRsZUZvY3VzfVxuICAgICAgICBvbkJsdXI9e2hhbmRsZUJsdXJ9XG4gICAgICAgIGRpc2FibGVkPXtkaXNhYmxlZH1cbiAgICAgICAgcmVhZE9ubHk9e3JlYWRPbmx5fVxuICAgICAgICBwbGFjZWhvbGRlcj17cGxhY2Vob2xkZXJ9XG4gICAgICAgIGlucHV0TW9kZT1cImRlY2ltYWxcIlxuICAgICAgICBhdXRvQ29tcGxldGU9XCJvZmZcIlxuICAgICAgICBjbGFzc05hbWU9e2NuKCdmb3JtLWNvbnRyb2wnLCBjbGFzc05hbWUpfVxuICAgICAgICB7Li4ucmVzdH1cbiAgICAgIC8+XG4gICAgKVxuICB9LFxuKVxuXG5JbnB1dEN1cnJlbmN5LmRpc3BsYXlOYW1lID0gJ0lucHV0Q3VycmVuY3knXG5cbmV4cG9ydCB7IElucHV0Q3VycmVuY3kgfVxuZXhwb3J0IGRlZmF1bHQgSW5wdXRDdXJyZW5jeVxuIl19
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
# AutoDisplay
|
|
2
|
+
|
|
3
|
+
> A lightweight visibility toggle component that conditionally renders content using CSS `display` instead of unmounting from the DOM.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Import
|
|
8
|
+
|
|
9
|
+
```js
|
|
10
|
+
// Default import (recommended for single-component tree-shaking)
|
|
11
|
+
import AutoDisplay from 'react-bootstrap-plugins/AutoDisplay'
|
|
12
|
+
|
|
13
|
+
// Named import from individual entry point
|
|
14
|
+
import { AutoDisplay } from 'react-bootstrap-plugins/AutoDisplay'
|
|
15
|
+
|
|
16
|
+
// Barrel import
|
|
17
|
+
import { AutoDisplay } from 'react-bootstrap-plugins'
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## Basic Usage
|
|
23
|
+
|
|
24
|
+
```jsx
|
|
25
|
+
import { AutoDisplay } from 'react-bootstrap-plugins'
|
|
26
|
+
|
|
27
|
+
<AutoDisplay visible={showContent}>
|
|
28
|
+
<p>This content is toggled via CSS display.</p>
|
|
29
|
+
</AutoDisplay>
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## Props
|
|
35
|
+
|
|
36
|
+
| Prop | Type | Default | Description |
|
|
37
|
+
|---|---|---|---|
|
|
38
|
+
| `visible` | `boolean` | `false` | When `true`, sets `display: block`; when `false`, sets `display: none` |
|
|
39
|
+
| `className` | `string` | — | Additional CSS classes |
|
|
40
|
+
| `style` | `React.CSSProperties` | — | Inline styles (merged with the display rule) |
|
|
41
|
+
| `children` | `React.ReactNode` | — | Content to show/hide |
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
## Examples
|
|
46
|
+
|
|
47
|
+
### Toggle content visibility
|
|
48
|
+
|
|
49
|
+
```jsx
|
|
50
|
+
const [open, setOpen] = useState(false)
|
|
51
|
+
|
|
52
|
+
<button onClick={() => setOpen(!open)}>Toggle</button>
|
|
53
|
+
<AutoDisplay visible={open}>
|
|
54
|
+
<div className="card card-body mt-2">
|
|
55
|
+
This content stays in the DOM but is hidden via CSS.
|
|
56
|
+
</div>
|
|
57
|
+
</AutoDisplay>
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
### With custom inline styles
|
|
61
|
+
|
|
62
|
+
```jsx
|
|
63
|
+
<AutoDisplay visible style={{ padding: '1rem', border: '1px solid #ddd' }}>
|
|
64
|
+
<p>Styled container that toggles on/off.</p>
|
|
65
|
+
</AutoDisplay>
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
### Preserving form state across toggles
|
|
69
|
+
|
|
70
|
+
Unlike conditional rendering (`{open && <Form />}`), AutoDisplay keeps children mounted so form inputs, scroll positions, and component state are preserved:
|
|
71
|
+
|
|
72
|
+
```jsx
|
|
73
|
+
<AutoDisplay visible={activeTab === 'details'}>
|
|
74
|
+
<input type="text" className="form-control" defaultValue="Preserved value" />
|
|
75
|
+
</AutoDisplay>
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
---
|
|
79
|
+
|
|
80
|
+
## When to Use
|
|
81
|
+
|
|
82
|
+
Use **AutoDisplay** when you need to hide content without losing DOM state:
|
|
83
|
+
|
|
84
|
+
- **Multi-step forms** — preserve filled-in values when switching steps
|
|
85
|
+
- **Tab panels** — keep scroll position and input state across tabs
|
|
86
|
+
- **Animations** — pair with CSS transitions for fade/slide effects
|
|
87
|
+
- **Performance** — avoid re-mounting expensive subtrees
|
|
88
|
+
|
|
89
|
+
For simple conditional rendering where state preservation doesn't matter, plain `{condition && <Content />}` is fine.
|
|
90
|
+
|
|
91
|
+
---
|
|
92
|
+
|
|
93
|
+
## Dark Mode
|
|
94
|
+
|
|
95
|
+
AutoDisplay is a wrapper `<div>` with no built-in styling — it inherits dark mode from any parent with `data-bs-theme="dark"`.
|
|
96
|
+
|
|
97
|
+
---
|
|
98
|
+
|
|
99
|
+
## Bundle Size
|
|
100
|
+
|
|
101
|
+
~0.2 KB (min+gzip).
|
|
102
|
+
|
|
103
|
+
---
|
|
104
|
+
|
|
105
|
+
## See Also
|
|
106
|
+
|
|
107
|
+
- [NavPills](./NAVPILLS.md) — Tab navigation with optional pill styling
|
|
108
|
+
- [TableLoading](./TABLELOADING.md) — Skeleton loading placeholders
|
|
109
|
+
- [Main README](../README.md) — Package overview, installation, and general info
|
package/docs/DATEPICKER.md
CHANGED
|
@@ -49,6 +49,7 @@ function MyForm() {
|
|
|
49
49
|
| Prop | Type | Default | Description |
|
|
50
50
|
|---|---|---|---|
|
|
51
51
|
| `mode` | `'date'` \| `'time'` \| `'datetime'` | `'date'` | Picker mode |
|
|
52
|
+
| `calendar` | `boolean` | `false` | When `true`, renders the calendar inline without an input field or time picker. Ideal for embedding a date picker directly in a form or dashboard. |
|
|
52
53
|
| `value` | `Date` \| `string` \| `null` | — | Currently selected value |
|
|
53
54
|
| `selected` | `Date` \| `null` | — | Alias for `value` |
|
|
54
55
|
| `onChange` | `(e) => void` | — | Synthetic event; `e.target.value` is formatted string, `e.target.name` is the input name |
|
|
@@ -107,6 +108,24 @@ function MyForm() {
|
|
|
107
108
|
// e.target.value → "29/06/2026 02:30 PM"
|
|
108
109
|
```
|
|
109
110
|
|
|
111
|
+
### Inline Calendar mode
|
|
112
|
+
|
|
113
|
+
When `calendar` is `true`, the picker renders as an inline calendar card — no input field, no popover, no time picker. The calendar is always visible, making it ideal for dashboards, date-range selectors, or any layout where you want the calendar embedded directly in the page.
|
|
114
|
+
|
|
115
|
+
```jsx
|
|
116
|
+
<DatePicker
|
|
117
|
+
calendar
|
|
118
|
+
name="eventDate"
|
|
119
|
+
value={eventDate}
|
|
120
|
+
onChange={(e) => setEventDate(e.target.value)}
|
|
121
|
+
minDate={new Date()}
|
|
122
|
+
/>
|
|
123
|
+
// e.target.value → "2026-07-22"
|
|
124
|
+
// Renders as an inline card with the full calendar grid
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
The component applies the `datepicker-calendar-inline` CSS class alongside `card`, `border`, and `shadow-sm` for the wrapper. Any `className` you pass is merged onto the wrapper div.
|
|
128
|
+
|
|
110
129
|
### Linked pickers (start date bounds end date)
|
|
111
130
|
|
|
112
131
|
`minDate`/`maxDate` accept the formatted string another picker emits, so linking two pickers needs no conversion:
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
# InputCurrency
|
|
2
|
+
|
|
3
|
+
> Bootstrap 5 controlled currency input for financial forms. Numbers in, numbers out — the component manages locale-formatted display internally. Zero dependencies.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Import
|
|
8
|
+
|
|
9
|
+
```js
|
|
10
|
+
// Default import (recommended for single-component tree-shaking)
|
|
11
|
+
import InputCurrency from 'react-bootstrap-plugins/InputCurrency'
|
|
12
|
+
|
|
13
|
+
// Named import from individual entry point
|
|
14
|
+
import { InputCurrency } from 'react-bootstrap-plugins/InputCurrency'
|
|
15
|
+
|
|
16
|
+
// Barrel import
|
|
17
|
+
import { InputCurrency } from 'react-bootstrap-plugins'
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## Basic Usage
|
|
23
|
+
|
|
24
|
+
```jsx
|
|
25
|
+
import { useState } from 'react'
|
|
26
|
+
import { InputCurrency } from 'react-bootstrap-plugins'
|
|
27
|
+
|
|
28
|
+
function FeeForm() {
|
|
29
|
+
const [fee, setFee] = useState(150000)
|
|
30
|
+
|
|
31
|
+
return (
|
|
32
|
+
<InputCurrency
|
|
33
|
+
name="fee"
|
|
34
|
+
value={fee}
|
|
35
|
+
onChange={(e) => setFee(e.target.value)}
|
|
36
|
+
placeholder="Enter fee amount"
|
|
37
|
+
/>
|
|
38
|
+
)
|
|
39
|
+
}
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
The input displays `UGX 150,000` but the component state holds `150000` (a number). While focused, the raw number `150000` is shown for frictionless editing. On blur, it snaps back to `UGX 150,000`.
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
## Data Contract
|
|
47
|
+
|
|
48
|
+
| Direction | Type | Example |
|
|
49
|
+
|---|---|---|
|
|
50
|
+
| `value` prop (in) | `number` | `150000` |
|
|
51
|
+
| `onChange` → `e.target.value` (out) | `number \| ''` | `150000` or `''` (when cleared) |
|
|
52
|
+
| Display (internal) | `string` | `"UGX 150,000"` |
|
|
53
|
+
|
|
54
|
+
The parent component never sees commas or currency symbols — it works entirely with numbers.
|
|
55
|
+
|
|
56
|
+
---
|
|
57
|
+
|
|
58
|
+
## Editing UX
|
|
59
|
+
|
|
60
|
+
- **Focused**: raw number shown (`150000`) — no commas or symbols fighting keystrokes
|
|
61
|
+
- **Blurred**: locale-formatted currency (`UGX 150,000`) — clean, readable display
|
|
62
|
+
- **External value change**: if the parent pushes a new `value` while the field is not focused, the display updates immediately (e.g. after a successful API call that resets the form)
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
## Currency & Locale
|
|
67
|
+
|
|
68
|
+
```jsx
|
|
69
|
+
// UGX — zero decimal places (default)
|
|
70
|
+
<InputCurrency value={50000} name="tuition" onChange={handleChange} />
|
|
71
|
+
|
|
72
|
+
// USD with cents
|
|
73
|
+
<InputCurrency
|
|
74
|
+
value={99.99}
|
|
75
|
+
currency="USD"
|
|
76
|
+
locale="en-US"
|
|
77
|
+
decimals={2}
|
|
78
|
+
name="price"
|
|
79
|
+
onChange={handleChange}
|
|
80
|
+
/>
|
|
81
|
+
|
|
82
|
+
// Kenyan Shillings
|
|
83
|
+
<InputCurrency
|
|
84
|
+
value={25000}
|
|
85
|
+
currency="KES"
|
|
86
|
+
locale="en-KE"
|
|
87
|
+
decimals={0}
|
|
88
|
+
name="fee"
|
|
89
|
+
onChange={handleChange}
|
|
90
|
+
/>
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
---
|
|
94
|
+
|
|
95
|
+
## Plain Number Mode
|
|
96
|
+
|
|
97
|
+
When `plain` is `true`, formatting omits the currency symbol and outputs a plain locale-formatted number. Useful for non-monetary numeric inputs that still benefit from thousand-separator formatting:
|
|
98
|
+
|
|
99
|
+
```jsx
|
|
100
|
+
<InputCurrency
|
|
101
|
+
value={50000}
|
|
102
|
+
plain
|
|
103
|
+
name="studentCount"
|
|
104
|
+
onChange={(e) => setCount(e.target.value)}
|
|
105
|
+
placeholder="Number of students"
|
|
106
|
+
/>
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
Displays `150,000` instead of `UGX 150,000`.
|
|
110
|
+
|
|
111
|
+
---
|
|
112
|
+
|
|
113
|
+
## Props
|
|
114
|
+
|
|
115
|
+
Accepts all standard `<input>` props (except `value`, `onChange`, and `type`, which are managed internally), plus:
|
|
116
|
+
|
|
117
|
+
| Prop | Type | Default | Description |
|
|
118
|
+
|---|---|---|---|
|
|
119
|
+
| `value` | `number \| string \| null` | — | Numeric value to display. Pass `undefined`/`null`/`''` for an empty field |
|
|
120
|
+
| `onChange` | `(e: ChangeEvent) => void` | — | Called with a synthetic event where `e.target.value` is the parsed `number` (or `''` when cleared). `e.target.name` is preserved |
|
|
121
|
+
| `currency` | `string` | `'UGX'` | ISO 4217 currency code |
|
|
122
|
+
| `locale` | `string` | `'en-UG'` | BCP 47 locale tag for formatting |
|
|
123
|
+
| `decimals` | `number` | `0` | Number of decimal places. UGX/JYP = 0, USD/EUR = 2, etc. |
|
|
124
|
+
| `plain` | `boolean` | `false` | When `true`, omits the currency symbol and outputs a plain locale-formatted number |
|
|
125
|
+
| `name` | `string` | — | Input name attribute. Accessible in `onChange` via `e.target.name` |
|
|
126
|
+
| `id` | `string` | — | Input id attribute. Falls back to `name` if omitted |
|
|
127
|
+
| `className` | `string` | — | Additional classes merged with `form-control` |
|
|
128
|
+
| `placeholder` | `string` | — | Placeholder text shown when the field is empty |
|
|
129
|
+
| `disabled` | `boolean` | `false` | Disables the input |
|
|
130
|
+
| `readOnly` | `boolean` | `false` | Makes the input read-only |
|
|
131
|
+
| `autoComplete` | `string` | `'off'` | Defaults to `'off'` for financial inputs |
|
|
132
|
+
|
|
133
|
+
A `ref` is forwarded to the underlying `<input>` element.
|
|
134
|
+
|
|
135
|
+
---
|
|
136
|
+
|
|
137
|
+
## Edge Cases Handled
|
|
138
|
+
|
|
139
|
+
| Input | Display | Value |
|
|
140
|
+
|---|---|---|
|
|
141
|
+
| Empty / cleared | Placeholder shown | `''` |
|
|
142
|
+
| `null` / `undefined` | Empty field | `''` |
|
|
143
|
+
| `"150000"` (string) | Formatted currency | `150000` (number) |
|
|
144
|
+
| `"-"` alone | Raw `-` shown while typing | `''` (not emitted) |
|
|
145
|
+
| `"."` alone | Raw `.` shown while typing | `''` (not emitted) |
|
|
146
|
+
| `"abc123"` | `123` while focused → formatted on blur | `123` |
|
|
147
|
+
| Letters only | Empty → formatted to `''` | `''` |
|
|
148
|
+
| Negative numbers | `-50000` → `UGX -50,000` | `-50000` |
|
|
149
|
+
|
|
150
|
+
---
|
|
151
|
+
|
|
152
|
+
## Accessibility
|
|
153
|
+
|
|
154
|
+
- `inputMode="decimal"` — brings up the numeric keypad on mobile
|
|
155
|
+
- `type="text"` — avoids browser number-input quirks (spinners, locale-specific formatting)
|
|
156
|
+
- `autoComplete="off"` — prevents unwanted autofill on financial fields
|
|
157
|
+
- `id` falls back to `name` when omitted — always ensure a label association
|
|
158
|
+
- Ref forwarding for programmatic focus management
|
|
159
|
+
- All standard ARIA attributes spread through via `...rest`
|
|
160
|
+
|
|
161
|
+
---
|
|
162
|
+
|
|
163
|
+
## Dark Mode
|
|
164
|
+
|
|
165
|
+
Uses Bootstrap's `form-control` class, which adapts automatically. Set `data-bs-theme="dark"` on any parent element.
|
|
166
|
+
|
|
167
|
+
---
|
|
168
|
+
|
|
169
|
+
## Bundle Size
|
|
170
|
+
|
|
171
|
+
~0.6 KB (min+gzip).
|
|
172
|
+
|
|
173
|
+
---
|
|
174
|
+
|
|
175
|
+
## See Also
|
|
176
|
+
|
|
177
|
+
- [AutoTextarea](./AUTOTEXTAREA.md) — Auto-resizing textarea
|
|
178
|
+
- [SearchSelect](./SEARCHSELECT.md) — Filterable, searchable select dropdown
|
|
179
|
+
- [Label](./LABEL.md) — Bootstrap-styled form label with required indicator
|
|
180
|
+
- [Main README](../README.md) — Package overview, installation, and general info
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "react-bootstrap-plugins",
|
|
3
|
-
"version": "2.
|
|
4
|
-
"description": "Production-grade Bootstrap 5 UI plugins for React — DatePicker, SearchSelect, Label, TableLoading, and more. Zero runtime dependencies beyond React.",
|
|
3
|
+
"version": "2.4.0",
|
|
4
|
+
"description": "Production-grade Bootstrap 5 UI plugins for React — DatePicker, SearchSelect, Label, TableLoading, InputCurrency, and more. Zero runtime dependencies beyond React.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": {
|
|
7
7
|
"name": "Tumwesigye Robert",
|
|
@@ -72,6 +72,26 @@
|
|
|
72
72
|
"default": "./dist/AutoTextarea.cjs"
|
|
73
73
|
}
|
|
74
74
|
},
|
|
75
|
+
"./AutoDisplay": {
|
|
76
|
+
"import": {
|
|
77
|
+
"types": "./dist/AutoDisplay.d.ts",
|
|
78
|
+
"default": "./dist/AutoDisplay.js"
|
|
79
|
+
},
|
|
80
|
+
"require": {
|
|
81
|
+
"types": "./dist/AutoDisplay.d.ts",
|
|
82
|
+
"default": "./dist/AutoDisplay.cjs"
|
|
83
|
+
}
|
|
84
|
+
},
|
|
85
|
+
"./InputCurrency": {
|
|
86
|
+
"import": {
|
|
87
|
+
"types": "./dist/InputCurrency.d.ts",
|
|
88
|
+
"default": "./dist/InputCurrency.js"
|
|
89
|
+
},
|
|
90
|
+
"require": {
|
|
91
|
+
"types": "./dist/InputCurrency.d.ts",
|
|
92
|
+
"default": "./dist/InputCurrency.cjs"
|
|
93
|
+
}
|
|
94
|
+
},
|
|
75
95
|
"./NavPills": {
|
|
76
96
|
"import": {
|
|
77
97
|
"types": "./dist/NavPills.d.ts",
|
|
@@ -107,7 +127,7 @@
|
|
|
107
127
|
"prepublishOnly": "pnpm run build",
|
|
108
128
|
"lint": "echo 'Lint passed'",
|
|
109
129
|
"test": "echo 'Tests passed'",
|
|
110
|
-
"push
|
|
130
|
+
"push": "npm publish --no-git-checks"
|
|
111
131
|
},
|
|
112
132
|
"keywords": [
|
|
113
133
|
"react",
|
|
@@ -131,7 +151,12 @@
|
|
|
131
151
|
"react-bootstrap",
|
|
132
152
|
"form-controls",
|
|
133
153
|
"tree-shakeable",
|
|
134
|
-
"zero-dependencies"
|
|
154
|
+
"zero-dependencies",
|
|
155
|
+
"input-currency",
|
|
156
|
+
"currency-input",
|
|
157
|
+
"currency-formatter",
|
|
158
|
+
"number-input",
|
|
159
|
+
"financial-input"
|
|
135
160
|
],
|
|
136
161
|
"repository": {
|
|
137
162
|
"type": "git",
|