@retriever-ui/system
Version:
89 lines (88 loc) • 3.06 kB
JavaScript
;
var __assign = (this && this.__assign) || function () {
__assign = Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
var css_1 = require("@emotion/css");
var react_1 = require("@emotion/react");
var theme_1 = require("@retriever-ui/theme");
var lodash_1 = __importDefault(require("lodash"));
var react_2 = __importDefault(require("react"));
var _1 = require(".");
var getDomProps_1 = __importDefault(require("./utils/getDomProps"));
var tags_1 = require("./utils/tags");
/**
* > The retrieverFactory work to create retriever elements with styled props.
*
* exemple:
* ```tsx
* const ComponentDiv = retrieverFactory('div')
*
* const App = () => {
* return (
* <ComponentDiv bg="primary.400">...something</ComponentDiv>
* )
* }
* ```
*/
var retrieverFactory = function (element) {
return react_2.default.forwardRef(function (props, ref) {
// get all valid dom properties.
var domProps = (0, getDomProps_1.default)(element, props).domProps;
// get theme from provider to use with styled props.
var theme = (0, react_1.useTheme)();
// If dont have theme will be pass a default theme
if (lodash_1.default.isEmpty(theme)) {
theme = theme_1.lightTheme;
}
var classe = (0, _1.styles)(__assign({ theme: theme }, props));
classe.name = "retriever-" + classe.name;
// valid if have property `as`, this property will change the dom element selected my element argument.
if (props === null || props === void 0 ? void 0 : props.as) {
return react_2.default.createElement(props.as, __assign(__assign({ className: (0, css_1.css)(classe) }, domProps), { ref: ref }));
}
return react_2.default.createElement(element, __assign(__assign({ className: (0, css_1.css)(classe) }, domProps), { ref: ref }));
});
};
/**
* retriever object is a abstraction of retrieverFactory to use syntax friendly.
*
* This factory have a lot of properties to use, check the documentation to more details.
*
* This line has creating this object.
* retriever = {
* div: retrieverFactory('div'),
* ...
* }
*
* exemple:
* ```tsx
* const ComponentDiv = retriever.div
*
* const App = () => {
* return (
* <>
* <ComponentDiv bg="primary.400">something...</ComponentDiv>
* // or
* <retriever.div bg="secondary.400">...another way</retriever.div>
* </>
* )
* }
* ```
*/
var retriever = {};
tags_1.tags.forEach(function (tag) {
return (retriever[tag] = retrieverFactory(tag));
});
exports.default = retriever;