@bcc-code/component-library-vue 0.7.13 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/theme.css CHANGED
@@ -1914,6 +1914,64 @@
1914
1914
 
1915
1915
  /* === ./components/custom/styles.css === */
1916
1916
 
1917
+ /* from ./BccAppNavigation/BccAppNavigation.css */
1918
+ @layer components {
1919
+ .bcc-app-navigation {
1920
+ @apply justify-center items-center flex pb-inset-bottom-2 absolute inset-x-0 bottom-0 z-20 w-full overflow-visible;
1921
+ }
1922
+ .bcc-app-navigation .nav {
1923
+ @apply justify-center items-center flex dark:border-default mx-auto border border-white p-0.5;
1924
+
1925
+ border-radius: 20px;
1926
+ background: linear-gradient(135deg, rgba(255, 255, 255, 0.6) 0%, rgba(243, 244, 246, 0.4) 100%);
1927
+ backdrop-filter: blur(12px) saturate(160%);
1928
+ -webkit-backdrop-filter: blur(12px) saturate(160%);
1929
+
1930
+ max-width: min(96%, var(--container-lg));
1931
+ box-shadow:
1932
+ /* inner bevel (top-left highlight, bottom-right shade) */
1933
+ inset 0 0 32px white,
1934
+ inset 1px 0 4px -1px rgba(0, 0, 0, 0.3),
1935
+ inset 1px -2px 0 -1px white,
1936
+ inset -1px 2px 0 -1px white,
1937
+ 0px -1px 1px -2px rgba(16, 24, 40, 0.05),
1938
+ 0px 4px 6px -2px rgba(16, 24, 40, 0.05),
1939
+ 0px 12px 16px -4px rgba(16, 24, 40, 0.1);
1940
+ }
1941
+ .dark .bcc-app-navigation {
1942
+ @apply backdrop-blur-sm;
1943
+ background: transparent;
1944
+ box-shadow: none;
1945
+ }
1946
+
1947
+ .bcc-app-navigation .navbar-btn {
1948
+ @apply col text-text-subtlest relative h-12 min-w-16 rounded-xl border border-transparent px-2 opacity-90 transition-all focus:outline-none;
1949
+ }
1950
+
1951
+ .bcc-app-navigation .navbar-btn--active {
1952
+ @apply text-brand-default bg-dark-neutral-alpha-500-a border-white opacity-100;
1953
+ box-shadow:
1954
+ /* inner bevel (top-left highlight, bottom-right shade) */
1955
+ inset 1px 0 4px -1px rgba(0, 100, 50, 0.3),
1956
+ inset 1px 2px 0 -1px white,
1957
+ inset -1px -2px 0 -1px white,
1958
+ inset 0 0 1px 0 rgba(0, 100, 50, 0.1),
1959
+ inset 0 -3px 2px 0 rgba(0, 100, 50, 0.1);
1960
+ }
1961
+
1962
+ .dark .bcc-app-navigation .navbar-btn--active {
1963
+ @apply bg-neutral-alpha-500-a text-brand-bold border-transparent;
1964
+ box-shadow:
1965
+ /* inner bevel (top-left highlight, bottom-right shade) */
1966
+ inset 1px 0 4px -1px var(--blue-500),
1967
+ inset 1px 2px 0 -1px var(--blue-900),
1968
+ inset -1px -2px 0 -1px var(--blue-900),
1969
+ inset 0 0 1px 0 var(--blue-300),
1970
+ inset 0 -3px 2px 0 var(--blue-300);
1971
+ }
1972
+ }
1973
+
1974
+
1917
1975
  /* from ./BccBadge/BccBadge.css */
