@banzamel/mineralui 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs ADDED
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),n=require("react"),q=n.createContext({}),tr={primary:"--mineral-primary",primaryDark:"--mineral-primary-dark",primaryLight:"--mineral-primary-light",dark:"--mineral-dark",darkLight:"--mineral-dark-light",surface:"--mineral-surface",text:"--mineral-text",textSecondary:"--mineral-text-secondary",textHeading:"--mineral-text-heading",border:"--mineral-border",borderHover:"--mineral-border-hover",borderFocus:"--mineral-border-focus",success:"--mineral-success",error:"--mineral-error",warning:"--mineral-warning",info:"--mineral-info",fontFamily:"--mineral-font-family",radiusSm:"--mineral-radius-sm",radiusMd:"--mineral-radius-md",radiusLg:"--mineral-radius-lg"};function sr({theme:a,children:x}){const t=n.useRef(null);return n.useEffect(()=>{if(!t.current)return;const c=t.current;for(const[g,s]of Object.entries(a)){const _=tr[g];_&&s&&c.style.setProperty(_,s)}},[a]),e.jsx(q.Provider,{value:a,children:e.jsx("div",{ref:t,children:x})})}function or(){return n.useContext(q)}function l(...a){return a.filter(Boolean).join(" ")}const ar="_wrapper_1tprv_2",cr="_fullWidth_1tprv_10",ir="_label_1tprv_15",lr="_focused_1tprv_22",dr="_labelError_1tprv_26",ur="_labelSuccess_1tprv_30",_r="_required_1tprv_34",pr="_inputContainer_1tprv_40",mr="_outlined_1tprv_50",vr="_disabled_1tprv_56",fr="_filled_1tprv_66",hr="_underlined_1tprv_82",br="_inputError_1tprv_98",xr="_inputSuccess_1tprv_106",gr="_colorWarning_1tprv_115",jr="_colorInfo_1tprv_120",yr="_sm_1tprv_126",Sr="_md_1tprv_132",Ir="_lg_1tprv_138",Cr="_rounded_1tprv_145",Nr="_input_1tprv_40",kr="_startIcon_1tprv_178",wr="_endIcon_1tprv_186",Er="_clearBtn_1tprv_195",Mr="_spinner_1tprv_214",Rr="_spin_1tprv_214",Wr="_helperText_1tprv_232",Tr="_errorTextMsg_1tprv_238",Or="_charCount_1tprv_245",qr="_charCountOver_1tprv_252",Pr="_bottomRow_1tprv_257",r={wrapper:ar,fullWidth:cr,label:ir,focused:lr,labelError:dr,labelSuccess:ur,required:_r,inputContainer:pr,outlined:mr,disabled:vr,filled:fr,underlined:hr,inputError:br,inputSuccess:xr,colorWarning:gr,colorInfo:jr,sm:yr,md:Sr,lg:Ir,rounded:Cr,input:Nr,startIcon:kr,endIcon:wr,clearBtn:Er,spinner:Mr,spin:Rr,helperText:Wr,errorTextMsg:Tr,charCount:Or,charCountOver:qr,bottomRow:Pr},$r=n.forwardRef(function({type:x="text",value:t,defaultValue:c,name:g,id:s,placeholder:_,disabled:j=!1,readOnly:P=!1,required:I=!1,autoFocus:$=!1,autoComplete:B,variant:H="outlined",size:D="md",color:C,fullWidth:F=!1,rounded:z=!1,label:N,helperText:p,errorText:i,startIcon:k,endIcon:w,clearable:A=!1,error:G=!1,success:E=!1,maxLength:m,showCharCount:M=!1,onChange:v,onFocus:f,onBlur:h,onKeyDown:J,onClear:b,loading:y=!1,className:K,style:L,inputClassName:Q,labelClassName:U},d){const[R,W]=n.useState(!1),[V,T]=n.useState((c==null?void 0:c.toString())??""),O=n.useRef(null),S=t!==void 0?t.toString():V,u=G||!!i,X=S.length>0,Y=n.useCallback(o=>{W(!0),f==null||f(o)},[f]),Z=n.useCallback(o=>{W(!1),h==null||h(o)},[h]),rr=n.useCallback(o=>{t===void 0&&T(o.target.value),v==null||v(o)},[v,t]),er=n.useCallback(()=>{t===void 0&&T(""),b==null||b();const o=(d==null?void 0:d.current)??O.current;o==null||o.focus()},[b,d]),nr=l(r.inputContainer,r[H],r[D],R&&r.focused,u&&r.inputError,E&&!u&&r.inputSuccess,C==="warning"&&r.colorWarning,C==="info"&&r.colorInfo,j&&r.disabled,z&&r.rounded);return e.jsxs("div",{className:l(r.wrapper,F&&r.fullWidth,K),style:L,children:[N&&e.jsx("label",{htmlFor:s,className:l(r.label,R&&r.focused,u&&r.labelError,E&&!u&&r.labelSuccess,I&&r.required,U),children:N}),e.jsxs("div",{className:nr,children:[k&&e.jsx("span",{className:r.startIcon,children:k}),e.jsx("input",{ref:d??O,type:x,value:t,defaultValue:t===void 0?c:void 0,name:g,id:s,placeholder:_,disabled:j,readOnly:P,required:I,autoFocus:$,autoComplete:B,maxLength:m,className:l(r.input,Q),onChange:rr,onFocus:Y,onBlur:Z,onKeyDown:J,"aria-invalid":u||void 0,"aria-describedby":i?`${s}-error`:p?`${s}-helper`:void 0}),y&&e.jsx("span",{className:r.spinner}),A&&X&&!y&&!j&&e.jsx("button",{type:"button",className:r.clearBtn,onClick:er,tabIndex:-1,"aria-label":"Clear input",children:"✕"}),w&&!y&&e.jsx("span",{className:r.endIcon,children:w})]}),(i||p||M)&&e.jsxs("div",{className:r.bottomRow,children:[e.jsxs("span",{children:[i&&e.jsx("span",{id:s?`${s}-error`:void 0,className:r.errorTextMsg,role:"alert",children:i}),!i&&p&&e.jsx("span",{id:s?`${s}-helper`:void 0,className:r.helperText,children:p})]}),M&&m&&e.jsxs("span",{className:l(r.charCount,S.length>m&&r.charCountOver),children:[S.length,"/",m]})]})]})});exports.Input=$r;exports.MineralThemeProvider=sr;exports.cn=l;exports.useTheme=or;
2
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","sources":["../src/theme/ThemeProvider.tsx","../src/utils/cn.ts","../src/components/Input/Input.tsx"],"sourcesContent":["import { createContext, useContext, useEffect, useRef, type ReactNode } from 'react';\nimport type { MineralTheme } from './types';\n\nconst ThemeContext = createContext<MineralTheme>({});\n\nconst themeToVarMap: Record<keyof MineralTheme, string> = {\n primary: '--mineral-primary',\n primaryDark: '--mineral-primary-dark',\n primaryLight: '--mineral-primary-light',\n dark: '--mineral-dark',\n darkLight: '--mineral-dark-light',\n surface: '--mineral-surface',\n text: '--mineral-text',\n textSecondary: '--mineral-text-secondary',\n textHeading: '--mineral-text-heading',\n border: '--mineral-border',\n borderHover: '--mineral-border-hover',\n borderFocus: '--mineral-border-focus',\n success: '--mineral-success',\n error: '--mineral-error',\n warning: '--mineral-warning',\n info: '--mineral-info',\n fontFamily: '--mineral-font-family',\n radiusSm: '--mineral-radius-sm',\n radiusMd: '--mineral-radius-md',\n radiusLg: '--mineral-radius-lg',\n};\n\ninterface MineralThemeProviderProps {\n theme: MineralTheme;\n children: ReactNode;\n}\n\nexport function MineralThemeProvider({ theme, children }: MineralThemeProviderProps) {\n const ref = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!ref.current) return;\n const el = ref.current;\n\n for (const [key, value] of Object.entries(theme)) {\n const varName = themeToVarMap[key as keyof MineralTheme];\n if (varName && value) {\n el.style.setProperty(varName, value);\n }\n }\n }, [theme]);\n\n return (\n <ThemeContext.Provider value={theme}>\n <div ref={ref}>{children}</div>\n </ThemeContext.Provider>\n );\n}\n\nexport function useTheme(): MineralTheme {\n return useContext(ThemeContext);\n}\n","/**\n * Łączy klasy CSS, odfiltrowując falsy wartości.\n * Lekki zamiennik clsx/classnames — zero dependencies.\n */\nexport function cn(...classes: (string | undefined | null | false)[]): string {\n return classes.filter(Boolean).join(' ');\n}\n","import {useState, useRef, useCallback, forwardRef} from 'react';\nimport type {InputProps} from './Input.types';\nimport {cn} from '../../utils/cn';\nimport styles from './Input.module.css';\n\nexport const Input = forwardRef<HTMLInputElement, InputProps>(function Input(\n {\n type = 'text',\n value,\n defaultValue,\n name,\n id,\n placeholder,\n disabled = false,\n readOnly = false,\n required = false,\n autoFocus = false,\n autoComplete,\n variant = 'outlined',\n size = 'md',\n color,\n fullWidth = false,\n rounded = false,\n label,\n helperText,\n errorText,\n startIcon,\n endIcon,\n clearable = false,\n error = false,\n success = false,\n maxLength,\n showCharCount = false,\n onChange,\n onFocus,\n onBlur,\n onKeyDown,\n onClear,\n loading = false,\n className,\n style,\n inputClassName,\n labelClassName,\n },\n ref,\n) {\n const [focused, setFocused] = useState(false);\n const [internalValue, setInternalValue] = useState(defaultValue?.toString() ?? '');\n const inputRef = useRef<HTMLInputElement>(null);\n\n const currentValue = value !== undefined ? value.toString() : internalValue;\n const hasError = error || !!errorText;\n const hasContent = currentValue.length > 0;\n\n const handleFocus = useCallback(\n (e: React.FocusEvent<HTMLInputElement>) => {\n setFocused(true);\n onFocus?.(e);\n },\n [onFocus],\n );\n\n const handleBlur = useCallback(\n (e: React.FocusEvent<HTMLInputElement>) => {\n setFocused(false);\n onBlur?.(e);\n },\n [onBlur],\n );\n\n const handleChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n if (value === undefined) {\n setInternalValue(e.target.value);\n }\n onChange?.(e);\n },\n [onChange, value],\n );\n\n const handleClear = useCallback(() => {\n if (value === undefined) {\n setInternalValue('');\n }\n onClear?.();\n // Focus input after clear\n const input = (ref as React.RefObject<HTMLInputElement>)?.current ?? inputRef.current;\n input?.focus();\n }, [onClear, ref]);\n\n const containerClasses = cn(\n styles.inputContainer,\n styles[variant],\n styles[size],\n focused && styles.focused,\n hasError && styles.inputError,\n success && !hasError && styles.inputSuccess,\n color === 'warning' && styles.colorWarning,\n color === 'info' && styles.colorInfo,\n disabled && styles.disabled,\n rounded && styles.rounded,\n );\n\n return (\n <div\n className={cn(styles.wrapper, fullWidth && styles.fullWidth, className)}\n style={style}\n >\n {label && (\n <label\n htmlFor={id}\n className={cn(\n styles.label,\n focused && styles.focused,\n hasError && styles.labelError,\n success && !hasError && styles.labelSuccess,\n required && styles.required,\n labelClassName,\n )}\n >\n {label}\n </label>\n )}\n\n <div className={containerClasses}>\n {startIcon && <span className={styles.startIcon}>{startIcon}</span>}\n\n <input\n ref={ref ?? inputRef}\n type={type}\n value={value}\n defaultValue={value === undefined ? defaultValue : undefined}\n name={name}\n id={id}\n placeholder={placeholder}\n disabled={disabled}\n readOnly={readOnly}\n required={required}\n autoFocus={autoFocus}\n autoComplete={autoComplete}\n maxLength={maxLength}\n className={cn(styles.input, inputClassName)}\n onChange={handleChange}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onKeyDown={onKeyDown}\n aria-invalid={hasError || undefined}\n aria-describedby={\n errorText ? `${id}-error` : helperText ? `${id}-helper` : undefined\n }\n />\n\n {loading && <span className={styles.spinner}/>}\n\n {clearable && hasContent && !loading && !disabled && (\n <button\n type=\"button\"\n className={styles.clearBtn}\n onClick={handleClear}\n tabIndex={-1}\n aria-label=\"Clear input\"\n >\n ✕\n </button>\n )}\n\n {endIcon && !loading && <span className={styles.endIcon}>{endIcon}</span>}\n </div>\n\n {(errorText || helperText || showCharCount) && (\n <div className={styles.bottomRow}>\n <span>\n {errorText && (\n <span id={id ? `${id}-error` : undefined} className={styles.errorTextMsg} role=\"alert\">\n {errorText}\n </span>\n )}\n {!errorText && helperText && (\n <span id={id ? `${id}-helper` : undefined} className={styles.helperText}>\n {helperText}\n </span>\n )}\n </span>\n {showCharCount && maxLength && (\n <span\n className={cn(\n styles.charCount,\n currentValue.length > maxLength && styles.charCountOver,\n )}\n >\n {currentValue.length}/{maxLength}\n </span>\n )}\n </div>\n )}\n </div>\n );\n});\n"],"names":["ThemeContext","createContext","themeToVarMap","MineralThemeProvider","theme","children","ref","useRef","useEffect","el","key","value","varName","jsx","useTheme","useContext","cn","classes","Input","forwardRef","type","defaultValue","name","id","placeholder","disabled","readOnly","required","autoFocus","autoComplete","variant","size","color","fullWidth","rounded","label","helperText","errorText","startIcon","endIcon","clearable","error","success","maxLength","showCharCount","onChange","onFocus","onBlur","onKeyDown","onClear","loading","className","style","inputClassName","labelClassName","focused","setFocused","useState","internalValue","setInternalValue","inputRef","currentValue","hasError","hasContent","handleFocus","useCallback","e","handleBlur","handleChange","handleClear","input","containerClasses","styles","jsxs"],"mappings":"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"}
@@ -0,0 +1,95 @@
1
+ import { ChangeEvent } from 'react';
2
+ import { CSSProperties } from 'react';
3
+ import { FocusEvent as FocusEvent_2 } from 'react';
4
+ import { ForwardRefExoticComponent } from 'react';
5
+ import { JSX as JSX_2 } from 'react/jsx-runtime';
6
+ import { KeyboardEvent as KeyboardEvent_2 } from 'react';
7
+ import { ReactNode } from 'react';
8
+ import { RefAttributes } from 'react';
9
+
10
+ /**
11
+ * Łączy klasy CSS, odfiltrowując falsy wartości.
12
+ * Lekki zamiennik clsx/classnames — zero dependencies.
13
+ */
14
+ export declare function cn(...classes: (string | undefined | null | false)[]): string;
15
+
16
+ export declare const Input: ForwardRefExoticComponent<InputProps & RefAttributes<HTMLInputElement>>;
17
+
18
+ export declare interface InputProps {
19
+ type?: 'text' | 'password' | 'email' | 'number' | 'tel' | 'url' | 'search' | 'date' | 'datetime-local' | 'time';
20
+ value?: string | number;
21
+ defaultValue?: string | number;
22
+ name?: string;
23
+ id?: string;
24
+ placeholder?: string;
25
+ disabled?: boolean;
26
+ readOnly?: boolean;
27
+ required?: boolean;
28
+ autoFocus?: boolean;
29
+ autoComplete?: string;
30
+ variant?: InputVariant;
31
+ size?: MineralSize;
32
+ color?: MineralColor;
33
+ fullWidth?: boolean;
34
+ rounded?: boolean;
35
+ label?: string;
36
+ helperText?: string;
37
+ errorText?: string;
38
+ startIcon?: ReactNode;
39
+ endIcon?: ReactNode;
40
+ clearable?: boolean;
41
+ error?: boolean;
42
+ success?: boolean;
43
+ maxLength?: number;
44
+ showCharCount?: boolean;
45
+ onChange?: (e: ChangeEvent<HTMLInputElement>) => void;
46
+ onFocus?: (e: FocusEvent_2<HTMLInputElement>) => void;
47
+ onBlur?: (e: FocusEvent_2<HTMLInputElement>) => void;
48
+ onKeyDown?: (e: KeyboardEvent_2<HTMLInputElement>) => void;
49
+ onClear?: () => void;
50
+ loading?: boolean;
51
+ className?: string;
52
+ style?: CSSProperties;
53
+ inputClassName?: string;
54
+ labelClassName?: string;
55
+ }
56
+
57
+ export declare type InputVariant = 'outlined' | 'filled' | 'underlined';
58
+
59
+ export declare type MineralColor = 'primary' | 'success' | 'error' | 'warning' | 'info';
60
+
61
+ export declare type MineralSize = 'sm' | 'md' | 'lg';
62
+
63
+ export declare interface MineralTheme {
64
+ primary?: string;
65
+ primaryDark?: string;
66
+ primaryLight?: string;
67
+ dark?: string;
68
+ darkLight?: string;
69
+ surface?: string;
70
+ text?: string;
71
+ textSecondary?: string;
72
+ textHeading?: string;
73
+ border?: string;
74
+ borderHover?: string;
75
+ borderFocus?: string;
76
+ success?: string;
77
+ error?: string;
78
+ warning?: string;
79
+ info?: string;
80
+ fontFamily?: string;
81
+ radiusSm?: string;
82
+ radiusMd?: string;
83
+ radiusLg?: string;
84
+ }
85
+
86
+ export declare function MineralThemeProvider({ theme, children }: MineralThemeProviderProps): JSX_2.Element;
87
+
88
+ declare interface MineralThemeProviderProps {
89
+ theme: MineralTheme;
90
+ children: ReactNode;
91
+ }
92
+
93
+ export declare function useTheme(): MineralTheme;
94
+
95
+ export { }
package/dist/index.js ADDED
@@ -0,0 +1,235 @@
1
+ import { jsx as s, jsxs as d } from "react/jsx-runtime";
2
+ import { useRef as P, useEffect as ar, useContext as cr, createContext as ir, forwardRef as lr, useState as q, useCallback as g } from "react";
3
+ const B = ir({}), dr = {
4
+ primary: "--mineral-primary",
5
+ primaryDark: "--mineral-primary-dark",
6
+ primaryLight: "--mineral-primary-light",
7
+ dark: "--mineral-dark",
8
+ darkLight: "--mineral-dark-light",
9
+ surface: "--mineral-surface",
10
+ text: "--mineral-text",
11
+ textSecondary: "--mineral-text-secondary",
12
+ textHeading: "--mineral-text-heading",
13
+ border: "--mineral-border",
14
+ borderHover: "--mineral-border-hover",
15
+ borderFocus: "--mineral-border-focus",
16
+ success: "--mineral-success",
17
+ error: "--mineral-error",
18
+ warning: "--mineral-warning",
19
+ info: "--mineral-info",
20
+ fontFamily: "--mineral-font-family",
21
+ radiusSm: "--mineral-radius-sm",
22
+ radiusMd: "--mineral-radius-md",
23
+ radiusLg: "--mineral-radius-lg"
24
+ };
25
+ function Gr({ theme: o, children: y }) {
26
+ const n = P(null);
27
+ return ar(() => {
28
+ if (!n.current) return;
29
+ const a = n.current;
30
+ for (const [I, e] of Object.entries(o)) {
31
+ const p = dr[I];
32
+ p && e && a.style.setProperty(p, e);
33
+ }
34
+ }, [o]), /* @__PURE__ */ s(B.Provider, { value: o, children: /* @__PURE__ */ s("div", { ref: n, children: y }) });
35
+ }
36
+ function Jr() {
37
+ return cr(B);
38
+ }
39
+ function _(...o) {
40
+ return o.filter(Boolean).join(" ");
41
+ }
42
+ const _r = "_wrapper_1tprv_2", pr = "_fullWidth_1tprv_10", ur = "_label_1tprv_15", mr = "_focused_1tprv_22", fr = "_labelError_1tprv_26", vr = "_labelSuccess_1tprv_30", hr = "_required_1tprv_34", br = "_inputContainer_1tprv_40", gr = "_outlined_1tprv_50", yr = "_disabled_1tprv_56", Ir = "_filled_1tprv_66", Nr = "_underlined_1tprv_82", Sr = "_inputError_1tprv_98", wr = "_inputSuccess_1tprv_106", xr = "_colorWarning_1tprv_115", Cr = "_colorInfo_1tprv_120", Er = "_sm_1tprv_126", kr = "_md_1tprv_132", Wr = "_lg_1tprv_138", Mr = "_rounded_1tprv_145", Rr = "_input_1tprv_40", Or = "_startIcon_1tprv_178", jr = "_endIcon_1tprv_186", Tr = "_clearBtn_1tprv_195", $r = "_spinner_1tprv_214", qr = "_spin_1tprv_214", Pr = "_helperText_1tprv_232", Br = "_errorTextMsg_1tprv_238", Hr = "_charCount_1tprv_245", Dr = "_charCountOver_1tprv_252", Fr = "_bottomRow_1tprv_257", r = {
43
+ wrapper: _r,
44
+ fullWidth: pr,
45
+ label: ur,
46
+ focused: mr,
47
+ labelError: fr,
48
+ labelSuccess: vr,
49
+ required: hr,
50
+ inputContainer: br,
51
+ outlined: gr,
52
+ disabled: yr,
53
+ filled: Ir,
54
+ underlined: Nr,
55
+ inputError: Sr,
56
+ inputSuccess: wr,
57
+ colorWarning: xr,
58
+ colorInfo: Cr,
59
+ sm: Er,
60
+ md: kr,
61
+ lg: Wr,
62
+ rounded: Mr,
63
+ input: Rr,
64
+ startIcon: Or,
65
+ endIcon: jr,
66
+ clearBtn: Tr,
67
+ spinner: $r,
68
+ spin: qr,
69
+ helperText: Pr,
70
+ errorTextMsg: Br,
71
+ charCount: Hr,
72
+ charCountOver: Dr,
73
+ bottomRow: Fr
74
+ }, Kr = lr(function({
75
+ type: y = "text",
76
+ value: n,
77
+ defaultValue: a,
78
+ name: I,
79
+ id: e,
80
+ placeholder: p,
81
+ disabled: N = !1,
82
+ readOnly: H = !1,
83
+ required: x = !1,
84
+ autoFocus: D = !1,
85
+ autoComplete: F,
86
+ variant: z = "outlined",
87
+ size: A = "md",
88
+ color: C,
89
+ fullWidth: G = !1,
90
+ rounded: J = !1,
91
+ label: E,
92
+ helperText: u,
93
+ errorText: c,
94
+ startIcon: k,
95
+ endIcon: W,
96
+ clearable: K = !1,
97
+ error: L = !1,
98
+ success: M = !1,
99
+ maxLength: m,
100
+ showCharCount: R = !1,
101
+ onChange: f,
102
+ onFocus: v,
103
+ onBlur: h,
104
+ onKeyDown: Q,
105
+ onClear: b,
106
+ loading: S = !1,
107
+ className: U,
108
+ style: V,
109
+ inputClassName: X,
110
+ labelClassName: Y
111
+ }, i) {
112
+ const [O, j] = q(!1), [Z, T] = q((a == null ? void 0 : a.toString()) ?? ""), $ = P(null), w = n !== void 0 ? n.toString() : Z, l = L || !!c, rr = w.length > 0, nr = g(
113
+ (t) => {
114
+ j(!0), v == null || v(t);
115
+ },
116
+ [v]
117
+ ), er = g(
118
+ (t) => {
119
+ j(!1), h == null || h(t);
120
+ },
121
+ [h]
122
+ ), tr = g(
123
+ (t) => {
124
+ n === void 0 && T(t.target.value), f == null || f(t);
125
+ },
126
+ [f, n]
127
+ ), sr = g(() => {
128
+ n === void 0 && T(""), b == null || b();
129
+ const t = (i == null ? void 0 : i.current) ?? $.current;
130
+ t == null || t.focus();
131
+ }, [b, i]), or = _(
132
+ r.inputContainer,
133
+ r[z],
134
+ r[A],
135
+ O && r.focused,
136
+ l && r.inputError,
137
+ M && !l && r.inputSuccess,
138
+ C === "warning" && r.colorWarning,
139
+ C === "info" && r.colorInfo,
140
+ N && r.disabled,
141
+ J && r.rounded
142
+ );
143
+ return /* @__PURE__ */ d(
144
+ "div",
145
+ {
146
+ className: _(r.wrapper, G && r.fullWidth, U),
147
+ style: V,
148
+ children: [
149
+ E && /* @__PURE__ */ s(
150
+ "label",
151
+ {
152
+ htmlFor: e,
153
+ className: _(
154
+ r.label,
155
+ O && r.focused,
156
+ l && r.labelError,
157
+ M && !l && r.labelSuccess,
158
+ x && r.required,
159
+ Y
160
+ ),
161
+ children: E
162
+ }
163
+ ),
164
+ /* @__PURE__ */ d("div", { className: or, children: [
165
+ k && /* @__PURE__ */ s("span", { className: r.startIcon, children: k }),
166
+ /* @__PURE__ */ s(
167
+ "input",
168
+ {
169
+ ref: i ?? $,
170
+ type: y,
171
+ value: n,
172
+ defaultValue: n === void 0 ? a : void 0,
173
+ name: I,
174
+ id: e,
175
+ placeholder: p,
176
+ disabled: N,
177
+ readOnly: H,
178
+ required: x,
179
+ autoFocus: D,
180
+ autoComplete: F,
181
+ maxLength: m,
182
+ className: _(r.input, X),
183
+ onChange: tr,
184
+ onFocus: nr,
185
+ onBlur: er,
186
+ onKeyDown: Q,
187
+ "aria-invalid": l || void 0,
188
+ "aria-describedby": c ? `${e}-error` : u ? `${e}-helper` : void 0
189
+ }
190
+ ),
191
+ S && /* @__PURE__ */ s("span", { className: r.spinner }),
192
+ K && rr && !S && !N && /* @__PURE__ */ s(
193
+ "button",
194
+ {
195
+ type: "button",
196
+ className: r.clearBtn,
197
+ onClick: sr,
198
+ tabIndex: -1,
199
+ "aria-label": "Clear input",
200
+ children: "✕"
201
+ }
202
+ ),
203
+ W && !S && /* @__PURE__ */ s("span", { className: r.endIcon, children: W })
204
+ ] }),
205
+ (c || u || R) && /* @__PURE__ */ d("div", { className: r.bottomRow, children: [
206
+ /* @__PURE__ */ d("span", { children: [
207
+ c && /* @__PURE__ */ s("span", { id: e ? `${e}-error` : void 0, className: r.errorTextMsg, role: "alert", children: c }),
208
+ !c && u && /* @__PURE__ */ s("span", { id: e ? `${e}-helper` : void 0, className: r.helperText, children: u })
209
+ ] }),
210
+ R && m && /* @__PURE__ */ d(
211
+ "span",
212
+ {
213
+ className: _(
214
+ r.charCount,
215
+ w.length > m && r.charCountOver
216
+ ),
217
+ children: [
218
+ w.length,
219
+ "/",
220
+ m
221
+ ]
222
+ }
223
+ )
224
+ ] })
225
+ ]
226
+ }
227
+ );
228
+ });
229
+ export {
230
+ Kr as Input,
231
+ Gr as MineralThemeProvider,
232
+ _ as cn,
233
+ Jr as useTheme
234
+ };
235
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../src/theme/ThemeProvider.tsx","../src/utils/cn.ts","../src/components/Input/Input.tsx"],"sourcesContent":["import { createContext, useContext, useEffect, useRef, type ReactNode } from 'react';\nimport type { MineralTheme } from './types';\n\nconst ThemeContext = createContext<MineralTheme>({});\n\nconst themeToVarMap: Record<keyof MineralTheme, string> = {\n primary: '--mineral-primary',\n primaryDark: '--mineral-primary-dark',\n primaryLight: '--mineral-primary-light',\n dark: '--mineral-dark',\n darkLight: '--mineral-dark-light',\n surface: '--mineral-surface',\n text: '--mineral-text',\n textSecondary: '--mineral-text-secondary',\n textHeading: '--mineral-text-heading',\n border: '--mineral-border',\n borderHover: '--mineral-border-hover',\n borderFocus: '--mineral-border-focus',\n success: '--mineral-success',\n error: '--mineral-error',\n warning: '--mineral-warning',\n info: '--mineral-info',\n fontFamily: '--mineral-font-family',\n radiusSm: '--mineral-radius-sm',\n radiusMd: '--mineral-radius-md',\n radiusLg: '--mineral-radius-lg',\n};\n\ninterface MineralThemeProviderProps {\n theme: MineralTheme;\n children: ReactNode;\n}\n\nexport function MineralThemeProvider({ theme, children }: MineralThemeProviderProps) {\n const ref = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!ref.current) return;\n const el = ref.current;\n\n for (const [key, value] of Object.entries(theme)) {\n const varName = themeToVarMap[key as keyof MineralTheme];\n if (varName && value) {\n el.style.setProperty(varName, value);\n }\n }\n }, [theme]);\n\n return (\n <ThemeContext.Provider value={theme}>\n <div ref={ref}>{children}</div>\n </ThemeContext.Provider>\n );\n}\n\nexport function useTheme(): MineralTheme {\n return useContext(ThemeContext);\n}\n","/**\n * Łączy klasy CSS, odfiltrowując falsy wartości.\n * Lekki zamiennik clsx/classnames — zero dependencies.\n */\nexport function cn(...classes: (string | undefined | null | false)[]): string {\n return classes.filter(Boolean).join(' ');\n}\n","import {useState, useRef, useCallback, forwardRef} from 'react';\nimport type {InputProps} from './Input.types';\nimport {cn} from '../../utils/cn';\nimport styles from './Input.module.css';\n\nexport const Input = forwardRef<HTMLInputElement, InputProps>(function Input(\n {\n type = 'text',\n value,\n defaultValue,\n name,\n id,\n placeholder,\n disabled = false,\n readOnly = false,\n required = false,\n autoFocus = false,\n autoComplete,\n variant = 'outlined',\n size = 'md',\n color,\n fullWidth = false,\n rounded = false,\n label,\n helperText,\n errorText,\n startIcon,\n endIcon,\n clearable = false,\n error = false,\n success = false,\n maxLength,\n showCharCount = false,\n onChange,\n onFocus,\n onBlur,\n onKeyDown,\n onClear,\n loading = false,\n className,\n style,\n inputClassName,\n labelClassName,\n },\n ref,\n) {\n const [focused, setFocused] = useState(false);\n const [internalValue, setInternalValue] = useState(defaultValue?.toString() ?? '');\n const inputRef = useRef<HTMLInputElement>(null);\n\n const currentValue = value !== undefined ? value.toString() : internalValue;\n const hasError = error || !!errorText;\n const hasContent = currentValue.length > 0;\n\n const handleFocus = useCallback(\n (e: React.FocusEvent<HTMLInputElement>) => {\n setFocused(true);\n onFocus?.(e);\n },\n [onFocus],\n );\n\n const handleBlur = useCallback(\n (e: React.FocusEvent<HTMLInputElement>) => {\n setFocused(false);\n onBlur?.(e);\n },\n [onBlur],\n );\n\n const handleChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n if (value === undefined) {\n setInternalValue(e.target.value);\n }\n onChange?.(e);\n },\n [onChange, value],\n );\n\n const handleClear = useCallback(() => {\n if (value === undefined) {\n setInternalValue('');\n }\n onClear?.();\n // Focus input after clear\n const input = (ref as React.RefObject<HTMLInputElement>)?.current ?? inputRef.current;\n input?.focus();\n }, [onClear, ref]);\n\n const containerClasses = cn(\n styles.inputContainer,\n styles[variant],\n styles[size],\n focused && styles.focused,\n hasError && styles.inputError,\n success && !hasError && styles.inputSuccess,\n color === 'warning' && styles.colorWarning,\n color === 'info' && styles.colorInfo,\n disabled && styles.disabled,\n rounded && styles.rounded,\n );\n\n return (\n <div\n className={cn(styles.wrapper, fullWidth && styles.fullWidth, className)}\n style={style}\n >\n {label && (\n <label\n htmlFor={id}\n className={cn(\n styles.label,\n focused && styles.focused,\n hasError && styles.labelError,\n success && !hasError && styles.labelSuccess,\n required && styles.required,\n labelClassName,\n )}\n >\n {label}\n </label>\n )}\n\n <div className={containerClasses}>\n {startIcon && <span className={styles.startIcon}>{startIcon}</span>}\n\n <input\n ref={ref ?? inputRef}\n type={type}\n value={value}\n defaultValue={value === undefined ? defaultValue : undefined}\n name={name}\n id={id}\n placeholder={placeholder}\n disabled={disabled}\n readOnly={readOnly}\n required={required}\n autoFocus={autoFocus}\n autoComplete={autoComplete}\n maxLength={maxLength}\n className={cn(styles.input, inputClassName)}\n onChange={handleChange}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onKeyDown={onKeyDown}\n aria-invalid={hasError || undefined}\n aria-describedby={\n errorText ? `${id}-error` : helperText ? `${id}-helper` : undefined\n }\n />\n\n {loading && <span className={styles.spinner}/>}\n\n {clearable && hasContent && !loading && !disabled && (\n <button\n type=\"button\"\n className={styles.clearBtn}\n onClick={handleClear}\n tabIndex={-1}\n aria-label=\"Clear input\"\n >\n ✕\n </button>\n )}\n\n {endIcon && !loading && <span className={styles.endIcon}>{endIcon}</span>}\n </div>\n\n {(errorText || helperText || showCharCount) && (\n <div className={styles.bottomRow}>\n <span>\n {errorText && (\n <span id={id ? `${id}-error` : undefined} className={styles.errorTextMsg} role=\"alert\">\n {errorText}\n </span>\n )}\n {!errorText && helperText && (\n <span id={id ? `${id}-helper` : undefined} className={styles.helperText}>\n {helperText}\n </span>\n )}\n </span>\n {showCharCount && maxLength && (\n <span\n className={cn(\n styles.charCount,\n currentValue.length > maxLength && styles.charCountOver,\n )}\n >\n {currentValue.length}/{maxLength}\n </span>\n )}\n </div>\n )}\n </div>\n );\n});\n"],"names":["ThemeContext","createContext","themeToVarMap","MineralThemeProvider","theme","children","ref","useRef","useEffect","el","key","value","varName","jsx","useTheme","useContext","cn","classes","Input","forwardRef","type","defaultValue","name","id","placeholder","disabled","readOnly","required","autoFocus","autoComplete","variant","size","color","fullWidth","rounded","label","helperText","errorText","startIcon","endIcon","clearable","error","success","maxLength","showCharCount","onChange","onFocus","onBlur","onKeyDown","onClear","loading","className","style","inputClassName","labelClassName","focused","setFocused","useState","internalValue","setInternalValue","inputRef","currentValue","hasError","hasContent","handleFocus","useCallback","e","handleBlur","handleChange","handleClear","input","containerClasses","styles","jsxs"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ *,*:before,*:after{box-sizing:border-box;margin:0;padding:0}input,button,textarea,select{font:inherit;color:inherit;background:none;border:none;outline:none}:root{--mineral-primary: #00A5DE;--mineral-primary-dark: #0084B4;--mineral-primary-light: #33B7E5;--mineral-dark: #0f172a;--mineral-dark-light: #1e293b;--mineral-surface: #1a1a2e;--mineral-text: #e2e8f0;--mineral-text-secondary: #64748b;--mineral-text-heading: #ffffff;--mineral-border: rgba(255, 255, 255, .05);--mineral-border-hover: rgba(255, 255, 255, .1);--mineral-border-focus: #00A5DE;--mineral-success: #22C55E;--mineral-error: #EF4444;--mineral-warning: #F59E0B;--mineral-info: #3B82F6;--mineral-font-family: "Inter", "Segoe UI", system-ui, -apple-system, sans-serif;--mineral-font-size-xs: .75rem;--mineral-font-size-sm: .875rem;--mineral-font-size-md: 1rem;--mineral-font-size-lg: 1.125rem;--mineral-spacing-xs: 4px;--mineral-spacing-sm: 8px;--mineral-spacing-md: 12px;--mineral-spacing-lg: 16px;--mineral-spacing-xl: 24px;--mineral-radius-sm: 6px;--mineral-radius-md: 8px;--mineral-radius-lg: 10px;--mineral-radius-xl: 16px;--mineral-radius-full: 9999px;--mineral-transition-fast: .15s ease;--mineral-transition-base: .3s ease;--mineral-shadow-sm: 0 1px 2px rgba(0, 0, 0, .2);--mineral-shadow-md: 0 4px 12px rgba(0, 0, 0, .3);--mineral-shadow-focus: 0 0 0 3px color-mix(in oklch, var(--mineral-primary), transparent 70%);--mineral-popover-bg: rgba(30, 41, 59, .95);--mineral-popover-border: rgba(255, 255, 255, .08);--mineral-popover-shadow: 0 8px 32px rgba(0, 0, 0, .4);--mineral-popover-backdrop-blur: 12px;--mineral-option-hover-bg: rgba(255, 255, 255, .05);--mineral-option-selected-bg: rgba(0, 165, 222, .15);--mineral-option-active-bg: rgba(0, 165, 222, .25);--mineral-z-popover: 1000;--mineral-z-modal: 1100}._wrapper_1tprv_2{display:inline-flex;flex-direction:column;gap:var(--mineral-spacing-xs);font-family:var(--mineral-font-family);position:relative}._fullWidth_1tprv_10{width:100%}._label_1tprv_15{font-size:var(--mineral-font-size-sm);color:var(--mineral-text-secondary);font-weight:500;transition:color var(--mineral-transition-fast)}._label_1tprv_15._focused_1tprv_22{color:var(--mineral-primary)}._label_1tprv_15._labelError_1tprv_26{color:var(--mineral-error)}._label_1tprv_15._labelSuccess_1tprv_30{color:var(--mineral-success)}._required_1tprv_34:after{content:" *";color:var(--mineral-error)}._inputContainer_1tprv_40{display:flex;align-items:center;position:relative;transition:border-color var(--mineral-transition-base),box-shadow var(--mineral-transition-base),background-color var(--mineral-transition-base)}._outlined_1tprv_50{border:1px solid var(--mineral-border);border-radius:var(--mineral-radius-md);background:transparent}._outlined_1tprv_50:hover:not(._disabled_1tprv_56){border-color:var(--mineral-border-hover)}._outlined_1tprv_50._focused_1tprv_22{border-color:var(--mineral-border-focus);box-shadow:var(--mineral-shadow-focus)}._filled_1tprv_66{border:none;border-bottom:2px solid var(--mineral-border);border-radius:var(--mineral-radius-md) var(--mineral-radius-md) 0 0;background:var(--mineral-surface)}._filled_1tprv_66:hover:not(._disabled_1tprv_56){background:color-mix(in oklch,var(--mineral-surface),white 3%)}._filled_1tprv_66._focused_1tprv_22{border-bottom-color:var(--mineral-primary)}._underlined_1tprv_82{border:none;border-bottom:1px solid var(--mineral-border);border-radius:0;background:transparent}._underlined_1tprv_82:hover:not(._disabled_1tprv_56){border-bottom-color:var(--mineral-border-hover)}._underlined_1tprv_82._focused_1tprv_22{border-bottom:2px solid var(--mineral-primary)}._inputError_1tprv_98{border-color:var(--mineral-error)!important}._inputError_1tprv_98._focused_1tprv_22{box-shadow:0 0 0 3px color-mix(in oklch,var(--mineral-error),transparent 70%)}._inputSuccess_1tprv_106{border-color:var(--mineral-success)!important}._inputSuccess_1tprv_106._focused_1tprv_22{box-shadow:0 0 0 3px color-mix(in oklch,var(--mineral-success),transparent 70%)}._colorWarning_1tprv_115._focused_1tprv_22{border-color:var(--mineral-warning);box-shadow:0 0 0 3px color-mix(in oklch,var(--mineral-warning),transparent 70%)}._colorInfo_1tprv_120._focused_1tprv_22{border-color:var(--mineral-info);box-shadow:0 0 0 3px color-mix(in oklch,var(--mineral-info),transparent 70%)}._sm_1tprv_126{height:32px;padding:0 var(--mineral-spacing-sm);font-size:var(--mineral-font-size-xs)}._md_1tprv_132{height:40px;padding:0 var(--mineral-spacing-md);font-size:var(--mineral-font-size-sm)}._lg_1tprv_138{height:48px;padding:0 var(--mineral-spacing-lg);font-size:var(--mineral-font-size-md)}._rounded_1tprv_145{border-radius:var(--mineral-radius-full)}._disabled_1tprv_56{opacity:.5;cursor:not-allowed}._input_1tprv_40{flex:1;width:100%;height:100%;background:transparent;border:none;outline:none;color:var(--mineral-text);font-family:inherit;font-size:inherit}._input_1tprv_40::-moz-placeholder{color:var(--mineral-text-secondary);opacity:.6}._input_1tprv_40::placeholder{color:var(--mineral-text-secondary);opacity:.6}._input_1tprv_40:disabled{cursor:not-allowed}._startIcon_1tprv_178{display:flex;align-items:center;margin-right:var(--mineral-spacing-sm);color:var(--mineral-text-secondary);flex-shrink:0}._endIcon_1tprv_186{display:flex;align-items:center;margin-left:var(--mineral-spacing-sm);color:var(--mineral-text-secondary);flex-shrink:0}._clearBtn_1tprv_195{display:flex;align-items:center;justify-content:center;margin-left:var(--mineral-spacing-xs);padding:2px;cursor:pointer;color:var(--mineral-text-secondary);border-radius:var(--mineral-radius-sm);transition:color var(--mineral-transition-fast),background-color var(--mineral-transition-fast);flex-shrink:0}._clearBtn_1tprv_195:hover{color:var(--mineral-text);background-color:#ffffff0d}._spinner_1tprv_214{width:16px;height:16px;border:2px solid var(--mineral-border);border-top-color:var(--mineral-primary);border-radius:50%;animation:_spin_1tprv_214 .6s linear infinite;margin-left:var(--mineral-spacing-sm);flex-shrink:0}@keyframes _spin_1tprv_214{to{transform:rotate(360deg)}}._helperText_1tprv_232{font-size:var(--mineral-font-size-xs);color:var(--mineral-text-secondary);margin-top:2px}._errorTextMsg_1tprv_238{font-size:var(--mineral-font-size-xs);color:var(--mineral-error);margin-top:2px}._charCount_1tprv_245{font-size:var(--mineral-font-size-xs);color:var(--mineral-text-secondary);text-align:right;margin-top:2px}._charCount_1tprv_245._charCountOver_1tprv_252{color:var(--mineral-error)}._bottomRow_1tprv_257{display:flex;justify-content:space-between;align-items:flex-start;gap:var(--mineral-spacing-sm)}
package/package.json ADDED
@@ -0,0 +1,215 @@
1
+ {
2
+ "name": "@banzamel/mineralui",
3
+ "version": "0.1.0",
4
+ "description": "Modern React UI component framework with mineral dark aesthetic",
5
+ "type": "module",
6
+ "main": "dist/index.cjs",
7
+ "module": "dist/index.js",
8
+ "types": "dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "import": {
12
+ "types": "./dist/index.d.ts",
13
+ "default": "./dist/index.js"
14
+ },
15
+ "require": {
16
+ "types": "./dist/index.d.ts",
17
+ "default": "./dist/index.cjs"
18
+ }
19
+ },
20
+ "./styles.css": "./dist/styles.css"
21
+ },
22
+ "files": [
23
+ "dist",
24
+ "README.md",
25
+ "LICENSE"
26
+ ],
27
+ "sideEffects": [
28
+ "*.css"
29
+ ],
30
+ "scripts": {
31
+ "dev": "vite",
32
+ "build": "tsc && vite build",
33
+ "preview": "vite preview",
34
+ "test": "vitest run",
35
+ "test:watch": "vitest",
36
+ "lint": "eslint src/",
37
+ "prepublishOnly": "npm run build"
38
+ },
39
+ "peerDependencies": {
40
+ "react": ">=18.0.0",
41
+ "react-dom": ">=18.0.0"
42
+ },
43
+ "devDependencies": {
44
+ "@testing-library/jest-dom": "^6.6.3",
45
+ "@testing-library/react": "^16.1.0",
46
+ "@types/node": "^25.5.0",
47
+ "@types/react": "^18.3.0",
48
+ "@types/react-dom": "^18.3.0",
49
+ "autoprefixer": "^10.4.20",
50
+ "jsdom": "^26.0.0",
51
+ "postcss": "^8.5.0",
52
+ "react": "^18.3.1",
53
+ "react-dom": "^18.3.1",
54
+ "typescript": "^5.7.0",
55
+ "vite": "^6.0.0",
56
+ "vite-plugin-dts": "^4.3.0",
57
+ "vitest": "^3.0.0"
58
+ },
59
+ "keywords": [
60
+ "react",
61
+ "ui",
62
+ "components",
63
+ "framework",
64
+ "dark-mode",
65
+ "mineral",
66
+ "typescript"
67
+ ],
68
+ "license": "MIT",
69
+ "repository": {
70
+ "type": "git",
71
+ "url": ""
72
+ },
73
+ "dependencies": {
74
+ "acorn": "^8.16.0",
75
+ "agent-base": "^7.1.4",
76
+ "ajv": "^8.18.0",
77
+ "ajv-draft-04": "^1.0.0",
78
+ "ajv-formats": "^3.0.1",
79
+ "alien-signals": "^0.4.14",
80
+ "ansi-regex": "^5.0.1",
81
+ "ansi-styles": "^5.2.0",
82
+ "argparse": "^1.0.10",
83
+ "aria-query": "^5.3.0",
84
+ "assertion-error": "^2.0.1",
85
+ "balanced-match": "^4.0.4",
86
+ "baseline-browser-mapping": "^2.10.8",
87
+ "brace-expansion": "^5.0.4",
88
+ "browserslist": "^4.28.1",
89
+ "cac": "^6.7.14",
90
+ "caniuse-lite": "^1.0.30001780",
91
+ "chai": "^5.3.3",
92
+ "check-error": "^2.1.3",
93
+ "compare-versions": "^6.1.1",
94
+ "confbox": "^0.2.4",
95
+ "css.escape": "^1.5.1",
96
+ "cssstyle": "^4.6.0",
97
+ "csstype": "^3.2.3",
98
+ "data-urls": "^5.0.0",
99
+ "de-indent": "^1.0.2",
100
+ "debug": "^4.4.3",
101
+ "decimal.js": "^10.6.0",
102
+ "deep-eql": "^5.0.2",
103
+ "dequal": "^2.0.3",
104
+ "diff": "^8.0.3",
105
+ "dom-accessibility-api": "^0.5.16",
106
+ "electron-to-chromium": "^1.5.313",
107
+ "entities": "^6.0.1",
108
+ "es-module-lexer": "^1.7.0",
109
+ "esbuild": "^0.25.12",
110
+ "escalade": "^3.2.0",
111
+ "estree-walker": "^2.0.2",
112
+ "expect-type": "^1.3.0",
113
+ "exsolve": "^1.0.8",
114
+ "fast-deep-equal": "^3.1.3",
115
+ "fast-uri": "^3.1.0",
116
+ "fdir": "^6.5.0",
117
+ "fraction.js": "^5.3.4",
118
+ "fs-extra": "^11.3.4",
119
+ "function-bind": "^1.1.2",
120
+ "graceful-fs": "^4.2.11",
121
+ "has-flag": "^4.0.0",
122
+ "hasown": "^2.0.2",
123
+ "he": "^1.2.0",
124
+ "html-encoding-sniffer": "^4.0.0",
125
+ "http-proxy-agent": "^7.0.2",
126
+ "https-proxy-agent": "^7.0.6",
127
+ "iconv-lite": "^0.6.3",
128
+ "import-lazy": "^4.0.0",
129
+ "indent-string": "^4.0.0",
130
+ "is-core-module": "^2.16.1",
131
+ "is-potential-custom-element-name": "^1.0.1",
132
+ "jju": "^1.4.0",
133
+ "js-tokens": "^4.0.0",
134
+ "json-schema-traverse": "^1.0.0",
135
+ "jsonfile": "^6.2.0",
136
+ "kolorist": "^1.8.0",
137
+ "local-pkg": "^1.1.2",
138
+ "lodash": "^4.17.23",
139
+ "loose-envify": "^1.4.0",
140
+ "loupe": "^3.2.1",
141
+ "lru-cache": "^10.4.3",
142
+ "lz-string": "^1.5.0",
143
+ "magic-string": "^0.30.21",
144
+ "min-indent": "^1.0.1",
145
+ "minimatch": "^10.2.3",
146
+ "mlly": "^1.8.1",
147
+ "ms": "^2.1.3",
148
+ "muggle-string": "^0.4.1",
149
+ "nanoid": "^3.3.11",
150
+ "node-releases": "^2.0.36",
151
+ "nwsapi": "^2.2.23",
152
+ "parse5": "^7.3.0",
153
+ "path-browserify": "^1.0.1",
154
+ "path-parse": "^1.0.7",
155
+ "pathe": "^2.0.3",
156
+ "pathval": "^2.0.1",
157
+ "picocolors": "^1.1.1",
158
+ "picomatch": "^4.0.3",
159
+ "pkg-types": "^2.3.0",
160
+ "postcss-value-parser": "^4.2.0",
161
+ "pretty-format": "^27.5.1",
162
+ "punycode": "^2.3.1",
163
+ "quansync": "^0.2.11",
164
+ "react-is": "^17.0.2",
165
+ "redent": "^3.0.0",
166
+ "require-from-string": "^2.0.2",
167
+ "resolve": "^1.22.11",
168
+ "rollup": "^4.59.0",
169
+ "rrweb-cssom": "^0.8.0",
170
+ "safer-buffer": "^2.1.2",
171
+ "saxes": "^6.0.0",
172
+ "scheduler": "^0.23.2",
173
+ "semver": "^7.5.4",
174
+ "siginfo": "^2.0.0",
175
+ "source-map": "^0.6.1",
176
+ "source-map-js": "^1.2.1",
177
+ "sprintf-js": "^1.0.3",
178
+ "stackback": "^0.0.2",
179
+ "std-env": "^3.10.0",
180
+ "string-argv": "^0.3.2",
181
+ "strip-indent": "^3.0.0",
182
+ "strip-json-comments": "^3.1.1",
183
+ "strip-literal": "^3.1.0",
184
+ "supports-color": "^8.1.1",
185
+ "supports-preserve-symlinks-flag": "^1.0.0",
186
+ "symbol-tree": "^3.2.4",
187
+ "tinybench": "^2.9.0",
188
+ "tinyexec": "^0.3.2",
189
+ "tinyglobby": "^0.2.15",
190
+ "tinypool": "^1.1.1",
191
+ "tinyrainbow": "^2.0.0",
192
+ "tinyspy": "^4.0.4",
193
+ "tldts": "^6.1.86",
194
+ "tldts-core": "^6.1.86",
195
+ "tough-cookie": "^5.1.2",
196
+ "tr46": "^5.1.1",
197
+ "ufo": "^1.6.3",
198
+ "undici-types": "^7.18.2",
199
+ "universalify": "^2.0.1",
200
+ "update-browserslist-db": "^1.2.3",
201
+ "vite-node": "^3.2.4",
202
+ "vscode-uri": "^3.1.0",
203
+ "w3c-xmlserializer": "^5.0.0",
204
+ "webidl-conversions": "^7.0.0",
205
+ "whatwg-encoding": "^3.1.1",
206
+ "whatwg-mimetype": "^4.0.0",
207
+ "whatwg-url": "^14.2.0",
208
+ "why-is-node-running": "^2.3.0",
209
+ "ws": "^8.19.0",
210
+ "xml-name-validator": "^5.0.0",
211
+ "xmlchars": "^2.2.0",
212
+ "yallist": "^4.0.0"
213
+ },
214
+ "author": "Rafał Polak"
215
+ }