@stackcraftmx/calcita 0.25.0 → 0.27.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.
Files changed (60) hide show
  1. package/README.md +29 -0
  2. package/dist/api/createApiClient.js +5 -0
  3. package/dist/api/createApiClient.js.map +1 -1
  4. package/dist/appShell/AccountMenu.js +15 -23
  5. package/dist/appShell/AccountMenu.js.map +1 -1
  6. package/dist/appShell/AppLayout.js +15 -8
  7. package/dist/appShell/AppLayout.js.map +1 -1
  8. package/dist/appShell/HeaderTools.js +4 -2
  9. package/dist/appShell/HeaderTools.js.map +1 -1
  10. package/dist/appShell/MenuLinks.js +36 -0
  11. package/dist/appShell/MenuLinks.js.map +1 -0
  12. package/dist/appShell/MobileTabBar.js +3 -3
  13. package/dist/appShell/MobileTabBar.js.map +1 -1
  14. package/dist/appShell/SettingsMenu.js +10 -5
  15. package/dist/appShell/SettingsMenu.js.map +1 -1
  16. package/dist/appShell/SideMenu.js +5 -3
  17. package/dist/appShell/SideMenu.js.map +1 -1
  18. package/dist/appShell/SideMenuEntry.js +3 -3
  19. package/dist/appShell/SideMenuEntry.js.map +1 -1
  20. package/dist/appShell/SubmenuActionsMenu.js +3 -4
  21. package/dist/appShell/SubmenuActionsMenu.js.map +1 -1
  22. package/dist/appShell/TopMenu.js +5 -6
  23. package/dist/appShell/TopMenu.js.map +1 -1
  24. package/dist/appShell/Wordmark.js +11 -0
  25. package/dist/appShell/Wordmark.js.map +1 -0
  26. package/dist/appShell/menuItemText.js +4 -0
  27. package/dist/appShell/menuItemText.js.map +1 -1
  28. package/dist/index.js +8 -4
  29. package/dist/navigation/appMenu.js +13 -1
  30. package/dist/navigation/appMenu.js.map +1 -1
  31. package/dist/observability/logger.js +18 -0
  32. package/dist/observability/logger.js.map +1 -1
  33. package/dist/theme/components/MuiAppBar.js +6 -5
  34. package/dist/theme/components/MuiAppBar.js.map +1 -1
  35. package/dist/theme/components/glassComponents.js +32 -31
  36. package/dist/theme/components/glassComponents.js.map +1 -1
  37. package/dist/theme/components/minimalComponents.js +28 -9
  38. package/dist/theme/components/minimalComponents.js.map +1 -1
  39. package/dist/theme/createToolkitTheme.js +6 -3
  40. package/dist/theme/createToolkitTheme.js.map +1 -1
  41. package/dist/theme/glassSurface.js +36 -38
  42. package/dist/theme/glassSurface.js.map +1 -1
  43. package/dist/theme/lightDarkStyles.js +48 -0
  44. package/dist/theme/lightDarkStyles.js.map +1 -0
  45. package/dist/types/api/createApiClient.d.ts +17 -0
  46. package/dist/types/appShell/AppLayout.d.ts +5 -1
  47. package/dist/types/appShell/MenuLinks.d.ts +17 -0
  48. package/dist/types/appShell/SettingsMenu.d.ts +3 -1
  49. package/dist/types/appShell/SideMenu.d.ts +3 -1
  50. package/dist/types/appShell/Wordmark.d.ts +6 -0
  51. package/dist/types/appShell/menuItemText.d.ts +16 -0
  52. package/dist/types/index.d.ts +4 -4
  53. package/dist/types/navigation/appMenu.d.ts +8 -0
  54. package/dist/types/observability/logger.d.ts +13 -0
  55. package/dist/types/theme/components/MuiAppBar.d.ts +3 -1
  56. package/dist/types/theme/components/glassComponents.d.ts +5 -0
  57. package/dist/types/theme/components/minimalComponents.d.ts +49 -3
  58. package/dist/types/theme/createToolkitTheme.d.ts +21 -1
  59. package/dist/types/theme/lightDarkStyles.d.ts +8 -0
  60. package/package.json +3 -2
@@ -4,10 +4,12 @@
4
4
  * @param {boolean} [props.showLanguage]
5
5
  * @param {boolean} [props.showColorScheme]
