@c-code/c-code-fw 1.2.6 → 2.0.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.
Files changed (32) hide show
  1. package/README.md +118 -0
  2. package/fesm2022/c-code-c-code-fw-ui.mjs +1260 -0
  3. package/fesm2022/c-code-c-code-fw-ui.mjs.map +1 -0
  4. package/package.json +9 -2
  5. package/ui/index.d.ts +5 -0
  6. package/ui/lib/components/button/button.component.d.ts +24 -0
  7. package/ui/lib/components/category-menu/category-menu.component.d.ts +28 -0
  8. package/ui/lib/components/faq/faq.component.d.ts +23 -0
  9. package/ui/lib/components/faq-item/faq-item.component.d.ts +21 -0
  10. package/ui/lib/components/gallery/gallery.component.d.ts +31 -0
  11. package/ui/lib/components/info-item/info-item.component.d.ts +26 -0
  12. package/ui/lib/components/lightbox/lightbox.component.d.ts +41 -0
  13. package/ui/lib/components/notice/notice.component.d.ts +17 -0
  14. package/ui/lib/components/page-banner/page-banner.component.d.ts +29 -0
  15. package/ui/lib/components/plan-card/plan-card.component.d.ts +46 -0
  16. package/ui/lib/components/plan-catalog/plan-catalog.component.d.ts +102 -0
  17. package/ui/lib/components/plan-details/plan-details.component.d.ts +59 -0
  18. package/ui/lib/components/plan-filter-form/plan-filter-form.component.d.ts +38 -0
  19. package/ui/lib/components/promo-modal/promo-modal.component.d.ts +56 -0
  20. package/ui/lib/components/search-box/search-box.component.d.ts +23 -0
  21. package/ui/lib/components/section-heading/section-heading.component.d.ts +34 -0
  22. package/ui/lib/components/social-links/social-links.component.d.ts +21 -0
  23. package/ui/lib/components/whatsapp-button/whatsapp-button.component.d.ts +29 -0
  24. package/ui/lib/models/plan.models.d.ts +50 -0
  25. package/ui/lib/models/ui.models.d.ts +24 -0
  26. package/ui/lib/services/plan-catalog.service.d.ts +43 -0
  27. package/ui/lib/services/seo.service.d.ts +39 -0
  28. package/ui/lib/utils/plan.utils.d.ts +16 -0
  29. package/ui/lib/utils/text.utils.d.ts +25 -0
  30. package/ui/public-api.d.ts +24 -0
  31. package/ui/theme/component-base.css +136 -0
  32. package/ui/theme/tokens.css +111 -0
