framepexls-ui-lib 0.2.5 → 0.2.6

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.
@@ -11,7 +11,7 @@ type CheckboxProps = Omit<React__default.InputHTMLAttributes<HTMLInputElement>,
11
11
  className?: string;
12
12
  inputClassName?: string;
13
13
  };
14
- declare const Checkbox: React__default.ForwardRefExoticComponent<Omit<React__default.InputHTMLAttributes<HTMLInputElement>, "type" | "size"> & {
14
+ declare const Checkbox: React__default.ForwardRefExoticComponent<Omit<React__default.InputHTMLAttributes<HTMLInputElement>, "size" | "type"> & {
15
15
  label?: React__default.ReactNode;
16
16
  description?: React__default.ReactNode;
17
17
  error?: boolean;
@@ -11,7 +11,7 @@ type CheckboxProps = Omit<React__default.InputHTMLAttributes<HTMLInputElement>,
11
11
  className?: string;
12
12
  inputClassName?: string;
13
13
  };
14
- declare const Checkbox: React__default.ForwardRefExoticComponent<Omit<React__default.InputHTMLAttributes<HTMLInputElement>, "type" | "size"> & {
14
+ declare const Checkbox: React__default.ForwardRefExoticComponent<Omit<React__default.InputHTMLAttributes<HTMLInputElement>, "size" | "type"> & {
15
15
  label?: React__default.ReactNode;
16
16
  description?: React__default.ReactNode;
17
17
  error?: boolean;
@@ -0,0 +1,11 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+
3
+ type ColorPickerProps = {
4
+ value?: string;
5
+ onChange?: (hex: string) => void;
6
+ presets?: string[];
7
+ className?: string;
8
+ };
9
+ declare function ColorPicker({ value, onChange, presets, className }: ColorPickerProps): react_jsx_runtime.JSX.Element;
10
+
11
+ export { type ColorPickerProps, ColorPicker as default };
@@ -0,0 +1,11 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+
3
+ type ColorPickerProps = {
4
+ value?: string;
5
+ onChange?: (hex: string) => void;
6
+ presets?: string[];
7
+ className?: string;
8
+ };
9
+ declare function ColorPicker({ value, onChange, presets, className }: ColorPickerProps): react_jsx_runtime.JSX.Element;
10
+
11
+ export { type ColorPickerProps, ColorPicker as default };
@@ -0,0 +1,134 @@
1
+ "use strict";
2
+ "use client";
3
+ var __create = Object.create;
4
+ var __defProp = Object.defineProperty;
5
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
6
+ var __getOwnPropNames = Object.getOwnPropertyNames;
7
+ var __getProtoOf = Object.getPrototypeOf;
8
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
9
+ var __export = (target, all) => {
10
+ for (var name in all)
11
+ __defProp(target, name, { get: all[name], enumerable: true });
12
+ };
13
+ var __copyProps = (to, from, except, desc) => {
14
+ if (from && typeof from === "object" || typeof from === "function") {
15
+ for (let key of __getOwnPropNames(from))
16
+ if (!__hasOwnProp.call(to, key) && key !== except)
17
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
18
+ }
19
+ return to;
20
+ };
21
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
22
+ // If the importer is in node compatibility mode or this is not an ESM
23
+ // file that has been converted to a CommonJS file using a Babel-
24
+ // compatible transform (i.e. "__esModule" has not been set), then set
25
+ // "default" to the CommonJS "module.exports" for node compatibility.
26
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
27
+ mod
28
+ ));
29
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
30
+ var ColorPicker_exports = {};
31
+ __export(ColorPicker_exports, {
32
+ default: () => ColorPicker
33
+ });
34
+ module.exports = __toCommonJS(ColorPicker_exports);
35
+ var import_jsx_runtime = require("react/jsx-runtime");
36
+ var import_react = __toESM(require("react"));
37
+ var import_Input = __toESM(require("./Input"));
38
+ var import_Button = __toESM(require("./Button"));
39
+ function clamp(v, min = 0, max = 255) {
40
+ return Math.max(min, Math.min(max, v));
41
+ }
42
+ function toHex(n) {
43
+ const x = clamp(Math.round(n));
44
+ const s = x.toString(16).padStart(2, "0");
45
+ return s.toUpperCase();
46
+ }
47
+ function rgbToHex(r, g, b) {
48
+ return `#${toHex(r)}${toHex(g)}${toHex(b)}`;
49
+ }
50
+ function hexToRgb(hex) {
51
+ let h = (hex || "").trim();
52
+ if (!h) return null;
53
+ if (h.startsWith("#")) h = h.slice(1);
54
+ if (h.length === 3) h = h.split("").map((c) => c + c).join("");
55
+ if (h.length !== 6) return null;
56
+ const r = parseInt(h.slice(0, 2), 16);
57
+ const g = parseInt(h.slice(2, 4), 16);
58
+ const b = parseInt(h.slice(4, 6), 16);
59
+ if ([r, g, b].some((v) => Number.isNaN(v))) return null;
60
+ return { r, g, b };
61
+ }
62
+ function parseColor(input) {
63
+ const s = (input != null ? input : "").trim();
64
+ if (!s) return null;
65
+ const m = s.match(/^rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$/i);
66
+ if (m) {
67
+ const r = clamp(parseInt(m[1], 10));
68
+ const g = clamp(parseInt(m[2], 10));
69
+ const b = clamp(parseInt(m[3], 10));
70
+ return { hex: rgbToHex(r, g, b), r, g, b };
71
+ }
72
+ const rgb = hexToRgb(s);
73
+ if (rgb) return { hex: rgbToHex(rgb.r, rgb.g, rgb.b), ...rgb };
74
+ return null;
75
+ }
76
+ const DEFAULTS = [
77
+ "#0F172A",
78
+ "#111827",
79
+ "#1F2937",
80
+ "#334155",
81
+ "#475569",
82
+ "#64748B",
83
+ "#0EA5E9",
84
+ "#3B82F6",
85
+ "#2563EB",
86
+ "#1D4ED8",
87
+ "#7C3AED",
88
+ "#22C55E",
89
+ "#EF4444",
90
+ "#F97316",
91
+ "#F59E0B",
92
+ "#EAB308",
93
+ "#14B8A6",
94
+ "#EC4899"
95
+ ];
96
+ function ColorPicker({ value, onChange, presets = DEFAULTS, className }) {
97
+ const parsed = parseColor(value || "#0F172A");
98
+ const [hex, setHex] = import_react.default.useState(parsed.hex);
99
+ const [rgb, setRgb] = import_react.default.useState(`${parsed.r}, ${parsed.g}, ${parsed.b}`);
100
+ import_react.default.useEffect(() => {
101
+ const p = parseColor(value || "");
102
+ if (p) {
103
+ setHex(p.hex);
104
+ setRgb(`${p.r}, ${p.g}, ${p.b}`);
105
+ }
106
+ }, [value]);
107
+ const commitHex = (s) => {
108
+ const p = parseColor(s);
109
+ if (!p) return;
110
+ setHex(p.hex);
111
+ setRgb(`${p.r}, ${p.g}, ${p.b}`);
112
+ onChange == null ? void 0 : onChange(p.hex);
113
+ };
114
+ const commitRgb = (s) => {
115
+ const m = s.match(/^(\s*\d+\s*),(\s*\d+\s*),(\s*\d+\s*)$/);
116
+ if (!m) return;
117
+ const r = parseInt(m[1], 10), g = parseInt(m[2], 10), b = parseInt(m[3], 10);
118
+ const hex2 = rgbToHex(r, g, b);
119
+ setHex(hex2);
120
+ setRgb(`${clamp(r)}, ${clamp(g)}, ${clamp(b)}`);
121
+ onChange == null ? void 0 : onChange(hex2);
122
+ };
123
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: ["w-full", className].filter(Boolean).join(" "), children: [
124
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex items-center gap-3", children: [
125
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "h-9 w-9 shrink-0 rounded-xl border border-slate-300 shadow-sm dark:border-white/10", style: { backgroundColor: hex } }),
126
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "grid flex-1 grid-cols-2 gap-2", children: [
127
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_Input.default, { placeholder: "#RRGGBB", value: hex, onChange: (e) => setHex(e.target.value), onBlur: () => commitHex(hex) }),
128
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_Input.default, { placeholder: "r, g, b", value: rgb, onChange: (e) => setRgb(e.target.value), onBlur: () => commitRgb(rgb) })
129
+ ] }),
130
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_Button.default, { size: "sm", variant: "secondary", onClick: () => commitHex(hex), children: "Aplicar" })
131
+ ] }),
132
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "mt-2 grid grid-cols-9 gap-1", children: presets.map((c) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", { type: "button", title: c, className: "h-6 w-6 rounded-lg border border-slate-300 shadow-sm transition hover:scale-105 active:scale-95 dark:border-white/10", style: { backgroundColor: c }, onClick: () => onChange == null ? void 0 : onChange(c) }, c)) })
133
+ ] });
134
+ }
@@ -0,0 +1,104 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import React from "react";
4
+ import Input from "./Input";
5
+ import Button from "./Button";
6
+ function clamp(v, min = 0, max = 255) {
7
+ return Math.max(min, Math.min(max, v));
8
+ }
9
+ function toHex(n) {
10
+ const x = clamp(Math.round(n));
11
+ const s = x.toString(16).padStart(2, "0");
12
+ return s.toUpperCase();
13
+ }
14
+ function rgbToHex(r, g, b) {
15
+ return `#${toHex(r)}${toHex(g)}${toHex(b)}`;
16
+ }
17
+ function hexToRgb(hex) {
18
+ let h = (hex || "").trim();
19
+ if (!h) return null;
20
+ if (h.startsWith("#")) h = h.slice(1);
21
+ if (h.length === 3) h = h.split("").map((c) => c + c).join("");
22
+ if (h.length !== 6) return null;
23
+ const r = parseInt(h.slice(0, 2), 16);
24
+ const g = parseInt(h.slice(2, 4), 16);
25
+ const b = parseInt(h.slice(4, 6), 16);
26
+ if ([r, g, b].some((v) => Number.isNaN(v))) return null;
27
+ return { r, g, b };
28
+ }
29
+ function parseColor(input) {
30
+ const s = (input != null ? input : "").trim();
31
+ if (!s) return null;
32
+ const m = s.match(/^rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$/i);
33
+ if (m) {
34
+ const r = clamp(parseInt(m[1], 10));
35
+ const g = clamp(parseInt(m[2], 10));
36
+ const b = clamp(parseInt(m[3], 10));
37
+ return { hex: rgbToHex(r, g, b), r, g, b };
38
+ }
39
+ const rgb = hexToRgb(s);
40
+ if (rgb) return { hex: rgbToHex(rgb.r, rgb.g, rgb.b), ...rgb };
41
+ return null;
42
+ }
43
+ const DEFAULTS = [
44
+ "#0F172A",
45
+ "#111827",
46
+ "#1F2937",
47
+ "#334155",
48
+ "#475569",
49
+ "#64748B",
50
+ "#0EA5E9",
51
+ "#3B82F6",
52
+ "#2563EB",
53
+ "#1D4ED8",
54
+ "#7C3AED",
55
+ "#22C55E",
56
+ "#EF4444",
57
+ "#F97316",
58
+ "#F59E0B",
59
+ "#EAB308",
60
+ "#14B8A6",
61
+ "#EC4899"
62
+ ];
63
+ function ColorPicker({ value, onChange, presets = DEFAULTS, className }) {
64
+ const parsed = parseColor(value || "#0F172A");
65
+ const [hex, setHex] = React.useState(parsed.hex);
66
+ const [rgb, setRgb] = React.useState(`${parsed.r}, ${parsed.g}, ${parsed.b}`);
67
+ React.useEffect(() => {
68
+ const p = parseColor(value || "");
69
+ if (p) {
70
+ setHex(p.hex);
71
+ setRgb(`${p.r}, ${p.g}, ${p.b}`);
72
+ }
73
+ }, [value]);
74
+ const commitHex = (s) => {
75
+ const p = parseColor(s);
76
+ if (!p) return;
77
+ setHex(p.hex);
78
+ setRgb(`${p.r}, ${p.g}, ${p.b}`);
79
+ onChange == null ? void 0 : onChange(p.hex);
80
+ };
81
+ const commitRgb = (s) => {
82
+ const m = s.match(/^(\s*\d+\s*),(\s*\d+\s*),(\s*\d+\s*)$/);
83
+ if (!m) return;
84
+ const r = parseInt(m[1], 10), g = parseInt(m[2], 10), b = parseInt(m[3], 10);
85
+ const hex2 = rgbToHex(r, g, b);
86
+ setHex(hex2);
87
+ setRgb(`${clamp(r)}, ${clamp(g)}, ${clamp(b)}`);
88
+ onChange == null ? void 0 : onChange(hex2);
89
+ };
90
+ return /* @__PURE__ */ jsxs("div", { className: ["w-full", className].filter(Boolean).join(" "), children: [
91
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3", children: [
92
+ /* @__PURE__ */ jsx("div", { className: "h-9 w-9 shrink-0 rounded-xl border border-slate-300 shadow-sm dark:border-white/10", style: { backgroundColor: hex } }),
93
+ /* @__PURE__ */ jsxs("div", { className: "grid flex-1 grid-cols-2 gap-2", children: [
94
+ /* @__PURE__ */ jsx(Input, { placeholder: "#RRGGBB", value: hex, onChange: (e) => setHex(e.target.value), onBlur: () => commitHex(hex) }),
95
+ /* @__PURE__ */ jsx(Input, { placeholder: "r, g, b", value: rgb, onChange: (e) => setRgb(e.target.value), onBlur: () => commitRgb(rgb) })
96
+ ] }),
97
+ /* @__PURE__ */ jsx(Button, { size: "sm", variant: "secondary", onClick: () => commitHex(hex), children: "Aplicar" })
98
+ ] }),
99
+ /* @__PURE__ */ jsx("div", { className: "mt-2 grid grid-cols-9 gap-1", children: presets.map((c) => /* @__PURE__ */ jsx("button", { type: "button", title: c, className: "h-6 w-6 rounded-lg border border-slate-300 shadow-sm transition hover:scale-105 active:scale-95 dark:border-white/10", style: { backgroundColor: c }, onClick: () => onChange == null ? void 0 : onChange(c) }, c)) })
100
+ ] });
101
+ }
102
+ export {
103
+ ColorPicker as default
104
+ };
package/dist/index.d.mts CHANGED
@@ -47,5 +47,6 @@ export { default as TimePanel } from './TimePanel.mjs';
47
47
  export { TimeRange, default as TimeRangeField, TimeRangeFieldProps } from './TimeRangeField.mjs';
