react-native-uikit-colors
Version:
react native ui kit colors
369 lines (364 loc) • 11.9 kB
JavaScript
import {
__commonJS,
__toESM,
colorVariants,
palette
} from "./chunk-RAMTF5KH.mjs";
// ../../node_modules/.pnpm/lodash.debounce@4.0.8/node_modules/lodash.debounce/index.js
var require_lodash = __commonJS({
"../../node_modules/.pnpm/lodash.debounce@4.0.8/node_modules/lodash.debounce/index.js"(exports, module) {
"use strict";
var FUNC_ERROR_TEXT = "Expected a function";
var NAN = 0 / 0;
var symbolTag = "[object Symbol]";
var reTrim = /^\s+|\s+$/g;
var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
var reIsBinary = /^0b[01]+$/i;
var reIsOctal = /^0o[0-7]+$/i;
var freeParseInt = parseInt;
var freeGlobal = typeof global == "object" && global && global.Object === Object && global;
var freeSelf = typeof self == "object" && self && self.Object === Object && self;
var root = freeGlobal || freeSelf || Function("return this")();
var objectProto = Object.prototype;
var objectToString = objectProto.toString;
var nativeMax = Math.max;
var nativeMin = Math.min;
var now = function() {
return root.Date.now();
};
function debounce2(func, wait, options) {
var lastArgs, lastThis, maxWait, result, timerId, lastCallTime, lastInvokeTime = 0, leading = false, maxing = false, trailing = true;
if (typeof func != "function") {
throw new TypeError(FUNC_ERROR_TEXT);
}
wait = toNumber(wait) || 0;
if (isObject(options)) {
leading = !!options.leading;
maxing = "maxWait" in options;
maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;
trailing = "trailing" in options ? !!options.trailing : trailing;
}
function invokeFunc(time) {
var args = lastArgs, thisArg = lastThis;
lastArgs = lastThis = void 0;
lastInvokeTime = time;
result = func.apply(thisArg, args);
return result;
}
function leadingEdge(time) {
lastInvokeTime = time;
timerId = setTimeout(timerExpired, wait);
return leading ? invokeFunc(time) : result;
}
function remainingWait(time) {
var timeSinceLastCall = time - lastCallTime, timeSinceLastInvoke = time - lastInvokeTime, result2 = wait - timeSinceLastCall;
return maxing ? nativeMin(result2, maxWait - timeSinceLastInvoke) : result2;
}
function shouldInvoke(time) {
var timeSinceLastCall = time - lastCallTime, timeSinceLastInvoke = time - lastInvokeTime;
return lastCallTime === void 0 || timeSinceLastCall >= wait || timeSinceLastCall < 0 || maxing && timeSinceLastInvoke >= maxWait;
}
function timerExpired() {
var time = now();
if (shouldInvoke(time)) {
return trailingEdge(time);
}
timerId = setTimeout(timerExpired, remainingWait(time));
}
function trailingEdge(time) {
timerId = void 0;
if (trailing && lastArgs) {
return invokeFunc(time);
}
lastArgs = lastThis = void 0;
return result;
}
function cancel() {
if (timerId !== void 0) {
clearTimeout(timerId);
}
lastInvokeTime = 0;
lastArgs = lastCallTime = lastThis = timerId = void 0;
}
function flush() {
return timerId === void 0 ? result : trailingEdge(now());
}
function debounced() {
var time = now(), isInvoking = shouldInvoke(time);
lastArgs = arguments;
lastThis = this;
lastCallTime = time;
if (isInvoking) {
if (timerId === void 0) {
return leadingEdge(lastCallTime);
}
if (maxing) {
timerId = setTimeout(timerExpired, wait);
return invokeFunc(lastCallTime);
}
}
if (timerId === void 0) {
timerId = setTimeout(timerExpired, wait);
}
return result;
}
debounced.cancel = cancel;
debounced.flush = flush;
return debounced;
}
function isObject(value) {
var type = typeof value;
return !!value && (type == "object" || type == "function");
}
function isObjectLike(value) {
return !!value && typeof value == "object";
}
function isSymbol(value) {
return typeof value == "symbol" || isObjectLike(value) && objectToString.call(value) == symbolTag;
}
function toNumber(value) {
if (typeof value == "number") {
return value;
}
if (isSymbol(value)) {
return NAN;
}
if (isObject(value)) {
var other = typeof value.valueOf == "function" ? value.valueOf() : value;
value = isObject(other) ? other + "" : other;
}
if (typeof value != "string") {
return value === 0 ? value : +value;
}
value = value.replace(reTrim, "");
var isBinary = reIsBinary.test(value);
return isBinary || reIsOctal.test(value) ? freeParseInt(value.slice(2), isBinary ? 2 : 8) : reIsBadHex.test(value) ? NAN : +value;
}
module.exports = debounce2;
}
});
// src/web.ts
import { useInsertionEffect } from "react";
// ../../node_modules/.pnpm/usehooks-ts@3.1.0_react@19.0.0/node_modules/usehooks-ts/dist/index.js
var import_lodash = __toESM(require_lodash(), 1);
import { useState, useCallback, useLayoutEffect, useEffect, useRef, useMemo } from "react";
var useIsomorphicLayoutEffect = typeof window !== "undefined" ? useLayoutEffect : useEffect;
function useEventListener(eventName, handler, element, options) {
const savedHandler = useRef(handler);
useIsomorphicLayoutEffect(() => {
savedHandler.current = handler;
}, [handler]);
useEffect(() => {
const targetElement = (element == null ? void 0 : element.current) ?? window;
if (!(targetElement && targetElement.addEventListener))
return;
const listener = (event) => {
savedHandler.current(event);
};
targetElement.addEventListener(eventName, listener, options);
return () => {
targetElement.removeEventListener(eventName, listener, options);
};
}, [eventName, element, options]);
}
function useEventCallback(fn) {
const ref = useRef(() => {
throw new Error("Cannot call an event handler while rendering.");
});
useIsomorphicLayoutEffect(() => {
ref.current = fn;
}, [fn]);
return useCallback((...args) => {
var _a;
return (_a = ref.current) == null ? void 0 : _a.call(ref, ...args);
}, [ref]);
}
var IS_SERVER = typeof window === "undefined";
function useLocalStorage(key, initialValue, options = {}) {
const { initializeWithValue = true } = options;
const serializer = useCallback(
(value) => {
if (options.serializer) {
return options.serializer(value);
}
return JSON.stringify(value);
},
[options]
);
const deserializer = useCallback(
(value) => {
if (options.deserializer) {
return options.deserializer(value);
}
if (value === "undefined") {
return void 0;
}
const defaultValue = initialValue instanceof Function ? initialValue() : initialValue;
let parsed;
try {
parsed = JSON.parse(value);
} catch (error) {
console.error("Error parsing JSON:", error);
return defaultValue;
}
return parsed;
},
[options, initialValue]
);
const readValue = useCallback(() => {
const initialValueToUse = initialValue instanceof Function ? initialValue() : initialValue;
if (IS_SERVER) {
return initialValueToUse;
}
try {
const raw = window.localStorage.getItem(key);
return raw ? deserializer(raw) : initialValueToUse;
} catch (error) {
console.warn(`Error reading localStorage key \u201C${key}\u201D:`, error);
return initialValueToUse;
}
}, [initialValue, key, deserializer]);
const [storedValue, setStoredValue] = useState(() => {
if (initializeWithValue) {
return readValue();
}
return initialValue instanceof Function ? initialValue() : initialValue;
});
const setValue = useEventCallback((value) => {
if (IS_SERVER) {
console.warn(
`Tried setting localStorage key \u201C${key}\u201D even though environment is not a client`
);
}
try {
const newValue = value instanceof Function ? value(readValue()) : value;
window.localStorage.setItem(key, serializer(newValue));
setStoredValue(newValue);
window.dispatchEvent(new StorageEvent("local-storage", { key }));
} catch (error) {
console.warn(`Error setting localStorage key \u201C${key}\u201D:`, error);
}
});
const removeValue = useEventCallback(() => {
if (IS_SERVER) {
console.warn(
`Tried removing localStorage key \u201C${key}\u201D even though environment is not a client`
);
}
const defaultValue = initialValue instanceof Function ? initialValue() : initialValue;
window.localStorage.removeItem(key);
setStoredValue(defaultValue);
window.dispatchEvent(new StorageEvent("local-storage", { key }));
});
useEffect(() => {
setStoredValue(readValue());
}, [key]);
const handleStorageChange = useCallback(
(event) => {
if (event.key && event.key !== key) {
return;
}
setStoredValue(readValue());
},
[key, readValue]
);
useEventListener("storage", handleStorageChange);
useEventListener("local-storage", handleStorageChange);
return [storedValue, setValue, removeValue];
}
var IS_SERVER2 = typeof window === "undefined";
function useMediaQuery(query, {
defaultValue = false,
initializeWithValue = true
} = {}) {
const getMatches = (query2) => {
if (IS_SERVER2) {
return defaultValue;
}
return window.matchMedia(query2).matches;
};
const [matches, setMatches] = useState(() => {
if (initializeWithValue) {
return getMatches(query);
}
return defaultValue;
});
function handleChange() {
setMatches(getMatches(query));
}
useIsomorphicLayoutEffect(() => {
const matchMedia = window.matchMedia(query);
handleChange();
if (matchMedia.addListener) {
matchMedia.addListener(handleChange);
} else {
matchMedia.addEventListener("change", handleChange);
}
return () => {
if (matchMedia.removeListener) {
matchMedia.removeListener(handleChange);
} else {
matchMedia.removeEventListener("change", handleChange);
}
};
}, [query]);
return matches;
}
var COLOR_SCHEME_QUERY = "(prefers-color-scheme: dark)";
var LOCAL_STORAGE_KEY = "usehooks-ts-dark-mode";
function useDarkMode(options = {}) {
const {
defaultValue,
localStorageKey = LOCAL_STORAGE_KEY,
initializeWithValue = true
} = options;
const isDarkOS = useMediaQuery(COLOR_SCHEME_QUERY, {
initializeWithValue,
defaultValue
});
const [isDarkMode, setDarkMode] = useLocalStorage(
localStorageKey,
defaultValue ?? isDarkOS ?? false,
{ initializeWithValue }
);
useIsomorphicLayoutEffect(() => {
if (isDarkOS !== isDarkMode) {
setDarkMode(isDarkOS);
}
}, [isDarkOS]);
return {
isDarkMode,
toggle: () => {
setDarkMode((prev) => !prev);
},
enable: () => {
setDarkMode(true);
},
disable: () => {
setDarkMode(false);
},
set: (value) => {
setDarkMode(value);
}
};
}
// src/web.ts
var useCSSInjection = () => {
const isDark = useDarkMode().isDarkMode;
useInsertionEffect(() => {
const style = document.createElement("style");
const vars1 = colorVariants[isDark ? "dark" : "light"];
const vars2 = palette[isDark ? "dark" : "light"];
style.innerHTML = `:root {${[
...Object.entries(vars1),
...Object.entries(vars2)
].map(([key, value]) => `${key}: ${value};`).join("\n")}}`;
document.head.append(style);
return () => {
style.remove();
};
}, [isDark]);
};
export {
useCSSInjection
};