@@ -0,0 +1,43 @@
1
+ import { EnvironmentProviders, InjectionToken } from '@angular/core';
2
+ import { Observable } from 'rxjs';
3
+ import { AdditionalService, Plan, PlanCategory, PlanFilter, PriceRange } from '../models/plan.models';
4
+ import * as i0 from "@angular/core";
5
+ /** Where `PlanCatalogService` loads the JSON files from. */
6
+ export interface PlanCatalogConfig {
7
+ plansUrl: string;
8
+ additionalsUrl: string;
9
+ /** Leave it empty if the site has no `priceRanges.json`; `getPriceRanges()` then returns `[]`. */
10
+ priceRangesUrl?: string | null;
11
+ }
12
+ export declare const DEFAULT_PLAN_CATALOG_CONFIG: PlanCatalogConfig;
13
+ export declare const PLAN_CATALOG_CONFIG: InjectionToken<PlanCatalogConfig>;
14
+ /**
15
+ * Overrides the JSON locations. Without it, the service reads `assets/data/*.json`.
16
+ *
17
+ * ```ts
18
+ * providers: [provideHttpClient(withFetch()), providePlanCatalog({ priceRangesUrl: null })]
19
+ * ```
20
+ */
21
+ export declare function providePlanCatalog(config?: Partial<PlanCatalogConfig>): EnvironmentProviders;
22
+ /**
23
+ * Reads plans, add-on services and price ranges from static JSON.
24
+ * Each file is requested once and cached; filtering happens in memory.
25
+ * Needs `provideHttpClient()` in the app.
26
+ */
27
+ export declare class PlanCatalogService {
28
+ private http;
29
+ private config;
30
+ private additionals$;
31
+ private plans$;
32
+ private priceRanges$;
33
+ /** Every plan, with `additionalServices` filled in. */
34
+ getPlans(): Observable<Plan[]>;
35
+ getAdditionalServices(): Observable<AdditionalService[]>;
36
+ getPriceRanges(): Observable<PriceRange[]>;
37
+ getPlansByCategory(category: PlanCategory | number): Observable<Plan[]>;
38
+ getPlansByFilter(filter: PlanFilter): Observable<Plan[]>;
39
+ getPlansByName(name: string): Observable<Plan[]>;
40
+ getPlanBySlug(slug: string): Observable<Plan | undefined>;
41
+ static ɵfac: i0.ɵɵFactoryDeclaration<PlanCatalogService, never>;
42
+ static ɵprov: i0.ɵɵInjectableDeclaration<PlanCatalogService>;
43
+ }
@@ -0,0 +1,39 @@
1
+ import { EnvironmentProviders, InjectionToken } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ export interface SeoConfig {
4
+ /** Production domain without a trailing slash: "https://www.laurelspamedellin.com". */
5
+ siteUrl: string;
6
+ /** Image used when a page does not set one. Relative paths are resolved against `siteUrl`. */
7
+ defaultImage?: string;
8
+ }
9
+ export interface SeoData {
10
+ title: string;
11
+ description: string;
12
+ /** Page path, for example "/planes". */
13
+ path: string;
14
+ /** Image for the share preview. Defaults to `SeoConfig.defaultImage`. */
15
+ image?: string;
16
+ }
17
+ export declare const SEO_CONFIG: InjectionToken<SeoConfig>;
18
+ /** Registers the site data `SeoService` needs. */
19
+ export declare function provideSeo(config: SeoConfig): EnvironmentProviders;
20
+ /**
21
+ * Sets the title, description, canonical URL, Open Graph and Twitter tags, and JSON-LD blocks.
22
+ * Works during SSR and prerendering. Requires `provideSeo()`.
23
+ */
24
+ export declare class SeoService {
25
+ private title;
26
+ private meta;
27
+ private document;
28
+ private config;
29
+ get siteUrl(): string;
30
+ /** Turns a site path or relative asset into an absolute URL. Absolute URLs are returned unchanged. */
31
+ absoluteUrl(pathOrUrl: string): string;
32
+ update({ title, description, path, image }: SeoData): void;
33
+ /** Adds or replaces a `<script type="application/ld+json">` with the given id. */
34
+ setJsonLd(id: string, data: object): void;
35
+ removeJsonLd(id: string): void;
36
+ private setCanonical;
37
+ static ɵfac: i0.ɵɵFactoryDeclaration<SeoService, never>;
38
+ static ɵprov: i0.ɵɵInjectableDeclaration<SeoService>;
39
+ }
@@ -0,0 +1,16 @@
1
+ import { AdditionalService, CategoryOption, Plan, PlanCategory, PlanFilter } from '../models/plan.models';
2
+ /** Fills `plan.additionalServices` from `additionalServicesId`. Unknown ids are skipped. */
3
+ export declare function joinAdditionalServices(plans: Plan[], additionals: AdditionalService[]): Plan[];
4
+ /** URL slug of a plan, derived from its name. */
5
+ export declare function planSlug(plan: Plan | string): string;
6
+ export declare function findPlanBySlug(plans: Plan[], slug: string): Plan | undefined;
7
+ export declare function filterPlansByCategory(plans: Plan[], category: PlanCategory | number): Plan[];
8
+ /** Case- and accent-insensitive search on the plan name. An empty query returns every plan. */
9
+ export declare function searchPlansByName(plans: Plan[], query: string): Plan[];
10
+ /**
11
+ * Applies a `PlanFilter`. Price uses `min < price <= max`, the same rule the sites had,
12
+ * except that `min = 0` also includes free plans.
13
+ */
14
+ export declare function filterPlans(plans: Plan[], filter: PlanFilter): Plan[];
15
+ /** Returns the options with `count` set to the number of plans in each category. */
16
+ export declare function withCategoryCounts<T extends PlanCategory | number>(options: CategoryOption<T>[], plans: Plan[]): CategoryOption<T>[];
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Turns a text into a URL-safe slug: "PLAN FLOR DE LOTTO 3" -> "plan-flor-de-lotto-3".
3
+ * Accents are removed, so "Jacuzzi Mágico" -> "jacuzzi-magico".
4
+ */
5
+ export declare function slugify(text: string): string;
6
+ /** "PLAN GARDENIA" -> "Plan Gardenia". */
7
+ export declare function titleCase(text: string): string;
8
+ /** Cuts a text at the last whole word that fits in `max` characters and adds "…". */
9
+ export declare function truncateText(text: string, max?: number): string;
10
+ /**
11
+ * Builds a WhatsApp chat link.
12
+ * @param phone Number with country code, with or without "+" and spaces: "57 310 494 8884".
13
+ * @param message Pre-filled message, optional.
14
+ */
15
+ export declare function whatsappUrl(phone: string, message?: string): string;
16
+ export interface PriceFormat {
17
+ /** BCP 47 locale. Defaults to "es-CO", which prints 259900 as "$ 259.900". */
18
+ locale?: string;
19
+ /** ISO 4217 code. Defaults to "COP". */
20
+ currency?: string;
21
+ /** Decimals to show. Defaults to 0. */
22
+ digits?: number;
23
+ }
24
+ /** Formats a price with `Intl.NumberFormat`: formatPrice(259900) -> "$ 259.900". */
25
+ export declare function formatPrice(value: number, { locale, currency, digits }?: PriceFormat): string;
@@ -0,0 +1,24 @@
1
+ export * from './lib/models/plan.models';
2
+ export * from './lib/models/ui.models';
3
+ export * from './lib/utils/text.utils';
4
+ export * from './lib/utils/plan.utils';
5
+ export * from './lib/services/plan-catalog.service';
6
+ export * from './lib/services/seo.service';
7
+ export * from './lib/components/button/button.component';
8
+ export * from './lib/components/section-heading/section-heading.component';
9
+ export * from './lib/components/notice/notice.component';
10
+ export * from './lib/components/faq-item/faq-item.component';
11
+ export * from './lib/components/whatsapp-button/whatsapp-button.component';
12
+ export * from './lib/components/promo-modal/promo-modal.component';
13
+ export * from './lib/components/page-banner/page-banner.component';
14
+ export * from './lib/components/info-item/info-item.component';
15
+ export * from './lib/components/faq/faq.component';
16
+ export * from './lib/components/social-links/social-links.component';
17
+ export * from './lib/components/plan-card/plan-card.component';
18
+ export * from './lib/components/category-menu/category-menu.component';
19
+ export * from './lib/components/search-box/search-box.component';
20
+ export * from './lib/components/plan-filter-form/plan-filter-form.component';
21
+ export * from './lib/components/plan-catalog/plan-catalog.component';
22
+ export * from './lib/components/plan-details/plan-details.component';
23
+ export * from './lib/components/lightbox/lightbox.component';
24
+ export * from './lib/components/gallery/gallery.component';
@@ -0,0 +1,136 @@
1
+ /*
2
+ * Shared base for every @c-code/c-code-fw/ui component. Each component lists this file
3
+ * first in `styleUrls`, so the rules below are scoped to that component.
4
+ *
5
+ * The library does not own any brand. It reads a contract of semantic roles (--cc-*)
6
+ * that each site defines from its own palette and fonts, and resolves them into private
7
+ * --_* variables on the component host. Without a site theme, components render in
8
+ * neutral grays. Resolution happens on each host, so a role set on any ancestor element
9
+ * re-themes the components inside it.
10
+ *
11
+ * Structure (spacing, type scale, radii, shadows, motion) does belong to the library:
12
+ * those tokens have library defaults and components expose props to pick from them.
13
+ */
14
+ :host {
15
+ /* ---- Color roles: defined by the site ---- */
16
+ --_canvas: var(--cc-canvas, #ffffff); /* page background behind components */
17
+ --_surface: var(--cc-surface, #f5f5f4); /* cards, panels */
18
+ --_surface-alt: var(--cc-surface-alt, #fafaf9); /* alternative band, image placeholders */
19
+ --_text: var(--cc-text, #292524);
20
+ --_text-muted: var(--cc-text-muted, color-mix(in srgb, var(--_text) 72%, transparent));
21
+ --_heading: var(--cc-heading, #1c1917);
22
+ --_accent: var(--cc-accent, #1c1917); /* primary buttons, active items */
23
+ --_accent-hover: var(--cc-accent-hover, #44403c);
24
+ --_accent-text: var(--cc-accent-text, var(--_heading)); /* accent used as text, ≥4.5:1 */
25
+ --_on-accent: var(--cc-on-accent, #ffffff);
26
+ --_inverse: var(--cc-inverse, #1c1917); /* dark blocks: price badge, dark buttons */
27
+ --_inverse-hover: var(--cc-inverse-hover, #000000);
28
+ --_on-inverse: var(--cc-on-inverse, #ffffff);
29
+ --_border: var(--cc-border, #d6d3d1);
30
+ --_border-strong: var(--cc-border-strong, #78716c); /* inputs, ≥3:1 on white */
31
+ --_focus-ring: var(--cc-focus-ring, var(--_heading));
32
+ --_overlay: var(--cc-overlay, rgb(0 0 0 / 0.7));
33
+ --_danger: var(--cc-danger, #b91c1c);
34
+ --_danger-surface: var(--cc-danger-surface, #fef2f2);
35
+ --_on-danger-surface: var(--cc-on-danger-surface, #7f1d1d);
36
+ --_whatsapp: var(--cc-whatsapp, #1faf38);
37
+ --_whatsapp-hover: var(--cc-whatsapp-hover, #17902d);
38
+ --_on-whatsapp: var(--cc-on-whatsapp, #ffffff);
39
+
40
+ /* ---- Typography roles: defined by the site ---- */
41
+ --_font-body: var(--cc-font-body, inherit);
42
+ --_font-heading: var(--cc-font-heading, inherit);
43
+ --_heading-style: var(--cc-heading-style, normal); /* normal | italic */
44
+ --_heading-transform: var(--cc-heading-transform, none); /* none | uppercase */
45
+ --_heading-tracking: var(--cc-heading-tracking, normal);
46
+
47
+ /* ---- Structure: owned by the library ---- */
48
+ --_text-xs: var(--cc-text-xs, 0.75rem);
49
+ --_text-sm: var(--cc-text-sm, 0.875rem);
50
+ --_text-md: var(--cc-text-md, 1rem);
51
+ --_text-lg: var(--cc-text-lg, 1.125rem);
52
+ --_text-xl: var(--cc-text-xl, 1.25rem);
53
+ --_text-2xl: var(--cc-text-2xl, 1.5rem);
54
+ --_text-3xl: var(--cc-text-3xl, clamp(1.625rem, 1.2rem + 1.6vw, 2rem));
55
+ --_text-4xl: var(--cc-text-4xl, clamp(2rem, 1.4rem + 2.4vw, 2.75rem));
56
+ --_leading-tight: var(--cc-leading-tight, 1.2);
57
+ --_leading-snug: var(--cc-leading-snug, 1.4);
58
+ --_leading-body: var(--cc-leading-body, 1.6);
59
+ --_weight-regular: var(--cc-weight-regular, 400);
60
+ --_weight-medium: var(--cc-weight-medium, 500);
61
+ --_weight-semibold: var(--cc-weight-semibold, 600);
62
+ --_weight-bold: var(--cc-weight-bold, 700);
63
+ --_tracking-wide: var(--cc-tracking-wide, 0.04em);
64
+
65
+ --_space-1: var(--cc-space-1, 0.25rem);
66
+ --_space-2: var(--cc-space-2, 0.5rem);
67
+ --_space-3: var(--cc-space-3, 0.75rem);
68
+ --_space-4: var(--cc-space-4, 1rem);
69
+ --_space-5: var(--cc-space-5, 1.25rem);
70
+ --_space-6: var(--cc-space-6, 1.5rem);
71
+ --_space-8: var(--cc-space-8, 2rem);
72
+ --_space-10: var(--cc-space-10, 2.5rem);
73
+ --_space-12: var(--cc-space-12, 3rem);
74
+ --_space-16: var(--cc-space-16, 4rem);
75
+ --_space-20: var(--cc-space-20, 5rem);
76
+ --_space-24: var(--cc-space-24, 6rem);
77
+
78
+ --_radius: var(--cc-radius, 0);
79
+ --_radius-sm: var(--cc-radius-sm, 0.125rem);
80
+ --_radius-md: var(--cc-radius-md, 0.5rem);
81
+ --_radius-lg: var(--cc-radius-lg, 1rem);
82
+ --_radius-pill: var(--cc-radius-pill, 9999px);
83
+ --_shadow-sm: var(--cc-shadow-sm, 0 1px 2px 0 rgb(0 0 0 / 0.05));
84
+ --_shadow: var(--cc-shadow, 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1));
85
+ --_shadow-lg: var(--cc-shadow-lg, 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1));
86
+ --_shadow-xl: var(--cc-shadow-xl, 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1));
87
+
88
+ --_focus-width: var(--cc-focus-width, 2px);
89
+ --_focus-offset: var(--cc-focus-offset, 2px);
90
+ --_control-height: var(--cc-control-height, 2.75rem);
91
+ --_control-height-sm: var(--cc-control-height-sm, 2.25rem);
92
+ --_control-height-lg: var(--cc-control-height-lg, 3.25rem);
93
+ --_duration-fast: var(--cc-duration-fast, 150ms);
94
+ --_duration: var(--cc-duration, 250ms);
95
+ --_ease: var(--cc-ease, cubic-bezier(0.2, 0, 0, 1));
96
+ --_z-float: var(--cc-z-float, 20);
97
+ --_z-sticky: var(--cc-z-sticky, 30);
98
+ --_z-overlay: var(--cc-z-overlay, 50);
99
+
100
+ box-sizing: border-box;
101
+ font-family: var(--_font-body);
102
+ }
103
+
104
+ *,
105
+ *::before,
106
+ *::after {
107
+ box-sizing: border-box;
108
+ }
109
+
110
+ :focus-visible {
111
+ outline: var(--_focus-width) solid var(--_focus-ring);
112
+ outline-offset: var(--_focus-offset);
113
+ }
114
+
115
+ /* Visually hidden text for screen readers. */
116
+ .cc-sr-only {
117
+ position: absolute;
118
+ width: 1px;
119
+ height: 1px;
120
+ padding: 0;
121
+ margin: -1px;
122
+ overflow: hidden;
123
+ clip: rect(0, 0, 0, 0);
124
+ white-space: nowrap;
125
+ border: 0;
126
+ }
127
+
128
+ @media (prefers-reduced-motion: reduce) {
129
+ *,
130
+ *::before,
131
+ *::after {
132
+ animation-duration: 0.01ms !important;
133
+ animation-iteration-count: 1 !important;
134
+ transition-duration: 0.01ms !important;
135
+ }
136
+ }
@@ -0,0 +1,111 @@
1
+ /*
2
+ * Structural tokens of @c-code/c-code-fw/ui: type scale, spacing, radii, shadows,
3
+ * controls, motion and layers.
4
+ *
5
+ * Every component already falls back to these values, so this file is optional. Load it
6
+ * (angular.json → styles) when the site wants to use the same scales in its own markup,
7
+ * for example by mapping Tailwind's font sizes and spacing to var(--cc-text-*) and
8
+ * var(--cc-space-*). Override any of them to change the rhythm of a whole site.
9
+ *
10
+ * COLORS AND FONTS ARE NOT HERE. They belong to each site. The components read this
11
+ * contract of roles, which the site sets from its own palette (with any variable names):
12
+ *
13
+ * --cc-canvas page background behind components
14
+ * --cc-surface cards, panels, sidebar
15
+ * --cc-surface-alt alternative band, image placeholders
16
+ * --cc-text body text
17
+ * --cc-text-muted counters, metadata (default: --cc-text at 72%)
18
+ * --cc-heading titles
19
+ * --cc-accent primary buttons, active items
20
+ * --cc-accent-hover primary button hover
21
+ * --cc-accent-text accent used as text; needs 4.5:1 on --cc-canvas and --cc-surface
22
+ * --cc-on-accent text on --cc-accent; needs 4.5:1
23
+ * --cc-inverse dark blocks: price badge, dark buttons
24
+ * --cc-inverse-hover
25
+ * --cc-on-inverse text on --cc-inverse
26
+ * --cc-border dividers
27
+ * --cc-border-strong input borders, 3:1 on --cc-canvas
28
+ * --cc-focus-ring keyboard focus outline
29
+ * --cc-overlay modal and lightbox backdrop
30
+ * --cc-danger, --cc-danger-surface, --cc-on-danger-surface warnings
31
+ * --cc-whatsapp, --cc-whatsapp-hover WhatsApp buttons
32
+ * --cc-font-body, --cc-font-heading font families
33
+ * --cc-heading-style (normal|italic), --cc-heading-transform, --cc-heading-tracking
34
+ *
35
+ * Example, in the site's styles.css:
36
+ *
37
+ * :root {
38
+ * --laurel-green: #4c6b4a;
39
+ * --laurel-gold: #ceab5d;
40
+ * --cc-heading: var(--laurel-green);
41
+ * --cc-accent: var(--laurel-gold);
42
+ * --cc-on-accent: #022b04;
43
+ * }
44
+ *
45
+ * Without a site theme the components render in neutral grays.
46
+ *
47
+ * Breakpoints (media queries cannot use variables): sm 640px, md 768px, lg 1024px, xl 1280px.
48
+ */
49
+ :root {
50
+ /* Type scale */
51
+ --cc-text-xs: 0.75rem;
52
+ --cc-text-sm: 0.875rem;
53
+ --cc-text-md: 1rem;
54
+ --cc-text-lg: 1.125rem;
55
+ --cc-text-xl: 1.25rem;
56
+ --cc-text-2xl: 1.5rem;
57
+ --cc-text-3xl: clamp(1.625rem, 1.2rem + 1.6vw, 2rem);
58
+ --cc-text-4xl: clamp(2rem, 1.4rem + 2.4vw, 2.75rem);
59
+ --cc-leading-tight: 1.2;
60
+ --cc-leading-snug: 1.4;
61
+ --cc-leading-body: 1.6;
62
+ --cc-weight-regular: 400;
63
+ --cc-weight-medium: 500;
64
+ --cc-weight-semibold: 600;
65
+ --cc-weight-bold: 700;
66
+ --cc-tracking-wide: 0.04em;
67
+
68
+ /* Spacing (4px base, same steps as Tailwind) */
69
+ --cc-space-1: 0.25rem;
70
+ --cc-space-2: 0.5rem;
71
+ --cc-space-3: 0.75rem;
72
+ --cc-space-4: 1rem;
73
+ --cc-space-5: 1.25rem;
74
+ --cc-space-6: 1.5rem;
75
+ --cc-space-8: 2rem;
76
+ --cc-space-10: 2.5rem;
77
+ --cc-space-12: 3rem;
78
+ --cc-space-16: 4rem;
79
+ --cc-space-20: 5rem;
80
+ --cc-space-24: 6rem;
81
+
82
+ /* Shape */
83
+ --cc-radius: 0; /* surfaces: cards, panels */
84
+ --cc-radius-sm: 0.125rem;
85
+ --cc-radius-md: 0.5rem;
86
+ --cc-radius-lg: 1rem;
87
+ --cc-radius-pill: 9999px;
88
+ --cc-shadow-sm: 0 1px 2px 0 rgb(0 0 0 / 0.05);
89
+ --cc-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);
90
+ --cc-shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
91
+ --cc-shadow-xl: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1);
92
+
93
+ /* Focus */
94
+ --cc-focus-width: 2px;
95
+ --cc-focus-offset: 2px;
96
+
97
+ /* Controls */
98
+ --cc-control-height: 2.75rem; /* 44px minimum tap target */
99
+ --cc-control-height-sm: 2.25rem;
100
+ --cc-control-height-lg: 3.25rem;
101
+
102
+ /* Motion */
103
+ --cc-duration-fast: 150ms;
104
+ --cc-duration: 250ms;
105
+ --cc-ease: cubic-bezier(0.2, 0, 0, 1);
106
+
107
+ /* Layers */
108
+ --cc-z-float: 20;
109
+ --cc-z-sticky: 30;
110
+ --cc-z-overlay: 50;
111
+ }