jasmincss 1.0.6 → 1.0.8

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.
@@ -2,7 +2,7 @@
2
2
 
3
3
  > **Complete reference of all available utility classes and components**
4
4
  >
5
- > Generated automatically from JasminCSS v1.0.6
5
+ > Generated automatically from JasminCSS v1.0.8
6
6
 
7
7
  ## Table of Contents
8
8
 
@@ -387,7 +387,7 @@
387
387
  | `aspect-auto` | `aspect-ratio: auto;` |
388
388
  | `aspect-square` | `aspect-ratio: 1 / 1;` |
389
389
  | `aspect-video` | `aspect-ratio: 16 / 9;` |
390
- | `aspect-4\/3` | `aspect-ratio: 4 / 3;` |
390
+ | `aspect-4/3` | `aspect-ratio: 4 / 3;` |
391
391
  | `visible` | `visibility: visible;` |
392
392
  | `invisible` | `visibility: hidden;` |
393
393
  | `collapse` | `visibility: collapse;` |
@@ -1017,6 +1017,8 @@
1017
1017
  | `rounded-xl` | `border-radius: 1rem;` |
1018
1018
  | `rounded-2xl` | `border-radius: 1.5rem;` |
1019
1019
  | `rounded-full` | `border-radius: 9999px;` |
1020
+ | `rounded-buttons` | `border-radius: 0.5rem;` |
1021
+ | `rounded-inputs` | `border-radius: 0.5rem;` |
1020
1022
  | `rounded-t-none` | `border-top-left-radius: 0; border-top-right-radius: 0;` |
1021
1023
  | `rounded-r-none` | `border-top-right-radius: 0; border-bottom-right-radius: 0;` |
1022
1024
  | `rounded-b-none` | `border-bottom-left-radius: 0; border-bottom-right-radius: 0;` |
@@ -1129,6 +1131,34 @@
1129
1131
  | `rounded-se-full` | `border-start-end-radius: 9999px;` |
1130
1132
  | `rounded-ee-full` | `border-end-end-radius: 9999px;` |
1131
1133
  | `rounded-es-full` | `border-end-start-radius: 9999px;` |
1134
+ | `rounded-t-buttons` | `border-top-left-radius: 0.5rem; border-top-right-radius: 0.5rem;` |
1135
+ | `rounded-r-buttons` | `border-top-right-radius: 0.5rem; border-bottom-right-radius: 0.5rem;` |
1136
+ | `rounded-b-buttons` | `border-bottom-left-radius: 0.5rem; border-bottom-right-radius: 0.5rem;` |
1137
+ | `rounded-l-buttons` | `border-top-left-radius: 0.5rem; border-bottom-left-radius: 0.5rem;` |
1138
+ | `rounded-tl-buttons` | `border-top-left-radius: 0.5rem;` |
1139
+ | `rounded-tr-buttons` | `border-top-right-radius: 0.5rem;` |
1140
+ | `rounded-br-buttons` | `border-bottom-right-radius: 0.5rem;` |
1141
+ | `rounded-bl-buttons` | `border-bottom-left-radius: 0.5rem;` |
1142
+ | `rounded-s-buttons` | `border-start-start-radius: 0.5rem; border-end-start-radius: 0.5rem;` |
1143
+ | `rounded-e-buttons` | `border-start-end-radius: 0.5rem; border-end-end-radius: 0.5rem;` |
1144
+ | `rounded-ss-buttons` | `border-start-start-radius: 0.5rem;` |
1145
+ | `rounded-se-buttons` | `border-start-end-radius: 0.5rem;` |
1146
+ | `rounded-ee-buttons` | `border-end-end-radius: 0.5rem;` |
1147
+ | `rounded-es-buttons` | `border-end-start-radius: 0.5rem;` |
1148
+ | `rounded-t-inputs` | `border-top-left-radius: 0.5rem; border-top-right-radius: 0.5rem;` |
1149
+ | `rounded-r-inputs` | `border-top-right-radius: 0.5rem; border-bottom-right-radius: 0.5rem;` |
1150
+ | `rounded-b-inputs` | `border-bottom-left-radius: 0.5rem; border-bottom-right-radius: 0.5rem;` |
1151
+ | `rounded-l-inputs` | `border-top-left-radius: 0.5rem; border-bottom-left-radius: 0.5rem;` |
1152
+ | `rounded-tl-inputs` | `border-top-left-radius: 0.5rem;` |
1153
+ | `rounded-tr-inputs` | `border-top-right-radius: 0.5rem;` |
1154
+ | `rounded-br-inputs` | `border-bottom-right-radius: 0.5rem;` |
1155
+ | `rounded-bl-inputs` | `border-bottom-left-radius: 0.5rem;` |
1156
+ | `rounded-s-inputs` | `border-start-start-radius: 0.5rem; border-end-start-radius: 0.5rem;` |
1157
+ | `rounded-e-inputs` | `border-start-end-radius: 0.5rem; border-end-end-radius: 0.5rem;` |
1158
+ | `rounded-ss-inputs` | `border-start-start-radius: 0.5rem;` |
1159
+ | `rounded-se-inputs` | `border-start-end-radius: 0.5rem;` |
1160
+ | `rounded-ee-inputs` | `border-end-end-radius: 0.5rem;` |
1161
+ | `rounded-es-inputs` | `border-end-start-radius: 0.5rem;` |
1132
1162
  | `border-0` | `border-width: 0px;` |
