@amsintegra/design-system 1.1.0 → 1.1.2

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/CHANGELOG.md CHANGED
@@ -5,6 +5,33 @@ All notable changes to `@amsintegra/design-system` are documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [1.1.2] - 2026-10-10
9
+
10
+ ### Added
11
+
12
+ - **UI design guidelines** (`docs/lineamientos-ui.md`). A screen-design guide that
13
+ complements the component reference in `docs/skills/ams-design-system/SKILL.md`:
14
+ how to design with the design system (density, semantic color, typography, data
15
+ presentation, empty/loading/error states, accessibility and tone), expressed
16
+ against the real stack (Ant Design v6, Metronic theme — primary `#A72432`, Inter
17
+ 13px, `@ant-design/icons`) and the theme tokens in `src/theme/tokens.ts`. No
18
+ Tailwind, Lucide or hardcoded brand colors.
19
+
20
+ ## [1.1.1] - 2026-09-30
21
+
22
+ ### Fixed
23
+
24
+ - **`Card` is now usable as a JSX component under TypeScript.** antd v6 declares
25
+ `Card` with an `interface` that extends a `forwardRef` function type, which
26
+ drops the call signature and makes consumers (React 19 + `moduleResolution:
27
+ Bundler`) fail type-checking with `TS2786` / `TS2604` — while `next build` and
28
+ runtime are unaffected. The `Card` re-export is now cast to an intersection
29
+ type that preserves the JSX call signature plus the `Grid` / `Meta`
30
+ subcomponents. This is a type-only change; the exported runtime value is the
31
+ unchanged antd `Card`. Added `npm run typecheck:consumer`, a guard that
32
+ type-checks the built `dist/` from an external consumer config (the project's
33
+ own `tsc` masks this defect via its `vitest/globals` + `jest-dom` types).
34
+
8
35
  ## [1.1.0] - 2026-09-28
9
36
 
10
37
  Migrated the design system to **Ant Design v6** and widened React support to
@@ -26,6 +53,10 @@ Migrated the design system to **Ant Design v6** and widened React support to
26
53
  `MouseEvent | KeyboardEvent`, matching antd 6's Modal signature.
27
54
  - Replaced the removed `rc-pagination` type import with the public
28
55
  `antd/es/pagination/Pagination` type in `Pagination` and `DataTable`.
56
+ - **README install section reworked** for clarity: a highlighted note that the
57
+ library must be installed per project (a runtime `dependencies` entry, not a
58
+ dev dependency), a two-step install (package → peers), a peer version table,
59
+ and the peer-dependency rationale folded into a collapsible details block.
29
60
 
30
61
  ### Fixed
31
62
 
package/README.md CHANGED
@@ -4,39 +4,57 @@ Sistema de diseño de React para la plataforma B2BMX de AMS Integra. Está const
4
4
 
5
5
  Cubre **todos los componentes de Ant Design v6** como wrappers/re-exports tipados con el tema aplicado, más composites propios que consolidan patrones ya usados en los microfrontends.
6
6
 
7
- ## Requisitos
8
-
9
- - Node.js >= 18
10
- - React 18, 19 o 20, antd 6, `@ant-design/icons` 6.x y `dayjs` en el proyecto consumidor (son **peer dependencies**). antd 6 requiere React >= 18 y usa variables CSS por defecto (no soporta IE).
7
+ > ### 📦 Se instala en cada proyecto
8
+ >
9
+ > Este es un paquete de librería: **cada proyecto que lo use tiene que instalarlo
10
+ > por su cuenta**. No es algo que se instale una sola vez y quede disponible para
11
+ > todos los proyectos. Cuando arranques un portal o microfrontend nuevo, corré la
12
+ > instalación de abajo dentro de _ese_ proyecto.
13
+ >
14
+ > Es una dependencia normal de la app (sus componentes se renderizan en runtime),
15
+ > así que va en `dependencies`, no en `devDependencies`.
11
16
 
12
17
  ## Instalación
13
18
 
19
+ ### 1. Instalá el paquete
20
+
14
21
  ```bash
15
22
  npm install @amsintegra/design-system
16
23
  ```
17
24
 
18
- Eso alcanza. `antd`, `@ant-design/icons`, `dayjs`, `react` y `react-dom` están
19
- declarados como **peer dependencies**, así que:
25
+ ### 2. Asegurate de tener sus peers
20
26
 
21
- - **Proyecto React sin antd** → npm 7+ instala los peers automáticamente al
22
- correr `npm install @amsintegra/design-system`. No hay que instalarlos a mano.
23
- - **Microfrontend con Module Federation** (donde React/antd ya existen) → el
24
- peer se satisface con la copia que ya tiene el host, sin duplicar instancias.
27
+ La librería necesita que tu proyecto tenga estas piezas (son **peer dependencies**,
28
+ o sea que las comparte con tu app en vez de traer su propia copia):
25
29
 
26
- Declarar React y antd como peers (y no como dependencias directas) es lo que
27
- evita **dos instancias de React/antd** en runtime —el clásico `Invalid hook
28
- call` y los contextos de tema duplicados— cuando la librería se consume bajo
29
- Module Federation.
30
+ | Peer | Versión |
31
+ |------|---------|
32
+ | `react` / `react-dom` | 18, 19 o 20 |
33
+ | `antd` | 6 |
34
+ | `@ant-design/icons` | 6 |
35
+ | `dayjs` | 1.11+ |
30
36
 
31
- Si tu gestor no resuelve los peers de forma automática (por ejemplo con un
32
- conflicto de versiones), instalálos explícitamente:
37
+ - **Si tu proyecto ya tiene React y antd 6** (por ejemplo un portal con Next.js):
38
+ no hacés nada más, la librería usa los que ya tenés.
39
+ - **Si te falta alguno**, instalalos de una:
33
40
 
34
- ```bash
35
- npm install antd@^6 @ant-design/icons@^6 dayjs react react-dom
36
- ```
41
+ ```bash
42
+ npm install antd@^6 @ant-design/icons@^6 dayjs react react-dom
43
+ ```
44
+
45
+ > **Ojo con antd:** tiene que ser la **versión 6**, igual que `@ant-design/icons`
46
+ > (icons 6 no funciona con antd 5). Y antd 6 pide React 18 o superior.
47
+ >
48
+ > Requiere **Node.js 18 o superior** para desarrollar.
49
+
50
+ <details>
51
+ <summary>¿Por qué peer dependencies y no dependencias normales?</summary>
37
52
 
38
- > **antd 6**: `@ant-design/icons` debe ser v6 (no es compatible con antd 5) y se
39
- > instala junto con antd. React debe ser >= 18.
53
+ Declarar React y antd como peers (en vez de empaquetarlos dentro de la librería)
54
+ evita terminar con **dos instancias de React/antd** en runtime —el clásico
55
+ `Invalid hook call` y los contextos de tema duplicados— cuando la librería se
56
+ consume bajo Module Federation. La librería reutiliza la copia que ya tiene tu app.
57
+ </details>
40
58
 
41
59
  ## Uso
42
60
 
package/dist/index.cjs CHANGED
@@ -365,6 +365,7 @@ function Pagination({
365
365
  }
366
366
  );
367
367
  }
