@bsginstitute/bsg-integra 0.0.3 → 0.0.4

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.
@@ -338,11 +338,11 @@ const alertVariants = cva(clsx(
338
338
  'box-border'), {
339
339
  variants: {
340
340
  variant: {
341
- default: 'text-sky-600',
342
- info: 'bg-blue-200 text-blue-600',
343
- success: 'bg-green-200 text-green-600',
344
- warning: 'bg-yellow-200 text-yellow-600',
345
- destructive: 'bg-red-200 text-red-600',
341
+ default: 'text-muted-foreground',
342
+ info: 'bg-info/20 text-info',
343
+ success: 'bg-success/20 text-success',
344
+ warning: 'bg-warning/20 text-warning',
345
+ destructive: 'bg-destructive/20 text-destructive',
346
346
  },
347
347
  },
348
348
  defaultVariants: {
@@ -718,8 +718,8 @@ const avatarVariants = cva(clsx(
718
718
  },
719
719
  type: {
720
720
  default: 'bg-transparent',
721
- fallback: 'bg-violet-600',
722
- image: 'bg-neutral-100',
721
+ fallback: 'bg-primary',
722
+ image: 'bg-muted',
723
723
  },
724
724
  },
725
725
  defaultVariants: {
@@ -734,7 +734,7 @@ const avatarVariants = cva(clsx(
734
734
  */
735
735
  const avatarInitialsVariants = cva(clsx(
736
736
  // Color
737
- 'text-white',
737
+ 'text-primary-foreground',
738
738
  // Typography
739
739
  'font-sans font-normal tracking-wide',
740
740
  // Layout
@@ -980,11 +980,11 @@ const badgeVariants = cva(clsx(
980
980
  'pointer-events-none select-none'), {
981
981
  variants: {
982
982
  variant: {
983
- default: 'bg-violet-600 text-white',
984
- secondary: 'bg-blue-600 text-white',
985
- destructive: 'bg-red-600 text-white',
986
- success: 'bg-green-600 text-white',
987
- outline: 'bg-white text-slate-800 border border-slate-300',
983
+ default: 'bg-primary text-primary-foreground',
984
+ secondary: 'bg-secondary text-secondary-foreground',
985
+ destructive: 'bg-destructive text-destructive-foreground',
986
+ success: 'bg-success text-success-foreground',
987
+ outline: 'bg-background text-foreground border border-border',
988
988
  },
989
989
  size: {
990
990
  dot: 'w-3 h-3', // 12x12
@@ -1001,7 +1001,7 @@ const badgeVariants = cva(clsx(
1001
1001
  {
1002
1002
  variant: 'outline',
1003
1003
  size: 'dot',
1004
- class: 'bg-transparent border border-slate-300',
1004
+ class: 'bg-transparent border border-border',
1005
1005
  },
1006
1006
  // Default size "text" (pequeño)
1007
1007
  {
@@ -1138,28 +1138,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
1138
1138
  `, styles: [":host{display:inline-block}\n"] }]
1139
1139
  }], propDecorators: { variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], layout: [{ type: i0.Input, args: [{ isSignal: true, alias: "layout", required: false }] }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }], className: [{ type: i0.Input, args: [{ isSignal: true, alias: "className", required: false }] }] } });
1140
1140
 
1141
- /**
1142
- * Button variants
1143
- *
1144
- * Controls the button styles including size, variant, shape, and state
1145
- */
1146
- const buttonVariants = cva(clsx(
1147
- // Layout
1148
- 'inline-flex items-center justify-center',
1149
- // Gap
1150
- 'gap-2.5',
1151
- // Typography
1152
- 'text-sm font-medium leading-normal tracking-tight',
1153
- // Cursor
1154
- 'cursor-pointer',
1155
- // Transition
1156
- 'transition-all duration-200',
1157
- // Whitespace
1158
- 'whitespace-nowrap',
1159
- // Border reset
1160
- 'border-0',
1161
- // Focus outline reset (prevent focus ring on click)
1162
- 'outline-none'), {
1141
+ // projects/bsg-integra/src/lib/components/button/button.variants.ts
1142
+ const buttonVariants = cva(clsx('inline-flex items-center justify-center', 'gap-2.5', 'text-sm font-medium leading-normal tracking-tight', 'cursor-pointer', 'transition-all duration-200', 'whitespace-nowrap', 'border-0', 'outline-none', 'relative'), {
1163
1143
  variants: {
1164
1144
  size: {
1165
1145
  sm: 'h-[27px] py-2 px-4',
@@ -1169,7 +1149,7 @@ const buttonVariants = cva(clsx(
1169
1149
  variant: {
1170
1150
  default: clsx('bg-violet-600 text-white', 'hover:opacity-90', 'active:shadow-[inset_0_2px_4px_0_rgba(0,0,0,0.12)]', 'focus-visible:bg-violet-900 focus-visible:ring-2 focus-visible:ring-violet-600 focus-visible:ring-offset-2'),
1171
1151
  secondary: clsx('bg-blue-600 text-white', 'hover:opacity-90', 'active:shadow-[inset_0_2px_4px_0_rgba(0,0,0,0.12)]', 'focus-visible:bg-blue-700 focus-visible:ring-2 focus-visible:ring-blue-600 focus-visible:ring-offset-2'),
1172
- outline: clsx('bg-transparent text-violet-600 border border-violet-600', 'hover:opacity-90', 'active:shadow-[inset_0_2px_4px_0_rgba(0,0,0,0.12)]', 'focus-visible:border-violet-900 focus-visible:text-violet-900 focus-visible:ring-2 focus-visible:ring-violet-600 focus-visible:ring-offset-2'),
1152
+ outline: clsx('bg-transparent text-violet-600 border border-violet-600', 'hover:bg-violet-50', 'active:bg-violet-100', 'focus-visible:border-violet-900 focus-visible:text-violet-900 focus-visible:ring-2 focus-visible:ring-violet-600 focus-visible:ring-offset-2'),
1173
1153
  ghost: clsx('bg-violet-100 text-slate-800', 'hover:opacity-90', 'active:shadow-[inset_0_2px_4px_0_rgba(0,0,0,0.12)]', 'focus-visible:bg-violet-200 focus-visible:ring-2 focus-visible:ring-violet-600 focus-visible:ring-offset-2'),
1174
1154
  link: clsx('bg-transparent text-blue-600', 'hover:opacity-90', 'active:underline', 'focus-visible:text-blue-700 focus-visible:ring-2 focus-visible:ring-blue-600 focus-visible:ring-offset-2'),
1175
1155
  destructive: clsx('bg-red-600 text-white', 'hover:opacity-90', 'active:shadow-[inset_0_2px_4px_0_rgba(0,0,0,0.12)]', 'focus-visible:bg-red-700 focus-visible:ring-2 focus-visible:ring-red-600 focus-visible:ring-offset-2'),
@@ -1179,7 +1159,7 @@ const buttonVariants = cva(clsx(
1179
1159
  pill: 'rounded-full',
1180
1160
  icon: 'rounded-md',
1181
1161
  'icon-text': 'rounded-md',
1182
- 'icon-only': 'rounded-full p-0',
1162
+ 'icon-only': 'rounded-full',
1183
1163
  },
1184
1164
  disabled: {
1185
1165
  true: 'opacity-40 cursor-not-allowed pointer-events-none',
@@ -1187,62 +1167,22 @@ const buttonVariants = cva(clsx(
1187
1167
  },
1188
1168
  },
1189
1169
  compoundVariants: [
1190
- // Icon shape sizes
1191
1170
  { shape: 'icon', size: 'sm', class: 'w-[27px] h-[27px] p-2' },
1192
1171
  { shape: 'icon', size: 'md', class: 'w-[35px] h-[35px] p-2' },
1193
1172
  { shape: 'icon', size: 'lg', class: 'w-[43px] h-[43px] p-2' },
1194
- // Icon-only shape sizes
1195
- {
1196
- shape: 'icon-only',
1197
- size: 'sm',
1198
- class: 'w-[27px] h-[27px] min-w-[27px] min-h-[27px]',
1199
- },
1200
- {
1201
- shape: 'icon-only',
1202
- size: 'md',
1203
- class: 'w-[35px] h-[35px] min-w-[35px] min-h-[35px]',
1204
- },
1205
- {
1206
- shape: 'icon-only',
1207
- size: 'lg',
1208
- class: 'w-[43px] h-[43px] min-w-[43px] min-h-[43px]',
1209
- },
1210
- // Icon-only + outline variant
1173
+ { shape: 'icon-only', size: 'sm', class: 'w-[27px] h-[27px] min-w-[27px] min-h-[27px] p-0' },
1174
+ { shape: 'icon-only', size: 'md', class: 'w-[35px] h-[35px] min-w-[35px] min-h-[35px] p-0' },
1175
+ { shape: 'icon-only', size: 'lg', class: 'w-[43px] h-[43px] min-w-[43px] min-h-[43px] p-0' },
1211
1176
  {
1212
1177
  shape: 'icon-only',
1213
1178
  variant: 'outline',
1214
1179
  class: 'bg-transparent border border-slate-300 text-purple-600 hover:opacity-90 active:border-purple-600 focus-visible:border-slate-500 focus-visible:text-purple-800 focus-visible:ring-2 focus-visible:ring-purple-600 focus-visible:ring-offset-2',
1215
1180
  },
1216
- // Icon-only + default variant
1217
- {
1218
- shape: 'icon-only',
1219
- variant: 'default',
1220
- class: 'bg-violet-600 text-white border border-violet-600',
1221
- },
1222
- // Icon-only + secondary variant
1223
- {
1224
- shape: 'icon-only',
1225
- variant: 'secondary',
1226
- class: 'bg-blue-600 text-white border border-blue-600',
1227
- },
1228
- // Icon-only + ghost variant
1229
- {
1230
- shape: 'icon-only',
1231
- variant: 'ghost',
1232
- class: 'bg-violet-100 text-slate-800 border border-violet-100',
1233
- },
1234
- // Icon-only + link variant
1235
- {
1236
- shape: 'icon-only',
1237
- variant: 'link',
1238
- class: 'bg-transparent text-blue-600 border border-transparent',
1239
- },
1240
- // Icon-only + destructive variant
1241
- {
1242
- shape: 'icon-only',
1243
- variant: 'destructive',
1244
- class: 'bg-red-600 text-white border border-red-600',
1245
- },
1181
+ { shape: 'icon-only', variant: 'default', class: 'bg-violet-600 text-white border border-violet-600' },
1182
+ { shape: 'icon-only', variant: 'secondary', class: 'bg-blue-600 text-white border border-blue-600' },
1183
+ { shape: 'icon-only', variant: 'ghost', class: 'bg-violet-100 text-slate-800 border border-violet-100' },
1184
+ { shape: 'icon-only', variant: 'link', class: 'bg-transparent text-blue-600 border border-transparent' },
1185
+ { shape: 'icon-only', variant: 'destructive', class: 'bg-red-600 text-white border border-red-600' },
1246
1186
  ],
1247
1187
  defaultVariants: {
1248
1188
  size: 'md',
@@ -1251,14 +1191,7 @@ const buttonVariants = cva(clsx(
1251
1191
  disabled: false,
1252
1192
  },
1253
1193
  });
1254
- /**
1255
- * Button icon variants
1256
- *
1257
- * Controls the icon styling within buttons
1258
- */
1259
- const buttonIconVariants = cva(clsx(
1260
- // Layout
1261
- 'shrink-0'), {
1194
+ const buttonIconVariants = cva(clsx('inline-flex items-center justify-center shrink-0 leading-none'), {
1262
1195
  variants: {
1263
1196
  position: {
1264
1197
  left: '-mr-0.5',
@@ -1270,187 +1203,112 @@ const buttonIconVariants = cva(clsx(
1270
1203
  position: 'left',
1271
1204
  },
1272
1205
  });
1273
- /**
1274
- * Button label variants
1275
- *
1276
- * Controls the label text styling
1277
- */
1278
- const buttonLabelVariants = cva(clsx(
1279
- // Layout
1280
- 'inline-block'));
1281
- /**
1282
- * Button icon-only wrapper variants
1283
- *
1284
- * Controls the icon wrapper for icon-only buttons
1285
- */
1286
- const buttonIconOnlyVariants = cva(clsx(
1287
- // Layout
1288
- 'flex items-center justify-center', 'w-full h-full'), {
1206
+ const buttonLabelVariants = cva(clsx('inline-block'));
1207
+ const buttonIconOnlyVariants = cva(clsx('flex items-center justify-center leading-none'), {
1289
1208
  variants: {
1290
- size: {
1291
- sm: 'w-[17px] h-[17px]',
1292
- md: 'w-[21px] h-[21px]',
1293
- lg: 'w-[26px] h-[26px]',
1209
+ size: { sm: '', md: '', lg: '' },
1210
+ },
1211
+ defaultVariants: { size: 'md' },
1212
+ });
1213
+ /** ✅ nuevo: spinner overlay centrado */
1214
+ const buttonSpinnerVariants = cva(clsx('absolute inset-0 flex items-center justify-center'), {
1215
+ variants: {
1216
+ shape: {
1217
+ rectangular: '',
1218
+ pill: '',
1219
+ icon: '',
1220
+ 'icon-text': '',
1221
+ 'icon-only': '',
1294
1222
  },
1295
1223
  },
1296
1224
  defaultVariants: {
1297
- size: 'md',
1225
+ shape: 'rectangular',
1298
1226
  },
1299
1227
  });
1300
1228
 
1301
- // Icon definitions for icon-only buttons
1302
- const icons = {
1303
- 'chevron-left': `<svg width="100%" height="100%" viewBox="0 0 17 17" fill="none" xmlns="http://www.w3.org/2000/svg">
1304
- <path d="M9.64776 3.57275C9.91136 3.30915 10.3386 3.30915 10.6023 3.57275C10.8659 3.83636 10.8659 4.26364 10.6023 4.52724L7.0295 8.1L10.6023 11.6728C10.8659 11.9364 10.8659 12.3636 10.6023 12.6272C10.3386 12.8908 9.91136 12.8908 9.64776 12.6272L5.59776 8.57724C5.33415 8.31364 5.33415 7.88636 5.59776 7.62275L9.64776 3.57275Z" fill="currentColor"/>
1305
- </svg>`,
1306
- 'chevron-right': `<svg width="100%" height="100%" viewBox="0 0 17 17" fill="none" xmlns="http://www.w3.org/2000/svg">
1307
- <path d="M6.35224 3.57275C6.08864 3.30915 5.66136 3.30915 5.39776 3.57275C5.13415 3.83636 5.13415 4.26364 5.39776 4.52724L8.9705 8.1L5.39776 11.6728C5.13415 11.9364 5.13415 12.3636 5.39776 12.6272C5.66136 12.8908 6.08864 12.8908 6.35224 12.6272L10.4022 8.57724C10.6659 8.31364 10.6659 7.88636 10.4022 7.62275L6.35224 3.57275Z" fill="currentColor"/>
1308
- </svg>`,
1309
- 'chevron-up': `<svg width="100%" height="100%" viewBox="0 0 17 17" fill="none" xmlns="http://www.w3.org/2000/svg">
1310
- <path d="M3.57275 9.64776C3.30915 9.91136 3.30915 10.3386 3.57275 10.6023C3.83636 10.8659 4.26364 10.8659 4.52724 10.6023L8.1 7.0295L11.6728 10.6023C11.9364 10.8659 12.3636 10.8659 12.6272 10.6023C12.8908 10.3386 12.8908 9.91136 12.6272 9.64776L8.57724 5.59776C8.31364 5.33415 7.88636 5.33415 7.62275 5.59776L3.57275 9.64776Z" fill="currentColor"/>
1311
- </svg>`,
1312
- 'chevron-down': `<svg width="100%" height="100%" viewBox="0 0 17 17" fill="none" xmlns="http://www.w3.org/2000/svg">
1313
- <path d="M3.57275 6.35224C3.30915 6.08864 3.30915 5.66136 3.57275 5.39776C3.83636 5.13415 4.26364 5.13415 4.52724 5.39776L8.1 8.9705L11.6728 5.39776C11.9364 5.13415 12.3636 5.13415 12.6272 5.39776C12.8908 5.66136 12.8908 6.08864 12.6272 6.35224L8.57724 10.4022C8.31364 10.6659 7.88636 10.6659 7.62275 10.4022L3.57275 6.35224Z" fill="currentColor"/>
1314
- </svg>`,
1315
- check: `<svg width="100%" height="100%" viewBox="0 0 15 15" fill="none" xmlns="http://www.w3.org/2000/svg">
1316
- <path d="M11.4669 3.72684C11.7558 3.91574 11.8369 4.30308 11.648 4.59198L7.39799 11.092C7.29783 11.2452 7.13556 11.3467 6.95402 11.3699C6.77247 11.3931 6.58989 11.3355 6.45446 11.2124L3.70446 8.71241C3.44905 8.48022 3.43023 8.08494 3.66242 7.82953C3.89461 7.57412 4.28989 7.55529 4.5453 7.78749L6.75292 9.79441L10.6018 3.90792C10.7907 3.61902 11.178 3.53795 11.4669 3.72684Z" fill="currentColor"/>
1317
- </svg>`,
1318
- none: '',
1319
- };
1320
- /**
1321
- * Button Component - Interactive button with multiple variants
1322
- *
1323
- * Following shadcn/ui pattern:
1324
- * ```html
1325
- * <bsg-button
1326
- * [variant]="'default'"
1327
- * [size]="'md'"
1328
- * [shape]="'rectangular'"
1329
- * [label]="'Click me'"
1330
- * (Click)="onClick()"
1331
- * />
1332
- * ```
1333
- */
1334
1229
  class ButtonComponent {
1335
- sanitizer;
1336
- constructor(sanitizer) {
1337
- this.sanitizer = sanitizer;
1338
- }
1339
- /** Size of the button */
1340
1230
  size = input('md', ...(ngDevMode ? [{ debugName: "size" }] : []));
1341
- /** Visual variant of the button */
1342
1231
  variant = input('default', ...(ngDevMode ? [{ debugName: "variant" }] : []));
1343
- /** Shape of the button */
1344
1232
  shape = input('rectangular', ...(ngDevMode ? [{ debugName: "shape" }] : []));
1345
- /** Button label text */
1346
1233
  label = input('Boton', ...(ngDevMode ? [{ debugName: "label" }] : []));
1347
- /** Show icon */
1348
- icon = input(false, ...(ngDevMode ? [{ debugName: "icon" }] : []));
1349
- /** Icon position (left or right) */
1350
- iconPosition = input('left', ...(ngDevMode ? [{ debugName: "iconPosition" }] : []));
1351
- /** Icon name for icon-only buttons */
1352
- iconName = input('chevron-left', ...(ngDevMode ? [{ debugName: "iconName" }] : []));
1353
- /** Disabled state */
1354
1234
  disabled = input(false, ...(ngDevMode ? [{ debugName: "disabled" }] : []));
1355
- /** Additional CSS classes */
1235
+ /** nuevo: muestra spinner y bloquea click */
1236
+ spinner = input(false, ...(ngDevMode ? [{ debugName: "spinner" }] : []));
1237
+ /** Accesibilidad para icon buttons */
1238
+ ariaLabel = input(null, ...(ngDevMode ? [{ debugName: "ariaLabel" }] : []));
1356
1239
  className = input(...(ngDevMode ? [undefined, { debugName: "className" }] : []));
1357
- /** Click event emitter */
1358
1240
  Click = output();
1359
- // Computed disabled state
1360
- isDisabled = computed(() => this.disabled(), ...(ngDevMode ? [{ debugName: "isDisabled" }] : []));
1361
- // Computed button classes
1241
+ isDisabled = computed(() => this.disabled() || this.spinner(), ...(ngDevMode ? [{ debugName: "isDisabled" }] : []));
1242
+ isIconButton = computed(() => this.shape() === 'icon-only' || this.shape() === 'icon', ...(ngDevMode ? [{ debugName: "isIconButton" }] : []));
1243
+ buttonSquarePx = computed(() => (this.size() === 'sm' ? 27 : this.size() === 'lg' ? 43 : 35), ...(ngDevMode ? [{ debugName: "buttonSquarePx" }] : []));
1244
+ iconFontPx = computed(() => (this.size() === 'sm' ? 15 : this.size() === 'lg' ? 22 : 18), ...(ngDevMode ? [{ debugName: "iconFontPx" }] : []));
1245
+ spinnerPx = computed(() => (this.size() === 'sm' ? 14 : this.size() === 'lg' ? 20 : 16), ...(ngDevMode ? [{ debugName: "spinnerPx" }] : []));
1362
1246
  buttonClasses = computed(() => clsx(buttonVariants({
1363
1247
  size: this.size(),
1364
1248
  variant: this.variant(),
1365
1249
  shape: this.shape(),
1366
- disabled: this.disabled(),
1367
- }), this.icon() && 'btn-with-icon', this.className()), ...(ngDevMode ? [{ debugName: "buttonClasses" }] : []));
1368
- // Computed icon classes
1369
- iconClasses(position) {
1370
- return clsx(buttonIconVariants({ position }), this.shape() === 'icon' && 'm-0');
1371
- }
1372
- // Computed label classes
1250
+ disabled: this.isDisabled(),
1251
+ }), this.className()), ...(ngDevMode ? [{ debugName: "buttonClasses" }] : []));
1373
1252
  labelClasses = computed(() => clsx(buttonLabelVariants()), ...(ngDevMode ? [{ debugName: "labelClasses" }] : []));
1374
- // Computed icon-only wrapper classes
1375
1253
  iconOnlyClasses = computed(() => clsx(buttonIconOnlyVariants({ size: this.size() })), ...(ngDevMode ? [{ debugName: "iconOnlyClasses" }] : []));
1376
- // Computed icon color based on variant
1377
- iconColor = computed(() => {
1378
- const variantVal = this.variant();
1379
- if (variantVal === 'outline')
1380
- return '#7C3AED';
1381
- if (variantVal === 'ghost')
1382
- return '#1E293B';
1383
- if (variantVal === 'link')
1384
- return '#2563EB';
1385
- return 'white';
1386
- }, ...(ngDevMode ? [{ debugName: "iconColor" }] : []));
1387
- getIconSvg(iconName) {
1388
- const svg = icons[iconName] || icons['none'];
1389
- return this.sanitizer.bypassSecurityTrustHtml(svg);
1254
+ spinnerClasses = computed(() => clsx(buttonSpinnerVariants({ shape: this.shape() })), ...(ngDevMode ? [{ debugName: "spinnerClasses" }] : []));
1255
+ iconClasses(position) {
1256
+ return clsx(buttonIconVariants({ position }));
1390
1257
  }
1391
1258
  handleClick(event) {
1392
- if (!this.disabled()) {
1259
+ if (!this.isDisabled())
1393
1260
  this.Click.emit(event);
1394
- }
1395
1261
  }
1396
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: ButtonComponent, deps: [{ token: i1.DomSanitizer }], target: i0.ɵɵFactoryTarget.Component });
1397
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: ButtonComponent, isStandalone: true, selector: "bsg-button", inputs: { size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, shape: { classPropertyName: "shape", publicName: "shape", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, iconPosition: { classPropertyName: "iconPosition", publicName: "iconPosition", isSignal: true, isRequired: false, transformFunction: null }, iconName: { classPropertyName: "iconName", publicName: "iconName", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, className: { classPropertyName: "className", publicName: "className", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { Click: "Click" }, ngImport: i0, template: `
1262
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: ButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1263
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: ButtonComponent, isStandalone: true, selector: "bsg-button", inputs: { size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, shape: { classPropertyName: "shape", publicName: "shape", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, spinner: { classPropertyName: "spinner", publicName: "spinner", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, className: { classPropertyName: "className", publicName: "className", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { Click: "Click" }, ngImport: i0, template: `
1398
1264
  <button
1399
1265
  type="button"
1400
1266
  (click)="handleClick($event)"
1401
1267
  [class]="buttonClasses()"
1402
1268
  [disabled]="isDisabled()"
1403
1269
  [attr.aria-disabled]="isDisabled()"
1404
- [attr.aria-label]="
1405
- shape() === 'icon-only' ? label() || 'Icon button' : null
1406
- "
1270
+ [attr.aria-busy]="spinner() ? 'true' : null"
1271
+ [attr.aria-label]="ariaLabel() ?? (isIconButton() ? (label() || 'Icon button') : null)"
1272
+ [style.width.px]="isIconButton() ? buttonSquarePx() : null"
1273
+ [style.minWidth.px]="isIconButton() ? buttonSquarePx() : null"
1274
+ [style.height.px]="isIconButton() ? buttonSquarePx() : null"
1275
+ [style.minHeight.px]="isIconButton() ? buttonSquarePx() : null"
1276
+ [style.padding]="isIconButton() ? '0' : null"
1407
1277
  >
1408
- <!-- Icon-only button: centered icon using DomSanitizer -->
1409
- @if (shape() === 'icon-only') {
1278
+ <!-- Spinner -->
1279
+ @if (spinner()) {
1410
1280
  <span
1411
- [class]="iconOnlyClasses()"
1412
- [innerHTML]="getIconSvg(iconName())"
1413
- ></span>
1281
+ [class]="spinnerClasses()"
1282
+ [style.fontSize.px]="spinnerPx()"
1283
+ [attr.aria-hidden]="'true'"
1284
+ >
1285
+ <i class="fa-solid fa-spinner fa-spin"></i>
1286
+ </span>
1414
1287
  }
1415
1288
 
1416
- <!-- Regular buttons with optional icons -->
1417
- @if (shape() !== 'icon-only' && icon() && iconPosition() === 'left') {
1418
- <svg
1419
- [class]="iconClasses('left')"
1420
- width="15"
1421
- height="15"
1422
- viewBox="0 0 15 15"
1423
- fill="none"
1424
- xmlns="http://www.w3.org/2000/svg"
1289
+ <!-- Icon-only / Icon button content -->
1290
+ @if (isIconButton()) {
1291
+ <span
1292
+ [class]="iconOnlyClasses()"
1293
+ [style.fontSize.px]="iconFontPx()"
1294
+ [style.lineHeight]="1"
1295
+ [style.opacity]="spinner() ? 0 : 1"
1425
1296
  >
1426
- <path
1427
- d="M6.43152 0.706459C7.98489 0.461733 9.57507 0.757369 10.9371 1.54325C11.236 1.71571 11.3389 2.09758 11.1666 2.39652C10.9941 2.6955 10.6117 2.79791 10.3127 2.6254C9.19838 1.98244 7.8971 1.74102 6.62622 1.9412C5.35531 2.14143 4.19123 2.77142 3.32849 3.72587C2.46577 4.68036 1.95621 5.90193 1.88501 7.18656C1.81383 8.47123 2.18524 9.74182 2.93726 10.7858C3.68927 11.8297 4.7767 12.5845 6.0177 12.9239C7.2587 13.2632 8.57874 13.167 9.75733 12.651C10.936 12.1351 11.9022 11.2303 12.4948 10.0882C13.0872 8.94613 13.2698 7.63546 13.0129 6.37479C12.944 6.03664 13.1625 5.7065 13.5006 5.63749C13.8388 5.56857 14.169 5.78696 14.2379 6.12516C14.5519 7.66605 14.3279 9.26786 13.6038 10.6637C12.8796 12.0596 11.699 13.1654 10.2584 13.7961C8.81797 14.4266 7.20484 14.5441 5.68811 14.1293C4.17129 13.7145 2.84198 12.7923 1.92285 11.5164C1.00374 10.2404 0.549867 8.68771 0.636842 7.11759C0.723839 5.54744 1.3469 4.05449 2.40137 2.88786C3.45582 1.7213 4.87818 0.951184 6.43152 0.706459ZM13.3084 2.05778C13.5524 1.81398 13.9482 1.81382 14.1921 2.05778C14.4362 2.30186 14.4362 2.6981 14.1921 2.94218L7.94214 9.19218C7.69815 9.43613 7.30244 9.43597 7.05835 9.19218L5.18335 7.31718C4.93927 7.0731 4.93927 6.67686 5.18335 6.43278C5.42744 6.18898 5.82315 6.18882 6.06714 6.43278L7.50025 7.86588L13.3084 2.05778Z"
1428
- [attr.fill]="iconColor()"
1429
- />
1430
- </svg>
1431
- }
1297
+ <ng-content></ng-content>
1298
+ </span>
1299
+ } @else {
1300
+ <span class="bsg-btn-icon" [class]="iconClasses('left')" [style.opacity]="spinner() ? 0 : 1">
1301
+ <ng-content select="[left-icon]"></ng-content>
1302
+ </span>
1432
1303
 
1433
- @if (shape() !== 'icon' && shape() !== 'icon-only') {
1434
- <span [class]="labelClasses()">{{ label() }}</span>
1435
- }
1304
+ <span [class]="labelClasses()" [style.opacity]="spinner() ? 0 : 1">{{ label() }}</span>
1436
1305
 
1437
- @if (shape() !== 'icon-only' && icon() && iconPosition() === 'right') {
1438
- <svg
1439
- [class]="iconClasses('right')"
1440
- width="15"
1441
- height="15"
1442
- viewBox="0 0 15 15"
1443
- fill="none"
1444
- xmlns="http://www.w3.org/2000/svg"
1445
- >
1446
- <path
1447
- d="M6.43152 0.706459C7.98489 0.461733 9.57507 0.757369 10.9371 1.54325C11.236 1.71571 11.3389 2.09758 11.1666 2.39652C10.9941 2.6955 10.6117 2.79791 10.3127 2.6254C9.19838 1.98244 7.8971 1.74102 6.62622 1.9412C5.35531 2.14143 4.19123 2.77142 3.32849 3.72587C2.46577 4.68036 1.95621 5.90193 1.88501 7.18656C1.81383 8.47123 2.18524 9.74182 2.93726 10.7858C3.68927 11.8297 4.7767 12.5845 6.0177 12.9239C7.2587 13.2632 8.57874 13.167 9.75733 12.651C10.936 12.1351 11.9022 11.2303 12.4948 10.0882C13.0872 8.94613 13.2698 7.63546 13.0129 6.37479C12.944 6.03664 13.1625 5.7065 13.5006 5.63749C13.8388 5.56857 14.169 5.78696 14.2379 6.12516C14.5519 7.66605 14.3279 9.26786 13.6038 10.6637C12.8796 12.0596 11.699 13.1654 10.2584 13.7961C8.81797 14.4266 7.20484 14.5441 5.68811 14.1293C4.17129 13.7145 2.84198 12.7923 1.92285 11.5164C1.00374 10.2404 0.549867 8.68771 0.636842 7.11759C0.723839 5.54744 1.3469 4.05449 2.40137 2.88786C3.45582 1.7213 4.87818 0.951184 6.43152 0.706459ZM13.3084 2.05778C13.5524 1.81398 13.9482 1.81382 14.1921 2.05778C14.4362 2.30186 14.4362 2.6981 14.1921 2.94218L7.94214 9.19218C7.69815 9.43613 7.30244 9.43597 7.05835 9.19218L5.18335 7.31718C4.93927 7.0731 4.93927 6.67686 5.18335 6.43278C5.42744 6.18898 5.82315 6.18882 6.06714 6.43278L7.50025 7.86588L13.3084 2.05778Z"
1448
- [attr.fill]="iconColor()"
1449
- />
1450
- </svg>
1306
+ <span class="bsg-btn-icon" [class]="iconClasses('right')" [style.opacity]="spinner() ? 0 : 1">
1307
+ <ng-content select="[right-icon]"></ng-content>
1308
+ </span>
1451
1309
  }
1452
1310
  </button>
1453
- `, isInline: true, styles: [":host{display:inline-block}\n"] });
1311
+ `, isInline: true, styles: [":host{display:inline-block}.bsg-btn-icon:empty{display:none}:host ::ng-deep i{color:inherit}\n"] });
1454
1312
  }
1455
1313
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: ButtonComponent, decorators: [{
1456
1314
  type: Component,
@@ -1461,57 +1319,49 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
1461
1319
  [class]="buttonClasses()"
1462
1320
  [disabled]="isDisabled()"
1463
1321
  [attr.aria-disabled]="isDisabled()"
1464
- [attr.aria-label]="
1465
- shape() === 'icon-only' ? label() || 'Icon button' : null
1466
- "
1322
+ [attr.aria-busy]="spinner() ? 'true' : null"
1323
+ [attr.aria-label]="ariaLabel() ?? (isIconButton() ? (label() || 'Icon button') : null)"
1324
+ [style.width.px]="isIconButton() ? buttonSquarePx() : null"
1325
+ [style.minWidth.px]="isIconButton() ? buttonSquarePx() : null"
1326
+ [style.height.px]="isIconButton() ? buttonSquarePx() : null"
1327
+ [style.minHeight.px]="isIconButton() ? buttonSquarePx() : null"
1328
+ [style.padding]="isIconButton() ? '0' : null"
1467
1329
  >
1468
- <!-- Icon-only button: centered icon using DomSanitizer -->
1469
- @if (shape() === 'icon-only') {
1330
+ <!-- Spinner -->
1331
+ @if (spinner()) {
1470
1332
  <span
1471
- [class]="iconOnlyClasses()"
1472
- [innerHTML]="getIconSvg(iconName())"
1473
- ></span>
1333
+ [class]="spinnerClasses()"
1334
+ [style.fontSize.px]="spinnerPx()"
1335
+ [attr.aria-hidden]="'true'"
1336
+ >
1337
+ <i class="fa-solid fa-spinner fa-spin"></i>
1338
+ </span>
1474
1339
  }
1475
1340
 
1476
- <!-- Regular buttons with optional icons -->
1477
- @if (shape() !== 'icon-only' && icon() && iconPosition() === 'left') {
1478
- <svg
1479
- [class]="iconClasses('left')"
1480
- width="15"
1481
- height="15"
1482
- viewBox="0 0 15 15"
1483
- fill="none"
1484
- xmlns="http://www.w3.org/2000/svg"
1341
+ <!-- Icon-only / Icon button content -->
1342
+ @if (isIconButton()) {
1343
+ <span
1344
+ [class]="iconOnlyClasses()"
1345
+ [style.fontSize.px]="iconFontPx()"
1346
+ [style.lineHeight]="1"
1347
+ [style.opacity]="spinner() ? 0 : 1"
1485
1348
  >
1486
- <path
1487
- d="M6.43152 0.706459C7.98489 0.461733 9.57507 0.757369 10.9371 1.54325C11.236 1.71571 11.3389 2.09758 11.1666 2.39652C10.9941 2.6955 10.6117 2.79791 10.3127 2.6254C9.19838 1.98244 7.8971 1.74102 6.62622 1.9412C5.35531 2.14143 4.19123 2.77142 3.32849 3.72587C2.46577 4.68036 1.95621 5.90193 1.88501 7.18656C1.81383 8.47123 2.18524 9.74182 2.93726 10.7858C3.68927 11.8297 4.7767 12.5845 6.0177 12.9239C7.2587 13.2632 8.57874 13.167 9.75733 12.651C10.936 12.1351 11.9022 11.2303 12.4948 10.0882C13.0872 8.94613 13.2698 7.63546 13.0129 6.37479C12.944 6.03664 13.1625 5.7065 13.5006 5.63749C13.8388 5.56857 14.169 5.78696 14.2379 6.12516C14.5519 7.66605 14.3279 9.26786 13.6038 10.6637C12.8796 12.0596 11.699 13.1654 10.2584 13.7961C8.81797 14.4266 7.20484 14.5441 5.68811 14.1293C4.17129 13.7145 2.84198 12.7923 1.92285 11.5164C1.00374 10.2404 0.549867 8.68771 0.636842 7.11759C0.723839 5.54744 1.3469 4.05449 2.40137 2.88786C3.45582 1.7213 4.87818 0.951184 6.43152 0.706459ZM13.3084 2.05778C13.5524 1.81398 13.9482 1.81382 14.1921 2.05778C14.4362 2.30186 14.4362 2.6981 14.1921 2.94218L7.94214 9.19218C7.69815 9.43613 7.30244 9.43597 7.05835 9.19218L5.18335 7.31718C4.93927 7.0731 4.93927 6.67686 5.18335 6.43278C5.42744 6.18898 5.82315 6.18882 6.06714 6.43278L7.50025 7.86588L13.3084 2.05778Z"
1488
- [attr.fill]="iconColor()"
1489
- />
1490
- </svg>
1491
- }
1349
+ <ng-content></ng-content>
1350
+ </span>
1351
+ } @else {
1352
+ <span class="bsg-btn-icon" [class]="iconClasses('left')" [style.opacity]="spinner() ? 0 : 1">
1353
+ <ng-content select="[left-icon]"></ng-content>
1354
+ </span>
1492
1355
 
1493
- @if (shape() !== 'icon' && shape() !== 'icon-only') {
1494
- <span [class]="labelClasses()">{{ label() }}</span>
1495
- }
1356
+ <span [class]="labelClasses()" [style.opacity]="spinner() ? 0 : 1">{{ label() }}</span>
1496
1357
 
1497
- @if (shape() !== 'icon-only' && icon() && iconPosition() === 'right') {
1498
- <svg
1499
- [class]="iconClasses('right')"
1500
- width="15"
1501
- height="15"
1502
- viewBox="0 0 15 15"
1503
- fill="none"
1504
- xmlns="http://www.w3.org/2000/svg"
1505
- >
1506
- <path
1507
- d="M6.43152 0.706459C7.98489 0.461733 9.57507 0.757369 10.9371 1.54325C11.236 1.71571 11.3389 2.09758 11.1666 2.39652C10.9941 2.6955 10.6117 2.79791 10.3127 2.6254C9.19838 1.98244 7.8971 1.74102 6.62622 1.9412C5.35531 2.14143 4.19123 2.77142 3.32849 3.72587C2.46577 4.68036 1.95621 5.90193 1.88501 7.18656C1.81383 8.47123 2.18524 9.74182 2.93726 10.7858C3.68927 11.8297 4.7767 12.5845 6.0177 12.9239C7.2587 13.2632 8.57874 13.167 9.75733 12.651C10.936 12.1351 11.9022 11.2303 12.4948 10.0882C13.0872 8.94613 13.2698 7.63546 13.0129 6.37479C12.944 6.03664 13.1625 5.7065 13.5006 5.63749C13.8388 5.56857 14.169 5.78696 14.2379 6.12516C14.5519 7.66605 14.3279 9.26786 13.6038 10.6637C12.8796 12.0596 11.699 13.1654 10.2584 13.7961C8.81797 14.4266 7.20484 14.5441 5.68811 14.1293C4.17129 13.7145 2.84198 12.7923 1.92285 11.5164C1.00374 10.2404 0.549867 8.68771 0.636842 7.11759C0.723839 5.54744 1.3469 4.05449 2.40137 2.88786C3.45582 1.7213 4.87818 0.951184 6.43152 0.706459ZM13.3084 2.05778C13.5524 1.81398 13.9482 1.81382 14.1921 2.05778C14.4362 2.30186 14.4362 2.6981 14.1921 2.94218L7.94214 9.19218C7.69815 9.43613 7.30244 9.43597 7.05835 9.19218L5.18335 7.31718C4.93927 7.0731 4.93927 6.67686 5.18335 6.43278C5.42744 6.18898 5.82315 6.18882 6.06714 6.43278L7.50025 7.86588L13.3084 2.05778Z"
1508
- [attr.fill]="iconColor()"
1509
- />
1510
- </svg>
1358
+ <span class="bsg-btn-icon" [class]="iconClasses('right')" [style.opacity]="spinner() ? 0 : 1">
1359
+ <ng-content select="[right-icon]"></ng-content>
1360
+ </span>
1511
1361
  }
1512
1362
  </button>
1513
- `, styles: [":host{display:inline-block}\n"] }]
1514
- }], ctorParameters: () => [{ type: i1.DomSanitizer }], propDecorators: { size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], shape: [{ type: i0.Input, args: [{ isSignal: true, alias: "shape", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], icon: [{ type: i0.Input, args: [{ isSignal: true, alias: "icon", required: false }] }], iconPosition: [{ type: i0.Input, args: [{ isSignal: true, alias: "iconPosition", required: false }] }], iconName: [{ type: i0.Input, args: [{ isSignal: true, alias: "iconName", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], className: [{ type: i0.Input, args: [{ isSignal: true, alias: "className", required: false }] }], Click: [{ type: i0.Output, args: ["Click"] }] } });
1363
+ `, styles: [":host{display:inline-block}.bsg-btn-icon:empty{display:none}:host ::ng-deep i{color:inherit}\n"] }]
1364
+ }], propDecorators: { size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], shape: [{ type: i0.Input, args: [{ isSignal: true, alias: "shape", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], spinner: [{ type: i0.Input, args: [{ isSignal: true, alias: "spinner", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], className: [{ type: i0.Input, args: [{ isSignal: true, alias: "className", required: false }] }], Click: [{ type: i0.Output, args: ["Click"] }] } });
1515
1365
 
1516
1366
  /**
1517
1367
  * Card container variants
@@ -1530,19 +1380,19 @@ const cardVariants = cva(clsx(
1530
1380
  // Border
1531
1381
  'rounded-lg',
1532
1382
  // Background
1533
- 'bg-white',
1383
+ 'bg-card',
1534
1384
  // Transition
1535
1385
  'transition-all duration-200'), {
1536
1386
  variants: {
1537
1387
  variant: {
1538
- default: 'border border-zinc-200',
1388
+ default: 'border border-border',
1539
1389
  },
1540
1390
  contentVariant: {
1541
1391
  default: '',
1542
- metric: clsx('items-center justify-center', 'px-[89px] py-4', 'min-h-[87px]', 'bg-red-50 border border-red-200'),
1543
- infoDate: clsx('items-center justify-center', 'px-2 py-[17px]', 'gap-2', 'min-h-[84px]', 'w-fit max-w-[101px]', 'bg-blue-50 border-0'),
1544
- infoCurrency: clsx('items-start justify-start', 'p-4', 'gap-4', 'min-h-[90px]', 'w-fit max-w-[273px]', 'bg-blue-200 border-0'),
1545
- placeholder: clsx('w-[277px] min-h-[225px]', 'border border-slate-200', 'bg-transparent', 'p-0'),
1392
+ metric: clsx('items-center justify-center', 'px-[89px] py-4', 'min-h-[87px]', 'bg-destructive/10 border border-destructive/30'),
1393
+ infoDate: clsx('items-center justify-center', 'px-2 py-[17px]', 'gap-2', 'min-h-[84px]', 'w-fit max-w-[101px]', 'bg-info/10 border-0'),
1394
+ infoCurrency: clsx('items-start justify-start', 'p-4', 'gap-4', 'min-h-[90px]', 'w-fit max-w-[273px]', 'bg-info/30 border-0'),
1395
+ placeholder: clsx('w-[277px] min-h-[225px]', 'border border-border', 'bg-transparent', 'p-0'),
1546
1396
  },
1547
1397
  },
1548
1398
  defaultVariants: {
@@ -1573,7 +1423,7 @@ const cardHeaderVariants = cva(clsx(
1573
1423
  // Typography
1574
1424
  'text-sm font-normal leading-normal',
1575
1425
  // Color
1576
- 'text-slate-600'));
1426
+ 'text-muted-foreground'));
1577
1427
  /**
1578
1428
  * Card info icon variants
1579
1429
  *
@@ -1603,7 +1453,7 @@ const cardValueVariants = cva(clsx(
1603
1453
  // Typography
1604
1454
  'text-[32px] font-extrabold leading-[1.2]',
1605
1455
  // Color
1606
- 'text-neutral-800'));
1456
+ 'text-card-foreground'));
1607
1457
  /**
1608
1458
  * Card helper row variants
1609
1459
  *
@@ -1625,7 +1475,7 @@ const cardHelperVariants = cva(clsx(
1625
1475
  // Layout
1626
1476
  'shrink-0',
1627
1477
  // Default color (green for positive)
1628
- 'text-green-600'));
1478
+ 'text-success'));
1629
1479
  /**
1630
1480
  * Card helper description variants
1631
1481
  *
@@ -1635,7 +1485,7 @@ const cardHelperDescriptionVariants = cva(clsx(
1635
1485
  // Typography
1636
1486
  'text-[13px] font-normal leading-normal',
1637
1487
  // Color
1638
- 'text-slate-500'));
1488
+ 'text-muted-foreground'));
1639
1489
  /**
1640
1490
  * Card metric title variants
1641
1491
  *
@@ -1647,7 +1497,7 @@ const cardMetricTitleVariants = cva(clsx(
1647
1497
  // Typography
1648
1498
  'text-xs font-medium leading-normal text-center',
1649
1499
  // Color
1650
- 'text-slate-600'));
1500
+ 'text-muted-foreground'));
1651
1501
  /**
1652
1502
  * Card metric value variants
1653
1503
  *
@@ -1659,7 +1509,7 @@ const cardMetricValueVariants = cva(clsx(
1659
1509
  // Typography
1660
1510
  'text-2xl font-bold leading-normal text-center',
1661
1511
  // Color
1662
- 'text-red-600'));
1512
+ 'text-destructive'));
1663
1513
  /**
1664
1514
  * Card info label variants
1665
1515
  *
@@ -1671,7 +1521,7 @@ const cardInfoLabelVariants = cva(clsx(
1671
1521
  // Typography
1672
1522
  'text-xs font-medium leading-normal text-center',
1673
1523
  // Color
1674
- 'text-slate-600'));
1524
+ 'text-muted-foreground'));
1675
1525
  /**
1676
1526
  * Card info text variants
1677
1527
  *
@@ -1683,7 +1533,7 @@ const cardInfoTextVariants = cva(clsx(
1683
1533
  // Typography
1684
1534
  'text-sm font-bold leading-normal text-center',
1685
1535
  // Color
1686
- 'text-slate-600'));
1536
+ 'text-muted-foreground'));
1687
1537
  /**
1688
1538
  * Card currency label variants
1689
1539
  *
@@ -1695,7 +1545,7 @@ const cardCurrencyLabelVariants = cva(clsx(
1695
1545
  // Typography
1696
1546
  'text-sm font-medium leading-normal',
1697
1547
  // Color
1698
- 'text-slate-700'));
1548
+ 'text-foreground'));
1699
1549
  /**
1700
1550
  * Card currency content variants
1701
1551
  *
@@ -1727,7 +1577,7 @@ const cardCurrencyTextVariants = cva(clsx(
1727
1577
  // Typography
1728
1578
  'text-xl font-bold leading-normal',
1729
1579
  // Color
1730
- 'text-blue-600'));
1580
+ 'text-info'));
1731
1581
  /**
1732
1582
  * Slot header/body/footer variants (estilo shadcn)
1733
1583
  * Son “wrappers” que te permiten componer cards personalizadas.
@@ -2062,11 +1912,11 @@ const carouselArrowVariants = cva(clsx('absolute top-1/2 -translate-y-1/2', 'z-2
2062
1912
  // Tamaño
2063
1913
  'w-7 h-7 sm:w-8 sm:h-8 md:w-9 md:h-9 lg:w-[41px] lg:h-[41px]',
2064
1914
  // Forma
2065
- 'rounded-full bg-white border border-[#E2E8F0]',
1915
+ 'rounded-full bg-background border border-border',
2066
1916
  // Color del icono
2067
- 'text-purple-600',
1917
+ 'text-primary',
2068
1918
  // Interacción
2069
- 'cursor-pointer p-0', 'transition-opacity duration-200', 'disabled:opacity-40 disabled:cursor-not-allowed', 'hover:not-disabled:opacity-80', 'focus-visible:outline-2 focus-visible:outline-purple-600 focus-visible:outline-offset-2', 'focus:not-focus-visible:outline-none'), {
1919
+ 'cursor-pointer p-0', 'transition-opacity duration-200', 'disabled:opacity-40 disabled:cursor-not-allowed', 'hover:not-disabled:opacity-80', 'focus-visible:outline-2 focus-visible:outline-ring focus-visible:outline-offset-2', 'focus:not-focus-visible:outline-none'), {
2070
1920
  variants: {
2071
1921
  direction: {
2072
1922
  prev: 'left-2.5',
@@ -2079,7 +1929,7 @@ const carouselArrowVariants = cva(clsx('absolute top-1/2 -translate-y-1/2', 'z-2
2079
1929
  });
2080
1930
  const carouselChevronVariants = cva(clsx('block', 'w-4 h-4 sm:w-5 sm:h-5 md:w-[22px] md:h-[22px] lg:w-6 lg:h-6', 'pointer-events-none'));
2081
1931
  const carouselIndicatorsVariants = cva(clsx('flex items-center justify-center', 'gap-3 sm:gap-5', 'mt-4 sm:mt-6', 'w-full', 'pointer-events-auto'));
2082
- const carouselIndicatorVariants = cva(clsx('w-2.5 h-2.5 sm:w-3 sm:h-3', 'rounded-full', 'bg-purple-600', 'border-0', 'p-0', 'cursor-pointer', 'transition-opacity duration-200', 'shrink-0', 'hover:opacity-60', 'focus-visible:outline-2 focus-visible:outline-purple-600 focus-visible:outline-offset-2', 'focus:not-focus-visible:outline-none'), {
1932
+ const carouselIndicatorVariants = cva(clsx('w-2.5 h-2.5 sm:w-3 sm:h-3', 'rounded-full', 'bg-primary', 'border-0', 'p-0', 'cursor-pointer', 'transition-opacity duration-200', 'shrink-0', 'hover:opacity-60', 'focus-visible:outline-2 focus-visible:outline-ring focus-visible:outline-offset-2', 'focus:not-focus-visible:outline-none'), {
2083
1933
  variants: {
2084
1934
  active: {
2085
1935
  true: 'opacity-100',
@@ -3343,7 +3193,7 @@ const dialogOverlayVariants = cva(clsx('fixed inset-0', 'z-[9999]', 'flex justif
3343
3193
  /**
3344
3194
  * Dialog content variants
3345
3195
  */
3346
- const dialogContentVariants = cva(clsx('relative', 'flex flex-col', 'shrink-0', 'bg-white', 'rounded-xl', 'shadow-xl', 'max-h-[90vh]', 'w-full', 'box-border', 'animate-in zoom-in-95 duration-200', 'select-text', 'focus:outline-none'), {
3196
+ const dialogContentVariants = cva(clsx('relative', 'flex flex-col', 'shrink-0', 'bg-card', 'rounded-xl', 'shadow-xl', 'max-h-[90vh]', 'w-full', 'box-border', 'animate-in zoom-in-95 duration-200', 'select-text', 'focus:outline-none'), {
3347
3197
  variants: {
3348
3198
  size: {
3349
3199
  sm: 'max-w-sm',
@@ -3366,9 +3216,9 @@ const dialogContentVariants = cva(clsx('relative', 'flex flex-col', 'shrink-0',
3366
3216
  const dialogHeaderVariants = cva(clsx('flex items-center', 'min-h-[57px]', 'px-[17px] py-5 md:px-3.5 md:py-4', 'rounded-t-xl', 'box-border', 'font-sans text-base font-semibold leading-normal', 'md:text-sm'), {
3367
3217
  variants: {
3368
3218
  tone: {
3369
- brand: 'bg-orange-600 text-white',
3370
- info: 'bg-purple-100 text-purple-600',
3371
- secondary: 'bg-purple-100 text-purple-600',
3219
+ brand: 'bg-brand text-brand-foreground',
3220
+ info: 'bg-primary/20 text-primary',
3221
+ secondary: 'bg-primary/20 text-primary',
3372
3222
  },
3373
3223
  },
3374
3224
  defaultVariants: {
@@ -3378,7 +3228,7 @@ const dialogHeaderVariants = cva(clsx('flex items-center', 'min-h-[57px]', 'px-[
3378
3228
  /**
3379
3229
  * Dialog body variants
3380
3230
  */
3381
- const dialogBodyVariants = cva(clsx('flex-1', 'px-[23px] py-5 md:px-3.5 md:py-4', 'box-border', 'font-sans text-sm font-medium leading-normal', 'md:text-[13px]', 'text-slate-500'), {
3231
+ const dialogBodyVariants = cva(clsx('flex-1', 'px-[23px] py-5 md:px-3.5 md:py-4', 'box-border', 'font-sans text-sm font-medium leading-normal', 'md:text-[13px]', 'text-muted-foreground'), {
3382
3232
  variants: {
3383
3233
  scrollable: {
3384
3234
  true: 'overflow-y-auto max-h-[calc(90vh-200px)] md:max-h-[calc(95vh-180px)]',
@@ -3392,7 +3242,7 @@ const dialogBodyVariants = cva(clsx('flex-1', 'px-[23px] py-5 md:px-3.5 md:py-4'
3392
3242
  /**
3393
3243
  * Dialog footer variants
3394
3244
  */
3395
- const dialogFooterVariants = cva(clsx('flex items-center justify-end flex-nowrap', 'gap-8 md:gap-5', 'px-[23px] py-5 md:px-3.5 md:py-4', 'border-t border-slate-200', 'box-border', 'w-full'));
3245
+ const dialogFooterVariants = cva(clsx('flex items-center justify-end flex-nowrap', 'gap-8 md:gap-5', 'px-[23px] py-5 md:px-3.5 md:py-4', 'border-t border-border', 'box-border', 'w-full'));
3396
3246
 
3397
3247
  // projects/bsg-integra/src/lib/components/dialog/dialog.component.ts
3398
3248
  class DialogComponent {
@@ -3707,7 +3557,7 @@ const labelVariants = cva(clsx(
3707
3557
  // Typography
3708
3558
  'text-sm', 'font-inherit',
3709
3559
  // Color
3710
- 'text-slate-800'));
3560
+ 'text-foreground'));
3711
3561
 
3712
3562
  /**
3713
3563
  * Label Component
@@ -6472,6 +6322,123 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
6472
6322
  `, styles: [":host{display:block}\n"] }]
6473
6323
  }], propDecorators: { type: [{ type: i0.Input, args: [{ isSignal: true, alias: "type", required: false }] }], width: [{ type: i0.Input, args: [{ isSignal: true, alias: "width", required: false }] }], height: [{ type: i0.Input, args: [{ isSignal: true, alias: "height", required: false }] }], className: [{ type: i0.Input, args: [{ isSignal: true, alias: "className", required: false }] }] } });
6474
6324
 
6325
+ /**
6326
+ * Spinner variants
6327
+ *
6328
+ * Controls the spinner appearance including size and color variants.
6329
+ * Based on shadcn/ui spinner pattern.
6330
+ */
6331
+ const spinnerVariants = cva(clsx(
6332
+ // Base animation
6333
+ 'animate-spin',
6334
+ // Accessibility
6335
+ 'shrink-0'), {
6336
+ variants: {
6337
+ /**
6338
+ * Size variants
6339
+ * Following shadcn/ui pattern: size-3, size-4 (default), size-6, size-8
6340
+ */
6341
+ size: {
6342
+ xs: 'size-3',
6343
+ sm: 'size-4',
6344
+ md: 'size-6',
6345
+ lg: 'size-8',
6346
+ xl: 'size-10',
6347
+ },
6348
+ /**
6349
+ * Color variants using design tokens
6350
+ */
6351
+ variant: {
6352
+ default: 'text-foreground',
6353
+ primary: 'text-primary',
6354
+ secondary: 'text-secondary-foreground',
6355
+ muted: 'text-muted-foreground',
6356
+ destructive: 'text-destructive',
6357
+ success: 'text-success',
6358
+ warning: 'text-warning',
6359
+ info: 'text-info',
6360
+ brand: 'text-brand',
6361
+ },
6362
+ },
6363
+ defaultVariants: {
6364
+ size: 'sm',
6365
+ variant: 'primary',
6366
+ },
6367
+ });
6368
+
6369
+ /**
6370
+ * Spinner Component
6371
+ *
6372
+ * A loading indicator that shows a spinning animation.
6373
+ * Based on shadcn/ui spinner pattern using an SVG loader icon.
6374
+ *
6375
+ * @example
6376
+ * ```html
6377
+ * <!-- Basic usage -->
6378
+ * <bsg-spinner />
6379
+ *
6380
+ * <!-- With size -->
6381
+ * <bsg-spinner size="lg" />
6382
+ *
6383
+ * <!-- With variant (color) -->
6384
+ * <bsg-spinner variant="destructive" />
6385
+ *
6386
+ * <!-- Custom aria-label -->
6387
+ * <bsg-spinner ariaLabel="Processing request..." />
6388
+ * ```
6389
+ */
6390
+ class SpinnerComponent {
6391
+ /** Spinner size */
6392
+ size = input('sm', ...(ngDevMode ? [{ debugName: "size" }] : []));
6393
+ /** Spinner color variant */
6394
+ variant = input('primary', ...(ngDevMode ? [{ debugName: "variant" }] : []));
6395
+ /** Accessibility label for screen readers */
6396
+ ariaLabel = input('Loading', ...(ngDevMode ? [{ debugName: "ariaLabel" }] : []));
6397
+ /** Additional CSS classes */
6398
+ className = input(...(ngDevMode ? [undefined, { debugName: "className" }] : []));
6399
+ /** Computed spinner classes */
6400
+ spinnerClasses = computed(() => clsx(spinnerVariants({
6401
+ size: this.size(),
6402
+ variant: this.variant(),
6403
+ }), this.className()), ...(ngDevMode ? [{ debugName: "spinnerClasses" }] : []));
6404
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: SpinnerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
6405
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "20.3.15", type: SpinnerComponent, isStandalone: true, selector: "bsg-spinner", inputs: { size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, className: { classPropertyName: "className", publicName: "className", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
6406
+ <svg
6407
+ [class]="spinnerClasses()"
6408
+ xmlns="http://www.w3.org/2000/svg"
6409
+ viewBox="0 0 24 24"
6410
+ fill="none"
6411
+ stroke="currentColor"
6412
+ stroke-width="2"
6413
+ stroke-linecap="round"
6414
+ stroke-linejoin="round"
6415
+ role="status"
6416
+ [attr.aria-label]="ariaLabel()"
6417
+ >
6418
+ <path d="M21 12a9 9 0 1 1-6.219-8.56" />
6419
+ </svg>
6420
+ `, isInline: true, styles: [":host{display:inline-flex;align-items:center;justify-content:center}\n"] });
6421
+ }
6422
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: SpinnerComponent, decorators: [{
6423
+ type: Component,
6424
+ args: [{ selector: 'bsg-spinner', standalone: true, template: `
6425
+ <svg
6426
+ [class]="spinnerClasses()"
6427
+ xmlns="http://www.w3.org/2000/svg"
6428
+ viewBox="0 0 24 24"
6429
+ fill="none"
6430
+ stroke="currentColor"
6431
+ stroke-width="2"
6432
+ stroke-linecap="round"
6433
+ stroke-linejoin="round"
6434
+ role="status"
6435
+ [attr.aria-label]="ariaLabel()"
6436
+ >
6437
+ <path d="M21 12a9 9 0 1 1-6.219-8.56" />
6438
+ </svg>
6439
+ `, styles: [":host{display:inline-flex;align-items:center;justify-content:center}\n"] }]
6440
+ }], propDecorators: { size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], className: [{ type: i0.Input, args: [{ isSignal: true, alias: "className", required: false }] }] } });
6441
+
6475
6442
  /**
6476
6443
  * Switch root variants
6477
6444
  *
@@ -8325,5 +8292,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
8325
8292
  * Generated bundle index. Do not edit.
8326
8293
  */
8327
8294
 
8328
- export { AccordionComponent, AccordionContentComponent, AccordionItemComponent, AccordionTriggerComponent, AlertComponent, AvatarComponent, BadgeComponent, ButtonComponent, CardBodyComponent, CardComponent, CardFooterComponent, CardHeaderComponent, CarouselComponent, CarouselItemComponent, CheckboxComponent, CollapsibleComponent, CollapsibleContentComponent, CollapsibleTriggerDirective, ComboboxComponent, DialogComponent, InputComponent, LabelComponent, RadioComponent, RadioGroupComponent, SelectComponent, SidebarComponent, SidebarContentComponent, SidebarFooterComponent, SidebarGroupActionComponent, SidebarGroupComponent, SidebarGroupContentComponent, SidebarGroupLabelComponent, SidebarHeaderComponent, SidebarInsetComponent, SidebarMenuActionComponent, SidebarMenuBadgeComponent, SidebarMenuButtonComponent, SidebarMenuComponent, SidebarMenuItemComponent, SidebarMenuSubButtonComponent, SidebarMenuSubComponent, SidebarMenuSubItemComponent, SidebarProviderComponent, SidebarRailComponent, SidebarSeparatorComponent, SidebarService, SidebarTriggerComponent, SkeletonComponent, SwitchComponent, TextareaComponent, TimePickerComponent, ToastComponent, TooltipComponent, accordionContentVariants, accordionItemVariants, accordionTriggerVariants, accordionVariants, alertCloseVariants, alertContentVariants, alertIconVariants, alertVariants, avatarIconVariants, avatarImgVariants, avatarInitialsVariants, avatarVariants, badgeIconVariants, badgeVariants, buttonIconOnlyVariants, buttonIconVariants, buttonLabelVariants, buttonVariants, cardActionIconVariants, cardCurrencyContentVariants, cardCurrencyIconVariants, cardCurrencyLabelVariants, cardCurrencyTextVariants, cardHeaderRowVariants, cardHeaderVariants, cardHelperDescriptionVariants, cardHelperRowVariants, cardHelperVariants, cardInfoIconVariants, cardInfoLabelVariants, cardInfoTextVariants, cardMetricTitleVariants, cardMetricValueVariants, cardSlotBodyVariants, cardSlotFooterVariants, cardSlotHeaderVariants, cardValueVariants, cardVariants, carouselArrowVariants, carouselChevronVariants, carouselContainerVariants, carouselIndicatorVariants, carouselIndicatorsVariants, carouselRootVariants, carouselTrackVariants, carouselViewportVariants, checkboxVariants, comboboxDropdownVariants, comboboxEmptyStateVariants, comboboxErrorMessageVariants, comboboxIconVariants, comboboxOptionVariants, comboboxOptionsContainerVariants, comboboxSearchInputVariants, comboboxSearchWrapperVariants, comboboxTriggerVariants, comboboxValueVariants, comboboxWrapperVariants, dialogBodyVariants, dialogContentVariants, dialogFooterVariants, dialogHeaderVariants, dialogOverlayVariants, inputVariants, labelVariants, radioFocusRingVariants, radioGroupVariants, radioInnerVariants, radioLabelVariants, radioOptionVariants, radioOuterVariants, radioWrapperVariants, selectDropdownVariants, selectErrorVariants, selectIconVariants, selectOptionVariants, selectTriggerVariants, selectValueVariants, selectWrapperVariants, sidebarChevronVariants, sidebarContentVariants, sidebarFooterVariants, sidebarGroupActionVariants, sidebarGroupContentVariants, sidebarGroupLabelVariants, sidebarGroupVariants, sidebarHeaderVariants, sidebarInsetVariants, sidebarMenuActionVariants, sidebarMenuBadgeVariants, sidebarMenuButtonVariants, sidebarMenuItemVariants, sidebarMenuSkeletonVariants, sidebarMenuSubButtonVariants, sidebarMenuSubItemVariants, sidebarMenuSubVariants, sidebarMenuVariants, sidebarProviderVariants, sidebarRailVariants, sidebarSeparatorVariants, sidebarTriggerVariants, sidebarVariants, sidebarWrapperVariants, skeletonVariants, switchRootVariants, switchThumbVariants, textareaVariants, timepickerActionButtonVariants, timepickerActionsVariants, timepickerColumnHeaderVariants, timepickerColumnVariants, timepickerDropdownVariants, timepickerErrorMessageVariants, timepickerFieldVariants, timepickerIconButtonVariants, timepickerInputVariants, timepickerLabelVariants, timepickerListVariants, timepickerOptionVariants, timepickerSelectionAreaVariants, timepickerSeparatorVariants, timepickerWrapperVariants, toastAccentVariants, toastCloseVariants, toastContentVariants, toastIconVariants, toastVariants, tooltipArrowVariants, tooltipContentVariants, tooltipTriggerVariants };
8295
+ export { AccordionComponent, AccordionContentComponent, AccordionItemComponent, AccordionTriggerComponent, AlertComponent, AvatarComponent, BadgeComponent, ButtonComponent, CardBodyComponent, CardComponent, CardFooterComponent, CardHeaderComponent, CarouselComponent, CarouselItemComponent, CheckboxComponent, CollapsibleComponent, CollapsibleContentComponent, CollapsibleTriggerDirective, ComboboxComponent, DialogComponent, InputComponent, LabelComponent, RadioComponent, RadioGroupComponent, SelectComponent, SidebarComponent, SidebarContentComponent, SidebarFooterComponent, SidebarGroupActionComponent, SidebarGroupComponent, SidebarGroupContentComponent, SidebarGroupLabelComponent, SidebarHeaderComponent, SidebarInsetComponent, SidebarMenuActionComponent, SidebarMenuBadgeComponent, SidebarMenuButtonComponent, SidebarMenuComponent, SidebarMenuItemComponent, SidebarMenuSubButtonComponent, SidebarMenuSubComponent, SidebarMenuSubItemComponent, SidebarProviderComponent, SidebarRailComponent, SidebarSeparatorComponent, SidebarService, SidebarTriggerComponent, SkeletonComponent, SpinnerComponent, SwitchComponent, TextareaComponent, TimePickerComponent, ToastComponent, TooltipComponent, accordionContentVariants, accordionItemVariants, accordionTriggerVariants, accordionVariants, alertCloseVariants, alertContentVariants, alertIconVariants, alertVariants, avatarIconVariants, avatarImgVariants, avatarInitialsVariants, avatarVariants, badgeIconVariants, badgeVariants, buttonIconOnlyVariants, buttonIconVariants, buttonLabelVariants, buttonSpinnerVariants, buttonVariants, cardActionIconVariants, cardCurrencyContentVariants, cardCurrencyIconVariants, cardCurrencyLabelVariants, cardCurrencyTextVariants, cardHeaderRowVariants, cardHeaderVariants, cardHelperDescriptionVariants, cardHelperRowVariants, cardHelperVariants, cardInfoIconVariants, cardInfoLabelVariants, cardInfoTextVariants, cardMetricTitleVariants, cardMetricValueVariants, cardSlotBodyVariants, cardSlotFooterVariants, cardSlotHeaderVariants, cardValueVariants, cardVariants, carouselArrowVariants, carouselChevronVariants, carouselContainerVariants, carouselIndicatorVariants, carouselIndicatorsVariants, carouselRootVariants, carouselTrackVariants, carouselViewportVariants, checkboxVariants, comboboxDropdownVariants, comboboxEmptyStateVariants, comboboxErrorMessageVariants, comboboxIconVariants, comboboxOptionVariants, comboboxOptionsContainerVariants, comboboxSearchInputVariants, comboboxSearchWrapperVariants, comboboxTriggerVariants, comboboxValueVariants, comboboxWrapperVariants, dialogBodyVariants, dialogContentVariants, dialogFooterVariants, dialogHeaderVariants, dialogOverlayVariants, inputVariants, labelVariants, radioFocusRingVariants, radioGroupVariants, radioInnerVariants, radioLabelVariants, radioOptionVariants, radioOuterVariants, radioWrapperVariants, selectDropdownVariants, selectErrorVariants, selectIconVariants, selectOptionVariants, selectTriggerVariants, selectValueVariants, selectWrapperVariants, sidebarChevronVariants, sidebarContentVariants, sidebarFooterVariants, sidebarGroupActionVariants, sidebarGroupContentVariants, sidebarGroupLabelVariants, sidebarGroupVariants, sidebarHeaderVariants, sidebarInsetVariants, sidebarMenuActionVariants, sidebarMenuBadgeVariants, sidebarMenuButtonVariants, sidebarMenuItemVariants, sidebarMenuSkeletonVariants, sidebarMenuSubButtonVariants, sidebarMenuSubItemVariants, sidebarMenuSubVariants, sidebarMenuVariants, sidebarProviderVariants, sidebarRailVariants, sidebarSeparatorVariants, sidebarTriggerVariants, sidebarVariants, sidebarWrapperVariants, skeletonVariants, spinnerVariants, switchRootVariants, switchThumbVariants, textareaVariants, timepickerActionButtonVariants, timepickerActionsVariants, timepickerColumnHeaderVariants, timepickerColumnVariants, timepickerDropdownVariants, timepickerErrorMessageVariants, timepickerFieldVariants, timepickerIconButtonVariants, timepickerInputVariants, timepickerLabelVariants, timepickerListVariants, timepickerOptionVariants, timepickerSelectionAreaVariants, timepickerSeparatorVariants, timepickerWrapperVariants, toastAccentVariants, toastCloseVariants, toastContentVariants, toastIconVariants, toastVariants, tooltipArrowVariants, tooltipContentVariants, tooltipTriggerVariants };
8329
8296
  //# sourceMappingURL=bsginstitute-bsg-integra.mjs.map