@robosophy/prime-theme 3.0.0 → 3.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/prime.css +125 -70
  2. package/package.json +1 -1
package/dist/prime.css CHANGED
@@ -337,17 +337,19 @@
337
337
  justify-content: center;
338
338
  vertical-align: middle;
339
339
  }
340
- /* Vue: .p-input-icon-left/right > i | React: .p-icon-field-left/right > .p-input-icon */
340
+ /* Vue3: .p-input-icon-left/right > i | Vue4: .p-iconfield > .p-inputicon | React: .p-icon-field-left/right > .p-input-icon */
341
341
  .p-input-icon-left,
342
342
  .p-input-icon-right,
343
343
  .p-icon-field-left,
344
- .p-icon-field-right {
344
+ .p-icon-field-right,
345
+ .p-iconfield {
345
346
  position: relative;
346
347
  }
347
348
  .p-input-icon-left > i,
348
349
  .p-input-icon-right > i,
349
350
  .p-icon-field-left > .p-input-icon,
350
- .p-icon-field-right > .p-input-icon {
351
+ .p-icon-field-right > .p-input-icon,
352
+ .p-iconfield > .p-inputicon {
351
353
  position: absolute;
352
354
  top: 50%;
353
355
  margin-top: 0 !important;
@@ -356,32 +358,103 @@
356
358
  align-items: center;
357
359
  justify-content: center;
358
360
  }
361
+ /* Vue: .p-iconfield | React: .p-icon-field */
362
+ .p-iconfield, .p-icon-field {
363
+ margin-top: 0;
364
+ }
365
+ /* Icon overrides (both) - Use Material Symbols instead of PrimeIcons */
359
366
  .pi-eye::before {
360
- font-family: 'Material Symbols Outlined';
361
- content: 'visibility_off';
367
+ font-family: "Material Symbols Outlined";
368
+ content: "visibility_off";
362
369
  color: var(--rs-color-text-primary);
363
370
  cursor: pointer;
364
371
  }
365
372
  .pi-eye-slash::before {
366
- font-family: 'Material Symbols Outlined';
367
- content: 'visibility';
373
+ font-family: "Material Symbols Outlined";
374
+ content: "visibility";
368
375
  color: var(--rs-color-text-primary);
369
376
  cursor: pointer;
370
377
  }
378
+ .pi-chevron-down::before,
379
+ .pi-chevron-up::before {
380
+ font-family: "Material Symbols Outlined";
381
+ }
371
382
  .pi-chevron-down::before {
372
- font-family: 'Material Symbols Outlined';
373
- content: 'keyboard_arrow_down';
383
+ content: "keyboard_arrow_down";
374
384
  }
375
- .pi-check::before {
376
- font-family: 'Material Symbols Outlined';
377
- content: 'check';
385
+ .pi-chevron-up::before {
386
+ content: "keyboard_arrow_up";
378
387
  }
379
- /* Vue: .p-iconfield | React: .p-icon-field */
380
- .p-iconfield, .p-icon-field {
381
- margin-top: 0;
388
+ .pi-check::before {
389
+ font-family: "Material Symbols Outlined";
390
+ content: "check";
382
391
  }
383
392
  /* #endregion */
384
393
 
394
+ /* PrimeVue 4 - Dropdown icon rotation */
395
+ .p-select .p-select-dropdown-icon,
396
+ .p-cascadeselect .p-cascadeselect-dropdown-icon,
397
+ .p-multiselect .p-multiselect-dropdown-icon {
398
+ transition: transform 0.2s ease;
399
+ }
400
+
401
+ .p-select-open .p-select-dropdown-icon,
402
+ .p-cascadeselect-open .p-cascadeselect-dropdown-icon,
403
+ .p-multiselect-open .p-multiselect-dropdown-icon {
404
+ transform: rotate(180deg);
405
+ }
406
+
407
+ /* PrimeReact - Dropdown CSS chevron stays mounted so its rotation can animate */
408
+ .p-dropdown .p-dropdown-trigger {
409
+ align-items: center;
410
+ }
411
+ .p-dropdown .p-dropdown-trigger > svg.p-dropdown-trigger-icon {
412
+ display: none !important;
413
+ }
414
+ /* PrimeReact - Dropdown CSS chevron only draws when the default icon slot exists.
415
+ With a custom dropdownIcon the icon has no .p-dropdown-trigger-icon class, so the
416
+ ::after is suppressed and no duplicate arrow appears. Same when PrimeReact swaps
417
+ the default icon for a loading spinner. */
418
+ .p-dropdown .p-dropdown-trigger:has(> .p-dropdown-trigger-icon)::after {
419
+ border: solid currentColor;
420
+ border-width: 0 1.5px 1.5px 0;
421
+ content: "";
422
+ height: 8px;
423
+ transform: translateY(-2px) rotate(45deg);
424
+ transition: transform 0.2s ease;
425
+ width: 8px;
426
+ }
427
+ .p-dropdown .p-dropdown-trigger:has(> .p-dropdown-trigger-icon)[aria-expanded="true"]::after {
428
+ transform: translateY(2px) rotate(225deg);
429
+ }
430
+
431
+ /* PrimeReact - CascadeSelect and MultiSelect: hide default chevron SVG icons and use CSS ::after chevron.
432
+ Same pattern as Dropdown above — keeps icon style consistent across all select components,
433
+ supports animation on open, and avoids duplicate arrows with custom icons or loading spinners. */
434
+ .p-cascadeselect .p-cascadeselect-trigger > svg.p-cascadeselect-trigger-icon,
435
+ .p-multiselect .p-multiselect-trigger > svg.p-multiselect-trigger-icon:not(.p-icon-spin) {
436
+ display: none !important;
437
+ }
438
+
439
+ .p-cascadeselect .p-cascadeselect-trigger:has(> svg.p-cascadeselect-trigger-icon)::after,
440
+ .p-multiselect .p-multiselect-trigger:has(> svg.p-multiselect-trigger-icon:not(.p-icon-spin))::after {
441
+ border: solid currentColor;
442
+ border-width: 0 1.5px 1.5px 0;
443
+ content: "";
444
+ height: 8px;
445
+ transform: translateY(-2px) rotate(45deg);
446
+ transition: transform 0.2s ease;
447
+ width: 8px;
448
+ }
449
+
450
+ .p-cascadeselect .p-cascadeselect-trigger:has(> svg.p-cascadeselect-trigger-icon)[aria-expanded="true"]::after {
451
+ transform: translateY(2px) rotate(225deg);
452
+ }
453
+
454
+ .p-multiselect:has(input[aria-expanded="true"]) .p-multiselect-trigger:has(> svg.p-multiselect-trigger-icon:not(.p-icon-spin))::after {
455
+ transform: translateY(2px) rotate(225deg);
456
+ }
457
+
385
458
  /* #region classes */
386
459
  /* password (both) */
387
460
  .p-password {
@@ -391,7 +464,7 @@
391
464
  width: 100%;
392
465
  }
393
466
  /* input (both) */
394
- .p-inputtext:not(:where(.p-inputtextarea, .p-dropdown-label, .p-select-label, .p-cascadeselect-label, .p-cascade-select-label, .p-multiselect-label, .p-multi-select-label, .p-autocomplete-multiple-container)) {
467
+ .p-inputtext:not(:where(.p-inputtextarea, .p-dropdown-label, .p-select-label, .p-cascadeselect-label, .p-multiselect-label, .p-autocomplete-multiple-container)) {
395
468
  font-weight: var(--p-inputtext-font-weight);
396
469
  height: 48px;
397
470
  font-size: 16px;
@@ -448,12 +521,10 @@
448
521
  .p-password.p-invalid.p-component > .p-inputtext {
449
522
  border-color: var(--rs-color-stroke-error) !important;
450
523
  }
451
- .p-cascadeselect.p-invalid.p-component,
452
- .p-cascade-select.p-invalid.p-component {
524
+ .p-cascadeselect.p-invalid.p-component {
453
525
  border-color: var(--rs-color-stroke-error) !important;
454
526
  }
455
- .p-multiselect.p-invalid.p-component,
456
- .p-multi-select.p-invalid.p-component {
527
+ .p-multiselect.p-invalid.p-component {
457
528
  border-color: var(--rs-color-stroke-error) !important;
458
529
  }
459
530
  /* disabled states (both) */
@@ -475,23 +546,19 @@
475
546
  background: var(--rs-color-background-disabled) !important;
476
547
  color: var(--rs-color-text-secondary) !important;
477
548
  }
478
- .p-cascadeselect.p-disabled,
479
- .p-cascade-select.p-disabled {
549
+ .p-cascadeselect.p-disabled {
480
550
  background: var(--rs-color-background-disabled) !important;
481
551
  }
482
- .p-cascadeselect.p-disabled .p-cascadeselect-label,
483
- .p-cascade-select.p-disabled .p-cascade-select-label {
552
+ .p-cascadeselect.p-disabled .p-cascadeselect-label {
484
553
  color: var(--rs-color-text-secondary) !important;
485
554
  }
486
- .p-multiselect.p-disabled,
487
- .p-multi-select.p-disabled {
555
+ .p-multiselect.p-disabled {
488
556
  background: var(--rs-color-background-disabled) !important;
489
557
  }
490
- .p-multiselect.p-disabled .p-multiselect-label,
491
- .p-multi-select.p-disabled .p-multi-select-label {
558
+ .p-multiselect.p-disabled .p-multiselect-label {
492
559
  color: var(--rs-color-text-secondary) !important;
493
560
  }
494
- /* select/dropdown (both: .p-select=Vue, .p-dropdown=both) */
561
+ /* select/dropdown (both: .p-select=Vue, .p-dropdown=React) */
495
562
  .p-select, .p-dropdown {
496
563
  font-weight: var(--p-select-font-weight);
497
564
  height: 48px;
@@ -500,8 +567,8 @@
500
567
  border-radius: 6px;
501
568
  border: 1px solid var(--rs-color-neutral-700);
502
569
  background: var(--rs-color-neutral-50);
503
- padding: 0 16px;
504
570
  }
571
+ .p-select, .p-dropdown { padding: 0; }
505
572
  .p-select:not(.p-disabled):hover,
506
573
  .p-dropdown:not(.p-disabled):hover {
507
574
  border-color: var(--rs-color-stroke-focused);
@@ -525,102 +592,90 @@
525
592
  .p-select-label.p-inputtext,
526
593
  .p-dropdown-label.p-inputtext,
527
594
  .p-cascadeselect-label.p-inputtext,
528
- .p-cascade-select-label.p-inputtext,
529
- .p-multiselect-label.p-inputtext,
530
- .p-multi-select-label.p-inputtext {
595
+ .p-multiselect-label.p-inputtext {
531
596
  height: auto;
532
597
  line-height: 1.5;
533
598
  border: none;
534
599
  background: transparent;
535
600
  }
536
- /* Internal containers - remove duplicate borders */
601
+ /* Internal containers - remove duplicate borders and padding from triggers.
602
+ PrimeReact (React) adds internal padding to triggers, so we reset it here
603
+ for both Vue and React variants. */
537
604
  .p-select-label-container,
538
605
  .p-dropdown-label-container,
606
+ .p-cascadeselect-label-container,
607
+ .p-multiselect-label-container,
539
608
  .p-select-trigger,
540
- .p-dropdown-trigger {
609
+ .p-dropdown-trigger,
610
+ .p-cascadeselect-trigger,
611
+ .p-multiselect-trigger {
541
612
  border: none;
542
613
  background: transparent;
614
+ padding: 0;
543
615
  }
544
- /* cascadeselect (both: .p-cascadeselect=React, .p-cascade-select=Vue) */
545
- .p-cascadeselect, .p-cascade-select {
616
+ /* cascadeselect (both) */
617
+ .p-cascadeselect {
546
618
  height: 48px;
547
619
  font-size: 16px;
548
620
  gap: 8px;
549
621
  border-radius: 6px;
550
622
  border: 1px solid var(--rs-color-neutral-700);
551
623
  background: var(--rs-color-neutral-50);
552
- padding: 0 16px;
624
+ padding: 0;
553
625
  }
554
- .p-cascadeselect:not(.p-disabled):hover,
555
- .p-cascade-select:not(.p-disabled):hover {
626
+ .p-cascadeselect:not(.p-disabled):hover {
556
627
  border-color: var(--rs-color-stroke-focused);
557
628
  }
558
- .p-cascadeselect:not(.p-disabled).p-focus,
559
- .p-cascade-select:not(.p-disabled).p-focus {
629
+ .p-cascadeselect:not(.p-disabled).p-focus {
560
630
  outline: none;
561
631
  border-color: var(--rs-color-stroke-focused);
562
632
  box-shadow: none;
563
633
  }
564
634
  /* Vue-only: PrimeReact 10 no emite clases de tamaño para CascadeSelect */
565
- .p-cascadeselect-sm, .p-cascade-select-sm {
635
+ .p-cascadeselect-sm {
566
636
  height: 36px;
567
637
  font-size: 14px;
568
638
  }
569
- .p-cascadeselect-label, .p-cascade-select-label {
639
+ .p-cascadeselect-label {
570
640
  align-self: center;
571
641
  border: none;
572
642
  background: transparent;
573
643
  }
574
- .p-cascadeselect-label-container,
575
- .p-cascade-select-label-container,
576
- .p-cascadeselect-trigger,
577
- .p-cascade-select-trigger {
578
- border: none;
579
- background: transparent;
580
- }
581
- /* multiselect (both: .p-multiselect=React, .p-multi-select=Vue) */
582
- .p-multiselect, .p-multi-select {
644
+ /* multiselect (both) */
645
+ .p-multiselect {
646
+ display: flex;
647
+ align-items: center;
583
648
  height: 48px;
584
649
  font-size: 16px;
585
650
  gap: 8px;
586
651
  border-radius: 6px;
587
652
  border: 1px solid var(--rs-color-neutral-700);
588
653
  background: var(--rs-color-neutral-50);
589
- padding: 0 16px;
654
+ padding: 0;
590
655
  }
591
- .p-multiselect:not(.p-disabled):hover,
592
- .p-multi-select:not(.p-disabled):hover {
656
+ .p-multiselect:not(.p-disabled):hover {
593
657
  border-color: var(--rs-color-stroke-focused);
594
658
  }
595
- .p-multiselect:not(.p-disabled).p-focus,
596
- .p-multi-select:not(.p-disabled).p-focus {
659
+ .p-multiselect:not(.p-disabled).p-focus {
597
660
  outline: none;
598
661
  border-color: var(--rs-color-stroke-focused);
599
662
  box-shadow: none;
600
663
  }
601
664
  /* Vue-only: PrimeReact 10 no emite clases de tamaño para MultiSelect */
602
- .p-multiselect-sm, .p-multi-select-sm {
665
+ .p-multiselect-sm {
603
666
  height: 36px;
604
667
  font-size: 14px;
605
668
  }
606
- .p-multiselect-label, .p-multi-select-label {
669
+ .p-multiselect-label {
607
670
  align-self: center;
608
671
  line-height: normal;
609
672
  border: none;
610
673
  background: transparent;
611
674
  }
612
- .p-multiselect-label-container,
613
- .p-multi-select-label-container,
614
- .p-multiselect-trigger,
615
- .p-multi-select-trigger {
616
- border: none;
617
- background: transparent;
618
- }
619
- /* autocomplete (both) */
620
- .p-autocomplete {
675
+ /* autocomplete (Vue-only: :has(.p-autocomplete-input) targets Vue's structure, not React's) */
676
+ .p-autocomplete:has(.p-autocomplete-input) {
621
677
  height: 48px;
622
678
  font-size: 16px;
623
- gap: 8px;
624
679
  }
625
680
  /* menu (both: .p-menuitem-text=React, .p-menu-item-label=Vue) */
626
681
  .p-menu {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@robosophy/prime-theme",
3
- "version": "3.0.0",
3
+ "version": "3.0.2",
4
4
  "private": false,
5
5
  "license": "UNLICENSED",
6
6
  "type": "module",