48
48
  export { StepDef, default as Steps, StepsNav } from './Steps.mjs';
49
49
  export { Aficionados, AuditarDocumento, Borrar, CajaDeMano, Cajas, Calendario, ChevronLeftRightIcon, CirculoAdvertencia, CirculoExito, CirculoPeligro, CirculoPorDefecto, ClientsIcon, CloseIcon, ContraseniaDeEmailIcon, Cotizaciones, DashboardIcon, Directorio, Edificio, Editar, Empresa, EscaneoFacial, EyeIcon, FlechaAbajo, FlechaArriba, Imagenes, LlamadaTelefonica, LogoutIcon, MarketingDigital, MediosDeComunicacionSocial, MenuIcon, MenuPuntosVerticalIcon, Nota, Ojo, OrdersIcon, PencilIcon, PermsIcon, ProductsIcon, PromoIcon, Retroalimentacion, RolesIcon, Sobre, Tablero, Tarea, Tickets, TrabajoEnEquipo, TrashIcon, UserIcon, UsersIcon, UsuarioProhibidoIcon, Usuarios } from './iconos/index.mjs';
50
+ export { default as ColorPicker, ColorPickerProps } from './ColorPicker.mjs';
50
51
  import 'react';
51
52
  import 'react/jsx-runtime';
