@amsintegra/design-system 1.0.0 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +38 -0
- package/README.md +10 -7
- package/dist/index.cjs.map +1 -1
- package/dist/index.js.map +1 -1
- package/llms.txt +5 -5
- package/package.json +13 -12
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,44 @@ 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.0] - 2026-09-28
|
|
9
|
+
|
|
10
|
+
Migrated the design system to **Ant Design v6** and widened React support to
|
|
11
|
+
18, 19 and 20.
|
|
12
|
+
|
|
13
|
+
### Changed
|
|
14
|
+
|
|
15
|
+
- **Ant Design v5 → v6.** The theme layer, all component wrappers, and the
|
|
16
|
+
composites now build on antd 6 (installed `antd@6.6.5`). antd 6 uses CSS
|
|
17
|
+
variables by default and requires React >= 18.
|
|
18
|
+
- **Peer dependencies:**
|
|
19
|
+
- `antd`: `^5.28.0` → `^6.0.0`
|
|
20
|
+
- `@ant-design/icons`: `^5.6.1` → `^6.0.0` (icons 6 is required by antd 6 and
|
|
21
|
+
is not compatible with antd 5; they move together).
|
|
22
|
+
- `react` / `react-dom`: `^18.3.1` → `>=18` (supports React 18, 19 and 20).
|
|
23
|
+
- Build/dev toolchain now targets React 19 (`@types/react` / `@types/react-dom`
|
|
24
|
+
bumped to `^19`).
|
|
25
|
+
- `ModalDialog` `onCancel` handler widened to accept
|
|
26
|
+
`MouseEvent | KeyboardEvent`, matching antd 6's Modal signature.
|
|
27
|
+
- Replaced the removed `rc-pagination` type import with the public
|
|
28
|
+
`antd/es/pagination/Pagination` type in `Pagination` and `DataTable`.
|
|
29
|
+
|
|
30
|
+
### Fixed
|
|
31
|
+
|
|
32
|
+
- Test environment updated for antd 6: added a `ResizeObserver` polyfill
|
|
33
|
+
(antd 6 uses it across many components) and adapted `Tag` color assertions to
|
|
34
|
+
antd 6's CSS-variable model (a custom color is applied as the tag's text
|
|
35
|
+
color with a derived soft background, rather than an inline background).
|
|
36
|
+
|
|
37
|
+
### Notes
|
|
38
|
+
|
|
39
|
+
- **`BackTop`** is deprecated in antd 6 (removal planned for v7) but still works;
|
|
40
|
+
the re-export is unchanged. Re-implementing it over `FloatButton.BackTop` is a
|
|
41
|
+
future v7-readiness task.
|
|
42
|
+
- Consumer-facing antd prop deprecations (e.g. `bordered`→`variant`,
|
|
43
|
+
`dropdownRender`→`popupRender`) are not rewritten by the design system; they
|
|
44
|
+
surface as warnings in consumer code and follow antd's own migration guide.
|
|
45
|
+
|
|
8
46
|
## [1.0.0] - 2026-09-23
|
|
9
47
|
|
|
10
48
|
First public release of the AMS Integra Design System, published to npm as
|
package/README.md
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
# @amsintegra/design-system
|
|
2
2
|
|
|
3
|
-
Sistema de diseño de React para la plataforma B2BMX de AMS Integra. Está construido sobre **Ant Design
|
|
3
|
+
Sistema de diseño de React para la plataforma B2BMX de AMS Integra. Está construido sobre **Ant Design v6** con el tema de marca **Metronic** (primario `#A72432`, tipografía Inter, base de 13px) e incluye **Storybook** para explorar y documentar cada componente.
|
|
4
4
|
|
|
5
|
-
Cubre **todos los componentes de Ant Design
|
|
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
7
|
## Requisitos
|
|
8
8
|
|
|
9
9
|
- Node.js >= 18
|
|
10
|
-
- React 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).
|
|
11
11
|
|
|
12
12
|
## Instalación
|
|
13
13
|
|
|
@@ -32,9 +32,12 @@ Si tu gestor no resuelve los peers de forma automática (por ejemplo con un
|
|
|
32
32
|
conflicto de versiones), instalálos explícitamente:
|
|
33
33
|
|
|
34
34
|
```bash
|
|
35
|
-
npm install antd @ant-design/icons dayjs react react-dom
|
|
35
|
+
npm install antd@^6 @ant-design/icons@^6 dayjs react react-dom
|
|
36
36
|
```
|
|
37
37
|
|
|
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.
|
|
40
|
+
|
|
38
41
|
## Uso
|
|
39
42
|
|
|
40
43
|
Envuelve la app una sola vez en la raíz con `AmsConfigProvider` (aplica el tema y el contexto de antd `App` para `message`/`notification`/`Modal`):
|
|
@@ -64,7 +67,7 @@ Modo oscuro:
|
|
|
64
67
|
<AmsConfigProvider mode="dark">…</AmsConfigProvider>
|
|
65
68
|
```
|
|
66
69
|
|
|
67
|
-
Toasts context-safe (sin el warning de método estático de antd
|
|
70
|
+
Toasts context-safe (sin el warning de método estático de antd):
|
|
68
71
|
|
|
69
72
|
```tsx
|
|
70
73
|
import { useAmsMessage } from '@amsintegra/design-system';
|
|
@@ -78,7 +81,7 @@ function Guardar() {
|
|
|
78
81
|
## Qué incluye
|
|
79
82
|
|
|
80
83
|
- **Tema**: `AmsConfigProvider`, `buildTheme`, tokens de Metronic (`primitives`, `semantic`, `radius`, `typography`, `sizing`).
|
|
81
|
-
- **Todos los componentes de antd
|
|
84
|
+
- **Todos los componentes de antd v6** como re-exports tipados (General, Layout, Navigation, Data Entry, Data Display, Feedback y otros).
|
|
82
85
|
- **Composites AMS**: `DataTable`, `ModalDialog`, `FilterSelect`, `FileUploadDragger`, `PageHeader`, `DownloadButton`, `ConfirmModal`.
|
|
83
86
|
- **Hooks**: `useAmsMessage`, `useAmsNotification`, `useControllableState`.
|
|
84
87
|
|
|
@@ -181,7 +184,7 @@ El historial de versiones está en [`CHANGELOG.md`](./CHANGELOG.md).
|
|
|
181
184
|
## Estado
|
|
182
185
|
|
|
183
186
|
- ✅ Tema (light + dark, tokens Metronic)
|
|
184
|
-
- ✅ Cobertura completa de componentes antd
|
|
187
|
+
- ✅ Cobertura completa de componentes antd v6 + composites AMS
|
|
185
188
|
- ✅ Storybook con story por componente y un piloto (`Pilot/Consulta de Facturas`)
|
|
186
189
|
- ✅ Empaquetado listo para publicar (`@amsintegra/design-system`)
|
|
187
190
|
|
package/dist/index.cjs.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","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 'rc-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 'rc-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} 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>) => {\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/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"]}
|
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":";;;;;;;;;;AAaO,IAAM,UAAA,GAAa;AAAA,EACxB,QAAA,EAAU,SAAA;AAAA,EACV,cAAA,EAAgB,SAAA;AAAA;AAAA,EAChB,aAAA,EAAe,SAAA;AAAA,EAEf,KAAA,EAAO,SAAA;AAAA,EACP,WAAA,EAAa,SAAA;AAAA,EACb,UAAA,EAAY,SAAA;AAAA,EAEZ,MAAA,EAAQ,SAAA;AAAA,EACR,YAAA,EAAc,SAAA;AAAA,EACd,WAAA,EAAa,SAAA;AAAA,EAEb,IAAA,EAAM,SAAA;AAAA,EACN,UAAA,EAAY,SAAA;AAAA,EACZ,SAAA,EAAW,SAAA;AAAA,EAEX,MAAA,EAAQ,SAAA;AAAA,EACR,YAAA,EAAc,SAAA;AAAA,EACd,WAAA,EAAa,SAAA;AAAA,EAEb,KAAA,EAAO,SAAA;AAAA,EAEP,IAAA,EAAM;AAAA,IACJ,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK;AAAA,GACP;AAAA,EAEA,UAAA,EAAY;AAAA,IACV,GAAA,EAAK,SAAA;AAAA,IACL,IAAA,EAAM,SAAA;AAAA,IACN,OAAA,EAAS,SAAA;AAAA,IACT,QAAA,EAAU;AAAA,GACZ;AAAA,EAEA,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,SAAA;AAAA,IACN,EAAA,EAAI,SAAA;AAAA,IACJ,MAAA,EAAQ,SAAA;AAAA,IACR,MAAA,EAAQ,SAAA;AAAA,IACR,SAAA,EAAW,SAAA;AAAA;AAAA,IAEX,OAAA,EAAS,SAAA;AAAA,IACT,MAAA,EAAQ,SAAA;AAAA;AAAA,IAER,IAAA,EAAM;AAAA,MACJ,GAAA,EAAK,SAAA;AAAA,MACL,GAAA,EAAK,SAAA;AAAA,MACL,GAAA,EAAK,SAAA;AAAA,MACL,GAAA,EAAK,SAAA;AAAA,MACL,GAAA,EAAK,SAAA;AAAA,MACL,GAAA,EAAK,SAAA;AAAA,MACL,GAAA,EAAK,SAAA;AAAA,MACL,GAAA,EAAK;AAAA;AACP;AAEJ;AAGO,IAAM,MAAA,GAAS;AAAA,EACpB,EAAA,EAAI,CAAA;AAAA,EACJ,IAAA,EAAM,CAAA;AAAA,EACN,EAAA,EAAI,CAAA;AAAA,EACJ,EAAA,EAAI,CAAA;AAAA,EACJ,EAAA,EAAI;AACN;AAGO,IAAM,UAAA,GAAa;AAAA,EACxB,UAAA,EAAY,qCAAA;AAAA,EACZ,YAAA,EAAc,EAAA;AAAA,EACd,MAAA,EAAQ;AAAA,IACN,KAAA,EAAO,GAAA;AAAA,IACP,MAAA,EAAQ,GAAA;AAAA,IACR,MAAA,EAAQ,GAAA;AAAA,IACR,QAAA,EAAU,GAAA;AAAA,IACV,IAAA,EAAM;AAAA;AAEV;AAGO,IAAM,MAAA,GAAS;AAAA,EACpB,aAAA,EAAe,EAAA;AAAA,EACf,cAAA,EAAgB;AAClB;AAMO,IAAM,QAAA,GAAW;AAAA,EACtB,cAAc,UAAA,CAAW,QAAA;AAAA,EACzB,oBAAoB,UAAA,CAAW,cAAA;AAAA,EAC/B,cAAc,UAAA,CAAW,KAAA;AAAA,EACzB,WAAW,UAAA,CAAW,MAAA;AAAA,EACtB,YAAY,UAAA,CAAW,IAAA;AAAA,EACvB,cAAc,UAAA,CAAW,MAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMzB,SAAA,EAAW,UAAA,CAAW,IAAA,CAAK,GAAG,CAAA;AAAA,EAC9B,gBAAgB,UAAA,CAAW,QAAA;AAAA,EAC3B,iBAAiB,UAAA,CAAW,cAAA;AAAA,EAE5B,aAAA,EAAe,WAAW,UAAA,CAAW,GAAA;AAAA,EACrC,gBAAA,EAAkB,WAAW,UAAA,CAAW,IAAA;AAAA,EAExC,cAAc,MAAA,CAAO,IAAA;AAAA,EACrB,YAAY,UAAA,CAAW,UAAA;AAAA,EACvB,UAAU,UAAA,CAAW,YAAA;AAAA,EACrB,eAAe,MAAA,CAAO;AACxB;;;AC7HA,IAAM,WAAA,GAAoC;AAAA,EACxC,cAAc,QAAA,CAAS,YAAA;AAAA,EACvB,cAAc,QAAA,CAAS,YAAA;AAAA,EACvB,WAAW,QAAA,CAAS,SAAA;AAAA,EACpB,YAAY,QAAA,CAAS,UAAA;AAAA,EACrB,cAAc,QAAA,CAAS,YAAA;AAAA,EACvB,WAAW,QAAA,CAAS,SAAA;AAAA,EACpB,gBAAgB,QAAA,CAAS,cAAA;AAAA,EACzB,iBAAiB,QAAA,CAAS,eAAA;AAAA,EAC1B,cAAc,QAAA,CAAS,YAAA;AAAA,EACvB,YAAY,QAAA,CAAS,UAAA;AAAA,EACrB,UAAU,QAAA,CAAS,QAAA;AAAA,EACnB,eAAe,QAAA,CAAS;AAC1B,CAAA;AAGA,IAAM,UAAA,GAAmC;AAAA,EACvC,GAAG,WAAA;AAAA,EACH,eAAe,QAAA,CAAS,aAAA;AAAA,EACxB,kBAAkB,QAAA,CAAS,gBAAA;AAAA,EAC3B,eAAA,EAAiB,WAAW,UAAA,CAAW,IAAA;AAAA,EACvC,SAAA,EAAW,UAAA,CAAW,IAAA,CAAK,GAAG,CAAA;AAAA,EAC9B,kBAAA,EAAoB,UAAA,CAAW,IAAA,CAAK,GAAG,CAAA;AAAA,EACvC,iBAAA,EAAmB,UAAA,CAAW,IAAA,CAAK,GAAG,CAAA;AAAA,EACtC,mBAAA,EAAqB,UAAA,CAAW,IAAA,CAAK,GAAG,CAAA;AAAA,EACxC,WAAA,EAAa,UAAA,CAAW,IAAA,CAAK,GAAG,CAAA;AAAA,EAChC,oBAAA,EAAsB,UAAA,CAAW,IAAA,CAAK,GAAG;AAC3C,CAAA;AAMA,IAAM,SAAA,GAAkC;AAAA,EACtC,GAAG,WAAA;AAAA,EACH,aAAA,EAAe,WAAW,UAAA,CAAW,OAAA;AAAA,EACrC,gBAAA,EAAkB,WAAW,UAAA,CAAW,QAAA;AAAA,EACxC,eAAA,EAAiB,WAAW,UAAA,CAAW,QAAA;AAAA,EACvC,SAAA,EAAW,SAAA;AAAA,EACX,gBAAA,EAAkB,SAAA;AAAA,EAClB,kBAAA,EAAoB,UAAA,CAAW,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA;AAAA,EAC5C,iBAAA,EAAmB,UAAA,CAAW,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA;AAAA,EAC3C,mBAAA,EAAqB,UAAA,CAAW,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA;AAAA,EAC7C,WAAA,EAAa,UAAA,CAAW,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA;AAAA,EACrC,oBAAA,EAAsB,UAAA,CAAW,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA;AAAA,EAC9C,SAAA,EACE;AACJ,CAAA;AAGA,IAAM,gBAAA,GAA8C;AAAA,EAClD,MAAA,EAAQ,EAAE,aAAA,EAAe,EAAA,EAAG;AAAA,EAC5B,IAAA,EAAM;AAAA,IACJ,SAAA,EAAW,UAAA,CAAW,IAAA,CAAK,GAAG,CAAA;AAAA,IAC9B,mBAAmB,QAAA,CAAS,YAAA;AAAA,IAC5B,gBAAgB,QAAA,CAAS;AAAA;AAE7B,CAAA;AAGA,IAAM,eAAA,GAA6C;AAAA,EACjD,GAAG,gBAAA;AAAA,EACH,KAAA,EAAO;AAAA,IACL,QAAA,EAAU,UAAA,CAAW,IAAA,CAAK,GAAG,CAAA;AAAA,IAC7B,WAAA,EAAa,UAAA,CAAW,IAAA,CAAK,GAAG,CAAA;AAAA,IAChC,WAAA,EAAa,UAAA,CAAW,IAAA,CAAK,GAAG,CAAA;AAAA,IAChC,gBAAA,EAAkB,CAAA;AAAA,IAClB,iBAAA,EAAmB;AAAA;AAEvB,CAAA;AAGA,IAAM,cAAA,GAA4C;AAAA,EAChD,GAAG,gBAAA;AAAA,EACH,KAAA,EAAO;AAAA,IACL,QAAA,EAAU,UAAA,CAAW,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA;AAAA,IAClC,WAAA,EAAa,UAAA,CAAW,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA;AAAA,IACrC,WAAA,EAAa,UAAA,CAAW,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA;AAAA,IACrC,UAAA,EAAY,UAAA,CAAW,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA;AAAA,IACpC,gBAAA,EAAkB,CAAA;AAAA,IAClB,iBAAA,EAAmB;AAAA,GACrB;AAAA,EACA,KAAA,EAAO;AAAA,IACL,gBAAA,EAAkB,WAAW,IAAA,CAAK,OAAA;AAAA,IAClC,WAAA,EAAa,UAAA,CAAW,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA;AAAA,IACrC,SAAA,EAAW;AAAA,GACb;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,gBAAA,EAAkB,WAAW,IAAA,CAAK,OAAA;AAAA,IAClC,WAAA,EAAa,UAAA,CAAW,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA;AAAA,IACrC,SAAA,EAAW;AAAA,GACb;AAAA,EACA,UAAA,EAAY;AAAA,IACV,gBAAA,EAAkB,WAAW,IAAA,CAAK;AAAA,GACpC;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,gBAAA,EAAkB,WAAW,IAAA,CAAK,MAAA;AAAA,IAClC,oBAAA,EAAsB,WAAW,IAAA,CAAK;AAAA,GACxC;AAAA,EACA,KAAA,EAAO;AAAA,IACL,SAAA,EAAW,UAAA,CAAW,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA;AAAA,IACnC,QAAA,EAAU,UAAA,CAAW,IAAA,CAAK,IAAA,CAAK,GAAG;AAAA,GACpC;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,eAAA,EAAiB,UAAA,CAAW,IAAA,CAAK,IAAA,CAAK,GAAG;AAAA,GAC3C;AAAA,EACA,YAAA,EAAc;AAAA,IACZ,eAAA,EAAiB,UAAA,CAAW,IAAA,CAAK,IAAA,CAAK,GAAG;AAAA,GAC3C;AAAA,EACA,OAAA,EAAS;AAAA,IACP,SAAA,EAAW,UAAA,CAAW,IAAA,CAAK,IAAA,CAAK,GAAG;AAAA,GACrC;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,MAAA,EAAQ,WAAW,UAAA,CAAW,QAAA;AAAA,IAC9B,WAAA,EAAa,UAAA,CAAW,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA;AAAA,IACrC,cAAA,EAAgB,WAAW,IAAA,CAAK,MAAA;AAAA,IAChC,mBAAmB,QAAA,CAAS,YAAA;AAAA,IAC5B,YAAA,EAAc,WAAW,IAAA,CAAK,MAAA;AAAA,IAC9B,aAAA,EAAe,WAAW,UAAA,CAAW;AAAA,GACvC;AAAA,EACA,QAAA,EAAU;AAAA,IACR,eAAA,EAAiB,WAAW,UAAA,CAAW,QAAA;AAAA,IACvC,kBAAA,EAAoB,UAAA,CAAW,IAAA,CAAK,IAAA,CAAK,GAAG;AAAA;AAEhD,CAAA;AAMO,SAAS,UAAA,CAAW,OAAkB,OAAA,EAAsB;AACjE,EAAA,MAAM,SAAS,IAAA,KAAS,MAAA;AACxB,EAAA,OAAO;AAAA,IACL,SAAA,EAAW,MAAA,GAASA,KAAA,CAAU,aAAA,GAAgBA,KAAA,CAAU,gBAAA;AAAA,IACxD,KAAA,EAAO,SAAS,SAAA,GAAY,UAAA;AAAA,IAC5B,UAAA,EAAY,SAAS,cAAA,GAAiB;AAAA,GACxC;AACF;AAGO,IAAM,QAAA,GAAwB,WAAW,OAAO;AAGhD,IAAM,YAAA,GAA4B,WAAW,MAAM;AC7I1D,IAAM,WAAA,GAAc,WAAA;AAGb,SAAS,mBAAA,CAAoB,cAAyB,OAAA,EAAoB;AAC/E,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,EAAa,OAAO,WAAA;AAC1C,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,YAAA,CAAa,OAAA,CAAQ,WAAW,CAAA;AACrD,EAAA,IAAI,KAAA,KAAU,OAAA,IAAW,KAAA,KAAU,MAAA,EAAQ,OAAO,KAAA;AAClD,EAAA,IAAI,MAAA,CAAO,UAAA,GAAa,8BAA8B,CAAA,CAAE,SAAS,OAAO,MAAA;AACxE,EAAA,OAAO,WAAA;AACT;AAGO,SAAS,oBAAoB,IAAA,EAAuB;AACzD,EAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AACrC,EAAA,QAAA,CAAS,eAAA,CAAgB,YAAA,CAAa,YAAA,EAAc,IAAI,CAAA;AACxD,EAAA,QAAA,CAAS,IAAA,EAAM,YAAA,CAAa,YAAA,EAAc,IAAI,CAAA;AAChD;AASO,IAAM,gBAAA,GAAmB,cAA4C,IAAI,CAAA;AASzE,SAAS,YAAA,GAAsC;AACpD,EAAA,MAAM,GAAA,GAAM,WAAW,gBAAgB,CAAA;AACvC,EAAA,IAAI,CAAC,GAAA,EAAK;AACR,IAAA,MAAM,IAAI,MAAM,uDAAuD,CAAA;AAAA,EACzE;AACA,EAAA,OAAO,GAAA;AACT;AAOO,SAAS,iBAAA,CACd,cAAA,EACA,WAAA,EACA,OAAA,EACuB;AACvB,EAAA,MAAM,eAAe,cAAA,KAAmB,MAAA;AACxC,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAI,QAAA;AAAA,IAAoB,MAC1D,YAAA,GAAe,cAAA,GAAiB,OAAA,GAAU,mBAAA,CAAoB,WAAW,CAAA,GAAI;AAAA,GAC/E;AAEA,EAAA,MAAM,IAAA,GAAO,eAAe,cAAA,GAAiB,YAAA;AAE7C,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,mBAAA,CAAoB,IAAI,CAAA;AAAA,EAC1B,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAET,EAAA,MAAM,OAAA,GAAU,WAAA;AAAA,IACd,CAAC,IAAA,KAAoB;AACnB,MAAA,IAAI,CAAC,YAAA,EAAc;AACjB,QAAA,eAAA,CAAgB,IAAI,CAAA;AACpB,QAAA,IAAI,OAAA,IAAW,OAAO,MAAA,KAAW,WAAA,EAAa;AAC5C,UAAA,MAAA,CAAO,YAAA,CAAa,OAAA,CAAQ,WAAA,EAAa,IAAI,CAAA;AAAA,QAC/C;AAAA,MACF;AAAA,IACF,CAAA;AAAA,IACA,CAAC,cAAc,OAAO;AAAA,GACxB;AAEA,EAAA,MAAM,MAAA,GAAS,YAAY,MAAM;AAC/B,IAAA,OAAA,CAAQ,IAAA,KAAS,OAAA,GAAU,MAAA,GAAS,OAAO,CAAA;AAAA,EAC7C,CAAA,EAAG,CAAC,IAAA,EAAM,OAAO,CAAC,CAAA;AAElB,EAAA,OAAO,OAAA;AAAA,IACL,OAAO,EAAE,IAAA,EAAM,SAAS,MAAA,EAAQ,MAAA,EAAQ,SAAS,MAAA,EAAO,CAAA;AAAA,IACxD,CAAC,IAAA,EAAM,OAAA,EAAS,MAAM;AAAA,GACxB;AACF;AC5DA,SAAS,UAAA,CAAW,MAAmB,QAAA,EAAqC;AAC1E,EAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AACtB,EAAA,OAAO;AAAA,IACL,GAAG,IAAA;AAAA,IACH,GAAG,QAAA;AAAA,IACH,OAAO,EAAE,GAAG,KAAK,KAAA,EAAO,GAAG,SAAS,KAAA,EAAM;AAAA,IAC1C,YAAY,EAAE,GAAG,KAAK,UAAA,EAAY,GAAG,SAAS,UAAA,EAAW;AAAA;AAAA,IAEzD,SAAA,EAAW,QAAA,CAAS,SAAA,IAAa,IAAA,CAAK;AAAA,GACxC;AACF;AAcO,SAAS,iBAAA,CAAkB;AAAA,EAChC,IAAA;AAAA,EACA,WAAA,GAAc,OAAA;AAAA,EACd,WAAA,GAAc,IAAA;AAAA,EACd,MAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF,CAAA,EAA8C;AAC5C,EAAA,MAAM,SAAA,GAAY,iBAAA,CAAkB,IAAA,EAAM,WAAA,EAAa,WAAW,CAAA;AAClE,EAAA,MAAM,gBAAgB,UAAA,CAAW,UAAA,CAAW,SAAA,CAAU,IAAI,GAAG,KAAK,CAAA;AAElE,EAAA,uBACE,GAAA,CAAC,gBAAA,CAAiB,QAAA,EAAjB,EAA0B,OAAO,SAAA,EAChC,QAAA,kBAAA,GAAA,CAAC,cAAA,EAAA,EAAe,KAAA,EAAO,eAAe,MAAA,EACpC,QAAA,kBAAA,GAAA,CAAC,GAAA,EAAA,EAAK,QAAA,EAAS,GACjB,CAAA,EACF,CAAA;AAEJ;AChEO,IAAM,MAAA,GAAS,UAAA;AAAA,EACpB,SAASC,OAAAA,CAAO,KAAA,EAAO,GAAA,EAAK;AAC1B,IAAA,uBAAOC,GAAAA,CAACC,QAAA,EAAA,EAAU,GAAA,EAAW,GAAG,KAAA,EAAO,CAAA;AAAA,EACzC;AACF;ACEA,IAAM,YAAA,GAA0C;AAAA,EAC9C,SAAS,QAAA,CAAS,YAAA;AAAA,EAClB,OAAO,QAAA,CAAS,UAAA;AAAA,EAChB,SAAS,QAAA,CAAS,YAAA;AAAA,EAClB,MAAM,QAAA,CAAS,SAAA;AAAA,EACf,SAAS,QAAA,CAAS;AACpB,CAAA;AAMO,IAAM,GAAA,GAAMC,UAAAA,CAAsC,SAASC,IAAAA,CAChE,EAAE,QAAQ,KAAA,EAAO,GAAG,IAAA,EAAK,EACzB,GAAA,EACA;AACA,EAAA,MAAM,aAAA,GAAgB,MAAA,GAAS,YAAA,CAAa,MAAM,CAAA,GAAI,KAAA;AACtD,EAAA,uBAAOH,GAAAA,CAACI,KAAA,EAAA,EAAO,KAAU,KAAA,EAAO,aAAA,EAAgB,GAAG,IAAA,EAAM,CAAA;AAC3D,CAAC;AClBM,SAAS,aAAA,GAAiC;AAC/C,EAAA,OAAOC,GAAAA,CAAI,QAAO,CAAE,OAAA;AACtB;ACLO,SAAS,kBAAA,GAA2C;AACzD,EAAA,OAAOA,GAAAA,CAAI,QAAO,CAAE,YAAA;AACtB;ACwCA,SAAS,YAAY,MAAA,EAAyD;AAC5E,EAAA,IAAI,CAAC,QAAQ,OAAO,MAAA;AACpB,EAAA,MAAM,SAA2B,EAAC;AAClC,EAAA,IAAI,MAAA,CAAO,YAAA,KAAiB,MAAA,EAAW,MAAA,CAAO,iBAAiB,MAAA,CAAO,YAAA;AACtE,EAAA,IAAI,MAAA,CAAO,MAAA,KAAW,MAAA,EAAW,MAAA,CAAO,UAAU,MAAA,CAAO,MAAA;AACzD,EAAA,IAAI,MAAA,CAAO,aAAA,KAAkB,MAAA,EAAW,MAAA,CAAO,kBAAkB,MAAA,CAAO,aAAA;AACxE,EAAA,IAAI,MAAA,CAAO,IAAA,KAAS,MAAA,EAAW,MAAA,CAAO,OAAO,MAAA,CAAO,IAAA;AACpD,EAAA,IAAI,MAAA,CAAO,QAAA,KAAa,MAAA,EAAW,MAAA,CAAO,YAAY,MAAA,CAAO,QAAA;AAC7D,EAAA,IAAI,MAAA,CAAO,QAAA,KAAa,MAAA,EAAW,MAAA,CAAO,YAAY,MAAA,CAAO,QAAA;AAC7D,EAAA,IAAI,MAAA,CAAO,QAAA,KAAa,MAAA,EAAW,MAAA,CAAO,YAAY,MAAA,CAAO,QAAA;AAC7D,EAAA,OAAO,OAAO,IAAA,CAAK,MAAM,CAAA,CAAE,MAAA,GAAS,IAAI,MAAA,GAAS,MAAA;AACnD;AASO,SAAS,UAAA,CAAW;AAAA,EACzB,MAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,MAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAoB;AAClB,EAAA,MAAM,eAAe,EAAE,GAAG,YAAY,MAAM,CAAA,EAAG,GAAG,MAAA,EAAO;AAEzD,EAAA,MAAM,oBACJ,SAAA,KACC,MAAA,EAAQ,KAAA,GACL,CAAC,OAAO,KAAA,KAAU,MAAA,CAAO,KAAA,CAAO,KAAA,EAAO,KAAK,CAAA,GAC5C,MAAA,EAAQ,SAAA,GACN,CAAC,OAAO,KAAA,KAAU;AAChB,IAAA,MAAM,EAAE,MAAA,EAAQ,MAAA,EAAQ,SAAA,KAAc,MAAA,CAAO,SAAA;AAC7C,IAAA,MAAM,MAAA,GAAS,SAAA,GAAY,CAAA,EAAG,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA,GAAK,MAAA,CAAO,KAAK,CAAA;AACnE,IAAA,OAAO,CAAC,QAAQ,MAAA,EAAQ,MAAM,EAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAAA,EAC1D,CAAA,GACA,MAAA,CAAA;AAER,EAAA,MAAM,kBAAA,GACJ,eACC,MAAA,EAAQ,YAAA,IAAgB,QAAQ,QAAA,GAC7B,CAAC,KAAA,EAAO,IAAA,EAAM,OAAA,KAAY;AACxB,IAAA,IAAI,SAAS,MAAA,IAAU,MAAA,EAAQ,YAAA,KAAiB,MAAA,SAAkB,MAAA,CAAO,YAAA;AACzE,IAAA,IAAI,SAAS,MAAA,IAAU,MAAA,EAAQ,QAAA,KAAa,MAAA,SAAkB,MAAA,CAAO,QAAA;AACrE,IAAA,OAAO,OAAA;AAAA,EACT,CAAA,GACA,MAAA,CAAA;AAEN,EAAA,uBACEL,GAAAA;AAAA,IAACM,YAAA;AAAA,IAAA;AAAA,MACE,GAAG,IAAA;AAAA,MACJ,QAAQ,MAAA,CAAO,IAAA,CAAK,YAAY,CAAA,CAAE,MAAA,GAAS,IAAI,YAAA,GAAe,MAAA;AAAA,MAC9D,SAAA,EAAW,iBAAA;AAAA,MACX,UAAA,EAAY;AAAA;AAAA,GACd;AAEJ;ACvGO,SAAS,YAAY,KAAA,EAAyB;AACnD,EAAA,MAAM,EAAE,MAAA,EAAQ,MAAA,EAAO,GAAI,YAAA,EAAa;AACxC,EAAA,uBACEN,GAAAA;AAAA,IAACO,MAAAA;AAAA,IAAA;AAAA,MACC,OAAA,EAAS,MAAA;AAAA,MACT,QAAA,EAAU,MAAA;AAAA,MACV,eAAA,kBAAiBP,GAAAA,CAAC,UAAA,EAAA,EAAW,CAAA;AAAA,MAC7B,iBAAA,kBAAmBA,GAAAA,CAAC,YAAA,EAAA,EAAa,CAAA;AAAA,MAChC,GAAG;AAAA;AAAA,GACN;AAEJ;ACJA,SAAS,sBAAsB,MAAA,EAAyD;AACtF,EAAA,IAAI,CAAC,QAAQ,OAAO,MAAA;AACpB,EAAA,MAAM,SAA2B,EAAC;AAClC,EAAA,IAAI,MAAA,CAAO,YAAA,KAAiB,MAAA,EAAW,MAAA,CAAO,iBAAiB,MAAA,CAAO,YAAA;AACtE,EAAA,IAAI,MAAA,CAAO,MAAA,KAAW,MAAA,EAAW,MAAA,CAAO,UAAU,MAAA,CAAO,MAAA;AACzD,EAAA,IAAI,MAAA,CAAO,aAAA,KAAkB,MAAA,EAAW,MAAA,CAAO,kBAAkB,MAAA,CAAO,aAAA;AACxE,EAAA,IAAI,MAAA,CAAO,IAAA,KAAS,MAAA,EAAW,MAAA,CAAO,OAAO,MAAA,CAAO,IAAA;AACpD,EAAA,IAAI,MAAA,CAAO,QAAA,KAAa,MAAA,EAAW,MAAA,CAAO,YAAY,MAAA,CAAO,QAAA;AAC7D,EAAA,IAAI,MAAA,CAAO,QAAA,KAAa,MAAA,EAAW,MAAA,CAAO,YAAY,MAAA,CAAO,QAAA;AAC7D,EAAA,IAAI,MAAA,CAAO,QAAA,KAAa,MAAA,EAAW,MAAA,CAAO,YAAY,MAAA,CAAO,QAAA;AAC7D,EAAA,OAAO,OAAO,IAAA,CAAK,MAAM,CAAA,CAAE,MAAA,GAAS,IAAI,MAAA,GAAS,MAAA;AACnD;AAEA,IAAM,cAAA,GAA4C;AAAA,EAChD,SAAA,EAAW,SAAA;AAAA,EACX,OAAA,EAAS,gBAAA;AAAA,EACT,QAAA,EAAU,iBAAA;AAAA,EACV,UAAA,EAAY;AACd,CAAA;AA6BA,SAAS,eAAe,KAAA,EAA+B;AACrD,EAAA,IAAI,UAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAI,OAAO,IAAA;AAClE,EAAA,MAAM,GAAA,GACJ,OAAO,KAAA,KAAU,QAAA,GAAW,UAAA,CAAW,KAAA,CAAM,OAAA,CAAQ,IAAA,EAAM,EAAE,CAAC,CAAA,GAAI,MAAA,CAAO,KAAK,CAAA;AAChF,EAAA,OAAO,MAAA,CAAO,MAAM,GAAG,CAAA,IAAK,CAAC,MAAA,CAAO,QAAA,CAAS,GAAG,CAAA,GAAI,IAAA,GAAO,GAAA;AAC7D;AAaA,SAAS,eAAe,MAAA,EAA2E;AACjG,EAAA,IAAI,CAAC,QAAQ,OAAO,MAAA;AACpB,EAAA,IAAI,MAAA,CAAO,OAAO,OAAO,CAAC,OAAO,KAAA,KAAU,MAAA,CAAO,KAAA,CAAO,KAAA,EAAO,KAAK,CAAA;AACrE,EAAA,IAAI,OAAO,SAAA,EAAW;AACpB,IAAA,OAAO,CAAC,OAAO,KAAA,KAAU;AACvB,MAAA,MAAM,EAAE,MAAA,EAAQ,MAAA,EAAQ,SAAA,KAAc,MAAA,CAAO,SAAA;AAC7C,MAAA,MAAM,MAAA,GAAS,SAAA,GAAY,CAAA,EAAG,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA,GAAK,MAAA,CAAO,KAAK,CAAA;AACnE,MAAA,OAAO,CAAC,QAAQ,MAAA,EAAQ,MAAM,EAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAAA,IAC1D,CAAA;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,gBAAgB,MAAA,EAA4E;AACnG,EAAA,IAAI,CAAC,MAAA,IAAW,MAAA,CAAO,iBAAiB,MAAA,IAAa,MAAA,CAAO,aAAa,MAAA,EAAY;AACnF,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,OAAO,CAAC,KAAA,EAAO,IAAA,EAAM,OAAA,KAAY;AAC/B,IAAA,IAAI,SAAS,MAAA,IAAU,MAAA,CAAO,YAAA,KAAiB,MAAA,SAAkB,MAAA,CAAO,YAAA;AACxE,IAAA,IAAI,SAAS,MAAA,IAAU,MAAA,CAAO,QAAA,KAAa,MAAA,SAAkB,MAAA,CAAO,QAAA;AACpE,IAAA,OAAO,OAAA;AAAA,EACT,CAAA;AACF;AAEO,SAAS,SAAA,CAAsD;AAAA,EACpE,OAAA;AAAA,EACA,KAAA;AAAA,EACA,OAAA,GAAU,KAAA;AAAA,EACV,MAAA;AAAA,EACA,gBAAA;AAAA,EACA,qBAAA,GAAwB,KAAA;AAAA,EACxB,OAAA;AAAA,EACA,UAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA,GAAW,IAAA;AAAA,EACX,UAAA;AAAA,EACA,SAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAsB;AACpB,EAAA,MAAM,YAAA,GAAe,EAAE,GAAG,cAAA,EAAgB,GAAG,MAAA,EAAO;AAIpD,EAAA,MAAM,qBACJ,UAAA,KAAe,KAAA,IAAS,UAAA,KAAe,MAAA,GACnC,cACC,MAAM;AACL,IAAA,MAAM,gBAAA,GAAmB,sBAAsB,gBAAgB,CAAA;AAC/D,IAAA,MAAM,OAAA,GAAU,eAAe,gBAAgB,CAAA;AAC/C,IAAA,MAAM,YAAA,GAAe,gBAAgB,gBAAgB,CAAA;AACrD,IAAA,OAAO;AAAA,MACL,GAAI,OAAA,GAAU,EAAE,SAAA,EAAW,OAAA,KAAY,EAAC;AAAA,MACxC,GAAI,YAAA,GAAe,EAAE,UAAA,EAAY,YAAA,KAAiB,EAAC;AAAA,MACnD,GAAI,gBAAA,GAAmB,EAAE,MAAA,EAAQ,gBAAA,KAAqB,EAAC;AAAA,MACvD,GAAG;AAAA,KACL;AAAA,EACF,CAAA,GAAG;AAET,EAAA,MAAM,eAAA,GACJ,qBAAA,IAAyB,OAAA,IAAW,OAAA,CAAQ,MAAA,GAAS,IACjD,OAAA,CAAQ,GAAA,CAAI,CAAC,GAAA,EAAK,KAAA,KAAU;AAC1B,IAAA,IAAI,KAAA,KAAU,GAAG,OAAO,GAAA;AACxB,IAAA,MAAM,iBACJ,GAAA,CACA,MAAA;AACF,IAAA,OAAO;AAAA,MACL,GAAG,GAAA;AAAA,MACH,MAAA,EAAQ,CAAC,KAAA,EAAgB,MAAA,EAAW,CAAA,KAAc;AAChD,QAAA,MAAM,UAAU,cAAA,GACZ,cAAA,CAAe,KAAA,EAAO,MAAA,EAAQ,CAAC,CAAA,GAC9B,KAAA;AACL,QAAA,MAAM,OAAA,GAAU,eAAe,KAAK,CAAA;AACpC,QAAA,IAAI,OAAA,KAAY,MAAM,OAAO,OAAA;AAC7B,QAAA,uBACEA,GAAAA;AAAA,UAAC,GAAA;AAAA,UAAA;AAAA,YACC,MAAA,EAAQ,OAAA,GAAU,CAAA,GAAI,OAAA,GAAU,SAAA;AAAA,YAChC,KAAA,EAAO,EAAE,QAAA,EAAU,EAAA,EAAI,WAAW,QAAA,EAAS;AAAA,YAE1C,QAAA,EAAA;AAAA;AAAA,SACH;AAAA,MAEJ;AAAA,KACF;AAAA,EACF,CAAC,CAAA,GACD,OAAA;AAEN,EAAA,MAAM,cAAA,GAAiB,MAAA,IAAU,EAAE,CAAA,EAAG,aAAA,EAAc;AAEpD,EAAA,uBACE,IAAA,CAAC,SAAI,SAAA,EACF,QAAA,EAAA;AAAA,IAAA,OAAA,mBACCA,IAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,YAAA,EAAc,CAAA,IAC1B,QAAA,kBAAAA,GAAAA,CAAC,QAAG,KAAA,EAAO,EAAE,QAAQ,CAAA,EAAG,UAAA,EAAY,KAAI,EAAI,QAAA,EAAA,OAAA,EAAQ,GACtD,CAAA,GACE,IAAA;AAAA,IACH,KAAA,mBAAQA,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,YAAA,EAAc,CAAA,EAAE,EAAI,QAAA,EAAA,KAAA,EAAM,CAAA,GAAS,IAAA;AAAA,IACzD,OAAA,mBACCA,GAAAA,CAAC,KAAA,EAAA,EAAI,OAAO,EAAE,OAAA,EAAS,QAAQ,aAAA,EAAe,QAAA,EAAU,KAAK,EAAA,EAAG,EAC7D,gBAAM,IAAA,CAAK,EAAE,QAAQ,CAAA,EAAG,EAAE,GAAA,CAAI,CAAC,GAAG,CAAA,qBACjCA,IAACQ,QAAAA,EAAA,EAAiB,QAAM,IAAA,EAAC,SAAA,EAAW,EAAE,IAAA,EAAM,CAAA,IAAK,KAAA,EAAO,EAAE,OAAO,MAAA,EAAO,EAAA,EAAzD,CAA4D,CAC5E,CAAA,EACH,oBAEAR,GAAAA;AAAA,MAACS,KAAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAS,eAAA;AAAA,QACT,UAAA;AAAA,QACA,QAAA;AAAA,QACA,MAAA,EAAQ,cAAA;AAAA,QACR,UAAA,EAAY,kBAAA;AAAA,QACZ,MAAA,EAAQ;AAAA,UACN,WAAW,YAAA,CAAa,SAAA;AAAA,UACxB,YAAY,YAAA,CAAa,OAAA;AAAA,UACzB,aAAa,YAAA,CAAa,QAAA;AAAA,UAC1B,YAAY,YAAA,CAAa;AAAA,SAC3B;AAAA,QACC,GAAG;AAAA;AAAA;AACN,GAAA,EAEJ,CAAA;AAEJ;AC5LO,SAAS,oBAAA,CAAwB;AAAA,EACtC,KAAA;AAAA,EACA,YAAA;AAAA,EACA;AACF,CAAA,EAA2D;AACzD,EAAA,MAAM,eAAe,KAAA,KAAU,MAAA;AAC/B,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIC,SAAY,YAAY,CAAA;AACxD,EAAA,MAAM,OAAA,GAAU,eAAgB,KAAA,GAAc,QAAA;AAE9C,EAAA,MAAM,QAAA,GAAWC,WAAAA;AAAA,IACf,CAAC,IAAA,KAAY;AACX,MAAA,IAAI,CAAC,YAAA,EAAc;AACjB,QAAA,WAAA,CAAY,IAAI,CAAA;AAAA,MAClB;AACA,MAAA,QAAA,GAAW,IAAI,CAAA;AAAA,IACjB,CAAA;AAAA,IACA,CAAC,cAAc,QAAQ;AAAA,GACzB;AAEA,EAAA,OAAO,CAAC,SAAS,QAAQ,CAAA;AAC3B;ACNA,SAAS,UAAa,KAAA,EAAqC;AACzD,EAAA,OAAO,CAAC,CAAC,KAAA,IAAS,OAAQ,MAAqB,IAAA,KAAS,UAAA;AAC1D;AAaO,SAAS,WAAA,CAAY;AAAA,EAC1B,OAAA;AAAA,EACA,QAAA;AAAA,EACA,IAAA;AAAA,EACA,WAAA,GAAc,KAAA;AAAA,EACd,SAAA,GAAY,IAAA;AAAA,EACZ,aAAA,GAAgB,IAAA;AAAA,EAChB,IAAA;AAAA,EACA,QAAA;AAAA,EACA,YAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAqB;AACnB,EAAA,MAAM,CAAC,MAAA,EAAQ,OAAO,CAAA,GAAI,oBAAA,CAA8B;AAAA,IACtD,KAAA,EAAO,IAAA;AAAA,IACP,YAAA,EAAc,WAAA;AAAA,IACd,QAAA,EAAU;AAAA,GACX,CAAA;AAED,EAAA,MAAM,UAAA,GAAaA,YAAY,MAAM,OAAA,CAAQ,IAAI,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAE7D,EAAA,MAAM,YAAA,GAAuCA,WAAAA;AAAA,IAC3C,CAAC,KAAA,KAAyC;AACxC,MAAA,QAAA,GAAW,KAAK,CAAA;AAChB,MAAA,IAAI,aAAA,UAAuB,KAAK,CAAA;AAAA,IAClC,CAAA;AAAA,IACA,CAAC,QAAA,EAAU,aAAA,EAAe,OAAO;AAAA,GACnC;AAEA,EAAA,MAAM,QAAA,GAA+BA,WAAAA;AAAA,IACnC,OAAO,KAAA,KAAyC;AAC9C,MAAA,MAAM,MAAA,GAAS,OAAO,KAAK,CAAA;AAC3B,MAAA,IAAI,CAAC,SAAA,EAAW;AAChB,MAAA,IAAI,SAAA,CAAU,MAAM,CAAA,EAAG;AACrB,QAAA,IAAI;AACF,UAAA,MAAM,MAAA;AAAA,QACR,CAAA,SAAE;AACA,UAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,QACf;AAAA,MACF,CAAA,MAAO;AACL,QAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,MACf;AAAA,IACF,CAAA;AAAA,IACA,CAAC,IAAA,EAAM,SAAA,EAAW,OAAO;AAAA,GAC3B;AAEA,EAAA,MAAM,WAAA,GAAcC,QAAQ,MAAM;AAChC,IAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AACrB,IAAA,IAAI,OAAO,YAAY,UAAA,EAAY;AACjC,MAAA,OAAQ,QAA4B,UAAU,CAAA;AAAA,IAChD;AACA,IAAA,IAAI,cAAA,CAAe,OAAO,CAAA,EAAG;AAC3B,MAAA,MAAM,EAAA,GAAK,OAAA;AACX,MAAA,MAAM,eAAA,GAAkB,GAAG,KAAA,CAAM,OAAA;AACjC,MAAA,OAAO,aAAa,EAAA,EAAI;AAAA,QACtB,OAAA,EAAS,CAAC,KAAA,KAAmC;AAC3C,UAAA,eAAA,GAAkB,KAAK,CAAA;AACvB,UAAA,UAAA,EAAW;AAAA,QACb;AAAA,OACD,CAAA;AAAA,IACH;AACA,IAAA,OAAO,OAAA;AAAA,EACT,CAAA,EAAG,CAAC,OAAA,EAAS,UAAU,CAAC,CAAA;AAExB,EAAA,uBACEC,KAAA,QAAA,EAAA,EACG,QAAA,EAAA;AAAA,IAAA,WAAA;AAAA,oBACDb,GAAAA,CAACc,KAAAA,EAAA,EAAM,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,QAAA,EAAU,QAAA,EAAU,YAAA,EAAe,GAAG,UAAA,EAC9D,QAAA,EACH;AAAA,GAAA,EACF,CAAA;AAEJ;ACjGA,IAAM,SAAA,GAAY,CAAC,KAAA,KAAA,CAChB,KAAA,IAAS,IACP,QAAA,EAAS,CACT,SAAA,CAAU,KAAK,CAAA,CACf,OAAA,CAAQ,kBAAA,EAAoB,EAAE,EAC9B,WAAA,EAAY;AAEjB,IAAM,WAAA,GAAc,CAAC,IAAA,KAA6B;AAChD,EAAA,IAAI,IAAA,KAAS,IAAA,IAAQ,IAAA,KAAS,MAAA,EAAW,OAAO,EAAA;AAChD,EAAA,IAAI,OAAO,SAAS,QAAA,IAAY,OAAO,SAAS,QAAA,IAAY,OAAO,SAAS,SAAA,EAAW;AACrF,IAAA,OAAO,OAAO,IAAI,CAAA;AAAA,EACpB;AACA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG,OAAO,KAAK,GAAA,CAAI,WAAW,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAC9D,EAAA,IAAI,OAAO,IAAA,KAAS,QAAA,IAAY,OAAA,IAAY,IAAA,EAA6C;AACvF,IAAA,MAAM,QAAS,IAAA,CAA8C,KAAA;AAC7D,IAAA,OAAO,WAAA,CAAY,OAAO,QAAQ,CAAA;AAAA,EACpC;AACA,EAAA,OAAO,EAAA;AACT,CAAA;AASO,SAAS,YAAA,CAAa;AAAA,EAC3B,OAAA;AAAA,EACA,UAAA,GAAa,KAAA;AAAA,EACb,YAAA;AAAA,EACA,SAAA;AAAA,EACA,KAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAsB;AACpB,EAAA,MAAM,aAAA,GAAqD,CAAC,KAAA,EAAO,MAAA,KAAW;AAC5E,IAAA,IAAI,CAAC,QAAQ,OAAO,KAAA;AACpB,IAAA,MAAM,KAAA,GAAQ,UAAU,KAAK,CAAA;AAC7B,IAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,WAAA,CAAY,MAAA,CAAO,KAAkB,CAAC,CAAA;AAC9D,IAAA,MAAM,KAAA,GAAQ,UAAU,OAAO,MAAA,CAAO,UAAU,QAAA,GAAW,MAAA,CAAO,QAAQ,EAAE,CAAA;AAC5E,IAAA,OAAO,MAAM,QAAA,CAAS,KAAK,CAAA,IAAK,KAAA,CAAM,SAAS,KAAK,CAAA;AAAA,EACtD,CAAA;AAEA,EAAA,MAAM,cAAA,GAAiB,UAAA,IAAc,CAAC,YAAA,GAAe,aAAA,GAAgB,YAAA;AAErE,EAAA,uBACEd,GAAAA;AAAA,IAACe,MAAAA;AAAA,IAAA;AAAA,MACC,OAAA;AAAA,MACA,UAAA;AAAA,MACA,YAAA,EAAc,cAAA;AAAA,MACd,gBAAA,EAAiB,OAAA;AAAA,MACjB,SAAA;AAAA,MACA,KAAA,EAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,GAAG,KAAA,EAAM;AAAA,MAChC,GAAG;AAAA;AAAA,GACN;AAEJ;AClDA,IAAM,cAAA,GAAiB,CACrB,QAAA,EACA,QAAA,EACA,QAAA,KACW;AACX,EAAA,IAAI,CAAC,QAAA,EAAU,OAAO,QAAA,CAAS,OAAA,CAAQ,UAAU,QAAQ,CAAA;AACzD,EAAA,OAAO,OAAO,aAAa,UAAA,GAAa,QAAA,CAAS,QAAQ,CAAA,GAAI,QAAA,CAAS,OAAA,CAAQ,QAAA,EAAU,QAAQ,CAAA;AAClG,CAAA;AAUO,SAAS,iBAAA,CAAkB;AAAA,EAChC,cAAA;AAAA,EACA,YAAA;AAAA,EACA,kBAAA,GAAqB,IAAA;AAAA,EACrB,QAAA,GAAW,6CAAA;AAAA,EACX,eAAA;AAAA,EACA,aAAA;AAAA,EACA,QAAA,EAAU,gBAAA;AAAA,EACV,QAAA;AAAA,EACA,GAAG;AACL,CAAA,EAA2B;AACzB,EAAA,MAAM,UAAU,aAAA,EAAc;AAE9B,EAAA,MAAM,WAAA,GAAcH,OAAAA;AAAA,IAClB,OAAO;AAAA,MACL,GAAG,WAAA;AAAA,MACH,SAAS,IAAA,EAAM;AACb,QAAA,MAAM,EAAE,MAAA,EAAQ,IAAA,EAAM,QAAA,KAAa,IAAA,CAAK,IAAA;AACxC,QAAA,IAAI,kBAAA,EAAoB;AACtB,UAAA,IAAI,WAAW,MAAA,EAAQ;AACrB,YAAA,OAAA,CAAQ,QAAQ,cAAA,CAAe,cAAA,EAAgB,UAAU,CAAA,EAAG,QAAQ,yBAAyB,CAAC,CAAA;AAC9F,YAAA,eAAA,GAAkB,IAAI,CAAA;AAAA,UACxB,CAAA,MAAA,IAAW,WAAW,OAAA,EAAS;AAC7B,YAAA,OAAA,CAAQ,MAAM,cAAA,CAAe,YAAA,EAAc,UAAU,CAAA,EAAG,QAAQ,oBAAoB,CAAC,CAAA;AACrF,YAAA,aAAA,GAAgB,IAAI,CAAA;AAAA,UACtB;AAAA,QACF;AACA,QAAA,gBAAA,GAAmB,IAAI,CAAA;AAAA,MACzB;AAAA,KACF,CAAA;AAAA,IACA,CAAC,aAAa,kBAAA,EAAoB,OAAA,EAAS,gBAAgB,YAAA,EAAc,eAAA,EAAiB,eAAe,gBAAgB;AAAA,GAC3H;AAEA,EAAA,uBACEZ,GAAAA,CAACgB,MAAAA,CAAO,OAAA,EAAP,EAAgB,GAAG,WAAA,EACjB,QAAA,EAAA,QAAA,oBACCH,IAAAA,CAAAI,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAjB,IAAC,GAAA,EAAA,EAAE,SAAA,EAAU,wBACX,QAAA,kBAAAA,GAAAA,CAAC,iBAAc,CAAA,EACjB,CAAA;AAAA,oBACAA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,mBAAmB,QAAA,EAAA,QAAA,EAAS;AAAA,GAAA,EAC3C,CAAA,EAEJ,CAAA;AAEJ;ACzDO,SAAS,UAAA,CAAW;AAAA,EACzB,KAAA;AAAA,EACA,WAAA;AAAA,EACA,SAAA,GAAY,GAAA;AAAA,EACZ,cAAA,GAAiB,IAAA;AAAA,EACjB,KAAA;AAAA,EACA;AACF,CAAA,EAAoB;AAClB,EAAA,uBACEa,KAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,OAAO,EAAE,YAAA,EAAc,IAAG,EACnD,QAAA,EAAA;AAAA,oBAAAA,IAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO;AAAA,UACL,OAAA,EAAS,MAAA;AAAA,UACT,UAAA,EAAY,QAAA;AAAA,UACZ,cAAA,EAAgB,eAAA;AAAA,UAChB,GAAA,EAAK;AAAA,SACP;AAAA,QAEA,QAAA,EAAA;AAAA,0BAAAb,GAAAA;AAAA,YAAC,IAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAO;AAAA,gBACL,QAAA,EAAU,EAAA;AAAA,gBACV,UAAA,EAAY,GAAA;AAAA,gBACZ,MAAA,EAAQ,CAAA;AAAA,gBACR,aAAA,EAAe,iBAAiB,WAAA,GAAc;AAAA,eAChD;AAAA,cAEC,QAAA,EAAA;AAAA;AAAA,WACH;AAAA,UACC,KAAA,mBAAQA,GAAAA,CAAC,KAAA,EAAA,EAAK,iBAAM,CAAA,GAAS;AAAA;AAAA;AAAA,KAChC;AAAA,IACC,WAAA,IAAe,WAAA,CAAY,MAAA,GAAS,CAAA,mBACnCA,GAAAA;AAAA,MAACkB,UAAAA;AAAA,MAAA;AAAA,QACC,SAAA;AAAA,QACA,KAAA,EAAO,WAAA;AAAA,QACP,KAAA,EAAO,EAAE,QAAA,EAAU,EAAA,EAAI,WAAW,CAAA;AAAE;AAAA,KACtC,GACE;AAAA,GAAA,EACN,CAAA;AAEJ;ACrDO,IAAM,cAAA,GAAiBhB,UAAAA,CAG5B,SAASiB,eAAAA,CAAe,EAAE,KAAA,GAAQ,KAAA,EAAO,IAAA,EAAM,IAAA,GAAO,SAAA,EAAW,QAAA,EAAU,GAAG,IAAA,IAAQ,GAAA,EAAK;AAC3F,EAAA,uBACEnB,GAAAA,CAAC,MAAA,EAAA,EAAO,GAAA,EAAU,MAAY,IAAA,EAAM,IAAA,oBAAQA,GAAAA,CAACoB,kBAAA,EAAiB,CAAA,EAAK,GAAG,IAAA,EACnE,sBAAY,KAAA,EACf,CAAA;AAEJ,CAAC;ACLM,SAAS,YAAA,CAAa;AAAA,EAC3B,OAAA;AAAA,EACA,MAAA,GAAS,KAAA;AAAA,EACT,aAAA;AAAA,EACA,QAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAsB;AACpB,EAAA,uBACEpB,GAAAA;AAAA,IAAC,WAAA;AAAA,IAAA;AAAA,MACC,aAAA,EAAe,EAAE,MAAA,EAAQ,GAAG,aAAA,EAAc;AAAA,MACzC,GAAG,IAAA;AAAA,MAEH,uBAAa,OAAA,mBAAUA,GAAAA,CAAC,GAAA,EAAA,EAAG,mBAAQ,CAAA,GAAO,IAAA;AAAA;AAAA,GAC7C;AAEJ","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 'rc-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 'rc-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} 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>) => {\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/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"]}
|
package/llms.txt
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
# @amsintegra/design-system
|
|
2
2
|
|
|
3
|
-
> React design system built on Ant Design
|
|
4
|
-
> theme (primary `#A72432`, Inter typeface, 13px base). It re-exports every antd
|
|
3
|
+
> React design system built on Ant Design v6 with the AMS Integra B2BMX (Metronic)
|
|
4
|
+
> theme (primary `#A72432`, Inter typeface, 13px base). It re-exports every antd v6
|
|
5
5
|
> component as a typed, themed wrapper, plus AMS composites and hooks. Published to
|
|
6
|
-
> npm under the MIT license.
|
|
6
|
+
> npm under the MIT license. Requires React >= 18 (18, 19, or 20) and antd 6.
|
|
7
7
|
|
|
8
8
|
This file helps AI assistants use the library correctly when the dedicated skill is
|
|
9
9
|
not available. The full machine-readable reference lives in
|
|
@@ -48,7 +48,7 @@ for context-safe `message` / `notification` / `Modal`). Props: `mode?: 'light'|'
|
|
|
48
48
|
|
|
49
49
|
- **Theme**: `AmsConfigProvider`, `buildTheme`, tokens (`primitives`, `semantic`,
|
|
50
50
|
`radius`, `typography`, `sizing`).
|
|
51
|
-
- **All Ant Design
|
|
51
|
+
- **All Ant Design v6 components** as typed re-exports (76 components).
|
|
52
52
|
- **AMS composites**: `DataTable`, `ModalDialog`, `ConfirmModal`, `FilterSelect`,
|
|
53
53
|
`FileUploadDragger`, `PageHeader`, `DownloadButton`, `Tag` (with `intent`),
|
|
54
54
|
`Pagination` (with `labels`), `ThemeToggle`.
|
|
@@ -75,4 +75,4 @@ const message = useAmsMessage();
|
|
|
75
75
|
- **Extended area docs**: `docs/skills/*.md` (composites, theme-and-dark-mode, forms,
|
|
76
76
|
tables, feedback, components-reference).
|
|
77
77
|
- **Changelog**: `CHANGELOG.md`
|
|
78
|
-
- **Ant Design
|
|
78
|
+
- **Ant Design v6 base API**: https://ant.design/components/overview
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@amsintegra/design-system",
|
|
3
|
-
"version": "1.
|
|
4
|
-
"description": "AMS Integra Design System — React components built on Ant Design
|
|
3
|
+
"version": "1.1.0",
|
|
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",
|
|
7
7
|
"sideEffects": [
|
|
@@ -40,6 +40,7 @@
|
|
|
40
40
|
"engines": {
|
|
41
41
|
"node": ">=18"
|
|
42
42
|
},
|
|
43
|
+
"//browserslist": "antd v6 uses CSS variables by default and drops IE; modern browsers only.",
|
|
43
44
|
"scripts": {
|
|
44
45
|
"build": "tsup",
|
|
45
46
|
"dev": "tsup --watch",
|
|
@@ -54,11 +55,11 @@
|
|
|
54
55
|
"pack:tarball": "npm run build && npm pack"
|
|
55
56
|
},
|
|
56
57
|
"peerDependencies": {
|
|
57
|
-
"@ant-design/icons": "^
|
|
58
|
-
"antd": "^
|
|
58
|
+
"@ant-design/icons": "^6.0.0",
|
|
59
|
+
"antd": "^6.0.0",
|
|
59
60
|
"dayjs": "^1.11.19",
|
|
60
|
-
"react": "
|
|
61
|
-
"react-dom": "
|
|
61
|
+
"react": ">=18",
|
|
62
|
+
"react-dom": ">=18"
|
|
62
63
|
},
|
|
63
64
|
"peerDependenciesMeta": {
|
|
64
65
|
"@ant-design/icons": {
|
|
@@ -78,7 +79,7 @@
|
|
|
78
79
|
}
|
|
79
80
|
},
|
|
80
81
|
"devDependencies": {
|
|
81
|
-
"@ant-design/icons": "^
|
|
82
|
+
"@ant-design/icons": "^6.0.0",
|
|
82
83
|
"@storybook/addon-a11y": "^10.6.0",
|
|
83
84
|
"@storybook/addon-themes": "^10.6.0",
|
|
84
85
|
"@storybook/react": "^10.6.0",
|
|
@@ -86,14 +87,14 @@
|
|
|
86
87
|
"@testing-library/jest-dom": "^6.6.3",
|
|
87
88
|
"@testing-library/react": "^16.1.0",
|
|
88
89
|
"@testing-library/user-event": "^14.5.2",
|
|
89
|
-
"@types/react": "^
|
|
90
|
-
"@types/react-dom": "
|
|
90
|
+
"@types/react": "^19.0.0",
|
|
91
|
+
"@types/react-dom": "^19.0.0",
|
|
91
92
|
"@vitejs/plugin-react": "^4.3.4",
|
|
92
|
-
"antd": "^
|
|
93
|
+
"antd": "^6.0.0",
|
|
93
94
|
"dayjs": "^1.11.19",
|
|
94
95
|
"jsdom": "^25.0.1",
|
|
95
|
-
"react": "^
|
|
96
|
-
"react-dom": "^
|
|
96
|
+
"react": "^19.0.0",
|
|
97
|
+
"react-dom": "^19.0.0",
|
|
97
98
|
"storybook": "^10.6.0",
|
|
98
99
|
"tsup": "^8.5.1",
|
|
99
100
|
"typescript": "^5.7.2",
|