1133
1163
  | `border` | `border-width: 1px;` |
1134
1164
  | `border-2` | `border-width: 2px;` |
@@ -2393,6 +2423,6 @@ export default withJasminCSS({});
2393
2423
 
2394
2424
  ---
2395
2425
 
2396
- **Total utility classes: 5,926**
2426
+ **Total utility classes: 5,956**
2397
2427
 
2398
2428
  Generated on 2026-01-16
package/bin/jasmin.js CHANGED
File without changes
package/dist/index.js CHANGED
@@ -46,6 +46,7 @@ var import_fs2 = __toESM(require("fs"), 1);
46
46
  var import_fast_glob = __toESM(require("fast-glob"), 1);
47
47
  var import_postcss = __toESM(require("postcss"), 1);
48
48
  var import_cssnano = __toESM(require("cssnano"), 1);
49
+ var import_picocolors = __toESM(require("picocolors"), 1);
49
50
 
50
51
  // src/config/loader.js
51
52
  var import_fs = __toESM(require("fs"), 1);
@@ -94,7 +95,12 @@ var defaultConfig = {
94
95
  lg: "0.75rem",
95
96
  xl: "1rem",
96
97
  "2xl": "1.5rem",
97
- full: "9999px"
98
+ full: "9999px",
99
+ // Component-specific border radius
100
+ buttons: "0.5rem",
101
+ // Separate radius for buttons
102
+ inputs: "0.5rem"
103
+ // Separate radius for form inputs, cards, etc.
98
104
  },
99
105
  shadows: {
100
106
  sm: "0 1px 2px 0 rgb(0 0 0 / 0.05)",
@@ -498,10 +504,10 @@ function generateLayoutUtilities(config) {
498
504
  });
499
505
  const spacing = config.spacing || {};
500
506
  Object.entries(spacing).forEach(([key, value]) => {
501
- const safeName = key.replace(".", "\\.");
502
- classes.push({ name: `gap-${safeName}`, css: `.gap-${safeName} { gap: ${value}; }` });
503
- classes.push({ name: `gap-x-${safeName}`, css: `.gap-x-${safeName} { column-gap: ${value}; }` });
504
- classes.push({ name: `gap-y-${safeName}`, css: `.gap-y-${safeName} { row-gap: ${value}; }` });
507
+ const safeName = key.replace(/\./g, "\\.");
508
+ classes.push({ name: `gap-${key}`, css: `.gap-${safeName} { gap: ${value}; }` });
509
+ classes.push({ name: `gap-x-${key}`, css: `.gap-x-${safeName} { column-gap: ${value}; }` });
510
+ classes.push({ name: `gap-y-${key}`, css: `.gap-y-${safeName} { row-gap: ${value}; }` });
505
511
  });