6
6
  * @param {import('react').ReactNode} [props.extraSettings] los ajustes del proyecto, debajo de los del paquete
7
+ * @param {object[]} [props.menuLinks] las ligas propias (accountMenuItems), al final
7
8
  */
8
- export default function SettingsMenu({ showFontSize, showLanguage, showColorScheme, extraSettings }: {
9
+ export default function SettingsMenu({ showFontSize, showLanguage, showColorScheme, extraSettings, menuLinks }: {
9
10
  showFontSize?: boolean;
10
11
  showLanguage?: boolean;
11
12
  showColorScheme?: boolean;
12
13
  extraSettings?: import('react').ReactNode;
14
+ menuLinks?: object[];
13
15
  }): import("react").JSX.Element;
@@ -1,6 +1,7 @@
1
1
  /**
2
2
  * @param {object} props
3
3
  * @param {import('react').ReactNode} [props.logo] el logo chico (28 px), el que se queda con el menú encogido
4
+ * @param {import('react').ReactNode} [props.wordmark] el logo ancho (en lugar del logo y el nombre arriba)
4
5
  * @param {string} props.brandName el nombre de la app
5
6
  * @param {string} [props.brandCaption] el renglón chico debajo del nombre («Panel de administración»)
6
7
  * @param {string} props.homePath
@@ -14,8 +15,9 @@
14
15
  * @param {import('react').ReactNode} [props.railTop] arriba del menú encogido que hace de barra: la ☰ y el logo
15
16
  * @param {import('react').ReactNode} [props.railBottom] abajo de ese menú: los ajustes y la cuenta
16
17
  */
17
- export default function SideMenu({ logo, brandName, brandCaption, homePath, menuItems, activeItem, collapsed, footer, showBrand, onNavigate, railTop, railBottom, menuBadges, }: {
18
+ export default function SideMenu({ logo, wordmark, brandName, brandCaption, homePath, menuItems, activeItem, collapsed, footer, showBrand, onNavigate, railTop, railBottom, menuBadges, }: {
18
19
  logo?: import('react').ReactNode;
20
+ wordmark?: import('react').ReactNode;
19
21
  brandName: string;
20
22
  brandCaption?: string;
21
23
  homePath: string;
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @param {{children: import('react').ReactNode}} props el logo (una <img>, un <svg> o lo que pinte el proyecto)
3
+ */
4
+ export default function Wordmark({ children }: {
5
+ children: import('react').ReactNode;
6
+ }): import("react").JSX.Element;
@@ -53,3 +53,19 @@ export declare function menuSectionsOf(menuItems: object[], t: (key: string) =>
53
53
  * @returns {string}
54
54
  */
55
55
  export declare function initialsOf(fullName: string | null | undefined): string;
56
+ /**
57
+ * Las props de la liga de una entrada: el router para una pantalla de la app (to) y una dirección normal para otro sistema
58
+ * (href: el sistema que ya existía, otra app de la empresa). Con href la página se carga completa, como cualquier liga.
59
+ *
60
+ * @param {{to?: string, href?: string}} menuItem
61
+ * @param {import('react').ElementType} RouterLink el Link de la navegación del proyecto
62
+ * @returns {{component: import('react').ElementType|string, to?: string, href?: string}}
63
+ */
64
+ export declare function menuLinkPropsOf(menuItem: {
65
+ to?: string;
66
+ href?: string;
67
+ }, RouterLink: import('react').ElementType): {
68
+ component: import('react').ElementType | string;
69
+ to?: string;
70
+ href?: string;
71
+ };
@@ -11,7 +11,7 @@ export { ConfirmDialog, ModalWaiting, NEW_BUILD_NOTICE_VARIANT, NewBuildNotice,
11
11
  export { DEFAULT_FILE_TYPES, DOWNLOAD_STATUS, DownloadManager, UNKNOWN_FILE_TYPE, cancelDownload, clearFinishedDownloads, downloadsMachine, startDownload, useFileTypes, } from './downloads/index.js';
12
12
  export { THEME_LOOK, TOP_BAR, createToolkitTheme } from './theme/createToolkitTheme.js';
13
13
  export { isAndroidDevice } from './theme/androidDevice.js';
14
- export { MINIMAL_BACKGROUND } from './theme/components/minimalComponents.js';
14
+ export { MINIMAL_BACKGROUND, MINIMAL_TONES } from './theme/components/minimalComponents.js';
15
15
  export { STACKCRAFT, stackcraftDarkPalette, stackcraftLightPalette } from './theme/stackcraftPalette.js';
16
16
  export { toolkitComponents } from './theme/toolkitComponents.js';
17
17
  export { mergeComponents } from './theme/mergeComponents.js';
@@ -32,7 +32,7 @@ export { DRAWER_WIDTH_COLLAPSED, DRAWER_WIDTH_EXPANDED, MAIN_CONTENT_ID } from '
32
32
  export { useAppMenu } from './appShell/appMenuContext.js';
33
33
  export { usePageTitle } from './appShell/pageTitle.js';
34
34
  export { initialsOf, menuItemDescriptionOf, menuItemLabelOf, menuItemSectionOf, menuSectionsOf } from './appShell/menuItemText.js';
35
- export { activeMenuItemOf, composeMenu, menuBadgeOf, menuBreadcrumbsOf, mobileTabsOf, parentMenuItemOf, screenMenuItemsOf } from './navigation/appMenu.js';
35
+ export { activeMenuItemOf, composeMenu, menuBadgeOf, menuBreadcrumbsOf, menuItemsWithIconsOf, mobileTabsOf, parentMenuItemOf, screenMenuItemsOf, } from './navigation/appMenu.js';
36
36
  export { menuBadgesFrom, useMenuBadges } from './navigation/useMenuBadges.js';
37
37
  export { allowOnlyUnrestricted, createAccessChecker } from './access/accessRules.js';
38
38
  export { default as Can } from './access/Can.js';
@@ -70,12 +70,12 @@ export { REDIRECT_PARAM, readRedirectParam, safeInternalPath, withRedirect } fro
70
70
  export { recallListUrl, rememberListUrl, useRememberListUrl } from './lastListUrl.js';
71
71
  export { currentHistoryIndex, forgetPageName, pageNameAt, rememberPageName, useNavigationTrail, usePageName } from './navigationTrail.js';
72
72
  export { periodRangeIsValid, rangeEndAfterStartChange, rangeEndOptionsOf } from './periodRanges.js';
73
- export { createLogger, setLogLevel } from './observability/logger.js';
73
+ export { addLogSink, createLogger, setLogLevel } from './observability/logger.js';
74
74
  export { isNewBuildPublished, reportPublishedBuild, useNewBuildPublished } from './observability/publishedBuild.js';
75
75
  export { BUILD_WATCH_ACTION, buildWatchActionOf, publishedBuildIdOf } from './observability/buildWatch.js';
76
76
  export { usePublishedBuildWatch } from './observability/usePublishedBuildWatch.js';
77
77
  export { API_ERROR_STATUS, ApiError } from './api/ApiError.js';
78
- export { API_RESPONSE_PARSE, apiUrlOf, createApiClient } from './api/createApiClient.js';
78
+ export { API_RESPONSE_PARSE, apiErrorOf, apiUrlOf, createApiClient } from './api/createApiClient.js';
79
79
  export { isStaleChunkError, recoverFromStaleChunk } from './api/staleChunks.js';
80
80
  export { ACCOUNT_EVENT_KIND, default as ActivityLog } from './security/ActivityLog.js';
81
81
  export { default as RecoveryCodesDialog } from './security/RecoveryCodesDialog.js';
@@ -11,6 +11,14 @@ export declare function composeMenu(menuModules: Record<string, any> | any[], {
11
11
  canAccess?: (access: object | undefined) => boolean;
12
12
  context?: object;
13
13
  }): object[];
14
+ /**
15
+ * Las entradas con su ícono como componente (Icon), que es lo que pintan las piezas del menú: el proyecto puede dar el
16
+ * componente o un ícono ya pintado (icon, por ejemplo <Iconify icon="mdi:bank" /> de un sistema que ya usaba iconify).
17
+ *
18
+ * @param {object[]} menuItems
19
+ * @returns {object[]}
20
+ */
21
+ export declare function menuItemsWithIconsOf(menuItems: object[]): object[];
14
22
  /**
15
23
  * Las entradas que llevan a una pantalla, con las de los submenús (las de arriba primero).
16
24
  *
@@ -6,6 +6,19 @@
6
6
  * @returns {void}
7
7
  */
8
8
  export declare function setLogLevel(level: 'error' | 'warn' | 'info' | 'debug'): void;
9
+ /**
10
+ * Una salida propia para lo que se anota (un reporte externo): recibe cada anotación que sale en consola, con su nivel.
11
+ *
12
+ * @param {(entry: {level: 'error'|'warn'|'info'|'debug', namespace: string, message: string, context?: object, timestamp: number}) => void} sink
13
+ * @returns {() => void} para quitarla
14
+ */
15
+ export declare function addLogSink(sink: (entry: {
16
+ level: 'error' | 'warn' | 'info' | 'debug';
17
+ namespace: string;
18
+ message: string;
19
+ context?: object;
20
+ timestamp: number;
21
+ }) => void): () => void;
9
22
  /**
10
23
  * Logger que antepone [namespace] a cada mensaje.
11
24
  *
@@ -7,7 +7,9 @@ export declare function MuiAppBar(): {
7
7
  root: ({ ownerState, theme }: {
8
8
  ownerState: any;
9
9
  theme: any;
10
- }) => any;
10
+ }) => {
11
+ borderBottom?: string | undefined;
12
+ };
11
13
  };
12
14
  };
13
15
  };
@@ -1,3 +1,8 @@
1
+ export declare const WHITE_LABEL = "#FFFFFF";
2
+ export declare const MONOGRAM_GRAY: Readonly<{
3
+ light: "#6E6E73";
4
+ dark: "#636366";
5
+ }>;
1
6
  /**
2
7
  * @param {object} [options]
3
8
  * @param {boolean} [options.surfaces] también el contenido (tarjetas, acordeón, avisos, tabla) con material; por omisión no
@@ -1,16 +1,62 @@
1
- /** Los fondos del minimalista: el gris agrupado de Apple y la tarjeta un escalón arriba, en claro y en oscuro. */
1
+ /**
2
+ * Los tonos del minimalista por omisión, los grises de Apple, en claro y en oscuro:
3
+ * - default: el fondo de la página (el gris agrupado);
4
+ * - paper: las tarjetas, un escalón arriba;
5
+ * - fill: el relleno de campos, grupos y botones sin color (más claro que el fondo en oscuro);
6
+ * - floating: lo que flota sobre el contenido (la barra de pestañas del teléfono, el aviso de versión nueva), un escalón
7
+ * más oscuro que las tarjetas. Del color de las tarjetas «se perdía» sobre ellas (lo dijo el autor de la primera barra
8
+ * de abajo del minimalista); así se distingue sin borde ni sombra, sobre tarjetas y sobre el fondo.
9
+ */
10
+ export declare const MINIMAL_TONES: Readonly<{
11
+ light: Readonly<{
12
+ default: "#F2F2F7";
13
+ paper: "#FFFFFF";
14
+ fill: "rgba(118, 118, 128, 0.12)";
15
+ floating: "#E5E5EA";
16
+ }>;
17
+ dark: Readonly<{
18
+ default: "#000000";
19
+ paper: "#1C1C1E";
20
+ fill: "rgba(118, 118, 128, 0.24)";
21
+ floating: "#2C2C2E";
22
+ }>;
23
+ }>;
24
+ /** Los fondos del minimalista por omisión (los de MINIMAL_TONES): el gris agrupado de Apple y la tarjeta un escalón arriba. */
2
25
  export declare const MINIMAL_BACKGROUND: Readonly<{
26
+ light: {
27
+ default: "#F2F2F7";
28
+ paper: "#FFFFFF";
29
+ };
30
+ dark: {
31
+ default: "#000000";
32
+ paper: "#1C1C1E";
33
+ };
34
+ }>;
35
+ /**
36
+ * Los tonos del minimalista con los del proyecto encima: lo que el proyecto no trae se queda con el gris de Apple.
37
+ *
38
+ * @param {{light?: object, dark?: object}} [projectTones] cualquiera de default, paper, fill y floating por modo
39
+ * @returns {{light: {default: string, paper: string, fill: string, floating: string}, dark: {default: string, paper: string, fill: string, floating: string}}}
40
+ */
41
+ export declare function minimalTonesOf(projectTones?: {
42
+ light?: object;
43
+ dark?: object;
44
+ }): {
3
45
  light: {
4
46
  default: string;
5
47
  paper: string;
48
+ fill: string;
49
+ floating: string;
6
50
  };
7
51
  dark: {
8
52
  default: string;
9
53
  paper: string;
54
+ fill: string;
55
+ floating: string;
10
56
  };
11
- }>;
57
+ };
12
58
  /**
13
- * La superficie de lo que flota en el minimalista, sólida, en claro y en oscuro.
59
+ * La superficie de lo que flota en el minimalista, sólida, en claro y en oscuro (el tono floating; ver MINIMAL_TONES).
14
60
  *
15
61
  * @param {object} theme
16
62
  * @returns {object}
@@ -26,11 +26,17 @@ export declare const TOP_BAR: Readonly<{
26
26
  * plano y tonal (sin bordes ni sombras: las superficies se separan por su tono; sin vidrio aunque se pida)
27
27
  * @param {'capsules'|'band'} [options.bar] la barra de arriba con vidrio o con el minimalista (TOP_BAR): por omisión en
28
28
  * cápsulas; 'band' la franja de lado a lado
29
+ * @param {{light?: {default?: string, paper?: string, fill?: string, floating?: string}, dark?: {default?: string, paper?: string, fill?: string, floating?: string}}} [options.minimalTones]
30
+ * los tonos del minimalista con los colores de la marca, por modo: default (el fondo de la página), paper (las tarjetas,
31
+ * un escalón arriba), fill (el relleno de campos, grupos y botones sin color) y floating (la barra de pestañas del
32
+ * teléfono y lo que flota). Lo que no se pase se queda con los grises de Apple (MINIMAL_TONES). OJO: con el minimalista
33
+ * el fondo de la página sale de aquí y no de la paleta (sin minimalTones, los grises de Apple aunque la paleta traiga
34
+ * su background)
29
35
  * @param {object} [options.components] ajustes propios de componentes (se suman; en el mismo estilo ganan los del proyecto)
30
36
  * @param {object} [options.overrides] cualquier otra cosa de createTheme (breakpoints, spacing…)
31
37
  * @returns {object} el tema de MUI
32
38
  */
33
- export declare function createToolkitTheme({ colorSchemes, colorSchemeSelector, fontFamily, glass, look, bar, components, overrides, }?: {
39
+ export declare function createToolkitTheme({ colorSchemes, colorSchemeSelector, fontFamily, glass, look, bar, minimalTones, components, overrides, }?: {
34
40
  colorSchemes?: {
35
41
  light?: object | boolean;
36
42
  dark?: object | boolean;
@@ -43,6 +49,20 @@ export declare function createToolkitTheme({ colorSchemes, colorSchemeSelector,
43
49
  };
44
50
  look?: 'standard' | 'minimal';
45
51
  bar?: 'capsules' | 'band';
52
+ minimalTones?: {
53
+ light?: {
54
+ default?: string;
55
+ paper?: string;
56
+ fill?: string;
57
+ floating?: string;
58
+ };
59
+ dark?: {
60
+ default?: string;
61
+ paper?: string;
62
+ fill?: string;
63
+ floating?: string;
64
+ };
65
+ };
46
66
  components?: object;
47
67
  overrides?: object;
48
68
  }): object;
@@ -0,0 +1,8 @@
1
+ /**
2
+ * @param {object} theme el tema de MUI (su applyStyles sabe cómo se elige el modo: clase, atributo o media query)
3
+ * @param {object} lightStyles los estilos de claro (los de siempre)
4
+ * @param {object} darkStyles lo que cambia en oscuro
5
+ * @returns {object} los estilos para el tema: cada propiedad en la clase con su variable, y la regla de oscuro solo con las
6
+ * variables (más lo que no pudo ir en variable)
7
+ */
8
+ export declare function lightDarkStylesOf(theme: object, lightStyles: object, darkStyles: object): object;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stackcraftmx/calcita",
3
- "version": "0.25.0",
3
+ "version": "0.27.0",
4
4
  "description": "Componentes y utilidades de React con MUI para arrancar proyectos rápido: tabla de servidor, diálogos, avisos, descargas, formularios, formatos y reportes en Excel.",
5
5
  "license": "FSL-1.1-MIT",
6
6
  "author": "calcifux",
@@ -130,7 +130,8 @@
130
130
  "./kanban": {
131
131
  "types": "./dist/types/kanban.d.ts",
132
132
  "import": "./dist/kanban.js"
133
- }
133
+ },
134
+ "./package.json": "./package.json"
134
135
  },
135
136
  "scripts": {
136
137
  "prepublishOnly": "pnpm run check",