package/dist/index.d.ts CHANGED
@@ -47,5 +47,6 @@ export { default as TimePanel } from './TimePanel.js';
47
47
  export { TimeRange, default as TimeRangeField, TimeRangeFieldProps } from './TimeRangeField.js';
48
48
  export { StepDef, default as Steps, StepsNav } from './Steps.js';
49
49
  export { Aficionados, AuditarDocumento, Borrar, CajaDeMano, Cajas, Calendario, ChevronLeftRightIcon, CirculoAdvertencia, CirculoExito, CirculoPeligro, CirculoPorDefecto, ClientsIcon, CloseIcon, ContraseniaDeEmailIcon, Cotizaciones, DashboardIcon, Directorio, Edificio, Editar, Empresa, EscaneoFacial, EyeIcon, FlechaAbajo, FlechaArriba, Imagenes, LlamadaTelefonica, LogoutIcon, MarketingDigital, MediosDeComunicacionSocial, MenuIcon, MenuPuntosVerticalIcon, Nota, Ojo, OrdersIcon, PencilIcon, PermsIcon, ProductsIcon, PromoIcon, Retroalimentacion, RolesIcon, Sobre, Tablero, Tarea, Tickets, TrabajoEnEquipo, TrashIcon, UserIcon, UsersIcon, UsuarioProhibidoIcon, Usuarios } from './iconos/index.js';