506
512
  for (let i = 1; i <= 12; i++) {
507
513
  classes.push({
@@ -555,20 +561,20 @@ function generateLayoutUtilities(config) {
555
561
  });
556
562
  const insetValues = { "0": "0", "auto": "auto", "full": "100%", "1/2": "50%", "1/3": "33.333333%", "2/3": "66.666667%", "1/4": "25%", "3/4": "75%" };
557
563
  Object.entries({ ...spacing, ...insetValues }).forEach(([key, value]) => {
558
- const safeName = key.replace("/", "\\/").replace(".", "\\.");
559
- classes.push({ name: `inset-${safeName}`, css: `.inset-${safeName} { inset: ${value}; }` });
560
- classes.push({ name: `inset-x-${safeName}`, css: `.inset-x-${safeName} { left: ${value}; right: ${value}; }` });
561
- classes.push({ name: `inset-y-${safeName}`, css: `.inset-y-${safeName} { top: ${value}; bottom: ${value}; }` });
562
- classes.push({ name: `top-${safeName}`, css: `.top-${safeName} { top: ${value}; }` });
563
- classes.push({ name: `right-${safeName}`, css: `.right-${safeName} { right: ${value}; }` });
564
- classes.push({ name: `bottom-${safeName}`, css: `.bottom-${safeName} { bottom: ${value}; }` });
565
- classes.push({ name: `left-${safeName}`, css: `.left-${safeName} { left: ${value}; }` });
564
+ const safeName = key.replace(/\//g, "\\/").replace(/\./g, "\\.");
565
+ classes.push({ name: `inset-${key}`, css: `.inset-${safeName} { inset: ${value}; }` });
566
+ classes.push({ name: `inset-x-${key}`, css: `.inset-x-${safeName} { left: ${value}; right: ${value}; }` });
567
+ classes.push({ name: `inset-y-${key}`, css: `.inset-y-${safeName} { top: ${value}; bottom: ${value}; }` });
568
+ classes.push({ name: `top-${key}`, css: `.top-${safeName} { top: ${value}; }` });
569
+ classes.push({ name: `right-${key}`, css: `.right-${safeName} { right: ${value}; }` });
570
+ classes.push({ name: `bottom-${key}`, css: `.bottom-${safeName} { bottom: ${value}; }` });
571
+ classes.push({ name: `left-${key}`, css: `.left-${safeName} { left: ${value}; }` });
566
572
  if (key !== "auto" && key !== "full" && !key.includes("/")) {
567
- classes.push({ name: `-inset-${safeName}`, css: `.-inset-${safeName} { inset: -${value}; }` });
568
- classes.push({ name: `-top-${safeName}`, css: `.-top-${safeName} { top: -${value}; }` });
569
- classes.push({ name: `-right-${safeName}`, css: `.-right-${safeName} { right: -${value}; }` });
570
- classes.push({ name: `-bottom-${safeName}`, css: `.-bottom-${safeName} { bottom: -${value}; }` });
571
- classes.push({ name: `-left-${safeName}`, css: `.-left-${safeName} { left: -${value}; }` });
573
+ classes.push({ name: `-inset-${key}`, css: `.-inset-${safeName} { inset: -${value}; }` });
574
+ classes.push({ name: `-top-${key}`, css: `.-top-${safeName} { top: -${value}; }` });
575
+ classes.push({ name: `-right-${key}`, css: `.-right-${safeName} { right: -${value}; }` });
576
+ classes.push({ name: `-bottom-${key}`, css: `.-bottom-${safeName} { bottom: -${value}; }` });
577
+ classes.push({ name: `-left-${key}`, css: `.-left-${safeName} { left: -${value}; }` });
572
578
  }
573
579
  });
574
580
  ["auto", "0", "10", "20", "30", "40", "50"].forEach((z) => {
@@ -619,8 +625,8 @@ function generateLayoutUtilities(config) {
619
625
  "11/12": "91.666667%"
620
626
  };
621
627
  Object.entries({ ...spacing, ...widthSizes }).forEach(([key, value]) => {
622
- const safeName = key.replace("/", "\\/").replace(".", "\\.");
623
- classes.push({ name: `w-${safeName}`, css: `.w-${safeName} { width: ${value}; }` });
628
+ const safeName = key.replace(/\//g, "\\/").replace(/\./g, "\\.");
629
+ classes.push({ name: `w-${key}`, css: `.w-${safeName} { width: ${value}; }` });
624
630
  });
625
631
  const heightSizes = {
626
632
  "0": "0",
@@ -648,8 +654,8 @@ function generateLayoutUtilities(config) {
648
654
  "5/6": "83.333333%"
649
655
  };
650
656
  Object.entries({ ...spacing, ...heightSizes }).forEach(([key, value]) => {
651
- const safeName = key.replace("/", "\\/").replace(".", "\\.");
652
- classes.push({ name: `h-${safeName}`, css: `.h-${safeName} { height: ${value}; }` });
657
+ const safeName = key.replace(/\//g, "\\/").replace(/\./g, "\\.");
658
+ classes.push({ name: `h-${key}`, css: `.h-${safeName} { height: ${value}; }` });
653
659
  });
654
660
  const minMaxWidths = { "0": "0", "none": "none", "xs": "20rem", "sm": "24rem", "md": "28rem", "lg": "32rem", "xl": "36rem", "2xl": "42rem", "3xl": "48rem", "4xl": "56rem", "5xl": "64rem", "6xl": "72rem", "7xl": "80rem", "full": "100%", "min": "min-content", "max": "max-content", "fit": "fit-content", "prose": "65ch", "screen-sm": "640px", "screen-md": "768px", "screen-lg": "1024px", "screen-xl": "1280px", "screen-2xl": "1536px" };
655
661
  Object.entries(minMaxWidths).forEach(([key, value]) => {
@@ -662,14 +668,14 @@ function generateLayoutUtilities(config) {
662
668
  classes.push({ name: `max-h-${key}`, css: `.max-h-${key} { max-height: ${value}; }` });
663
669
  });
664
670
  Object.entries(spacing).forEach(([key, value]) => {
665
- const safeName = key.replace(".", "\\.");
666
- classes.push({ name: `min-h-${safeName}`, css: `.min-h-${safeName} { min-height: ${value}; }` });
667
- classes.push({ name: `max-h-${safeName}`, css: `.max-h-${safeName} { max-height: ${value}; }` });
671
+ const safeName = key.replace(/\./g, "\\.");
672
+ classes.push({ name: `min-h-${key}`, css: `.min-h-${safeName} { min-height: ${value}; }` });
673
+ classes.push({ name: `max-h-${key}`, css: `.max-h-${safeName} { max-height: ${value}; }` });
668
674
  });
669
675
  Object.entries({ ...spacing, ...widthSizes }).forEach(([key, value]) => {
670
676
  if (key !== "screen" && key !== "svw" && key !== "lvw" && key !== "dvw") {
671
- const safeName = key.replace("/", "\\/").replace(".", "\\.");
672
- classes.push({ name: `size-${safeName}`, css: `.size-${safeName} { width: ${value}; height: ${value}; }` });
677
+ const safeName = key.replace(/\//g, "\\/").replace(/\./g, "\\.");
678
+ classes.push({ name: `size-${key}`, css: `.size-${safeName} { width: ${value}; height: ${value}; }` });
673
679
  }
674
680
  });
675
681
  ["auto", "hidden", "clip", "visible", "scroll"].forEach((o) => {
@@ -686,7 +692,7 @@ function generateLayoutUtilities(config) {
686
692
  classes.push({ name: "aspect-auto", css: ".aspect-auto { aspect-ratio: auto; }" });
687
693
  classes.push({ name: "aspect-square", css: ".aspect-square { aspect-ratio: 1 / 1; }" });
688
694
  classes.push({ name: "aspect-video", css: ".aspect-video { aspect-ratio: 16 / 9; }" });
689
- classes.push({ name: "aspect-4\\/3", css: ".aspect-4\\/3 { aspect-ratio: 4 / 3; }" });
695
+ classes.push({ name: "aspect-4/3", css: ".aspect-4\\/3 { aspect-ratio: 4 / 3; }" });
690
696
  classes.push({ name: "visible", css: ".visible { visibility: visible; }" });
691
697
  classes.push({ name: "invisible", css: ".invisible { visibility: hidden; }" });
692
698
  classes.push({ name: "collapse", css: ".collapse { visibility: collapse; }" });
@@ -814,28 +820,28 @@ function generateSpacingUtilities(config, options = {}) {
814
820
  const spacing = config.spacing || {};
815
821
  const { usedClasses } = options;
816
822
  Object.entries(spacing).forEach(([key, value]) => {
817
- const safeName = key.replace(".", "\\.");
818
- classes.push({ name: `p-${safeName}`, css: `.p-${safeName} { padding: ${value}; }` });
819
- classes.push({ name: `pt-${safeName}`, css: `.pt-${safeName} { padding-top: ${value}; }` });
820
- classes.push({ name: `pr-${safeName}`, css: `.pr-${safeName} { padding-right: ${value}; }` });
821
- classes.push({ name: `pb-${safeName}`, css: `.pb-${safeName} { padding-bottom: ${value}; }` });
822
- classes.push({ name: `pl-${safeName}`, css: `.pl-${safeName} { padding-left: ${value}; }` });
823
- classes.push({ name: `px-${safeName}`, css: `.px-${safeName} { padding-left: ${value}; padding-right: ${value}; }` });
824
- classes.push({ name: `py-${safeName}`, css: `.py-${safeName} { padding-top: ${value}; padding-bottom: ${value}; }` });
825
- classes.push({ name: `ps-${safeName}`, css: `.ps-${safeName} { padding-inline-start: ${value}; }` });
826
- classes.push({ name: `pe-${safeName}`, css: `.pe-${safeName} { padding-inline-end: ${value}; }` });
823
+ const safeName = key.replace(/\./g, "\\.");
824
+ classes.push({ name: `p-${key}`, css: `.p-${safeName} { padding: ${value}; }` });
825
+ classes.push({ name: `pt-${key}`, css: `.pt-${safeName} { padding-top: ${value}; }` });
826
+ classes.push({ name: `pr-${key}`, css: `.pr-${safeName} { padding-right: ${value}; }` });
827
+ classes.push({ name: `pb-${key}`, css: `.pb-${safeName} { padding-bottom: ${value}; }` });
828
+ classes.push({ name: `pl-${key}`, css: `.pl-${safeName} { padding-left: ${value}; }` });
829
+ classes.push({ name: `px-${key}`, css: `.px-${safeName} { padding-left: ${value}; padding-right: ${value}; }` });
830
+ classes.push({ name: `py-${key}`, css: `.py-${safeName} { padding-top: ${value}; padding-bottom: ${value}; }` });
831
+ classes.push({ name: `ps-${key}`, css: `.ps-${safeName} { padding-inline-start: ${value}; }` });
832
+ classes.push({ name: `pe-${key}`, css: `.pe-${safeName} { padding-inline-end: ${value}; }` });
827
833
  });
828
834
  Object.entries(spacing).forEach(([key, value]) => {
829
- const safeName = key.replace(".", "\\.");
830
- classes.push({ name: `m-${safeName}`, css: `.m-${safeName} { margin: ${value}; }` });
831
- classes.push({ name: `mt-${safeName}`, css: `.mt-${safeName} { margin-top: ${value}; }` });
832
- classes.push({ name: `mr-${safeName}`, css: `.mr-${safeName} { margin-right: ${value}; }` });
833
- classes.push({ name: `mb-${safeName}`, css: `.mb-${safeName} { margin-bottom: ${value}; }` });
834
- classes.push({ name: `ml-${safeName}`, css: `.ml-${safeName} { margin-left: ${value}; }` });
835
- classes.push({ name: `mx-${safeName}`, css: `.mx-${safeName} { margin-left: ${value}; margin-right: ${value}; }` });
836
- classes.push({ name: `my-${safeName}`, css: `.my-${safeName} { margin-top: ${value}; margin-bottom: ${value}; }` });
837
- classes.push({ name: `ms-${safeName}`, css: `.ms-${safeName} { margin-inline-start: ${value}; }` });
838
- classes.push({ name: `me-${safeName}`, css: `.me-${safeName} { margin-inline-end: ${value}; }` });
835
+ const safeName = key.replace(/\./g, "\\.");
836
+ classes.push({ name: `m-${key}`, css: `.m-${safeName} { margin: ${value}; }` });
837
+ classes.push({ name: `mt-${key}`, css: `.mt-${safeName} { margin-top: ${value}; }` });
838
+ classes.push({ name: `mr-${key}`, css: `.mr-${safeName} { margin-right: ${value}; }` });
839
+ classes.push({ name: `mb-${key}`, css: `.mb-${safeName} { margin-bottom: ${value}; }` });
840
+ classes.push({ name: `ml-${key}`, css: `.ml-${safeName} { margin-left: ${value}; }` });
841
+ classes.push({ name: `mx-${key}`, css: `.mx-${safeName} { margin-left: ${value}; margin-right: ${value}; }` });
842
+ classes.push({ name: `my-${key}`, css: `.my-${safeName} { margin-top: ${value}; margin-bottom: ${value}; }` });
843
+ classes.push({ name: `ms-${key}`, css: `.ms-${safeName} { margin-inline-start: ${value}; }` });
844
+ classes.push({ name: `me-${key}`, css: `.me-${safeName} { margin-inline-end: ${value}; }` });
839
845
  });
840
846
  classes.push({ name: "m-auto", css: ".m-auto { margin: auto; }" });
841
847
  classes.push({ name: "mx-auto", css: ".mx-auto { margin-left: auto; margin-right: auto; }" });
@@ -849,32 +855,32 @@ function generateSpacingUtilities(config, options = {}) {
849
855
  Object.entries(spacing).forEach(([key, value]) => {
850
856
  if (key === "0" || key === "px")
851
857
  return;
852
- const safeName = key.replace(".", "\\.");
853
- classes.push({ name: `-m-${safeName}`, css: `.-m-${safeName} { margin: -${value}; }` });
854
- classes.push({ name: `-mt-${safeName}`, css: `.-mt-${safeName} { margin-top: -${value}; }` });
855
- classes.push({ name: `-mr-${safeName}`, css: `.-mr-${safeName} { margin-right: -${value}; }` });
856
- classes.push({ name: `-mb-${safeName}`, css: `.-mb-${safeName} { margin-bottom: -${value}; }` });
857
- classes.push({ name: `-ml-${safeName}`, css: `.-ml-${safeName} { margin-left: -${value}; }` });
858
- classes.push({ name: `-mx-${safeName}`, css: `.-mx-${safeName} { margin-left: -${value}; margin-right: -${value}; }` });
859
- classes.push({ name: `-my-${safeName}`, css: `.-my-${safeName} { margin-top: -${value}; margin-bottom: -${value}; }` });
858
+ const safeName = key.replace(/\./g, "\\.");
859
+ classes.push({ name: `-m-${key}`, css: `.-m-${safeName} { margin: -${value}; }` });
860
+ classes.push({ name: `-mt-${key}`, css: `.-mt-${safeName} { margin-top: -${value}; }` });
861
+ classes.push({ name: `-mr-${key}`, css: `.-mr-${safeName} { margin-right: -${value}; }` });
862
+ classes.push({ name: `-mb-${key}`, css: `.-mb-${safeName} { margin-bottom: -${value}; }` });
863
+ classes.push({ name: `-ml-${key}`, css: `.-ml-${safeName} { margin-left: -${value}; }` });
864
+ classes.push({ name: `-mx-${key}`, css: `.-mx-${safeName} { margin-left: -${value}; margin-right: -${value}; }` });
865
+ classes.push({ name: `-my-${key}`, css: `.-my-${safeName} { margin-top: -${value}; margin-bottom: -${value}; }` });
860
866
  });
861
867
  Object.entries(spacing).forEach(([key, value]) => {
862
- const safeName = key.replace(".", "\\.");
868
+ const safeName = key.replace(/\./g, "\\.");
863
869
  classes.push({
864
- name: `space-x-${safeName}`,
870
+ name: `space-x-${key}`,
865
871
  css: `.space-x-${safeName} > :not([hidden]) ~ :not([hidden]) { margin-left: ${value}; }`
866
872
  });
867
873
  classes.push({
868
- name: `space-y-${safeName}`,
874
+ name: `space-y-${key}`,
869
875
  css: `.space-y-${safeName} > :not([hidden]) ~ :not([hidden]) { margin-top: ${value}; }`
870
876
  });
871
877
  if (key !== "0" && key !== "px") {
872
878
  classes.push({
873
- name: `-space-x-${safeName}`,
879
+ name: `-space-x-${key}`,
874
880
  css: `.-space-x-${safeName} > :not([hidden]) ~ :not([hidden]) { margin-left: -${value}; }`
875
881
  });
876
882
  classes.push({
877
- name: `-space-y-${safeName}`,
883
+ name: `-space-y-${key}`,
878
884
  css: `.-space-y-${safeName} > :not([hidden]) ~ :not([hidden]) { margin-top: -${value}; }`
879
885
  });
880
886
  }
@@ -1723,19 +1729,19 @@ function generateTransformUtilities(config) {
1723
1729
  "full": "100%"
1724
1730
  };
1725
1731
  Object.entries(translateValues).forEach(([key, value]) => {
1726
- const safeName = key.replace("/", "\\/").replace(".", "\\.");
1727
- classes.push({ name: `translate-x-${safeName}`, css: `.translate-x-${safeName} { --j-translate-x: ${value}; transform: translateX(${value}); }` });
1728
- classes.push({ name: `translate-y-${safeName}`, css: `.translate-y-${safeName} { --j-translate-y: ${value}; transform: translateY(${value}); }` });
1732
+ const safeName = key.replace(/\//g, "\\/").replace(/\./g, "\\.");
1733
+ classes.push({ name: `translate-x-${key}`, css: `.translate-x-${safeName} { --j-translate-x: ${value}; transform: translateX(${value}); }` });
1734
+ classes.push({ name: `translate-y-${key}`, css: `.translate-y-${safeName} { --j-translate-y: ${value}; transform: translateY(${value}); }` });
1729
1735
  if (!key.includes("/")) {
1730
- classes.push({ name: `-translate-x-${safeName}`, css: `.-translate-x-${safeName} { --j-translate-x: -${value}; transform: translateX(-${value}); }` });
1731
- classes.push({ name: `-translate-y-${safeName}`, css: `.-translate-y-${safeName} { --j-translate-y: -${value}; transform: translateY(-${value}); }` });
1736
+ classes.push({ name: `-translate-x-${key}`, css: `.-translate-x-${safeName} { --j-translate-x: -${value}; transform: translateX(-${value}); }` });
1737
+ classes.push({ name: `-translate-y-${key}`, css: `.-translate-y-${safeName} { --j-translate-y: -${value}; transform: translateY(-${value}); }` });
1732
1738
  }
1733
1739
  });
1734
1740
  ["1/2", "1/3", "2/3", "1/4", "3/4", "full"].forEach((key) => {
1735
1741
  const value = translateValues[key];
1736
- const safeName = key.replace("/", "\\/");
1737
- classes.push({ name: `-translate-x-${safeName}`, css: `.-translate-x-${safeName} { --j-translate-x: -${value}; transform: translateX(-${value}); }` });
1738
- classes.push({ name: `-translate-y-${safeName}`, css: `.-translate-y-${safeName} { --j-translate-y: -${value}; transform: translateY(-${value}); }` });
1742
+ const safeName = key.replace(/\//g, "\\/");
1743
+ classes.push({ name: `-translate-x-${key}`, css: `.-translate-x-${safeName} { --j-translate-x: -${value}; transform: translateX(-${value}); }` });
1744
+ classes.push({ name: `-translate-y-${key}`, css: `.-translate-y-${safeName} { --j-translate-y: -${value}; transform: translateY(-${value}); }` });
1739
1745
  });
1740
1746
  const skews = [0, 1, 2, 3, 6, 12];
1741
1747
  skews.forEach((s) => {
@@ -3540,12 +3546,13 @@ function generateResponsiveUtilities(config, selectedUtilities, usedClasses, inc
3540
3546
  const { classes } = generator(config);
3541
3547
  for (const cls of classes) {
3542
3548
  const escapedBp = escapeCssSelector(bp);
3543
- const escapedName = cls.name.replace(/\./g, "\\.");
3549
+ const escapedName = cls.name.replace(/\//g, "\\/").replace(/\./g, "\\.");
3544
3550
  const responsiveClassName = `${escapedBp}\\:${escapedName}`;
3545
3551
  const shouldInclude = includeAll || !usedClasses || usedClasses.has(`${bp}:${cls.name}`);
3546
3552
  if (shouldInclude) {
3553
+ const regexSafeName = escapedName.replace(/\\/g, "\\\\");
3547
3554
  bpClasses.push(cls.css.replace(
3548
- new RegExp(`\\.${escapeRegex(cls.name)}`, "g"),
3555
+ new RegExp(`\\.${regexSafeName}(?=[^-\\w])`, "g"),
3549
3556
  `.${responsiveClassName}`
3550
3557
  ));
3551
3558
  }
@@ -3584,7 +3591,7 @@ function generateStateUtilities(config, selectedUtilities, usedClasses, includeA
3584
3591
  for (const cls of classes) {
3585
3592
  if (cls.css.includes("@media") || cls.css.includes("@keyframes"))
3586
3593
  continue;
3587
- const escapedName = cls.name.replace(/\./g, "\\.");
3594
+ const escapedName = cls.name.replace(/\//g, "\\/").replace(/\./g, "\\.");
3588
3595
  const stateClassName = `${state}\\:${escapedName}`;
3589
3596
  const shouldInclude = includeAll || !usedClasses || usedClasses.has(`${state}:${cls.name}`);
3590
3597
  if (shouldInclude) {
@@ -3611,7 +3618,7 @@ function generateStateUtilities(config, selectedUtilities, usedClasses, includeA
3611
3618
  for (const cls of classes) {
3612
3619
  if (cls.css.includes("@media") || cls.css.includes("@keyframes"))
3613
3620
  continue;
3614
- const escapedName = cls.name.replace(/\./g, "\\.");
3621
+ const escapedName = cls.name.replace(/\//g, "\\/").replace(/\./g, "\\.");
3615
3622
  const stateClassName = `group-hover\\:${escapedName}`;
3616
3623
  const shouldInclude = includeAll || !usedClasses || usedClasses.has(`group-hover:${cls.name}`);
3617
3624
  if (shouldInclude) {
@@ -3636,7 +3643,7 @@ function generateStateUtilities(config, selectedUtilities, usedClasses, includeA
3636
3643
  for (const cls of classes) {
3637
3644
  if (cls.css.includes("@media") || cls.css.includes("@keyframes"))
3638
3645
  continue;
3639
- const escapedName = cls.name.replace(/\./g, "\\.");
3646
+ const escapedName = cls.name.replace(/\//g, "\\/").replace(/\./g, "\\.");
3640
3647
  const darkClassName = `dark\\:${escapedName}`;
3641
3648
  const shouldInclude = includeAll || !usedClasses || usedClasses.has(`dark:${cls.name}`);
3642
3649
  if (shouldInclude) {
@@ -3653,9 +3660,6 @@ function generateStateUtilities(config, selectedUtilities, usedClasses, includeA
3653
3660
  }
3654
3661
  return parts.join("\n");
3655
3662
  }
3656
- function escapeRegex(string) {
3657
- return string.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
3658
- }
3659
3663
  function escapeCssSelector(name) {
3660
3664
  if (/^\d/.test(name)) {
3661
3665
  const firstChar = name.charCodeAt(0).toString(16);
@@ -3676,7 +3680,7 @@ function generateButtonStyles(config) {
3676
3680
  font-size: 0.875rem;
3677
3681
  font-weight: 500;
3678
3682
  line-height: 1.25rem;
3679
- border-radius: var(--j-radius-default, 0.5rem);
3683
+ border-radius: var(--j-radius-buttons, var(--j-radius-default, 0.5rem));
3680
3684
  border: 1px solid transparent;
3681
3685
  cursor: pointer;
3682
3686
  transition: all 150ms ease-in-out;
@@ -4434,7 +4438,7 @@ function generateFormStyles(config) {
4434
4438
  color: var(--j-text);
4435
4439
  background-color: var(--j-bg);
4436
4440
  border: 1px solid var(--j-border);
4437
- border-radius: var(--j-radius-default, 0.5rem);
4441
+ border-radius: var(--j-radius-inputs, var(--j-radius-default, 0.5rem));
4438
4442
  transition: border-color 150ms ease-in-out, box-shadow 150ms ease-in-out;
4439
4443
  appearance: none;
4440
4444
  }
@@ -4818,7 +4822,7 @@ input[type="range"].form-control::-webkit-slider-thumb:hover {
4818
4822
 
4819
4823
  /* Square Switch */
4820
4824
  .form-switch-square .form-switch-input {
4821
- border-radius: var(--j-radius-default, 0.375rem);
4825
+ border-radius: var(--j-radius-inputs, var(--j-radius-default, 0.375rem));
4822
4826
  }
4823
4827
 
4824
4828
  .form-switch-square .form-switch-input::before {
@@ -4864,12 +4868,12 @@ input[type="range"].form-control::-webkit-slider-thumb:hover {
4864
4868
 
4865
4869
  .input-group-text:first-child {
4866
4870
  border-right: none;
4867
- border-radius: var(--j-radius-default, 0.5rem) 0 0 var(--j-radius-default, 0.5rem);
4871
+ border-radius: var(--j-radius-inputs, 0.5rem) 0 0 var(--j-radius-inputs, 0.5rem);
4868
4872
  }
4869
4873
 
4870
4874
  .input-group-text:last-child {
4871
4875
  border-left: none;
4872
- border-radius: 0 var(--j-radius-default, 0.5rem) var(--j-radius-default, 0.5rem) 0;
4876
+ border-radius: 0 var(--j-radius-inputs, 0.5rem) var(--j-radius-inputs, 0.5rem) 0;
4873
4877
  }
4874
4878
 
4875
4879
  .input-group > .btn:first-child {
@@ -4906,7 +4910,7 @@ input[type="range"].form-control::-webkit-slider-thumb:hover {
4906
4910
 
4907
4911
  .form-floating > .form-control:focus ~ .form-label,
4908
4912
  .form-floating > .form-control:not(:placeholder-shown) ~ .form-label {
4909
- transform: scale(0.85) translateY(-0.5rem);
4913
+ transform: scale(0.85) translateY(-0.5rem));
4910
4914
  color: var(--j-primary);
4911
4915
  }
4912
4916
 
@@ -4920,7 +4924,7 @@ input[type="range"].form-control::-webkit-slider-thumb:hover {
4920
4924
  /* Fieldset */
4921
4925
  fieldset {
4922
4926
  border: 1px solid var(--j-border);
4923
- border-radius: var(--j-radius-default, 0.5rem);
4927
+ border-radius: var(--j-radius-inputs, var(--j-radius-default, 0.5rem));
4924
4928
  padding: 1.5rem;
4925
4929
  margin-bottom: 1.5rem;
4926
4930
  }
@@ -14741,9 +14745,81 @@ code, kbd, samp, pre {
14741
14745
  }
14742
14746
 
14743
14747
  // src/core/compiler.js
14748
+ var COMPONENT_CLASS_PREFIXES = {
14749
+ "accordion": "accordion",
14750
+ "alert": "alerts",
14751
+ "avatar": "avatars",
14752
+ "badge": "badges",
14753
+ "btn": "buttons",
14754
+ "card": "cards",
14755
+ "carousel": "carousel",
14756
+ "chip": "chips",
14757
+ "command-palette": "command-palette",
14758
+ "datepicker": "datepicker",
14759
+ "calendar": "datepicker",
14760
+ "dropdown": "dropdown",
14761
+ "form-": "forms",
14762
+ "input-group": "forms",
14763
+ "modal": "modals",
14764
+ "navbar": "navigation",
14765
+ "nav-": "navigation",
14766
+ "breadcrumb": "navigation",
14767
+ "pagination": "navigation",
14768
+ "tabs": "navigation",
14769
+ "tab": "navigation",
14770
+ "offcanvas": "offcanvas",
14771
+ "popover": "popover",
14772
+ "progress": "progress",
14773
+ "rating": "rating",
14774
+ "skeleton": "skeleton",
14775
+ "spinner": "spinner",
14776
+ "stepper": "stepper",
14777
+ "table": "tables",
14778
+ "timeline": "timeline",
14779
+ "timepicker": "timepicker",
14780
+ "tooltip": "tooltips",
14781
+ "upload": "upload"
14782
+ };
14783
+ function detectUsedComponents(usedClasses) {
14784
+ const detectedComponents = /* @__PURE__ */ new Set();
14785
+ if (!usedClasses)
14786
+ return detectedComponents;
14787
+ for (const className of usedClasses) {
14788
+ for (const [prefix, component] of Object.entries(COMPONENT_CLASS_PREFIXES)) {
14789
+ if (className.startsWith(prefix) || className === prefix.replace(/-$/, "")) {
14790
+ detectedComponents.add(component);
14791
+ }
14792
+ }
14793
+ }
14794
+ return detectedComponents;
14795
+ }
14796
+ function getMissingComponents(configComponents, detectedComponents) {
14797
+ const missing = [];
14798
+ for (const comp of detectedComponents) {
14799
+ if (!configComponents || !configComponents.includes(comp)) {
14800
+ missing.push(comp);
14801
+ }
14802
+ }
14803
+ return missing;
14804
+ }
14744
14805
  async function compileCSS(config, options = {}) {
14745
- const { usedClasses, minify = false, includeAll = false } = options;
14806
+ const { usedClasses, minify = false, includeAll = false, autoDetectComponents = true } = options;
14746
14807
  const resolvedConfig = resolveConfig(config);
14808
+ let selectedComponents = config.components || [];
14809
+ let detectedComponents = /* @__PURE__ */ new Set();
14810
+ let missingComponents = [];
14811
+ if (usedClasses && autoDetectComponents) {
14812
+ detectedComponents = detectUsedComponents(usedClasses);
14813
+ missingComponents = getMissingComponents(selectedComponents, detectedComponents);
14814
+ if (missingComponents.length > 0) {
14815
+ console.log(import_picocolors.default.yellow(`
14816
+ \u26A0\uFE0F Auto-detected ${missingComponents.length} additional component(s):`));
14817
+ console.log(import_picocolors.default.dim(` ${missingComponents.join(", ")}`));
14818
+ console.log(import_picocolors.default.dim(` Adding them to this build automatically.
14819
+ `));
14820
+ selectedComponents = [.../* @__PURE__ */ new Set([...selectedComponents, ...missingComponents])];
14821
+ }
14822
+ }
14747
14823
  const parts = [];
14748
14824
  parts.push(generateBase(resolvedConfig));
14749
14825
  const utilities = generateUtilities(resolvedConfig, {
@@ -14752,7 +14828,7 @@ async function compileCSS(config, options = {}) {
14752
14828
  });
14753
14829
  parts.push(utilities.css);
14754
14830
  const components2 = generateComponents(resolvedConfig, {
14755
- selected: config.components,
14831
+ selected: selectedComponents,
14756
14832
  usedClasses,
14757
14833
  includeAll
14758
14834
  });
@@ -14775,7 +14851,9 @@ async function compileCSS(config, options = {}) {
14775
14851
  minified,
14776
14852
  stats: {
14777
14853
  utilities: utilities.count,
14778
- components: components2.count
14854
+ components: components2.count,
14855
+ autoDetected: missingComponents,
14856
+ totalComponents: selectedComponents.length
14779
14857
  }
14780
14858
  };
14781
14859
  }