368
+ var Card = antd.Card;
368
369
  function ThemeToggle(props) {
369
370
  const { isDark, toggle } = useThemeMode();
370
371
  return /* @__PURE__ */ jsxRuntime.jsx(
@@ -761,10 +762,6 @@ Object.defineProperty(exports, "Calendar", {
761
762
  enumerable: true,
762
763
  get: function () { return antd.Calendar; }
763
764
  });
764
- Object.defineProperty(exports, "Card", {
765
- enumerable: true,
766
- get: function () { return antd.Card; }
767
- });
768
765
  Object.defineProperty(exports, "Carousel", {
769
766
  enumerable: true,
770
767
  get: function () { return antd.Carousel; }
@@ -1099,6 +1096,7 @@ Object.defineProperty(exports, "WarningOutlined", {
1099
1096
  });
1100
1097
  exports.AmsConfigProvider = AmsConfigProvider;
1101
1098
  exports.Button = Button;
1099
+ exports.Card = Card;
1102
1100
  exports.ConfirmModal = ConfirmModal;
1103
1101
  exports.DataTable = DataTable;
1104
1102
  exports.DownloadButton = DownloadButton;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/theme/tokens.ts","../src/theme/theme.ts","../src/theme/useThemeMode.ts","../src/theme/AmsConfigProvider.tsx","../src/components/Button/Button.tsx","../src/components/Tag/Tag.tsx","../src/components/message/useAmsMessage.ts","../src/components/notification/useAmsNotification.ts","../src/components/Pagination/Pagination.tsx","../src/components/ThemeToggle/ThemeToggle.tsx","../src/components/DataTable/DataTable.tsx","../src/hooks/useControllableState.ts","../src/components/ModalDialog/ModalDialog.tsx","../src/components/FilterSelect/FilterSelect.tsx","../src/components/FileUploadDragger/FileUploadDragger.tsx","../src/components/PageHeader/PageHeader.tsx","../src/components/DownloadButton/DownloadButton.tsx","../src/components/ConfirmModal/ConfirmModal.tsx"],"names":["antdTheme","createContext","useContext","useState","useEffect","useCallback","useMemo","jsx","ConfigProvider","App","forwardRef","Button","AntButton","Tag","AntTag","AntPagination","Switch","BulbFilled","BulbOutlined","jsxs","Skeleton","Table","isValidElement","cloneElement","Fragment","Modal","Select","Upload","InboxOutlined","Breadcrumb","DownloadButton","DownloadOutlined"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Design tokens — the single source of truth for the AMS Design System.\n *\n * Values are taken from the B2BMX Metronic theme:\n * b2bmx-web-metronic/src/_metronic/assets/sass/components/_variables.custom.scss\n * b2bmx-web-metronic/tailwind.config.js\n *\n * Two tiers:\n * - `primitives`: raw values, no semantic meaning.\n * - `semantic`: role aliases consumed by the antd theme (and Tailwind).\n */\n\n/** Raw Metronic brand values. */\nexport const primitives = {\n brandRed: '#A72432',\n brandRedActive: '#8B1D28', // darken 10%\n brandRedLight: '#f1faff',\n\n green: '#50cd89',\n greenActive: '#47be7d',\n greenLight: '#e8fff3',\n\n purple: '#7239ea',\n purpleActive: '#5014d0',\n purpleLight: '#f8f5ff',\n\n pink: '#f1416c',\n pinkActive: '#d9214e',\n pinkLight: '#fff5f8',\n\n yellow: '#ffc700',\n yellowActive: '#f1bc00',\n yellowLight: '#fff8dd',\n\n white: '#ffffff',\n\n gray: {\n 100: '#f9f9f9',\n 200: '#f4f4f4',\n 300: '#e1e3ea',\n 400: '#b5b5c3',\n 500: '#a1a5b7',\n 600: '#7e8299',\n 700: '#5e6278',\n 800: '#3f4254',\n 900: '#181c32',\n },\n\n background: {\n app: '#f5f8fa',\n body: '#ffffff',\n appDark: '#151521',\n bodyDark: '#1e1e2d',\n },\n\n dark: {\n base: '#181c32',\n bg: '#151521',\n header: '#1e1e2d',\n active: '#2a2a3c',\n separator: '#393945',\n // Dark-mode surfaces (from mf-container's antdTheme).\n inputBg: '#1b1b29',\n cardBg: '#1e1e2d',\n // Dark-mode gray scale — DISTINCT from the light `gray` scale (Metronic).\n gray: {\n 100: '#2b2b40',\n 200: '#323248',\n 300: '#3b3b64',\n 400: '#474761',\n 500: '#565674',\n 600: '#6d6d80',\n 700: '#92929f',\n 800: '#cdcdde',\n },\n },\n} as const;\n\n/** Radius scale (Metronic). Base radius is 4px. */\nexport const radius = {\n sm: 2,\n base: 4,\n md: 6,\n lg: 8,\n xl: 12,\n} as const;\n\n/** Typography (Metronic uses Inter with a compact 13px base). */\nexport const typography = {\n fontFamily: 'Inter, Helvetica, Arial, sans-serif',\n fontSizeBase: 13,\n weight: {\n light: 300,\n normal: 400,\n medium: 500,\n semibold: 600,\n bold: 700,\n },\n} as const;\n\n/** Control sizing (Metronic). */\nexport const sizing = {\n controlHeight: 32,\n buttonMinWidth: 110,\n} as const;\n\n/**\n * Semantic tokens — role aliases. These feed the antd `ThemeConfig`.\n * Components must consume semantic tokens, never primitives directly.\n */\nexport const semantic = {\n colorPrimary: primitives.brandRed,\n colorPrimaryActive: primitives.brandRedActive,\n colorSuccess: primitives.green,\n colorInfo: primitives.purple,\n colorError: primitives.pink,\n colorWarning: primitives.yellow,\n\n // Links. Metronic inherits link color from the (red) primary, which reads as\n // \"danger\" in dense UIs. The AMS default uses a neutral dark gray so links\n // don't look like errors; consumers can override `colorLink`/`colorLinkHover`\n // via AmsConfigProvider's `theme` prop (e.g. back to the brand red or blue).\n colorLink: primitives.gray[800],\n colorLinkHover: primitives.brandRed,\n colorLinkActive: primitives.brandRedActive,\n\n colorBgLayout: primitives.background.app,\n colorBgContainer: primitives.background.body,\n\n borderRadius: radius.base,\n fontFamily: typography.fontFamily,\n fontSize: typography.fontSizeBase,\n controlHeight: sizing.controlHeight,\n} as const;\n\nexport type ThemeMode = 'light' | 'dark';\n","import { theme as antdTheme } from 'antd';\nimport type { ThemeConfig } from 'antd';\nimport { primitives, semantic, type ThemeMode } from './tokens';\n\n/**\n * Tokens shared by light and dark modes (brand, links, radius, typography).\n * Backgrounds, text, and borders are mode-specific (see below).\n */\nconst sharedToken: ThemeConfig['token'] = {\n colorPrimary: semantic.colorPrimary,\n colorSuccess: semantic.colorSuccess,\n colorInfo: semantic.colorInfo,\n colorError: semantic.colorError,\n colorWarning: semantic.colorWarning,\n colorLink: semantic.colorLink,\n colorLinkHover: semantic.colorLinkHover,\n colorLinkActive: semantic.colorLinkActive,\n borderRadius: semantic.borderRadius,\n fontFamily: semantic.fontFamily,\n fontSize: semantic.fontSize,\n controlHeight: semantic.controlHeight,\n};\n\n/** Light-mode tokens. */\nconst lightToken: ThemeConfig['token'] = {\n ...sharedToken,\n colorBgLayout: semantic.colorBgLayout,\n colorBgContainer: semantic.colorBgContainer,\n colorBgElevated: primitives.background.body,\n colorText: primitives.gray[900],\n colorTextSecondary: primitives.gray[700],\n colorTextTertiary: primitives.gray[500],\n colorTextQuaternary: primitives.gray[400],\n colorBorder: primitives.gray[300],\n colorBorderSecondary: primitives.gray[200],\n};\n\n/**\n * Dark-mode tokens. Backgrounds/text/borders come from the Metronic dark\n * palette (mirrors mf-container's darkTheme). Brand colors stay identical.\n */\nconst darkToken: ThemeConfig['token'] = {\n ...sharedToken,\n colorBgLayout: primitives.background.appDark,\n colorBgContainer: primitives.background.bodyDark,\n colorBgElevated: primitives.background.bodyDark,\n colorText: '#ffffff',\n colorTextHeading: '#ffffff',\n colorTextSecondary: primitives.dark.gray[800],\n colorTextTertiary: primitives.dark.gray[700],\n colorTextQuaternary: primitives.dark.gray[600],\n colorBorder: primitives.dark.gray[300],\n colorBorderSecondary: primitives.dark.gray[200],\n boxShadow:\n '0 6px 16px 0 rgba(0, 0, 0, 0.48), 0 3px 6px -4px rgba(0, 0, 0, 0.36), 0 9px 28px 8px rgba(0, 0, 0, 0.15)',\n};\n\n/** Per-component overrides shared by both modes. */\nconst sharedComponents: ThemeConfig['components'] = {\n Button: { controlHeight: 32 },\n Tabs: {\n itemColor: primitives.gray[600],\n itemSelectedColor: semantic.colorPrimary,\n itemHoverColor: semantic.colorPrimary,\n },\n};\n\n/** Light per-component overrides. */\nconst lightComponents: ThemeConfig['components'] = {\n ...sharedComponents,\n Table: {\n headerBg: primitives.gray[100],\n headerColor: primitives.gray[800],\n borderColor: primitives.gray[300],\n cellPaddingBlock: 8,\n cellPaddingInline: 8,\n },\n};\n\n/** Dark per-component overrides (mirrors mf-container's dark component theme). */\nconst darkComponents: ThemeConfig['components'] = {\n ...sharedComponents,\n Table: {\n headerBg: primitives.dark.gray[200],\n headerColor: primitives.dark.gray[800],\n borderColor: primitives.dark.gray[400],\n rowHoverBg: primitives.dark.gray[200],\n cellPaddingBlock: 8,\n cellPaddingInline: 8,\n },\n Input: {\n colorBgContainer: primitives.dark.inputBg,\n colorBorder: primitives.dark.gray[400],\n colorText: '#ffffff',\n },\n Select: {\n colorBgContainer: primitives.dark.inputBg,\n colorBorder: primitives.dark.gray[400],\n colorText: '#ffffff',\n },\n DatePicker: {\n colorBgContainer: primitives.dark.inputBg,\n },\n Card: {\n colorBgContainer: primitives.dark.cardBg,\n colorBorderSecondary: primitives.dark.cardBg,\n },\n Modal: {\n contentBg: primitives.dark.gray[100],\n headerBg: primitives.dark.gray[100],\n },\n Drawer: {\n colorBgElevated: primitives.dark.gray[100],\n },\n Notification: {\n colorBgElevated: primitives.dark.gray[100],\n },\n Message: {\n contentBg: primitives.dark.gray[100],\n },\n Menu: {\n itemBg: primitives.background.bodyDark,\n itemHoverBg: primitives.dark.gray[100],\n itemSelectedBg: primitives.dark.active,\n itemSelectedColor: semantic.colorPrimary,\n itemActiveBg: primitives.dark.active,\n subMenuItemBg: primitives.background.bodyDark,\n },\n Dropdown: {\n colorBgElevated: primitives.background.bodyDark,\n controlItemBgHover: primitives.dark.gray[100],\n },\n};\n\n/**\n * Builds the antd theme for a given mode. Dark mode uses antd's\n * `darkAlgorithm`; brand tokens stay identical so the brand is consistent.\n */\nexport function buildTheme(mode: ThemeMode = 'light'): ThemeConfig {\n const isDark = mode === 'dark';\n return {\n algorithm: isDark ? antdTheme.darkAlgorithm : antdTheme.defaultAlgorithm,\n token: isDark ? darkToken : lightToken,\n components: isDark ? darkComponents : lightComponents,\n };\n}\n\n/** Default (light) AMS theme. */\nexport const amsTheme: ThemeConfig = buildTheme('light');\n\n/** Dark AMS theme. */\nexport const amsThemeDark: ThemeConfig = buildTheme('dark');\n","import {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from 'react';\nimport type { ThemeMode } from './tokens';\n\nconst STORAGE_KEY = 'ams-theme';\n\n/** Reads the initial mode: saved preference → OS preference → light. */\nexport function getInitialThemeMode(defaultMode: ThemeMode = 'light'): ThemeMode {\n if (typeof window === 'undefined') return defaultMode;\n const saved = window.localStorage.getItem(STORAGE_KEY);\n if (saved === 'light' || saved === 'dark') return saved;\n if (window.matchMedia?.('(prefers-color-scheme: dark)').matches) return 'dark';\n return defaultMode;\n}\n\n/** Reflects the mode on the DOM so CSS can react (mirrors mf-container). */\nexport function applyThemeModeToDOM(mode: ThemeMode): void {\n if (typeof document === 'undefined') return;\n document.documentElement.setAttribute('data-theme', mode);\n document.body?.setAttribute('data-theme', mode);\n}\n\nexport interface ThemeModeContextValue {\n mode: ThemeMode;\n setMode: (mode: ThemeMode) => void;\n toggle: () => void;\n isDark: boolean;\n}\n\nexport const ThemeModeContext = createContext<ThemeModeContextValue | null>(null);\n\n/**\n * Access the current color mode and switch it. Requires an ancestor\n * `AmsConfigProvider`. Use it to build a light/dark toggle:\n *\n * const { isDark, toggle } = useThemeMode();\n * <Switch checked={isDark} onChange={toggle} />\n */\nexport function useThemeMode(): ThemeModeContextValue {\n const ctx = useContext(ThemeModeContext);\n if (!ctx) {\n throw new Error('useThemeMode must be used within an AmsConfigProvider');\n }\n return ctx;\n}\n\n/**\n * Internal state manager for the color mode. When `controlledMode` is provided,\n * the provider is controlled (no persistence). Otherwise the mode is managed\n * here: persisted to localStorage and reflected on the DOM via `data-theme`.\n */\nexport function useThemeModeState(\n controlledMode: ThemeMode | undefined,\n defaultMode: ThemeMode,\n persist: boolean,\n): ThemeModeContextValue {\n const isControlled = controlledMode !== undefined;\n const [internalMode, setInternalMode] = useState<ThemeMode>(() =>\n isControlled ? controlledMode : persist ? getInitialThemeMode(defaultMode) : defaultMode,\n );\n\n const mode = isControlled ? controlledMode : internalMode;\n\n useEffect(() => {\n applyThemeModeToDOM(mode);\n }, [mode]);\n\n const setMode = useCallback(\n (next: ThemeMode) => {\n if (!isControlled) {\n setInternalMode(next);\n if (persist && typeof window !== 'undefined') {\n window.localStorage.setItem(STORAGE_KEY, next);\n }\n }\n },\n [isControlled, persist],\n );\n\n const toggle = useCallback(() => {\n setMode(mode === 'light' ? 'dark' : 'light');\n }, [mode, setMode]);\n\n return useMemo(\n () => ({ mode, setMode, toggle, isDark: mode === 'dark' }),\n [mode, setMode, toggle],\n );\n}\n","import { App, ConfigProvider } from 'antd';\nimport type { Locale } from 'antd/es/locale';\nimport type { ThemeConfig } from 'antd';\nimport type { PropsWithChildren, ReactNode } from 'react';\nimport { buildTheme } from './theme';\nimport type { ThemeMode } from './tokens';\nimport { ThemeModeContext, useThemeModeState } from './useThemeMode';\n\nexport interface AmsConfigProviderProps {\n /**\n * Controlled color mode. When provided, the provider does not manage or\n * persist the mode. Omit it to let the provider manage the mode itself\n * (persisted to localStorage, respects OS preference) — read/toggle it with\n * the `useThemeMode` hook.\n */\n mode?: ThemeMode;\n /** Initial mode when self-managed (uncontrolled). Defaults to `light`. */\n defaultMode?: ThemeMode;\n /** Persist the self-managed mode to localStorage. Defaults to `true`. */\n persistMode?: boolean;\n /**\n * antd locale (e.g. `esES`, `enUS`). The consuming app passes it;\n * the design system stays i18n-agnostic and ships no message catalog.\n */\n locale?: Locale;\n /**\n * Theme overrides merged on top of the AMS theme. Use it to customize tokens\n * per project without forking the DS, e.g. `{ token: { colorLink: '#1677ff' } }`.\n */\n theme?: ThemeConfig;\n children?: ReactNode;\n}\n\nfunction mergeTheme(base: ThemeConfig, override?: ThemeConfig): ThemeConfig {\n if (!override) return base;\n return {\n ...base,\n ...override,\n token: { ...base.token, ...override.token },\n components: { ...base.components, ...override.components },\n // A caller-provided algorithm wins; otherwise keep the mode's algorithm.\n algorithm: override.algorithm ?? base.algorithm,\n };\n}\n\n/**\n * Root provider for the AMS Design System.\n *\n * - Applies the AMS theme (light/dark) via antd's `ConfigProvider`.\n * - Renders antd's `App` for context-safe `message`/`notification`/`Modal`.\n * - Manages the color mode (controlled via `mode`, or self-managed with\n * localStorage persistence and OS-preference detection) and exposes it\n * through the `useThemeMode` hook.\n * - Accepts a `theme` override merged on top of the AMS theme.\n *\n * Render it once at the app root.\n */\nexport function AmsConfigProvider({\n mode,\n defaultMode = 'light',\n persistMode = true,\n locale,\n theme,\n children,\n}: PropsWithChildren<AmsConfigProviderProps>) {\n const themeMode = useThemeModeState(mode, defaultMode, persistMode);\n const resolvedTheme = mergeTheme(buildTheme(themeMode.mode), theme);\n\n return (\n <ThemeModeContext.Provider value={themeMode}>\n <ConfigProvider theme={resolvedTheme} locale={locale}>\n <App>{children}</App>\n </ConfigProvider>\n </ThemeModeContext.Provider>\n );\n}\n","import { Button as AntButton } from 'antd';\nimport type { ButtonProps as AntButtonProps } from 'antd';\nimport { forwardRef } from 'react';\n\nexport interface ButtonProps extends AntButtonProps {}\n\n/**\n * AMS Button — thin wrapper over antd `Button` that inherits the AMS theme.\n * Exposes the full antd Button API (type, danger, loading, icon, size, etc.)\n * and forwards the ref so it integrates with Form and tooltips.\n */\nexport const Button = forwardRef<HTMLButtonElement | HTMLAnchorElement, ButtonProps>(\n function Button(props, ref) {\n return <AntButton ref={ref} {...props} />;\n },\n);\n","import { Tag as AntTag } from 'antd';\nimport type { TagProps as AntTagProps } from 'antd';\nimport { forwardRef } from 'react';\nimport { semantic } from '../../theme/tokens';\n\n/** AMS semantic tag intents mapped to brand tokens. */\nexport type TagIntent = 'success' | 'error' | 'warning' | 'info' | 'primary';\n\nexport interface TagProps extends AntTagProps {\n /**\n * Semantic intent that resolves to an AMS brand color. Takes precedence over\n * antd's `color` when set. Formalizes the inline `#50cd89` / `#f1416c` colors\n * previously hardcoded in mf-boveda's DataTable.\n */\n intent?: TagIntent;\n}\n\nconst INTENT_COLOR: Record<TagIntent, string> = {\n success: semantic.colorSuccess,\n error: semantic.colorError,\n warning: semantic.colorWarning,\n info: semantic.colorInfo,\n primary: semantic.colorPrimary,\n};\n\n/**\n * AMS Tag — thin wrapper over antd `Tag` with an optional semantic `intent`\n * that maps to the brand palette. Falls back to the full antd Tag API.\n */\nexport const Tag = forwardRef<HTMLSpanElement, TagProps>(function Tag(\n { intent, color, ...rest },\n ref,\n) {\n const resolvedColor = intent ? INTENT_COLOR[intent] : color;\n return <AntTag ref={ref} color={resolvedColor} {...rest} />;\n});\n","import { App } from 'antd';\nimport type { MessageInstance } from 'antd/es/message/interface';\n\n/**\n * Context-safe access to antd's `message` API.\n *\n * In antd v5 the static `message.success(...)` calls do **not** read the\n * `ConfigProvider` theme and log a warning. The supported approach is to\n * consume the instance provided by antd's `App` context — which\n * `AmsConfigProvider` already renders at the root.\n *\n * Usage:\n * const message = useAmsMessage();\n * message.success('Saved');\n *\n * Requires an ancestor `AmsConfigProvider` (or antd `App`).\n */\nexport function useAmsMessage(): MessageInstance {\n return App.useApp().message;\n}\n","import { App } from 'antd';\nimport type { NotificationInstance } from 'antd/es/notification/interface';\n\n/**\n * Context-safe access to antd's `notification` API.\n *\n * Like `useAmsMessage`, this returns the instance from antd's `App` context so\n * notifications inherit the AMS theme and avoid the v5 static-method warning.\n * Requires an ancestor `AmsConfigProvider` (or antd `App`).\n *\n * Usage:\n * const notification = useAmsNotification();\n * notification.success({ message: 'Done', description: 'Saved.' });\n */\nexport function useAmsNotification(): NotificationInstance {\n return App.useApp().notification;\n}\n","import { Pagination as AntPagination } from 'antd';\nimport type { PaginationProps as AntPaginationProps } from 'antd';\nimport type { PaginationLocale } from 'antd/es/pagination/Pagination';\nimport type { ReactNode } from 'react';\n\n/**\n * Translatable text labels for the pagination control. The design system is\n * i18n-agnostic: the consuming app passes already-translated strings. Anything\n * omitted falls back to antd's `locale` (or English defaults).\n */\nexport interface PaginationLabels {\n /** Suffix in the page-size selector, e.g. \"/ página\". */\n itemsPerPage?: string;\n /** \"Ir a\" label of the quick jumper. */\n jumpTo?: string;\n /** Confirm button text of the quick jumper. */\n jumpToConfirm?: string;\n /** Accessible label for a page, e.g. \"Página\". */\n page?: string;\n /** Accessible label for the previous-page button. */\n prevPage?: string;\n /** Accessible label for the next-page button. */\n nextPage?: string;\n /** Label for the page-size selector, e.g. \"Tamaño de página\". */\n pageSize?: string;\n /**\n * Builds the total-records text (rendered before the pages).\n * Receives the total and the current [from, to] range.\n * e.g. (total) => `Total ${total} registros`. Takes precedence over `totalText`.\n */\n total?: (total: number, range: [number, number]) => ReactNode;\n /**\n * Declarative total text as separate translated words, matching how the\n * mf-boveda table builds it: `{prefix} {total} {suffix}` → \"Total 250 registros\".\n * Set `showRange` to render \"{prefix} {from}-{to} {suffix}\" instead.\n * Ignored when `total` (the function form) is provided.\n */\n totalText?: {\n /** Word(s) before the number, e.g. \"Total\". */\n prefix?: string;\n /** Word(s) after the number, e.g. \"registros\". */\n suffix?: string;\n /** Use the \"from-to\" range instead of just the total. Default false. */\n showRange?: boolean;\n };\n /** Visible text for the \"previous\" button (overrides the arrow). */\n previousText?: ReactNode;\n /** Visible text for the \"next\" button (overrides the arrow). */\n nextText?: ReactNode;\n}\n\nexport interface PaginationProps extends AntPaginationProps {\n /** Translatable text labels. */\n labels?: PaginationLabels;\n}\n\nfunction buildLocale(labels?: PaginationLabels): PaginationLocale | undefined {\n if (!labels) return undefined;\n const locale: PaginationLocale = {};\n if (labels.itemsPerPage !== undefined) locale.items_per_page = labels.itemsPerPage;\n if (labels.jumpTo !== undefined) locale.jump_to = labels.jumpTo;\n if (labels.jumpToConfirm !== undefined) locale.jump_to_confirm = labels.jumpToConfirm;\n if (labels.page !== undefined) locale.page = labels.page;\n if (labels.prevPage !== undefined) locale.prev_page = labels.prevPage;\n if (labels.nextPage !== undefined) locale.next_page = labels.nextPage;\n if (labels.pageSize !== undefined) locale.page_size = labels.pageSize;\n return Object.keys(locale).length > 0 ? locale : undefined;\n}\n\n/**\n * AMS Pagination — antd `Pagination` with translatable text via a single\n * `labels` prop (page, records/total, previous/next, items-per-page, jumper).\n * The rest of the antd Pagination API passes through. `showTotal` and\n * `itemRender` still work if you prefer to set them directly; explicit\n * `showTotal`/`itemRender`/`locale` props win over `labels`.\n */\nexport function Pagination({\n labels,\n showTotal,\n itemRender,\n locale,\n ...rest\n}: PaginationProps) {\n const mergedLocale = { ...buildLocale(labels), ...locale };\n\n const resolvedShowTotal: AntPaginationProps['showTotal'] =\n showTotal ??\n (labels?.total\n ? (total, range) => labels.total!(total, range)\n : labels?.totalText\n ? (total, range) => {\n const { prefix, suffix, showRange } = labels.totalText!;\n const middle = showRange ? `${range[0]}-${range[1]}` : String(total);\n return [prefix, middle, suffix].filter(Boolean).join(' ');\n }\n : undefined);\n\n const resolvedItemRender: AntPaginationProps['itemRender'] =\n itemRender ??\n (labels?.previousText || labels?.nextText\n ? (_page, type, element) => {\n if (type === 'prev' && labels?.previousText !== undefined) return labels.previousText;\n if (type === 'next' && labels?.nextText !== undefined) return labels.nextText;\n return element;\n }\n : undefined);\n\n return (\n <AntPagination\n {...rest}\n locale={Object.keys(mergedLocale).length > 0 ? mergedLocale : undefined}\n showTotal={resolvedShowTotal}\n itemRender={resolvedItemRender}\n />\n );\n}\n","import { Switch } from 'antd';\nimport type { SwitchProps } from 'antd';\nimport { BulbOutlined, BulbFilled } from '@ant-design/icons';\nimport { useThemeMode } from '../../theme/useThemeMode';\n\nexport interface ThemeToggleProps extends Omit<SwitchProps, 'checked' | 'onChange'> {}\n\n/**\n * AMS ThemeToggle — a ready-made light/dark switch wired to `useThemeMode`.\n * Requires an ancestor `AmsConfigProvider` that manages the mode\n * (i.e. rendered without a controlled `mode` prop).\n */\nexport function ThemeToggle(props: ThemeToggleProps) {\n const { isDark, toggle } = useThemeMode();\n return (\n <Switch\n checked={isDark}\n onChange={toggle}\n checkedChildren={<BulbFilled />}\n unCheckedChildren={<BulbOutlined />}\n {...props}\n />\n );\n}\n","import { Skeleton, Table } from 'antd';\nimport type { TableProps, TablePaginationConfig } from 'antd';\nimport type { PaginationLocale } from 'antd/es/pagination/Pagination';\nimport type { ReactNode } from 'react';\nimport { Tag } from '../Tag';\nimport type { PaginationLabels } from '../Pagination';\n\n/**\n * Labels for the DataTable. The design system is i18n-agnostic: the consuming\n * microfrontend passes translated strings from its own catalog. Sensible\n * English defaults are provided so the table renders without wiring.\n */\nexport interface DataTableLabels {\n emptyText?: string;\n sortAsc?: string;\n sortDesc?: string;\n cancelSort?: string;\n}\n\nfunction buildPaginationLocale(labels?: PaginationLabels): PaginationLocale | undefined {\n if (!labels) return undefined;\n const locale: PaginationLocale = {};\n if (labels.itemsPerPage !== undefined) locale.items_per_page = labels.itemsPerPage;\n if (labels.jumpTo !== undefined) locale.jump_to = labels.jumpTo;\n if (labels.jumpToConfirm !== undefined) locale.jump_to_confirm = labels.jumpToConfirm;\n if (labels.page !== undefined) locale.page = labels.page;\n if (labels.prevPage !== undefined) locale.prev_page = labels.prevPage;\n if (labels.nextPage !== undefined) locale.next_page = labels.nextPage;\n if (labels.pageSize !== undefined) locale.page_size = labels.pageSize;\n return Object.keys(locale).length > 0 ? locale : undefined;\n}\n\nconst DEFAULT_LABELS: Required<DataTableLabels> = {\n emptyText: 'No data',\n sortAsc: 'Sort ascending',\n sortDesc: 'Sort descending',\n cancelSort: 'Cancel sort',\n};\n\nexport interface DataTableProps<T extends object = Record<string, unknown>>\n extends Omit<TableProps<T>, 'title' | 'loading'> {\n /** Optional plain-text heading rendered above the table. */\n heading?: string;\n /** Extra content (buttons, filters) rendered above the table. */\n extra?: React.ReactNode;\n /** External loading state. Renders a skeleton placeholder while true. */\n loading?: boolean;\n /** Translated labels; falls back to English defaults. */\n labels?: DataTableLabels;\n /**\n * Translatable pagination text (total/records, previous/next, page-size,\n * jumper). Applied to the table's pagination — matches the mf-boveda pattern\n * of a \"{prefix} {total} {suffix}\" total and translated prev/next buttons.\n * Merged into `pagination`; anything set directly on `pagination`\n * (`showTotal`/`itemRender`/`locale`) wins.\n */\n paginationLabels?: PaginationLabels;\n /**\n * Opt-in: render numeric values in the first column as colored tags\n * (green when >= 0, red when < 0). Off by default — this replaces the\n * implicit column-0 behavior of the original mf-boveda DataTable, which\n * was surprising. Explicitly enable it per table when desired.\n */\n firstColumnNumericTag?: boolean;\n}\n\nfunction toNumericValue(value: unknown): number | null {\n if (value === null || value === undefined || value === '') return null;\n const num =\n typeof value === 'string' ? parseFloat(value.replace(/,/g, '')) : Number(value);\n return Number.isNaN(num) || !Number.isFinite(num) ? null : num;\n}\n\n/**\n * AMS DataTable — themed, opinionated wrapper over antd `Table`.\n *\n * Ports the reusable behavior from mf-boveda's DataTable:\n * - loading skeleton placeholder,\n * - `bordered` and horizontal `scroll: { x: 'max-content' }` defaults,\n * - i18n-agnostic labels via props,\n * - optional (opt-in) numeric tags on the first column.\n *\n * All other antd Table props pass through.\n */\nfunction buildTotalText(labels?: PaginationLabels): TablePaginationConfig['showTotal'] | undefined {\n if (!labels) return undefined;\n if (labels.total) return (total, range) => labels.total!(total, range);\n if (labels.totalText) {\n return (total, range) => {\n const { prefix, suffix, showRange } = labels.totalText!;\n const middle = showRange ? `${range[0]}-${range[1]}` : String(total);\n return [prefix, middle, suffix].filter(Boolean).join(' ');\n };\n }\n return undefined;\n}\n\nfunction buildItemRender(labels?: PaginationLabels): TablePaginationConfig['itemRender'] | undefined {\n if (!labels || (labels.previousText === undefined && labels.nextText === undefined)) {\n return undefined;\n }\n return (_page, type, element) => {\n if (type === 'prev' && labels.previousText !== undefined) return labels.previousText;\n if (type === 'next' && labels.nextText !== undefined) return labels.nextText;\n return element as ReactNode;\n };\n}\n\nexport function DataTable<T extends object = Record<string, unknown>>({\n heading,\n extra,\n loading = false,\n labels,\n paginationLabels,\n firstColumnNumericTag = false,\n columns,\n dataSource,\n scroll,\n bordered = true,\n pagination,\n className,\n ...rest\n}: DataTableProps<T>) {\n const mergedLabels = { ...DEFAULT_LABELS, ...labels };\n\n // Merge translatable pagination labels into the pagination config.\n // Explicit values on `pagination` win over the label-derived ones.\n const resolvedPagination =\n pagination === false || pagination === undefined\n ? pagination\n : (() => {\n const paginationLocale = buildPaginationLocale(paginationLabels);\n const totalFn = buildTotalText(paginationLabels);\n const itemRenderFn = buildItemRender(paginationLabels);\n return {\n ...(totalFn ? { showTotal: totalFn } : {}),\n ...(itemRenderFn ? { itemRender: itemRenderFn } : {}),\n ...(paginationLocale ? { locale: paginationLocale } : {}),\n ...pagination,\n };\n })();\n\n const resolvedColumns =\n firstColumnNumericTag && columns && columns.length > 0\n ? columns.map((col, index) => {\n if (index !== 0) return col;\n const originalRender = (\n col as { render?: (value: unknown, record: T, i: number) => React.ReactNode }\n ).render;\n return {\n ...col,\n render: (value: unknown, record: T, i: number) => {\n const content = originalRender\n ? originalRender(value, record, i)\n : (value as React.ReactNode);\n const numeric = toNumericValue(value);\n if (numeric === null) return content;\n return (\n <Tag\n intent={numeric < 0 ? 'error' : 'success'}\n style={{ minWidth: 72, textAlign: 'center' }}\n >\n {content}\n </Tag>\n );\n },\n };\n })\n : columns;\n\n const resolvedScroll = scroll ?? { x: 'max-content' };\n\n return (\n <div className={className}>\n {heading ? (\n <div style={{ marginBottom: 8 }}>\n <h3 style={{ margin: 0, fontWeight: 600 }}>{heading}</h3>\n </div>\n ) : null}\n {extra ? <div style={{ marginBottom: 8 }}>{extra}</div> : null}\n {loading ? (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 16 }}>\n {Array.from({ length: 6 }).map((_, i) => (\n <Skeleton key={i} active paragraph={{ rows: 0 }} title={{ width: '100%' }} />\n ))}\n </div>\n ) : (\n <Table<T>\n columns={resolvedColumns}\n dataSource={dataSource}\n bordered={bordered}\n scroll={resolvedScroll}\n pagination={resolvedPagination}\n locale={{\n emptyText: mergedLabels.emptyText,\n triggerAsc: mergedLabels.sortAsc,\n triggerDesc: mergedLabels.sortDesc,\n cancelSort: mergedLabels.cancelSort,\n }}\n {...rest}\n />\n )}\n </div>\n );\n}\n","import { useCallback, useState } from 'react';\n\nexport interface UseControllableStateOptions<T> {\n /** Controlled value. When defined, the hook is in controlled mode. */\n value?: T;\n /** Initial value for uncontrolled mode. */\n defaultValue: T;\n /** Called on every change (both modes). */\n onChange?: (next: T) => void;\n}\n\n/**\n * Supports the controlled/uncontrolled pattern used across the design system\n * (mirrors mf-boveda's ReusableModal state handling). When `value` is provided\n * the component is controlled; otherwise internal state is used.\n */\nexport function useControllableState<T>({\n value,\n defaultValue,\n onChange,\n}: UseControllableStateOptions<T>): [T, (next: T) => void] {\n const isControlled = value !== undefined;\n const [internal, setInternal] = useState<T>(defaultValue);\n const current = isControlled ? (value as T) : internal;\n\n const setValue = useCallback(\n (next: T) => {\n if (!isControlled) {\n setInternal(next);\n }\n onChange?.(next);\n },\n [isControlled, onChange],\n );\n\n return [current, setValue];\n}\n","import { Modal } from 'antd';\nimport type { ModalProps } from 'antd';\nimport {\n isValidElement,\n cloneElement,\n useCallback,\n useMemo,\n type ReactNode,\n type MouseEvent,\n type KeyboardEvent,\n} from 'react';\nimport { useControllableState } from '../../hooks/useControllableState';\n\ntype TriggerRenderer = (open: () => void) => ReactNode;\n\nexport interface ModalDialogProps extends Omit<ModalProps, 'open' | 'children'> {\n /** Controlled open state. */\n open?: boolean;\n /** Initial open state in uncontrolled mode. */\n defaultOpen?: boolean;\n /** Node or render-prop that opens the modal when clicked. */\n trigger?: ReactNode | TriggerRenderer;\n /** Close automatically after `onOk` resolves. Default true. */\n closeOnOk?: boolean;\n /** Close automatically after `onCancel`. Default true. */\n closeOnCancel?: boolean;\n /** Notified whenever the open state changes (controlled or not). */\n onOpenChange?: (next: boolean) => void;\n children?: ReactNode;\n}\n\nfunction isPromise<T>(value: unknown): value is Promise<T> {\n return !!value && typeof (value as Promise<T>).then === 'function';\n}\n\n/**\n * AMS ModalDialog — a controllable modal composite.\n *\n * Ports mf-boveda's ReusableModal API:\n * - controlled (`open`) or uncontrolled (`defaultOpen`) state,\n * - a `trigger` node or render-prop that opens it,\n * - `closeOnOk` / `closeOnCancel` with async `onOk` support (waits for the\n * returned promise before closing).\n *\n * All other antd Modal props pass through.\n */\nexport function ModalDialog({\n trigger,\n children,\n open,\n defaultOpen = false,\n closeOnOk = true,\n closeOnCancel = true,\n onOk,\n onCancel,\n onOpenChange,\n ...modalProps\n}: ModalDialogProps) {\n const [isOpen, setOpen] = useControllableState<boolean>({\n value: open,\n defaultValue: defaultOpen,\n onChange: onOpenChange,\n });\n\n const handleOpen = useCallback(() => setOpen(true), [setOpen]);\n\n const handleCancel: ModalProps['onCancel'] = useCallback(\n (event: MouseEvent<HTMLButtonElement> | KeyboardEvent<HTMLElement>) => {\n onCancel?.(event);\n if (closeOnCancel) setOpen(false);\n },\n [onCancel, closeOnCancel, setOpen],\n );\n\n const handleOk: ModalProps['onOk'] = useCallback(\n async (event: MouseEvent<HTMLButtonElement>) => {\n const result = onOk?.(event);\n if (!closeOnOk) return;\n if (isPromise(result)) {\n try {\n await result;\n } finally {\n setOpen(false);\n }\n } else {\n setOpen(false);\n }\n },\n [onOk, closeOnOk, setOpen],\n );\n\n const triggerNode = useMemo(() => {\n if (!trigger) return null;\n if (typeof trigger === 'function') {\n return (trigger as TriggerRenderer)(handleOpen);\n }\n if (isValidElement(trigger)) {\n const el = trigger as React.ReactElement<{ onClick?: (e: MouseEvent<HTMLElement>) => void }>;\n const originalOnClick = el.props.onClick;\n return cloneElement(el, {\n onClick: (event: MouseEvent<HTMLElement>) => {\n originalOnClick?.(event);\n handleOpen();\n },\n });\n }\n return trigger;\n }, [trigger, handleOpen]);\n\n return (\n <>\n {triggerNode}\n <Modal open={isOpen} onOk={handleOk} onCancel={handleCancel} {...modalProps}>\n {children}\n </Modal>\n </>\n );\n}\n","import { Select } from 'antd';\nimport type { SelectProps } from 'antd';\nimport type { ReactNode } from 'react';\n\nexport interface FilterOption {\n value: string;\n label: ReactNode;\n disabled?: boolean;\n}\n\nexport interface FilterSelectProps\n extends Omit<SelectProps<string>, 'options' | 'filterOption'> {\n options: FilterOption[];\n /** Enable client-side search with accent-insensitive matching. */\n showSearch?: boolean;\n /** Override the default accent-insensitive filter. */\n filterOption?: SelectProps<string>['filterOption'];\n}\n\nconst normalize = (value?: string): string =>\n (value ?? '')\n .toString()\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '')\n .toLowerCase();\n\nconst extractText = (node?: ReactNode): string => {\n if (node === null || node === undefined) return '';\n if (typeof node === 'string' || typeof node === 'number' || typeof node === 'boolean') {\n return String(node);\n }\n if (Array.isArray(node)) return node.map(extractText).join(' ');\n if (typeof node === 'object' && 'props' in (node as unknown as Record<string, unknown>)) {\n const props = (node as { props?: { children?: ReactNode } }).props;\n return extractText(props?.children);\n }\n return '';\n};\n\n/**\n * AMS FilterSelect — a Select preset for dashboard filters.\n *\n * Ports mf-boveda's FilterSelect: accent-insensitive search over both the\n * option label and value, full-width by default. i18n is the consumer's\n * responsibility (pass already-translated labels).\n */\nexport function FilterSelect({\n options,\n showSearch = false,\n filterOption,\n className,\n style,\n ...rest\n}: FilterSelectProps) {\n const defaultFilter: SelectProps<string>['filterOption'] = (input, option) => {\n if (!option) return false;\n const query = normalize(input);\n const label = normalize(extractText(option.label as ReactNode));\n const value = normalize(typeof option.value === 'string' ? option.value : '');\n return label.includes(query) || value.includes(query);\n };\n\n const resolvedFilter = showSearch && !filterOption ? defaultFilter : filterOption;\n\n return (\n <Select<string>\n options={options}\n showSearch={showSearch}\n filterOption={resolvedFilter}\n optionFilterProp=\"label\"\n className={className}\n style={{ width: '100%', ...style }}\n {...rest}\n />\n );\n}\n","import { Upload } from 'antd';\nimport type { UploadProps } from 'antd';\nimport { InboxOutlined } from '@ant-design/icons';\nimport { useMemo, type ReactNode } from 'react';\nimport { useAmsMessage } from '../message/useAmsMessage';\n\ntype UploadMessage = string | ((fileName: string) => string);\ntype UploadChangeInfo = Parameters<NonNullable<UploadProps['onChange']>>[0];\n\nexport interface FileUploadDraggerProps\n extends Omit<UploadProps, 'onChange'> {\n /** Success toast text or a builder receiving the file name. */\n successMessage?: UploadMessage;\n /** Error toast text or a builder receiving the file name. */\n errorMessage?: UploadMessage;\n /** Show success/error toasts on upload status changes. Default true. */\n showStatusMessages?: boolean;\n /** Prompt text shown inside the drop area (when no children given). */\n hintText?: ReactNode;\n onUploadSuccess?: (info: UploadChangeInfo) => void;\n onUploadError?: (info: UploadChangeInfo) => void;\n onChange?: UploadProps['onChange'];\n children?: ReactNode;\n}\n\nconst resolveMessage = (\n template: UploadMessage | undefined,\n fileName: string,\n fallback: string,\n): string => {\n if (!template) return fallback.replace('{file}', fileName);\n return typeof template === 'function' ? template(fileName) : template.replace('{file}', fileName);\n};\n\n/**\n * AMS FileUploadDragger — drag-and-drop uploader.\n *\n * Ports mf-boveda's FileUploadDragger with two DS improvements:\n * - toasts use the context-safe `useAmsMessage()` (no antd v5 static warning),\n * - all copy is passed via props (i18n stays in the consumer); no default\n * upload endpoint is baked in.\n */\nexport function FileUploadDragger({\n successMessage,\n errorMessage,\n showStatusMessages = true,\n hintText = 'Click or drag a file to this area to upload',\n onUploadSuccess,\n onUploadError,\n onChange: externalOnChange,\n children,\n ...uploadProps\n}: FileUploadDraggerProps) {\n const message = useAmsMessage();\n\n const mergedProps = useMemo<UploadProps>(\n () => ({\n ...uploadProps,\n onChange(info) {\n const { status, name: fileName } = info.file;\n if (showStatusMessages) {\n if (status === 'done') {\n message.success(resolveMessage(successMessage, fileName, `${fileName} uploaded successfully.`));\n onUploadSuccess?.(info);\n } else if (status === 'error') {\n message.error(resolveMessage(errorMessage, fileName, `${fileName} failed to upload.`));\n onUploadError?.(info);\n }\n }\n externalOnChange?.(info);\n },\n }),\n [uploadProps, showStatusMessages, message, successMessage, errorMessage, onUploadSuccess, onUploadError, externalOnChange],\n );\n\n return (\n <Upload.Dragger {...mergedProps}>\n {children ?? (\n <>\n <p className=\"ant-upload-drag-icon\">\n <InboxOutlined />\n </p>\n <p className=\"ant-upload-text\">{hintText}</p>\n </>\n )}\n </Upload.Dragger>\n );\n}\n","import { Breadcrumb } from 'antd';\nimport type { BreadcrumbProps } from 'antd';\nimport type { ReactNode } from 'react';\n\nexport interface BreadcrumbItem {\n title: ReactNode;\n href?: string;\n}\n\nexport interface PageHeaderProps {\n /** Page title. Rendered as an h1. */\n title: ReactNode;\n /** Breadcrumb trail. When omitted, no breadcrumb is shown. */\n breadcrumbs?: BreadcrumbItem[];\n /** Breadcrumb separator. Defaults to \">\". */\n separator?: ReactNode;\n /** Uppercase the title (matches the b2bmx convention). Default true. */\n uppercaseTitle?: boolean;\n /** Content aligned to the right of the title (actions). */\n extra?: ReactNode;\n className?: string;\n}\n\n/**\n * AMS PageHeader — page title with an optional breadcrumb.\n *\n * Consolidates mf-boveda's Header + Breadcrums. Decoupled from react-router\n * and the boveda domain: the consumer builds the breadcrumb items (already\n * translated) and passes them in.\n */\nexport function PageHeader({\n title,\n breadcrumbs,\n separator = '>',\n uppercaseTitle = true,\n extra,\n className,\n}: PageHeaderProps) {\n return (\n <div className={className} style={{ marginBottom: 32 }}>\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 16,\n }}\n >\n <h1\n style={{\n fontSize: 20,\n fontWeight: 700,\n margin: 0,\n textTransform: uppercaseTitle ? 'uppercase' : undefined,\n }}\n >\n {title}\n </h1>\n {extra ? <div>{extra}</div> : null}\n </div>\n {breadcrumbs && breadcrumbs.length > 0 ? (\n <Breadcrumb\n separator={separator}\n items={breadcrumbs as BreadcrumbProps['items']}\n style={{ fontSize: 13, marginTop: 8 }}\n />\n ) : null}\n </div>\n );\n}\n","import { DownloadOutlined } from '@ant-design/icons';\nimport { forwardRef } from 'react';\nimport { Button } from '../Button';\nimport type { ButtonProps } from '../Button';\n\nexport interface DownloadButtonProps extends ButtonProps {\n /** Button label. Defaults to \"CSV\". */\n label?: React.ReactNode;\n}\n\n/**\n * AMS DownloadButton — a Button preset for download actions.\n *\n * Ports mf-boveda's DownloadButton: primary type + download icon + label,\n * with the full Button API available. i18n via the `label`/`children` props.\n */\nexport const DownloadButton = forwardRef<\n HTMLButtonElement | HTMLAnchorElement,\n DownloadButtonProps\n>(function DownloadButton({ label = 'CSV', icon, type = 'primary', children, ...rest }, ref) {\n return (\n <Button ref={ref} type={type} icon={icon ?? <DownloadOutlined />} {...rest}>\n {children ?? label}\n </Button>\n );\n});\n","import type { ReactNode } from 'react';\nimport { ModalDialog } from '../ModalDialog';\nimport type { ModalDialogProps } from '../ModalDialog';\n\nexport interface ConfirmModalProps\n extends Omit<ModalDialogProps, 'children'> {\n /** Body message shown to the user. */\n message?: ReactNode;\n /** Mark the confirm action as destructive (red primary button). */\n danger?: boolean;\n children?: ReactNode;\n}\n\n/**\n * AMS ConfirmModal — a confirm/cancel dialog preset built on `ModalDialog`.\n *\n * Generalizes the mf-boveda cancel/confirm modals (CancelCfdiModal, etc.):\n * inherits controlled/uncontrolled state, trigger, and async `onOk` from\n * ModalDialog. Set `danger` for destructive actions. Copy via props (i18n).\n */\nexport function ConfirmModal({\n message,\n danger = false,\n okButtonProps,\n children,\n ...rest\n}: ConfirmModalProps) {\n return (\n <ModalDialog\n okButtonProps={{ danger, ...okButtonProps }}\n {...rest}\n >\n {children ?? (message ? <p>{message}</p> : null)}\n </ModalDialog>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/theme/tokens.ts","../src/theme/theme.ts","../src/theme/useThemeMode.ts","../src/theme/AmsConfigProvider.tsx","../src/components/Button/Button.tsx","../src/components/Tag/Tag.tsx","../src/components/message/useAmsMessage.ts","../src/components/notification/useAmsNotification.ts","../src/components/Pagination/Pagination.tsx","../src/components/Card/Card.tsx","../src/components/ThemeToggle/ThemeToggle.tsx","../src/components/DataTable/DataTable.tsx","../src/hooks/useControllableState.ts","../src/components/ModalDialog/ModalDialog.tsx","../src/components/FilterSelect/FilterSelect.tsx","../src/components/FileUploadDragger/FileUploadDragger.tsx","../src/components/PageHeader/PageHeader.tsx","../src/components/DownloadButton/DownloadButton.tsx","../src/components/ConfirmModal/ConfirmModal.tsx"],"names":["antdTheme","createContext","useContext","useState","useEffect","useCallback","useMemo","jsx","ConfigProvider","App","forwardRef","Button","AntButton","Tag","AntTag","AntPagination","AntdCard","Switch","BulbFilled","BulbOutlined","jsxs","Skeleton","Table","isValidElement","cloneElement","Fragment","Modal","Select","Upload","InboxOutlined","Breadcrumb","DownloadButton","DownloadOutlined"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Design tokens — the single source of truth for the AMS Design System.\n *\n * Values are taken from the B2BMX Metronic theme:\n * b2bmx-web-metronic/src/_metronic/assets/sass/components/_variables.custom.scss\n * b2bmx-web-metronic/tailwind.config.js\n *\n * Two tiers:\n * - `primitives`: raw values, no semantic meaning.\n * - `semantic`: role aliases consumed by the antd theme (and Tailwind).\n */\n\n/** Raw Metronic brand values. */\nexport const primitives = {\n brandRed: '#A72432',\n brandRedActive: '#8B1D28', // darken 10%\n brandRedLight: '#f1faff',\n\n green: '#50cd89',\n greenActive: '#47be7d',\n greenLight: '#e8fff3',\n\n purple: '#7239ea',\n purpleActive: '#5014d0',\n purpleLight: '#f8f5ff',\n\n pink: '#f1416c',\n pinkActive: '#d9214e',\n pinkLight: '#fff5f8',\n\n yellow: '#ffc700',\n yellowActive: '#f1bc00',\n yellowLight: '#fff8dd',\n\n white: '#ffffff',\n\n gray: {\n 100: '#f9f9f9',\n 200: '#f4f4f4',\n 300: '#e1e3ea',\n 400: '#b5b5c3',\n 500: '#a1a5b7',\n 600: '#7e8299',\n 700: '#5e6278',\n 800: '#3f4254',\n 900: '#181c32',\n },\n\n background: {\n app: '#f5f8fa',\n body: '#ffffff',\n appDark: '#151521',\n bodyDark: '#1e1e2d',\n },\n\n dark: {\n base: '#181c32',\n bg: '#151521',\n header: '#1e1e2d',\n active: '#2a2a3c',\n separator: '#393945',\n // Dark-mode surfaces (from mf-container's antdTheme).\n inputBg: '#1b1b29',\n cardBg: '#1e1e2d',\n // Dark-mode gray scale — DISTINCT from the light `gray` scale (Metronic).\n gray: {\n 100: '#2b2b40',\n 200: '#323248',\n 300: '#3b3b64',\n 400: '#474761',\n 500: '#565674',\n 600: '#6d6d80',\n 700: '#92929f',\n 800: '#cdcdde',\n },\n },\n} as const;\n\n/** Radius scale (Metronic). Base radius is 4px. */\nexport const radius = {\n sm: 2,\n base: 4,\n md: 6,\n lg: 8,\n xl: 12,\n} as const;\n\n/** Typography (Metronic uses Inter with a compact 13px base). */\nexport const typography = {\n fontFamily: 'Inter, Helvetica, Arial, sans-serif',\n fontSizeBase: 13,\n weight: {\n light: 300,\n normal: 400,\n medium: 500,\n semibold: 600,\n bold: 700,\n },\n} as const;\n\n/** Control sizing (Metronic). */\nexport const sizing = {\n controlHeight: 32,\n buttonMinWidth: 110,\n} as const;\n\n/**\n * Semantic tokens — role aliases. These feed the antd `ThemeConfig`.\n * Components must consume semantic tokens, never primitives directly.\n */\nexport const semantic = {\n colorPrimary: primitives.brandRed,\n colorPrimaryActive: primitives.brandRedActive,\n colorSuccess: primitives.green,\n colorInfo: primitives.purple,\n colorError: primitives.pink,\n colorWarning: primitives.yellow,\n\n // Links. Metronic inherits link color from the (red) primary, which reads as\n // \"danger\" in dense UIs. The AMS default uses a neutral dark gray so links\n // don't look like errors; consumers can override `colorLink`/`colorLinkHover`\n // via AmsConfigProvider's `theme` prop (e.g. back to the brand red or blue).\n colorLink: primitives.gray[800],\n colorLinkHover: primitives.brandRed,\n colorLinkActive: primitives.brandRedActive,\n\n colorBgLayout: primitives.background.app,\n colorBgContainer: primitives.background.body,\n\n borderRadius: radius.base,\n fontFamily: typography.fontFamily,\n fontSize: typography.fontSizeBase,\n controlHeight: sizing.controlHeight,\n} as const;\n\nexport type ThemeMode = 'light' | 'dark';\n","import { theme as antdTheme } from 'antd';\nimport type { ThemeConfig } from 'antd';\nimport { primitives, semantic, type ThemeMode } from './tokens';\n\n/**\n * Tokens shared by light and dark modes (brand, links, radius, typography).\n * Backgrounds, text, and borders are mode-specific (see below).\n */\nconst sharedToken: ThemeConfig['token'] = {\n colorPrimary: semantic.colorPrimary,\n colorSuccess: semantic.colorSuccess,\n colorInfo: semantic.colorInfo,\n colorError: semantic.colorError,\n colorWarning: semantic.colorWarning,\n colorLink: semantic.colorLink,\n colorLinkHover: semantic.colorLinkHover,\n colorLinkActive: semantic.colorLinkActive,\n borderRadius: semantic.borderRadius,\n fontFamily: semantic.fontFamily,\n fontSize: semantic.fontSize,\n controlHeight: semantic.controlHeight,\n};\n\n/** Light-mode tokens. */\nconst lightToken: ThemeConfig['token'] = {\n ...sharedToken,\n colorBgLayout: semantic.colorBgLayout,\n colorBgContainer: semantic.colorBgContainer,\n colorBgElevated: primitives.background.body,\n colorText: primitives.gray[900],\n colorTextSecondary: primitives.gray[700],\n colorTextTertiary: primitives.gray[500],\n colorTextQuaternary: primitives.gray[400],\n colorBorder: primitives.gray[300],\n colorBorderSecondary: primitives.gray[200],\n};\n\n/**\n * Dark-mode tokens. Backgrounds/text/borders come from the Metronic dark\n * palette (mirrors mf-container's darkTheme). Brand colors stay identical.\n */\nconst darkToken: ThemeConfig['token'] = {\n ...sharedToken,\n colorBgLayout: primitives.background.appDark,\n colorBgContainer: primitives.background.bodyDark,\n colorBgElevated: primitives.background.bodyDark,\n colorText: '#ffffff',\n colorTextHeading: '#ffffff',\n colorTextSecondary: primitives.dark.gray[800],\n colorTextTertiary: primitives.dark.gray[700],\n colorTextQuaternary: primitives.dark.gray[600],\n colorBorder: primitives.dark.gray[300],\n colorBorderSecondary: primitives.dark.gray[200],\n boxShadow:\n '0 6px 16px 0 rgba(0, 0, 0, 0.48), 0 3px 6px -4px rgba(0, 0, 0, 0.36), 0 9px 28px 8px rgba(0, 0, 0, 0.15)',\n};\n\n/** Per-component overrides shared by both modes. */\nconst sharedComponents: ThemeConfig['components'] = {\n Button: { controlHeight: 32 },\n Tabs: {\n itemColor: primitives.gray[600],\n itemSelectedColor: semantic.colorPrimary,\n itemHoverColor: semantic.colorPrimary,\n },\n};\n\n/** Light per-component overrides. */\nconst lightComponents: ThemeConfig['components'] = {\n ...sharedComponents,\n Table: {\n headerBg: primitives.gray[100],\n headerColor: primitives.gray[800],\n borderColor: primitives.gray[300],\n cellPaddingBlock: 8,\n cellPaddingInline: 8,\n },\n};\n\n/** Dark per-component overrides (mirrors mf-container's dark component theme). */\nconst darkComponents: ThemeConfig['components'] = {\n ...sharedComponents,\n Table: {\n headerBg: primitives.dark.gray[200],\n headerColor: primitives.dark.gray[800],\n borderColor: primitives.dark.gray[400],\n rowHoverBg: primitives.dark.gray[200],\n cellPaddingBlock: 8,\n cellPaddingInline: 8,\n },\n Input: {\n colorBgContainer: primitives.dark.inputBg,\n colorBorder: primitives.dark.gray[400],\n colorText: '#ffffff',\n },\n Select: {\n colorBgContainer: primitives.dark.inputBg,\n colorBorder: primitives.dark.gray[400],\n colorText: '#ffffff',\n },\n DatePicker: {\n colorBgContainer: primitives.dark.inputBg,\n },\n Card: {\n colorBgContainer: primitives.dark.cardBg,\n colorBorderSecondary: primitives.dark.cardBg,\n },\n Modal: {\n contentBg: primitives.dark.gray[100],\n headerBg: primitives.dark.gray[100],\n },\n Drawer: {\n colorBgElevated: primitives.dark.gray[100],\n },\n Notification: {\n colorBgElevated: primitives.dark.gray[100],\n },\n Message: {\n contentBg: primitives.dark.gray[100],\n },\n Menu: {\n itemBg: primitives.background.bodyDark,\n itemHoverBg: primitives.dark.gray[100],\n itemSelectedBg: primitives.dark.active,\n itemSelectedColor: semantic.colorPrimary,\n itemActiveBg: primitives.dark.active,\n subMenuItemBg: primitives.background.bodyDark,\n },\n Dropdown: {\n colorBgElevated: primitives.background.bodyDark,\n controlItemBgHover: primitives.dark.gray[100],\n },\n};\n\n/**\n * Builds the antd theme for a given mode. Dark mode uses antd's\n * `darkAlgorithm`; brand tokens stay identical so the brand is consistent.\n */\nexport function buildTheme(mode: ThemeMode = 'light'): ThemeConfig {\n const isDark = mode === 'dark';\n return {\n algorithm: isDark ? antdTheme.darkAlgorithm : antdTheme.defaultAlgorithm,\n token: isDark ? darkToken : lightToken,\n components: isDark ? darkComponents : lightComponents,\n };\n}\n\n/** Default (light) AMS theme. */\nexport const amsTheme: ThemeConfig = buildTheme('light');\n\n/** Dark AMS theme. */\nexport const amsThemeDark: ThemeConfig = buildTheme('dark');\n","import {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from 'react';\nimport type { ThemeMode } from './tokens';\n\nconst STORAGE_KEY = 'ams-theme';\n\n/** Reads the initial mode: saved preference → OS preference → light. */\nexport function getInitialThemeMode(defaultMode: ThemeMode = 'light'): ThemeMode {\n if (typeof window === 'undefined') return defaultMode;\n const saved = window.localStorage.getItem(STORAGE_KEY);\n if (saved === 'light' || saved === 'dark') return saved;\n if (window.matchMedia?.('(prefers-color-scheme: dark)').matches) return 'dark';\n return defaultMode;\n}\n\n/** Reflects the mode on the DOM so CSS can react (mirrors mf-container). */\nexport function applyThemeModeToDOM(mode: ThemeMode): void {\n if (typeof document === 'undefined') return;\n document.documentElement.setAttribute('data-theme', mode);\n document.body?.setAttribute('data-theme', mode);\n}\n\nexport interface ThemeModeContextValue {\n mode: ThemeMode;\n setMode: (mode: ThemeMode) => void;\n toggle: () => void;\n isDark: boolean;\n}\n\nexport const ThemeModeContext = createContext<ThemeModeContextValue | null>(null);\n\n/**\n * Access the current color mode and switch it. Requires an ancestor\n * `AmsConfigProvider`. Use it to build a light/dark toggle:\n *\n * const { isDark, toggle } = useThemeMode();\n * <Switch checked={isDark} onChange={toggle} />\n */\nexport function useThemeMode(): ThemeModeContextValue {\n const ctx = useContext(ThemeModeContext);\n if (!ctx) {\n throw new Error('useThemeMode must be used within an AmsConfigProvider');\n }\n return ctx;\n}\n\n/**\n * Internal state manager for the color mode. When `controlledMode` is provided,\n * the provider is controlled (no persistence). Otherwise the mode is managed\n * here: persisted to localStorage and reflected on the DOM via `data-theme`.\n */\nexport function useThemeModeState(\n controlledMode: ThemeMode | undefined,\n defaultMode: ThemeMode,\n persist: boolean,\n): ThemeModeContextValue {\n const isControlled = controlledMode !== undefined;\n const [internalMode, setInternalMode] = useState<ThemeMode>(() =>\n isControlled ? controlledMode : persist ? getInitialThemeMode(defaultMode) : defaultMode,\n );\n\n const mode = isControlled ? controlledMode : internalMode;\n\n useEffect(() => {\n applyThemeModeToDOM(mode);\n }, [mode]);\n\n const setMode = useCallback(\n (next: ThemeMode) => {\n if (!isControlled) {\n setInternalMode(next);\n if (persist && typeof window !== 'undefined') {\n window.localStorage.setItem(STORAGE_KEY, next);\n }\n }\n },\n [isControlled, persist],\n );\n\n const toggle = useCallback(() => {\n setMode(mode === 'light' ? 'dark' : 'light');\n }, [mode, setMode]);\n\n return useMemo(\n () => ({ mode, setMode, toggle, isDark: mode === 'dark' }),\n [mode, setMode, toggle],\n );\n}\n","import { App, ConfigProvider } from 'antd';\nimport type { Locale } from 'antd/es/locale';\nimport type { ThemeConfig } from 'antd';\nimport type { PropsWithChildren, ReactNode } from 'react';\nimport { buildTheme } from './theme';\nimport type { ThemeMode } from './tokens';\nimport { ThemeModeContext, useThemeModeState } from './useThemeMode';\n\nexport interface AmsConfigProviderProps {\n /**\n * Controlled color mode. When provided, the provider does not manage or\n * persist the mode. Omit it to let the provider manage the mode itself\n * (persisted to localStorage, respects OS preference) — read/toggle it with\n * the `useThemeMode` hook.\n */\n mode?: ThemeMode;\n /** Initial mode when self-managed (uncontrolled). Defaults to `light`. */\n defaultMode?: ThemeMode;\n /** Persist the self-managed mode to localStorage. Defaults to `true`. */\n persistMode?: boolean;\n /**\n * antd locale (e.g. `esES`, `enUS`). The consuming app passes it;\n * the design system stays i18n-agnostic and ships no message catalog.\n */\n locale?: Locale;\n /**\n * Theme overrides merged on top of the AMS theme. Use it to customize tokens\n * per project without forking the DS, e.g. `{ token: { colorLink: '#1677ff' } }`.\n */\n theme?: ThemeConfig;\n children?: ReactNode;\n}\n\nfunction mergeTheme(base: ThemeConfig, override?: ThemeConfig): ThemeConfig {\n if (!override) return base;\n return {\n ...base,\n ...override,\n token: { ...base.token, ...override.token },\n components: { ...base.components, ...override.components },\n // A caller-provided algorithm wins; otherwise keep the mode's algorithm.\n algorithm: override.algorithm ?? base.algorithm,\n };\n}\n\n/**\n * Root provider for the AMS Design System.\n *\n * - Applies the AMS theme (light/dark) via antd's `ConfigProvider`.\n * - Renders antd's `App` for context-safe `message`/`notification`/`Modal`.\n * - Manages the color mode (controlled via `mode`, or self-managed with\n * localStorage persistence and OS-preference detection) and exposes it\n * through the `useThemeMode` hook.\n * - Accepts a `theme` override merged on top of the AMS theme.\n *\n * Render it once at the app root.\n */\nexport function AmsConfigProvider({\n mode,\n defaultMode = 'light',\n persistMode = true,\n locale,\n theme,\n children,\n}: PropsWithChildren<AmsConfigProviderProps>) {\n const themeMode = useThemeModeState(mode, defaultMode, persistMode);\n const resolvedTheme = mergeTheme(buildTheme(themeMode.mode), theme);\n\n return (\n <ThemeModeContext.Provider value={themeMode}>\n <ConfigProvider theme={resolvedTheme} locale={locale}>\n <App>{children}</App>\n </ConfigProvider>\n </ThemeModeContext.Provider>\n );\n}\n","import { Button as AntButton } from 'antd';\nimport type { ButtonProps as AntButtonProps } from 'antd';\nimport { forwardRef } from 'react';\n\nexport interface ButtonProps extends AntButtonProps {}\n\n/**\n * AMS Button — thin wrapper over antd `Button` that inherits the AMS theme.\n * Exposes the full antd Button API (type, danger, loading, icon, size, etc.)\n * and forwards the ref so it integrates with Form and tooltips.\n */\nexport const Button = forwardRef<HTMLButtonElement | HTMLAnchorElement, ButtonProps>(\n function Button(props, ref) {\n return <AntButton ref={ref} {...props} />;\n },\n);\n","import { Tag as AntTag } from 'antd';\nimport type { TagProps as AntTagProps } from 'antd';\nimport { forwardRef } from 'react';\nimport { semantic } from '../../theme/tokens';\n\n/** AMS semantic tag intents mapped to brand tokens. */\nexport type TagIntent = 'success' | 'error' | 'warning' | 'info' | 'primary';\n\nexport interface TagProps extends AntTagProps {\n /**\n * Semantic intent that resolves to an AMS brand color. Takes precedence over\n * antd's `color` when set. Formalizes the inline `#50cd89` / `#f1416c` colors\n * previously hardcoded in mf-boveda's DataTable.\n */\n intent?: TagIntent;\n}\n\nconst INTENT_COLOR: Record<TagIntent, string> = {\n success: semantic.colorSuccess,\n error: semantic.colorError,\n warning: semantic.colorWarning,\n info: semantic.colorInfo,\n primary: semantic.colorPrimary,\n};\n\n/**\n * AMS Tag — thin wrapper over antd `Tag` with an optional semantic `intent`\n * that maps to the brand palette. Falls back to the full antd Tag API.\n */\nexport const Tag = forwardRef<HTMLSpanElement, TagProps>(function Tag(\n { intent, color, ...rest },\n ref,\n) {\n const resolvedColor = intent ? INTENT_COLOR[intent] : color;\n return <AntTag ref={ref} color={resolvedColor} {...rest} />;\n});\n","import { App } from 'antd';\nimport type { MessageInstance } from 'antd/es/message/interface';\n\n/**\n * Context-safe access to antd's `message` API.\n *\n * In antd v5 the static `message.success(...)` calls do **not** read the\n * `ConfigProvider` theme and log a warning. The supported approach is to\n * consume the instance provided by antd's `App` context — which\n * `AmsConfigProvider` already renders at the root.\n *\n * Usage:\n * const message = useAmsMessage();\n * message.success('Saved');\n *\n * Requires an ancestor `AmsConfigProvider` (or antd `App`).\n */\nexport function useAmsMessage(): MessageInstance {\n return App.useApp().message;\n}\n","import { App } from 'antd';\nimport type { NotificationInstance } from 'antd/es/notification/interface';\n\n/**\n * Context-safe access to antd's `notification` API.\n *\n * Like `useAmsMessage`, this returns the instance from antd's `App` context so\n * notifications inherit the AMS theme and avoid the v5 static-method warning.\n * Requires an ancestor `AmsConfigProvider` (or antd `App`).\n *\n * Usage:\n * const notification = useAmsNotification();\n * notification.success({ message: 'Done', description: 'Saved.' });\n */\nexport function useAmsNotification(): NotificationInstance {\n return App.useApp().notification;\n}\n","import { Pagination as AntPagination } from 'antd';\nimport type { PaginationProps as AntPaginationProps } from 'antd';\nimport type { PaginationLocale } from 'antd/es/pagination/Pagination';\nimport type { ReactNode } from 'react';\n\n/**\n * Translatable text labels for the pagination control. The design system is\n * i18n-agnostic: the consuming app passes already-translated strings. Anything\n * omitted falls back to antd's `locale` (or English defaults).\n */\nexport interface PaginationLabels {\n /** Suffix in the page-size selector, e.g. \"/ página\". */\n itemsPerPage?: string;\n /** \"Ir a\" label of the quick jumper. */\n jumpTo?: string;\n /** Confirm button text of the quick jumper. */\n jumpToConfirm?: string;\n /** Accessible label for a page, e.g. \"Página\". */\n page?: string;\n /** Accessible label for the previous-page button. */\n prevPage?: string;\n /** Accessible label for the next-page button. */\n nextPage?: string;\n /** Label for the page-size selector, e.g. \"Tamaño de página\". */\n pageSize?: string;\n /**\n * Builds the total-records text (rendered before the pages).\n * Receives the total and the current [from, to] range.\n * e.g. (total) => `Total ${total} registros`. Takes precedence over `totalText`.\n */\n total?: (total: number, range: [number, number]) => ReactNode;\n /**\n * Declarative total text as separate translated words, matching how the\n * mf-boveda table builds it: `{prefix} {total} {suffix}` → \"Total 250 registros\".\n * Set `showRange` to render \"{prefix} {from}-{to} {suffix}\" instead.\n * Ignored when `total` (the function form) is provided.\n */\n totalText?: {\n /** Word(s) before the number, e.g. \"Total\". */\n prefix?: string;\n /** Word(s) after the number, e.g. \"registros\". */\n suffix?: string;\n /** Use the \"from-to\" range instead of just the total. Default false. */\n showRange?: boolean;\n };\n /** Visible text for the \"previous\" button (overrides the arrow). */\n previousText?: ReactNode;\n /** Visible text for the \"next\" button (overrides the arrow). */\n nextText?: ReactNode;\n}\n\nexport interface PaginationProps extends AntPaginationProps {\n /** Translatable text labels. */\n labels?: PaginationLabels;\n}\n\nfunction buildLocale(labels?: PaginationLabels): PaginationLocale | undefined {\n if (!labels) return undefined;\n const locale: PaginationLocale = {};\n if (labels.itemsPerPage !== undefined) locale.items_per_page = labels.itemsPerPage;\n if (labels.jumpTo !== undefined) locale.jump_to = labels.jumpTo;\n if (labels.jumpToConfirm !== undefined) locale.jump_to_confirm = labels.jumpToConfirm;\n if (labels.page !== undefined) locale.page = labels.page;\n if (labels.prevPage !== undefined) locale.prev_page = labels.prevPage;\n if (labels.nextPage !== undefined) locale.next_page = labels.nextPage;\n if (labels.pageSize !== undefined) locale.page_size = labels.pageSize;\n return Object.keys(locale).length > 0 ? locale : undefined;\n}\n\n/**\n * AMS Pagination — antd `Pagination` with translatable text via a single\n * `labels` prop (page, records/total, previous/next, items-per-page, jumper).\n * The rest of the antd Pagination API passes through. `showTotal` and\n * `itemRender` still work if you prefer to set them directly; explicit\n * `showTotal`/`itemRender`/`locale` props win over `labels`.\n */\nexport function Pagination({\n labels,\n showTotal,\n itemRender,\n locale,\n ...rest\n}: PaginationProps) {\n const mergedLocale = { ...buildLocale(labels), ...locale };\n\n const resolvedShowTotal: AntPaginationProps['showTotal'] =\n showTotal ??\n (labels?.total\n ? (total, range) => labels.total!(total, range)\n : labels?.totalText\n ? (total, range) => {\n const { prefix, suffix, showRange } = labels.totalText!;\n const middle = showRange ? `${range[0]}-${range[1]}` : String(total);\n return [prefix, middle, suffix].filter(Boolean).join(' ');\n }\n : undefined);\n\n const resolvedItemRender: AntPaginationProps['itemRender'] =\n itemRender ??\n (labels?.previousText || labels?.nextText\n ? (_page, type, element) => {\n if (type === 'prev' && labels?.previousText !== undefined) return labels.previousText;\n if (type === 'next' && labels?.nextText !== undefined) return labels.nextText;\n return element;\n }\n : undefined);\n\n return (\n <AntPagination\n {...rest}\n locale={Object.keys(mergedLocale).length > 0 ? mergedLocale : undefined}\n showTotal={resolvedShowTotal}\n itemRender={resolvedItemRender}\n />\n );\n}\n","import { Card as AntdCard } from 'antd';\nimport type { CardProps } from 'antd';\nimport type * as React from 'react';\n\n// antd v6 declares `Card` as an `interface` that EXTENDS a forwardRef function\n// type (`interface CardInterface extends typeof InternalCard { Grid; Meta }`).\n// Extending an interface over a function type discards its call/construct\n// signatures, so TypeScript rejects `<Card>` as a JSX element (TS2786 / TS2604)\n// in consumers (React 19 + moduleResolution: Bundler). Rebuilding the type with\n// an INTERSECTION preserves the call signature plus the subcomponents. This is a\n// type-only fix: the exported runtime value is the unchanged antd `Card`.\ntype CardComponent = React.ForwardRefExoticComponent<\n CardProps & React.RefAttributes<HTMLDivElement>\n> & {\n Grid: (typeof AntdCard)['Grid'];\n Meta: (typeof AntdCard)['Meta'];\n};\n\nexport const Card = AntdCard as unknown as CardComponent;\nexport type { CardProps } from 'antd';\n","import { Switch } from 'antd';\nimport type { SwitchProps } from 'antd';\nimport { BulbOutlined, BulbFilled } from '@ant-design/icons';\nimport { useThemeMode } from '../../theme/useThemeMode';\n\nexport interface ThemeToggleProps extends Omit<SwitchProps, 'checked' | 'onChange'> {}\n\n/**\n * AMS ThemeToggle — a ready-made light/dark switch wired to `useThemeMode`.\n * Requires an ancestor `AmsConfigProvider` that manages the mode\n * (i.e. rendered without a controlled `mode` prop).\n */\nexport function ThemeToggle(props: ThemeToggleProps) {\n const { isDark, toggle } = useThemeMode();\n return (\n <Switch\n checked={isDark}\n onChange={toggle}\n checkedChildren={<BulbFilled />}\n unCheckedChildren={<BulbOutlined />}\n {...props}\n />\n );\n}\n","import { Skeleton, Table } from 'antd';\nimport type { TableProps, TablePaginationConfig } from 'antd';\nimport type { PaginationLocale } from 'antd/es/pagination/Pagination';\nimport type { ReactNode } from 'react';\nimport { Tag } from '../Tag';\nimport type { PaginationLabels } from '../Pagination';\n\n/**\n * Labels for the DataTable. The design system is i18n-agnostic: the consuming\n * microfrontend passes translated strings from its own catalog. Sensible\n * English defaults are provided so the table renders without wiring.\n */\nexport interface DataTableLabels {\n emptyText?: string;\n sortAsc?: string;\n sortDesc?: string;\n cancelSort?: string;\n}\n\nfunction buildPaginationLocale(labels?: PaginationLabels): PaginationLocale | undefined {\n if (!labels) return undefined;\n const locale: PaginationLocale = {};\n if (labels.itemsPerPage !== undefined) locale.items_per_page = labels.itemsPerPage;\n if (labels.jumpTo !== undefined) locale.jump_to = labels.jumpTo;\n if (labels.jumpToConfirm !== undefined) locale.jump_to_confirm = labels.jumpToConfirm;\n if (labels.page !== undefined) locale.page = labels.page;\n if (labels.prevPage !== undefined) locale.prev_page = labels.prevPage;\n if (labels.nextPage !== undefined) locale.next_page = labels.nextPage;\n if (labels.pageSize !== undefined) locale.page_size = labels.pageSize;\n return Object.keys(locale).length > 0 ? locale : undefined;\n}\n\nconst DEFAULT_LABELS: Required<DataTableLabels> = {\n emptyText: 'No data',\n sortAsc: 'Sort ascending',\n sortDesc: 'Sort descending',\n cancelSort: 'Cancel sort',\n};\n\nexport interface DataTableProps<T extends object = Record<string, unknown>>\n extends Omit<TableProps<T>, 'title' | 'loading'> {\n /** Optional plain-text heading rendered above the table. */\n heading?: string;\n /** Extra content (buttons, filters) rendered above the table. */\n extra?: React.ReactNode;\n /** External loading state. Renders a skeleton placeholder while true. */\n loading?: boolean;\n /** Translated labels; falls back to English defaults. */\n labels?: DataTableLabels;\n /**\n * Translatable pagination text (total/records, previous/next, page-size,\n * jumper). Applied to the table's pagination — matches the mf-boveda pattern\n * of a \"{prefix} {total} {suffix}\" total and translated prev/next buttons.\n * Merged into `pagination`; anything set directly on `pagination`\n * (`showTotal`/`itemRender`/`locale`) wins.\n */\n paginationLabels?: PaginationLabels;\n /**\n * Opt-in: render numeric values in the first column as colored tags\n * (green when >= 0, red when < 0). Off by default — this replaces the\n * implicit column-0 behavior of the original mf-boveda DataTable, which\n * was surprising. Explicitly enable it per table when desired.\n */\n firstColumnNumericTag?: boolean;\n}\n\nfunction toNumericValue(value: unknown): number | null {\n if (value === null || value === undefined || value === '') return null;\n const num =\n typeof value === 'string' ? parseFloat(value.replace(/,/g, '')) : Number(value);\n return Number.isNaN(num) || !Number.isFinite(num) ? null : num;\n}\n\n/**\n * AMS DataTable — themed, opinionated wrapper over antd `Table`.\n *\n * Ports the reusable behavior from mf-boveda's DataTable:\n * - loading skeleton placeholder,\n * - `bordered` and horizontal `scroll: { x: 'max-content' }` defaults,\n * - i18n-agnostic labels via props,\n * - optional (opt-in) numeric tags on the first column.\n *\n * All other antd Table props pass through.\n */\nfunction buildTotalText(labels?: PaginationLabels): TablePaginationConfig['showTotal'] | undefined {\n if (!labels) return undefined;\n if (labels.total) return (total, range) => labels.total!(total, range);\n if (labels.totalText) {\n return (total, range) => {\n const { prefix, suffix, showRange } = labels.totalText!;\n const middle = showRange ? `${range[0]}-${range[1]}` : String(total);\n return [prefix, middle, suffix].filter(Boolean).join(' ');\n };\n }\n return undefined;\n}\n\nfunction buildItemRender(labels?: PaginationLabels): TablePaginationConfig['itemRender'] | undefined {\n if (!labels || (labels.previousText === undefined && labels.nextText === undefined)) {\n return undefined;\n }\n return (_page, type, element) => {\n if (type === 'prev' && labels.previousText !== undefined) return labels.previousText;\n if (type === 'next' && labels.nextText !== undefined) return labels.nextText;\n return element as ReactNode;\n };\n}\n\nexport function DataTable<T extends object = Record<string, unknown>>({\n heading,\n extra,\n loading = false,\n labels,\n paginationLabels,\n firstColumnNumericTag = false,\n columns,\n dataSource,\n scroll,\n bordered = true,\n pagination,\n className,\n ...rest\n}: DataTableProps<T>) {\n const mergedLabels = { ...DEFAULT_LABELS, ...labels };\n\n // Merge translatable pagination labels into the pagination config.\n // Explicit values on `pagination` win over the label-derived ones.\n const resolvedPagination =\n pagination === false || pagination === undefined\n ? pagination\n : (() => {\n const paginationLocale = buildPaginationLocale(paginationLabels);\n const totalFn = buildTotalText(paginationLabels);\n const itemRenderFn = buildItemRender(paginationLabels);\n return {\n ...(totalFn ? { showTotal: totalFn } : {}),\n ...(itemRenderFn ? { itemRender: itemRenderFn } : {}),\n ...(paginationLocale ? { locale: paginationLocale } : {}),\n ...pagination,\n };\n })();\n\n const resolvedColumns =\n firstColumnNumericTag && columns && columns.length > 0\n ? columns.map((col, index) => {\n if (index !== 0) return col;\n const originalRender = (\n col as { render?: (value: unknown, record: T, i: number) => React.ReactNode }\n ).render;\n return {\n ...col,\n render: (value: unknown, record: T, i: number) => {\n const content = originalRender\n ? originalRender(value, record, i)\n : (value as React.ReactNode);\n const numeric = toNumericValue(value);\n if (numeric === null) return content;\n return (\n <Tag\n intent={numeric < 0 ? 'error' : 'success'}\n style={{ minWidth: 72, textAlign: 'center' }}\n >\n {content}\n </Tag>\n );\n },\n };\n })\n : columns;\n\n const resolvedScroll = scroll ?? { x: 'max-content' };\n\n return (\n <div className={className}>\n {heading ? (\n <div style={{ marginBottom: 8 }}>\n <h3 style={{ margin: 0, fontWeight: 600 }}>{heading}</h3>\n </div>\n ) : null}\n {extra ? <div style={{ marginBottom: 8 }}>{extra}</div> : null}\n {loading ? (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 16 }}>\n {Array.from({ length: 6 }).map((_, i) => (\n <Skeleton key={i} active paragraph={{ rows: 0 }} title={{ width: '100%' }} />\n ))}\n </div>\n ) : (\n <Table<T>\n columns={resolvedColumns}\n dataSource={dataSource}\n bordered={bordered}\n scroll={resolvedScroll}\n pagination={resolvedPagination}\n locale={{\n emptyText: mergedLabels.emptyText,\n triggerAsc: mergedLabels.sortAsc,\n triggerDesc: mergedLabels.sortDesc,\n cancelSort: mergedLabels.cancelSort,\n }}\n {...rest}\n />\n )}\n </div>\n );\n}\n","import { useCallback, useState } from 'react';\n\nexport interface UseControllableStateOptions<T> {\n /** Controlled value. When defined, the hook is in controlled mode. */\n value?: T;\n /** Initial value for uncontrolled mode. */\n defaultValue: T;\n /** Called on every change (both modes). */\n onChange?: (next: T) => void;\n}\n\n/**\n * Supports the controlled/uncontrolled pattern used across the design system\n * (mirrors mf-boveda's ReusableModal state handling). When `value` is provided\n * the component is controlled; otherwise internal state is used.\n */\nexport function useControllableState<T>({\n value,\n defaultValue,\n onChange,\n}: UseControllableStateOptions<T>): [T, (next: T) => void] {\n const isControlled = value !== undefined;\n const [internal, setInternal] = useState<T>(defaultValue);\n const current = isControlled ? (value as T) : internal;\n\n const setValue = useCallback(\n (next: T) => {\n if (!isControlled) {\n setInternal(next);\n }\n onChange?.(next);\n },\n [isControlled, onChange],\n );\n\n return [current, setValue];\n}\n","import { Modal } from 'antd';\nimport type { ModalProps } from 'antd';\nimport {\n isValidElement,\n cloneElement,\n useCallback,\n useMemo,\n type ReactNode,\n type MouseEvent,\n type KeyboardEvent,\n} from 'react';\nimport { useControllableState } from '../../hooks/useControllableState';\n\ntype TriggerRenderer = (open: () => void) => ReactNode;\n\nexport interface ModalDialogProps extends Omit<ModalProps, 'open' | 'children'> {\n /** Controlled open state. */\n open?: boolean;\n /** Initial open state in uncontrolled mode. */\n defaultOpen?: boolean;\n /** Node or render-prop that opens the modal when clicked. */\n trigger?: ReactNode | TriggerRenderer;\n /** Close automatically after `onOk` resolves. Default true. */\n closeOnOk?: boolean;\n /** Close automatically after `onCancel`. Default true. */\n closeOnCancel?: boolean;\n /** Notified whenever the open state changes (controlled or not). */\n onOpenChange?: (next: boolean) => void;\n children?: ReactNode;\n}\n\nfunction isPromise<T>(value: unknown): value is Promise<T> {\n return !!value && typeof (value as Promise<T>).then === 'function';\n}\n\n/**\n * AMS ModalDialog — a controllable modal composite.\n *\n * Ports mf-boveda's ReusableModal API:\n * - controlled (`open`) or uncontrolled (`defaultOpen`) state,\n * - a `trigger` node or render-prop that opens it,\n * - `closeOnOk` / `closeOnCancel` with async `onOk` support (waits for the\n * returned promise before closing).\n *\n * All other antd Modal props pass through.\n */\nexport function ModalDialog({\n trigger,\n children,\n open,\n defaultOpen = false,\n closeOnOk = true,\n closeOnCancel = true,\n onOk,\n onCancel,\n onOpenChange,\n ...modalProps\n}: ModalDialogProps) {\n const [isOpen, setOpen] = useControllableState<boolean>({\n value: open,\n defaultValue: defaultOpen,\n onChange: onOpenChange,\n });\n\n const handleOpen = useCallback(() => setOpen(true), [setOpen]);\n\n const handleCancel: ModalProps['onCancel'] = useCallback(\n (event: MouseEvent<HTMLButtonElement> | KeyboardEvent<HTMLElement>) => {\n onCancel?.(event);\n if (closeOnCancel) setOpen(false);\n },\n [onCancel, closeOnCancel, setOpen],\n );\n\n const handleOk: ModalProps['onOk'] = useCallback(\n async (event: MouseEvent<HTMLButtonElement>) => {\n const result = onOk?.(event);\n if (!closeOnOk) return;\n if (isPromise(result)) {\n try {\n await result;\n } finally {\n setOpen(false);\n }\n } else {\n setOpen(false);\n }\n },\n [onOk, closeOnOk, setOpen],\n );\n\n const triggerNode = useMemo(() => {\n if (!trigger) return null;\n if (typeof trigger === 'function') {\n return (trigger as TriggerRenderer)(handleOpen);\n }\n if (isValidElement(trigger)) {\n const el = trigger as React.ReactElement<{ onClick?: (e: MouseEvent<HTMLElement>) => void }>;\n const originalOnClick = el.props.onClick;\n return cloneElement(el, {\n onClick: (event: MouseEvent<HTMLElement>) => {\n originalOnClick?.(event);\n handleOpen();\n },\n });\n }\n return trigger;\n }, [trigger, handleOpen]);\n\n return (\n <>\n {triggerNode}\n <Modal open={isOpen} onOk={handleOk} onCancel={handleCancel} {...modalProps}>\n {children}\n </Modal>\n </>\n );\n}\n","import { Select } from 'antd';\nimport type { SelectProps } from 'antd';\nimport type { ReactNode } from 'react';\n\nexport interface FilterOption {\n value: string;\n label: ReactNode;\n disabled?: boolean;\n}\n\nexport interface FilterSelectProps\n extends Omit<SelectProps<string>, 'options' | 'filterOption'> {\n options: FilterOption[];\n /** Enable client-side search with accent-insensitive matching. */\n showSearch?: boolean;\n /** Override the default accent-insensitive filter. */\n filterOption?: SelectProps<string>['filterOption'];\n}\n\nconst normalize = (value?: string): string =>\n (value ?? '')\n .toString()\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '')\n .toLowerCase();\n\nconst extractText = (node?: ReactNode): string => {\n if (node === null || node === undefined) return '';\n if (typeof node === 'string' || typeof node === 'number' || typeof node === 'boolean') {\n return String(node);\n }\n if (Array.isArray(node)) return node.map(extractText).join(' ');\n if (typeof node === 'object' && 'props' in (node as unknown as Record<string, unknown>)) {\n const props = (node as { props?: { children?: ReactNode } }).props;\n return extractText(props?.children);\n }\n return '';\n};\n\n/**\n * AMS FilterSelect — a Select preset for dashboard filters.\n *\n * Ports mf-boveda's FilterSelect: accent-insensitive search over both the\n * option label and value, full-width by default. i18n is the consumer's\n * responsibility (pass already-translated labels).\n */\nexport function FilterSelect({\n options,\n showSearch = false,\n filterOption,\n className,\n style,\n ...rest\n}: FilterSelectProps) {\n const defaultFilter: SelectProps<string>['filterOption'] = (input, option) => {\n if (!option) return false;\n const query = normalize(input);\n const label = normalize(extractText(option.label as ReactNode));\n const value = normalize(typeof option.value === 'string' ? option.value : '');\n return label.includes(query) || value.includes(query);\n };\n\n const resolvedFilter = showSearch && !filterOption ? defaultFilter : filterOption;\n\n return (\n <Select<string>\n options={options}\n showSearch={showSearch}\n filterOption={resolvedFilter}\n optionFilterProp=\"label\"\n className={className}\n style={{ width: '100%', ...style }}\n {...rest}\n />\n );\n}\n","import { Upload } from 'antd';\nimport type { UploadProps } from 'antd';\nimport { InboxOutlined } from '@ant-design/icons';\nimport { useMemo, type ReactNode } from 'react';\nimport { useAmsMessage } from '../message/useAmsMessage';\n\ntype UploadMessage = string | ((fileName: string) => string);\ntype UploadChangeInfo = Parameters<NonNullable<UploadProps['onChange']>>[0];\n\nexport interface FileUploadDraggerProps\n extends Omit<UploadProps, 'onChange'> {\n /** Success toast text or a builder receiving the file name. */\n successMessage?: UploadMessage;\n /** Error toast text or a builder receiving the file name. */\n errorMessage?: UploadMessage;\n /** Show success/error toasts on upload status changes. Default true. */\n showStatusMessages?: boolean;\n /** Prompt text shown inside the drop area (when no children given). */\n hintText?: ReactNode;\n onUploadSuccess?: (info: UploadChangeInfo) => void;\n onUploadError?: (info: UploadChangeInfo) => void;\n onChange?: UploadProps['onChange'];\n children?: ReactNode;\n}\n\nconst resolveMessage = (\n template: UploadMessage | undefined,\n fileName: string,\n fallback: string,\n): string => {\n if (!template) return fallback.replace('{file}', fileName);\n return typeof template === 'function' ? template(fileName) : template.replace('{file}', fileName);\n};\n\n/**\n * AMS FileUploadDragger — drag-and-drop uploader.\n *\n * Ports mf-boveda's FileUploadDragger with two DS improvements:\n * - toasts use the context-safe `useAmsMessage()` (no antd v5 static warning),\n * - all copy is passed via props (i18n stays in the consumer); no default\n * upload endpoint is baked in.\n */\nexport function FileUploadDragger({\n successMessage,\n errorMessage,\n showStatusMessages = true,\n hintText = 'Click or drag a file to this area to upload',\n onUploadSuccess,\n onUploadError,\n onChange: externalOnChange,\n children,\n ...uploadProps\n}: FileUploadDraggerProps) {\n const message = useAmsMessage();\n\n const mergedProps = useMemo<UploadProps>(\n () => ({\n ...uploadProps,\n onChange(info) {\n const { status, name: fileName } = info.file;\n if (showStatusMessages) {\n if (status === 'done') {\n message.success(resolveMessage(successMessage, fileName, `${fileName} uploaded successfully.`));\n onUploadSuccess?.(info);\n } else if (status === 'error') {\n message.error(resolveMessage(errorMessage, fileName, `${fileName} failed to upload.`));\n onUploadError?.(info);\n }\n }\n externalOnChange?.(info);\n },\n }),\n [uploadProps, showStatusMessages, message, successMessage, errorMessage, onUploadSuccess, onUploadError, externalOnChange],\n );\n\n return (\n <Upload.Dragger {...mergedProps}>\n {children ?? (\n <>\n <p className=\"ant-upload-drag-icon\">\n <InboxOutlined />\n </p>\n <p className=\"ant-upload-text\">{hintText}</p>\n </>\n )}\n </Upload.Dragger>\n );\n}\n","import { Breadcrumb } from 'antd';\nimport type { BreadcrumbProps } from 'antd';\nimport type { ReactNode } from 'react';\n\nexport interface BreadcrumbItem {\n title: ReactNode;\n href?: string;\n}\n\nexport interface PageHeaderProps {\n /** Page title. Rendered as an h1. */\n title: ReactNode;\n /** Breadcrumb trail. When omitted, no breadcrumb is shown. */\n breadcrumbs?: BreadcrumbItem[];\n /** Breadcrumb separator. Defaults to \">\". */\n separator?: ReactNode;\n /** Uppercase the title (matches the b2bmx convention). Default true. */\n uppercaseTitle?: boolean;\n /** Content aligned to the right of the title (actions). */\n extra?: ReactNode;\n className?: string;\n}\n\n/**\n * AMS PageHeader — page title with an optional breadcrumb.\n *\n * Consolidates mf-boveda's Header + Breadcrums. Decoupled from react-router\n * and the boveda domain: the consumer builds the breadcrumb items (already\n * translated) and passes them in.\n */\nexport function PageHeader({\n title,\n breadcrumbs,\n separator = '>',\n uppercaseTitle = true,\n extra,\n className,\n}: PageHeaderProps) {\n return (\n <div className={className} style={{ marginBottom: 32 }}>\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 16,\n }}\n >\n <h1\n style={{\n fontSize: 20,\n fontWeight: 700,\n margin: 0,\n textTransform: uppercaseTitle ? 'uppercase' : undefined,\n }}\n >\n {title}\n </h1>\n {extra ? <div>{extra}</div> : null}\n </div>\n {breadcrumbs && breadcrumbs.length > 0 ? (\n <Breadcrumb\n separator={separator}\n items={breadcrumbs as BreadcrumbProps['items']}\n style={{ fontSize: 13, marginTop: 8 }}\n />\n ) : null}\n </div>\n );\n}\n","import { DownloadOutlined } from '@ant-design/icons';\nimport { forwardRef } from 'react';\nimport { Button } from '../Button';\nimport type { ButtonProps } from '../Button';\n\nexport interface DownloadButtonProps extends ButtonProps {\n /** Button label. Defaults to \"CSV\". */\n label?: React.ReactNode;\n}\n\n/**\n * AMS DownloadButton — a Button preset for download actions.\n *\n * Ports mf-boveda's DownloadButton: primary type + download icon + label,\n * with the full Button API available. i18n via the `label`/`children` props.\n */\nexport const DownloadButton = forwardRef<\n HTMLButtonElement | HTMLAnchorElement,\n DownloadButtonProps\n>(function DownloadButton({ label = 'CSV', icon, type = 'primary', children, ...rest }, ref) {\n return (\n <Button ref={ref} type={type} icon={icon ?? <DownloadOutlined />} {...rest}>\n {children ?? label}\n </Button>\n );\n});\n","import type { ReactNode } from 'react';\nimport { ModalDialog } from '../ModalDialog';\nimport type { ModalDialogProps } from '../ModalDialog';\n\nexport interface ConfirmModalProps\n extends Omit<ModalDialogProps, 'children'> {\n /** Body message shown to the user. */\n message?: ReactNode;\n /** Mark the confirm action as destructive (red primary button). */\n danger?: boolean;\n children?: ReactNode;\n}\n\n/**\n * AMS ConfirmModal — a confirm/cancel dialog preset built on `ModalDialog`.\n *\n * Generalizes the mf-boveda cancel/confirm modals (CancelCfdiModal, etc.):\n * inherits controlled/uncontrolled state, trigger, and async `onOk` from\n * ModalDialog. Set `danger` for destructive actions. Copy via props (i18n).\n */\nexport function ConfirmModal({\n message,\n danger = false,\n okButtonProps,\n children,\n ...rest\n}: ConfirmModalProps) {\n return (\n <ModalDialog\n okButtonProps={{ danger, ...okButtonProps }}\n {...rest}\n >\n {children ?? (message ? <p>{message}</p> : null)}\n </ModalDialog>\n );\n}\n"]}
package/dist/index.d.cts CHANGED
@@ -1,8 +1,8 @@
1
1
  import * as react from 'react';
2
2
  import { PropsWithChildren, ReactNode, ForwardRefExoticComponent } from 'react';
3
3
  import { Locale } from 'antd/es/locale';
4
- import { ThemeConfig, ButtonProps as ButtonProps$1, TagProps as TagProps$1, PaginationProps as PaginationProps$1, SwitchProps, TableProps, ModalProps, SelectProps, UploadProps } from 'antd';
5
- export { Affix, AffixProps, Alert, AlertProps, Anchor, AnchorProps, AutoComplete, AutoCompleteProps, Avatar, AvatarProps, BackTop, BackTopProps, Badge, BadgeProps, Breadcrumb, BreadcrumbProps, Calendar, Card, CardProps, Carousel, CarouselProps, Cascader, CascaderProps, Checkbox, CheckboxProps, Col, ColProps, Collapse, CollapseProps, ColorPicker, ColorPickerProps, DatePicker, DatePickerProps, Descriptions, DescriptionsProps, Divider, DividerProps, Drawer, DrawerProps, Dropdown, DropdownProps, Empty, EmptyProps, Flex, FlexProps, FloatButton, FloatButtonProps, Form, FormInstance, FormItemProps, FormListFieldData, FormListOperation, FormProps, FormRule, Image, ImageProps, Input, InputNumber, InputNumberProps, Layout, LayoutProps, List, ListProps, MentionProps, Mentions, Menu, MenuProps, MessageArgsProps, Modal, ModalFuncProps, ModalProps, NotificationArgsProps, Popconfirm, PopconfirmProps, Popover, PopoverProps, Progress, ProgressProps, QRCode, QRCodeProps, Radio, RadioProps, Rate, RateProps, Result, ResultProps, Row, RowProps, Segmented, SegmentedProps, Select, SelectProps, Skeleton, SkeletonProps, Slider, SliderSingleProps, Space, SpaceProps, Spin, SpinProps, Splitter, SplitterProps, Statistic, StatisticProps, Steps, StepsProps, Switch, SwitchProps, Table, TableColumnType, TableColumnsType, TableProps, Tabs, TabsProps, TimePicker, TimePickerProps, Timeline, TimelineProps, Tooltip, TooltipProps, Tour, TourProps, Transfer, Tree, TreeSelect, TreeSelectProps, Typography, Upload, Watermark, WatermarkProps } from 'antd';
4
+ import { ThemeConfig, ButtonProps as ButtonProps$1, TagProps as TagProps$1, PaginationProps as PaginationProps$1, CardProps, Card as Card$1, SwitchProps, TableProps, ModalProps, SelectProps, UploadProps } from 'antd';
5
+ export { Affix, AffixProps, Alert, AlertProps, Anchor, AnchorProps, AutoComplete, AutoCompleteProps, Avatar, AvatarProps, BackTop, BackTopProps, Badge, BadgeProps, Breadcrumb, BreadcrumbProps, Calendar, CardProps, Carousel, CarouselProps, Cascader, CascaderProps, Checkbox, CheckboxProps, Col, ColProps, Collapse, CollapseProps, ColorPicker, ColorPickerProps, DatePicker, DatePickerProps, Descriptions, DescriptionsProps, Divider, DividerProps, Drawer, DrawerProps, Dropdown, DropdownProps, Empty, EmptyProps, Flex, FlexProps, FloatButton, FloatButtonProps, Form, FormInstance, FormItemProps, FormListFieldData, FormListOperation, FormProps, FormRule, Image, ImageProps, Input, InputNumber, InputNumberProps, Layout, LayoutProps, List, ListProps, MentionProps, Mentions, Menu, MenuProps, MessageArgsProps, Modal, ModalFuncProps, ModalProps, NotificationArgsProps, Popconfirm, PopconfirmProps, Popover, PopoverProps, Progress, ProgressProps, QRCode, QRCodeProps, Radio, RadioProps, Rate, RateProps, Result, ResultProps, Row, RowProps, Segmented, SegmentedProps, Select, SelectProps, Skeleton, SkeletonProps, Slider, SliderSingleProps, Space, SpaceProps, Spin, SpinProps, Splitter, SplitterProps, Statistic, StatisticProps, Steps, StepsProps, Switch, SwitchProps, Table, TableColumnType, TableColumnsType, TableProps, Tabs, TabsProps, TimePicker, TimePickerProps, Timeline, TimelineProps, Tooltip, TooltipProps, Tour, TourProps, Transfer, Tree, TreeSelect, TreeSelectProps, Typography, Upload, Watermark, WatermarkProps } from 'antd';
6
6
  export { TitleProps } from 'antd/es/typography/Title';
7
7
  export { TextProps } from 'antd/es/typography/Text';
8
8
  export { ParagraphProps } from 'antd/es/typography/Paragraph';
@@ -327,6 +327,12 @@ interface PaginationProps extends PaginationProps$1 {
327
327
  */
328
328
  declare function Pagination({ labels, showTotal, itemRender, locale, ...rest }: PaginationProps): react.JSX.Element;
329
329
 
330
+ type CardComponent = react.ForwardRefExoticComponent<CardProps & react.RefAttributes<HTMLDivElement>> & {
331
+ Grid: (typeof Card$1)['Grid'];
332
+ Meta: (typeof Card$1)['Meta'];
333
+ };
334
+ declare const Card: CardComponent;
335
+
330
336
  interface ThemeToggleProps extends Omit<SwitchProps, 'checked' | 'onChange'> {
331
337
  }
332
338
  /**
@@ -519,4 +525,4 @@ interface UseControllableStateOptions<T> {
519
525
  */
520
526
  declare function useControllableState<T>({ value, defaultValue, onChange, }: UseControllableStateOptions<T>): [T, (next: T) => void];
521
527
 
522
- export { AmsConfigProvider, type AmsConfigProviderProps, type BreadcrumbItem, Button, type ButtonProps, ConfirmModal, type ConfirmModalProps, DataTable, type DataTableLabels, type DataTableProps, DownloadButton, type DownloadButtonProps, FileUploadDragger, type FileUploadDraggerProps, type FilterOption, FilterSelect, type FilterSelectProps, type IconComponent, ModalDialog, type ModalDialogProps, PageHeader, type PageHeaderProps, Pagination, type PaginationLabels, type PaginationProps, Tag, type TagIntent, type TagProps, type ThemeMode, type ThemeModeContextValue, ThemeToggle, type ThemeToggleProps, type UseControllableStateOptions, amsTheme, amsThemeDark, applyThemeModeToDOM, buildTheme, getInitialThemeMode, primitives, radius, semantic, sizing, typography, useAmsMessage, useAmsNotification, useControllableState, useThemeMode };
528
+ export { AmsConfigProvider, type AmsConfigProviderProps, type BreadcrumbItem, Button, type ButtonProps, Card, ConfirmModal, type ConfirmModalProps, DataTable, type DataTableLabels, type DataTableProps, DownloadButton, type DownloadButtonProps, FileUploadDragger, type FileUploadDraggerProps, type FilterOption, FilterSelect, type FilterSelectProps, type IconComponent, ModalDialog, type ModalDialogProps, PageHeader, type PageHeaderProps, Pagination, type PaginationLabels, type PaginationProps, Tag, type TagIntent, type TagProps, type ThemeMode, type ThemeModeContextValue, ThemeToggle, type ThemeToggleProps, type UseControllableStateOptions, amsTheme, amsThemeDark, applyThemeModeToDOM, buildTheme, getInitialThemeMode, primitives, radius, semantic, sizing, typography, useAmsMessage, useAmsNotification, useControllableState, useThemeMode };
package/dist/index.d.ts CHANGED
@@ -1,8 +1,8 @@
1
1
  import * as react from 'react';
2
2
  import { PropsWithChildren, ReactNode, ForwardRefExoticComponent } from 'react';
3
3
  import { Locale } from 'antd/es/locale';
4
- import { ThemeConfig, ButtonProps as ButtonProps$1, TagProps as TagProps$1, PaginationProps as PaginationProps$1, SwitchProps, TableProps, ModalProps, SelectProps, UploadProps } from 'antd';
5
- export { Affix, AffixProps, Alert, AlertProps, Anchor, AnchorProps, AutoComplete, AutoCompleteProps, Avatar, AvatarProps, BackTop, BackTopProps, Badge, BadgeProps, Breadcrumb, BreadcrumbProps, Calendar, Card, CardProps, Carousel, CarouselProps, Cascader, CascaderProps, Checkbox, CheckboxProps, Col, ColProps, Collapse, CollapseProps, ColorPicker, ColorPickerProps, DatePicker, DatePickerProps, Descriptions, DescriptionsProps, Divider, DividerProps, Drawer, DrawerProps, Dropdown, DropdownProps, Empty, EmptyProps, Flex, FlexProps, FloatButton, FloatButtonProps, Form, FormInstance, FormItemProps, FormListFieldData, FormListOperation, FormProps, FormRule, Image, ImageProps, Input, InputNumber, InputNumberProps, Layout, LayoutProps, List, ListProps, MentionProps, Mentions, Menu, MenuProps, MessageArgsProps, Modal, ModalFuncProps, ModalProps, NotificationArgsProps, Popconfirm, PopconfirmProps, Popover, PopoverProps, Progress, ProgressProps, QRCode, QRCodeProps, Radio, RadioProps, Rate, RateProps, Result, ResultProps, Row, RowProps, Segmented, SegmentedProps, Select, SelectProps, Skeleton, SkeletonProps, Slider, SliderSingleProps, Space, SpaceProps, Spin, SpinProps, Splitter, SplitterProps, Statistic, StatisticProps, Steps, StepsProps, Switch, SwitchProps, Table, TableColumnType, TableColumnsType, TableProps, Tabs, TabsProps, TimePicker, TimePickerProps, Timeline, TimelineProps, Tooltip, TooltipProps, Tour, TourProps, Transfer, Tree, TreeSelect, TreeSelectProps, Typography, Upload, Watermark, WatermarkProps } from 'antd';
4
+ import { ThemeConfig, ButtonProps as ButtonProps$1, TagProps as TagProps$1, PaginationProps as PaginationProps$1, CardProps, Card as Card$1, SwitchProps, TableProps, ModalProps, SelectProps, UploadProps } from 'antd';
5
+ export { Affix, AffixProps, Alert, AlertProps, Anchor, AnchorProps, AutoComplete, AutoCompleteProps, Avatar, AvatarProps, BackTop, BackTopProps, Badge, BadgeProps, Breadcrumb, BreadcrumbProps, Calendar, CardProps, Carousel, CarouselProps, Cascader, CascaderProps, Checkbox, CheckboxProps, Col, ColProps, Collapse, CollapseProps, ColorPicker, ColorPickerProps, DatePicker, DatePickerProps, Descriptions, DescriptionsProps, Divider, DividerProps, Drawer, DrawerProps, Dropdown, DropdownProps, Empty, EmptyProps, Flex, FlexProps, FloatButton, FloatButtonProps, Form, FormInstance, FormItemProps, FormListFieldData, FormListOperation, FormProps, FormRule, Image, ImageProps, Input, InputNumber, InputNumberProps, Layout, LayoutProps, List, ListProps, MentionProps, Mentions, Menu, MenuProps, MessageArgsProps, Modal, ModalFuncProps, ModalProps, NotificationArgsProps, Popconfirm, PopconfirmProps, Popover, PopoverProps, Progress, ProgressProps, QRCode, QRCodeProps, Radio, RadioProps, Rate, RateProps, Result, ResultProps, Row, RowProps, Segmented, SegmentedProps, Select, SelectProps, Skeleton, SkeletonProps, Slider, SliderSingleProps, Space, SpaceProps, Spin, SpinProps, Splitter, SplitterProps, Statistic, StatisticProps, Steps, StepsProps, Switch, SwitchProps, Table, TableColumnType, TableColumnsType, TableProps, Tabs, TabsProps, TimePicker, TimePickerProps, Timeline, TimelineProps, Tooltip, TooltipProps, Tour, TourProps, Transfer, Tree, TreeSelect, TreeSelectProps, Typography, Upload, Watermark, WatermarkProps } from 'antd';
6
6
  export { TitleProps } from 'antd/es/typography/Title';
7
7
  export { TextProps } from 'antd/es/typography/Text';
8
8
  export { ParagraphProps } from 'antd/es/typography/Paragraph';
@@ -327,6 +327,12 @@ interface PaginationProps extends PaginationProps$1 {
327
327
  */
328
328
  declare function Pagination({ labels, showTotal, itemRender, locale, ...rest }: PaginationProps): react.JSX.Element;
329
329
 
330
+ type CardComponent = react.ForwardRefExoticComponent<CardProps & react.RefAttributes<HTMLDivElement>> & {
331
+ Grid: (typeof Card$1)['Grid'];
332
+ Meta: (typeof Card$1)['Meta'];
333
+ };
334
+ declare const Card: CardComponent;
335
+
330
336
  interface ThemeToggleProps extends Omit<SwitchProps, 'checked' | 'onChange'> {
331
337
  }
332
338
  /**
@@ -519,4 +525,4 @@ interface UseControllableStateOptions<T> {
519
525
  */
520
526
  declare function useControllableState<T>({ value, defaultValue, onChange, }: UseControllableStateOptions<T>): [T, (next: T) => void];
521
527
 
522
- export { AmsConfigProvider, type AmsConfigProviderProps, type BreadcrumbItem, Button, type ButtonProps, ConfirmModal, type ConfirmModalProps, DataTable, type DataTableLabels, type DataTableProps, DownloadButton, type DownloadButtonProps, FileUploadDragger, type FileUploadDraggerProps, type FilterOption, FilterSelect, type FilterSelectProps, type IconComponent, ModalDialog, type ModalDialogProps, PageHeader, type PageHeaderProps, Pagination, type PaginationLabels, type PaginationProps, Tag, type TagIntent, type TagProps, type ThemeMode, type ThemeModeContextValue, ThemeToggle, type ThemeToggleProps, type UseControllableStateOptions, amsTheme, amsThemeDark, applyThemeModeToDOM, buildTheme, getInitialThemeMode, primitives, radius, semantic, sizing, typography, useAmsMessage, useAmsNotification, useControllableState, useThemeMode };
528
+ export { AmsConfigProvider, type AmsConfigProviderProps, type BreadcrumbItem, Button, type ButtonProps, Card, ConfirmModal, type ConfirmModalProps, DataTable, type DataTableLabels, type DataTableProps, DownloadButton, type DownloadButtonProps, FileUploadDragger, type FileUploadDraggerProps, type FilterOption, FilterSelect, type FilterSelectProps, type IconComponent, ModalDialog, type ModalDialogProps, PageHeader, type PageHeaderProps, Pagination, type PaginationLabels, type PaginationProps, Tag, type TagIntent, type TagProps, type ThemeMode, type ThemeModeContextValue, ThemeToggle, type ThemeToggleProps, type UseControllableStateOptions, amsTheme, amsThemeDark, applyThemeModeToDOM, buildTheme, getInitialThemeMode, primitives, radius, semantic, sizing, typography, useAmsMessage, useAmsNotification, useControllableState, useThemeMode };
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
- import { Button as Button$1, Tag as Tag$1, theme, ConfigProvider, App, Pagination as Pagination$1, Switch, Skeleton, Table, Modal, Select, Upload, Breadcrumb } from 'antd';
2
- export { Affix, Alert, Anchor, AutoComplete, Avatar, BackTop, Badge, Breadcrumb, Calendar, Card, Carousel, Cascader, Checkbox, Col, Collapse, ColorPicker, DatePicker, Descriptions, Divider, Drawer, Dropdown, Empty, Flex, FloatButton, Form, Image, Input, InputNumber, Layout, List, Mentions, Menu, Modal, Popconfirm, Popover, Progress, QRCode, Radio, Rate, Result, Row, Segmented, Select, Skeleton, Slider, Space, Spin, Splitter, Statistic, Steps, Switch, Table, Tabs, TimePicker, Timeline, Tooltip, Tour, Transfer, Tree, TreeSelect, Typography, Upload, Watermark } from 'antd';
1
+ import { Button as Button$1, Tag as Tag$1, theme, Card as Card$1, ConfigProvider, App, Pagination as Pagination$1, Switch, Skeleton, Table, Modal, Select, Upload, Breadcrumb } from 'antd';
2
+ export { Affix, Alert, Anchor, AutoComplete, Avatar, BackTop, Badge, Breadcrumb, Calendar, Carousel, Cascader, Checkbox, Col, Collapse, ColorPicker, DatePicker, Descriptions, Divider, Drawer, Dropdown, Empty, Flex, FloatButton, Form, Image, Input, InputNumber, Layout, List, Mentions, Menu, Modal, Popconfirm, Popover, Progress, QRCode, Radio, Rate, Result, Row, Segmented, Select, Skeleton, Slider, Space, Spin, Splitter, Statistic, Steps, Switch, Table, Tabs, TimePicker, Timeline, Tooltip, Tour, Transfer, Tree, TreeSelect, Typography, Upload, Watermark } from 'antd';
3
3
  import { createContext, forwardRef, useContext, useState, useCallback, useMemo, isValidElement, cloneElement, useEffect } from 'react';
4
4
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
5
5
  import { DownloadOutlined, BulbOutlined, BulbFilled, InboxOutlined } from '@ant-design/icons';
@@ -365,6 +365,7 @@ function Pagination({
365
365
  }
366
366
  );
367
367
  }
368
+ var Card = Card$1;
368
369
  function ThemeToggle(props) {
369
370
  const { isDark, toggle } = useThemeMode();
370
371
  return /* @__PURE__ */ jsx(
@@ -725,6 +726,6 @@ function ConfirmModal({
725
726
  );
726
727
  }
727
728
 
728
- export { AmsConfigProvider, Button, ConfirmModal, DataTable, DownloadButton, FileUploadDragger, FilterSelect, ModalDialog, PageHeader, Pagination, Tag, ThemeToggle, amsTheme, amsThemeDark, applyThemeModeToDOM, buildTheme, getInitialThemeMode, primitives, radius, semantic, sizing, typography, useAmsMessage, useAmsNotification, useControllableState, useThemeMode };
729
+ export { AmsConfigProvider, Button, Card, ConfirmModal, DataTable, DownloadButton, FileUploadDragger, FilterSelect, ModalDialog, PageHeader, Pagination, Tag, ThemeToggle, amsTheme, amsThemeDark, applyThemeModeToDOM, buildTheme, getInitialThemeMode, primitives, radius, semantic, sizing, typography, useAmsMessage, useAmsNotification, useControllableState, useThemeMode };
729
730
  //# sourceMappingURL=index.js.map
730
731
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/theme/tokens.ts","../src/theme/theme.ts","../src/theme/useThemeMode.ts","../src/theme/AmsConfigProvider.tsx","../src/components/Button/Button.tsx","../src/components/Tag/Tag.tsx","../src/components/message/useAmsMessage.ts","../src/components/notification/useAmsNotification.ts","../src/components/Pagination/Pagination.tsx","../src/components/ThemeToggle/ThemeToggle.tsx","../src/components/DataTable/DataTable.tsx","../src/hooks/useControllableState.ts","../src/components/ModalDialog/ModalDialog.tsx","../src/components/FilterSelect/FilterSelect.tsx","../src/components/FileUploadDragger/FileUploadDragger.tsx","../src/components/PageHeader/PageHeader.tsx","../src/components/DownloadButton/DownloadButton.tsx","../src/components/ConfirmModal/ConfirmModal.tsx"],"names":["antdTheme","Button","jsx","AntButton","forwardRef","Tag","AntTag","App","AntPagination","Switch","Skeleton","Table","useState","useCallback","useMemo","jsxs","Modal","Select","Upload","Fragment","Breadcrumb","DownloadButton","DownloadOutlined"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Design tokens — the single source of truth for the AMS Design System.\n *\n * Values are taken from the B2BMX Metronic theme:\n * b2bmx-web-metronic/src/_metronic/assets/sass/components/_variables.custom.scss\n * b2bmx-web-metronic/tailwind.config.js\n *\n * Two tiers:\n * - `primitives`: raw values, no semantic meaning.\n * - `semantic`: role aliases consumed by the antd theme (and Tailwind).\n */\n\n/** Raw Metronic brand values. */\nexport const primitives = {\n brandRed: '#A72432',\n brandRedActive: '#8B1D28', // darken 10%\n brandRedLight: '#f1faff',\n\n green: '#50cd89',\n greenActive: '#47be7d',\n greenLight: '#e8fff3',\n\n purple: '#7239ea',\n purpleActive: '#5014d0',\n purpleLight: '#f8f5ff',\n\n pink: '#f1416c',\n pinkActive: '#d9214e',\n pinkLight: '#fff5f8',\n\n yellow: '#ffc700',\n yellowActive: '#f1bc00',\n yellowLight: '#fff8dd',\n\n white: '#ffffff',\n\n gray: {\n 100: '#f9f9f9',\n 200: '#f4f4f4',\n 300: '#e1e3ea',\n 400: '#b5b5c3',\n 500: '#a1a5b7',\n 600: '#7e8299',\n 700: '#5e6278',\n 800: '#3f4254',\n 900: '#181c32',\n },\n\n background: {\n app: '#f5f8fa',\n body: '#ffffff',\n appDark: '#151521',\n bodyDark: '#1e1e2d',\n },\n\n dark: {\n base: '#181c32',\n bg: '#151521',\n header: '#1e1e2d',\n active: '#2a2a3c',\n separator: '#393945',\n // Dark-mode surfaces (from mf-container's antdTheme).\n inputBg: '#1b1b29',\n cardBg: '#1e1e2d',\n // Dark-mode gray scale — DISTINCT from the light `gray` scale (Metronic).\n gray: {\n 100: '#2b2b40',\n 200: '#323248',\n 300: '#3b3b64',\n 400: '#474761',\n 500: '#565674',\n 600: '#6d6d80',\n 700: '#92929f',\n 800: '#cdcdde',\n },\n },\n} as const;\n\n/** Radius scale (Metronic). Base radius is 4px. */\nexport const radius = {\n sm: 2,\n base: 4,\n md: 6,\n lg: 8,\n xl: 12,\n} as const;\n\n/** Typography (Metronic uses Inter with a compact 13px base). */\nexport const typography = {\n fontFamily: 'Inter, Helvetica, Arial, sans-serif',\n fontSizeBase: 13,\n weight: {\n light: 300,\n normal: 400,\n medium: 500,\n semibold: 600,\n bold: 700,\n },\n} as const;\n\n/** Control sizing (Metronic). */\nexport const sizing = {\n controlHeight: 32,\n buttonMinWidth: 110,\n} as const;\n\n/**\n * Semantic tokens — role aliases. These feed the antd `ThemeConfig`.\n * Components must consume semantic tokens, never primitives directly.\n */\nexport const semantic = {\n colorPrimary: primitives.brandRed,\n colorPrimaryActive: primitives.brandRedActive,\n colorSuccess: primitives.green,\n colorInfo: primitives.purple,\n colorError: primitives.pink,\n colorWarning: primitives.yellow,\n\n // Links. Metronic inherits link color from the (red) primary, which reads as\n // \"danger\" in dense UIs. The AMS default uses a neutral dark gray so links\n // don't look like errors; consumers can override `colorLink`/`colorLinkHover`\n // via AmsConfigProvider's `theme` prop (e.g. back to the brand red or blue).\n colorLink: primitives.gray[800],\n colorLinkHover: primitives.brandRed,\n colorLinkActive: primitives.brandRedActive,\n\n colorBgLayout: primitives.background.app,\n colorBgContainer: primitives.background.body,\n\n borderRadius: radius.base,\n fontFamily: typography.fontFamily,\n fontSize: typography.fontSizeBase,\n controlHeight: sizing.controlHeight,\n} as const;\n\nexport type ThemeMode = 'light' | 'dark';\n","import { theme as antdTheme } from 'antd';\nimport type { ThemeConfig } from 'antd';\nimport { primitives, semantic, type ThemeMode } from './tokens';\n\n/**\n * Tokens shared by light and dark modes (brand, links, radius, typography).\n * Backgrounds, text, and borders are mode-specific (see below).\n */\nconst sharedToken: ThemeConfig['token'] = {\n colorPrimary: semantic.colorPrimary,\n colorSuccess: semantic.colorSuccess,\n colorInfo: semantic.colorInfo,\n colorError: semantic.colorError,\n colorWarning: semantic.colorWarning,\n colorLink: semantic.colorLink,\n colorLinkHover: semantic.colorLinkHover,\n colorLinkActive: semantic.colorLinkActive,\n borderRadius: semantic.borderRadius,\n fontFamily: semantic.fontFamily,\n fontSize: semantic.fontSize,\n controlHeight: semantic.controlHeight,\n};\n\n/** Light-mode tokens. */\nconst lightToken: ThemeConfig['token'] = {\n ...sharedToken,\n colorBgLayout: semantic.colorBgLayout,\n colorBgContainer: semantic.colorBgContainer,\n colorBgElevated: primitives.background.body,\n colorText: primitives.gray[900],\n colorTextSecondary: primitives.gray[700],\n colorTextTertiary: primitives.gray[500],\n colorTextQuaternary: primitives.gray[400],\n colorBorder: primitives.gray[300],\n colorBorderSecondary: primitives.gray[200],\n};\n\n/**\n * Dark-mode tokens. Backgrounds/text/borders come from the Metronic dark\n * palette (mirrors mf-container's darkTheme). Brand colors stay identical.\n */\nconst darkToken: ThemeConfig['token'] = {\n ...sharedToken,\n colorBgLayout: primitives.background.appDark,\n colorBgContainer: primitives.background.bodyDark,\n colorBgElevated: primitives.background.bodyDark,\n colorText: '#ffffff',\n colorTextHeading: '#ffffff',\n colorTextSecondary: primitives.dark.gray[800],\n colorTextTertiary: primitives.dark.gray[700],\n colorTextQuaternary: primitives.dark.gray[600],\n colorBorder: primitives.dark.gray[300],\n colorBorderSecondary: primitives.dark.gray[200],\n boxShadow:\n '0 6px 16px 0 rgba(0, 0, 0, 0.48), 0 3px 6px -4px rgba(0, 0, 0, 0.36), 0 9px 28px 8px rgba(0, 0, 0, 0.15)',\n};\n\n/** Per-component overrides shared by both modes. */\nconst sharedComponents: ThemeConfig['components'] = {\n Button: { controlHeight: 32 },\n Tabs: {\n itemColor: primitives.gray[600],\n itemSelectedColor: semantic.colorPrimary,\n itemHoverColor: semantic.colorPrimary,\n },\n};\n\n/** Light per-component overrides. */\nconst lightComponents: ThemeConfig['components'] = {\n ...sharedComponents,\n Table: {\n headerBg: primitives.gray[100],\n headerColor: primitives.gray[800],\n borderColor: primitives.gray[300],\n cellPaddingBlock: 8,\n cellPaddingInline: 8,\n },\n};\n\n/** Dark per-component overrides (mirrors mf-container's dark component theme). */\nconst darkComponents: ThemeConfig['components'] = {\n ...sharedComponents,\n Table: {\n headerBg: primitives.dark.gray[200],\n headerColor: primitives.dark.gray[800],\n borderColor: primitives.dark.gray[400],\n rowHoverBg: primitives.dark.gray[200],\n cellPaddingBlock: 8,\n cellPaddingInline: 8,\n },\n Input: {\n colorBgContainer: primitives.dark.inputBg,\n colorBorder: primitives.dark.gray[400],\n colorText: '#ffffff',\n },\n Select: {\n colorBgContainer: primitives.dark.inputBg,\n colorBorder: primitives.dark.gray[400],\n colorText: '#ffffff',\n },\n DatePicker: {\n colorBgContainer: primitives.dark.inputBg,\n },\n Card: {\n colorBgContainer: primitives.dark.cardBg,\n colorBorderSecondary: primitives.dark.cardBg,\n },\n Modal: {\n contentBg: primitives.dark.gray[100],\n headerBg: primitives.dark.gray[100],\n },\n Drawer: {\n colorBgElevated: primitives.dark.gray[100],\n },\n Notification: {\n colorBgElevated: primitives.dark.gray[100],\n },\n Message: {\n contentBg: primitives.dark.gray[100],\n },\n Menu: {\n itemBg: primitives.background.bodyDark,\n itemHoverBg: primitives.dark.gray[100],\n itemSelectedBg: primitives.dark.active,\n itemSelectedColor: semantic.colorPrimary,\n itemActiveBg: primitives.dark.active,\n subMenuItemBg: primitives.background.bodyDark,\n },\n Dropdown: {\n colorBgElevated: primitives.background.bodyDark,\n controlItemBgHover: primitives.dark.gray[100],\n },\n};\n\n/**\n * Builds the antd theme for a given mode. Dark mode uses antd's\n * `darkAlgorithm`; brand tokens stay identical so the brand is consistent.\n */\nexport function buildTheme(mode: ThemeMode = 'light'): ThemeConfig {\n const isDark = mode === 'dark';\n return {\n algorithm: isDark ? antdTheme.darkAlgorithm : antdTheme.defaultAlgorithm,\n token: isDark ? darkToken : lightToken,\n components: isDark ? darkComponents : lightComponents,\n };\n}\n\n/** Default (light) AMS theme. */\nexport const amsTheme: ThemeConfig = buildTheme('light');\n\n/** Dark AMS theme. */\nexport const amsThemeDark: ThemeConfig = buildTheme('dark');\n","import {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from 'react';\nimport type { ThemeMode } from './tokens';\n\nconst STORAGE_KEY = 'ams-theme';\n\n/** Reads the initial mode: saved preference → OS preference → light. */\nexport function getInitialThemeMode(defaultMode: ThemeMode = 'light'): ThemeMode {\n if (typeof window === 'undefined') return defaultMode;\n const saved = window.localStorage.getItem(STORAGE_KEY);\n if (saved === 'light' || saved === 'dark') return saved;\n if (window.matchMedia?.('(prefers-color-scheme: dark)').matches) return 'dark';\n return defaultMode;\n}\n\n/** Reflects the mode on the DOM so CSS can react (mirrors mf-container). */\nexport function applyThemeModeToDOM(mode: ThemeMode): void {\n if (typeof document === 'undefined') return;\n document.documentElement.setAttribute('data-theme', mode);\n document.body?.setAttribute('data-theme', mode);\n}\n\nexport interface ThemeModeContextValue {\n mode: ThemeMode;\n setMode: (mode: ThemeMode) => void;\n toggle: () => void;\n isDark: boolean;\n}\n\nexport const ThemeModeContext = createContext<ThemeModeContextValue | null>(null);\n\n/**\n * Access the current color mode and switch it. Requires an ancestor\n * `AmsConfigProvider`. Use it to build a light/dark toggle:\n *\n * const { isDark, toggle } = useThemeMode();\n * <Switch checked={isDark} onChange={toggle} />\n */\nexport function useThemeMode(): ThemeModeContextValue {\n const ctx = useContext(ThemeModeContext);\n if (!ctx) {\n throw new Error('useThemeMode must be used within an AmsConfigProvider');\n }\n return ctx;\n}\n\n/**\n * Internal state manager for the color mode. When `controlledMode` is provided,\n * the provider is controlled (no persistence). Otherwise the mode is managed\n * here: persisted to localStorage and reflected on the DOM via `data-theme`.\n */\nexport function useThemeModeState(\n controlledMode: ThemeMode | undefined,\n defaultMode: ThemeMode,\n persist: boolean,\n): ThemeModeContextValue {\n const isControlled = controlledMode !== undefined;\n const [internalMode, setInternalMode] = useState<ThemeMode>(() =>\n isControlled ? controlledMode : persist ? getInitialThemeMode(defaultMode) : defaultMode,\n );\n\n const mode = isControlled ? controlledMode : internalMode;\n\n useEffect(() => {\n applyThemeModeToDOM(mode);\n }, [mode]);\n\n const setMode = useCallback(\n (next: ThemeMode) => {\n if (!isControlled) {\n setInternalMode(next);\n if (persist && typeof window !== 'undefined') {\n window.localStorage.setItem(STORAGE_KEY, next);\n }\n }\n },\n [isControlled, persist],\n );\n\n const toggle = useCallback(() => {\n setMode(mode === 'light' ? 'dark' : 'light');\n }, [mode, setMode]);\n\n return useMemo(\n () => ({ mode, setMode, toggle, isDark: mode === 'dark' }),\n [mode, setMode, toggle],\n );\n}\n","import { App, ConfigProvider } from 'antd';\nimport type { Locale } from 'antd/es/locale';\nimport type { ThemeConfig } from 'antd';\nimport type { PropsWithChildren, ReactNode } from 'react';\nimport { buildTheme } from './theme';\nimport type { ThemeMode } from './tokens';\nimport { ThemeModeContext, useThemeModeState } from './useThemeMode';\n\nexport interface AmsConfigProviderProps {\n /**\n * Controlled color mode. When provided, the provider does not manage or\n * persist the mode. Omit it to let the provider manage the mode itself\n * (persisted to localStorage, respects OS preference) — read/toggle it with\n * the `useThemeMode` hook.\n */\n mode?: ThemeMode;\n /** Initial mode when self-managed (uncontrolled). Defaults to `light`. */\n defaultMode?: ThemeMode;\n /** Persist the self-managed mode to localStorage. Defaults to `true`. */\n persistMode?: boolean;\n /**\n * antd locale (e.g. `esES`, `enUS`). The consuming app passes it;\n * the design system stays i18n-agnostic and ships no message catalog.\n */\n locale?: Locale;\n /**\n * Theme overrides merged on top of the AMS theme. Use it to customize tokens\n * per project without forking the DS, e.g. `{ token: { colorLink: '#1677ff' } }`.\n */\n theme?: ThemeConfig;\n children?: ReactNode;\n}\n\nfunction mergeTheme(base: ThemeConfig, override?: ThemeConfig): ThemeConfig {\n if (!override) return base;\n return {\n ...base,\n ...override,\n token: { ...base.token, ...override.token },\n components: { ...base.components, ...override.components },\n // A caller-provided algorithm wins; otherwise keep the mode's algorithm.\n algorithm: override.algorithm ?? base.algorithm,\n };\n}\n\n/**\n * Root provider for the AMS Design System.\n *\n * - Applies the AMS theme (light/dark) via antd's `ConfigProvider`.\n * - Renders antd's `App` for context-safe `message`/`notification`/`Modal`.\n * - Manages the color mode (controlled via `mode`, or self-managed with\n * localStorage persistence and OS-preference detection) and exposes it\n * through the `useThemeMode` hook.\n * - Accepts a `theme` override merged on top of the AMS theme.\n *\n * Render it once at the app root.\n */\nexport function AmsConfigProvider({\n mode,\n defaultMode = 'light',\n persistMode = true,\n locale,\n theme,\n children,\n}: PropsWithChildren<AmsConfigProviderProps>) {\n const themeMode = useThemeModeState(mode, defaultMode, persistMode);\n const resolvedTheme = mergeTheme(buildTheme(themeMode.mode), theme);\n\n return (\n <ThemeModeContext.Provider value={themeMode}>\n <ConfigProvider theme={resolvedTheme} locale={locale}>\n <App>{children}</App>\n </ConfigProvider>\n </ThemeModeContext.Provider>\n );\n}\n","import { Button as AntButton } from 'antd';\nimport type { ButtonProps as AntButtonProps } from 'antd';\nimport { forwardRef } from 'react';\n\nexport interface ButtonProps extends AntButtonProps {}\n\n/**\n * AMS Button — thin wrapper over antd `Button` that inherits the AMS theme.\n * Exposes the full antd Button API (type, danger, loading, icon, size, etc.)\n * and forwards the ref so it integrates with Form and tooltips.\n */\nexport const Button = forwardRef<HTMLButtonElement | HTMLAnchorElement, ButtonProps>(\n function Button(props, ref) {\n return <AntButton ref={ref} {...props} />;\n },\n);\n","import { Tag as AntTag } from 'antd';\nimport type { TagProps as AntTagProps } from 'antd';\nimport { forwardRef } from 'react';\nimport { semantic } from '../../theme/tokens';\n\n/** AMS semantic tag intents mapped to brand tokens. */\nexport type TagIntent = 'success' | 'error' | 'warning' | 'info' | 'primary';\n\nexport interface TagProps extends AntTagProps {\n /**\n * Semantic intent that resolves to an AMS brand color. Takes precedence over\n * antd's `color` when set. Formalizes the inline `#50cd89` / `#f1416c` colors\n * previously hardcoded in mf-boveda's DataTable.\n */\n intent?: TagIntent;\n}\n\nconst INTENT_COLOR: Record<TagIntent, string> = {\n success: semantic.colorSuccess,\n error: semantic.colorError,\n warning: semantic.colorWarning,\n info: semantic.colorInfo,\n primary: semantic.colorPrimary,\n};\n\n/**\n * AMS Tag — thin wrapper over antd `Tag` with an optional semantic `intent`\n * that maps to the brand palette. Falls back to the full antd Tag API.\n */\nexport const Tag = forwardRef<HTMLSpanElement, TagProps>(function Tag(\n { intent, color, ...rest },\n ref,\n) {\n const resolvedColor = intent ? INTENT_COLOR[intent] : color;\n return <AntTag ref={ref} color={resolvedColor} {...rest} />;\n});\n","import { App } from 'antd';\nimport type { MessageInstance } from 'antd/es/message/interface';\n\n/**\n * Context-safe access to antd's `message` API.\n *\n * In antd v5 the static `message.success(...)` calls do **not** read the\n * `ConfigProvider` theme and log a warning. The supported approach is to\n * consume the instance provided by antd's `App` context — which\n * `AmsConfigProvider` already renders at the root.\n *\n * Usage:\n * const message = useAmsMessage();\n * message.success('Saved');\n *\n * Requires an ancestor `AmsConfigProvider` (or antd `App`).\n */\nexport function useAmsMessage(): MessageInstance {\n return App.useApp().message;\n}\n","import { App } from 'antd';\nimport type { NotificationInstance } from 'antd/es/notification/interface';\n\n/**\n * Context-safe access to antd's `notification` API.\n *\n * Like `useAmsMessage`, this returns the instance from antd's `App` context so\n * notifications inherit the AMS theme and avoid the v5 static-method warning.\n * Requires an ancestor `AmsConfigProvider` (or antd `App`).\n *\n * Usage:\n * const notification = useAmsNotification();\n * notification.success({ message: 'Done', description: 'Saved.' });\n */\nexport function useAmsNotification(): NotificationInstance {\n return App.useApp().notification;\n}\n","import { Pagination as AntPagination } from 'antd';\nimport type { PaginationProps as AntPaginationProps } from 'antd';\nimport type { PaginationLocale } from 'antd/es/pagination/Pagination';\nimport type { ReactNode } from 'react';\n\n/**\n * Translatable text labels for the pagination control. The design system is\n * i18n-agnostic: the consuming app passes already-translated strings. Anything\n * omitted falls back to antd's `locale` (or English defaults).\n */\nexport interface PaginationLabels {\n /** Suffix in the page-size selector, e.g. \"/ página\". */\n itemsPerPage?: string;\n /** \"Ir a\" label of the quick jumper. */\n jumpTo?: string;\n /** Confirm button text of the quick jumper. */\n jumpToConfirm?: string;\n /** Accessible label for a page, e.g. \"Página\". */\n page?: string;\n /** Accessible label for the previous-page button. */\n prevPage?: string;\n /** Accessible label for the next-page button. */\n nextPage?: string;\n /** Label for the page-size selector, e.g. \"Tamaño de página\". */\n pageSize?: string;\n /**\n * Builds the total-records text (rendered before the pages).\n * Receives the total and the current [from, to] range.\n * e.g. (total) => `Total ${total} registros`. Takes precedence over `totalText`.\n */\n total?: (total: number, range: [number, number]) => ReactNode;\n /**\n * Declarative total text as separate translated words, matching how the\n * mf-boveda table builds it: `{prefix} {total} {suffix}` → \"Total 250 registros\".\n * Set `showRange` to render \"{prefix} {from}-{to} {suffix}\" instead.\n * Ignored when `total` (the function form) is provided.\n */\n totalText?: {\n /** Word(s) before the number, e.g. \"Total\". */\n prefix?: string;\n /** Word(s) after the number, e.g. \"registros\". */\n suffix?: string;\n /** Use the \"from-to\" range instead of just the total. Default false. */\n showRange?: boolean;\n };\n /** Visible text for the \"previous\" button (overrides the arrow). */\n previousText?: ReactNode;\n /** Visible text for the \"next\" button (overrides the arrow). */\n nextText?: ReactNode;\n}\n\nexport interface PaginationProps extends AntPaginationProps {\n /** Translatable text labels. */\n labels?: PaginationLabels;\n}\n\nfunction buildLocale(labels?: PaginationLabels): PaginationLocale | undefined {\n if (!labels) return undefined;\n const locale: PaginationLocale = {};\n if (labels.itemsPerPage !== undefined) locale.items_per_page = labels.itemsPerPage;\n if (labels.jumpTo !== undefined) locale.jump_to = labels.jumpTo;\n if (labels.jumpToConfirm !== undefined) locale.jump_to_confirm = labels.jumpToConfirm;\n if (labels.page !== undefined) locale.page = labels.page;\n if (labels.prevPage !== undefined) locale.prev_page = labels.prevPage;\n if (labels.nextPage !== undefined) locale.next_page = labels.nextPage;\n if (labels.pageSize !== undefined) locale.page_size = labels.pageSize;\n return Object.keys(locale).length > 0 ? locale : undefined;\n}\n\n/**\n * AMS Pagination — antd `Pagination` with translatable text via a single\n * `labels` prop (page, records/total, previous/next, items-per-page, jumper).\n * The rest of the antd Pagination API passes through. `showTotal` and\n * `itemRender` still work if you prefer to set them directly; explicit\n * `showTotal`/`itemRender`/`locale` props win over `labels`.\n */\nexport function Pagination({\n labels,\n showTotal,\n itemRender,\n locale,\n ...rest\n}: PaginationProps) {\n const mergedLocale = { ...buildLocale(labels), ...locale };\n\n const resolvedShowTotal: AntPaginationProps['showTotal'] =\n showTotal ??\n (labels?.total\n ? (total, range) => labels.total!(total, range)\n : labels?.totalText\n ? (total, range) => {\n const { prefix, suffix, showRange } = labels.totalText!;\n const middle = showRange ? `${range[0]}-${range[1]}` : String(total);\n return [prefix, middle, suffix].filter(Boolean).join(' ');\n }\n : undefined);\n\n const resolvedItemRender: AntPaginationProps['itemRender'] =\n itemRender ??\n (labels?.previousText || labels?.nextText\n ? (_page, type, element) => {\n if (type === 'prev' && labels?.previousText !== undefined) return labels.previousText;\n if (type === 'next' && labels?.nextText !== undefined) return labels.nextText;\n return element;\n }\n : undefined);\n\n return (\n <AntPagination\n {...rest}\n locale={Object.keys(mergedLocale).length > 0 ? mergedLocale : undefined}\n showTotal={resolvedShowTotal}\n itemRender={resolvedItemRender}\n />\n );\n}\n","import { Switch } from 'antd';\nimport type { SwitchProps } from 'antd';\nimport { BulbOutlined, BulbFilled } from '@ant-design/icons';\nimport { useThemeMode } from '../../theme/useThemeMode';\n\nexport interface ThemeToggleProps extends Omit<SwitchProps, 'checked' | 'onChange'> {}\n\n/**\n * AMS ThemeToggle — a ready-made light/dark switch wired to `useThemeMode`.\n * Requires an ancestor `AmsConfigProvider` that manages the mode\n * (i.e. rendered without a controlled `mode` prop).\n */\nexport function ThemeToggle(props: ThemeToggleProps) {\n const { isDark, toggle } = useThemeMode();\n return (\n <Switch\n checked={isDark}\n onChange={toggle}\n checkedChildren={<BulbFilled />}\n unCheckedChildren={<BulbOutlined />}\n {...props}\n />\n );\n}\n","import { Skeleton, Table } from 'antd';\nimport type { TableProps, TablePaginationConfig } from 'antd';\nimport type { PaginationLocale } from 'antd/es/pagination/Pagination';\nimport type { ReactNode } from 'react';\nimport { Tag } from '../Tag';\nimport type { PaginationLabels } from '../Pagination';\n\n/**\n * Labels for the DataTable. The design system is i18n-agnostic: the consuming\n * microfrontend passes translated strings from its own catalog. Sensible\n * English defaults are provided so the table renders without wiring.\n */\nexport interface DataTableLabels {\n emptyText?: string;\n sortAsc?: string;\n sortDesc?: string;\n cancelSort?: string;\n}\n\nfunction buildPaginationLocale(labels?: PaginationLabels): PaginationLocale | undefined {\n if (!labels) return undefined;\n const locale: PaginationLocale = {};\n if (labels.itemsPerPage !== undefined) locale.items_per_page = labels.itemsPerPage;\n if (labels.jumpTo !== undefined) locale.jump_to = labels.jumpTo;\n if (labels.jumpToConfirm !== undefined) locale.jump_to_confirm = labels.jumpToConfirm;\n if (labels.page !== undefined) locale.page = labels.page;\n if (labels.prevPage !== undefined) locale.prev_page = labels.prevPage;\n if (labels.nextPage !== undefined) locale.next_page = labels.nextPage;\n if (labels.pageSize !== undefined) locale.page_size = labels.pageSize;\n return Object.keys(locale).length > 0 ? locale : undefined;\n}\n\nconst DEFAULT_LABELS: Required<DataTableLabels> = {\n emptyText: 'No data',\n sortAsc: 'Sort ascending',\n sortDesc: 'Sort descending',\n cancelSort: 'Cancel sort',\n};\n\nexport interface DataTableProps<T extends object = Record<string, unknown>>\n extends Omit<TableProps<T>, 'title' | 'loading'> {\n /** Optional plain-text heading rendered above the table. */\n heading?: string;\n /** Extra content (buttons, filters) rendered above the table. */\n extra?: React.ReactNode;\n /** External loading state. Renders a skeleton placeholder while true. */\n loading?: boolean;\n /** Translated labels; falls back to English defaults. */\n labels?: DataTableLabels;\n /**\n * Translatable pagination text (total/records, previous/next, page-size,\n * jumper). Applied to the table's pagination — matches the mf-boveda pattern\n * of a \"{prefix} {total} {suffix}\" total and translated prev/next buttons.\n * Merged into `pagination`; anything set directly on `pagination`\n * (`showTotal`/`itemRender`/`locale`) wins.\n */\n paginationLabels?: PaginationLabels;\n /**\n * Opt-in: render numeric values in the first column as colored tags\n * (green when >= 0, red when < 0). Off by default — this replaces the\n * implicit column-0 behavior of the original mf-boveda DataTable, which\n * was surprising. Explicitly enable it per table when desired.\n */\n firstColumnNumericTag?: boolean;\n}\n\nfunction toNumericValue(value: unknown): number | null {\n if (value === null || value === undefined || value === '') return null;\n const num =\n typeof value === 'string' ? parseFloat(value.replace(/,/g, '')) : Number(value);\n return Number.isNaN(num) || !Number.isFinite(num) ? null : num;\n}\n\n/**\n * AMS DataTable — themed, opinionated wrapper over antd `Table`.\n *\n * Ports the reusable behavior from mf-boveda's DataTable:\n * - loading skeleton placeholder,\n * - `bordered` and horizontal `scroll: { x: 'max-content' }` defaults,\n * - i18n-agnostic labels via props,\n * - optional (opt-in) numeric tags on the first column.\n *\n * All other antd Table props pass through.\n */\nfunction buildTotalText(labels?: PaginationLabels): TablePaginationConfig['showTotal'] | undefined {\n if (!labels) return undefined;\n if (labels.total) return (total, range) => labels.total!(total, range);\n if (labels.totalText) {\n return (total, range) => {\n const { prefix, suffix, showRange } = labels.totalText!;\n const middle = showRange ? `${range[0]}-${range[1]}` : String(total);\n return [prefix, middle, suffix].filter(Boolean).join(' ');\n };\n }\n return undefined;\n}\n\nfunction buildItemRender(labels?: PaginationLabels): TablePaginationConfig['itemRender'] | undefined {\n if (!labels || (labels.previousText === undefined && labels.nextText === undefined)) {\n return undefined;\n }\n return (_page, type, element) => {\n if (type === 'prev' && labels.previousText !== undefined) return labels.previousText;\n if (type === 'next' && labels.nextText !== undefined) return labels.nextText;\n return element as ReactNode;\n };\n}\n\nexport function DataTable<T extends object = Record<string, unknown>>({\n heading,\n extra,\n loading = false,\n labels,\n paginationLabels,\n firstColumnNumericTag = false,\n columns,\n dataSource,\n scroll,\n bordered = true,\n pagination,\n className,\n ...rest\n}: DataTableProps<T>) {\n const mergedLabels = { ...DEFAULT_LABELS, ...labels };\n\n // Merge translatable pagination labels into the pagination config.\n // Explicit values on `pagination` win over the label-derived ones.\n const resolvedPagination =\n pagination === false || pagination === undefined\n ? pagination\n : (() => {\n const paginationLocale = buildPaginationLocale(paginationLabels);\n const totalFn = buildTotalText(paginationLabels);\n const itemRenderFn = buildItemRender(paginationLabels);\n return {\n ...(totalFn ? { showTotal: totalFn } : {}),\n ...(itemRenderFn ? { itemRender: itemRenderFn } : {}),\n ...(paginationLocale ? { locale: paginationLocale } : {}),\n ...pagination,\n };\n })();\n\n const resolvedColumns =\n firstColumnNumericTag && columns && columns.length > 0\n ? columns.map((col, index) => {\n if (index !== 0) return col;\n const originalRender = (\n col as { render?: (value: unknown, record: T, i: number) => React.ReactNode }\n ).render;\n return {\n ...col,\n render: (value: unknown, record: T, i: number) => {\n const content = originalRender\n ? originalRender(value, record, i)\n : (value as React.ReactNode);\n const numeric = toNumericValue(value);\n if (numeric === null) return content;\n return (\n <Tag\n intent={numeric < 0 ? 'error' : 'success'}\n style={{ minWidth: 72, textAlign: 'center' }}\n >\n {content}\n </Tag>\n );\n },\n };\n })\n : columns;\n\n const resolvedScroll = scroll ?? { x: 'max-content' };\n\n return (\n <div className={className}>\n {heading ? (\n <div style={{ marginBottom: 8 }}>\n <h3 style={{ margin: 0, fontWeight: 600 }}>{heading}</h3>\n </div>\n ) : null}\n {extra ? <div style={{ marginBottom: 8 }}>{extra}</div> : null}\n {loading ? (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 16 }}>\n {Array.from({ length: 6 }).map((_, i) => (\n <Skeleton key={i} active paragraph={{ rows: 0 }} title={{ width: '100%' }} />\n ))}\n </div>\n ) : (\n <Table<T>\n columns={resolvedColumns}\n dataSource={dataSource}\n bordered={bordered}\n scroll={resolvedScroll}\n pagination={resolvedPagination}\n locale={{\n emptyText: mergedLabels.emptyText,\n triggerAsc: mergedLabels.sortAsc,\n triggerDesc: mergedLabels.sortDesc,\n cancelSort: mergedLabels.cancelSort,\n }}\n {...rest}\n />\n )}\n </div>\n );\n}\n","import { useCallback, useState } from 'react';\n\nexport interface UseControllableStateOptions<T> {\n /** Controlled value. When defined, the hook is in controlled mode. */\n value?: T;\n /** Initial value for uncontrolled mode. */\n defaultValue: T;\n /** Called on every change (both modes). */\n onChange?: (next: T) => void;\n}\n\n/**\n * Supports the controlled/uncontrolled pattern used across the design system\n * (mirrors mf-boveda's ReusableModal state handling). When `value` is provided\n * the component is controlled; otherwise internal state is used.\n */\nexport function useControllableState<T>({\n value,\n defaultValue,\n onChange,\n}: UseControllableStateOptions<T>): [T, (next: T) => void] {\n const isControlled = value !== undefined;\n const [internal, setInternal] = useState<T>(defaultValue);\n const current = isControlled ? (value as T) : internal;\n\n const setValue = useCallback(\n (next: T) => {\n if (!isControlled) {\n setInternal(next);\n }\n onChange?.(next);\n },\n [isControlled, onChange],\n );\n\n return [current, setValue];\n}\n","import { Modal } from 'antd';\nimport type { ModalProps } from 'antd';\nimport {\n isValidElement,\n cloneElement,\n useCallback,\n useMemo,\n type ReactNode,\n type MouseEvent,\n type KeyboardEvent,\n} from 'react';\nimport { useControllableState } from '../../hooks/useControllableState';\n\ntype TriggerRenderer = (open: () => void) => ReactNode;\n\nexport interface ModalDialogProps extends Omit<ModalProps, 'open' | 'children'> {\n /** Controlled open state. */\n open?: boolean;\n /** Initial open state in uncontrolled mode. */\n defaultOpen?: boolean;\n /** Node or render-prop that opens the modal when clicked. */\n trigger?: ReactNode | TriggerRenderer;\n /** Close automatically after `onOk` resolves. Default true. */\n closeOnOk?: boolean;\n /** Close automatically after `onCancel`. Default true. */\n closeOnCancel?: boolean;\n /** Notified whenever the open state changes (controlled or not). */\n onOpenChange?: (next: boolean) => void;\n children?: ReactNode;\n}\n\nfunction isPromise<T>(value: unknown): value is Promise<T> {\n return !!value && typeof (value as Promise<T>).then === 'function';\n}\n\n/**\n * AMS ModalDialog — a controllable modal composite.\n *\n * Ports mf-boveda's ReusableModal API:\n * - controlled (`open`) or uncontrolled (`defaultOpen`) state,\n * - a `trigger` node or render-prop that opens it,\n * - `closeOnOk` / `closeOnCancel` with async `onOk` support (waits for the\n * returned promise before closing).\n *\n * All other antd Modal props pass through.\n */\nexport function ModalDialog({\n trigger,\n children,\n open,\n defaultOpen = false,\n closeOnOk = true,\n closeOnCancel = true,\n onOk,\n onCancel,\n onOpenChange,\n ...modalProps\n}: ModalDialogProps) {\n const [isOpen, setOpen] = useControllableState<boolean>({\n value: open,\n defaultValue: defaultOpen,\n onChange: onOpenChange,\n });\n\n const handleOpen = useCallback(() => setOpen(true), [setOpen]);\n\n const handleCancel: ModalProps['onCancel'] = useCallback(\n (event: MouseEvent<HTMLButtonElement> | KeyboardEvent<HTMLElement>) => {\n onCancel?.(event);\n if (closeOnCancel) setOpen(false);\n },\n [onCancel, closeOnCancel, setOpen],\n );\n\n const handleOk: ModalProps['onOk'] = useCallback(\n async (event: MouseEvent<HTMLButtonElement>) => {\n const result = onOk?.(event);\n if (!closeOnOk) return;\n if (isPromise(result)) {\n try {\n await result;\n } finally {\n setOpen(false);\n }\n } else {\n setOpen(false);\n }\n },\n [onOk, closeOnOk, setOpen],\n );\n\n const triggerNode = useMemo(() => {\n if (!trigger) return null;\n if (typeof trigger === 'function') {\n return (trigger as TriggerRenderer)(handleOpen);\n }\n if (isValidElement(trigger)) {\n const el = trigger as React.ReactElement<{ onClick?: (e: MouseEvent<HTMLElement>) => void }>;\n const originalOnClick = el.props.onClick;\n return cloneElement(el, {\n onClick: (event: MouseEvent<HTMLElement>) => {\n originalOnClick?.(event);\n handleOpen();\n },\n });\n }\n return trigger;\n }, [trigger, handleOpen]);\n\n return (\n <>\n {triggerNode}\n <Modal open={isOpen} onOk={handleOk} onCancel={handleCancel} {...modalProps}>\n {children}\n </Modal>\n </>\n );\n}\n","import { Select } from 'antd';\nimport type { SelectProps } from 'antd';\nimport type { ReactNode } from 'react';\n\nexport interface FilterOption {\n value: string;\n label: ReactNode;\n disabled?: boolean;\n}\n\nexport interface FilterSelectProps\n extends Omit<SelectProps<string>, 'options' | 'filterOption'> {\n options: FilterOption[];\n /** Enable client-side search with accent-insensitive matching. */\n showSearch?: boolean;\n /** Override the default accent-insensitive filter. */\n filterOption?: SelectProps<string>['filterOption'];\n}\n\nconst normalize = (value?: string): string =>\n (value ?? '')\n .toString()\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '')\n .toLowerCase();\n\nconst extractText = (node?: ReactNode): string => {\n if (node === null || node === undefined) return '';\n if (typeof node === 'string' || typeof node === 'number' || typeof node === 'boolean') {\n return String(node);\n }\n if (Array.isArray(node)) return node.map(extractText).join(' ');\n if (typeof node === 'object' && 'props' in (node as unknown as Record<string, unknown>)) {\n const props = (node as { props?: { children?: ReactNode } }).props;\n return extractText(props?.children);\n }\n return '';\n};\n\n/**\n * AMS FilterSelect — a Select preset for dashboard filters.\n *\n * Ports mf-boveda's FilterSelect: accent-insensitive search over both the\n * option label and value, full-width by default. i18n is the consumer's\n * responsibility (pass already-translated labels).\n */\nexport function FilterSelect({\n options,\n showSearch = false,\n filterOption,\n className,\n style,\n ...rest\n}: FilterSelectProps) {\n const defaultFilter: SelectProps<string>['filterOption'] = (input, option) => {\n if (!option) return false;\n const query = normalize(input);\n const label = normalize(extractText(option.label as ReactNode));\n const value = normalize(typeof option.value === 'string' ? option.value : '');\n return label.includes(query) || value.includes(query);\n };\n\n const resolvedFilter = showSearch && !filterOption ? defaultFilter : filterOption;\n\n return (\n <Select<string>\n options={options}\n showSearch={showSearch}\n filterOption={resolvedFilter}\n optionFilterProp=\"label\"\n className={className}\n style={{ width: '100%', ...style }}\n {...rest}\n />\n );\n}\n","import { Upload } from 'antd';\nimport type { UploadProps } from 'antd';\nimport { InboxOutlined } from '@ant-design/icons';\nimport { useMemo, type ReactNode } from 'react';\nimport { useAmsMessage } from '../message/useAmsMessage';\n\ntype UploadMessage = string | ((fileName: string) => string);\ntype UploadChangeInfo = Parameters<NonNullable<UploadProps['onChange']>>[0];\n\nexport interface FileUploadDraggerProps\n extends Omit<UploadProps, 'onChange'> {\n /** Success toast text or a builder receiving the file name. */\n successMessage?: UploadMessage;\n /** Error toast text or a builder receiving the file name. */\n errorMessage?: UploadMessage;\n /** Show success/error toasts on upload status changes. Default true. */\n showStatusMessages?: boolean;\n /** Prompt text shown inside the drop area (when no children given). */\n hintText?: ReactNode;\n onUploadSuccess?: (info: UploadChangeInfo) => void;\n onUploadError?: (info: UploadChangeInfo) => void;\n onChange?: UploadProps['onChange'];\n children?: ReactNode;\n}\n\nconst resolveMessage = (\n template: UploadMessage | undefined,\n fileName: string,\n fallback: string,\n): string => {\n if (!template) return fallback.replace('{file}', fileName);\n return typeof template === 'function' ? template(fileName) : template.replace('{file}', fileName);\n};\n\n/**\n * AMS FileUploadDragger — drag-and-drop uploader.\n *\n * Ports mf-boveda's FileUploadDragger with two DS improvements:\n * - toasts use the context-safe `useAmsMessage()` (no antd v5 static warning),\n * - all copy is passed via props (i18n stays in the consumer); no default\n * upload endpoint is baked in.\n */\nexport function FileUploadDragger({\n successMessage,\n errorMessage,\n showStatusMessages = true,\n hintText = 'Click or drag a file to this area to upload',\n onUploadSuccess,\n onUploadError,\n onChange: externalOnChange,\n children,\n ...uploadProps\n}: FileUploadDraggerProps) {\n const message = useAmsMessage();\n\n const mergedProps = useMemo<UploadProps>(\n () => ({\n ...uploadProps,\n onChange(info) {\n const { status, name: fileName } = info.file;\n if (showStatusMessages) {\n if (status === 'done') {\n message.success(resolveMessage(successMessage, fileName, `${fileName} uploaded successfully.`));\n onUploadSuccess?.(info);\n } else if (status === 'error') {\n message.error(resolveMessage(errorMessage, fileName, `${fileName} failed to upload.`));\n onUploadError?.(info);\n }\n }\n externalOnChange?.(info);\n },\n }),\n [uploadProps, showStatusMessages, message, successMessage, errorMessage, onUploadSuccess, onUploadError, externalOnChange],\n );\n\n return (\n <Upload.Dragger {...mergedProps}>\n {children ?? (\n <>\n <p className=\"ant-upload-drag-icon\">\n <InboxOutlined />\n </p>\n <p className=\"ant-upload-text\">{hintText}</p>\n </>\n )}\n </Upload.Dragger>\n );\n}\n","import { Breadcrumb } from 'antd';\nimport type { BreadcrumbProps } from 'antd';\nimport type { ReactNode } from 'react';\n\nexport interface BreadcrumbItem {\n title: ReactNode;\n href?: string;\n}\n\nexport interface PageHeaderProps {\n /** Page title. Rendered as an h1. */\n title: ReactNode;\n /** Breadcrumb trail. When omitted, no breadcrumb is shown. */\n breadcrumbs?: BreadcrumbItem[];\n /** Breadcrumb separator. Defaults to \">\". */\n separator?: ReactNode;\n /** Uppercase the title (matches the b2bmx convention). Default true. */\n uppercaseTitle?: boolean;\n /** Content aligned to the right of the title (actions). */\n extra?: ReactNode;\n className?: string;\n}\n\n/**\n * AMS PageHeader — page title with an optional breadcrumb.\n *\n * Consolidates mf-boveda's Header + Breadcrums. Decoupled from react-router\n * and the boveda domain: the consumer builds the breadcrumb items (already\n * translated) and passes them in.\n */\nexport function PageHeader({\n title,\n breadcrumbs,\n separator = '>',\n uppercaseTitle = true,\n extra,\n className,\n}: PageHeaderProps) {\n return (\n <div className={className} style={{ marginBottom: 32 }}>\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 16,\n }}\n >\n <h1\n style={{\n fontSize: 20,\n fontWeight: 700,\n margin: 0,\n textTransform: uppercaseTitle ? 'uppercase' : undefined,\n }}\n >\n {title}\n </h1>\n {extra ? <div>{extra}</div> : null}\n </div>\n {breadcrumbs && breadcrumbs.length > 0 ? (\n <Breadcrumb\n separator={separator}\n items={breadcrumbs as BreadcrumbProps['items']}\n style={{ fontSize: 13, marginTop: 8 }}\n />\n ) : null}\n </div>\n );\n}\n","import { DownloadOutlined } from '@ant-design/icons';\nimport { forwardRef } from 'react';\nimport { Button } from '../Button';\nimport type { ButtonProps } from '../Button';\n\nexport interface DownloadButtonProps extends ButtonProps {\n /** Button label. Defaults to \"CSV\". */\n label?: React.ReactNode;\n}\n\n/**\n * AMS DownloadButton — a Button preset for download actions.\n *\n * Ports mf-boveda's DownloadButton: primary type + download icon + label,\n * with the full Button API available. i18n via the `label`/`children` props.\n */\nexport const DownloadButton = forwardRef<\n HTMLButtonElement | HTMLAnchorElement,\n DownloadButtonProps\n>(function DownloadButton({ label = 'CSV', icon, type = 'primary', children, ...rest }, ref) {\n return (\n <Button ref={ref} type={type} icon={icon ?? <DownloadOutlined />} {...rest}>\n {children ?? label}\n </Button>\n );\n});\n","import type { ReactNode } from 'react';\nimport { ModalDialog } from '../ModalDialog';\nimport type { ModalDialogProps } from '../ModalDialog';\n\nexport interface ConfirmModalProps\n extends Omit<ModalDialogProps, 'children'> {\n /** Body message shown to the user. */\n message?: ReactNode;\n /** Mark the confirm action as destructive (red primary button). */\n danger?: boolean;\n children?: ReactNode;\n}\n\n/**\n * AMS ConfirmModal — a confirm/cancel dialog preset built on `ModalDialog`.\n *\n * Generalizes the mf-boveda cancel/confirm modals (CancelCfdiModal, etc.):\n * inherits controlled/uncontrolled state, trigger, and async `onOk` from\n * ModalDialog. Set `danger` for destructive actions. Copy via props (i18n).\n */\nexport function ConfirmModal({\n message,\n danger = false,\n okButtonProps,\n children,\n ...rest\n}: ConfirmModalProps) {\n return (\n <ModalDialog\n okButtonProps={{ danger, ...okButtonProps }}\n {...rest}\n >\n {children ?? (message ? <p>{message}</p> : null)}\n </ModalDialog>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/theme/tokens.ts","../src/theme/theme.ts","../src/theme/useThemeMode.ts","../src/theme/AmsConfigProvider.tsx","../src/components/Button/Button.tsx","../src/components/Tag/Tag.tsx","../src/components/message/useAmsMessage.ts","../src/components/notification/useAmsNotification.ts","../src/components/Pagination/Pagination.tsx","../src/components/Card/Card.tsx","../src/components/ThemeToggle/ThemeToggle.tsx","../src/components/DataTable/DataTable.tsx","../src/hooks/useControllableState.ts","../src/components/ModalDialog/ModalDialog.tsx","../src/components/FilterSelect/FilterSelect.tsx","../src/components/FileUploadDragger/FileUploadDragger.tsx","../src/components/PageHeader/PageHeader.tsx","../src/components/DownloadButton/DownloadButton.tsx","../src/components/ConfirmModal/ConfirmModal.tsx"],"names":["antdTheme","Button","jsx","AntButton","forwardRef","Tag","AntTag","App","AntPagination","AntdCard","Switch","Skeleton","Table","useState","useCallback","useMemo","jsxs","Modal","Select","Upload","Fragment","Breadcrumb","DownloadButton","DownloadOutlined"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Design tokens — the single source of truth for the AMS Design System.\n *\n * Values are taken from the B2BMX Metronic theme:\n * b2bmx-web-metronic/src/_metronic/assets/sass/components/_variables.custom.scss\n * b2bmx-web-metronic/tailwind.config.js\n *\n * Two tiers:\n * - `primitives`: raw values, no semantic meaning.\n * - `semantic`: role aliases consumed by the antd theme (and Tailwind).\n */\n\n/** Raw Metronic brand values. */\nexport const primitives = {\n brandRed: '#A72432',\n brandRedActive: '#8B1D28', // darken 10%\n brandRedLight: '#f1faff',\n\n green: '#50cd89',\n greenActive: '#47be7d',\n greenLight: '#e8fff3',\n\n purple: '#7239ea',\n purpleActive: '#5014d0',\n purpleLight: '#f8f5ff',\n\n pink: '#f1416c',\n pinkActive: '#d9214e',\n pinkLight: '#fff5f8',\n\n yellow: '#ffc700',\n yellowActive: '#f1bc00',\n yellowLight: '#fff8dd',\n\n white: '#ffffff',\n\n gray: {\n 100: '#f9f9f9',\n 200: '#f4f4f4',\n 300: '#e1e3ea',\n 400: '#b5b5c3',\n 500: '#a1a5b7',\n 600: '#7e8299',\n 700: '#5e6278',\n 800: '#3f4254',\n 900: '#181c32',\n },\n\n background: {\n app: '#f5f8fa',\n body: '#ffffff',\n appDark: '#151521',\n bodyDark: '#1e1e2d',\n },\n\n dark: {\n base: '#181c32',\n bg: '#151521',\n header: '#1e1e2d',\n active: '#2a2a3c',\n separator: '#393945',\n // Dark-mode surfaces (from mf-container's antdTheme).\n inputBg: '#1b1b29',\n cardBg: '#1e1e2d',\n // Dark-mode gray scale — DISTINCT from the light `gray` scale (Metronic).\n gray: {\n 100: '#2b2b40',\n 200: '#323248',\n 300: '#3b3b64',\n 400: '#474761',\n 500: '#565674',\n 600: '#6d6d80',\n 700: '#92929f',\n 800: '#cdcdde',\n },\n },\n} as const;\n\n/** Radius scale (Metronic). Base radius is 4px. */\nexport const radius = {\n sm: 2,\n base: 4,\n md: 6,\n lg: 8,\n xl: 12,\n} as const;\n\n/** Typography (Metronic uses Inter with a compact 13px base). */\nexport const typography = {\n fontFamily: 'Inter, Helvetica, Arial, sans-serif',\n fontSizeBase: 13,\n weight: {\n light: 300,\n normal: 400,\n medium: 500,\n semibold: 600,\n bold: 700,\n },\n} as const;\n\n/** Control sizing (Metronic). */\nexport const sizing = {\n controlHeight: 32,\n buttonMinWidth: 110,\n} as const;\n\n/**\n * Semantic tokens — role aliases. These feed the antd `ThemeConfig`.\n * Components must consume semantic tokens, never primitives directly.\n */\nexport const semantic = {\n colorPrimary: primitives.brandRed,\n colorPrimaryActive: primitives.brandRedActive,\n colorSuccess: primitives.green,\n colorInfo: primitives.purple,\n colorError: primitives.pink,\n colorWarning: primitives.yellow,\n\n // Links. Metronic inherits link color from the (red) primary, which reads as\n // \"danger\" in dense UIs. The AMS default uses a neutral dark gray so links\n // don't look like errors; consumers can override `colorLink`/`colorLinkHover`\n // via AmsConfigProvider's `theme` prop (e.g. back to the brand red or blue).\n colorLink: primitives.gray[800],\n colorLinkHover: primitives.brandRed,\n colorLinkActive: primitives.brandRedActive,\n\n colorBgLayout: primitives.background.app,\n colorBgContainer: primitives.background.body,\n\n borderRadius: radius.base,\n fontFamily: typography.fontFamily,\n fontSize: typography.fontSizeBase,\n controlHeight: sizing.controlHeight,\n} as const;\n\nexport type ThemeMode = 'light' | 'dark';\n","import { theme as antdTheme } from 'antd';\nimport type { ThemeConfig } from 'antd';\nimport { primitives, semantic, type ThemeMode } from './tokens';\n\n/**\n * Tokens shared by light and dark modes (brand, links, radius, typography).\n * Backgrounds, text, and borders are mode-specific (see below).\n */\nconst sharedToken: ThemeConfig['token'] = {\n colorPrimary: semantic.colorPrimary,\n colorSuccess: semantic.colorSuccess,\n colorInfo: semantic.colorInfo,\n colorError: semantic.colorError,\n colorWarning: semantic.colorWarning,\n colorLink: semantic.colorLink,\n colorLinkHover: semantic.colorLinkHover,\n colorLinkActive: semantic.colorLinkActive,\n borderRadius: semantic.borderRadius,\n fontFamily: semantic.fontFamily,\n fontSize: semantic.fontSize,\n controlHeight: semantic.controlHeight,\n};\n\n/** Light-mode tokens. */\nconst lightToken: ThemeConfig['token'] = {\n ...sharedToken,\n colorBgLayout: semantic.colorBgLayout,\n colorBgContainer: semantic.colorBgContainer,\n colorBgElevated: primitives.background.body,\n colorText: primitives.gray[900],\n colorTextSecondary: primitives.gray[700],\n colorTextTertiary: primitives.gray[500],\n colorTextQuaternary: primitives.gray[400],\n colorBorder: primitives.gray[300],\n colorBorderSecondary: primitives.gray[200],\n};\n\n/**\n * Dark-mode tokens. Backgrounds/text/borders come from the Metronic dark\n * palette (mirrors mf-container's darkTheme). Brand colors stay identical.\n */\nconst darkToken: ThemeConfig['token'] = {\n ...sharedToken,\n colorBgLayout: primitives.background.appDark,\n colorBgContainer: primitives.background.bodyDark,\n colorBgElevated: primitives.background.bodyDark,\n colorText: '#ffffff',\n colorTextHeading: '#ffffff',\n colorTextSecondary: primitives.dark.gray[800],\n colorTextTertiary: primitives.dark.gray[700],\n colorTextQuaternary: primitives.dark.gray[600],\n colorBorder: primitives.dark.gray[300],\n colorBorderSecondary: primitives.dark.gray[200],\n boxShadow:\n '0 6px 16px 0 rgba(0, 0, 0, 0.48), 0 3px 6px -4px rgba(0, 0, 0, 0.36), 0 9px 28px 8px rgba(0, 0, 0, 0.15)',\n};\n\n/** Per-component overrides shared by both modes. */\nconst sharedComponents: ThemeConfig['components'] = {\n Button: { controlHeight: 32 },\n Tabs: {\n itemColor: primitives.gray[600],\n itemSelectedColor: semantic.colorPrimary,\n itemHoverColor: semantic.colorPrimary,\n },\n};\n\n/** Light per-component overrides. */\nconst lightComponents: ThemeConfig['components'] = {\n ...sharedComponents,\n Table: {\n headerBg: primitives.gray[100],\n headerColor: primitives.gray[800],\n borderColor: primitives.gray[300],\n cellPaddingBlock: 8,\n cellPaddingInline: 8,\n },\n};\n\n/** Dark per-component overrides (mirrors mf-container's dark component theme). */\nconst darkComponents: ThemeConfig['components'] = {\n ...sharedComponents,\n Table: {\n headerBg: primitives.dark.gray[200],\n headerColor: primitives.dark.gray[800],\n borderColor: primitives.dark.gray[400],\n rowHoverBg: primitives.dark.gray[200],\n cellPaddingBlock: 8,\n cellPaddingInline: 8,\n },\n Input: {\n colorBgContainer: primitives.dark.inputBg,\n colorBorder: primitives.dark.gray[400],\n colorText: '#ffffff',\n },\n Select: {\n colorBgContainer: primitives.dark.inputBg,\n colorBorder: primitives.dark.gray[400],\n colorText: '#ffffff',\n },\n DatePicker: {\n colorBgContainer: primitives.dark.inputBg,\n },\n Card: {\n colorBgContainer: primitives.dark.cardBg,\n colorBorderSecondary: primitives.dark.cardBg,\n },\n Modal: {\n contentBg: primitives.dark.gray[100],\n headerBg: primitives.dark.gray[100],\n },\n Drawer: {\n colorBgElevated: primitives.dark.gray[100],\n },\n Notification: {\n colorBgElevated: primitives.dark.gray[100],\n },\n Message: {\n contentBg: primitives.dark.gray[100],\n },\n Menu: {\n itemBg: primitives.background.bodyDark,\n itemHoverBg: primitives.dark.gray[100],\n itemSelectedBg: primitives.dark.active,\n itemSelectedColor: semantic.colorPrimary,\n itemActiveBg: primitives.dark.active,\n subMenuItemBg: primitives.background.bodyDark,\n },\n Dropdown: {\n colorBgElevated: primitives.background.bodyDark,\n controlItemBgHover: primitives.dark.gray[100],\n },\n};\n\n/**\n * Builds the antd theme for a given mode. Dark mode uses antd's\n * `darkAlgorithm`; brand tokens stay identical so the brand is consistent.\n */\nexport function buildTheme(mode: ThemeMode = 'light'): ThemeConfig {\n const isDark = mode === 'dark';\n return {\n algorithm: isDark ? antdTheme.darkAlgorithm : antdTheme.defaultAlgorithm,\n token: isDark ? darkToken : lightToken,\n components: isDark ? darkComponents : lightComponents,\n };\n}\n\n/** Default (light) AMS theme. */\nexport const amsTheme: ThemeConfig = buildTheme('light');\n\n/** Dark AMS theme. */\nexport const amsThemeDark: ThemeConfig = buildTheme('dark');\n","import {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from 'react';\nimport type { ThemeMode } from './tokens';\n\nconst STORAGE_KEY = 'ams-theme';\n\n/** Reads the initial mode: saved preference → OS preference → light. */\nexport function getInitialThemeMode(defaultMode: ThemeMode = 'light'): ThemeMode {\n if (typeof window === 'undefined') return defaultMode;\n const saved = window.localStorage.getItem(STORAGE_KEY);\n if (saved === 'light' || saved === 'dark') return saved;\n if (window.matchMedia?.('(prefers-color-scheme: dark)').matches) return 'dark';\n return defaultMode;\n}\n\n/** Reflects the mode on the DOM so CSS can react (mirrors mf-container). */\nexport function applyThemeModeToDOM(mode: ThemeMode): void {\n if (typeof document === 'undefined') return;\n document.documentElement.setAttribute('data-theme', mode);\n document.body?.setAttribute('data-theme', mode);\n}\n\nexport interface ThemeModeContextValue {\n mode: ThemeMode;\n setMode: (mode: ThemeMode) => void;\n toggle: () => void;\n isDark: boolean;\n}\n\nexport const ThemeModeContext = createContext<ThemeModeContextValue | null>(null);\n\n/**\n * Access the current color mode and switch it. Requires an ancestor\n * `AmsConfigProvider`. Use it to build a light/dark toggle:\n *\n * const { isDark, toggle } = useThemeMode();\n * <Switch checked={isDark} onChange={toggle} />\n */\nexport function useThemeMode(): ThemeModeContextValue {\n const ctx = useContext(ThemeModeContext);\n if (!ctx) {\n throw new Error('useThemeMode must be used within an AmsConfigProvider');\n }\n return ctx;\n}\n\n/**\n * Internal state manager for the color mode. When `controlledMode` is provided,\n * the provider is controlled (no persistence). Otherwise the mode is managed\n * here: persisted to localStorage and reflected on the DOM via `data-theme`.\n */\nexport function useThemeModeState(\n controlledMode: ThemeMode | undefined,\n defaultMode: ThemeMode,\n persist: boolean,\n): ThemeModeContextValue {\n const isControlled = controlledMode !== undefined;\n const [internalMode, setInternalMode] = useState<ThemeMode>(() =>\n isControlled ? controlledMode : persist ? getInitialThemeMode(defaultMode) : defaultMode,\n );\n\n const mode = isControlled ? controlledMode : internalMode;\n\n useEffect(() => {\n applyThemeModeToDOM(mode);\n }, [mode]);\n\n const setMode = useCallback(\n (next: ThemeMode) => {\n if (!isControlled) {\n setInternalMode(next);\n if (persist && typeof window !== 'undefined') {\n window.localStorage.setItem(STORAGE_KEY, next);\n }\n }\n },\n [isControlled, persist],\n );\n\n const toggle = useCallback(() => {\n setMode(mode === 'light' ? 'dark' : 'light');\n }, [mode, setMode]);\n\n return useMemo(\n () => ({ mode, setMode, toggle, isDark: mode === 'dark' }),\n [mode, setMode, toggle],\n );\n}\n","import { App, ConfigProvider } from 'antd';\nimport type { Locale } from 'antd/es/locale';\nimport type { ThemeConfig } from 'antd';\nimport type { PropsWithChildren, ReactNode } from 'react';\nimport { buildTheme } from './theme';\nimport type { ThemeMode } from './tokens';\nimport { ThemeModeContext, useThemeModeState } from './useThemeMode';\n\nexport interface AmsConfigProviderProps {\n /**\n * Controlled color mode. When provided, the provider does not manage or\n * persist the mode. Omit it to let the provider manage the mode itself\n * (persisted to localStorage, respects OS preference) — read/toggle it with\n * the `useThemeMode` hook.\n */\n mode?: ThemeMode;\n /** Initial mode when self-managed (uncontrolled). Defaults to `light`. */\n defaultMode?: ThemeMode;\n /** Persist the self-managed mode to localStorage. Defaults to `true`. */\n persistMode?: boolean;\n /**\n * antd locale (e.g. `esES`, `enUS`). The consuming app passes it;\n * the design system stays i18n-agnostic and ships no message catalog.\n */\n locale?: Locale;\n /**\n * Theme overrides merged on top of the AMS theme. Use it to customize tokens\n * per project without forking the DS, e.g. `{ token: { colorLink: '#1677ff' } }`.\n */\n theme?: ThemeConfig;\n children?: ReactNode;\n}\n\nfunction mergeTheme(base: ThemeConfig, override?: ThemeConfig): ThemeConfig {\n if (!override) return base;\n return {\n ...base,\n ...override,\n token: { ...base.token, ...override.token },\n components: { ...base.components, ...override.components },\n // A caller-provided algorithm wins; otherwise keep the mode's algorithm.\n algorithm: override.algorithm ?? base.algorithm,\n };\n}\n\n/**\n * Root provider for the AMS Design System.\n *\n * - Applies the AMS theme (light/dark) via antd's `ConfigProvider`.\n * - Renders antd's `App` for context-safe `message`/`notification`/`Modal`.\n * - Manages the color mode (controlled via `mode`, or self-managed with\n * localStorage persistence and OS-preference detection) and exposes it\n * through the `useThemeMode` hook.\n * - Accepts a `theme` override merged on top of the AMS theme.\n *\n * Render it once at the app root.\n */\nexport function AmsConfigProvider({\n mode,\n defaultMode = 'light',\n persistMode = true,\n locale,\n theme,\n children,\n}: PropsWithChildren<AmsConfigProviderProps>) {\n const themeMode = useThemeModeState(mode, defaultMode, persistMode);\n const resolvedTheme = mergeTheme(buildTheme(themeMode.mode), theme);\n\n return (\n <ThemeModeContext.Provider value={themeMode}>\n <ConfigProvider theme={resolvedTheme} locale={locale}>\n <App>{children}</App>\n </ConfigProvider>\n </ThemeModeContext.Provider>\n );\n}\n","import { Button as AntButton } from 'antd';\nimport type { ButtonProps as AntButtonProps } from 'antd';\nimport { forwardRef } from 'react';\n\nexport interface ButtonProps extends AntButtonProps {}\n\n/**\n * AMS Button — thin wrapper over antd `Button` that inherits the AMS theme.\n * Exposes the full antd Button API (type, danger, loading, icon, size, etc.)\n * and forwards the ref so it integrates with Form and tooltips.\n */\nexport const Button = forwardRef<HTMLButtonElement | HTMLAnchorElement, ButtonProps>(\n function Button(props, ref) {\n return <AntButton ref={ref} {...props} />;\n },\n);\n","import { Tag as AntTag } from 'antd';\nimport type { TagProps as AntTagProps } from 'antd';\nimport { forwardRef } from 'react';\nimport { semantic } from '../../theme/tokens';\n\n/** AMS semantic tag intents mapped to brand tokens. */\nexport type TagIntent = 'success' | 'error' | 'warning' | 'info' | 'primary';\n\nexport interface TagProps extends AntTagProps {\n /**\n * Semantic intent that resolves to an AMS brand color. Takes precedence over\n * antd's `color` when set. Formalizes the inline `#50cd89` / `#f1416c` colors\n * previously hardcoded in mf-boveda's DataTable.\n */\n intent?: TagIntent;\n}\n\nconst INTENT_COLOR: Record<TagIntent, string> = {\n success: semantic.colorSuccess,\n error: semantic.colorError,\n warning: semantic.colorWarning,\n info: semantic.colorInfo,\n primary: semantic.colorPrimary,\n};\n\n/**\n * AMS Tag — thin wrapper over antd `Tag` with an optional semantic `intent`\n * that maps to the brand palette. Falls back to the full antd Tag API.\n */\nexport const Tag = forwardRef<HTMLSpanElement, TagProps>(function Tag(\n { intent, color, ...rest },\n ref,\n) {\n const resolvedColor = intent ? INTENT_COLOR[intent] : color;\n return <AntTag ref={ref} color={resolvedColor} {...rest} />;\n});\n","import { App } from 'antd';\nimport type { MessageInstance } from 'antd/es/message/interface';\n\n/**\n * Context-safe access to antd's `message` API.\n *\n * In antd v5 the static `message.success(...)` calls do **not** read the\n * `ConfigProvider` theme and log a warning. The supported approach is to\n * consume the instance provided by antd's `App` context — which\n * `AmsConfigProvider` already renders at the root.\n *\n * Usage:\n * const message = useAmsMessage();\n * message.success('Saved');\n *\n * Requires an ancestor `AmsConfigProvider` (or antd `App`).\n */\nexport function useAmsMessage(): MessageInstance {\n return App.useApp().message;\n}\n","import { App } from 'antd';\nimport type { NotificationInstance } from 'antd/es/notification/interface';\n\n/**\n * Context-safe access to antd's `notification` API.\n *\n * Like `useAmsMessage`, this returns the instance from antd's `App` context so\n * notifications inherit the AMS theme and avoid the v5 static-method warning.\n * Requires an ancestor `AmsConfigProvider` (or antd `App`).\n *\n * Usage:\n * const notification = useAmsNotification();\n * notification.success({ message: 'Done', description: 'Saved.' });\n */\nexport function useAmsNotification(): NotificationInstance {\n return App.useApp().notification;\n}\n","import { Pagination as AntPagination } from 'antd';\nimport type { PaginationProps as AntPaginationProps } from 'antd';\nimport type { PaginationLocale } from 'antd/es/pagination/Pagination';\nimport type { ReactNode } from 'react';\n\n/**\n * Translatable text labels for the pagination control. The design system is\n * i18n-agnostic: the consuming app passes already-translated strings. Anything\n * omitted falls back to antd's `locale` (or English defaults).\n */\nexport interface PaginationLabels {\n /** Suffix in the page-size selector, e.g. \"/ página\". */\n itemsPerPage?: string;\n /** \"Ir a\" label of the quick jumper. */\n jumpTo?: string;\n /** Confirm button text of the quick jumper. */\n jumpToConfirm?: string;\n /** Accessible label for a page, e.g. \"Página\". */\n page?: string;\n /** Accessible label for the previous-page button. */\n prevPage?: string;\n /** Accessible label for the next-page button. */\n nextPage?: string;\n /** Label for the page-size selector, e.g. \"Tamaño de página\". */\n pageSize?: string;\n /**\n * Builds the total-records text (rendered before the pages).\n * Receives the total and the current [from, to] range.\n * e.g. (total) => `Total ${total} registros`. Takes precedence over `totalText`.\n */\n total?: (total: number, range: [number, number]) => ReactNode;\n /**\n * Declarative total text as separate translated words, matching how the\n * mf-boveda table builds it: `{prefix} {total} {suffix}` → \"Total 250 registros\".\n * Set `showRange` to render \"{prefix} {from}-{to} {suffix}\" instead.\n * Ignored when `total` (the function form) is provided.\n */\n totalText?: {\n /** Word(s) before the number, e.g. \"Total\". */\n prefix?: string;\n /** Word(s) after the number, e.g. \"registros\". */\n suffix?: string;\n /** Use the \"from-to\" range instead of just the total. Default false. */\n showRange?: boolean;\n };\n /** Visible text for the \"previous\" button (overrides the arrow). */\n previousText?: ReactNode;\n /** Visible text for the \"next\" button (overrides the arrow). */\n nextText?: ReactNode;\n}\n\nexport interface PaginationProps extends AntPaginationProps {\n /** Translatable text labels. */\n labels?: PaginationLabels;\n}\n\nfunction buildLocale(labels?: PaginationLabels): PaginationLocale | undefined {\n if (!labels) return undefined;\n const locale: PaginationLocale = {};\n if (labels.itemsPerPage !== undefined) locale.items_per_page = labels.itemsPerPage;\n if (labels.jumpTo !== undefined) locale.jump_to = labels.jumpTo;\n if (labels.jumpToConfirm !== undefined) locale.jump_to_confirm = labels.jumpToConfirm;\n if (labels.page !== undefined) locale.page = labels.page;\n if (labels.prevPage !== undefined) locale.prev_page = labels.prevPage;\n if (labels.nextPage !== undefined) locale.next_page = labels.nextPage;\n if (labels.pageSize !== undefined) locale.page_size = labels.pageSize;\n return Object.keys(locale).length > 0 ? locale : undefined;\n}\n\n/**\n * AMS Pagination — antd `Pagination` with translatable text via a single\n * `labels` prop (page, records/total, previous/next, items-per-page, jumper).\n * The rest of the antd Pagination API passes through. `showTotal` and\n * `itemRender` still work if you prefer to set them directly; explicit\n * `showTotal`/`itemRender`/`locale` props win over `labels`.\n */\nexport function Pagination({\n labels,\n showTotal,\n itemRender,\n locale,\n ...rest\n}: PaginationProps) {\n const mergedLocale = { ...buildLocale(labels), ...locale };\n\n const resolvedShowTotal: AntPaginationProps['showTotal'] =\n showTotal ??\n (labels?.total\n ? (total, range) => labels.total!(total, range)\n : labels?.totalText\n ? (total, range) => {\n const { prefix, suffix, showRange } = labels.totalText!;\n const middle = showRange ? `${range[0]}-${range[1]}` : String(total);\n return [prefix, middle, suffix].filter(Boolean).join(' ');\n }\n : undefined);\n\n const resolvedItemRender: AntPaginationProps['itemRender'] =\n itemRender ??\n (labels?.previousText || labels?.nextText\n ? (_page, type, element) => {\n if (type === 'prev' && labels?.previousText !== undefined) return labels.previousText;\n if (type === 'next' && labels?.nextText !== undefined) return labels.nextText;\n return element;\n }\n : undefined);\n\n return (\n <AntPagination\n {...rest}\n locale={Object.keys(mergedLocale).length > 0 ? mergedLocale : undefined}\n showTotal={resolvedShowTotal}\n itemRender={resolvedItemRender}\n />\n );\n}\n","import { Card as AntdCard } from 'antd';\nimport type { CardProps } from 'antd';\nimport type * as React from 'react';\n\n// antd v6 declares `Card` as an `interface` that EXTENDS a forwardRef function\n// type (`interface CardInterface extends typeof InternalCard { Grid; Meta }`).\n// Extending an interface over a function type discards its call/construct\n// signatures, so TypeScript rejects `<Card>` as a JSX element (TS2786 / TS2604)\n// in consumers (React 19 + moduleResolution: Bundler). Rebuilding the type with\n// an INTERSECTION preserves the call signature plus the subcomponents. This is a\n// type-only fix: the exported runtime value is the unchanged antd `Card`.\ntype CardComponent = React.ForwardRefExoticComponent<\n CardProps & React.RefAttributes<HTMLDivElement>\n> & {\n Grid: (typeof AntdCard)['Grid'];\n Meta: (typeof AntdCard)['Meta'];\n};\n\nexport const Card = AntdCard as unknown as CardComponent;\nexport type { CardProps } from 'antd';\n","import { Switch } from 'antd';\nimport type { SwitchProps } from 'antd';\nimport { BulbOutlined, BulbFilled } from '@ant-design/icons';\nimport { useThemeMode } from '../../theme/useThemeMode';\n\nexport interface ThemeToggleProps extends Omit<SwitchProps, 'checked' | 'onChange'> {}\n\n/**\n * AMS ThemeToggle — a ready-made light/dark switch wired to `useThemeMode`.\n * Requires an ancestor `AmsConfigProvider` that manages the mode\n * (i.e. rendered without a controlled `mode` prop).\n */\nexport function ThemeToggle(props: ThemeToggleProps) {\n const { isDark, toggle } = useThemeMode();\n return (\n <Switch\n checked={isDark}\n onChange={toggle}\n checkedChildren={<BulbFilled />}\n unCheckedChildren={<BulbOutlined />}\n {...props}\n />\n );\n}\n","import { Skeleton, Table } from 'antd';\nimport type { TableProps, TablePaginationConfig } from 'antd';\nimport type { PaginationLocale } from 'antd/es/pagination/Pagination';\nimport type { ReactNode } from 'react';\nimport { Tag } from '../Tag';\nimport type { PaginationLabels } from '../Pagination';\n\n/**\n * Labels for the DataTable. The design system is i18n-agnostic: the consuming\n * microfrontend passes translated strings from its own catalog. Sensible\n * English defaults are provided so the table renders without wiring.\n */\nexport interface DataTableLabels {\n emptyText?: string;\n sortAsc?: string;\n sortDesc?: string;\n cancelSort?: string;\n}\n\nfunction buildPaginationLocale(labels?: PaginationLabels): PaginationLocale | undefined {\n if (!labels) return undefined;\n const locale: PaginationLocale = {};\n if (labels.itemsPerPage !== undefined) locale.items_per_page = labels.itemsPerPage;\n if (labels.jumpTo !== undefined) locale.jump_to = labels.jumpTo;\n if (labels.jumpToConfirm !== undefined) locale.jump_to_confirm = labels.jumpToConfirm;\n if (labels.page !== undefined) locale.page = labels.page;\n if (labels.prevPage !== undefined) locale.prev_page = labels.prevPage;\n if (labels.nextPage !== undefined) locale.next_page = labels.nextPage;\n if (labels.pageSize !== undefined) locale.page_size = labels.pageSize;\n return Object.keys(locale).length > 0 ? locale : undefined;\n}\n\nconst DEFAULT_LABELS: Required<DataTableLabels> = {\n emptyText: 'No data',\n sortAsc: 'Sort ascending',\n sortDesc: 'Sort descending',\n cancelSort: 'Cancel sort',\n};\n\nexport interface DataTableProps<T extends object = Record<string, unknown>>\n extends Omit<TableProps<T>, 'title' | 'loading'> {\n /** Optional plain-text heading rendered above the table. */\n heading?: string;\n /** Extra content (buttons, filters) rendered above the table. */\n extra?: React.ReactNode;\n /** External loading state. Renders a skeleton placeholder while true. */\n loading?: boolean;\n /** Translated labels; falls back to English defaults. */\n labels?: DataTableLabels;\n /**\n * Translatable pagination text (total/records, previous/next, page-size,\n * jumper). Applied to the table's pagination — matches the mf-boveda pattern\n * of a \"{prefix} {total} {suffix}\" total and translated prev/next buttons.\n * Merged into `pagination`; anything set directly on `pagination`\n * (`showTotal`/`itemRender`/`locale`) wins.\n */\n paginationLabels?: PaginationLabels;\n /**\n * Opt-in: render numeric values in the first column as colored tags\n * (green when >= 0, red when < 0). Off by default — this replaces the\n * implicit column-0 behavior of the original mf-boveda DataTable, which\n * was surprising. Explicitly enable it per table when desired.\n */\n firstColumnNumericTag?: boolean;\n}\n\nfunction toNumericValue(value: unknown): number | null {\n if (value === null || value === undefined || value === '') return null;\n const num =\n typeof value === 'string' ? parseFloat(value.replace(/,/g, '')) : Number(value);\n return Number.isNaN(num) || !Number.isFinite(num) ? null : num;\n}\n\n/**\n * AMS DataTable — themed, opinionated wrapper over antd `Table`.\n *\n * Ports the reusable behavior from mf-boveda's DataTable:\n * - loading skeleton placeholder,\n * - `bordered` and horizontal `scroll: { x: 'max-content' }` defaults,\n * - i18n-agnostic labels via props,\n * - optional (opt-in) numeric tags on the first column.\n *\n * All other antd Table props pass through.\n */\nfunction buildTotalText(labels?: PaginationLabels): TablePaginationConfig['showTotal'] | undefined {\n if (!labels) return undefined;\n if (labels.total) return (total, range) => labels.total!(total, range);\n if (labels.totalText) {\n return (total, range) => {\n const { prefix, suffix, showRange } = labels.totalText!;\n const middle = showRange ? `${range[0]}-${range[1]}` : String(total);\n return [prefix, middle, suffix].filter(Boolean).join(' ');\n };\n }\n return undefined;\n}\n\nfunction buildItemRender(labels?: PaginationLabels): TablePaginationConfig['itemRender'] | undefined {\n if (!labels || (labels.previousText === undefined && labels.nextText === undefined)) {\n return undefined;\n }\n return (_page, type, element) => {\n if (type === 'prev' && labels.previousText !== undefined) return labels.previousText;\n if (type === 'next' && labels.nextText !== undefined) return labels.nextText;\n return element as ReactNode;\n };\n}\n\nexport function DataTable<T extends object = Record<string, unknown>>({\n heading,\n extra,\n loading = false,\n labels,\n paginationLabels,\n firstColumnNumericTag = false,\n columns,\n dataSource,\n scroll,\n bordered = true,\n pagination,\n className,\n ...rest\n}: DataTableProps<T>) {\n const mergedLabels = { ...DEFAULT_LABELS, ...labels };\n\n // Merge translatable pagination labels into the pagination config.\n // Explicit values on `pagination` win over the label-derived ones.\n const resolvedPagination =\n pagination === false || pagination === undefined\n ? pagination\n : (() => {\n const paginationLocale = buildPaginationLocale(paginationLabels);\n const totalFn = buildTotalText(paginationLabels);\n const itemRenderFn = buildItemRender(paginationLabels);\n return {\n ...(totalFn ? { showTotal: totalFn } : {}),\n ...(itemRenderFn ? { itemRender: itemRenderFn } : {}),\n ...(paginationLocale ? { locale: paginationLocale } : {}),\n ...pagination,\n };\n })();\n\n const resolvedColumns =\n firstColumnNumericTag && columns && columns.length > 0\n ? columns.map((col, index) => {\n if (index !== 0) return col;\n const originalRender = (\n col as { render?: (value: unknown, record: T, i: number) => React.ReactNode }\n ).render;\n return {\n ...col,\n render: (value: unknown, record: T, i: number) => {\n const content = originalRender\n ? originalRender(value, record, i)\n : (value as React.ReactNode);\n const numeric = toNumericValue(value);\n if (numeric === null) return content;\n return (\n <Tag\n intent={numeric < 0 ? 'error' : 'success'}\n style={{ minWidth: 72, textAlign: 'center' }}\n >\n {content}\n </Tag>\n );\n },\n };\n })\n : columns;\n\n const resolvedScroll = scroll ?? { x: 'max-content' };\n\n return (\n <div className={className}>\n {heading ? (\n <div style={{ marginBottom: 8 }}>\n <h3 style={{ margin: 0, fontWeight: 600 }}>{heading}</h3>\n </div>\n ) : null}\n {extra ? <div style={{ marginBottom: 8 }}>{extra}</div> : null}\n {loading ? (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 16 }}>\n {Array.from({ length: 6 }).map((_, i) => (\n <Skeleton key={i} active paragraph={{ rows: 0 }} title={{ width: '100%' }} />\n ))}\n </div>\n ) : (\n <Table<T>\n columns={resolvedColumns}\n dataSource={dataSource}\n bordered={bordered}\n scroll={resolvedScroll}\n pagination={resolvedPagination}\n locale={{\n emptyText: mergedLabels.emptyText,\n triggerAsc: mergedLabels.sortAsc,\n triggerDesc: mergedLabels.sortDesc,\n cancelSort: mergedLabels.cancelSort,\n }}\n {...rest}\n />\n )}\n </div>\n );\n}\n","import { useCallback, useState } from 'react';\n\nexport interface UseControllableStateOptions<T> {\n /** Controlled value. When defined, the hook is in controlled mode. */\n value?: T;\n /** Initial value for uncontrolled mode. */\n defaultValue: T;\n /** Called on every change (both modes). */\n onChange?: (next: T) => void;\n}\n\n/**\n * Supports the controlled/uncontrolled pattern used across the design system\n * (mirrors mf-boveda's ReusableModal state handling). When `value` is provided\n * the component is controlled; otherwise internal state is used.\n */\nexport function useControllableState<T>({\n value,\n defaultValue,\n onChange,\n}: UseControllableStateOptions<T>): [T, (next: T) => void] {\n const isControlled = value !== undefined;\n const [internal, setInternal] = useState<T>(defaultValue);\n const current = isControlled ? (value as T) : internal;\n\n const setValue = useCallback(\n (next: T) => {\n if (!isControlled) {\n setInternal(next);\n }\n onChange?.(next);\n },\n [isControlled, onChange],\n );\n\n return [current, setValue];\n}\n","import { Modal } from 'antd';\nimport type { ModalProps } from 'antd';\nimport {\n isValidElement,\n cloneElement,\n useCallback,\n useMemo,\n type ReactNode,\n type MouseEvent,\n type KeyboardEvent,\n} from 'react';\nimport { useControllableState } from '../../hooks/useControllableState';\n\ntype TriggerRenderer = (open: () => void) => ReactNode;\n\nexport interface ModalDialogProps extends Omit<ModalProps, 'open' | 'children'> {\n /** Controlled open state. */\n open?: boolean;\n /** Initial open state in uncontrolled mode. */\n defaultOpen?: boolean;\n /** Node or render-prop that opens the modal when clicked. */\n trigger?: ReactNode | TriggerRenderer;\n /** Close automatically after `onOk` resolves. Default true. */\n closeOnOk?: boolean;\n /** Close automatically after `onCancel`. Default true. */\n closeOnCancel?: boolean;\n /** Notified whenever the open state changes (controlled or not). */\n onOpenChange?: (next: boolean) => void;\n children?: ReactNode;\n}\n\nfunction isPromise<T>(value: unknown): value is Promise<T> {\n return !!value && typeof (value as Promise<T>).then === 'function';\n}\n\n/**\n * AMS ModalDialog — a controllable modal composite.\n *\n * Ports mf-boveda's ReusableModal API:\n * - controlled (`open`) or uncontrolled (`defaultOpen`) state,\n * - a `trigger` node or render-prop that opens it,\n * - `closeOnOk` / `closeOnCancel` with async `onOk` support (waits for the\n * returned promise before closing).\n *\n * All other antd Modal props pass through.\n */\nexport function ModalDialog({\n trigger,\n children,\n open,\n defaultOpen = false,\n closeOnOk = true,\n closeOnCancel = true,\n onOk,\n onCancel,\n onOpenChange,\n ...modalProps\n}: ModalDialogProps) {\n const [isOpen, setOpen] = useControllableState<boolean>({\n value: open,\n defaultValue: defaultOpen,\n onChange: onOpenChange,\n });\n\n const handleOpen = useCallback(() => setOpen(true), [setOpen]);\n\n const handleCancel: ModalProps['onCancel'] = useCallback(\n (event: MouseEvent<HTMLButtonElement> | KeyboardEvent<HTMLElement>) => {\n onCancel?.(event);\n if (closeOnCancel) setOpen(false);\n },\n [onCancel, closeOnCancel, setOpen],\n );\n\n const handleOk: ModalProps['onOk'] = useCallback(\n async (event: MouseEvent<HTMLButtonElement>) => {\n const result = onOk?.(event);\n if (!closeOnOk) return;\n if (isPromise(result)) {\n try {\n await result;\n } finally {\n setOpen(false);\n }\n } else {\n setOpen(false);\n }\n },\n [onOk, closeOnOk, setOpen],\n );\n\n const triggerNode = useMemo(() => {\n if (!trigger) return null;\n if (typeof trigger === 'function') {\n return (trigger as TriggerRenderer)(handleOpen);\n }\n if (isValidElement(trigger)) {\n const el = trigger as React.ReactElement<{ onClick?: (e: MouseEvent<HTMLElement>) => void }>;\n const originalOnClick = el.props.onClick;\n return cloneElement(el, {\n onClick: (event: MouseEvent<HTMLElement>) => {\n originalOnClick?.(event);\n handleOpen();\n },\n });\n }\n return trigger;\n }, [trigger, handleOpen]);\n\n return (\n <>\n {triggerNode}\n <Modal open={isOpen} onOk={handleOk} onCancel={handleCancel} {...modalProps}>\n {children}\n </Modal>\n </>\n );\n}\n","import { Select } from 'antd';\nimport type { SelectProps } from 'antd';\nimport type { ReactNode } from 'react';\n\nexport interface FilterOption {\n value: string;\n label: ReactNode;\n disabled?: boolean;\n}\n\nexport interface FilterSelectProps\n extends Omit<SelectProps<string>, 'options' | 'filterOption'> {\n options: FilterOption[];\n /** Enable client-side search with accent-insensitive matching. */\n showSearch?: boolean;\n /** Override the default accent-insensitive filter. */\n filterOption?: SelectProps<string>['filterOption'];\n}\n\nconst normalize = (value?: string): string =>\n (value ?? '')\n .toString()\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '')\n .toLowerCase();\n\nconst extractText = (node?: ReactNode): string => {\n if (node === null || node === undefined) return '';\n if (typeof node === 'string' || typeof node === 'number' || typeof node === 'boolean') {\n return String(node);\n }\n if (Array.isArray(node)) return node.map(extractText).join(' ');\n if (typeof node === 'object' && 'props' in (node as unknown as Record<string, unknown>)) {\n const props = (node as { props?: { children?: ReactNode } }).props;\n return extractText(props?.children);\n }\n return '';\n};\n\n/**\n * AMS FilterSelect — a Select preset for dashboard filters.\n *\n * Ports mf-boveda's FilterSelect: accent-insensitive search over both the\n * option label and value, full-width by default. i18n is the consumer's\n * responsibility (pass already-translated labels).\n */\nexport function FilterSelect({\n options,\n showSearch = false,\n filterOption,\n className,\n style,\n ...rest\n}: FilterSelectProps) {\n const defaultFilter: SelectProps<string>['filterOption'] = (input, option) => {\n if (!option) return false;\n const query = normalize(input);\n const label = normalize(extractText(option.label as ReactNode));\n const value = normalize(typeof option.value === 'string' ? option.value : '');\n return label.includes(query) || value.includes(query);\n };\n\n const resolvedFilter = showSearch && !filterOption ? defaultFilter : filterOption;\n\n return (\n <Select<string>\n options={options}\n showSearch={showSearch}\n filterOption={resolvedFilter}\n optionFilterProp=\"label\"\n className={className}\n style={{ width: '100%', ...style }}\n {...rest}\n />\n );\n}\n","import { Upload } from 'antd';\nimport type { UploadProps } from 'antd';\nimport { InboxOutlined } from '@ant-design/icons';\nimport { useMemo, type ReactNode } from 'react';\nimport { useAmsMessage } from '../message/useAmsMessage';\n\ntype UploadMessage = string | ((fileName: string) => string);\ntype UploadChangeInfo = Parameters<NonNullable<UploadProps['onChange']>>[0];\n\nexport interface FileUploadDraggerProps\n extends Omit<UploadProps, 'onChange'> {\n /** Success toast text or a builder receiving the file name. */\n successMessage?: UploadMessage;\n /** Error toast text or a builder receiving the file name. */\n errorMessage?: UploadMessage;\n /** Show success/error toasts on upload status changes. Default true. */\n showStatusMessages?: boolean;\n /** Prompt text shown inside the drop area (when no children given). */\n hintText?: ReactNode;\n onUploadSuccess?: (info: UploadChangeInfo) => void;\n onUploadError?: (info: UploadChangeInfo) => void;\n onChange?: UploadProps['onChange'];\n children?: ReactNode;\n}\n\nconst resolveMessage = (\n template: UploadMessage | undefined,\n fileName: string,\n fallback: string,\n): string => {\n if (!template) return fallback.replace('{file}', fileName);\n return typeof template === 'function' ? template(fileName) : template.replace('{file}', fileName);\n};\n\n/**\n * AMS FileUploadDragger — drag-and-drop uploader.\n *\n * Ports mf-boveda's FileUploadDragger with two DS improvements:\n * - toasts use the context-safe `useAmsMessage()` (no antd v5 static warning),\n * - all copy is passed via props (i18n stays in the consumer); no default\n * upload endpoint is baked in.\n */\nexport function FileUploadDragger({\n successMessage,\n errorMessage,\n showStatusMessages = true,\n hintText = 'Click or drag a file to this area to upload',\n onUploadSuccess,\n onUploadError,\n onChange: externalOnChange,\n children,\n ...uploadProps\n}: FileUploadDraggerProps) {\n const message = useAmsMessage();\n\n const mergedProps = useMemo<UploadProps>(\n () => ({\n ...uploadProps,\n onChange(info) {\n const { status, name: fileName } = info.file;\n if (showStatusMessages) {\n if (status === 'done') {\n message.success(resolveMessage(successMessage, fileName, `${fileName} uploaded successfully.`));\n onUploadSuccess?.(info);\n } else if (status === 'error') {\n message.error(resolveMessage(errorMessage, fileName, `${fileName} failed to upload.`));\n onUploadError?.(info);\n }\n }\n externalOnChange?.(info);\n },\n }),\n [uploadProps, showStatusMessages, message, successMessage, errorMessage, onUploadSuccess, onUploadError, externalOnChange],\n );\n\n return (\n <Upload.Dragger {...mergedProps}>\n {children ?? (\n <>\n <p className=\"ant-upload-drag-icon\">\n <InboxOutlined />\n </p>\n <p className=\"ant-upload-text\">{hintText}</p>\n </>\n )}\n </Upload.Dragger>\n );\n}\n","import { Breadcrumb } from 'antd';\nimport type { BreadcrumbProps } from 'antd';\nimport type { ReactNode } from 'react';\n\nexport interface BreadcrumbItem {\n title: ReactNode;\n href?: string;\n}\n\nexport interface PageHeaderProps {\n /** Page title. Rendered as an h1. */\n title: ReactNode;\n /** Breadcrumb trail. When omitted, no breadcrumb is shown. */\n breadcrumbs?: BreadcrumbItem[];\n /** Breadcrumb separator. Defaults to \">\". */\n separator?: ReactNode;\n /** Uppercase the title (matches the b2bmx convention). Default true. */\n uppercaseTitle?: boolean;\n /** Content aligned to the right of the title (actions). */\n extra?: ReactNode;\n className?: string;\n}\n\n/**\n * AMS PageHeader — page title with an optional breadcrumb.\n *\n * Consolidates mf-boveda's Header + Breadcrums. Decoupled from react-router\n * and the boveda domain: the consumer builds the breadcrumb items (already\n * translated) and passes them in.\n */\nexport function PageHeader({\n title,\n breadcrumbs,\n separator = '>',\n uppercaseTitle = true,\n extra,\n className,\n}: PageHeaderProps) {\n return (\n <div className={className} style={{ marginBottom: 32 }}>\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 16,\n }}\n >\n <h1\n style={{\n fontSize: 20,\n fontWeight: 700,\n margin: 0,\n textTransform: uppercaseTitle ? 'uppercase' : undefined,\n }}\n >\n {title}\n </h1>\n {extra ? <div>{extra}</div> : null}\n </div>\n {breadcrumbs && breadcrumbs.length > 0 ? (\n <Breadcrumb\n separator={separator}\n items={breadcrumbs as BreadcrumbProps['items']}\n style={{ fontSize: 13, marginTop: 8 }}\n />\n ) : null}\n </div>\n );\n}\n","import { DownloadOutlined } from '@ant-design/icons';\nimport { forwardRef } from 'react';\nimport { Button } from '../Button';\nimport type { ButtonProps } from '../Button';\n\nexport interface DownloadButtonProps extends ButtonProps {\n /** Button label. Defaults to \"CSV\". */\n label?: React.ReactNode;\n}\n\n/**\n * AMS DownloadButton — a Button preset for download actions.\n *\n * Ports mf-boveda's DownloadButton: primary type + download icon + label,\n * with the full Button API available. i18n via the `label`/`children` props.\n */\nexport const DownloadButton = forwardRef<\n HTMLButtonElement | HTMLAnchorElement,\n DownloadButtonProps\n>(function DownloadButton({ label = 'CSV', icon, type = 'primary', children, ...rest }, ref) {\n return (\n <Button ref={ref} type={type} icon={icon ?? <DownloadOutlined />} {...rest}>\n {children ?? label}\n </Button>\n );\n});\n","import type { ReactNode } from 'react';\nimport { ModalDialog } from '../ModalDialog';\nimport type { ModalDialogProps } from '../ModalDialog';\n\nexport interface ConfirmModalProps\n extends Omit<ModalDialogProps, 'children'> {\n /** Body message shown to the user. */\n message?: ReactNode;\n /** Mark the confirm action as destructive (red primary button). */\n danger?: boolean;\n children?: ReactNode;\n}\n\n/**\n * AMS ConfirmModal — a confirm/cancel dialog preset built on `ModalDialog`.\n *\n * Generalizes the mf-boveda cancel/confirm modals (CancelCfdiModal, etc.):\n * inherits controlled/uncontrolled state, trigger, and async `onOk` from\n * ModalDialog. Set `danger` for destructive actions. Copy via props (i18n).\n */\nexport function ConfirmModal({\n message,\n danger = false,\n okButtonProps,\n children,\n ...rest\n}: ConfirmModalProps) {\n return (\n <ModalDialog\n okButtonProps={{ danger, ...okButtonProps }}\n {...rest}\n >\n {children ?? (message ? <p>{message}</p> : null)}\n </ModalDialog>\n );\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@amsintegra/design-system",
3
- "version": "1.1.0",
3
+ "version": "1.1.2",
4
4
  "description": "AMS Integra Design System — React components built on Ant Design v6 with the B2BMX (Metronic) theme.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -49,9 +49,10 @@
49
49
  "test:pilot": "vitest run --config vitest.pilot.config.ts",
50
50
  "test:all": "npm run test && npm run test:pilot",
51
51
  "typecheck": "tsc --noEmit",
52
+ "typecheck:consumer": "node scripts/check-card-jsx-type.mjs",
52
53
  "storybook": "storybook dev -p 6006",
53
54
  "build-storybook": "storybook build",
54
- "prepublishOnly": "npm run typecheck && npm run test:all && npm run build",
55
+ "prepublishOnly": "npm run typecheck && npm run test:all && npm run build && npm run typecheck:consumer",
55
56
  "pack:tarball": "npm run build && npm pack"
56
57
  },
57
58
  "peerDependencies": {