50
+ export { default as ColorPicker, ColorPickerProps } from './ColorPicker.js';
50
51
  import 'react';
51
52
  import 'react/jsx-runtime';
package/dist/index.js CHANGED
@@ -42,6 +42,7 @@ __export(index_exports, {
42
42
  ChartCard: () => import_ChartCard.default,
43
43
  Checkbox: () => import_Checkbox.default,
44
44
  CheckboxPillsGroup: () => import_CheckboxPillsGroup.default,
45
+ ColorPicker: () => import_ColorPicker.default,
45
46
  ColumnSelector: () => import_ColumnSelector.default,
46
47
  ComboSelect: () => import_ComboSelect.default,
47
48
  CtrHorizontalBar: () => import_AnalyticsCharts.CtrHorizontalBar,
@@ -142,6 +143,7 @@ var import_TimeRangeField = __toESM(require("./TimeRangeField"));
142
143
  var import_Steps = __toESM(require("./Steps"));
143
144
  var import_Steps2 = require("./Steps");
144
145
  __reExport(index_exports, require("./iconos"), module.exports);
146
+ var import_ColorPicker = __toESM(require("./ColorPicker"));
145
147
  // Annotate the CommonJS export names for ESM import in node:
146
148
  0 && (module.exports = {
147
149
  ActionIconButton,
@@ -157,6 +159,7 @@ __reExport(index_exports, require("./iconos"), module.exports);
157
159
  ChartCard,
158
160
  Checkbox,
159
161
  CheckboxPillsGroup,
162
+ ColorPicker,
160
163
  ColumnSelector,
161
164
  ComboSelect,
162
165
  CtrHorizontalBar,
package/dist/index.mjs CHANGED
@@ -52,6 +52,7 @@ import { default as default45 } from "./TimeRangeField";
52
52
  import { default as default46 } from "./Steps";
53
53
  import { StepsNav } from "./Steps";
54
54
  export * from "./iconos";
55
+ import { default as default47 } from "./ColorPicker";
55
56
  export {
56
57
  default3 as ActionIconButton,
57
58
  default31 as AppTopbar,
@@ -66,6 +67,7 @@ export {
66
67
  default17 as ChartCard,
67
68
  default6 as Checkbox,
68
69
  default7 as CheckboxPillsGroup,
70
+ default47 as ColorPicker,
69
71
  default11 as ColumnSelector,
70
72
  default10 as ComboSelect,
71
73
  CtrHorizontalBar,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "framepexls-ui-lib",
3
- "version": "0.2.5",
3
+ "version": "0.2.6",
4
4
  "private": false,
5
5
  "license": "MIT",
6
6
  "description": "Componentes UI de Framepexls para React/Next.",