1918
1976
  @layer components {
1919
1977
  .bcc-badge {
@@ -1925,6 +1983,9 @@
1925
1983
  .bcc-badge.capital {
1926
1984
  @apply inline-flex;
1927
1985
  }
1986
+ .bcc-badge.gradient {
1987
+ @apply ctx-gradient;
1988
+ }
1928
1989
  .bcc-badge.sm {
1929
1990
  @apply w-4 h-4 text-heading-xs;
1930
1991
  }
@@ -2375,91 +2436,74 @@
2375
2436
 
2376
2437
  /* from ./BccAvatar/BccAvatar.css */
2377
2438
  @layer components {
2378
- .bcc-avatar {
2379
- --p-avatar-background: var(--ctx-background);
2380
- --p-avatar-color: var(--ctx-text);
2381
- --bcc-avatar-border: var(--ctx-border);
2382
- @apply overflow-hidden shrink-0 ctx-gray-subtler text-sm;
2383
- }
2384
-
2385
- .bcc-avatar .icon {
2386
- height: var(--icon-size-sm);
2387
- }
2439
+ .bcc-avatar {
2440
+ --p-avatar-background: var(--ctx-background);
2441
+ --p-avatar-color: var(--ctx-text);
2442
+ --bcc-avatar-border: var(--ctx-border);
2443
+ --p-icon-size: var(--icon-size-sm);
2444
+ @apply ctx-gray-subtler shrink-0 overflow-hidden text-sm;
2445
+ }
2388
2446
 
2389
- .bcc-avatar.male,
2390
- .bcc-avatar.M {
2391
- @apply ctx-blue-subtler;
2392
- }
2393
- .bcc-avatar.female,
2394
- .bcc-avatar.F {
2395
- @apply ctx-purple-subtler;
2396
- }
2397
- .bcc-avatar.male.child,
2398
- .bcc-avatar.M.child {
2399
- @apply ctx-teal-subtler;
2400
- }
2401
- .bcc-avatar.female.child,
2402
- .bcc-avatar.F.child {
2403
- @apply ctx-magenta-subtler;
2404
- }
2405
- .bcc-avatar.bordered {
2406
- @apply border-2 border-ctx;
2407
- }
2408
- .bcc-avatar.xs {
2409
- @apply size-5 text-xs;
2410
- }
2411
- .bcc-avatar.xs .icon {
2412
- height: var(--icon-size-xs);
2413
- }
2414
- .bcc-avatar.sm {
2415
- @apply size-6 text-xs;
2416
- }
2417
- .bcc-avatar.sm .icon {
2418
- height: var(--icon-size-xs);
2419
- }
2420
- .bcc-avatar.md {
2421
- /* same as default */
2422
- }
2423
- .bcc-avatar.md .icon {
2424
- /* same as default */
2425
- }
2426
- .bcc-avatar.lg {
2427
- @apply size-10 text-md;
2428
- }
2429
- .bcc-avatar.lg .icon {
2430
- height: var(--icon-size-md);
2431
- }
2432
- .bcc-avatar.xl {
2433
- @apply size-12 text-xl;
2434
- }
2435
- .bcc-avatar.xl .icon {
2436
- height: var(--icon-size-lg);
2437
- }
2438
- .bcc-avatar.xxl {
2439
- @apply size-20 text-3xl;
2440
- }
2441
- .bcc-avatar.xxl .icon {
2442
- height: var(--icon-size-xl);
2443
- }
2444
- .bcc-avatar.xxxl {
2445
- @apply size-24 text-4xl;
2446
- }
2447
- .bcc-avatar.xxxl .icon {
2448
- height: var(--icon-size-xl);
2449
- }
2447
+ .bcc-avatar.male,
2448
+ .bcc-avatar.M {
2449
+ @apply ctx-blue-subtler;
2450
+ }
2451
+ .bcc-avatar.female,
2452
+ .bcc-avatar.F {
2453
+ @apply ctx-purple-subtler;
2454
+ }
2455
+ .bcc-avatar.male.child,
2456
+ .bcc-avatar.M.child {
2457
+ @apply ctx-teal-subtler;
2458
+ }
2459
+ .bcc-avatar.female.child,
2460
+ .bcc-avatar.F.child {
2461
+ @apply ctx-magenta-subtler;
2462
+ }
2463
+ .bcc-avatar.bordered {
2464
+ @apply border-ctx border-2;
2465
+ }
2466
+ .bcc-avatar.xs {
2467
+ @apply size-5 text-xs;
2468
+ --p-icon-size: var(--icon-size-xs);
2469
+ }
2470
+ .bcc-avatar.sm {
2471
+ @apply size-6 text-xs;
2472
+ --p-icon-size: var(--icon-size-xs);
2473
+ }
2474
+ /* .bcc-avatar.md {
2475
+ same as default
2476
+ }*/
2477
+ .bcc-avatar.lg {
2478
+ @apply text-md size-10;
2479
+ --p-icon-size: var(--icon-size-md);
2480
+ }
2481
+ .bcc-avatar.xl {
2482
+ @apply size-12 text-xl;
2483
+ --p-icon-size: var(--icon-size-lg);
2484
+ }
2485
+ .bcc-avatar.xxl {
2486
+ @apply size-20 text-3xl;
2487
+ --p-icon-size: var(--icon-size-xl);
2488
+ }
2489
+ .bcc-avatar.xxxl {
2490
+ @apply size-24 text-4xl;
2491
+ --p-icon-size: var(--icon-size-xl);
2492
+ }
2450
2493
 
2451
- .p-overlaybadge .bcc-avatar.p-avatar-circle.lg~.p-badge,
2452
- .p-overlaybadge .bcc-avatar.p-avatar-circle.xl~.p-badge {
2453
- transform: translate(40%, -40%);
2454
- }
2494
+ .p-overlaybadge .bcc-avatar.p-avatar-circle.lg ~ .p-badge,
2495
+ .p-overlaybadge .bcc-avatar.p-avatar-circle.xl ~ .p-badge {
2496
+ transform: translate(40%, -40%);
2497
+ }
2455
2498
 
2456
- .p-overlaybadge .bcc-avatar.p-avatar-circle.xxxl~.p-badge,
2457
- .p-overlaybadge .bcc-avatar.p-avatar-circle.xxl~.p-badge {
2458
- transform: translate(20%, -20%);
2459
- }
2499
+ .p-overlaybadge .bcc-avatar.p-avatar-circle.xxxl ~ .p-badge,
2500
+ .p-overlaybadge .bcc-avatar.p-avatar-circle.xxl ~ .p-badge {
2501
+ transform: translate(20%, -20%);
2502
+ }
2460
2503
  }
2461
2504
 
2462
2505
 
2506
+
2463
2507
  /* from ./BccTabs/BccTabs.css */
2464
2508
  @layer components {
2465
2509
  .bcc-tabs-fill.p-tabs {
@@ -0,0 +1,19 @@
1
+ import { type Component } from 'vue';
2
+ export type BccAppNavigationItem = {
3
+ key: string;
4
+ link?: string;
5
+ title: string;
6
+ icon: Component;
7
+ pin?: number;
8
+ };
9
+ export type BccAppNavigationProps = {
10
+ items: BccAppNavigationItem[];
11
+ modelValue: BccAppNavigationItem['key'] | null;
12
+ };
13
+ declare const __VLS_export: import("vue").DefineComponent<BccAppNavigationProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {} & {
14
+ "update:modelValue": (value: string) => any;
15
+ }, string, import("vue").PublicProps, Readonly<BccAppNavigationProps> & Readonly<{
16
+ "onUpdate:modelValue"?: ((value: string) => any) | undefined;
17
+ }>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
18
+ declare const _default: typeof __VLS_export;
19
+ export default _default;
@@ -13,6 +13,7 @@ export type BadgeProps = {
13
13
  squared?: boolean;
14
14
  /** Design context (e.g. neutral, brand) used for background and text color. */
15
15
  context?: BCC_CONTEXT;
16
+ gradient?: boolean;
16
17
  };
17
18
  declare var __VLS_1: {};
18
19
  type __VLS_Slots = {} & {
@@ -21,6 +22,7 @@ type __VLS_Slots = {} & {
21
22
  declare const __VLS_base: import("vue").DefineComponent<BadgeProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<BadgeProps> & Readonly<{}>, {
22
23
  size: "sm" | "md" | "lg" | "xl";
23
24
  context: BCC_CONTEXT;
25
+ gradient: boolean;
24
26
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
25
27
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
26
28
  declare const _default: typeof __VLS_export;
@@ -38,12 +38,13 @@ declare const __VLS_base: import("vue").DefineComponent<__VLS_PublicProps, {}, {
38
38
  "drag:update": () => any;
39
39
  "drag:end": () => any;
40
40
  }, string, import("vue").PublicProps, Readonly<__VLS_PublicProps> & Readonly<{
41
+ "onUpdate:modelValue"?: ((value: number) => any) | undefined;
41
42
  "onDrag:start"?: (() => any) | undefined;
42
43
  "onDrag:update"?: (() => any) | undefined;
43
44
  "onDrag:end"?: (() => any) | undefined;
44
- "onUpdate:modelValue"?: ((value: number) => any) | undefined;
45
45
  }>, {
46
46
  size: number;
47
+ duration: number;
47
48
  colored: boolean;
48
49
  arcWidth: number;
49
50
  min: number;
@@ -51,7 +52,6 @@ declare const __VLS_base: import("vue").DefineComponent<__VLS_PublicProps, {}, {
51
52
  steps: number;
52
53
  showHandle: boolean;
53
54
  hideArrows: boolean;
54
- duration: number;
55
55
  animateRotations: number;
56
56
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
57
57
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
@@ -0,0 +1,47 @@
1
+ import { type Component } from 'vue';
2
+ export type TopNavigationProps = {
3
+ title?: string | (() => string);
4
+ subtitle?: string | (() => string);
5
+ left?: ((...args: unknown[]) => Component | null) | Component | string | 'event-logo';
6
+ right?: ((...args: unknown[]) => Component | null) | Component | string;
7
+ hideBack?: boolean;
8
+ backTitle?: string;
9
+ };
10
+ type __VLS_Props = TopNavigationProps & {
11
+ relative?: boolean;
12
+ fixed?: boolean;
13
+ padded?: boolean;
14
+ transparent?: boolean;
15
+ glass?: boolean;
16
+ backTitle?: string;
17
+ force?: boolean;
18
+ titleLeft?: boolean;
19
+ };
20
+ declare var __VLS_1: {
21
+ title: {
22
+ title: string;
23
+ subtitle: string;
24
+ };
25
+ }, __VLS_13: {}, __VLS_20: {};
26
+ type __VLS_Slots = {} & {
27
+ default?: (props: typeof __VLS_1) => any;
28
+ } & {
29
+ right?: (props: typeof __VLS_13) => any;
30
+ } & {
31
+ bottom?: (props: typeof __VLS_20) => any;
32
+ };
33
+ declare const __VLS_base: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {} & {
34
+ back: () => any;
35
+ }, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
36
+ onBack?: (() => any) | undefined;
37
+ }>, {
38
+ hideBack: boolean;
39
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
40
+ declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
41
+ declare const _default: typeof __VLS_export;
42
+ export default _default;
43
+ type __VLS_WithSlots<T, S> = T & {
44
+ new (): {
45
+ $slots: S;
46
+ };
47
+ };
@@ -2,6 +2,7 @@
2
2
  * Custom BCC components (not based on PrimeVue).
3
3
  * Add new custom components here and export them from this file.
4
4
  */
5
+ export { default as BccAppNavigation } from './BccAppNavigation/BccAppNavigation.vue';
5
6
  export { default as BccBadge } from './BccBadge/BccBadge.vue';
6
7
  export { default as BccCapacityIndicator } from './BccCapacityIndicator/BccCapacityIndicator.vue';
7
8
  export { default as BccCircleLoader } from './BccCircleLoader/BccCircleLoader.vue';
@@ -14,6 +15,8 @@ export { default as BccReact } from './BccReact/BccReact.vue';
14
15
  export { default as BccReactEmoji } from './BccReact/BccReactEmoji.vue';
15
16
  export { default as BccStepIndicator } from './BccStepIndicator/BccStepIndicator.vue';
16
17
  export { default as BccTag } from './BccTag/BccTag.vue';
18
+ export { default as BccTopNavigation } from './BccTopNavigation/BccTopNavigation.vue';
19
+ export type { BccAppNavigationItem, BccAppNavigationProps } from './BccAppNavigation/BccAppNavigation.vue';
17
20
  export type { BadgeProps } from './BccBadge/BccBadge.vue';
18
21
  export type { CapacityIndicatorProps } from './BccCapacityIndicator/BccCapacityIndicator.vue';
19
22
  export type { KnobProps, KnobSlots } from './BccDialKnob/BccDialKnob.vue';
@@ -24,3 +27,4 @@ export type { NpsScoreProps } from './BccNpsScore/BccNpsScore.vue';
24
27
  export type { ReactInfo, ReactProps } from './BccReact/types';
25
28
  export type { StepIndicatorProps } from './BccStepIndicator/BccStepIndicator.vue';
26
29
  export type { TagProps } from './BccTag/BccTag.vue';
30
+ export type { TopNavigationProps } from './BccTopNavigation/BccTopNavigation.vue';
@@ -0,0 +1,17 @@
1
+ import { type ImageProps as PrimeImageProps } from 'primevue/image';
2
+ export type ImageProps = PrimeImageProps;
3
+ declare var __VLS_9: {}, __VLS_17: {};
4
+ type __VLS_Slots = {} & {
5
+ refresh?: (props: typeof __VLS_9) => any;
6
+ } & {
7
+ undo?: (props: typeof __VLS_17) => any;
8
+ };
9
+ declare const __VLS_base: import("vue").DefineComponent<PrimeImageProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<PrimeImageProps> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
10
+ declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
11
+ declare const _default: typeof __VLS_export;
12
+ export default _default;
13
+ type __VLS_WithSlots<T, S> = T & {
14
+ new (): {
15
+ $slots: S;
16
+ };
17
+ };
@@ -1,5 +1,5 @@
1
1
  import type { VueComponent } from '@/types';
2
- import { type MenuProps as PrimeMenuProps } from 'primevue/menu';
2
+ import { type MenuMethods as PrimeMenuMethods, type MenuProps as PrimeMenuProps } from 'primevue/menu';
3
3
  import type { MenuItem } from 'primevue/menuitem';
4
4
  /** Menu item model for BccMenu: icon can be a PrimeVue icon class string or a Vue icon component. */
5
5
  export type BccMenuItem = Omit<MenuItem, 'icon' | 'items'> & {
@@ -9,10 +9,6 @@ export type BccMenuItem = Omit<MenuItem, 'icon' | 'items'> & {
9
9
  export type MenuProps = {
10
10
  model?: BccMenuItem[];
11
11
  } & Omit<PrimeMenuProps, 'model'>;
12
- declare const __VLS_export: import("vue").DefineComponent<MenuProps, {
13
- toggle: (event: Event, target?: unknown) => void | undefined;
14
- show: (event: Event, target?: unknown) => void | undefined;
15
- hide: () => void | undefined;
16
- }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<MenuProps> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
12
+ declare const __VLS_export: import("vue").DefineComponent<MenuProps, PrimeMenuMethods, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<MenuProps> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
17
13
  declare const _default: typeof __VLS_export;
18
14
  export default _default;
@@ -14,9 +14,14 @@ export type ToggleProps = ToggleSwitchProps & {
14
14
  /** When true, applies context-aware styling (e.g. from design tokens/theme). */
15
15
  useCtx?: boolean;
16
16
  };
17
- declare const __VLS_export: import("vue").DefineComponent<ToggleProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {} & {
17
+ type __VLS_Props = ToggleProps;
18
+ type __VLS_ModelProps = {
19
+ modelValue: boolean;
20
+ };
21
+ type __VLS_PublicProps = __VLS_Props & __VLS_ModelProps;
22
+ declare const __VLS_export: import("vue").DefineComponent<__VLS_PublicProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
18
23
  "update:modelValue": (value: boolean) => any;
19
- }, string, import("vue").PublicProps, Readonly<ToggleProps> & Readonly<{
24
+ }, string, import("vue").PublicProps, Readonly<__VLS_PublicProps> & Readonly<{
20
25
  "onUpdate:modelValue"?: ((value: boolean) => any) | undefined;
21
26
  }>, {
22
27
  defaultValue: string | boolean;
@@ -7,6 +7,7 @@ export { default as BccButton } from './BccButton.vue';
7
7
  export { default as BccCheckbox } from './BccCheckbox.vue';
8
8
  export { default as BccChip } from './BccChip/BccChip.vue';
9
9
  export { default as BccConfirmDialog } from './BccConfirmDialog/BccConfirmDialog.vue';
10
+ export { default as BccImage } from './BccImage.vue';
10
11
  export { default as BccInput } from './BccInput.vue';
11
12
  export { default as BccMenu } from './BccMenu/BccMenu.vue';
12
13
  export { default as BccMessage } from './BccMessage.vue';
@@ -17,6 +18,7 @@ export type { AvatarProps } from './BccAvatar/BccAvatar.vue';
17
18
  export type { ButtonProps } from './BccButton.vue';
18
19
  export type { CheckboxProps } from './BccCheckbox.vue';
19
20
  export type { ChipProps } from './BccChip/BccChip.vue';
21
+ export type { ImageProps } from './BccImage.vue';
20
22
  export type { InputProps } from './BccInput.vue';
21
23
  export type { BccMenuItem, MenuProps } from './BccMenu/BccMenu.vue';
22
24
  export type { MessageProps } from './BccMessage.vue';
@@ -65,7 +65,6 @@ export { default as BccFocusTrap } from 'primevue/focustrap';
65
65
  export { default as BccGalleria } from 'primevue/galleria';
66
66
  export { default as BccIconField } from 'primevue/iconfield';
67
67
  export { default as BccIftaLabel } from 'primevue/iftalabel';
68
- export { default as BccImage } from 'primevue/image';
69
68
  export { default as BccImageCompare } from 'primevue/imagecompare';
70
69
  export { default as BccInplace } from 'primevue/inplace';
71
70
  export { default as BccInputChips } from 'primevue/inputchips';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bcc-code/component-library-vue",
3
- "version": "0.7.13",
3
+ "version": "0.8.0",
4
4
  "type": "module",
5
5
  "description": "Extended Vue component library based on PrimeVue and BCC design tokens",
6
6
  "repository": "https://github.com/bcc-code/bcc-design.git",
@@ -53,7 +53,7 @@
53
53
  "create-version": "node ./scripts/version.cjs"
54
54
  },
55
55
  "dependencies": {
56
- "@bcc-code/design-tokens": "^5.1.34",
56
+ "@bcc-code/design-tokens": "^5.1.42",
57
57
  "@bcc-code/icons-vue": "^1.4.0",
58
58
  "@primeuix/themes": "^2.0.3",
59
59
  "@tailwindcss/vite": "^4.1.18",