@meonode/ui 0.1.60 → 0.1.62
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/core.node.d.ts +15 -0
- package/dist/core.node.d.ts.map +1 -1
- package/dist/core.node.js +24 -7
- package/dist/hook/useClasses.d.ts +20 -3
- package/dist/hook/useClasses.d.ts.map +1 -1
- package/dist/hook/useClasses.js +82 -29
- package/dist/node.type.d.ts +2 -1
- package/dist/node.type.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/core.node.d.ts
CHANGED
|
@@ -29,6 +29,21 @@ export declare class BaseNode<E extends NodeElement> implements NodeInstance<E>
|
|
|
29
29
|
* @param rawProps Initial props including theme, styles, and children
|
|
30
30
|
*/
|
|
31
31
|
constructor(element: E, rawProps?: RawNodeProps<E>);
|
|
32
|
+
/**
|
|
33
|
+
* Resolves default styles for a given CSSProperties object.
|
|
34
|
+
* This method ensures that certain default styles, such as `minHeight`, `minWidth`,
|
|
35
|
+
* and `flexShrink`, are applied based on the provided style properties.
|
|
36
|
+
*
|
|
37
|
+
* - If the element is a flex container:
|
|
38
|
+
* - Sets `flexShrink` to 0 for specific scenarios:
|
|
39
|
+
* - Column-based layout with wrapping.
|
|
40
|
+
* - Row-based layout without wrapping (default direction is assumed to be 'row').
|
|
41
|
+
* - If the element is not a flex container:
|
|
42
|
+
* - Defaults `flexShrink` to 0.
|
|
43
|
+
* @param style The CSSProperties object containing style definitions.
|
|
44
|
+
* @returns An object with resolved default styles.
|
|
45
|
+
*/
|
|
46
|
+
private _resolveDefaultStyles;
|
|
32
47
|
/**
|
|
33
48
|
* Resolves theme variable references in an object's values recursively.
|
|
34
49
|
* Handles nested objects and prevents circular references.
|
package/dist/core.node.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core.node.d.ts","sourceRoot":"","sources":["../src/core.node.ts"],"names":[],"mappings":"AACA,OAAc,
|
|
1
|
+
{"version":3,"file":"core.node.d.ts","sourceRoot":"","sources":["../src/core.node.ts"],"names":[],"mappings":"AACA,OAAc,EAAsG,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AACjJ,OAAO,KAAK,EAAE,cAAc,EAAyB,WAAW,EAAE,YAAY,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AAGzI,OAAO,EAAc,KAAK,IAAI,IAAI,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAExE;;;;;;;;GAQG;AACH,qBAAa,QAAQ,CAAC,CAAC,SAAS,WAAW,CAAE,YAAW,YAAY,CAAC,CAAC,CAAC;IACrE,+EAA+E;IACxE,OAAO,EAAE,CAAC,CAAA;IAEjB,kFAAkF;IAC3E,QAAQ,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,CAAA;IAEjC,wFAAwF;IACjF,KAAK,EAAE,cAAc,CAAA;IAE5B,OAAO,CAAC,iBAAiB,CAA8B;IACvD,OAAO,CAAC,gBAAgB,CAA4B;IAEpD;;;;;;;;OAQG;gBACS,OAAO,EAAE,CAAC,EAAE,QAAQ,GAAE,YAAY,CAAC,CAAC,CAAM;IA2CtD;;;;;;;;;;;;;OAaG;IACH,OAAO,CAAC,qBAAqB;IAiC7B;;;;;;;OAOG;IACH,OAAO,CAAC,oBAAoB;IAsE5B;;;;;;;;;;OAUG;IACH,OAAO,CAAC,iBAAiB;IAuDzB;;;;;;;;OAQG;IACI,eAAe,CACpB,OAAO,EAAE,WAAW,EACpB,WAAW,CAAC,EAAE,KAAK,EACnB,UAAU,CAAC,EAAE,MAAM,GAClB,WAAW;IAyFd;;;;;;;;;;;;;OAaG;IACH,OAAO,CAAC,eAAe,CAmCtB;IAED;;;;OAIG;IACI,MAAM,IAAI,SAAS;IAsC1B,OAAO,CAAC,2BAA2B;IAsB5B,QAAQ,IAAI,YAAY,GAAG,IAAI;CAsBvC;AAED;;;;;GAKG;AACH,wBAAgB,IAAI,CAAC,CAAC,SAAS,WAAW,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,GAAE,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAM,GAAG,YAAY,CAAC,CAAC,CAAC,CAU1G"}
|
package/dist/core.node.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";var _excluded=["children","nodetheme","theme"],_excluded2=["style"],_excluded3=["children","key"];function _typeof(a){"@babel/helpers - typeof";return _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(a){return typeof a}:function(a){return a&&"function"==typeof Symbol&&a.constructor===Symbol&&a!==Symbol.prototype?"symbol":typeof a},_typeof(a)}function _objectWithoutProperties(a,b){if(null==a)return{};var c,d,e=_objectWithoutPropertiesLoose(a,b);if(Object.getOwnPropertySymbols){var f=Object.getOwnPropertySymbols(a);for(d=0;d<f.length;d++)c=f[d],-1===b.indexOf(c)&&{}.propertyIsEnumerable.call(a,c)&&(e[c]=a[c])}return e}function _objectWithoutPropertiesLoose(a,b){if(null==a)return{};var c={};for(var d in a)if({}.hasOwnProperty.call(a,d)){if(-1!==b.indexOf(d))continue;c[d]=a[d]}return c}function ownKeys(a,b){var c=Object.keys(a);if(Object.getOwnPropertySymbols){var d=Object.getOwnPropertySymbols(a);b&&(d=d.filter(function(b){return Object.getOwnPropertyDescriptor(a,b).enumerable})),c.push.apply(c,d)}return c}function _objectSpread(a){for(var b,c=1;c<arguments.length;c++)b=null==arguments[c]?{}:arguments[c],c%2?ownKeys(Object(b),!0).forEach(function(c){_defineProperty(a,c,b[c])}):Object.getOwnPropertyDescriptors?Object.defineProperties(a,Object.getOwnPropertyDescriptors(b)):ownKeys(Object(b)).forEach(function(c){Object.defineProperty(a,c,Object.getOwnPropertyDescriptor(b,c))});return a}function _classCallCheck(b,a){if(!(b instanceof a))throw new TypeError("Cannot call a class as a function")}function _defineProperties(a,b){for(var c,d=0;d<b.length;d++)c=b[d],c.enumerable=c.enumerable||!1,c.configurable=!0,"value"in c&&(c.writable=!0),Object.defineProperty(a,_toPropertyKey(c.key),c)}function _createClass(a,b,c){return b&&_defineProperties(a.prototype,b),c&&_defineProperties(a,c),Object.defineProperty(a,"prototype",{writable:!1}),a}function _defineProperty(a,b,c){return(b=_toPropertyKey(b))in a?Object.defineProperty(a,b,{value:c,enumerable:!0,configurable:!0,writable:!0}):a[b]=c,a}function _toPropertyKey(a){var b=_toPrimitive(a,"string");return"symbol"==_typeof(b)?b:b+""}function _toPrimitive(a,b){if("object"!=_typeof(a)||!a)return a;var c=a[Symbol.toPrimitive];if(void 0!==c){var d=c.call(a,b||"default");if("object"!=_typeof(d))return d;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===b?String:Number)(a)}import React,{createElement,isValidElement}from"react";import{getComponentType,getCSSProps,getDOMProps,getElementTypeName,getValueByPath}from"./node.helper.js";import{isForwardRef,isMemo,isReactClassComponent,isValidElementType}from"./react-is.helper.js";import{createRoot}from"react-dom/client";/**
|
|
1
|
+
"use strict";var _excluded=["ref","children","nodetheme","theme"],_excluded2=["style"],_excluded3=["children","key"];function _typeof(a){"@babel/helpers - typeof";return _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(a){return typeof a}:function(a){return a&&"function"==typeof Symbol&&a.constructor===Symbol&&a!==Symbol.prototype?"symbol":typeof a},_typeof(a)}function _objectWithoutProperties(a,b){if(null==a)return{};var c,d,e=_objectWithoutPropertiesLoose(a,b);if(Object.getOwnPropertySymbols){var f=Object.getOwnPropertySymbols(a);for(d=0;d<f.length;d++)c=f[d],-1===b.indexOf(c)&&{}.propertyIsEnumerable.call(a,c)&&(e[c]=a[c])}return e}function _objectWithoutPropertiesLoose(a,b){if(null==a)return{};var c={};for(var d in a)if({}.hasOwnProperty.call(a,d)){if(-1!==b.indexOf(d))continue;c[d]=a[d]}return c}function ownKeys(a,b){var c=Object.keys(a);if(Object.getOwnPropertySymbols){var d=Object.getOwnPropertySymbols(a);b&&(d=d.filter(function(b){return Object.getOwnPropertyDescriptor(a,b).enumerable})),c.push.apply(c,d)}return c}function _objectSpread(a){for(var b,c=1;c<arguments.length;c++)b=null==arguments[c]?{}:arguments[c],c%2?ownKeys(Object(b),!0).forEach(function(c){_defineProperty(a,c,b[c])}):Object.getOwnPropertyDescriptors?Object.defineProperties(a,Object.getOwnPropertyDescriptors(b)):ownKeys(Object(b)).forEach(function(c){Object.defineProperty(a,c,Object.getOwnPropertyDescriptor(b,c))});return a}function _classCallCheck(b,a){if(!(b instanceof a))throw new TypeError("Cannot call a class as a function")}function _defineProperties(a,b){for(var c,d=0;d<b.length;d++)c=b[d],c.enumerable=c.enumerable||!1,c.configurable=!0,"value"in c&&(c.writable=!0),Object.defineProperty(a,_toPropertyKey(c.key),c)}function _createClass(a,b,c){return b&&_defineProperties(a.prototype,b),c&&_defineProperties(a,c),Object.defineProperty(a,"prototype",{writable:!1}),a}function _defineProperty(a,b,c){return(b=_toPropertyKey(b))in a?Object.defineProperty(a,b,{value:c,enumerable:!0,configurable:!0,writable:!0}):a[b]=c,a}function _toPropertyKey(a){var b=_toPrimitive(a,"string");return"symbol"==_typeof(b)?b:b+""}function _toPrimitive(a,b){if("object"!=_typeof(a)||!a)return a;var c=a[Symbol.toPrimitive];if(void 0!==c){var d=c.call(a,b||"default");if("object"!=_typeof(d))return d;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===b?String:Number)(a)}import React,{createElement,isValidElement}from"react";import{getComponentType,getCSSProps,getDOMProps,getElementTypeName,getValueByPath}from"./node.helper.js";import{isForwardRef,isMemo,isReactClassComponent,isValidElementType}from"./react-is.helper.js";import{createRoot}from"react-dom/client";/**
|
|
2
2
|
* Represents a node in a React component tree with theme and styling capabilities.
|
|
3
3
|
* This class wraps React elements and handles:
|
|
4
4
|
* - Props processing and normalization
|
|
@@ -19,25 +19,42 @@ if(a instanceof BaseNode){var f;return null!==(f=a.rawProps)&&void 0!==f&&f.node
|
|
|
19
19
|
if(a instanceof React.Component)return a.props.nodetheme||void 0===e?a.render():new BaseNode(a.render(),_objectSpread(_objectSpread({},a.props),{},{nodetheme:e})).render();// Validate element type before returning
|
|
20
20
|
if(!isValidElementType(a)){var g=getComponentType(a);throw new Error("Invalid element type: ".concat(g," provided!"))}// Return valid React elements as-is
|
|
21
21
|
return a}),this.element=a,this.rawProps=c;// Destructure raw props into relevant parts
|
|
22
|
-
var d=c.
|
|
23
|
-
// Extract
|
|
22
|
+
var d=c.ref,e=c.children,f=c.nodetheme,g=c.theme,h=_objectWithoutProperties(c,_excluded),i=g||f,j=this._resolveObjWithTheme(h,i),k=getCSSProps(j),l=this._resolveDefaultStyles(k),m=_objectSpread(_objectSpread(_objectSpread({},l),j.style),k),n=getDOMProps(j),o=void 0;// Resolve any theme variables in the remaining props
|
|
23
|
+
// Extract CSS-related properties from the resolved theme-aware props
|
|
24
|
+
// Resolve default styles based on the processed style properties
|
|
25
|
+
// Merge default styles, resolved theme styles, and processed style properties into final style props
|
|
24
26
|
// Extract remaining props that are valid DOM attributes
|
|
25
27
|
// Process children while maintaining theme inheritance
|
|
26
28
|
// Combine processed props into final normalized form
|
|
27
|
-
|
|
29
|
+
e&&(Array.isArray(e)?o=e.map(function(a,c){return b._processRawNode(a,i,c)}):o=this._processRawNode(e,i)),this.props=_objectSpread(_objectSpread({},n),{},{ref:d,style:m,nodetheme:i,theme:g,children:o})}/**
|
|
30
|
+
* Resolves default styles for a given CSSProperties object.
|
|
31
|
+
* This method ensures that certain default styles, such as `minHeight`, `minWidth`,
|
|
32
|
+
* and `flexShrink`, are applied based on the provided style properties.
|
|
33
|
+
*
|
|
34
|
+
* - If the element is a flex container:
|
|
35
|
+
* - Sets `flexShrink` to 0 for specific scenarios:
|
|
36
|
+
* - Column-based layout with wrapping.
|
|
37
|
+
* - Row-based layout without wrapping (default direction is assumed to be 'row').
|
|
38
|
+
* - If the element is not a flex container:
|
|
39
|
+
* - Defaults `flexShrink` to 0.
|
|
40
|
+
* @param style The CSSProperties object containing style definitions.
|
|
41
|
+
* @returns An object with resolved default styles.
|
|
42
|
+
*/return _createClass(BaseNode,[{key:"_resolveDefaultStyles",value:function _resolveDefaultStyles(a){var b="flex"===a.display,c=!(a.overflow||a.overflowY||a.overflowX),d="wrap"===a.flexFlow||"wrap"===a.flexWrap,e=void 0;if(!b)// If it's not a flex container, default flex-shrink to 0
|
|
43
|
+
e=0;else if(c){var f="column"===a.flexDirection||"column-reverse"===a.flexDirection,g="row"===a.flexDirection||"row-reverse"===a.flexDirection||!a.flexDirection;// Scenario 1: Column-based layout with wrapping
|
|
44
|
+
f&&d?e=0:g&&!d&&(e=0)}return{minHeight:0,minWidth:0,flexShrink:e}}/**
|
|
28
45
|
* Resolves theme variable references in an object's values recursively.
|
|
29
46
|
* Handles nested objects and prevents circular references.
|
|
30
47
|
* Theme variables are referenced using the format "theme.path.to.value".
|
|
31
48
|
* @param obj The object whose values should be resolved against the theme
|
|
32
49
|
* @param theme Optional theme object containing variable definitions
|
|
33
50
|
* @returns A new object with all theme variables resolved to their values
|
|
34
|
-
*/
|
|
51
|
+
*/},{key:"_resolveObjWithTheme",value:function _resolveObjWithTheme(a,b){var c;// Early return if no theme or empty object
|
|
35
52
|
if(!b||0===Object.keys(a).length)return a;// Merge parent theme with current theme
|
|
36
53
|
var d=_objectSpread(_objectSpread({},null===(c=this.rawProps)||void 0===c?void 0:c.nodetheme),b),e=function resolveRecursively(a,b){// Prevent processing same object multiple times
|
|
37
54
|
if(b.has(a))return a;// Track this object to detect circular references
|
|
38
55
|
b.add(a);var c={};for(var f in a)// Skip non-own properties
|
|
39
|
-
if(Object.prototype.hasOwnProperty.call(a,f)){var g=a[f];// Skip private props (starting with _)
|
|
40
|
-
if(f.startsWith("_")||
|
|
56
|
+
if(Object.prototype.hasOwnProperty.call(a,f)){var g=a[f];// Skip private props (starting with _) and HTMLElement instances
|
|
57
|
+
if(f.startsWith("_")||g instanceof HTMLElement){c[f]=g;continue}// Resolve theme variables in string values
|
|
41
58
|
if("string"==typeof g&&g.includes("theme.")){var h=g;h=h.replace(/theme\.([a-zA-Z0-9_.-]+)/g,function(a,b){var c=getValueByPath(d,b);// Only convert string/number theme values
|
|
42
59
|
return void 0!==c&&null!==c?"object"===_typeof(c)&&!Array.isArray(c)&&"default"in c?c["default"]:c:a;// Keep original if no valid theme value found
|
|
43
60
|
}),c[f]=h}// Recursively process nested objects
|
|
@@ -1,12 +1,29 @@
|
|
|
1
|
+
import { type CSSProperties } from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* Retrieves the concatenated CSS string for server-side rendering.
|
|
4
|
+
* @returns {string} The CSS string.
|
|
5
|
+
*/
|
|
1
6
|
export declare function getServerStyles(): string;
|
|
2
7
|
type CSSValue = string | number;
|
|
3
|
-
interface NestedStyle {
|
|
4
|
-
[key: string]: CSSValue | NestedStyle;
|
|
8
|
+
interface NestedStyle extends CSSProperties {
|
|
9
|
+
[key: string]: CSSValue | NestedStyle | undefined;
|
|
5
10
|
}
|
|
6
11
|
interface StyleObject extends NestedStyle {
|
|
7
|
-
[key: string]: CSSValue | StyleObject;
|
|
12
|
+
[key: string]: CSSValue | StyleObject | undefined;
|
|
8
13
|
}
|
|
14
|
+
/**
|
|
15
|
+
* Custom React hook to generate and manage CSS classes from a style object.
|
|
16
|
+
* Supports nesting, pseudo-selectors, and at-rules (@media, @container, @supports).
|
|
17
|
+
* Handles both client-side and server-side rendering.
|
|
18
|
+
* @param {StyleObject} sxObject The style object defining the CSS.
|
|
19
|
+
* @param {any[]} deps Dependencies for memoization, similar to `useEffect` or `useMemo`.
|
|
20
|
+
* @returns {string} The generated CSS class name.
|
|
21
|
+
*/
|
|
9
22
|
export declare function useClasses(sxObject: StyleObject, deps?: any[]): string;
|
|
23
|
+
/**
|
|
24
|
+
* Clears all generated styles and resets the internal state.
|
|
25
|
+
* Useful for development or testing environments to ensure a clean slate.
|
|
26
|
+
*/
|
|
10
27
|
export declare function purgeStyles(): void;
|
|
11
28
|
export {};
|
|
12
29
|
//# sourceMappingURL=useClasses.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useClasses.d.ts","sourceRoot":"","sources":["../../src/hook/useClasses.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"useClasses.d.ts","sourceRoot":"","sources":["../../src/hook/useClasses.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,aAAa,EAAsB,MAAM,OAAO,CAAA;AAM9D;;;GAGG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAExC;AA4BD,KAAK,QAAQ,GAAG,MAAM,GAAG,MAAM,CAAA;AAC/B,UAAU,WAAY,SAAQ,aAAa;IACzC,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ,GAAG,WAAW,GAAG,SAAS,CAAA;CAClD;AACD,UAAU,WAAY,SAAQ,WAAW;IACvC,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ,GAAG,WAAW,GAAG,SAAS,CAAA;CAClD;AA+CD;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,WAAW,EAAE,IAAI,GAAE,GAAG,EAAO,GAAG,MAAM,CA6E1E;AAkKD;;;GAGG;AACH,wBAAgB,WAAW,SAa1B"}
|
package/dist/hook/useClasses.js
CHANGED
|
@@ -1,29 +1,82 @@
|
|
|
1
|
-
function
|
|
2
|
-
var serverStyles=[],serverRuleIndex=0
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
export function
|
|
6
|
-
//
|
|
7
|
-
//
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
function
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
return
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
1
|
+
function _createForOfIteratorHelper(b,c){var d="undefined"!=typeof Symbol&&b[Symbol.iterator]||b["@@iterator"];if(!d){if(Array.isArray(b)||(d=_unsupportedIterableToArray(b))||c&&b&&"number"==typeof b.length){d&&(b=d);var e=0,f=function F(){};return{s:f,n:function n(){return e>=b.length?{done:!0}:{done:!1,value:b[e++]}},e:function e(a){throw a},f:f}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var g,h=!0,i=!1;return{s:function s(){d=d.call(b)},n:function n(){var a=d.next();return h=a.done,a},e:function e(a){i=!0,g=a},f:function f(){try{h||null==d["return"]||d["return"]()}finally{if(i)throw g}}}}function _slicedToArray(a,b){return _arrayWithHoles(a)||_iterableToArrayLimit(a,b)||_unsupportedIterableToArray(a,b)||_nonIterableRest()}function _nonIterableRest(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _iterableToArrayLimit(b,c){var d=null==b?null:"undefined"!=typeof Symbol&&b[Symbol.iterator]||b["@@iterator"];if(null!=d){var g,h,j,k,l=[],a=!0,m=!1;try{if(j=(d=d.call(b)).next,0===c){if(Object(d)!==d)return;a=!1}else for(;!(a=(g=j.call(d)).done)&&(l.push(g.value),l.length!==c);a=!0);}catch(a){m=!0,h=a}finally{try{if(!a&&null!=d["return"]&&(k=d["return"](),Object(k)!==k))return}finally{if(m)throw h}}return l}}function _arrayWithHoles(a){if(Array.isArray(a))return a}function _typeof(a){"@babel/helpers - typeof";return _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(a){return typeof a}:function(a){return a&&"function"==typeof Symbol&&a.constructor===Symbol&&a!==Symbol.prototype?"symbol":typeof a},_typeof(a)}function _toConsumableArray(a){return _arrayWithoutHoles(a)||_iterableToArray(a)||_unsupportedIterableToArray(a)||_nonIterableSpread()}function _nonIterableSpread(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _unsupportedIterableToArray(b,c){if(b){if("string"==typeof b)return _arrayLikeToArray(b,c);var a={}.toString.call(b).slice(8,-1);return"Object"===a&&b.constructor&&(a=b.constructor.name),"Map"===a||"Set"===a?Array.from(b):"Arguments"===a||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(a)?_arrayLikeToArray(b,c):void 0}}function _iterableToArray(a){if("undefined"!=typeof Symbol&&null!=a[Symbol.iterator]||null!=a["@@iterator"])return Array.from(a)}function _arrayWithoutHoles(a){if(Array.isArray(a))return _arrayLikeToArray(a)}function _arrayLikeToArray(b,c){(null==c||c>b.length)&&(c=b.length);for(var d=0,f=Array(c);d<c;d++)f[d]=b[d];return f}import{useEffect,useMemo}from"react";// Manages styles for server-side rendering (SSR)
|
|
2
|
+
var serverStyles=[],serverRuleIndex=0;/**
|
|
3
|
+
* Retrieves the concatenated CSS string for server-side rendering.
|
|
4
|
+
* @returns {string} The CSS string.
|
|
5
|
+
*/export function getServerStyles(){return serverStyles.join("\n")}// Manages styles for client-side rendering
|
|
6
|
+
var styleSheet;if("undefined"!=typeof document){// Ensures a style tag with id '__sx' exists in the document head
|
|
7
|
+
var styleTag=document.head.querySelector("#__sx")||function(){var a=document.createElement("style");return a.id="__sx",document.head.appendChild(a),a}();styleSheet=styleTag.sheet}// Global index for generating unique class names
|
|
8
|
+
var ruleIndex=0,sxCache=new Map,refCountMap=new Map,ruleMap=new Map,unitlessProperties=new Set(["animationIterationCount","borderImageOutset","borderImageSlice","borderImageWidth","boxFlex","boxFlexGroup","boxOrdinalGroup","columnCount","columns","flex","flexGrow","flexPositive","flexShrink","flexNegative","flexOrder","gridRow","gridRowEnd","gridRowSpan","gridRowStart","gridColumn","gridColumnEnd","gridColumnSpan","gridColumnStart","fontWeight","lineClamp","lineHeight","opacity","order","orphans","tabSize","widows","zIndex","zoom","fillOpacity","floodOpacity","stopOpacity","strokeDasharray","strokeDashoffset","strokeMiterlimit","strokeOpacity","strokeWidth"]);// Cache for mapping style objects to generated class names
|
|
9
|
+
// Reference count for each cached style, used for knowing when to remove styles
|
|
10
|
+
// Maps cache keys to the array of CSS rules it generated
|
|
11
|
+
// Type definitions for CSS values and style objects
|
|
12
|
+
// Set of CSS properties that do not require a 'px' unit when their value is a number
|
|
13
|
+
/**
|
|
14
|
+
* Custom React hook to generate and manage CSS classes from a style object.
|
|
15
|
+
* Supports nesting, pseudo-selectors, and at-rules (@media, @container, @supports).
|
|
16
|
+
* Handles both client-side and server-side rendering.
|
|
17
|
+
* @param {StyleObject} sxObject The style object defining the CSS.
|
|
18
|
+
* @param {any[]} deps Dependencies for memoization, similar to `useEffect` or `useMemo`.
|
|
19
|
+
* @returns {string} The generated CSS class name.
|
|
20
|
+
*/export function useClasses(a){var b=1<arguments.length&&void 0!==arguments[1]?arguments[1]:[],c=useMemo(function(){return"".concat(stableStringify(a),"::").concat(stableStringify(b))},[a,b]);// Generates a stable cache key based on the style object and dependencies
|
|
21
|
+
// Manages the reference count for the generated style, cleaning up when no longer used.
|
|
22
|
+
// Returns the cached class name if the style has already been generated
|
|
23
|
+
if(useEffect(function(){// Decrement reference count and clean up styles when component unmounts
|
|
24
|
+
return refCountMap.set(c,(refCountMap.get(c)||0)+1),function(){var a=refCountMap.get(c)||1;1===a?(removeStyleRules(c),sxCache["delete"](c),refCountMap["delete"](c)):refCountMap.set(c,a-1)}},[c]),sxCache.has(c))return sxCache.get(c);// Generates a new unique class name
|
|
25
|
+
var d="sx-".concat(ruleIndex++),e=[],f={},g={},h={},i={};// Stores the generated CSS rules
|
|
26
|
+
// Stores styles directly applicable to the base class or its nested selectors
|
|
27
|
+
// Stores raw style objects for @media rules
|
|
28
|
+
// Stores raw style objects for @container rules
|
|
29
|
+
// Stores raw style objects for @supports rules
|
|
30
|
+
// First pass: Separates top-level styles from at-rules
|
|
31
|
+
for(var j in a){var k=a[j];j.startsWith("@media")?g[j]=k:j.startsWith("@container")?h[j]=k:j.startsWith("@supports")?i[j]=k:f[j]=k}// Collects all rules for the base class and its nested selectors
|
|
32
|
+
// Injects styles based on the rendering environment
|
|
33
|
+
if(e.push.apply(e,_toConsumableArray(collectRules(f,".".concat(d)))),processAtRuleBlocks(g,e,d),processAtRuleBlocks(h,e,d),processAtRuleBlocks(i,e,d),"undefined"==typeof document){// Server-side rendering: stores CSS and returns a server-specific class name
|
|
34
|
+
var l="sx-".concat(serverRuleIndex++),m=e.map(function(a){return a.replace(new RegExp(d,"g"),l)}).join("\n");return serverStyles.push(m),sxCache.set(c,l),l}// Caches the generated rules and class name
|
|
35
|
+
return styleSheet&&// Client-side injection: inserts rules into the stylesheet
|
|
36
|
+
injectStyles(e),ruleMap.set(c,e),sxCache.set(c,d),d}/**
|
|
37
|
+
* Recursively collects CSS rules from a style object.
|
|
38
|
+
* Handles direct properties, nested selectors (prefixed with '&'), and warns about deeply nested at-rules.
|
|
39
|
+
* @param {StyleObject} sxBlock The style object to process.
|
|
40
|
+
* @param {string} currentSelector The current CSS selector context.
|
|
41
|
+
* @returns {string[]} An array of complete CSS rules.
|
|
42
|
+
*/function collectRules(a,b){var c=[],d={};// Stores direct CSS properties for the current selector
|
|
43
|
+
for(var e in a){var f=a[e];if("object"!==_typeof(f)||null===f)d[e]=f;else if(e.startsWith("&")){// Handles nested selectors (e.g., '&:hover', '& span')
|
|
44
|
+
var g=e.replace(/&/g,b);c.push.apply(c,_toConsumableArray(collectRules(f,g)))}else e.startsWith("@")?// Warns about deeply nested at-rules, as they are processed at top-level or directly under the base class.
|
|
45
|
+
console.warn("Nested at-rule found at key \"".concat(e,"\" within selector \"").concat(b,"\". Current implementation processes at-rules at the top level or directly under the base class.")):// Flattens plain nested objects into the current selector's declarations
|
|
46
|
+
Object.assign(d,f)}// Generates the CSS rule for the current selector's direct properties
|
|
47
|
+
var h=toCssDeclarations(d);return h&&c.unshift("".concat(b," { ").concat(h," }")),c}/**
|
|
48
|
+
* Processes at-rule blocks (@media, @container, @supports) and adds their rules to the output.
|
|
49
|
+
* @param {Record<string, StyleObject>} blocksMap A map where keys are at-rules (e.g., '@media (min-width: 768px)') and values are their style objects.
|
|
50
|
+
* @param {string[]} output The array to which generated CSS rules are added.
|
|
51
|
+
* @param {string} baseClassName The base class name to which the at-rule styles apply.
|
|
52
|
+
*/function processAtRuleBlocks(a,b,c){for(var d=0,e=Object.entries(a);d<e.length;d++){var f=_slicedToArray(e[d],2),g=f[0],h=f[1],i=collectRules(h,".".concat(c));// Collects rules for the at-rule's content, using the base class name for context
|
|
53
|
+
i.length&&b.push("".concat(g," { ").concat(i.join(" ")," }"))}}/**
|
|
54
|
+
* Injects an array of CSS rules into the document's stylesheet.
|
|
55
|
+
* @param {string[]} rules An array of complete CSS rule strings.
|
|
56
|
+
*/function injectStyles(a){if(styleSheet){var b,c=_createForOfIteratorHelper(a);try{for(c.s();!(b=c.n()).done;){var d=b.value;try{styleSheet.insertRule(d,styleSheet.cssRules.length)}catch(a){console.error("Failed to insert CSS rule: ".concat(d),a)}}}catch(a){c.e(a)}finally{c.f()}}}/**
|
|
57
|
+
* Removes CSS rules associated with a specific cache key from the stylesheet.
|
|
58
|
+
* @param {string} cacheKey The cache key identifying the rules to remove.
|
|
59
|
+
*/function removeStyleRules(a){var b=ruleMap.get(a);if(b&&styleSheet){// Iterates in reverse to safely delete rules without affecting indices
|
|
60
|
+
for(var c,d=styleSheet.cssRules.length-1;0<=d;d--)c=styleSheet.cssRules[d],b.includes(c.cssText)&&styleSheet.deleteRule(d);ruleMap["delete"](a)}}/**
|
|
61
|
+
* Converts a flat style object into a CSS declaration string (e.g., "prop: value;").
|
|
62
|
+
* Automatically appends 'px' to number values for non-unitless properties.
|
|
63
|
+
* @param {StyleObject} obj The flat style object containing CSS property-value pairs.
|
|
64
|
+
* @returns {string} The CSS declaration string.
|
|
65
|
+
*/function toCssDeclarations(a){var b=[];for(var c in a){var d=a[c];// Warns if a nested object is encountered, as this function expects flat properties.
|
|
66
|
+
if("object"===_typeof(d)&&null!==d){console.warn("toCssDeclarations received a nested object for key \"".concat(c,"\". This function only processes flat CSS property-value pairs."));continue}"number"!=typeof d||isUnitlessProperty(c)?b.push("".concat(camelToKebab(c),": ").concat(d,";")):b.push("".concat(camelToKebab(c),": ").concat(d,"px;"))}return b.join(" ")}/**
|
|
67
|
+
* Checks if a given CSS property is unitless.
|
|
68
|
+
* @param {string} prop The CSS property name (camelCase).
|
|
69
|
+
* @returns {boolean} True if the property is unitless, false otherwise.
|
|
70
|
+
*/function isUnitlessProperty(a){return unitlessProperties.has(a)}/**
|
|
71
|
+
* Generates a stable JSON string representation of an object.
|
|
72
|
+
* Ensures consistent stringification regardless of property order, useful for cache keys.
|
|
73
|
+
* @param {any} obj The object to stringify.
|
|
74
|
+
* @returns {string} The stable JSON string.
|
|
75
|
+
*/function stableStringify(a){if(null===a||"object"!==_typeof(a))return JSON.stringify(a);if(Array.isArray(a))return"[".concat(a.map(stableStringify).join(","),"]");var b=Object.keys(a).sort(),c=b.map(function(b){return"\"".concat(b,"\":").concat(stableStringify(a[b]))});return"{".concat(c.join(","),"}")}/**
|
|
76
|
+
* Converts a camelCase string to kebab-case.
|
|
77
|
+
* @param {string} str The camelCase string.
|
|
78
|
+
* @returns {string} The kebab-case string.
|
|
79
|
+
*/function camelToKebab(a){return a.replace(/([A-Z])([A-Z])/g,"$1-$2").replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase()}/**
|
|
80
|
+
* Clears all generated styles and resets the internal state.
|
|
81
|
+
* Useful for development or testing environments to ensure a clean slate.
|
|
82
|
+
*/export function purgeStyles(){if(styleSheet)for(;0<styleSheet.cssRules.length;)styleSheet.deleteRule(0);serverStyles=[],sxCache.clear(),ruleMap.clear(),refCountMap.clear(),ruleIndex=0,serverRuleIndex=0}
|
package/dist/node.type.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Attributes as ReactAttributes, ComponentProps, CSSProperties, ReactNode, JSX, ElementType, ComponentType, JSXElementConstructor, Component } from 'react';
|
|
1
|
+
import type { Attributes as ReactAttributes, ComponentProps, CSSProperties, ReactNode, JSX, ElementType, ComponentType, JSXElementConstructor, Component, Ref } from 'react';
|
|
2
2
|
import type { Root as ReactDOMRoot } from 'react-dom/client';
|
|
3
3
|
export type NodeElement = ReactNode | Component<any, any> | ElementType | ComponentType<any> | NodeInstance<any> | ((props?: any) => ReactNode | Promise<ReactNode> | Component<any> | NodeInstance<any> | ComponentNode);
|
|
4
4
|
/**
|
|
@@ -51,6 +51,7 @@ export interface Theme {
|
|
|
51
51
|
* @template E - The element type these props apply to
|
|
52
52
|
*/
|
|
53
53
|
export type FinalNodeProps = ReactAttributes & {
|
|
54
|
+
ref?: Ref<unknown>;
|
|
54
55
|
style?: CSSProperties;
|
|
55
56
|
children?: Children | Children[];
|
|
56
57
|
theme?: Theme;
|
package/dist/node.type.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node.type.d.ts","sourceRoot":"","sources":["../src/node.type.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,UAAU,IAAI,eAAe,EAC7B,cAAc,EACd,aAAa,EACb,SAAS,EACT,GAAG,EACH,WAAW,EACX,aAAa,EACb,qBAAqB,EACrB,SAAS,
|
|
1
|
+
{"version":3,"file":"node.type.d.ts","sourceRoot":"","sources":["../src/node.type.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,UAAU,IAAI,eAAe,EAC7B,cAAc,EACd,aAAa,EACb,SAAS,EACT,GAAG,EACH,WAAW,EACX,aAAa,EACb,qBAAqB,EACrB,SAAS,EACT,GAAG,EACJ,MAAM,OAAO,CAAA;AACd,OAAO,KAAK,EAAE,IAAI,IAAI,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAE5D,MAAM,MAAM,WAAW,GACnB,SAAS,GACT,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC,GACnB,WAAW,GACX,aAAa,CAAC,GAAG,CAAC,GAClB,YAAY,CAAC,GAAG,CAAC,GACjB,CAAC,CAAC,KAAK,CAAC,EAAE,GAAG,KAAK,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC,GAAG,CAAC,GAAG,aAAa,CAAC,CAAA;AAE1G;;;;;;GAMG;AACH,MAAM,MAAM,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC,GAAG,CAAC,GAAG,WAAW,GAAG,YAAY,CAAC,GAAG,CAAC,GAAG,aAAa,CAAA;AAEnG;;;;GAIG;AACH,MAAM,WAAW,YAAY,CAAC,CAAC,SAAS,WAAW,GAAG,WAAW;IAC/D,gFAAgF;IAChF,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAA;IAEnB,uFAAuF;IACvF,QAAQ,CAAC,QAAQ,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,CAAA;IAEnC,uEAAuE;IACvE,MAAM,IAAI,SAAS,CAAA;IAEnB,qFAAqF;IACrF,QAAQ,IAAI,YAAY,GAAG,IAAI,CAAA;CAChC;AAED;;;;GAIG;AACH,MAAM,MAAM,OAAO,CAAC,CAAC,SAAS,WAAW,IAAI,CAAC,SAAS,MAAM,GAAG,CAAC,iBAAiB,GAC9E,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,GACxB,CAAC,SAAS,qBAAqB,CAAC,GAAG,CAAC,GAClC,cAAc,CAAC,CAAC,CAAC,GACjB,YAAY,CAAC,CAAC,CAAC,CAAA;AAErB;;;;;;;;GAQG;AACH,MAAM,WAAW,KAAK;IACpB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,GAAG,GAAG,GAAG,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,GAAG,GAAG,CAAC,CAAA;CACvJ;AAED;;;;;;;GAOG;AACH,MAAM,MAAM,cAAc,GAAG,eAAe,GAAG;IAC7C,GAAG,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,CAAA;IAClB,KAAK,CAAC,EAAE,aAAa,CAAA;IACrB,QAAQ,CAAC,EAAE,QAAQ,GAAG,QAAQ,EAAE,CAAA;IAChC,KAAK,CAAC,EAAE,KAAK,CAAA;IACb,SAAS,CAAC,EAAE,KAAK,CAAA;CAClB,CAAA;AAED;;;;GAIG;AACH,KAAK,yBAAyB,CAAC,CAAC,IAAI,CAAC,SAAS;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC,CAAA;CAAE,GAC7D,CAAC,SAAS,aAAa,GAAG,SAAS,GACjC,IAAI,GACJ,KAAK,GACP,KAAK,CAAA;AAET;;;;;;;GAOG;AACH,MAAM,MAAM,SAAS,CAAC,CAAC,SAAS,WAAW,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,GACzE,eAAe,GACf,CAAC,yBAAyB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,aAAa,EAAE,MAAM,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,GAAG;IACjI,QAAQ,CAAC,EAAE,QAAQ,GAAG,QAAQ,EAAE,CAAA;IAChC,KAAK,CAAC,EAAE,KAAK,CAAA;CACd,CAAA;AAEH;;;;;;GAMG;AACH,MAAM,MAAM,YAAY,CAAC,CAAC,SAAS,WAAW,IAAI,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG;IAAE,SAAS,CAAC,EAAE,KAAK,CAAA;CAAE,CAAA;AAE/F;;;;;;GAMG;AACH,MAAM,WAAW,qBAAqB,CAAC,CAAC,SAAS,WAAW;IAC1D,wDAAwD;IACxD,MAAM,EAAE,CAAC,KAAK,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,KAAK,SAAS,GAAG,YAAY,CAAC,CAAC,CAAC,CAAA;IAE7D,0DAA0D;IAC1D,WAAW,CAAC,EAAE,KAAK,CAAA;IAEnB,yEAAyE;IACzE,SAAS,CAAC,EAAE,MAAM,CAAA;IAElB,cAAc,EAAE,CAAC,IAAI,EAAE,WAAW,EAAE,WAAW,CAAC,EAAE,KAAK,EAAE,UAAU,CAAC,EAAE,MAAM,KAAK,YAAY,CAAC,CAAC,CAAC,CAAA;CACjG;AAED,MAAM,MAAM,aAAa,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,MAAM,YAAY,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,CAAA;AAEnG;;;;GAIG;AACH,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,GAAG;IAC3D,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,WAAW,GAAG,WAAW,EAAE,CAAA;IAEtC,yDAAyD;IACzD,MAAM,EAAE;QACN,wCAAwC;QACxC,OAAO,EAAE,MAAM,IAAI,CAAA;KACpB,CAAA;CACF,CAAA;AAED;;;;GAIG;AACH,MAAM,MAAM,cAAc,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,CAC1D,KAAK,EAAE,CAAC,GAAG;IACT,8DAA8D;IAC9D,QAAQ,CAAC,EACL,YAAY,CAAC,GAAG,CAAC;IAEnB;;;OAGG;OACD,YAAY,CAAC,GAAG,CAAC,EAAE,CAAA;CACxB,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,KAC/B,YAAY,GAAG,IAAI,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@meonode/ui",
|
|
3
3
|
"description": "A structured approach to component composition with built-in theming, prop separation, and dynamic children handling.",
|
|
4
|
-
"version": "0.1.
|
|
4
|
+
"version": "0.1.62",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/main.js",
|
|
7
7
|
"types": "./dist/main.d.ts",
|