corestack-ui 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/README.md ADDED
@@ -0,0 +1,18 @@
1
+ # Corestack UI
2
+
3
+ Minimal, production-ready React + TypeScript component library scaffold.
4
+
5
+ Build
6
+
7
+ ```bash
8
+ npm install --save-dev tsup typescript
9
+ npm run build
10
+ ```
11
+
12
+ Usage
13
+
14
+ Import from package to enable tree-shaking:
15
+
16
+ ```js
17
+ import { Button } from 'corestack-ui'
18
+ ```
@@ -0,0 +1,40 @@
1
+ import * as React from 'react';
2
+
3
+ type ButtonVariant = 'primary' | 'secondary' | 'ghost';
4
+ type ButtonSize = 'sm' | 'md' | 'lg';
5
+ interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
6
+ variant?: ButtonVariant;
7
+ size?: ButtonSize;
8
+ }
9
+
10
+ declare const Button: React.ForwardRefExoticComponent<ButtonProps & React.RefAttributes<HTMLButtonElement>>;
11
+
12
+ interface AutocompleteOption {
13
+ label: string;
14
+ value: string;
15
+ }
16
+ interface AutocompleteProps {
17
+ options: AutocompleteOption[];
18
+ value?: string;
19
+ onChange?: (value?: string) => void;
20
+ placeholder?: string;
21
+ renderItem?: (option: AutocompleteOption) => React.ReactNode;
22
+ }
23
+
24
+ declare const Autocomplete: React.FC<AutocompleteProps>;
25
+
26
+ declare function useAutocomplete(options: AutocompleteOption[]): {
27
+ readonly input: string;
28
+ readonly setInput: React.Dispatch<React.SetStateAction<string>>;
29
+ readonly filtered: AutocompleteOption[];
30
+ };
31
+
32
+ declare const cn: (...parts: Array<string | false | null | undefined>) => string;
33
+
34
+ declare const tokens: {
35
+ colors: {
36
+ primary: string;
37
+ };
38
+ };
39
+
40
+ export { Autocomplete, type AutocompleteOption, type AutocompleteProps, Button, type ButtonProps, cn, tokens, useAutocomplete };
@@ -0,0 +1,40 @@
1
+ import * as React from 'react';
2
+
3
+ type ButtonVariant = 'primary' | 'secondary' | 'ghost';
4
+ type ButtonSize = 'sm' | 'md' | 'lg';
5
+ interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
6
+ variant?: ButtonVariant;
7
+ size?: ButtonSize;
8
+ }
9
+
10
+ declare const Button: React.ForwardRefExoticComponent<ButtonProps & React.RefAttributes<HTMLButtonElement>>;
11
+
12
+ interface AutocompleteOption {
13
+ label: string;
14
+ value: string;
15
+ }
16
+ interface AutocompleteProps {
17
+ options: AutocompleteOption[];
18
+ value?: string;
19
+ onChange?: (value?: string) => void;
20
+ placeholder?: string;
21
+ renderItem?: (option: AutocompleteOption) => React.ReactNode;
22
+ }
23
+
24
+ declare const Autocomplete: React.FC<AutocompleteProps>;
25
+
26
+ declare function useAutocomplete(options: AutocompleteOption[]): {
27
+ readonly input: string;
28
+ readonly setInput: React.Dispatch<React.SetStateAction<string>>;
29
+ readonly filtered: AutocompleteOption[];
30
+ };
31
+
32
+ declare const cn: (...parts: Array<string | false | null | undefined>) => string;
33
+
34
+ declare const tokens: {
35
+ colors: {
36
+ primary: string;
37
+ };
38
+ };
39
+
40
+ export { Autocomplete, type AutocompleteOption, type AutocompleteProps, Button, type ButtonProps, cn, tokens, useAutocomplete };
package/dist/index.js ADDED
@@ -0,0 +1,84 @@
1
+ 'use strict';
2
+
3
+ var React = require('react');
4
+ var jsxRuntime = require('react/jsx-runtime');
5
+
6
+ function _interopNamespace(e) {
7
+ if (e && e.__esModule) return e;
8
+ var n = Object.create(null);
9
+ if (e) {
10
+ Object.keys(e).forEach(function (k) {
11
+ if (k !== 'default') {
12
+ var d = Object.getOwnPropertyDescriptor(e, k);
13
+ Object.defineProperty(n, k, d.get ? d : {
14
+ enumerable: true,
15
+ get: function () { return e[k]; }
16
+ });
17
+ }
18
+ });
19
+ }
20
+ n.default = e;
21
+ return Object.freeze(n);
22
+ }
23
+
24
+ var React__namespace = /*#__PURE__*/_interopNamespace(React);
25
+
26
+ /* Corestack UI - built with tsup */
27
+
28
+ var Button = React__namespace.forwardRef(
29
+ ({ variant = "primary", size = "md", className, children, ...rest }, ref) => {
30
+ const base = "cs-btn";
31
+ const cls = [base, `cs-btn--${variant}`, `cs-btn--${size}`, className].filter(Boolean).join(" ");
32
+ return /* @__PURE__ */ jsxRuntime.jsx("button", { ref, className: cls, ...rest, children });
33
+ }
34
+ );
35
+ Button.displayName = "Button";
36
+ function useAutocomplete(options) {
37
+ const [input, setInput] = React.useState("");
38
+ const filtered = React.useMemo(() => {
39
+ const q = input.trim().toLowerCase();
40
+ if (!q) return options;
41
+ return options.filter((o) => o.label.toLowerCase().includes(q) || o.value.toLowerCase().includes(q));
42
+ }, [input, options]);
43
+ return { input, setInput, filtered };
44
+ }
45
+ var Autocomplete = ({ options, value, onChange, placeholder, renderItem }) => {
46
+ const { input, setInput, filtered } = useAutocomplete(options);
47
+ React__namespace.useEffect(() => {
48
+ if (value === void 0) return;
49
+ setInput(value);
50
+ }, [value]);
51
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "cs-autocomplete", children: [
52
+ /* @__PURE__ */ jsxRuntime.jsx(
53
+ "input",
54
+ {
55
+ className: "cs-autocomplete__input",
56
+ value: input,
57
+ onChange: (e) => {
58
+ setInput(e.target.value);
59
+ onChange == null ? void 0 : onChange(e.target.value || void 0);
60
+ },
61
+ placeholder
62
+ }
63
+ ),
64
+ /* @__PURE__ */ jsxRuntime.jsx("ul", { className: "cs-autocomplete__list", children: filtered.map((opt) => /* @__PURE__ */ jsxRuntime.jsx("li", { className: "cs-autocomplete__item", children: renderItem ? renderItem(opt) : opt.label }, opt.value)) })
65
+ ] });
66
+ };
67
+
68
+ // src/utils/index.ts
69
+ var cn = (...parts) => parts.filter(Boolean).join(" ");
70
+
71
+ // src/styles/index.ts
72
+ var tokens = {
73
+ colors: {
74
+ primary: "#0366d6"
75
+ }
76
+ };
77
+
78
+ exports.Autocomplete = Autocomplete;
79
+ exports.Button = Button;
80
+ exports.cn = cn;
81
+ exports.tokens = tokens;
82
+ exports.useAutocomplete = useAutocomplete;
83
+ //# sourceMappingURL=index.js.map
84
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/Button/Button.tsx","../src/components/Autocomplete/useAutocomplete.ts","../src/components/Autocomplete/Autocomplete.tsx","../src/utils/index.ts","../src/styles/index.ts"],"names":["React","useState","useMemo","React2","jsxs","jsx"],"mappings":"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","file":"index.js","sourcesContent":["import * as React from 'react';\r\nimport { ButtonProps } from './Button.types';\r\n\r\nexport const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\r\n ({ variant = 'primary', size = 'md', className, children, ...rest }, ref) => {\r\n const base = 'cs-btn';\r\n const cls = [base, `cs-btn--${variant}`, `cs-btn--${size}`, className].filter(Boolean).join(' ');\r\n return (\r\n <button ref={ref} className={cls} {...rest}>\r\n {children}\r\n </button>\r\n );\r\n }\r\n);\r\n\r\nButton.displayName = 'Button';\r\n\r\nexport default Button;\r\n","import { useState, useMemo } from 'react';\r\nimport type { AutocompleteOption } from './Autocomplete.types';\r\n\r\nexport function useAutocomplete(options: AutocompleteOption[]) {\r\n const [input, setInput] = useState('');\r\n\r\n const filtered = useMemo(() => {\r\n const q = input.trim().toLowerCase();\r\n if (!q) return options;\r\n return options.filter((o) => o.label.toLowerCase().includes(q) || o.value.toLowerCase().includes(q));\r\n }, [input, options]);\r\n\r\n return { input, setInput, filtered } as const;\r\n}\r\n","import * as React from 'react';\r\nimport { AutocompleteProps } from './Autocomplete.types';\r\nimport { useAutocomplete } from './useAutocomplete';\r\n\r\nexport const Autocomplete: React.FC<AutocompleteProps> = ({ options, value, onChange, placeholder, renderItem }) => {\r\n const { input, setInput, filtered } = useAutocomplete(options);\r\n\r\n React.useEffect(() => {\r\n if (value === undefined) return;\r\n setInput(value);\r\n }, [value]);\r\n\r\n return (\r\n <div className=\"cs-autocomplete\">\r\n <input\r\n className=\"cs-autocomplete__input\"\r\n value={input}\r\n onChange={(e) => {\r\n setInput(e.target.value);\r\n onChange?.(e.target.value || undefined);\r\n }}\r\n placeholder={placeholder}\r\n />\r\n <ul className=\"cs-autocomplete__list\">\r\n {filtered.map((opt) => (\r\n <li key={opt.value} className=\"cs-autocomplete__item\">\r\n {renderItem ? renderItem(opt) : opt.label}\r\n </li>\r\n ))}\r\n </ul>\r\n </div>\r\n );\r\n};\r\n\r\nexport default Autocomplete;\r\n","// Utility helpers\r\nexport const cn = (...parts: Array<string | false | null | undefined>) => parts.filter(Boolean).join(' ');\r\n","// Minimal styles tokens / export\r\nexport const tokens = {\r\n colors: {\r\n primary: '#0366d6'\r\n }\r\n};\r\n\r\nexport default tokens;\r\n"]}
package/dist/index.mjs ADDED
@@ -0,0 +1,59 @@
1
+ import * as React from 'react';
2
+ import { useState, useMemo } from 'react';
3
+ import { jsx, jsxs } from 'react/jsx-runtime';
4
+
5
+ /* Corestack UI - built with tsup */
6
+
7
+ var Button = React.forwardRef(
8
+ ({ variant = "primary", size = "md", className, children, ...rest }, ref) => {
9
+ const base = "cs-btn";
10
+ const cls = [base, `cs-btn--${variant}`, `cs-btn--${size}`, className].filter(Boolean).join(" ");
11
+ return /* @__PURE__ */ jsx("button", { ref, className: cls, ...rest, children });
12
+ }
13
+ );
14
+ Button.displayName = "Button";
15
+ function useAutocomplete(options) {
16
+ const [input, setInput] = useState("");
17
+ const filtered = useMemo(() => {
18
+ const q = input.trim().toLowerCase();
19
+ if (!q) return options;
20
+ return options.filter((o) => o.label.toLowerCase().includes(q) || o.value.toLowerCase().includes(q));
21
+ }, [input, options]);
22
+ return { input, setInput, filtered };
23
+ }
24
+ var Autocomplete = ({ options, value, onChange, placeholder, renderItem }) => {
25
+ const { input, setInput, filtered } = useAutocomplete(options);
26
+ React.useEffect(() => {
27
+ if (value === void 0) return;
28
+ setInput(value);
29
+ }, [value]);
30
+ return /* @__PURE__ */ jsxs("div", { className: "cs-autocomplete", children: [
31
+ /* @__PURE__ */ jsx(
32
+ "input",
33
+ {
34
+ className: "cs-autocomplete__input",
35
+ value: input,
36
+ onChange: (e) => {
37
+ setInput(e.target.value);
38
+ onChange == null ? void 0 : onChange(e.target.value || void 0);
39
+ },
40
+ placeholder
41
+ }
42
+ ),
43
+ /* @__PURE__ */ jsx("ul", { className: "cs-autocomplete__list", children: filtered.map((opt) => /* @__PURE__ */ jsx("li", { className: "cs-autocomplete__item", children: renderItem ? renderItem(opt) : opt.label }, opt.value)) })
44
+ ] });
45
+ };
46
+
47
+ // src/utils/index.ts
48
+ var cn = (...parts) => parts.filter(Boolean).join(" ");
49
+
50
+ // src/styles/index.ts
51
+ var tokens = {
52
+ colors: {
53
+ primary: "#0366d6"
54
+ }
55
+ };
56
+
57
+ export { Autocomplete, Button, cn, tokens, useAutocomplete };
58
+ //# sourceMappingURL=index.mjs.map
59
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/Button/Button.tsx","../src/components/Autocomplete/useAutocomplete.ts","../src/components/Autocomplete/Autocomplete.tsx","../src/utils/index.ts","../src/styles/index.ts"],"names":["React2","jsx"],"mappings":"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","file":"index.mjs","sourcesContent":["import * as React from 'react';\r\nimport { ButtonProps } from './Button.types';\r\n\r\nexport const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\r\n ({ variant = 'primary', size = 'md', className, children, ...rest }, ref) => {\r\n const base = 'cs-btn';\r\n const cls = [base, `cs-btn--${variant}`, `cs-btn--${size}`, className].filter(Boolean).join(' ');\r\n return (\r\n <button ref={ref} className={cls} {...rest}>\r\n {children}\r\n </button>\r\n );\r\n }\r\n);\r\n\r\nButton.displayName = 'Button';\r\n\r\nexport default Button;\r\n","import { useState, useMemo } from 'react';\r\nimport type { AutocompleteOption } from './Autocomplete.types';\r\n\r\nexport function useAutocomplete(options: AutocompleteOption[]) {\r\n const [input, setInput] = useState('');\r\n\r\n const filtered = useMemo(() => {\r\n const q = input.trim().toLowerCase();\r\n if (!q) return options;\r\n return options.filter((o) => o.label.toLowerCase().includes(q) || o.value.toLowerCase().includes(q));\r\n }, [input, options]);\r\n\r\n return { input, setInput, filtered } as const;\r\n}\r\n","import * as React from 'react';\r\nimport { AutocompleteProps } from './Autocomplete.types';\r\nimport { useAutocomplete } from './useAutocomplete';\r\n\r\nexport const Autocomplete: React.FC<AutocompleteProps> = ({ options, value, onChange, placeholder, renderItem }) => {\r\n const { input, setInput, filtered } = useAutocomplete(options);\r\n\r\n React.useEffect(() => {\r\n if (value === undefined) return;\r\n setInput(value);\r\n }, [value]);\r\n\r\n return (\r\n <div className=\"cs-autocomplete\">\r\n <input\r\n className=\"cs-autocomplete__input\"\r\n value={input}\r\n onChange={(e) => {\r\n setInput(e.target.value);\r\n onChange?.(e.target.value || undefined);\r\n }}\r\n placeholder={placeholder}\r\n />\r\n <ul className=\"cs-autocomplete__list\">\r\n {filtered.map((opt) => (\r\n <li key={opt.value} className=\"cs-autocomplete__item\">\r\n {renderItem ? renderItem(opt) : opt.label}\r\n </li>\r\n ))}\r\n </ul>\r\n </div>\r\n );\r\n};\r\n\r\nexport default Autocomplete;\r\n","// Utility helpers\r\nexport const cn = (...parts: Array<string | false | null | undefined>) => parts.filter(Boolean).join(' ');\r\n","// Minimal styles tokens / export\r\nexport const tokens = {\r\n colors: {\r\n primary: '#0366d6'\r\n }\r\n};\r\n\r\nexport default tokens;\r\n"]}
package/package.json ADDED
@@ -0,0 +1,56 @@
1
+ {
2
+ "name": "corestack-ui",
3
+ "version": "0.1.0",
4
+ "private": false,
5
+ "description": "A minimal, production-ready React + TypeScript component library",
6
+ "main": "dist/index.cjs.js",
7
+ "module": "dist/index.esm.js",
8
+ "types": "dist/index.d.ts",
9
+ "files": [
10
+ "dist"
11
+ ],
12
+ "exports": {
13
+ ".": {
14
+ "import": "./dist/index.esm.js",
15
+ "require": "./dist/index.cjs.js",
16
+ "types": "./dist/index.d.ts"
17
+ },
18
+ "./*": "./dist/*"
19
+ },
20
+ "sideEffects": false,
21
+ "peerDependencies": {
22
+ "react": "^17 || ^18",
23
+ "react-dom": "^17 || ^18"
24
+ },
25
+ "scripts": {
26
+ "clean": "node -e \"require('fs').rmSync('dist', { recursive: true, force: true })\"",
27
+ "build": "tsup",
28
+ "dev": "tsup --watch",
29
+ "prepare": "npm run build",
30
+ "publish": "npm publish --access public"
31
+ },
32
+ "homepage": "https://github.com/username/corestack-ui#readme",
33
+ "bugs": {
34
+ "url": "https://github.com/username/corestack-ui/issues"
35
+ },
36
+ "repository": {
37
+ "type": "git",
38
+ "url": "https://github.com/ProNabowy/corestack-ui"
39
+ },
40
+ "keywords": [
41
+ "react",
42
+ "components",
43
+ "ui",
44
+ "typescript"
45
+ ],
46
+ "license": "MIT",
47
+ "engines": {
48
+ "node": ">=14"
49
+ },
50
+ "devDependencies": {
51
+ "@types/react": "^19.2.14",
52
+ "@types/react-dom": "^19.2.3",
53
+ "tsup": "^8.5.1",
54
+ "typescript": "^5.9.3"
55
+ }
56
+ }