lkd-web-kit 0.10.1 → 0.10.3
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/.agents/skills/mantine-combobox/SKILL.md +73 -0
- package/.agents/skills/mantine-combobox/references/api.md +199 -0
- package/.agents/skills/mantine-combobox/references/patterns.md +279 -0
- package/.agents/skills/mantine-custom-components/SKILL.md +112 -0
- package/.agents/skills/mantine-custom-components/references/api.md +407 -0
- package/.agents/skills/mantine-custom-components/references/patterns.md +431 -0
- package/.agents/skills/publish-lkd-web-kit/SKILL.md +172 -0
- package/.agents/skills/publish-lkd-web-kit/agents/openai.yaml +4 -0
- package/.agents/skills/publish-lkd-web-kit/references/npm-trusted-publishing.md +82 -0
- package/.agents/skills/update-lkd-dependencies/SKILL.md +88 -0
- package/.agents/skills/update-lkd-dependencies/agents/openai.yaml +4 -0
- package/.agents/skills/update-lkd-dependencies/scripts/collect-npm-metadata.mjs +73 -0
- package/dist/components/MyTable/MyTable.cjs +172 -0
- package/dist/components/MyTable/MyTable.d.ts +18 -0
- package/dist/components/MyTable/MyTable.d.ts.map +1 -0
- package/dist/components/MyTable/MyTable.js +170 -0
- package/dist/components/MyTable/index.d.ts +3 -0
- package/dist/components/MyTable/index.d.ts.map +1 -0
- package/dist/components/TableWrapper/TableWrapper.cjs +13 -0
- package/dist/components/TableWrapper/TableWrapper.d.ts +8 -0
- package/dist/components/TableWrapper/TableWrapper.d.ts.map +1 -0
- package/dist/components/TableWrapper/TableWrapper.js +11 -0
- package/dist/components/TableWrapper/TableWrapperFooter.cjs +11 -0
- package/dist/components/TableWrapper/TableWrapperFooter.d.ts +5 -0
- package/dist/components/TableWrapper/TableWrapperFooter.d.ts.map +1 -0
- package/dist/components/TableWrapper/TableWrapperFooter.js +9 -0
- package/dist/components/TableWrapper/TableWrapperHeader.cjs +11 -0
- package/dist/components/TableWrapper/TableWrapperHeader.d.ts +5 -0
- package/dist/components/TableWrapper/TableWrapperHeader.d.ts.map +1 -0
- package/dist/components/TableWrapper/TableWrapperHeader.js +9 -0
- package/dist/components/TableWrapper/TableWrapperPagination.cjs +31 -0
- package/dist/components/TableWrapper/TableWrapperPagination.d.ts +16 -0
- package/dist/components/TableWrapper/TableWrapperPagination.d.ts.map +1 -0
- package/dist/components/TableWrapper/TableWrapperPagination.js +30 -0
- package/dist/components/TableWrapper/TableWrapperTitle.cjs +11 -0
- package/dist/components/TableWrapper/TableWrapperTitle.d.ts +5 -0
- package/dist/components/TableWrapper/TableWrapperTitle.d.ts.map +1 -0
- package/dist/components/TableWrapper/TableWrapperTitle.js +9 -0
- package/dist/components/TableWrapper/index.d.ts +11 -0
- package/dist/components/TableWrapper/index.d.ts.map +1 -0
- package/dist/components/index.d.ts +2 -0
- package/dist/components/index.d.ts.map +1 -1
- package/dist/index.cjs +14 -0
- package/dist/index.js +8 -1
- package/dist/mantine/breakpoints-with-px.cjs +3 -2
- package/dist/mantine/breakpoints-with-px.d.ts +2 -1
- package/dist/mantine/breakpoints-with-px.d.ts.map +1 -1
- package/dist/mantine/breakpoints-with-px.js +3 -2
- package/dist/mantine/create-lkd-theme.cjs +7 -0
- package/dist/mantine/create-lkd-theme.d.ts +3 -0
- package/dist/mantine/create-lkd-theme.d.ts.map +1 -0
- package/dist/mantine/create-lkd-theme.js +6 -0
- package/dist/mantine/index.d.ts +1 -0
- package/dist/mantine/index.d.ts.map +1 -1
- package/package.json +5 -3
- package/scripts/{install-codex-skills.mjs → install-agent-skills.mjs} +1 -1
- package/codex/skills/create-modal-component/SKILL.md +0 -168
- package/codex/skills/create-modal-component/agents/openai.yaml +0 -4
- package/codex/skills/create-svg-icon/SKILL.md +0 -41
- package/codex/skills/create-svg-icon/agents/openai.yaml +0 -3
- package/codex/skills/create-table-component/SKILL.md +0 -187
- package/codex/skills/create-table-component/agents/openai.yaml +0 -3
- package/codex/skills/rhf-lkd-forms/SKILL.md +0 -186
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
require("../../_virtual/_rolldown/runtime.cjs");
|
|
2
|
+
let _mantine_core = require("@mantine/core");
|
|
3
|
+
let react_jsx_runtime = require("react/jsx-runtime");
|
|
4
|
+
//#region src/components/TableWrapper/TableWrapperPagination.tsx
|
|
5
|
+
var TableWrapperPagination = ({ variant = "long", text, totalRows = 15, pageSize = 10, currentRows = pageSize, value = 1, ...props }) => {
|
|
6
|
+
if (variant === "short") {
|
|
7
|
+
const start = totalRows > 0 ? (value - 1) * pageSize + 1 : 0;
|
|
8
|
+
const end = Math.min(start + currentRows - 1, totalRows);
|
|
9
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
10
|
+
className: "flex w-full items-center justify-end gap-3",
|
|
11
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
12
|
+
className: "text-grey-7 text-sm",
|
|
13
|
+
children: text ?? `${start}-${end} de ${totalRows} filas`
|
|
14
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mantine_core.Pagination, {
|
|
15
|
+
withPages: false,
|
|
16
|
+
value,
|
|
17
|
+
...props
|
|
18
|
+
})]
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mantine_core.Pagination, {
|
|
22
|
+
boundaries: 0,
|
|
23
|
+
siblings: 2,
|
|
24
|
+
withEdges: true,
|
|
25
|
+
classNames: { dots: "hidden" },
|
|
26
|
+
value,
|
|
27
|
+
...props
|
|
28
|
+
});
|
|
29
|
+
};
|
|
30
|
+
//#endregion
|
|
31
|
+
exports.default = TableWrapperPagination;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { PaginationProps } from '@mantine/core';
|
|
2
|
+
type TableWrapperPaginationBaseProps = Omit<PaginationProps, 'boundaries' | 'siblings' | 'withControls' | 'withEdges' | 'variant'> & {
|
|
3
|
+
text?: string;
|
|
4
|
+
totalRows?: number;
|
|
5
|
+
currentRows?: number;
|
|
6
|
+
};
|
|
7
|
+
export type TableWrapperPaginationProps = (TableWrapperPaginationBaseProps & {
|
|
8
|
+
variant?: 'long';
|
|
9
|
+
pageSize?: number;
|
|
10
|
+
}) | (TableWrapperPaginationBaseProps & {
|
|
11
|
+
variant: 'short';
|
|
12
|
+
pageSize: number;
|
|
13
|
+
});
|
|
14
|
+
declare const TableWrapperPagination: ({ variant, text, totalRows, pageSize, currentRows, value, ...props }: TableWrapperPaginationProps) => import("react/jsx-runtime").JSX.Element;
|
|
15
|
+
export default TableWrapperPagination;
|
|
16
|
+
//# sourceMappingURL=TableWrapperPagination.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TableWrapperPagination.d.ts","sourceRoot":"","sources":["../../../src/components/TableWrapper/TableWrapperPagination.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAc,eAAe,EAAE,MAAM,eAAe,CAAA;AAE3D,KAAK,+BAA+B,GAAG,IAAI,CACzC,eAAe,EACf,YAAY,GAAG,UAAU,GAAG,cAAc,GAAG,WAAW,GAAG,SAAS,CACrE,GAAG;IACF,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB,CAAA;AAED,MAAM,MAAM,2BAA2B,GACnC,CAAC,+BAA+B,GAAG;IACjC,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB,CAAC,GACF,CAAC,+BAA+B,GAAG;IACjC,OAAO,EAAE,OAAO,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;CACjB,CAAC,CAAA;AAEN,QAAA,MAAM,sBAAsB,GAAI,sEAQ7B,2BAA2B,4CAyB7B,CAAA;AAED,eAAe,sBAAsB,CAAA"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { Pagination } from "@mantine/core";
|
|
2
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
//#region src/components/TableWrapper/TableWrapperPagination.tsx
|
|
4
|
+
var TableWrapperPagination = ({ variant = "long", text, totalRows = 15, pageSize = 10, currentRows = pageSize, value = 1, ...props }) => {
|
|
5
|
+
if (variant === "short") {
|
|
6
|
+
const start = totalRows > 0 ? (value - 1) * pageSize + 1 : 0;
|
|
7
|
+
const end = Math.min(start + currentRows - 1, totalRows);
|
|
8
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
9
|
+
className: "flex w-full items-center justify-end gap-3",
|
|
10
|
+
children: [/* @__PURE__ */ jsx("span", {
|
|
11
|
+
className: "text-grey-7 text-sm",
|
|
12
|
+
children: text ?? `${start}-${end} de ${totalRows} filas`
|
|
13
|
+
}), /* @__PURE__ */ jsx(Pagination, {
|
|
14
|
+
withPages: false,
|
|
15
|
+
value,
|
|
16
|
+
...props
|
|
17
|
+
})]
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
return /* @__PURE__ */ jsx(Pagination, {
|
|
21
|
+
boundaries: 0,
|
|
22
|
+
siblings: 2,
|
|
23
|
+
withEdges: true,
|
|
24
|
+
classNames: { dots: "hidden" },
|
|
25
|
+
value,
|
|
26
|
+
...props
|
|
27
|
+
});
|
|
28
|
+
};
|
|
29
|
+
//#endregion
|
|
30
|
+
export { TableWrapperPagination as default };
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
const require_runtime = require("../../_virtual/_rolldown/runtime.cjs");
|
|
2
|
+
let react_jsx_runtime = require("react/jsx-runtime");
|
|
3
|
+
let clsx = require("clsx");
|
|
4
|
+
clsx = require_runtime.__toESM(clsx, 1);
|
|
5
|
+
//#region src/components/TableWrapper/TableWrapperTitle.tsx
|
|
6
|
+
var TableWrapperTitle = ({ className, ...props }) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
7
|
+
className: (0, clsx.default)("font-semibold text-lg", className),
|
|
8
|
+
...props
|
|
9
|
+
});
|
|
10
|
+
//#endregion
|
|
11
|
+
exports.default = TableWrapperTitle;
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { ComponentProps } from 'react';
|
|
2
|
+
export type TableWrapperTitleProps = ComponentProps<'p'>;
|
|
3
|
+
declare const TableWrapperTitle: ({ className, ...props }: TableWrapperTitleProps) => import("react/jsx-runtime").JSX.Element;
|
|
4
|
+
export default TableWrapperTitle;
|
|
5
|
+
//# sourceMappingURL=TableWrapperTitle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TableWrapperTitle.d.ts","sourceRoot":"","sources":["../../../src/components/TableWrapper/TableWrapperTitle.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,OAAO,CAAA;AAEtC,MAAM,MAAM,sBAAsB,GAAG,cAAc,CAAC,GAAG,CAAC,CAAA;AAExD,QAAA,MAAM,iBAAiB,GAAI,yBAAyB,sBAAsB,4CAEzE,CAAA;AAED,eAAe,iBAAiB,CAAA"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
import clsx from "clsx";
|
|
3
|
+
//#region src/components/TableWrapper/TableWrapperTitle.tsx
|
|
4
|
+
var TableWrapperTitle = ({ className, ...props }) => /* @__PURE__ */ jsx("p", {
|
|
5
|
+
className: clsx("font-semibold text-lg", className),
|
|
6
|
+
...props
|
|
7
|
+
});
|
|
8
|
+
//#endregion
|
|
9
|
+
export { TableWrapperTitle as default };
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export type { TableWrapperProps } from './TableWrapper';
|
|
2
|
+
export { default as TableWrapper } from './TableWrapper';
|
|
3
|
+
export type { TableWrapperFooterProps } from './TableWrapperFooter';
|
|
4
|
+
export { default as TableWrapperFooter } from './TableWrapperFooter';
|
|
5
|
+
export type { TableWrapperHeaderProps } from './TableWrapperHeader';
|
|
6
|
+
export { default as TableWrapperHeader } from './TableWrapperHeader';
|
|
7
|
+
export type { TableWrapperPaginationProps } from './TableWrapperPagination';
|
|
8
|
+
export { default as TableWrapperPagination } from './TableWrapperPagination';
|
|
9
|
+
export type { TableWrapperTitleProps } from './TableWrapperTitle';
|
|
10
|
+
export { default as TableWrapperTitle } from './TableWrapperTitle';
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/TableWrapper/index.tsx"],"names":[],"mappings":"AAAA,YAAY,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AACvD,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,gBAAgB,CAAA;AACxD,YAAY,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAA;AACnE,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AACpE,YAAY,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAA;AACnE,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AACpE,YAAY,EAAE,2BAA2B,EAAE,MAAM,0BAA0B,CAAA;AAC3E,OAAO,EAAE,OAAO,IAAI,sBAAsB,EAAE,MAAM,0BAA0B,CAAA;AAC5E,YAAY,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAA;AACjE,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,qBAAqB,CAAA"}
|
|
@@ -12,8 +12,10 @@ export * from './MyNotifications';
|
|
|
12
12
|
export * from './MyNumberInput';
|
|
13
13
|
export * from './MyRadioGroup';
|
|
14
14
|
export * from './MySelect';
|
|
15
|
+
export * from './MyTable';
|
|
15
16
|
export * from './MyTextarea';
|
|
16
17
|
export * from './MyTextInput';
|
|
17
18
|
export * from './MyTimeInput';
|
|
18
19
|
export * from './NavItems';
|
|
20
|
+
export * from './TableWrapper';
|
|
19
21
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAA;AAC5B,cAAc,QAAQ,CAAA;AACtB,cAAc,0BAA0B,CAAA;AACxC,cAAc,kBAAkB,CAAA;AAChC,cAAc,mBAAmB,CAAA;AACjC,cAAc,eAAe,CAAA;AAE7B,cAAc,qBAAqB,CAAA;AACnC,cAAc,oBAAoB,CAAA;AAClC,cAAc,sBAAsB,CAAA;AACpC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,mBAAmB,CAAA;AACjC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,YAAY,CAAA;AAC1B,cAAc,cAAc,CAAA;AAC5B,cAAc,eAAe,CAAA;AAC7B,cAAc,eAAe,CAAA;AAC7B,cAAc,YAAY,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAA;AAC5B,cAAc,QAAQ,CAAA;AACtB,cAAc,0BAA0B,CAAA;AACxC,cAAc,kBAAkB,CAAA;AAChC,cAAc,mBAAmB,CAAA;AACjC,cAAc,eAAe,CAAA;AAE7B,cAAc,qBAAqB,CAAA;AACnC,cAAc,oBAAoB,CAAA;AAClC,cAAc,sBAAsB,CAAA;AACpC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,mBAAmB,CAAA;AACjC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,YAAY,CAAA;AAC1B,cAAc,WAAW,CAAA;AACzB,cAAc,cAAc,CAAA;AAC5B,cAAc,eAAe,CAAA;AAC7B,cAAc,eAAe,CAAA;AAC7B,cAAc,YAAY,CAAA;AAC1B,cAAc,gBAAgB,CAAA"}
|
package/dist/index.cjs
CHANGED
|
@@ -14,10 +14,16 @@ const require_index$9 = require("./components/MyNotifications/index.cjs");
|
|
|
14
14
|
const require_index$10 = require("./components/MyNumberInput/index.cjs");
|
|
15
15
|
const require_index$11 = require("./components/MyRadioGroup/index.cjs");
|
|
16
16
|
const require_index$12 = require("./components/MySelect/index.cjs");
|
|
17
|
+
const require_MyTable = require("./components/MyTable/MyTable.cjs");
|
|
17
18
|
const require_index$13 = require("./components/MyTextarea/index.cjs");
|
|
18
19
|
const require_index$14 = require("./components/MyTextInput/index.cjs");
|
|
19
20
|
const require_index$15 = require("./components/MyTimeInput/index.cjs");
|
|
20
21
|
const require_NavItems = require("./components/NavItems.cjs");
|
|
22
|
+
const require_TableWrapper = require("./components/TableWrapper/TableWrapper.cjs");
|
|
23
|
+
const require_TableWrapperFooter = require("./components/TableWrapper/TableWrapperFooter.cjs");
|
|
24
|
+
const require_TableWrapperHeader = require("./components/TableWrapper/TableWrapperHeader.cjs");
|
|
25
|
+
const require_TableWrapperPagination = require("./components/TableWrapper/TableWrapperPagination.cjs");
|
|
26
|
+
const require_TableWrapperTitle = require("./components/TableWrapper/TableWrapperTitle.cjs");
|
|
21
27
|
const require_http_status = require("./consts/http-status.cjs");
|
|
22
28
|
const require_revalidate = require("./consts/revalidate.cjs");
|
|
23
29
|
const require_index$16 = require("./contexts/ModalManagerContext/index.cjs");
|
|
@@ -52,6 +58,7 @@ const require_useFetchNextPageOnScroll = require("./hooks/useFetchNextPageOnScro
|
|
|
52
58
|
const require_useUpdateSearchParams = require("./hooks/useUpdateSearchParams.cjs");
|
|
53
59
|
const require_useZodConfig = require("./hooks/useZodConfig.cjs");
|
|
54
60
|
const require_my_default_theme = require("./mantine/my-default-theme.cjs");
|
|
61
|
+
const require_create_lkd_theme = require("./mantine/create-lkd-theme.cjs");
|
|
55
62
|
const require_to_tailwind_colors = require("./mantine/to-tailwind-colors.cjs");
|
|
56
63
|
const require_groupBy = require("./utils/array/groupBy.cjs");
|
|
57
64
|
const require_shuffleArray = require("./utils/array/shuffleArray.cjs");
|
|
@@ -93,6 +100,7 @@ exports.MyNotifications = require_index$9.MyNotifications;
|
|
|
93
100
|
exports.MyNumberInput = require_index$10.MyNumberInput;
|
|
94
101
|
exports.MyRadioGroup = require_index$11.MyRadioGroup;
|
|
95
102
|
exports.MySelect = require_index$12.MySelect;
|
|
103
|
+
exports.MyTable = require_MyTable;
|
|
96
104
|
exports.MyTextInput = require_index$14.MyTextInput;
|
|
97
105
|
exports.MyTextarea = require_index$13.MyTextarea;
|
|
98
106
|
exports.MyTimeInput = require_index$15.MyTimeInput;
|
|
@@ -101,8 +109,14 @@ exports.NavigationHistoryProvider = require_index$17.NavigationHistoryProvider;
|
|
|
101
109
|
exports.PageDataProvider = require_index$18.PageDataProvider;
|
|
102
110
|
exports.QP_BACK_URL_NAME = require_hook.QP_BACK_URL_NAME;
|
|
103
111
|
exports.Revalidate = require_revalidate.Revalidate;
|
|
112
|
+
exports.TableWrapper = require_TableWrapper;
|
|
113
|
+
exports.TableWrapperFooter = require_TableWrapperFooter;
|
|
114
|
+
exports.TableWrapperHeader = require_TableWrapperHeader;
|
|
115
|
+
exports.TableWrapperPagination = require_TableWrapperPagination;
|
|
116
|
+
exports.TableWrapperTitle = require_TableWrapperTitle;
|
|
104
117
|
exports.addBodyJsonHook = require_addBodyJsonHook.addBodyJsonHook;
|
|
105
118
|
exports.breakpointsWithPx = require_breakpoints_with_px.breakpointsWithPx;
|
|
119
|
+
exports.createLkdTheme = require_create_lkd_theme.createLkdTheme;
|
|
106
120
|
exports.createNewRoute = require_new_route.createNewRoute;
|
|
107
121
|
exports.formatBytes = require_formatBytes.formatBytes;
|
|
108
122
|
exports.getVirtualContainerProps = require_virtual_styles.getVirtualContainerProps;
|
package/dist/index.js
CHANGED
|
@@ -13,10 +13,16 @@ import { MyNotifications } from "./components/MyNotifications/index.js";
|
|
|
13
13
|
import { MyNumberInput } from "./components/MyNumberInput/index.js";
|
|
14
14
|
import { MyRadioGroup } from "./components/MyRadioGroup/index.js";
|
|
15
15
|
import { MySelect } from "./components/MySelect/index.js";
|
|
16
|
+
import MyTable from "./components/MyTable/MyTable.js";
|
|
16
17
|
import { MyTextarea } from "./components/MyTextarea/index.js";
|
|
17
18
|
import { MyTextInput } from "./components/MyTextInput/index.js";
|
|
18
19
|
import { MyTimeInput } from "./components/MyTimeInput/index.js";
|
|
19
20
|
import { NavItems } from "./components/NavItems.js";
|
|
21
|
+
import TableWrapper from "./components/TableWrapper/TableWrapper.js";
|
|
22
|
+
import TableWrapperFooter from "./components/TableWrapper/TableWrapperFooter.js";
|
|
23
|
+
import TableWrapperHeader from "./components/TableWrapper/TableWrapperHeader.js";
|
|
24
|
+
import TableWrapperPagination from "./components/TableWrapper/TableWrapperPagination.js";
|
|
25
|
+
import TableWrapperTitle from "./components/TableWrapper/TableWrapperTitle.js";
|
|
20
26
|
import { HttpStatus } from "./consts/http-status.js";
|
|
21
27
|
import { Revalidate } from "./consts/revalidate.js";
|
|
22
28
|
import { ModalManagerProvider, useModalManager } from "./contexts/ModalManagerContext/index.js";
|
|
@@ -51,6 +57,7 @@ import { useFetchNextPageOnScroll } from "./hooks/useFetchNextPageOnScroll.js";
|
|
|
51
57
|
import { useUpdateSearchParams } from "./hooks/useUpdateSearchParams.js";
|
|
52
58
|
import { useZodConfig } from "./hooks/useZodConfig.js";
|
|
53
59
|
import { myDefaultTheme } from "./mantine/my-default-theme.js";
|
|
60
|
+
import { createLkdTheme } from "./mantine/create-lkd-theme.js";
|
|
54
61
|
import { toTailwindColors } from "./mantine/to-tailwind-colors.js";
|
|
55
62
|
import { groupBy, indexBy } from "./utils/array/groupBy.js";
|
|
56
63
|
import { shuffleArray } from "./utils/array/shuffleArray.js";
|
|
@@ -60,4 +67,4 @@ import { addBodyJsonHook } from "./utils/ky/addBodyJsonHook.js";
|
|
|
60
67
|
import { parseJSON } from "./utils/ky/parseJson.js";
|
|
61
68
|
import { queryStringify } from "./utils/query-stringify.js";
|
|
62
69
|
import { createNewRoute, newRoute } from "./utils/new-route.js";
|
|
63
|
-
export { EmptyState, Form, FormCheckbox, FormCheckboxGroup, FormDateInput, FormDatePickerInput, FormDateTimePicker, FormInfinitySelect, FormMonthPickerInput, FormMultiSelect, FormNumberInput, FormRadioGroup, FormSelect, FormSubmitButton, FormTextInput, FormTextarea, FormTimeInput, HttpStatus, Icon, InfinityLoadMoreButton, InfinitySelect, ModalManagerProvider, MyCheckboxGroup, MyDateInput, MyDatePickerInput, MyDateTimePicker, MyMonthPickerInput, MyMultiSelect, MyNotifications, MyNumberInput, MyRadioGroup, MySelect, MyTextInput, MyTextarea, MyTimeInput, NavItems, NavigationHistoryProvider, PageDataProvider, QP_BACK_URL_NAME, Revalidate, addBodyJsonHook, breakpointsWithPx, createNewRoute, formatBytes, getVirtualContainerProps, getVirtualItemProps, groupBy, indexBy, isInfinityEmpty, myDefaultTheme, newRoute, nullableButRequired, numberToTimeInput, optionalButRequired, parseJSON, queryStringify, shuffleArray, timeInputToNumber, toTailwindColors, useBreakpoint, useFetchNextPageOnScroll, useModalManager, useNavigationHistory, useOnScrollProgress, usePageData, useUpdateSearchParams, useZodConfig, withController, withModalManager, zodValidator };
|
|
70
|
+
export { EmptyState, Form, FormCheckbox, FormCheckboxGroup, FormDateInput, FormDatePickerInput, FormDateTimePicker, FormInfinitySelect, FormMonthPickerInput, FormMultiSelect, FormNumberInput, FormRadioGroup, FormSelect, FormSubmitButton, FormTextInput, FormTextarea, FormTimeInput, HttpStatus, Icon, InfinityLoadMoreButton, InfinitySelect, ModalManagerProvider, MyCheckboxGroup, MyDateInput, MyDatePickerInput, MyDateTimePicker, MyMonthPickerInput, MyMultiSelect, MyNotifications, MyNumberInput, MyRadioGroup, MySelect, MyTable, MyTextInput, MyTextarea, MyTimeInput, NavItems, NavigationHistoryProvider, PageDataProvider, QP_BACK_URL_NAME, Revalidate, TableWrapper, TableWrapperFooter, TableWrapperHeader, TableWrapperPagination, TableWrapperTitle, addBodyJsonHook, breakpointsWithPx, createLkdTheme, createNewRoute, formatBytes, getVirtualContainerProps, getVirtualItemProps, groupBy, indexBy, isInfinityEmpty, myDefaultTheme, newRoute, nullableButRequired, numberToTimeInput, optionalButRequired, parseJSON, queryStringify, shuffleArray, timeInputToNumber, toTailwindColors, useBreakpoint, useFetchNextPageOnScroll, useModalManager, useNavigationHistory, useOnScrollProgress, usePageData, useUpdateSearchParams, useZodConfig, withController, withModalManager, zodValidator };
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
//#region src/mantine/breakpoints-with-px.ts
|
|
2
2
|
var breakpointsWithPx = {
|
|
3
|
-
xs: "
|
|
3
|
+
xs: "540px",
|
|
4
4
|
sm: "640px",
|
|
5
5
|
md: "768px",
|
|
6
6
|
lg: "1024px",
|
|
7
7
|
xl: "1280px",
|
|
8
|
-
|
|
8
|
+
"2xl": "1536px",
|
|
9
|
+
"3xl": "1680px"
|
|
9
10
|
};
|
|
10
11
|
//#endregion
|
|
11
12
|
exports.breakpointsWithPx = breakpointsWithPx;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"breakpoints-with-px.d.ts","sourceRoot":"","sources":["../../src/mantine/breakpoints-with-px.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,iBAAiB
|
|
1
|
+
{"version":3,"file":"breakpoints-with-px.d.ts","sourceRoot":"","sources":["../../src/mantine/breakpoints-with-px.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,iBAAiB;;;;;;;;CAQ7B,CAAA"}
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
//#region src/mantine/breakpoints-with-px.ts
|
|
2
2
|
var breakpointsWithPx = {
|
|
3
|
-
xs: "
|
|
3
|
+
xs: "540px",
|
|
4
4
|
sm: "640px",
|
|
5
5
|
md: "768px",
|
|
6
6
|
lg: "1024px",
|
|
7
7
|
xl: "1280px",
|
|
8
|
-
|
|
8
|
+
"2xl": "1536px",
|
|
9
|
+
"3xl": "1680px"
|
|
9
10
|
};
|
|
10
11
|
//#endregion
|
|
11
12
|
export { breakpointsWithPx };
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
require("../_virtual/_rolldown/runtime.cjs");
|
|
2
|
+
const require_my_default_theme = require("./my-default-theme.cjs");
|
|
3
|
+
let _mantine_core = require("@mantine/core");
|
|
4
|
+
//#region src/mantine/create-lkd-theme.ts
|
|
5
|
+
var createLkdTheme = (theme) => (0, _mantine_core.createTheme)((0, _mantine_core.mergeThemeOverrides)(require_my_default_theme.myDefaultTheme, theme));
|
|
6
|
+
//#endregion
|
|
7
|
+
exports.createLkdTheme = createLkdTheme;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-lkd-theme.d.ts","sourceRoot":"","sources":["../../src/mantine/create-lkd-theme.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,oBAAoB,EAAuB,MAAM,eAAe,CAAA;AAG3F,eAAO,MAAM,cAAc,GAAI,OAAO,oBAAoB,KAAG,oBACJ,CAAA"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { myDefaultTheme } from "./my-default-theme.js";
|
|
2
|
+
import { createTheme, mergeThemeOverrides } from "@mantine/core";
|
|
3
|
+
//#region src/mantine/create-lkd-theme.ts
|
|
4
|
+
var createLkdTheme = (theme) => createTheme(mergeThemeOverrides(myDefaultTheme, theme));
|
|
5
|
+
//#endregion
|
|
6
|
+
export { createLkdTheme };
|
package/dist/mantine/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mantine/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAA;AACrC,cAAc,oBAAoB,CAAA;AAClC,cAAc,sBAAsB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mantine/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAA;AACrC,cAAc,oBAAoB,CAAA;AAClC,cAAc,oBAAoB,CAAA;AAClC,cAAc,sBAAsB,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lkd-web-kit",
|
|
3
|
-
"version": "0.10.
|
|
3
|
+
"version": "0.10.3",
|
|
4
4
|
"description": "A template for creating React component libraries with Vite.",
|
|
5
5
|
"author": "LKD",
|
|
6
6
|
"license": "MIT",
|
|
@@ -20,13 +20,13 @@
|
|
|
20
20
|
}
|
|
21
21
|
},
|
|
22
22
|
"bin": {
|
|
23
|
-
"lkd-install-
|
|
23
|
+
"lkd-install-agent-skills": "./scripts/install-agent-skills.mjs"
|
|
24
24
|
},
|
|
25
25
|
"sideEffects": false,
|
|
26
26
|
"engines": {
|
|
27
27
|
"node": ">=22.12.0"
|
|
28
28
|
},
|
|
29
|
-
"files": ["dist", "
|
|
29
|
+
"files": ["dist", ".agents/skills", "scripts/install-agent-skills.mjs"],
|
|
30
30
|
"scripts": {
|
|
31
31
|
"test": "vitest run --passWithNoTests",
|
|
32
32
|
"test:watch": "vitest",
|
|
@@ -37,6 +37,7 @@
|
|
|
37
37
|
},
|
|
38
38
|
"devDependencies": {
|
|
39
39
|
"@biomejs/biome": "2.4.14",
|
|
40
|
+
"@tanstack/react-table": "^8.21.3",
|
|
40
41
|
"@tanstack/react-virtual": "^3.13.24",
|
|
41
42
|
"@testing-library/jest-dom": "^6.8.0",
|
|
42
43
|
"@testing-library/react": "^16.3.0",
|
|
@@ -60,6 +61,7 @@
|
|
|
60
61
|
"@mantine/hooks": "^9.4.1",
|
|
61
62
|
"@mantine/notifications": "^9.4.1",
|
|
62
63
|
"@tanstack/react-query": "^5.101.2",
|
|
64
|
+
"@tanstack/react-table": "^8.21.3",
|
|
63
65
|
"@tanstack/react-virtual": "^3.14.4",
|
|
64
66
|
"clsx": "^2.1.1",
|
|
65
67
|
"ky": "^2.0.2",
|
|
@@ -4,7 +4,7 @@ import { dirname, join } from 'node:path'
|
|
|
4
4
|
import { fileURLToPath } from 'node:url'
|
|
5
5
|
|
|
6
6
|
const scriptDir = dirname(fileURLToPath(import.meta.url))
|
|
7
|
-
const source = join(scriptDir, '..', '
|
|
7
|
+
const source = join(scriptDir, '..', '.agents', 'skills')
|
|
8
8
|
const target = join(process.cwd(), '.agents', 'skills')
|
|
9
9
|
|
|
10
10
|
if (!existsSync(source)) {
|
|
@@ -1,168 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: create-modal-component
|
|
3
|
-
description: Crear modales en proyectos internos con el modal manager global de lkd-web-kit. Usar cuando Codex deba agregar, modificar o registrar modales bajo src/components/modals, envolverlos con withModalManager, elegir entre un modal interno del proyecto o Modal de Mantine, organizar el modal en carpeta propia, tipar props para showModal, actualizar dynamicModals, MyModalManagerProvider, module augmentation o loadModals.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Crear Modal Component
|
|
7
|
-
|
|
8
|
-
Usar este flujo para modales abiertos con `useModalManager().showModal(...)`.
|
|
9
|
-
|
|
10
|
-
## Lectura Obligatoria
|
|
11
|
-
|
|
12
|
-
1. Leer `docs/lkd-web-kit.md` y `docs/local-components.md`.
|
|
13
|
-
2. Leer `src/components/modals/index.ts`.
|
|
14
|
-
3. Leer `src/contexts/MyModalManagerContext/index.tsx`.
|
|
15
|
-
4. Leer `src/types/lkd-web-kit.d.ts`.
|
|
16
|
-
5. Buscar si existe un modal interno en `src/components/ui` o componentes compartidos antes de importar `Modal` de Mantine.
|
|
17
|
-
6. Leer un modal existente del mismo dominio en `src/components/modals/{dominio}`.
|
|
18
|
-
7. Si se toca `next/dynamic` o lazy loading, leer `node_modules/next/dist/docs/01-app/02-guides/lazy-loading.md`.
|
|
19
|
-
|
|
20
|
-
## Arquitectura Actual
|
|
21
|
-
|
|
22
|
-
- `lkd-web-kit` exporta `ModalManagerProvider`, `useModalManager`, `withModalManager`, `ModalRegistryItem`, `ModalKey` y tipos relacionados.
|
|
23
|
-
- El proyecto no usa `src/contexts/ModalManagerContext`; no recrearlo.
|
|
24
|
-
- `src/contexts/MyModalManagerContext/index.tsx` adapta el provider del kit y le pasa `dynamicModals`.
|
|
25
|
-
- `src/types/lkd-web-kit.d.ts` hace module augmentation para que `showModal` infiera keys y props desde `dynamicModals`.
|
|
26
|
-
- `src/app/PageProviders.tsx` envuelve la app con `MyModalManagerProvider` y propaga `loadModals`.
|
|
27
|
-
|
|
28
|
-
## Estructura
|
|
29
|
-
|
|
30
|
-
- Crear modales en `src/components/modals/{dominio}/{NombreModal}/index.tsx` cuando tengan formulario, schema, hooks internos, assets o subcomponentes.
|
|
31
|
-
- Usar archivo plano `src/components/modals/{dominio}/{NombreModal}.tsx` solo para modales triviales de una pieza, siguiendo el patron existente.
|
|
32
|
-
- Colocar piezas privadas junto al modal: `schema.ts`, `helpers.ts`, subcomponentes o assets dentro de la misma carpeta.
|
|
33
|
-
- No mover logica compartida a `src/components/ui` salvo que ya exista mas de un consumidor real.
|
|
34
|
-
|
|
35
|
-
## Implementacion
|
|
36
|
-
|
|
37
|
-
1. Definir props exportadas si el modal recibe datos desde `showModal`:
|
|
38
|
-
|
|
39
|
-
```tsx
|
|
40
|
-
export interface MyModalProps {
|
|
41
|
-
itemId: string;
|
|
42
|
-
onSuccess?: () => void;
|
|
43
|
-
}
|
|
44
|
-
```
|
|
45
|
-
|
|
46
|
-
2. Envolver el componente con `withModalManager<Props>`.
|
|
47
|
-
3. Recibir `modalProps` desde el wrapper y pasarlo al modal raiz.
|
|
48
|
-
4. Antes de usar `Modal` de `@mantine/core`, corroborar si el proyecto tiene un modal interno que ya envuelve Mantine y usarlo si cubre el caso.
|
|
49
|
-
5. Usar clases Tailwind para spacing, radius, shadow, margin y padding; evitar props Mantine equivalentes si `className` resuelve el caso.
|
|
50
|
-
6. Usar wrappers locales del proyecto o `lkd-web-kit` antes que primitivas Mantine directas.
|
|
51
|
-
7. No usar `any`.
|
|
52
|
-
|
|
53
|
-
Modal base con modal interno:
|
|
54
|
-
|
|
55
|
-
```tsx
|
|
56
|
-
import { withModalManager } from "lkd-web-kit";
|
|
57
|
-
import ButtonAE from "src/components/ui/ButtonAE";
|
|
58
|
-
import InternalModal from "src/components/ui/InternalModal";
|
|
59
|
-
|
|
60
|
-
export interface MyModalProps {
|
|
61
|
-
onConfirm?: () => void;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
const MyModal = withModalManager<MyModalProps>(
|
|
65
|
-
({ onConfirm, modalProps }) => {
|
|
66
|
-
return (
|
|
67
|
-
<InternalModal {...modalProps} size="lg">
|
|
68
|
-
<InternalModal.Header>Titulo</InternalModal.Header>
|
|
69
|
-
<InternalModal.Body className="grid gap-4">Contenido</InternalModal.Body>
|
|
70
|
-
<InternalModal.Footer>
|
|
71
|
-
<ButtonAE
|
|
72
|
-
onClick={() => {
|
|
73
|
-
onConfirm?.();
|
|
74
|
-
modalProps.onClose?.();
|
|
75
|
-
}}
|
|
76
|
-
>
|
|
77
|
-
Guardar
|
|
78
|
-
</ButtonAE>
|
|
79
|
-
</InternalModal.Footer>
|
|
80
|
-
</InternalModal>
|
|
81
|
-
);
|
|
82
|
-
},
|
|
83
|
-
);
|
|
84
|
-
|
|
85
|
-
export default MyModal;
|
|
86
|
-
```
|
|
87
|
-
|
|
88
|
-
Fallback con Mantine, solo si no hay modal interno aplicable:
|
|
89
|
-
|
|
90
|
-
```tsx
|
|
91
|
-
import { Modal } from "@mantine/core";
|
|
92
|
-
import { withModalManager } from "lkd-web-kit";
|
|
93
|
-
|
|
94
|
-
const MyModal = withModalManager(({ modalProps }) => (
|
|
95
|
-
<Modal {...modalProps} title="Titulo">
|
|
96
|
-
Contenido
|
|
97
|
-
</Modal>
|
|
98
|
-
));
|
|
99
|
-
|
|
100
|
-
export default MyModal;
|
|
101
|
-
```
|
|
102
|
-
|
|
103
|
-
## Registro
|
|
104
|
-
|
|
105
|
-
1. Exportar las props publicas desde el modal.
|
|
106
|
-
2. Importar el tipo de props en `src/components/modals/index.ts`:
|
|
107
|
-
|
|
108
|
-
```ts
|
|
109
|
-
import type { MyModalProps } from "./domain/MyModal";
|
|
110
|
-
```
|
|
111
|
-
|
|
112
|
-
3. Registrar con `dynamicModal<Props>("domain/MyModal")`:
|
|
113
|
-
|
|
114
|
-
```ts
|
|
115
|
-
"domain.myModal": dynamicModal<MyModalProps>("domain/MyModal"),
|
|
116
|
-
```
|
|
117
|
-
|
|
118
|
-
4. Usar una key estable con formato `{dominio}.{accion}`.
|
|
119
|
-
5. No tocar `src/types/lkd-web-kit.d.ts` si `dynamicModals` sigue siendo la fuente unica. La augmentacion ya apunta a `typeof dynamicModals`.
|
|
120
|
-
6. Si se cambia la forma del registro, mantener `ModalRegistryItem<T>` y que cada item tenga `component`, `load` y `path`.
|
|
121
|
-
|
|
122
|
-
## Contexto y Precarga
|
|
123
|
-
|
|
124
|
-
- Para rutas que ya usan `PageProviders`, pasar `loadModals` ahi:
|
|
125
|
-
|
|
126
|
-
```tsx
|
|
127
|
-
<PageProviders loadModals={["domain.myModal"]}>{children}</PageProviders>
|
|
128
|
-
```
|
|
129
|
-
|
|
130
|
-
- `loadModals` acepta una key exacta o un prefijo, por ejemplo `"development"` para precargar todos los modales cuyo key empieza con ese prefijo.
|
|
131
|
-
- Para layouts que no usan `PageProviders`, envolver el arbol con `MyModalManagerProvider`:
|
|
132
|
-
|
|
133
|
-
```tsx
|
|
134
|
-
import { MyModalManagerProvider } from "src/contexts/MyModalManagerContext";
|
|
135
|
-
|
|
136
|
-
<MyModalManagerProvider loadModals={["domain.myModal"]}>
|
|
137
|
-
{children}
|
|
138
|
-
</MyModalManagerProvider>
|
|
139
|
-
```
|
|
140
|
-
|
|
141
|
-
- Evitar providers anidados salvo que haya una razon real: un provider interno aisla estado y puede cerrar o reemplazar modales inesperadamente.
|
|
142
|
-
- Invocar siempre con `useModalManager` desde `lkd-web-kit`, nunca importando el modal directo desde una vista:
|
|
143
|
-
|
|
144
|
-
```tsx
|
|
145
|
-
import { useModalManager } from "lkd-web-kit";
|
|
146
|
-
|
|
147
|
-
const { showModal, closeModal } = useModalManager();
|
|
148
|
-
showModal("domain.myModal", { itemId: "123" });
|
|
149
|
-
closeModal("domain.myModal");
|
|
150
|
-
```
|
|
151
|
-
|
|
152
|
-
## Formularios Dentro de Modales
|
|
153
|
-
|
|
154
|
-
- Usar la skill `rhf-lkd-forms` si el modal contiene formulario.
|
|
155
|
-
- Pasar `onSuccess={modalProps.onClose}` o cerrar en el submit exitoso.
|
|
156
|
-
- En errores de API, mostrar la alerta esperada y luego hacer `throw error`.
|
|
157
|
-
- No poner mensajes textuales en reglas base de Zod.
|
|
158
|
-
|
|
159
|
-
## Checklist
|
|
160
|
-
|
|
161
|
-
- El modal exporta default envuelto con `withModalManager`.
|
|
162
|
-
- Las props publicas estan exportadas y registradas en `dynamicModals`.
|
|
163
|
-
- `showModal("key", props)` queda tipado sin `any`.
|
|
164
|
-
- `useModalManager` se importa desde `lkd-web-kit`.
|
|
165
|
-
- La ruta esta bajo `PageProviders` o `MyModalManagerProvider`.
|
|
166
|
-
- `loadModals` se agrega solo cuando conviene precargar.
|
|
167
|
-
- Se reutiliza el modal interno del proyecto salvo necesidad concreta de Mantine directo.
|
|
168
|
-
- Se ejecuta una verificacion focalizada si el cambio no es trivial.
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: create-svg-icon
|
|
3
|
-
description: Create SVG icon files in projects that expose SVGs from src/icons. Use when Codex must add a new icon under src/icons from user-provided SVG markup, normalize SVG colors to currentColor for Tailwind text-* styling, and export the icon alias from src/icons/index.ts.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Create SVG Icon
|
|
7
|
-
|
|
8
|
-
Use this skill when the user provides SVG markup and the desired icon name, usually in the form `Icon{Name}`.
|
|
9
|
-
|
|
10
|
-
## Required Workflow
|
|
11
|
-
|
|
12
|
-
1. Read `src/icons/index.ts` before editing.
|
|
13
|
-
2. Determine the component export name from the user input.
|
|
14
|
-
- Expected format: `Icon{Name}`.
|
|
15
|
-
- Keep the export alias with the `Icon` prefix.
|
|
16
|
-
3. Verify the icon does not already exist.
|
|
17
|
-
- Check for the exact alias in `src/icons/index.ts`.
|
|
18
|
-
- Check for the target SVG filename in `src/icons/`.
|
|
19
|
-
- If either exists, cancel the operation and notify the user.
|
|
20
|
-
4. Build the SVG filename.
|
|
21
|
-
- Remove the leading `Icon` prefix.
|
|
22
|
-
- Convert the remaining name to kebab-case.
|
|
23
|
-
- Save it as `src/icons/{name}.svg`.
|
|
24
|
-
- Example: `IconBuildingTower` -> `src/icons/building-tower.svg`.
|
|
25
|
-
5. Normalize the provided SVG.
|
|
26
|
-
- Replace every explicit visual color value with `currentColor`.
|
|
27
|
-
- Include colors expressed as hex, rgb(), rgba(), hsl(), hsla(), named colors, or inline style values.
|
|
28
|
-
- Apply this to attributes such as `fill`, `stroke`, `color`, `stop-color`, and CSS declarations inside `style`.
|
|
29
|
-
- Preserve `fill="none"`, `stroke="none"`, `currentColor`, `transparent`, masks, clipping, sizing, viewBox, paths, and structural SVG attributes.
|
|
30
|
-
- Do not convert opacity values to `currentColor`.
|
|
31
|
-
6. Create the SVG file in `src/icons/`.
|
|
32
|
-
7. Add the alias in `src/icons/index.ts` following the existing export style in that file.
|
|
33
|
-
8. Report the created SVG path and the added export alias.
|
|
34
|
-
|
|
35
|
-
## Guardrails
|
|
36
|
-
|
|
37
|
-
- Do not use `any`.
|
|
38
|
-
- Do not create React wrapper components for the icon unless the existing icon system requires it.
|
|
39
|
-
- Do not overwrite an existing icon file or alias.
|
|
40
|
-
- Do not invent SVG path data; use the SVG supplied by the user.
|
|
41
|
-
- Keep edits scoped to `src/icons/{name}.svg` and `src/icons/index.ts` unless the user asks for something else.
|