@vaneui/ui 0.1.4 → 0.1.6

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 (28) hide show
  1. package/dist/components/themeContext.d.ts +19 -19
  2. package/dist/components/ui/props/keys.d.ts +8 -10
  3. package/dist/components/ui/theme/appearance/bgAppearanceTheme.d.ts +8 -0
  4. package/dist/components/ui/theme/appearance/genericVariantTheme.d.ts +16 -0
  5. package/dist/components/ui/theme/appearance/shadowAppearanceTheme.d.ts +10 -0
  6. package/dist/components/ui/theme/appearance/textAppearanceTheme.d.ts +3 -4
  7. package/dist/components/ui/theme/badgeTheme.d.ts +12 -11
  8. package/dist/components/ui/theme/buttonTheme.d.ts +12 -11
  9. package/dist/components/ui/theme/cardTheme.d.ts +7 -7
  10. package/dist/components/ui/theme/chipTheme.d.ts +12 -11
  11. package/dist/components/ui/theme/colTheme.d.ts +3 -3
  12. package/dist/components/ui/theme/common/ComponentTheme.d.ts +10 -6
  13. package/dist/components/ui/theme/containerTheme.d.ts +5 -5
  14. package/dist/components/ui/theme/dividerTheme.d.ts +2 -2
  15. package/dist/components/ui/theme/gridTheme.d.ts +3 -3
  16. package/dist/components/ui/theme/rowTheme.d.ts +3 -3
  17. package/dist/components/ui/theme/sectionTheme.d.ts +12 -10
  18. package/dist/components/ui/theme/stackTheme.d.ts +3 -3
  19. package/dist/components/ui/theme/typographyComponentTheme.d.ts +11 -11
  20. package/dist/index.esm.js +264 -333
  21. package/dist/index.esm.js.map +1 -1
  22. package/dist/index.js +263 -333
  23. package/dist/index.js.map +1 -1
  24. package/dist/ui.css +44 -51
  25. package/package.json +2 -2
  26. package/dist/components/ui/theme/appearance/layoutAppearanceTheme.d.ts +0 -10
  27. package/dist/components/ui/theme/appearance/variantTheme.d.ts +0 -15
  28. package/dist/components/ui/theme/layout/shadowTheme.d.ts +0 -9
