pdm-ui-kit 1.4.0 → 1.5.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/README.md +28 -0
- package/alert/alert-dialog.component.d.ts +14 -2
- package/alert/alert.module.d.ts +2 -1
- package/dialog/dialog.component.d.ts +18 -26
- package/dialog/dialog.module.d.ts +1 -1
- package/esm2020/alert/alert-dialog.component.mjs +101 -11
- package/esm2020/alert/alert.module.mjs +5 -4
- package/esm2020/dialog/dialog.component.mjs +43 -85
- package/esm2020/dialog/dialog.module.mjs +10 -4
- package/esm2020/src/alert/alert-dialog.component.mjs +101 -11
- package/esm2020/src/alert/alert.module.mjs +5 -4
- package/esm2020/src/dialog/dialog.component.mjs +43 -85
- package/esm2020/src/dialog/dialog.module.mjs +10 -4
- package/esm2020/src/utils/cn.mjs +19 -0
- package/esm2020/src/utils/public-api.mjs +2 -1
- package/fesm2015/pdm-ui-kit-src-alert.mjs +103 -12
- package/fesm2015/pdm-ui-kit-src-alert.mjs.map +1 -1
- package/fesm2015/pdm-ui-kit-src-dialog.mjs +50 -85
- package/fesm2015/pdm-ui-kit-src-dialog.mjs.map +1 -1
- package/fesm2015/pdm-ui-kit-src-utils.mjs +21 -1
- package/fesm2015/pdm-ui-kit-src-utils.mjs.map +1 -1
- package/fesm2015/pdm-ui-kit.mjs +161 -108
- package/fesm2015/pdm-ui-kit.mjs.map +1 -1
- package/fesm2020/pdm-ui-kit-src-alert.mjs +103 -12
- package/fesm2020/pdm-ui-kit-src-alert.mjs.map +1 -1
- package/fesm2020/pdm-ui-kit-src-dialog.mjs +50 -85
- package/fesm2020/pdm-ui-kit-src-dialog.mjs.map +1 -1
- package/fesm2020/pdm-ui-kit-src-utils.mjs +21 -1
- package/fesm2020/pdm-ui-kit-src-utils.mjs.map +1 -1
- package/fesm2020/pdm-ui-kit.mjs +161 -108
- package/fesm2020/pdm-ui-kit.mjs.map +1 -1
- package/package.json +3 -1
- package/src/alert/alert-dialog.component.d.ts +14 -2
- package/src/alert/alert.module.d.ts +2 -1
- package/src/dialog/dialog.component.d.ts +18 -26
- package/src/dialog/dialog.module.d.ts +1 -1
- package/src/utils/cn.d.ts +15 -0
- package/src/utils/public-api.d.ts +1 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pdm-ui-kit-src-dialog.mjs","sources":["../../../src/dialog/dialog.component.ts","../../../src/dialog/dialog.component.html","../../../src/dialog/dialog.module.ts","../../../src/dialog/pdm-ui-kit-src-dialog.ts"],"sourcesContent":["import {\n\tChangeDetectionStrategy,\n\tComponent,\n\tEventEmitter,\n\tHostListener,\n\tInput,\n\tOutput,\n} from \"@angular/core\";\nimport { responsive } from \"pdm-ui-kit/src/utils\";\nimport { Z_INDEX } from \"pdm-ui-kit/src/utils\";\n\nexport type PdmDialogVariant = \"default\" | \"custom-close\";\n\n/**\n * @deprecated Use 'responsive' mode instead. Will be removed in v0.3.0\n */\nexport type PdmDialogSize =\n\t| \"desktop\"\n\t| \"mobile\"\n\t| \"mobile-fullscreen\"\n\t| \"sm\"\n\t| \"md\"\n\t| \"lg\"\n\t| \"xl\"\n\t| \"responsive\";\n\nexport type PdmDialogFooterAlign = \"right\" | \"full-width\" | \"left\";\n\n/**\n * Modal/Dialog component con soporte responsive\n *\n * MEJORADO en v0.2.0:\n * - Modo 'responsive' (default): fullscreen en mobile, modal en desktop\n * - Tamaños predefinidos: sm, md, lg, xl\n * - Mejor manejo de scroll en mobile\n *\n * @example\n * // Responsive (recomendado)\n * <pdm-dialog [open]=\"isOpen\" size=\"responsive\">\n * <p>Content</p>\n * </pdm-dialog>\n *\n * @example\n * // Tamaño fijo\n * <pdm-dialog [open]=\"isOpen\" size=\"lg\">\n * <p>Content</p>\n * </pdm-dialog>\n */\n@Component({\n\tselector: \"pdm-dialog\",\n\ttemplateUrl: \"./dialog.component.html\",\n\tstyles: [\n\t\t`\n :host {\n display: block;\n }\n `,\n\t],\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class PdmDialogComponent {\n\t@Input() open = false;\n\t@Input() variant: PdmDialogVariant = \"default\";\n\n\t/**\n\t * Tamaño del dialog\n\t * - responsive: fullscreen mobile, modal desktop (recomendado)\n\t * - sm: 400px max\n\t * - md: 500px max\n\t * - lg: 640px max (default)\n\t * - xl: 800px max\n\t * - desktop/mobile/mobile-fullscreen: legacy, deprecado\n\t */\n\t@Input() size: PdmDialogSize = \"responsive\";\n\n\t@Input() title = \"\";\n\t@Input() description = \"\";\n\t@Input() closeOnBackdrop = true;\n\t@Input() closeOnEsc = true;\n\t@Input() showCloseButton = true;\n\t@Input() showHeader = true;\n\t@Input() showFooter = true;\n\t@Input() primaryActionText = \"Save changes\";\n\t@Input() secondaryActionText = \"Cancel\";\n\t@Input() alignFooter: PdmDialogFooterAlign = \"right\";\n\t@Input() headerClassName = \"\";\n\t@Input() bodyClassName = \"\";\n\t@Input() footerClassName = \"\";\n\t@Input() className = \"\";\n\n\t@Output() openChange = new EventEmitter<boolean>();\n\t@Output() primaryAction = new EventEmitter<void>();\n\t@Output() secondaryAction = new EventEmitter<void>();\n\n\t@HostListener(\"document:keydown.escape\")\n\tonEsc(): void {\n\t\tif (this.open && this.closeOnEsc) {\n\t\t\tthis.close();\n\t\t}\n\t}\n\n\tclose(): void {\n\t\tthis.openChange.emit(false);\n\t}\n\n\tonPrimaryAction(): void {\n\t\tthis.primaryAction.emit();\n\t}\n\n\tonSecondaryAction(): void {\n\t\tthis.secondaryAction.emit();\n\t}\n\n\tonBackdropClick(): void {\n\t\tif (this.closeOnBackdrop) {\n\t\t\tthis.close();\n\t\t}\n\t}\n\n\tget panelClassName(): string {\n\t\t// Legacy sizes (backward compatibility)\n\t\tif (this.size === \"desktop\") {\n\t\t\treturn this.buildPanelClasses([\n\t\t\t\t\"max-w-[640px]\",\n\t\t\t\t\"max-h-[calc(100vh-2rem)]\",\n\t\t\t\t\"rounded-[10px]\",\n\t\t\t]);\n\t\t}\n\n\t\tif (this.size === \"mobile\") {\n\t\t\treturn this.buildPanelClasses([\n\t\t\t\t\"max-w-[320px]\",\n\t\t\t\t\"min-h-[240px]\",\n\t\t\t\t\"rounded-[10px]\",\n\t\t\t]);\n\t\t}\n\n\t\tif (this.size === \"mobile-fullscreen\") {\n\t\t\treturn this.buildPanelClasses([\n\t\t\t\t\"max-w-[320px]\",\n\t\t\t\t\"h-[min(100dvh,640px)]\",\n\t\t\t\t\"rounded-none\",\n\t\t\t\t\"sm:rounded-[10px]\",\n\t\t\t]);\n\t\t}\n\n\t\t// New responsive mode (recomendado)\n\t\tif (this.size === \"responsive\") {\n\t\t\treturn this.buildPanelClasses([\n\t\t\t\t// Mobile: fullscreen con bordes redondeados solo arriba\n\t\t\t\t\"w-full\",\n\t\t\t\t\"h-full\",\n\t\t\t\t\"max-h-[100dvh]\",\n\t\t\t\t\"rounded-t-[10px]\",\n\t\t\t\t\"sm:rounded-[10px]\",\n\t\t\t\t// Desktop: modal centrado\n\t\t\t\t\"sm:w-auto\",\n\t\t\t\t\"sm:h-auto\",\n\t\t\t\t\"sm:max-w-[640px]\",\n\t\t\t\t\"sm:max-h-[calc(100vh-4rem)]\",\n\t\t\t]);\n\t\t}\n\n\t\t// New size options\n\t\tconst sizeMap = {\n\t\t\tsm: \"sm:max-w-[400px]\",\n\t\t\tmd: \"sm:max-w-[500px]\",\n\t\t\tlg: \"sm:max-w-[640px]\",\n\t\t\txl: \"sm:max-w-[800px]\",\n\t\t};\n\n\t\tconst maxWidth = sizeMap[this.size as keyof typeof sizeMap] || sizeMap.lg;\n\n\t\treturn this.buildPanelClasses([\n\t\t\t// Mobile: fullscreen\n\t\t\t\"w-full\",\n\t\t\t\"h-full\",\n\t\t\t\"max-h-[100dvh]\",\n\t\t\t\"rounded-t-[10px]\",\n\t\t\t// Desktop: modal\n\t\t\t\"sm:rounded-[10px]\",\n\t\t\t\"sm:w-auto\",\n\t\t\t\"sm:h-auto\",\n\t\t\tmaxWidth,\n\t\t\t\"sm:max-h-[calc(100vh-4rem)]\",\n\t\t]);\n\t}\n\n\tprivate buildPanelClasses(sizeClasses: string[]): string {\n\t\tconst base = [\n\t\t\t\"relative\",\n\t\t\tZ_INDEX.modal, // z-50 - debe estar sobre backdrop (z-40)\n\t\t\t\"flex\",\n\t\t\t\"flex-col\",\n\t\t\t\"border border-solid\",\n\t\t\t\"border-border\",\n\t\t\t\"bg-background\",\n\t\t\t\"text-foreground\",\n\t\t\t\"shadow-lg\",\n\t\t\t\"overflow-hidden\",\n\t\t\t...sizeClasses,\n\t\t\tthis.className,\n\t\t];\n\n\t\treturn base.filter(Boolean).join(\" \");\n\t}\n\n\tget bodyWrapperClassName(): string {\n\t\t// min-h-0 is CRITICAL for flex child to shrink and allow internal scroll\n\t\tconst base = [\n\t\t\t\"flex-1\",\n\t\t\t\"min-h-0\",\n\t\t\t\"overflow-y-auto\",\n\t\t\t\"px-4\",\n\t\t\t\"py-6\",\n\t\t\t\"sm:px-6\",\n\t\t\tthis.bodyClassName,\n\t\t];\n\n\t\treturn base.filter(Boolean).join(\" \");\n\t}\n\n\tget headerWrapperClassName(): string {\n\t\tconst base = [\n\t\t\t\"flex\",\n\t\t\t\"items-start\",\n\t\t\t\"justify-between\",\n\t\t\t\"gap-3\",\n\t\t\t\"p-4\",\n\t\t\t\"sm:p-6\",\n\t\t\t\"border-b\",\n\t\t\t\"border-border\",\n\t\t\tthis.headerClassName,\n\t\t];\n\n\t\treturn base.filter(Boolean).join(\" \");\n\t}\n\n\tget footerWrapperClassName(): string {\n\t\tconst effectiveAlign =\n\t\t\tthis.alignFooter === \"right\" && this.variant === \"custom-close\"\n\t\t\t\t? \"left\"\n\t\t\t\t: this.alignFooter;\n\n\t\tconst base = [\n\t\t\t\"p-4\",\n\t\t\t\"sm:p-6\",\n\t\t\t\"border-t\",\n\t\t\t\"border-border\",\n\t\t\t// Mobile: siempre full-width\n\t\t\t\"flex\",\n\t\t\t\"flex-col\",\n\t\t\t\"gap-2\",\n\t\t\t// Desktop: según alignFooter\n\t\t\teffectiveAlign === \"full-width\"\n\t\t\t\t? \"sm:flex-col\"\n\t\t\t\t: \"sm:flex-row sm:items-center\",\n\t\t\teffectiveAlign === \"left\" ? \"sm:justify-start\" : \"\",\n\t\t\teffectiveAlign === \"right\" ? \"sm:justify-end\" : \"\",\n\t\t\tthis.footerClassName,\n\t\t];\n\n\t\treturn base.filter(Boolean).join(\" \");\n\t}\n\n\tget containerClassName(): string {\n\t\t// Container con backdrop z-40\n\t\t// Mobile: fullscreen desde el bottom\n\t\t// Desktop: centrado\n\t\treturn responsive({\n\t\t\tdefault: `fixed inset-x-0 bottom-0 ${Z_INDEX.modalBackdrop} flex items-end justify-center`,\n\t\t\tsm: `fixed inset-0 ${Z_INDEX.modalBackdrop} flex items-center justify-center p-4`,\n\t\t});\n\t}\n}\n","<div *ngIf=\"open\" [ngClass]=\"containerClassName\">\n <!-- Backdrop -->\n <div class=\"absolute inset-0 bg-foreground/30 backdrop-blur-sm\" (click)=\"onBackdropClick()\"></div>\n \n <!-- Dialog Panel -->\n <section role=\"dialog\" aria-modal=\"true\" cdkTrapFocus [ngClass]=\"panelClassName\">\n <!-- Header -->\n <div *ngIf=\"showHeader\" [ngClass]=\"headerWrapperClassName\">\n <div class=\"min-w-0 flex-1\">\n <h2 class=\"m-0 text-lg font-semibold leading-none tracking-tight text-foreground\">{{ title }}</h2>\n <p *ngIf=\"description\" class=\"m-0 mt-2 text-sm text-muted-foreground\">{{ description }}</p>\n </div>\n <button\n *ngIf=\"showCloseButton\"\n type=\"button\"\n class=\"inline-flex h-6 w-6 flex-shrink-0 appearance-none box-border items-center justify-center rounded-sm border-0 bg-transparent p-0 text-foreground opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none\"\n (click)=\"close()\"\n aria-label=\"Close dialog\"\n >\n <svg viewBox=\"0 0 24 24\" class=\"h-4 w-4\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M6 6L18 18M18 6L6 18\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"></path>\n </svg>\n </button>\n </div>\n\n <!-- Body -->\n <div [ngClass]=\"bodyWrapperClassName\">\n <ng-content></ng-content>\n </div>\n\n <!-- Footer -->\n <div *ngIf=\"showFooter\" [ngClass]=\"footerWrapperClassName\">\n <ng-container *ngIf=\"variant === 'custom-close'; else defaultActions\">\n <button\n type=\"button\"\n class=\"inline-flex h-9 w-full appearance-none box-border items-center justify-center rounded-md border border-solid border-input bg-background px-4 py-2 text-sm font-medium text-foreground shadow-sm sm:w-auto\"\n (click)=\"onSecondaryAction()\"\n >\n {{ secondaryActionText }}\n </button>\n </ng-container>\n\n <ng-template #defaultActions>\n <button\n type=\"button\"\n class=\"inline-flex h-9 w-full appearance-none box-border items-center justify-center rounded-md border border-solid border-input bg-background px-4 py-2 text-sm font-medium text-foreground shadow-sm sm:w-auto\"\n (click)=\"onSecondaryAction()\"\n >\n {{ secondaryActionText }}\n </button>\n <button\n type=\"button\"\n class=\"inline-flex h-9 w-full appearance-none box-border items-center justify-center rounded-md bg-primary px-4 py-2 text-sm font-medium text-primary-foreground shadow-sm sm:w-auto\"\n (click)=\"onPrimaryAction()\"\n >\n {{ primaryActionText }}\n </button>\n </ng-template>\n </div>\n </section>\n</div>\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { A11yModule } from '@angular/cdk/a11y';\nimport { PdmDialogComponent } from './dialog.component';\n\nconst COMPONENTS = [\n PdmDialogComponent,\n];\n\n@NgModule({\n imports: [CommonModule, A11yModule],\n declarations: COMPONENTS,\n exports: COMPONENTS\n})\nexport class PdmDialogModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"pdm-ui-kit-src-dialog.mjs","sources":["../../../src/dialog/dialog.component.ts","../../../src/dialog/dialog.component.html","../../../src/dialog/dialog.module.ts","../../../src/dialog/pdm-ui-kit-src-dialog.ts"],"sourcesContent":["import {\n\tChangeDetectionStrategy,\n\tComponent,\n\tContentChild,\n\tDirective,\n\tEventEmitter,\n\tHostListener,\n\tInput,\n\tOutput,\n} from \"@angular/core\";\nimport { cn, responsive, Z_INDEX } from \"pdm-ui-kit/src/utils\";\n\nexport type PdmDialogVariant = \"default\" | \"custom-close\";\n\n/**\n * @deprecated Use 'responsive' mode instead. Will be removed in v0.3.0\n */\nexport type PdmDialogSize =\n\t| \"desktop\"\n\t| \"mobile\"\n\t| \"mobile-fullscreen\"\n\t| \"sm\"\n\t| \"md\"\n\t| \"lg\"\n\t| \"xl\"\n\t| \"responsive\";\n\nexport type PdmDialogFooterAlign = \"right\" | \"full-width\" | \"left\";\n\n@Directive({ selector: \"[pdmHeader]\" })\nexport class PdmDialogHeaderDirective {}\n\n@Directive({ selector: \"[pdmFooter]\" })\nexport class PdmDialogFooterDirective {}\n\n/**\n * Responsive modal/dialog component.\n */\n@Component({\n\tselector: \"pdm-dialog\",\n\ttemplateUrl: \"./dialog.component.html\",\n\tstyles: [\n\t\t`\n :host {\n display: block;\n }\n `,\n\t],\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class PdmDialogComponent {\n\t@Input() open = false;\n\t@Input() variant: PdmDialogVariant = \"default\";\n\n\t/**\n\t * Dialog size. Responsive mode is fullscreen on mobile and a modal on desktop.\n\t */\n\t@Input() size: PdmDialogSize = \"responsive\";\n\n\t/**\n\t * Custom desktop maximum width, such as `800px` or `min(90vw, 800px)`.\n\t * Overrides `size` at the `sm` breakpoint; responsive mobile mode remains fullscreen.\n\t */\n\t@Input() maxWidth = \"\";\n\n\t@Input() title = \"\";\n\t@Input() description = \"\";\n\t@Input() closeOnBackdrop = true;\n\t@Input() closeOnEsc = true;\n\t@Input() showCloseButton = true;\n\t@Input() showHeader = true;\n\t@Input() showFooter = true;\n\t@Input() primaryActionText = \"Save changes\";\n\t@Input() secondaryActionText = \"Cancel\";\n\t@Input() alignFooter: PdmDialogFooterAlign = \"right\";\n\t@Input() headerClassName = \"\";\n\t@Input() bodyClassName = \"\";\n\t@Input() footerClassName = \"\";\n\t@Input() className = \"\";\n\n\t@ContentChild(PdmDialogHeaderDirective) customHeader?: PdmDialogHeaderDirective;\n\t@ContentChild(PdmDialogFooterDirective) customFooter?: PdmDialogFooterDirective;\n\n\t@Output() openChange = new EventEmitter<boolean>();\n\t@Output() primaryAction = new EventEmitter<void>();\n\t@Output() secondaryAction = new EventEmitter<void>();\n\n\t@HostListener(\"document:keydown.escape\")\n\tonEsc(): void {\n\t\tif (this.open && this.closeOnEsc) {\n\t\t\tthis.close();\n\t\t}\n\t}\n\n\tclose(): void {\n\t\tthis.openChange.emit(false);\n\t}\n\n\tonPrimaryAction(): void {\n\t\tthis.primaryAction.emit();\n\t}\n\n\tonSecondaryAction(): void {\n\t\tthis.secondaryAction.emit();\n\t}\n\n\tonBackdropClick(): void {\n\t\tif (this.closeOnBackdrop) {\n\t\t\tthis.close();\n\t\t}\n\t}\n\n\tget panelClassName(): string {\n\t\tif (this.size === \"desktop\") {\n\t\t\treturn this.buildPanelClasses([\n\t\t\t\t\"max-w-[640px]\",\n\t\t\t\t\"max-h-[calc(100vh-2rem)]\",\n\t\t\t\t\"rounded-[10px]\",\n\t\t\t]);\n\t\t}\n\n\t\tif (this.size === \"mobile\") {\n\t\t\treturn this.buildPanelClasses([\n\t\t\t\t\"max-w-[320px]\",\n\t\t\t\t\"min-h-[240px]\",\n\t\t\t\t\"rounded-[10px]\",\n\t\t\t]);\n\t\t}\n\n\t\tif (this.size === \"mobile-fullscreen\") {\n\t\t\treturn this.buildPanelClasses([\n\t\t\t\t\"max-w-[320px]\",\n\t\t\t\t\"h-[min(100dvh,640px)]\",\n\t\t\t\t\"rounded-none\",\n\t\t\t\t\"sm:rounded-[10px]\",\n\t\t\t]);\n\t\t}\n\n\t\tif (this.size === \"responsive\") {\n\t\t\treturn this.buildPanelClasses([\n\t\t\t\t\"w-full\",\n\t\t\t\t\"h-full\",\n\t\t\t\t\"max-h-[100dvh]\",\n\t\t\t\t\"rounded-t-[10px]\",\n\t\t\t\t\"sm:rounded-[10px]\",\n\t\t\t\t\"sm:w-auto\",\n\t\t\t\t\"sm:h-auto\",\n\t\t\t\t\"sm:max-w-[640px]\",\n\t\t\t\t\"sm:max-h-[calc(100vh-4rem)]\",\n\t\t\t]);\n\t\t}\n\n\t\tconst sizeMap = {\n\t\t\tsm: \"sm:max-w-[400px]\",\n\t\t\tmd: \"sm:max-w-[500px]\",\n\t\t\tlg: \"sm:max-w-[640px]\",\n\t\t\txl: \"sm:max-w-[800px]\",\n\t\t};\n\t\tconst maxWidth = sizeMap[this.size as keyof typeof sizeMap] || sizeMap.lg;\n\n\t\treturn this.buildPanelClasses([\n\t\t\t\"w-full\",\n\t\t\t\"h-full\",\n\t\t\t\"max-h-[100dvh]\",\n\t\t\t\"rounded-t-[10px]\",\n\t\t\t\"sm:rounded-[10px]\",\n\t\t\t\"sm:w-auto\",\n\t\t\t\"sm:h-auto\",\n\t\t\tmaxWidth,\n\t\t\t\"sm:max-h-[calc(100vh-4rem)]\",\n\t\t]);\n\t}\n\n\tprivate buildPanelClasses(sizeClasses: string[]): string {\n\t\tconst base = [\n\t\t\t\"relative\",\n\t\t\tZ_INDEX.modal,\n\t\t\t\"flex\",\n\t\t\t\"flex-col\",\n\t\t\t\"border border-solid\",\n\t\t\t\"border-border\",\n\t\t\t\"bg-background\",\n\t\t\t\"text-foreground\",\n\t\t\t\"shadow-lg\",\n\t\t\t\"overflow-hidden\",\n\t\t];\n\t\tconst maxWidthClass = this.maxWidth ? `sm:max-w-[${this.maxWidth}]` : \"\";\n\n\t\treturn cn(...base, ...sizeClasses, maxWidthClass, this.className);\n\t}\n\n\tget bodyWrapperClassName(): string {\n\t\treturn cn(\n\t\t\t\"flex-1 min-h-0 overflow-y-auto px-4 py-6 sm:px-6\",\n\t\t\tthis.bodyClassName,\n\t\t);\n\t}\n\n\tget headerWrapperClassName(): string {\n\t\treturn cn(\n\t\t\t\"flex items-start justify-between gap-3 p-4 sm:p-6 border-b border-border\",\n\t\t\tthis.headerClassName,\n\t\t);\n\t}\n\n\tget footerWrapperClassName(): string {\n\t\tconst effectiveAlign =\n\t\t\tthis.alignFooter === \"right\" && this.variant === \"custom-close\"\n\t\t\t\t? \"left\"\n\t\t\t\t: this.alignFooter;\n\n\t\treturn cn(\n\t\t\t\"p-4 sm:p-6 border-t border-border flex flex-col gap-2\",\n\t\t\teffectiveAlign === \"full-width\"\n\t\t\t\t? \"sm:flex-col\"\n\t\t\t\t: \"sm:flex-row sm:items-center\",\n\t\t\teffectiveAlign === \"left\" ? \"sm:justify-start\" : \"\",\n\t\t\teffectiveAlign === \"right\" ? \"sm:justify-end\" : \"\",\n\t\t\tthis.footerClassName,\n\t\t);\n\t}\n\n\tget containerClassName(): string {\n\t\treturn responsive({\n\t\t\tdefault: `fixed inset-x-0 bottom-0 ${Z_INDEX.modalBackdrop} flex items-end justify-center`,\n\t\t\tsm: `fixed inset-0 ${Z_INDEX.modalBackdrop} flex items-center justify-center p-4`,\n\t\t});\n\t}\n}\n","<div *ngIf=\"open\" [ngClass]=\"containerClassName\">\n <!-- Backdrop -->\n <div class=\"absolute inset-0 bg-foreground/30 backdrop-blur-sm\" (click)=\"onBackdropClick()\"></div>\n\n <!-- Dialog Panel -->\n <section role=\"dialog\" aria-modal=\"true\" cdkTrapFocus [ngClass]=\"panelClassName\">\n <!-- Header -->\n <div *ngIf=\"showHeader\" [ngClass]=\"headerWrapperClassName\">\n <ng-container *ngIf=\"customHeader; else defaultHeader\">\n <ng-content select=\"[pdmHeader]\"></ng-content>\n </ng-container>\n <ng-template #defaultHeader>\n <div class=\"min-w-0 flex-1\">\n <h2 class=\"m-0 text-lg font-semibold leading-none tracking-tight text-foreground\">{{ title }}</h2>\n <p *ngIf=\"description\" class=\"m-0 mt-2 text-sm text-muted-foreground\">{{ description }}</p>\n </div>\n <button\n *ngIf=\"showCloseButton\"\n type=\"button\"\n class=\"inline-flex h-6 w-6 flex-shrink-0 appearance-none box-border items-center justify-center rounded-sm border-0 bg-transparent p-0 text-foreground opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none\"\n (click)=\"close()\"\n aria-label=\"Close dialog\"\n >\n <svg viewBox=\"0 0 24 24\" class=\"h-4 w-4\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M6 6L18 18M18 6L6 18\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"></path>\n </svg>\n </button>\n </ng-template>\n </div>\n\n <!-- Body -->\n <div [ngClass]=\"bodyWrapperClassName\">\n <ng-content></ng-content>\n </div>\n\n <!-- Footer -->\n <div *ngIf=\"showFooter\" [ngClass]=\"footerWrapperClassName\">\n <ng-container *ngIf=\"customFooter; else defaultFooter\">\n <ng-content select=\"[pdmFooter]\"></ng-content>\n </ng-container>\n <ng-template #defaultFooter>\n <ng-container *ngIf=\"variant === 'custom-close'; else defaultActions\">\n <button\n type=\"button\"\n class=\"inline-flex h-9 w-full appearance-none box-border items-center justify-center rounded-md border border-solid border-input bg-background px-4 py-2 text-sm font-medium text-foreground shadow-sm sm:w-auto\"\n (click)=\"onSecondaryAction()\"\n >\n {{ secondaryActionText }}\n </button>\n </ng-container>\n\n <ng-template #defaultActions>\n <button\n type=\"button\"\n class=\"inline-flex h-9 w-full appearance-none box-border items-center justify-center rounded-md border border-solid border-input bg-background px-4 py-2 text-sm font-medium text-foreground shadow-sm sm:w-auto\"\n (click)=\"onSecondaryAction()\"\n >\n {{ secondaryActionText }}\n </button>\n <button\n type=\"button\"\n class=\"inline-flex h-9 w-full appearance-none box-border items-center justify-center rounded-md bg-primary px-4 py-2 text-sm font-medium text-primary-foreground shadow-sm sm:w-auto\"\n (click)=\"onPrimaryAction()\"\n >\n {{ primaryActionText }}\n </button>\n </ng-template>\n </ng-template>\n </div>\n </section>\n</div>\n","import { CommonModule } from '@angular/common';\nimport { A11yModule } from '@angular/cdk/a11y';\nimport { NgModule } from '@angular/core';\nimport {\n PdmDialogComponent,\n PdmDialogFooterDirective,\n PdmDialogHeaderDirective,\n} from './dialog.component';\n\nconst COMPONENTS = [\n PdmDialogComponent,\n PdmDialogHeaderDirective,\n PdmDialogFooterDirective,\n];\n\n@NgModule({\n imports: [CommonModule, A11yModule],\n declarations: COMPONENTS,\n exports: COMPONENTS\n})\nexport class PdmDialogModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
import { clsx } from 'clsx';
|
|
2
|
+
import { twMerge } from 'tailwind-merge';
|
|
3
|
+
|
|
1
4
|
/**
|
|
2
5
|
* Sistema de responsive utilities para PDM UI Kit
|
|
3
6
|
*
|
|
@@ -411,9 +414,26 @@ function getErrorMessage(errorCode, fieldName = 'Field') {
|
|
|
411
414
|
return messages[errorCode] || 'Invalid input';
|
|
412
415
|
}
|
|
413
416
|
|
|
417
|
+
/**
|
|
418
|
+
* Merge Tailwind classes intelligently.
|
|
419
|
+
*
|
|
420
|
+
* Combines `clsx` (conditional/array/object inputs) with `tailwind-merge`
|
|
421
|
+
* (deduplicates conflicting Tailwind utilities, last wins). This is the
|
|
422
|
+
* shadcn/ui `cn()` pattern. Use it wherever the library composes a
|
|
423
|
+
* user-supplied `className` override with internal base classes, so the
|
|
424
|
+
* override reliably wins regardless of generated CSS order.
|
|
425
|
+
*
|
|
426
|
+
* @example
|
|
427
|
+
* cn("max-w-[640px]", "max-w-[800px]") // => "max-w-[800px]"
|
|
428
|
+
* cn("p-4", condition && "p-6") // => "p-6" when condition is true
|
|
429
|
+
*/
|
|
430
|
+
function cn(...inputs) {
|
|
431
|
+
return twMerge(clsx(inputs));
|
|
432
|
+
}
|
|
433
|
+
|
|
414
434
|
/**
|
|
415
435
|
* Generated bundle index. Do not edit.
|
|
416
436
|
*/
|
|
417
437
|
|
|
418
|
-
export { BREAKPOINTS, RESPONSIVE_CONTAINER, RESPONSIVE_DISPLAY, TABLE_RESPONSIVE, Z_INDEX, getErrorMessage, hasLowercase, hasMaxLength, hasMinLength, hasNumber, hasSpecialChar, hasUppercase, isMaxValue, isMinValue, isNumeric, isValidEmail, isValidPhone, isValidUrl, logZIndexStack, overflowResponsive, responsive, spacingResponsive, valuesMatch, widthResponsive };
|
|
438
|
+
export { BREAKPOINTS, RESPONSIVE_CONTAINER, RESPONSIVE_DISPLAY, TABLE_RESPONSIVE, Z_INDEX, cn, getErrorMessage, hasLowercase, hasMaxLength, hasMinLength, hasNumber, hasSpecialChar, hasUppercase, isMaxValue, isMinValue, isNumeric, isValidEmail, isValidPhone, isValidUrl, logZIndexStack, overflowResponsive, responsive, spacingResponsive, valuesMatch, widthResponsive };
|
|
419
439
|
//# sourceMappingURL=pdm-ui-kit-src-utils.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pdm-ui-kit-src-utils.mjs","sources":["../../../src/utils/responsive.ts","../../../src/utils/z-index.ts","../../../src/utils/validators.ts","../../../src/utils/pdm-ui-kit-src-utils.ts"],"sourcesContent":["/**\n * Sistema de responsive utilities para PDM UI Kit\n * \n * Proporciona constantes, tipos y helpers para manejar responsive design\n * de forma consistente en todos los componentes.\n */\n\n/**\n * Breakpoints estándar de Tailwind CSS\n * Mobile-first approach: los estilos base son para mobile, los breakpoints son MIN-WIDTH\n */\nexport const BREAKPOINTS = {\n sm: '640px', // tablet portrait\n md: '768px', // tablet landscape\n lg: '1024px', // desktop\n xl: '1280px', // large desktop\n '2xl': '1536px' // extra large desktop\n} as const;\n\nexport type Breakpoint = keyof typeof BREAKPOINTS;\n\n/**\n * Estrategias de overflow para componentes que pueden desbordar\n */\nexport type OverflowStrategy = \n | 'auto' // Scroll automático cuando sea necesario\n | 'scroll' // Siempre scroll\n | 'hidden' // Ocultar contenido que desborda\n | 'visible'; // Permitir desbordamiento\n\n/**\n * Estrategias responsive para tablas\n */\nexport type TableResponsiveStrategy = \n | 'scroll' // Scroll horizontal en mobile (default, más simple)\n | 'stack' // Convertir filas en cards verticales en mobile\n | 'wrap' // Permitir que el contenido haga wrap\n | 'collapse'; // Colapsar columnas menos importantes en mobile\n\n/**\n * Helper para generar clases responsive de forma programática\n * \n * @example\n * responsive({ default: 'block', sm: 'flex', lg: 'grid' })\n * // Returns: 'block sm:flex lg:grid'\n */\nexport function responsive<T extends string>(\n config: Partial<Record<Breakpoint | 'default', T>>\n): string {\n const classes: string[] = [];\n \n if (config.default) {\n classes.push(config.default);\n }\n \n (['sm', 'md', 'lg', 'xl', '2xl'] as Breakpoint[]).forEach(bp => {\n if (config[bp]) {\n classes.push(`${bp}:${config[bp]}`);\n }\n });\n \n return classes.join(' ');\n}\n\n/**\n * Helper para overflow responsive\n * Maneja el caso común de scroll en mobile, auto en desktop\n * \n * @example\n * overflowResponsive('x', 'scroll', 'auto')\n * // Returns: 'overflow-x-scroll sm:overflow-x-auto'\n */\nexport function overflowResponsive(\n axis: 'x' | 'y' | 'both',\n mobile: OverflowStrategy,\n desktop?: OverflowStrategy\n): string {\n const axisClass = axis === 'both' ? 'overflow' : `overflow-${axis}`;\n const mobileClass = `${axisClass}-${mobile}`;\n \n if (!desktop || desktop === mobile) {\n return mobileClass;\n }\n \n return `${mobileClass} sm:${axisClass}-${desktop}`;\n}\n\n/**\n * Helper para spacing responsive\n * Útil para padding/margin que necesita ajustarse por breakpoint\n * \n * @example\n * spacingResponsive('px', { default: '4', sm: '6', lg: '8' })\n * // Returns: 'px-4 sm:px-6 lg:px-8'\n */\nexport function spacingResponsive(\n property: 'p' | 'px' | 'py' | 'pt' | 'pr' | 'pb' | 'pl' | 'm' | 'mx' | 'my' | 'mt' | 'mr' | 'mb' | 'ml',\n values: Partial<Record<Breakpoint | 'default', string>>\n): string {\n return responsive(\n Object.entries(values).reduce((acc, [key, value]) => {\n acc[key as Breakpoint | 'default'] = `${property}-${value}` as any;\n return acc;\n }, {} as Record<Breakpoint | 'default', string>)\n );\n}\n\n/**\n * Helper para width responsive\n * \n * @example\n * widthResponsive({ default: 'full', sm: 'auto', lg: '1/2' })\n * // Returns: 'w-full sm:w-auto lg:w-1/2'\n */\nexport function widthResponsive(\n values: Partial<Record<Breakpoint | 'default', string>>\n): string {\n return responsive(\n Object.entries(values).reduce((acc, [key, value]) => {\n acc[key as Breakpoint | 'default'] = `w-${value}` as any;\n return acc;\n }, {} as Record<Breakpoint | 'default', string>)\n );\n}\n\n/**\n * Clases comunes para containers responsive\n * Pensadas para wrappers que contienen contenido que puede desbordar\n */\nexport const RESPONSIVE_CONTAINER = {\n // Container con scroll horizontal en mobile, contenido visible en desktop\n tableWrapper: 'relative w-full overflow-x-auto sm:overflow-x-visible',\n \n // Container con padding negativo en mobile para scroll edge-to-edge\n tableWrapperFullBleed: 'relative w-full -mx-4 px-4 overflow-x-auto sm:mx-0 sm:px-0 sm:overflow-x-visible',\n \n // Container con max-width responsive\n contentWrapper: 'w-full mx-auto px-4 sm:px-6 lg:px-8 max-w-screen-2xl',\n \n // Container para modals/dialogs\n modalWrapper: 'w-full max-w-lg mx-auto px-4 sm:px-0',\n \n // Container para forms\n formWrapper: 'w-full max-w-md mx-auto space-y-4'\n} as const;\n\n/**\n * Clases comunes para display responsive\n */\nexport const RESPONSIVE_DISPLAY = {\n // Ocultar en mobile, mostrar en desktop\n hideOnMobile: 'hidden sm:block',\n \n // Mostrar solo en mobile\n showOnMobile: 'block sm:hidden',\n \n // Stack en mobile, flex en desktop\n stackToFlex: 'flex flex-col sm:flex-row',\n \n // Stack en mobile, grid en desktop\n stackToGrid: 'grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3'\n} as const;\n\n/**\n * Clases para table responsive strategies\n */\nexport const TABLE_RESPONSIVE = {\n // Scroll horizontal (default, más simple)\n scroll: {\n wrapper: 'relative w-full overflow-x-auto',\n table: 'w-full min-w-full',\n cell: 'whitespace-nowrap'\n },\n \n // Permitir wrap del contenido\n wrap: {\n wrapper: 'relative w-full overflow-x-auto',\n table: 'w-full',\n cell: 'whitespace-normal break-words'\n },\n \n // Stack en mobile (cada fila se convierte en card)\n // Requiere lógica adicional en el componente\n stack: {\n wrapper: 'relative w-full',\n table: 'w-full',\n row: 'block sm:table-row border-b sm:border-b-0',\n cell: 'block sm:table-cell py-2 sm:py-0 before:content-[attr(data-label)] before:font-medium before:inline-block before:w-32 sm:before:content-none'\n },\n \n // Collapse: ocultar columnas menos importantes en mobile\n // Se usa con clases de visibility en las columnas específicas\n collapse: {\n wrapper: 'relative w-full overflow-x-auto',\n table: 'w-full',\n cell: 'whitespace-nowrap',\n // Estas clases se aplican a columnas opcionales\n optionalColumn: 'hidden md:table-cell'\n }\n} as const;\n","/**\n * Z-Index Scale - Sistema centralizado de z-index\n *\n * JERARQUÍA (de menor a mayor):\n * 1. base (z-0) - Elementos normales del DOM\n * 2. dropdown (z-10) - Selects, combobox, date-pickers\n * 3. sticky (z-20) - Headers, navigation bars\n * 4. drawerBackdrop (z-30) - Backdrop de drawers\n * 5. drawer (z-40) - Sidebar drawer, sheets laterales\n * 6. modalBackdrop (z-40) - Backdrop de modals ( mismo nivel que drawer)\n * 7. modal (z-50) - Dialogs, alert-dialogs\n * 8. popover (z-[70]) - Tooltips, dropdowns DENTRO de modals\n * 9. toast (z-[100]) - Notificaciones que deben estar sobre TODO\n *\n * REGLA CRÍTICA:\n * - Componentes overlay (select options, dropdown menu, tooltip) SIEMPRE z-[70] o mayor\n * - Esto permite que funcionen DENTRO de modals (z-50)\n * - Backdrop de modal debe ser z-40 para estar DEBAJO del contenido del modal (z-50)\n */\n\nexport const Z_INDEX = {\n\t/**\n\t * Base - contenido normal del DOM\n\t */\n\tbase: \"z-0\",\n\n\t/**\n\t * Dropdown - Selects, combobox, date-pickers\n\t * Debe estar SOBRE contenido normal pero BAJO overlays\n\t */\n\tdropdown: \"z-10\",\n\n\t/**\n\t * Sticky - Headers, navigation fija\n\t */\n\tsticky: \"z-20\",\n\n\t/**\n\t * Drawer backdrop - Backdrop de sidebar drawer\n\t * Debe estar DEBAJO del drawer panel y DEBAJO de modals\n\t */\n\tdrawerBackdrop: \"z-30\",\n\n\t/**\n\t * Drawer - Sidebar drawer, sheets laterales\n\t * Debe estar SOBRE su backdrop pero BAJO modals\n\t */\n\tdrawer: \"z-40\",\n\n\t/**\n\t * Modal backdrop - Backdrop de dialogs\n\t * Mismo nivel que drawer backdrop (z-40)\n\t */\n\tmodalBackdrop: \"z-40\",\n\n\t/**\n\t * Modal - Dialogs, alert-dialogs\n\t * Debe estar SOBRE su backdrop\n\t */\n\tmodal: \"z-50\",\n\n\t/**\n\t * Popover - Tooltips, dropdowns, selects options DENTRO de modals\n\t * CRÍTICO: Debe ser MAYOR que modal (z-50) para aparecer sobre modals\n\t * USAR SIEMPRE mergeOverlayPanelClass() para asegurar este valor\n\t */\n\tpopover: \"z-[70]\",\n\n\t/**\n\t * Toast - Notificaciones globales\n\t * Debe estar sobre TODO\n\t */\n\ttoast: \"z-[100]\",\n} as const;\n\n/**\n * Helper para debugging z-index issues\n */\nexport function logZIndexStack(element: HTMLElement): void {\n\tif (typeof window === \"undefined\") return;\n\n\tlet current: HTMLElement | null = element;\n\tconst stack: Array<{ element: string; zIndex: string; position: string }> =\n\t\t[];\n\n\twhile (current && current !== document.body) {\n\t\tconst computed = window.getComputedStyle(current);\n\t\tconst zIndex = computed.zIndex;\n\t\tconst position = computed.position;\n\n\t\tif (zIndex !== \"auto\") {\n\t\t\tstack.push({\n\t\t\t\telement:\n\t\t\t\t\tcurrent.tagName +\n\t\t\t\t\t(current.className ? `.${current.className.split(\" \")[0]}` : \"\"),\n\t\t\t\tzIndex,\n\t\t\t\tposition,\n\t\t\t});\n\t\t}\n\n\t\tcurrent = current.parentElement;\n\t}\n\n\tconsole.table(stack);\n}\n","/**\n * Form validation utilities for PDM UI Kit\n *\n * Pure validation functions and patterns that work with any form validation library.\n * These functions validate values directly and return true/false, making them framework-agnostic.\n */\n\nexport interface PdmValidationError {\n message: string;\n code: string;\n}\n\n/**\n * Validate email format\n *\n * @example\n * isValidEmail('user@example.com') // true\n */\nexport function isValidEmail(value: string): boolean {\n if (!value) return false;\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n return emailRegex.test(value);\n}\n\n/**\n * Validate URL format\n *\n * @example\n * isValidUrl('https://example.com') // true\n */\nexport function isValidUrl(value: string): boolean {\n if (!value) return false;\n try {\n new URL(value);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Validate minimum length\n *\n * @example\n * hasMinLength('password', 8) // true if length >= 8\n */\nexport function hasMinLength(value: string, min: number): boolean {\n if (!value) return false;\n return String(value).length >= min;\n}\n\n/**\n * Validate maximum length\n *\n * @example\n * hasMaxLength('bio', 500) // true if length <= 500\n */\nexport function hasMaxLength(value: string, max: number): boolean {\n if (!value) return true;\n return String(value).length <= max;\n}\n\n/**\n * Validate that value only contains numbers\n *\n * @example\n * isNumeric('12345') // true\n */\nexport function isNumeric(value: string): boolean {\n if (!value) return false;\n return /^\\d+$/.test(String(value));\n}\n\n/**\n * Validate that two values match (e.g., password confirmation)\n *\n * @example\n * valuesMatch(password, confirmPassword) // true if they match\n */\nexport function valuesMatch(value1: string, value2: string): boolean {\n if (!value1 || !value2) return false;\n return value1 === value2;\n}\n\n/**\n * Validate minimum value\n *\n * @example\n * isMinValue(age, 18) // true if age >= 18\n */\nexport function isMinValue(value: number, min: number): boolean {\n if (value === null || value === undefined) return false;\n return value >= min;\n}\n\n/**\n * Validate maximum value\n *\n * @example\n * isMaxValue(percentage, 100) // true if percentage <= 100\n */\nexport function isMaxValue(value: number, max: number): boolean {\n if (value === null || value === undefined) return false;\n return value <= max;\n}\n\n/**\n * Validate phone number format (basic international format)\n * Accepts: +1234567890, (123) 456-7890, 123-456-7890\n *\n * @example\n * isValidPhone('+1234567890') // true\n */\nexport function isValidPhone(value: string): boolean {\n if (!value) return false;\n const phoneRegex = /^[\\+]?[(]?[0-9]{3}[)]?[-\\s\\.]?[0-9]{3}[-\\s\\.]?[0-9]{4,6}$/;\n return phoneRegex.test(String(value).replace(/\\s/g, ''));\n}\n\n/**\n * Check if value contains at least one uppercase letter\n *\n * @example\n * hasUppercase('Password') // true\n */\nexport function hasUppercase(value: string): boolean {\n if (!value) return false;\n return /[A-Z]/.test(value);\n}\n\n/**\n * Check if value contains at least one lowercase letter\n *\n * @example\n * hasLowercase('Password') // true\n */\nexport function hasLowercase(value: string): boolean {\n if (!value) return false;\n return /[a-z]/.test(value);\n}\n\n/**\n * Check if value contains at least one number\n *\n * @example\n * hasNumber('Pass123') // true\n */\nexport function hasNumber(value: string): boolean {\n if (!value) return false;\n return /\\d/.test(value);\n}\n\n/**\n * Check if value contains at least one special character\n *\n * @example\n * hasSpecialChar('Pass@123') // true\n */\nexport function hasSpecialChar(value: string): boolean {\n if (!value) return false;\n return /[!@#$%^&*()_+\\-=\\[\\]{};':\"\\\\|,.<>\\/?]/.test(value);\n}\n\n/**\n * Get user-friendly error message for validation failures\n *\n * @example\n * getErrorMessage('invalidEmail') // \"Please enter a valid email address\"\n */\nexport function getErrorMessage(errorCode: string, fieldName: string = 'Field'): string {\n const messages: Record<string, string> = {\n required: `${fieldName} is required`,\n invalidEmail: 'Please enter a valid email address',\n invalidUrl: 'Please enter a valid URL',\n invalidPhone: 'Please enter a valid phone number',\n notNumeric: `${fieldName} must contain only numbers`,\n noUppercase: `${fieldName} must contain at least one uppercase letter`,\n noLowercase: `${fieldName} must contain at least one lowercase letter`,\n noNumber: `${fieldName} must contain at least one number`,\n noSpecialChar: `${fieldName} must contain at least one special character`,\n fieldsDoNotMatch: 'Fields do not match',\n };\n\n return messages[errorCode] || 'Invalid input';\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"pdm-ui-kit-src-utils.mjs","sources":["../../../src/utils/responsive.ts","../../../src/utils/z-index.ts","../../../src/utils/validators.ts","../../../src/utils/cn.ts","../../../src/utils/pdm-ui-kit-src-utils.ts"],"sourcesContent":["/**\n * Sistema de responsive utilities para PDM UI Kit\n * \n * Proporciona constantes, tipos y helpers para manejar responsive design\n * de forma consistente en todos los componentes.\n */\n\n/**\n * Breakpoints estándar de Tailwind CSS\n * Mobile-first approach: los estilos base son para mobile, los breakpoints son MIN-WIDTH\n */\nexport const BREAKPOINTS = {\n sm: '640px', // tablet portrait\n md: '768px', // tablet landscape\n lg: '1024px', // desktop\n xl: '1280px', // large desktop\n '2xl': '1536px' // extra large desktop\n} as const;\n\nexport type Breakpoint = keyof typeof BREAKPOINTS;\n\n/**\n * Estrategias de overflow para componentes que pueden desbordar\n */\nexport type OverflowStrategy = \n | 'auto' // Scroll automático cuando sea necesario\n | 'scroll' // Siempre scroll\n | 'hidden' // Ocultar contenido que desborda\n | 'visible'; // Permitir desbordamiento\n\n/**\n * Estrategias responsive para tablas\n */\nexport type TableResponsiveStrategy = \n | 'scroll' // Scroll horizontal en mobile (default, más simple)\n | 'stack' // Convertir filas en cards verticales en mobile\n | 'wrap' // Permitir que el contenido haga wrap\n | 'collapse'; // Colapsar columnas menos importantes en mobile\n\n/**\n * Helper para generar clases responsive de forma programática\n * \n * @example\n * responsive({ default: 'block', sm: 'flex', lg: 'grid' })\n * // Returns: 'block sm:flex lg:grid'\n */\nexport function responsive<T extends string>(\n config: Partial<Record<Breakpoint | 'default', T>>\n): string {\n const classes: string[] = [];\n \n if (config.default) {\n classes.push(config.default);\n }\n \n (['sm', 'md', 'lg', 'xl', '2xl'] as Breakpoint[]).forEach(bp => {\n if (config[bp]) {\n classes.push(`${bp}:${config[bp]}`);\n }\n });\n \n return classes.join(' ');\n}\n\n/**\n * Helper para overflow responsive\n * Maneja el caso común de scroll en mobile, auto en desktop\n * \n * @example\n * overflowResponsive('x', 'scroll', 'auto')\n * // Returns: 'overflow-x-scroll sm:overflow-x-auto'\n */\nexport function overflowResponsive(\n axis: 'x' | 'y' | 'both',\n mobile: OverflowStrategy,\n desktop?: OverflowStrategy\n): string {\n const axisClass = axis === 'both' ? 'overflow' : `overflow-${axis}`;\n const mobileClass = `${axisClass}-${mobile}`;\n \n if (!desktop || desktop === mobile) {\n return mobileClass;\n }\n \n return `${mobileClass} sm:${axisClass}-${desktop}`;\n}\n\n/**\n * Helper para spacing responsive\n * Útil para padding/margin que necesita ajustarse por breakpoint\n * \n * @example\n * spacingResponsive('px', { default: '4', sm: '6', lg: '8' })\n * // Returns: 'px-4 sm:px-6 lg:px-8'\n */\nexport function spacingResponsive(\n property: 'p' | 'px' | 'py' | 'pt' | 'pr' | 'pb' | 'pl' | 'm' | 'mx' | 'my' | 'mt' | 'mr' | 'mb' | 'ml',\n values: Partial<Record<Breakpoint | 'default', string>>\n): string {\n return responsive(\n Object.entries(values).reduce((acc, [key, value]) => {\n acc[key as Breakpoint | 'default'] = `${property}-${value}` as any;\n return acc;\n }, {} as Record<Breakpoint | 'default', string>)\n );\n}\n\n/**\n * Helper para width responsive\n * \n * @example\n * widthResponsive({ default: 'full', sm: 'auto', lg: '1/2' })\n * // Returns: 'w-full sm:w-auto lg:w-1/2'\n */\nexport function widthResponsive(\n values: Partial<Record<Breakpoint | 'default', string>>\n): string {\n return responsive(\n Object.entries(values).reduce((acc, [key, value]) => {\n acc[key as Breakpoint | 'default'] = `w-${value}` as any;\n return acc;\n }, {} as Record<Breakpoint | 'default', string>)\n );\n}\n\n/**\n * Clases comunes para containers responsive\n * Pensadas para wrappers que contienen contenido que puede desbordar\n */\nexport const RESPONSIVE_CONTAINER = {\n // Container con scroll horizontal en mobile, contenido visible en desktop\n tableWrapper: 'relative w-full overflow-x-auto sm:overflow-x-visible',\n \n // Container con padding negativo en mobile para scroll edge-to-edge\n tableWrapperFullBleed: 'relative w-full -mx-4 px-4 overflow-x-auto sm:mx-0 sm:px-0 sm:overflow-x-visible',\n \n // Container con max-width responsive\n contentWrapper: 'w-full mx-auto px-4 sm:px-6 lg:px-8 max-w-screen-2xl',\n \n // Container para modals/dialogs\n modalWrapper: 'w-full max-w-lg mx-auto px-4 sm:px-0',\n \n // Container para forms\n formWrapper: 'w-full max-w-md mx-auto space-y-4'\n} as const;\n\n/**\n * Clases comunes para display responsive\n */\nexport const RESPONSIVE_DISPLAY = {\n // Ocultar en mobile, mostrar en desktop\n hideOnMobile: 'hidden sm:block',\n \n // Mostrar solo en mobile\n showOnMobile: 'block sm:hidden',\n \n // Stack en mobile, flex en desktop\n stackToFlex: 'flex flex-col sm:flex-row',\n \n // Stack en mobile, grid en desktop\n stackToGrid: 'grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3'\n} as const;\n\n/**\n * Clases para table responsive strategies\n */\nexport const TABLE_RESPONSIVE = {\n // Scroll horizontal (default, más simple)\n scroll: {\n wrapper: 'relative w-full overflow-x-auto',\n table: 'w-full min-w-full',\n cell: 'whitespace-nowrap'\n },\n \n // Permitir wrap del contenido\n wrap: {\n wrapper: 'relative w-full overflow-x-auto',\n table: 'w-full',\n cell: 'whitespace-normal break-words'\n },\n \n // Stack en mobile (cada fila se convierte en card)\n // Requiere lógica adicional en el componente\n stack: {\n wrapper: 'relative w-full',\n table: 'w-full',\n row: 'block sm:table-row border-b sm:border-b-0',\n cell: 'block sm:table-cell py-2 sm:py-0 before:content-[attr(data-label)] before:font-medium before:inline-block before:w-32 sm:before:content-none'\n },\n \n // Collapse: ocultar columnas menos importantes en mobile\n // Se usa con clases de visibility en las columnas específicas\n collapse: {\n wrapper: 'relative w-full overflow-x-auto',\n table: 'w-full',\n cell: 'whitespace-nowrap',\n // Estas clases se aplican a columnas opcionales\n optionalColumn: 'hidden md:table-cell'\n }\n} as const;\n","/**\n * Z-Index Scale - Sistema centralizado de z-index\n *\n * JERARQUÍA (de menor a mayor):\n * 1. base (z-0) - Elementos normales del DOM\n * 2. dropdown (z-10) - Selects, combobox, date-pickers\n * 3. sticky (z-20) - Headers, navigation bars\n * 4. drawerBackdrop (z-30) - Backdrop de drawers\n * 5. drawer (z-40) - Sidebar drawer, sheets laterales\n * 6. modalBackdrop (z-40) - Backdrop de modals ( mismo nivel que drawer)\n * 7. modal (z-50) - Dialogs, alert-dialogs\n * 8. popover (z-[70]) - Tooltips, dropdowns DENTRO de modals\n * 9. toast (z-[100]) - Notificaciones que deben estar sobre TODO\n *\n * REGLA CRÍTICA:\n * - Componentes overlay (select options, dropdown menu, tooltip) SIEMPRE z-[70] o mayor\n * - Esto permite que funcionen DENTRO de modals (z-50)\n * - Backdrop de modal debe ser z-40 para estar DEBAJO del contenido del modal (z-50)\n */\n\nexport const Z_INDEX = {\n\t/**\n\t * Base - contenido normal del DOM\n\t */\n\tbase: \"z-0\",\n\n\t/**\n\t * Dropdown - Selects, combobox, date-pickers\n\t * Debe estar SOBRE contenido normal pero BAJO overlays\n\t */\n\tdropdown: \"z-10\",\n\n\t/**\n\t * Sticky - Headers, navigation fija\n\t */\n\tsticky: \"z-20\",\n\n\t/**\n\t * Drawer backdrop - Backdrop de sidebar drawer\n\t * Debe estar DEBAJO del drawer panel y DEBAJO de modals\n\t */\n\tdrawerBackdrop: \"z-30\",\n\n\t/**\n\t * Drawer - Sidebar drawer, sheets laterales\n\t * Debe estar SOBRE su backdrop pero BAJO modals\n\t */\n\tdrawer: \"z-40\",\n\n\t/**\n\t * Modal backdrop - Backdrop de dialogs\n\t * Mismo nivel que drawer backdrop (z-40)\n\t */\n\tmodalBackdrop: \"z-40\",\n\n\t/**\n\t * Modal - Dialogs, alert-dialogs\n\t * Debe estar SOBRE su backdrop\n\t */\n\tmodal: \"z-50\",\n\n\t/**\n\t * Popover - Tooltips, dropdowns, selects options DENTRO de modals\n\t * CRÍTICO: Debe ser MAYOR que modal (z-50) para aparecer sobre modals\n\t * USAR SIEMPRE mergeOverlayPanelClass() para asegurar este valor\n\t */\n\tpopover: \"z-[70]\",\n\n\t/**\n\t * Toast - Notificaciones globales\n\t * Debe estar sobre TODO\n\t */\n\ttoast: \"z-[100]\",\n} as const;\n\n/**\n * Helper para debugging z-index issues\n */\nexport function logZIndexStack(element: HTMLElement): void {\n\tif (typeof window === \"undefined\") return;\n\n\tlet current: HTMLElement | null = element;\n\tconst stack: Array<{ element: string; zIndex: string; position: string }> =\n\t\t[];\n\n\twhile (current && current !== document.body) {\n\t\tconst computed = window.getComputedStyle(current);\n\t\tconst zIndex = computed.zIndex;\n\t\tconst position = computed.position;\n\n\t\tif (zIndex !== \"auto\") {\n\t\t\tstack.push({\n\t\t\t\telement:\n\t\t\t\t\tcurrent.tagName +\n\t\t\t\t\t(current.className ? `.${current.className.split(\" \")[0]}` : \"\"),\n\t\t\t\tzIndex,\n\t\t\t\tposition,\n\t\t\t});\n\t\t}\n\n\t\tcurrent = current.parentElement;\n\t}\n\n\tconsole.table(stack);\n}\n","/**\n * Form validation utilities for PDM UI Kit\n *\n * Pure validation functions and patterns that work with any form validation library.\n * These functions validate values directly and return true/false, making them framework-agnostic.\n */\n\nexport interface PdmValidationError {\n message: string;\n code: string;\n}\n\n/**\n * Validate email format\n *\n * @example\n * isValidEmail('user@example.com') // true\n */\nexport function isValidEmail(value: string): boolean {\n if (!value) return false;\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n return emailRegex.test(value);\n}\n\n/**\n * Validate URL format\n *\n * @example\n * isValidUrl('https://example.com') // true\n */\nexport function isValidUrl(value: string): boolean {\n if (!value) return false;\n try {\n new URL(value);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Validate minimum length\n *\n * @example\n * hasMinLength('password', 8) // true if length >= 8\n */\nexport function hasMinLength(value: string, min: number): boolean {\n if (!value) return false;\n return String(value).length >= min;\n}\n\n/**\n * Validate maximum length\n *\n * @example\n * hasMaxLength('bio', 500) // true if length <= 500\n */\nexport function hasMaxLength(value: string, max: number): boolean {\n if (!value) return true;\n return String(value).length <= max;\n}\n\n/**\n * Validate that value only contains numbers\n *\n * @example\n * isNumeric('12345') // true\n */\nexport function isNumeric(value: string): boolean {\n if (!value) return false;\n return /^\\d+$/.test(String(value));\n}\n\n/**\n * Validate that two values match (e.g., password confirmation)\n *\n * @example\n * valuesMatch(password, confirmPassword) // true if they match\n */\nexport function valuesMatch(value1: string, value2: string): boolean {\n if (!value1 || !value2) return false;\n return value1 === value2;\n}\n\n/**\n * Validate minimum value\n *\n * @example\n * isMinValue(age, 18) // true if age >= 18\n */\nexport function isMinValue(value: number, min: number): boolean {\n if (value === null || value === undefined) return false;\n return value >= min;\n}\n\n/**\n * Validate maximum value\n *\n * @example\n * isMaxValue(percentage, 100) // true if percentage <= 100\n */\nexport function isMaxValue(value: number, max: number): boolean {\n if (value === null || value === undefined) return false;\n return value <= max;\n}\n\n/**\n * Validate phone number format (basic international format)\n * Accepts: +1234567890, (123) 456-7890, 123-456-7890\n *\n * @example\n * isValidPhone('+1234567890') // true\n */\nexport function isValidPhone(value: string): boolean {\n if (!value) return false;\n const phoneRegex = /^[\\+]?[(]?[0-9]{3}[)]?[-\\s\\.]?[0-9]{3}[-\\s\\.]?[0-9]{4,6}$/;\n return phoneRegex.test(String(value).replace(/\\s/g, ''));\n}\n\n/**\n * Check if value contains at least one uppercase letter\n *\n * @example\n * hasUppercase('Password') // true\n */\nexport function hasUppercase(value: string): boolean {\n if (!value) return false;\n return /[A-Z]/.test(value);\n}\n\n/**\n * Check if value contains at least one lowercase letter\n *\n * @example\n * hasLowercase('Password') // true\n */\nexport function hasLowercase(value: string): boolean {\n if (!value) return false;\n return /[a-z]/.test(value);\n}\n\n/**\n * Check if value contains at least one number\n *\n * @example\n * hasNumber('Pass123') // true\n */\nexport function hasNumber(value: string): boolean {\n if (!value) return false;\n return /\\d/.test(value);\n}\n\n/**\n * Check if value contains at least one special character\n *\n * @example\n * hasSpecialChar('Pass@123') // true\n */\nexport function hasSpecialChar(value: string): boolean {\n if (!value) return false;\n return /[!@#$%^&*()_+\\-=\\[\\]{};':\"\\\\|,.<>\\/?]/.test(value);\n}\n\n/**\n * Get user-friendly error message for validation failures\n *\n * @example\n * getErrorMessage('invalidEmail') // \"Please enter a valid email address\"\n */\nexport function getErrorMessage(errorCode: string, fieldName: string = 'Field'): string {\n const messages: Record<string, string> = {\n required: `${fieldName} is required`,\n invalidEmail: 'Please enter a valid email address',\n invalidUrl: 'Please enter a valid URL',\n invalidPhone: 'Please enter a valid phone number',\n notNumeric: `${fieldName} must contain only numbers`,\n noUppercase: `${fieldName} must contain at least one uppercase letter`,\n noLowercase: `${fieldName} must contain at least one lowercase letter`,\n noNumber: `${fieldName} must contain at least one number`,\n noSpecialChar: `${fieldName} must contain at least one special character`,\n fieldsDoNotMatch: 'Fields do not match',\n };\n\n return messages[errorCode] || 'Invalid input';\n}\n","import { type ClassValue, clsx } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\n/**\n * Merge Tailwind classes intelligently.\n *\n * Combines `clsx` (conditional/array/object inputs) with `tailwind-merge`\n * (deduplicates conflicting Tailwind utilities, last wins). This is the\n * shadcn/ui `cn()` pattern. Use it wherever the library composes a\n * user-supplied `className` override with internal base classes, so the\n * override reliably wins regardless of generated CSS order.\n *\n * @example\n * cn(\"max-w-[640px]\", \"max-w-[800px]\") // => \"max-w-[800px]\"\n * cn(\"p-4\", condition && \"p-6\") // => \"p-6\" when condition is true\n */\nexport function cn(...inputs: ClassValue[]): string {\n\treturn twMerge(clsx(inputs));\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|