package/dist/index.js CHANGED
@@ -14,9 +14,8 @@ class BaseTheme {
14
14
  const MODE_KEYS = ['base', 'hover', 'active'];
15
15
  const SIZE_KEYS = ['xs', 'sm', 'md', 'lg', 'xl'];
16
16
  const VARIANT_KEYS = ['filled', 'outline'];
17
- const UI_APPEARANCE_KEYS = ['default', 'accent', 'primary', 'secondary', 'tertiary', 'success', 'danger', 'warning', 'info'];
18
- const BG_APPEARANCE_KEYS = [...UI_APPEARANCE_KEYS, 'transparent'];
19
- const TEXT_APPEARANCE_KEYS = [...UI_APPEARANCE_KEYS, 'muted', 'link'];
17
+ const BG_APPEARANCE_KEYS = ['default', 'accent', 'primary', 'secondary', 'tertiary', 'success', 'danger', 'warning', 'info', 'transparent'];
18
+ const TEXT_APPEARANCE_KEYS = [...BG_APPEARANCE_KEYS, 'muted', 'link'];
20
19
  const FONT_FAMILY_KEYS = ['sans', 'serif', 'mono'];
21
20
  const FONT_WEIGHT_KEYS = ['thin', 'extralight', 'light', 'normal', 'medium', 'semibold', 'bold', 'extrabold', 'black'];
22
21
  const FONT_STYLE_KEYS = ['italic', 'notItalic'];
@@ -47,7 +46,6 @@ const EXCLUSIVE_KEY_GROUPS = [
47
46
  SIZE_KEYS,
48
47
  TEXT_APPEARANCE_KEYS,
49
48
  BG_APPEARANCE_KEYS,
50
- UI_APPEARANCE_KEYS,
51
49
  VARIANT_KEYS,
52
50
  FONT_FAMILY_KEYS,
53
51
  FONT_WEIGHT_KEYS,
@@ -441,75 +439,6 @@ TextAlignTheme.defaultClasses = {
441
439
  textJustify: "text-justify",
442
440
  };
443
441
 
444
- const isObject = (item) => {
445
- return item !== null && typeof item === 'object' && !Array.isArray(item);
446
- };
447
- const deepMerge = (target, source) => {
448
- const output = Object.assign(Object.create(Object.getPrototypeOf(target)), target);
449
- for (const key in source) {
450
- if (Object.prototype.hasOwnProperty.call(source, key)) {
451
- const sourceValue = source[key];
452
- const targetValue = output[key];
453
- if (sourceValue === undefined) {
454
- continue;
455
- }
456
- // Special case: If the key is 'defaults', use the contextual mergeDefaults function.
457
- if (key === 'defaults' &&
458
- isObject(targetValue) &&
459
- isObject(sourceValue)) {
460
- output[key] = mergeDefaults(targetValue, sourceValue);
461
- }
462
- // For all other objects, use the standard recursive deep merge.
463
- else if (isObject(targetValue) && isObject(sourceValue)) {
464
- output[key] = deepMerge(targetValue, sourceValue);
465
- }
466
- // For non-object values, just assign the value from the source.
467
- else {
468
- output[key] = sourceValue;
469
- }
470
- }
471
- }
472
- return output;
473
- };
474
- const deepClone = (source) => {
475
- if (!isObject(source)) {
476
- return source;
477
- }
478
- const output = Object.assign(Object.create(Object.getPrototypeOf(source)), source);
479
- for (const key in output) {
480
- if (Object.prototype.hasOwnProperty.call(output, key)) {
481
- output[key] = deepClone(output[key]);
482
- }
483
- }
484
- return output;
485
- };
486
- const findGroup = (key) => EXCLUSIVE_KEY_GROUPS.find(group => group.includes(key));
487
- const mergeDefaults = (baseDefaults, overrideDefaults) => {
488
- const finalDefaults = { ...baseDefaults };
489
- // Iterate over the override keys to apply them.
490
- for (const key in overrideDefaults) {
491
- if (Object.prototype.hasOwnProperty.call(overrideDefaults, key)) {
492
- const overrideValue = overrideDefaults[key];
493
- // If the override is setting a key to true...
494
- if (overrideValue) {
495
- // Find the exclusive group this key belongs to (e.g., SIZE_KEYS).
496
- const group = findGroup(key);
497
- // If the key is part of an exclusive group...
498
- if (group) {
499
- // ...set all other keys in that group to false.
500
- group.forEach(groupKey => {
501
- if (groupKey !== key) {
502
- finalDefaults[groupKey] = false;
503
- }
504
- });
505
- }
506
- }
507
- finalDefaults[key] = overrideValue;
508
- }
509
- }
510
- return finalDefaults;
511
- };
512
-
513
442
  class DisplayTheme extends BaseTheme {
514
443
  constructor(initialConfig) {
515
444
  super();
@@ -3248,29 +3177,27 @@ const getDefaultConfig = () => {
3248
3177
  };
3249
3178
  const twMerge = /*#__PURE__*/createTailwindMerge(getDefaultConfig);
3250
3179
 
3180
+ const defaultLayoutTheme = {
3181
+ hide: new HideTheme(),
3182
+ items: new ItemsTheme(),
3183
+ justify: new JustifyTheme(),
3184
+ position: new PositionTheme(),
3185
+ display: new DisplayTheme()
3186
+ };
3187
+ const defaultTypographyTheme = {
3188
+ fontFamily: new FontFamilyTheme(),
3189
+ fontWeight: new FontWeightTheme(),
3190
+ fontStyle: new FontStyleTheme(),
3191
+ textDecoration: new TextDecorationTheme(),
3192
+ textTransform: new TextTransformTheme(),
3193
+ textAlign: new TextAlignTheme()
3194
+ };
3251
3195
  class ComponentTheme {
3252
3196
  constructor(tag, base, subThemes, defaults = {}) {
3253
3197
  this.tag = tag;
3254
3198
  this.base = base;
3255
3199
  this.defaults = defaults;
3256
- const defaultInternalThemes = {
3257
- layout: {
3258
- hide: new HideTheme(),
3259
- items: new ItemsTheme(),
3260
- justify: new JustifyTheme(),
3261
- position: new PositionTheme(),
3262
- display: new DisplayTheme()
3263
- },
3264
- typography: {
3265
- fontFamily: new FontFamilyTheme(),
3266
- fontWeight: new FontWeightTheme(),
3267
- fontStyle: new FontStyleTheme(),
3268
- textDecoration: new TextDecorationTheme(),
3269
- textTransform: new TextTransformTheme(),
3270
- textAlign: new TextAlignTheme()
3271
- }
3272
- };
3273
- this.themes = deepMerge(defaultInternalThemes, subThemes);
3200
+ this.themes = subThemes;
3274
3201
  }
3275
3202
  getClasses(props, defaults = this.defaults) {
3276
3203
  const user = props;
@@ -3383,57 +3310,6 @@ RadiusTheme.defaultClasses = {
3383
3310
  }
3384
3311
  };
3385
3312
 
3386
- class ShadowTheme extends BaseTheme {
3387
- constructor(initial) {
3388
- super();
3389
- SHADOW_KEYS.forEach((key) => {
3390
- var _a;
3391
- this[key] = (_a = initial === null || initial === void 0 ? void 0 : initial[key]) !== null && _a !== void 0 ? _a : ShadowTheme.defaultClasses[key];
3392
- });
3393
- }
3394
- getClasses(props, defaults) {
3395
- const size = pickFirstTruthyKey(props, defaults, SIZE_KEYS) || 'md';
3396
- const key = pickFirstTruthyKey(props, defaults, SHADOW_KEYS);
3397
- if (key === undefined) {
3398
- return [];
3399
- }
3400
- const isModeStringMap = MODE_KEYS.every(m => typeof this[key][m] === "string");
3401
- return MODE_KEYS.map(mode => isModeStringMap
3402
- ? this[key][mode]
3403
- : this[key][mode][size]);
3404
- }
3405
- }
3406
- ShadowTheme.defaultClasses = {
3407
- shadow: {
3408
- base: {
3409
- xs: "shadow-2xs",
3410
- sm: "shadow-xs",
3411
- md: "shadow-sm",
3412
- lg: "shadow-md",
3413
- xl: "shadow-lg"
3414
- },
3415
- hover: {
3416
- xs: "hover:shadow-xs",
3417
- sm: "hover:shadow-sm",
3418
- md: "hover:shadow-md",
3419
- lg: "hover:shadow-lg",
3420
- xl: "hover:shadow-xl"
3421
- },
3422
- active: {
3423
- xs: "active:shadow-xs",
3424
- sm: "active:shadow-sm",
3425
- md: "active:shadow-md",
3426
- lg: "active:shadow-lg",
3427
- xl: "active:shadow-xl"
3428
- },
3429
- },
3430
- noShadow: {
3431
- base: "shadow-none",
3432
- hover: "hover:shadow-none",
3433
- active: "active:shadow-none",
3434
- }
3435
- };
3436
-
3437
3313
  class BorderTheme extends BaseTheme {
3438
3314
  constructor(initial) {
3439
3315
  super();
@@ -3551,6 +3427,34 @@ PyTheme.defaultClasses = {
3551
3427
  noPadding: "py-0"
3552
3428
  };
3553
3429
 
3430
+ class TextAppearanceTheme extends BaseTheme {
3431
+ constructor(config) {
3432
+ super();
3433
+ Object.assign(this, config);
3434
+ }
3435
+ getClasses(props, defaults) {
3436
+ const pickedAppearanceKey = pickFirstTruthyKey(props, defaults, TEXT_APPEARANCE_KEYS) || 'default';
3437
+ const modesForAppearance = this[pickedAppearanceKey];
3438
+ if (!modesForAppearance) {
3439
+ return MODE_KEYS.map(() => '');
3440
+ }
3441
+ return MODE_KEYS.map(mode => modesForAppearance[mode] || '');
3442
+ }
3443
+ static createTheme(src = {}) {
3444
+ const finalConfig = Object.fromEntries(TEXT_APPEARANCE_KEYS.map(textKey => [
3445
+ textKey,
3446
+ Object.fromEntries(MODE_KEYS.map(modeKey => {
3447
+ var _a;
3448
+ return [
3449
+ modeKey,
3450
+ ((_a = src[modeKey]) === null || _a === void 0 ? void 0 : _a[textKey]) || ''
3451
+ ];
3452
+ })),
3453
+ ]));
3454
+ return new TextAppearanceTheme(finalConfig);
3455
+ }
3456
+ }
3457
+
3554
3458
  const filledTextAppearanceClasses = {
3555
3459
  default: "text-white",
3556
3460
  primary: "text-white",
@@ -3563,6 +3467,7 @@ const filledTextAppearanceClasses = {
3563
3467
  danger: "text-white",
3564
3468
  warning: "text-white",
3565
3469
  info: "text-white",
3470
+ transparent: "text-transparent",
3566
3471
  };
3567
3472
  const textAppearanceClasses = {
3568
3473
  default: "text-(--text-color-default)",
@@ -3576,6 +3481,7 @@ const textAppearanceClasses = {
3576
3481
  danger: "text-(--text-color-danger)",
3577
3482
  warning: "text-(--text-color-warning)",
3578
3483
  info: "text-(--text-color-info)",
3484
+ transparent: "text-transparent",
3579
3485
  };
3580
3486
  const textSizeClasses = {
3581
3487
  xs: "text-xs",
@@ -3585,58 +3491,6 @@ const textSizeClasses = {
3585
3491
  xl: "text-xl",
3586
3492
  };
3587
3493
 
3588
- class TextAppearanceTheme extends BaseTheme {
3589
- constructor(initialOverrides) {
3590
- super();
3591
- TEXT_APPEARANCE_KEYS.forEach((textKey) => {
3592
- const defaultModesForKey = TextAppearanceTheme.defaultFullConfig[textKey];
3593
- const overrideModesForKey = initialOverrides === null || initialOverrides === void 0 ? void 0 : initialOverrides[textKey];
3594
- this[textKey] = {
3595
- ...defaultModesForKey,
3596
- ...(overrideModesForKey || {}),
3597
- };
3598
- });
3599
- }
3600
- getClasses(props, defaults) {
3601
- const pickedAppearanceKey = pickFirstTruthyKey(props, defaults, TEXT_APPEARANCE_KEYS) || 'default';
3602
- const modesForAppearance = this[pickedAppearanceKey];
3603
- if (!modesForAppearance) {
3604
- return MODE_KEYS.map(() => '');
3605
- }
3606
- return MODE_KEYS.map(mode => modesForAppearance[mode] || '');
3607
- }
3608
- static createDefaultStyle(src = {}) {
3609
- const initialOverridesForConstructor = {};
3610
- TEXT_APPEARANCE_KEYS.forEach((textKey) => {
3611
- const modesForCurrentTextKey = {};
3612
- let keyHasDataInSrc = false;
3613
- MODE_KEYS.forEach((modeKey) => {
3614
- var _a;
3615
- const classValue = (_a = src[modeKey]) === null || _a === void 0 ? void 0 : _a[textKey];
3616
- if (classValue !== undefined) {
3617
- modesForCurrentTextKey[modeKey] = classValue;
3618
- keyHasDataInSrc = true;
3619
- }
3620
- });
3621
- if (keyHasDataInSrc) {
3622
- initialOverridesForConstructor[textKey] = modesForCurrentTextKey;
3623
- }
3624
- });
3625
- return new TextAppearanceTheme(initialOverridesForConstructor);
3626
- }
3627
- }
3628
- TextAppearanceTheme.defaultFullConfig = (() => {
3629
- const config = {};
3630
- TEXT_APPEARANCE_KEYS.forEach((key) => {
3631
- config[key] = {
3632
- base: textAppearanceClasses[key] || '',
3633
- hover: '',
3634
- active: '',
3635
- };
3636
- });
3637
- return config;
3638
- })();
3639
-
3640
3494
  const filledBackgroundAppearanceClasses = {
3641
3495
  default: "bg-(--filled-background-color-default)",
3642
3496
  primary: "bg-(--filled-background-color-primary)",
@@ -3733,6 +3587,7 @@ const bgBorderAppearanceClasses = {
3733
3587
  info: "bg-(--border-color-info)",
3734
3588
  muted: "bg-(--border-color-muted)",
3735
3589
  link: "bg-(--border-color-link)",
3590
+ transparent: "bg-transparent",
3736
3591
  };
3737
3592
  const borderAppearanceClasses = {
3738
3593
  default: "border-(--border-color-default)",
@@ -3746,6 +3601,7 @@ const borderAppearanceClasses = {
3746
3601
  info: "border-(--border-color-info)",
3747
3602
  muted: "border-(--border-color-muted)",
3748
3603
  link: "border-(--border-color-link)",
3604
+ transparent: "border-transparent",
3749
3605
  };
3750
3606
  const filledBorderAppearanceClasses = {
3751
3607
  default: "border-(--filled-border-color-default)",
@@ -3759,6 +3615,7 @@ const filledBorderAppearanceClasses = {
3759
3615
  info: "border-(--filled-border-color-info)",
3760
3616
  muted: "border-(--filled-border-color-muted)",
3761
3617
  link: "border-(--filled-border-color-link)",
3618
+ transparent: "border-transparent",
3762
3619
  };
3763
3620
  const ringAppearanceClasses = {
3764
3621
  default: "ring-(--border-color-default)",
@@ -3772,6 +3629,7 @@ const ringAppearanceClasses = {
3772
3629
  info: "ring-(--border-color-info)",
3773
3630
  muted: "ring-(--border-color-muted)",
3774
3631
  link: "ring-(--border-color-link)",
3632
+ transparent: "ring-transparent",
3775
3633
  };
3776
3634
  const filledRingAppearanceClasses = {
3777
3635
  default: "ring-(--filled-border-color-default)",
@@ -3785,67 +3643,109 @@ const filledRingAppearanceClasses = {
3785
3643
  info: "ring-(--filled-border-color-info)",
3786
3644
  muted: "ring-(--filled-border-color-muted)",
3787
3645
  link: "ring-(--filled-border-color-link)",
3646
+ transparent: "ring-transparent",
3788
3647
  };
3789
3648
 
3790
- class VariantTheme extends BaseTheme {
3791
- constructor(variantInstances = VariantTheme.defaultInstances) {
3649
+ class ShadowAppearanceTheme extends BaseTheme {
3650
+ constructor(initial) {
3651
+ super();
3652
+ TEXT_APPEARANCE_KEYS.forEach((key) => {
3653
+ var _a;
3654
+ this[key] = (_a = initial === null || initial === void 0 ? void 0 : initial[key]) !== null && _a !== void 0 ? _a : ShadowAppearanceTheme.defaultShadow;
3655
+ });
3656
+ }
3657
+ getClasses(props, defaults) {
3658
+ const appearance = pickFirstTruthyKey(props, defaults, TEXT_APPEARANCE_KEYS) || 'default';
3659
+ const size = pickFirstTruthyKey(props, defaults, SIZE_KEYS) || 'md';
3660
+ const key = pickFirstTruthyKey(props, defaults, SHADOW_KEYS);
3661
+ if (key === undefined || key === 'noShadow') {
3662
+ return [];
3663
+ }
3664
+ return MODE_KEYS.map(mode => { var _a, _b, _c; return (_c = (_b = (_a = this[appearance]) === null || _a === void 0 ? void 0 : _a[size]) === null || _b === void 0 ? void 0 : _b[mode]) !== null && _c !== void 0 ? _c : ""; });
3665
+ }
3666
+ static createTheme(src = {}) {
3667
+ return new ShadowAppearanceTheme(src);
3668
+ }
3669
+ }
3670
+ ShadowAppearanceTheme.defaultShadow = {
3671
+ xs: { base: "shadow-2xs", hover: "hover:shadow-xs", active: "" },
3672
+ sm: { base: "shadow-xs", hover: "hover:shadow-sm", active: "" },
3673
+ md: { base: "shadow-sm", hover: "hover:shadow-md", active: "" },
3674
+ lg: { base: "shadow-md", hover: "hover:shadow-lg", active: "" },
3675
+ xl: { base: "shadow-lg", hover: "hover:shadow-xl", active: "" }
3676
+ };
3677
+
3678
+ class GenericVariantTheme extends BaseTheme {
3679
+ constructor(variantInstances) {
3792
3680
  super();
3793
3681
  VARIANT_KEYS.forEach((variantKey) => {
3794
- this[variantKey] = variantInstances[variantKey] || VariantTheme.defaultInstances[variantKey];
3682
+ this[variantKey] = variantInstances[variantKey];
3795
3683
  });
3796
3684
  }
3797
3685
  getClasses(props, defaults) {
3798
- const activeVariantKey = pickFirstTruthyKey(props, defaults, VARIANT_KEYS) || 'outline';
3799
- const activeTextAppearanceTheme = this[activeVariantKey];
3686
+ const variantKey = pickFirstTruthyKey(props, defaults, VARIANT_KEYS) || 'outline';
3687
+ const activeTextAppearanceTheme = this[variantKey];
3800
3688
  if (!activeTextAppearanceTheme) {
3801
3689
  return [];
3802
3690
  }
3803
3691
  return activeTextAppearanceTheme.getClasses(props, defaults);
3804
3692
  }
3805
- static createDefault(initialInstances) {
3806
- const fullInitialInstances = {
3807
- ...VariantTheme.defaultInstances,
3808
- ...(initialInstances || {})
3809
- };
3810
- return new VariantTheme(fullInitialInstances);
3693
+ // used for button, bages, chips, etc
3694
+ static createUIElementTextTheme() {
3695
+ //transparent UI elements have a default text color
3696
+ return new GenericVariantTheme({
3697
+ outline: TextAppearanceTheme.createTheme({
3698
+ base: { ...textAppearanceClasses, transparent: textAppearanceClasses.default }
3699
+ }),
3700
+ filled: TextAppearanceTheme.createTheme({
3701
+ base: { ...filledTextAppearanceClasses, transparent: textAppearanceClasses.default }
3702
+ })
3703
+ });
3811
3704
  }
3812
- static createDefaultBackground() {
3813
- return this.createDefault({
3814
- outline: TextAppearanceTheme.createDefaultStyle({
3705
+ static createUIElementShadowTheme() {
3706
+ //transparent UI elements won't have a shadow
3707
+ return new GenericVariantTheme({
3708
+ outline: ShadowAppearanceTheme.createTheme({ transparent: undefined, link: undefined }),
3709
+ filled: ShadowAppearanceTheme.createTheme({ transparent: undefined, link: undefined })
3710
+ });
3711
+ }
3712
+ static createBorderAppearanceTheme() {
3713
+ return new GenericVariantTheme({
3714
+ outline: TextAppearanceTheme.createTheme({ base: borderAppearanceClasses }),
3715
+ filled: TextAppearanceTheme.createTheme({ base: filledBorderAppearanceClasses })
3716
+ });
3717
+ }
3718
+ static createRingAppearanceTheme() {
3719
+ return new GenericVariantTheme({
3720
+ outline: TextAppearanceTheme.createTheme({ base: ringAppearanceClasses }),
3721
+ filled: TextAppearanceTheme.createTheme({ base: filledRingAppearanceClasses })
3722
+ });
3723
+ }
3724
+ static createBgAppearanceTheme() {
3725
+ return new GenericVariantTheme({
3726
+ outline: TextAppearanceTheme.createTheme({
3815
3727
  base: backgroundAppearanceClasses,
3816
3728
  hover: hoverBackgroundAppearanceClasses,
3817
3729
  active: activeBackgroundAppearanceClasses
3818
3730
  }),
3819
- filled: TextAppearanceTheme.createDefaultStyle({
3731
+ filled: TextAppearanceTheme.createTheme({
3820
3732
  base: filledBackgroundAppearanceClasses,
3821
3733
  hover: filledHoverBackgroundAppearanceClasses,
3822
3734
  active: filledActiveBackgroundAppearanceClasses
3823
3735
  })
3824
3736
  });
3825
3737
  }
3826
- static createDefaultText() {
3827
- return this.createDefault({
3828
- outline: TextAppearanceTheme.createDefaultStyle({ base: textAppearanceClasses }),
3829
- filled: TextAppearanceTheme.createDefaultStyle({ base: filledTextAppearanceClasses })
3830
- });
3831
- }
3832
- static createDefaultBorder() {
3833
- return this.createDefault({
3834
- outline: TextAppearanceTheme.createDefaultStyle({ base: borderAppearanceClasses }),
3835
- filled: TextAppearanceTheme.createDefaultStyle({ base: filledBorderAppearanceClasses })
3836
- });
3837
- }
3838
- static createDefaultRing() {
3839
- return this.createDefault({
3840
- outline: TextAppearanceTheme.createDefaultStyle({ base: ringAppearanceClasses }),
3841
- filled: TextAppearanceTheme.createDefaultStyle({ base: filledRingAppearanceClasses })
3738
+ static createSimpleBgAppearanceTheme() {
3739
+ return new GenericVariantTheme({
3740
+ outline: TextAppearanceTheme.createTheme({
3741
+ base: backgroundAppearanceClasses,
3742
+ }),
3743
+ filled: TextAppearanceTheme.createTheme({
3744
+ base: filledBackgroundAppearanceClasses,
3745
+ })
3842
3746
  });
3843
3747
  }
3844
3748
  }
3845
- VariantTheme.defaultInstances = Object.fromEntries(VARIANT_KEYS.map(variantKey => [
3846
- variantKey,
3847
- new TextAppearanceTheme()
3848
- ]));
3849
3749
 
3850
3750
  const defaultButtonTheme = new ComponentTheme("button", "w-fit h-fit cursor-pointer transition-all duration-200 whitespace-nowrap", {
3851
3751
  size: {
@@ -3883,15 +3783,16 @@ const defaultButtonTheme = new ComponentTheme("button", "w-fit h-fit cursor-poin
3883
3783
  lg: 'text-lg',
3884
3784
  xl: 'text-xl',
3885
3785
  }),
3886
- shadow: new ShadowTheme(),
3887
3786
  },
3888
3787
  appearance: {
3889
- background: VariantTheme.createDefaultBackground(),
3890
- text: VariantTheme.createDefaultText(),
3891
- border: VariantTheme.createDefaultBorder(),
3892
- ring: VariantTheme.createDefaultRing(),
3788
+ background: GenericVariantTheme.createBgAppearanceTheme(),
3789
+ text: GenericVariantTheme.createUIElementTextTheme(),
3790
+ border: GenericVariantTheme.createBorderAppearanceTheme(),
3791
+ ring: GenericVariantTheme.createRingAppearanceTheme(),
3792
+ shadow: GenericVariantTheme.createUIElementShadowTheme()
3893
3793
  },
3894
3794
  layout: {
3795
+ ...defaultLayoutTheme,
3895
3796
  border: new BorderTheme(),
3896
3797
  ring: new RingTheme(),
3897
3798
  radius: new RadiusTheme({
@@ -3904,6 +3805,7 @@ const defaultButtonTheme = new ComponentTheme("button", "w-fit h-fit cursor-poin
3904
3805
  }
3905
3806
  }),
3906
3807
  },
3808
+ typography: defaultTypographyTheme,
3907
3809
  }, {
3908
3810
  md: true,
3909
3811
  inlineFlex: true,
@@ -3957,23 +3859,17 @@ const defaultBadgeTheme = new ComponentTheme("span", "w-fit h-fit transition-all
3957
3859
  md: 'text-base',
3958
3860
  lg: 'text-lg',
3959
3861
  xl: 'text-xl',
3960
- }),
3961
- shadow: new ShadowTheme(),
3862
+ })
3962
3863
  },
3963
3864
  appearance: {
3964
- background: VariantTheme.createDefault({
3965
- outline: TextAppearanceTheme.createDefaultStyle({
3966
- base: backgroundAppearanceClasses,
3967
- }),
3968
- filled: TextAppearanceTheme.createDefaultStyle({
3969
- base: filledBackgroundAppearanceClasses,
3970
- })
3971
- }),
3972
- text: VariantTheme.createDefaultText(),
3973
- border: VariantTheme.createDefaultBorder(),
3974
- ring: VariantTheme.createDefaultRing(),
3865
+ background: GenericVariantTheme.createSimpleBgAppearanceTheme(),
3866
+ text: GenericVariantTheme.createUIElementTextTheme(),
3867
+ border: GenericVariantTheme.createBorderAppearanceTheme(),
3868
+ ring: GenericVariantTheme.createRingAppearanceTheme(),
3869
+ shadow: GenericVariantTheme.createUIElementShadowTheme()
3975
3870
  },
3976
3871
  layout: {
3872
+ ...defaultLayoutTheme,
3977
3873
  border: new BorderTheme(),
3978
3874
  ring: new RingTheme(),
3979
3875
  radius: new RadiusTheme({
@@ -3986,6 +3882,7 @@ const defaultBadgeTheme = new ComponentTheme("span", "w-fit h-fit transition-all
3986
3882
  }
3987
3883
  }),
3988
3884
  },
3885
+ typography: defaultTypographyTheme,
3989
3886
  }, {
3990
3887
  md: true,
3991
3888
  inlineFlex: true,
@@ -4036,23 +3933,17 @@ const defaultChipTheme = new ComponentTheme("span", "w-fit h-fit transition-all
4036
3933
  lg: 'gap-2.5',
4037
3934
  xl: 'gap-3',
4038
3935
  }
4039
- }),
4040
- shadow: new ShadowTheme(),
3936
+ })
4041
3937
  },
4042
3938
  appearance: {
4043
- background: VariantTheme.createDefault({
4044
- outline: TextAppearanceTheme.createDefaultStyle({
4045
- base: backgroundAppearanceClasses,
4046
- }),
4047
- filled: TextAppearanceTheme.createDefaultStyle({
4048
- base: filledBackgroundAppearanceClasses,
4049
- })
4050
- }),
4051
- text: VariantTheme.createDefaultText(),
4052
- border: VariantTheme.createDefaultBorder(),
4053
- ring: VariantTheme.createDefaultRing(),
3939
+ background: GenericVariantTheme.createSimpleBgAppearanceTheme(),
3940
+ text: GenericVariantTheme.createUIElementTextTheme(),
3941
+ border: GenericVariantTheme.createBorderAppearanceTheme(),
3942
+ ring: GenericVariantTheme.createRingAppearanceTheme(),
3943
+ shadow: GenericVariantTheme.createUIElementShadowTheme()
4054
3944
  },
4055
3945
  layout: {
3946
+ ...defaultLayoutTheme,
4056
3947
  radius: new RadiusTheme({
4057
3948
  rounded: {
4058
3949
  xs: 'rounded-sm',
@@ -4065,6 +3956,7 @@ const defaultChipTheme = new ComponentTheme("span", "w-fit h-fit transition-all
4065
3956
  border: new BorderTheme(),
4066
3957
  ring: new RingTheme(),
4067
3958
  },
3959
+ typography: defaultTypographyTheme,
4068
3960
  }, {
4069
3961
  md: true,
4070
3962
  inlineFlex: true,
@@ -4080,6 +3972,75 @@ const defaultChipTheme = new ComponentTheme("span", "w-fit h-fit transition-all
4080
3972
  ring: true,
4081
3973
  });
4082
3974
 
3975
+ const isObject = (item) => {
3976
+ return item !== null && typeof item === 'object' && !Array.isArray(item);
3977
+ };
3978
+ const deepMerge = (target, source) => {
3979
+ const output = Object.assign(Object.create(Object.getPrototypeOf(target)), target);
3980
+ for (const key in source) {
3981
+ if (Object.prototype.hasOwnProperty.call(source, key)) {
3982
+ const sourceValue = source[key];
3983
+ const targetValue = output[key];
3984
+ if (sourceValue === undefined) {
3985
+ continue;
3986
+ }
3987
+ // Special case: If the key is 'defaults', use the contextual mergeDefaults function.
3988
+ if (key === 'defaults' &&
3989
+ isObject(targetValue) &&
3990
+ isObject(sourceValue)) {
3991
+ output[key] = mergeDefaults(targetValue, sourceValue);
3992
+ }
3993
+ // For all other objects, use the standard recursive deep merge.
3994
+ else if (isObject(targetValue) && isObject(sourceValue)) {
3995
+ output[key] = deepMerge(targetValue, sourceValue);
3996
+ }
3997
+ // For non-object values, just assign the value from the source.
3998
+ else {
3999
+ output[key] = sourceValue;
4000
+ }
4001
+ }
4002
+ }
4003
+ return output;
4004
+ };
4005
+ const deepClone = (source) => {
4006
+ if (!isObject(source)) {
4007
+ return source;
4008
+ }
4009
+ const output = Object.assign(Object.create(Object.getPrototypeOf(source)), source);
4010
+ for (const key in output) {
4011
+ if (Object.prototype.hasOwnProperty.call(output, key)) {
4012
+ output[key] = deepClone(output[key]);
4013
+ }
4014
+ }
4015
+ return output;
4016
+ };
4017
+ const findGroup = (key) => EXCLUSIVE_KEY_GROUPS.find(group => group.includes(key));
4018
+ const mergeDefaults = (baseDefaults, overrideDefaults) => {
4019
+ const finalDefaults = { ...baseDefaults };
4020
+ // Iterate over the override keys to apply them.
4021
+ for (const key in overrideDefaults) {
4022
+ if (Object.prototype.hasOwnProperty.call(overrideDefaults, key)) {
4023
+ const overrideValue = overrideDefaults[key];
4024
+ // If the override is setting a key to true...
4025
+ if (overrideValue) {
4026
+ // Find the exclusive group this key belongs to (e.g., SIZE_KEYS).
4027
+ const group = findGroup(key);
4028
+ // If the key is part of an exclusive group...
4029
+ if (group) {
4030
+ // ...set all other keys in that group to false.
4031
+ group.forEach(groupKey => {
4032
+ if (groupKey !== key) {
4033
+ finalDefaults[groupKey] = false;
4034
+ }
4035
+ });
4036
+ }
4037
+ }
4038
+ finalDefaults[key] = overrideValue;
4039
+ }
4040
+ }
4041
+ return finalDefaults;
4042
+ };
4043
+
4083
4044
  const typographyThemeDefaults = {
4084
4045
  md: true,
4085
4046
  default: true,
@@ -4092,8 +4053,9 @@ const createTypographyComponentTheme = (tag, base = "text-balance", textSizeMap
4092
4053
  text: new SizeTheme(textSizeMap),
4093
4054
  },
4094
4055
  appearance: {
4095
- text: TextAppearanceTheme.createDefaultStyle({ base: textAppearanceClasses }),
4096
- }
4056
+ text: TextAppearanceTheme.createTheme({ base: textAppearanceClasses }),
4057
+ },
4058
+ typography: defaultTypographyTheme,
4097
4059
  }, defaults);
4098
4060
  };
4099
4061
  // Page title specific theme
@@ -4186,15 +4148,14 @@ const commonGaps = {
4186
4148
  xl: 'gap-6',
4187
4149
  };
4188
4150
 
4189
- class LayoutAppearanceTheme extends BaseTheme {
4190
- constructor(initialOverrides) {
4151
+ class BgAppearanceTheme extends BaseTheme {
4152
+ constructor() {
4191
4153
  super();
4192
- BG_APPEARANCE_KEYS.forEach((textKey) => {
4193
- const defaultModesForKey = LayoutAppearanceTheme.defaultFullConfig[textKey];
4194
- const overrideModesForKey = initialOverrides === null || initialOverrides === void 0 ? void 0 : initialOverrides[textKey];
4195
- this[textKey] = {
4196
- ...defaultModesForKey,
4197
- ...(overrideModesForKey || {}),
4154
+ BG_APPEARANCE_KEYS.forEach(key => {
4155
+ this[key] = {
4156
+ base: layoutBackgroundAppearanceClasses[key] || '',
4157
+ hover: '',
4158
+ active: '',
4198
4159
  };
4199
4160
  });
4200
4161
  }
@@ -4206,37 +4167,7 @@ class LayoutAppearanceTheme extends BaseTheme {
4206
4167
  }
4207
4168
  return MODE_KEYS.map(mode => modesForAppearance[mode] || '');
4208
4169
  }
4209
- static createDefaultStyle(src = {}) {
4210
- const initialOverridesForConstructor = {};
4211
- BG_APPEARANCE_KEYS.forEach((textKey) => {
4212
- const modesForCurrentTextKey = {};
4213
- let keyHasDataInSrc = false;
4214
- MODE_KEYS.forEach((modeKey) => {
4215
- var _a;
4216
- const classValue = (_a = src[modeKey]) === null || _a === void 0 ? void 0 : _a[textKey];
4217
- if (classValue !== undefined) {
4218
- modesForCurrentTextKey[modeKey] = classValue;
4219
- keyHasDataInSrc = true;
4220
- }
4221
- });
4222
- if (keyHasDataInSrc) {
4223
- initialOverridesForConstructor[textKey] = modesForCurrentTextKey;
4224
- }
4225
- });
4226
- return new LayoutAppearanceTheme(initialOverridesForConstructor);
4227
- }
4228
4170
  }
4229
- LayoutAppearanceTheme.defaultFullConfig = (() => {
4230
- const config = {};
4231
- BG_APPEARANCE_KEYS.forEach((key) => {
4232
- config[key] = {
4233
- base: backgroundAppearanceClasses[key] || '',
4234
- hover: '',
4235
- active: '',
4236
- };
4237
- });
4238
- return config;
4239
- })();
4240
4171
 
4241
4172
  class BreakpointTheme extends BaseTheme {
4242
4173
  constructor(initial) {
@@ -4261,30 +4192,30 @@ BreakpointTheme.defaultClasses = {
4261
4192
  xlCol: "max-xl:flex-col"
4262
4193
  };
4263
4194
 
4264
- const defaultCardTheme = new ComponentTheme("div", "overflow-hidden", {
4195
+ const defaultCardTheme = new ComponentTheme("div", "", {
4265
4196
  size: {
4266
4197
  px: new PxTheme({
4267
4198
  padding: {
4268
- xs: 'px-3',
4269
- sm: 'px-4',
4270
- md: 'px-5',
4271
- lg: 'px-6',
4272
- xl: 'px-8',
4199
+ xs: "px-2",
4200
+ sm: "px-3 max-lg:px-2",
4201
+ md: "px-4 max-lg:px-3",
4202
+ lg: "px-5 max-lg:px-4 max-md:px-3",
4203
+ xl: "px-6 max-lg:px-5 max-md:px-4"
4273
4204
  }
4274
4205
  }),
4275
4206
  py: new PyTheme({
4276
4207
  padding: {
4277
- xs: 'py-2',
4278
- sm: 'py-3',
4279
- md: 'py-4',
4280
- lg: 'py-5',
4281
- xl: 'py-6',
4208
+ xs: "py-2",
4209
+ sm: "py-3 max-lg:py-2",
4210
+ md: "py-4 max-lg:py-3",
4211
+ lg: "py-5 max-lg:py-4 max-md:py-3",
4212
+ xl: "py-6 max-lg:py-5 max-md:py-4"
4282
4213
  }
4283
4214
  }),
4284
4215
  gap: new GapTheme({ gap: commonGaps }),
4285
- shadow: new ShadowTheme(),
4286
4216
  },
4287
4217
  layout: {
4218
+ ...defaultLayoutTheme,
4288
4219
  border: new BorderTheme(),
4289
4220
  ring: new RingTheme(),
4290
4221
  radius: new RadiusTheme({
@@ -4299,14 +4230,13 @@ const defaultCardTheme = new ComponentTheme("div", "overflow-hidden", {
4299
4230
  wrap: new WrapTheme(),
4300
4231
  direction: new DirectionTheme(),
4301
4232
  breakpoint: new BreakpointTheme(),
4233
+ shadow: ShadowAppearanceTheme.createTheme(),
4302
4234
  },
4303
4235
  appearance: {
4304
- background: LayoutAppearanceTheme.createDefaultStyle({
4305
- base: layoutBackgroundAppearanceClasses,
4306
- }),
4307
- text: TextAppearanceTheme.createDefaultStyle({ base: textAppearanceClasses }),
4308
- border: TextAppearanceTheme.createDefaultStyle({ base: borderAppearanceClasses }),
4309
- ring: TextAppearanceTheme.createDefaultStyle({ base: ringAppearanceClasses }),
4236
+ background: new BgAppearanceTheme(),
4237
+ text: TextAppearanceTheme.createTheme({ base: textAppearanceClasses }),
4238
+ border: TextAppearanceTheme.createTheme({ base: borderAppearanceClasses }),
4239
+ ring: TextAppearanceTheme.createTheme({ base: ringAppearanceClasses }),
4310
4240
  }
4311
4241
  }, {
4312
4242
  md: true,
@@ -4326,6 +4256,7 @@ const defaultRowTheme = new ComponentTheme("div", "flex-row", {
4326
4256
  breakpoint: new BreakpointTheme(),
4327
4257
  },
4328
4258
  layout: {
4259
+ ...defaultLayoutTheme,
4329
4260
  wrap: new WrapTheme(),
4330
4261
  },
4331
4262
  }, {
@@ -4338,7 +4269,7 @@ const defaultRowTheme = new ComponentTheme("div", "flex-row", {
4338
4269
 
4339
4270
  const defaultDividerTheme = new ComponentTheme("div", "h-px w-full", {
4340
4271
  appearance: {
4341
- background: TextAppearanceTheme.createDefaultStyle({
4272
+ background: TextAppearanceTheme.createTheme({
4342
4273
  base: bgBorderAppearanceClasses,
4343
4274
  }),
4344
4275
  }
@@ -4367,6 +4298,7 @@ const defaultContainerTheme = new ComponentTheme("div", "flex-col mx-auto w-full
4367
4298
  }),
4368
4299
  },
4369
4300
  layout: {
4301
+ ...defaultLayoutTheme,
4370
4302
  border: new BorderTheme(),
4371
4303
  ring: new RingTheme(),
4372
4304
  wrap: new WrapTheme(),
@@ -4382,12 +4314,10 @@ const defaultContainerTheme = new ComponentTheme("div", "flex-col mx-auto w-full
4382
4314
  }),
4383
4315
  },
4384
4316
  appearance: {
4385
- background: LayoutAppearanceTheme.createDefaultStyle({
4386
- base: layoutBackgroundAppearanceClasses,
4387
- }),
4388
- text: TextAppearanceTheme.createDefaultStyle({ base: textAppearanceClasses }),
4389
- border: TextAppearanceTheme.createDefaultStyle({ base: borderAppearanceClasses }),
4390
- ring: TextAppearanceTheme.createDefaultStyle({ base: ringAppearanceClasses }),
4317
+ background: new BgAppearanceTheme(),
4318
+ text: TextAppearanceTheme.createTheme({ base: textAppearanceClasses }),
4319
+ border: TextAppearanceTheme.createTheme({ base: borderAppearanceClasses }),
4320
+ ring: TextAppearanceTheme.createTheme({ base: ringAppearanceClasses }),
4391
4321
  }
4392
4322
  }, {
4393
4323
  transparent: true,
@@ -4404,6 +4334,7 @@ const defaultColTheme = new ComponentTheme("div", "flex-col", {
4404
4334
  gap: new GapTheme({ gap: commonGaps }),
4405
4335
  },
4406
4336
  layout: {
4337
+ ...defaultLayoutTheme,
4407
4338
  wrap: new WrapTheme(),
4408
4339
  direction: new DirectionTheme(),
4409
4340
  },
@@ -4439,6 +4370,7 @@ const defaultStackTheme = new ComponentTheme("div", "", {
4439
4370
  }),
4440
4371
  },
4441
4372
  layout: {
4373
+ ...defaultLayoutTheme,
4442
4374
  wrap: new WrapTheme(),
4443
4375
  direction: new DirectionTheme(),
4444
4376
  },
@@ -4481,17 +4413,16 @@ const defaultSectionTheme = new ComponentTheme("div", "w-full flex-col", {
4481
4413
  xl: 'gap-16',
4482
4414
  }
4483
4415
  }),
4484
- shadow: new ShadowTheme(),
4485
4416
  },
4486
4417
  appearance: {
4487
- background: LayoutAppearanceTheme.createDefaultStyle({
4488
- base: layoutBackgroundAppearanceClasses,
4489
- }),
4490
- text: TextAppearanceTheme.createDefaultStyle({ base: textAppearanceClasses }),
4491
- border: TextAppearanceTheme.createDefaultStyle({ base: borderAppearanceClasses }),
4492
- ring: TextAppearanceTheme.createDefaultStyle({ base: ringAppearanceClasses }),
4418
+ background: new BgAppearanceTheme(),
4419
+ text: TextAppearanceTheme.createTheme({ base: textAppearanceClasses }),
4420
+ border: TextAppearanceTheme.createTheme({ base: borderAppearanceClasses }),
4421
+ ring: TextAppearanceTheme.createTheme({ base: ringAppearanceClasses }),
4422
+ shadow: ShadowAppearanceTheme.createTheme(),
4493
4423
  },
4494
4424
  layout: {
4425
+ ...defaultLayoutTheme,
4495
4426
  wrap: new WrapTheme(),
4496
4427
  direction: new DirectionTheme(),
4497
4428
  border: new BorderTheme(),
@@ -4751,7 +4682,6 @@ exports.TYPOGRAPHY_COMPONENT_KEYS = TYPOGRAPHY_COMPONENT_KEYS;
4751
4682
  exports.Text = Text;
4752
4683
  exports.ThemeProvider = ThemeProvider;
4753
4684
  exports.Title = Title;
4754
- exports.UI_APPEARANCE_KEYS = UI_APPEARANCE_KEYS;
4755
4685
  exports.VARIANT_KEYS = VARIANT_KEYS;
4756
4686
  exports.WRAP_KEYS = WRAP_KEYS;
4757
4687
  exports.defaultTheme = defaultTheme;