@hotelfriendag/design-tokens 0.3.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/LICENSE +21 -0
- package/README.md +558 -0
- package/README.uk.md +377 -0
- package/RFC-0001-cross-project-design-system.md +273 -0
- package/RFC-0002-semantic-tier-naming.md +296 -0
- package/UI_DESIGN.md +608 -0
- package/ai-rules/CLAUDE.md +80 -0
- package/ai-rules/cursorrules.template +39 -0
- package/ai-rules/github-copilot-instructions.md +45 -0
- package/ai-rules/system-prompt-compact.md +43 -0
- package/components.html +3018 -0
- package/generate-tokens.cjs +665 -0
- package/package.json +98 -0
- package/portal-audit.html +2306 -0
- package/pre-built/_tokens.scss +138 -0
- package/pre-built/components.css +515 -0
- package/pre-built/shadcn-tokens.css +67 -0
- package/pre-built/status.css +51 -0
- package/pre-built/stylelint-design-system.cjs +69 -0
- package/pre-built/tailwind.additive.css +158 -0
- package/pre-built/tailwind.css +158 -0
- package/pre-built/tailwind.preset.js +207 -0
- package/pre-built/tokens.css +185 -0
- package/pre-built/tokens.d.ts +240 -0
- package/pre-built/tokens.js +243 -0
- package/pre-built/tokens.ts +240 -0
- package/scripts/integration-smoke.sh +91 -0
- package/scripts/pre-commit.sh +55 -0
- package/scripts/validate-tokens.cjs +113 -0
- package/states-canonical.json +240 -0
- package/states.json +2950 -0
- package/status-map.json +47 -0
- package/tokens.figma.json +230 -0
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/* HotelFriend design tokens — shadcn/ui v4 contract
|
|
2
|
+
* Generated from docs/tokens.figma.json — do NOT edit by hand.
|
|
3
|
+
*
|
|
4
|
+
* Usage: append to app/globals.css (after @import "tailwindcss")
|
|
5
|
+
* @import "./pre-built/shadcn-tokens.css";
|
|
6
|
+
*/
|
|
7
|
+
@theme inline {
|
|
8
|
+
/* ── Base ── */
|
|
9
|
+
--color-background: #FFFFFF;
|
|
10
|
+
--color-foreground: #2B2B2B; /* text-primary */
|
|
11
|
+
|
|
12
|
+
/* ── Card ── */
|
|
13
|
+
--color-card: #FFFFFF;
|
|
14
|
+
--color-card-foreground: #2B2B2B;
|
|
15
|
+
|
|
16
|
+
/* ── Popover ── */
|
|
17
|
+
--color-popover: #FFFFFF;
|
|
18
|
+
--color-popover-foreground: #2B2B2B;
|
|
19
|
+
|
|
20
|
+
/* ── Primary ── */
|
|
21
|
+
--color-primary: #24AFE8; /* canonical brand */
|
|
22
|
+
--color-primary-foreground: #FFFFFF;
|
|
23
|
+
|
|
24
|
+
/* ── Secondary ── */
|
|
25
|
+
--color-secondary: #E4E8EF; /* neutral border */
|
|
26
|
+
--color-secondary-foreground: #4B5675; /* text-secondary */
|
|
27
|
+
|
|
28
|
+
/* ── Muted ── */
|
|
29
|
+
--color-muted: #F1F3F6; /* very-light bg */
|
|
30
|
+
--color-muted-foreground: #99A1B7; /* placeholder */
|
|
31
|
+
|
|
32
|
+
/* ── Accent ── */
|
|
33
|
+
--color-accent: #E9F6FC; /* primary light tint */
|
|
34
|
+
--color-accent-foreground: #149AD1; /* primary-hover */
|
|
35
|
+
|
|
36
|
+
/* ── Destructive ── */
|
|
37
|
+
--color-destructive: #EA6565; /* status error */
|
|
38
|
+
--color-destructive-foreground: #FFFFFF;
|
|
39
|
+
|
|
40
|
+
/* ── Border / Input / Ring ── */
|
|
41
|
+
--color-border: #D1D6DD;
|
|
42
|
+
--color-input: #D1D6DD;
|
|
43
|
+
--color-ring: #24AFE8; /* focus ring = primary */
|
|
44
|
+
|
|
45
|
+
/* ── Chart palette (maps to HF status colors) ── */
|
|
46
|
+
--color-chart-1: #59B59D; /* success */
|
|
47
|
+
--color-chart-2: #FFBD5A; /* warning */
|
|
48
|
+
--color-chart-3: #24AFE8; /* primary */
|
|
49
|
+
--color-chart-4: #F87921; /* coral */
|
|
50
|
+
--color-chart-5: #EA6565; /* error */
|
|
51
|
+
|
|
52
|
+
/* ── Sidebar ── */
|
|
53
|
+
--color-sidebar: #F6F7FB; /* bg-accent */
|
|
54
|
+
--color-sidebar-foreground: #4B5675;
|
|
55
|
+
--color-sidebar-primary: #24AFE8;
|
|
56
|
+
--color-sidebar-primary-foreground: #FFFFFF;
|
|
57
|
+
--color-sidebar-accent: #E9F6FC;
|
|
58
|
+
--color-sidebar-accent-foreground: #2B2B2B;
|
|
59
|
+
--color-sidebar-border: #E4E8EF;
|
|
60
|
+
--color-sidebar-ring: #24AFE8;
|
|
61
|
+
|
|
62
|
+
/* ── Radius ── */
|
|
63
|
+
--radius: 6px; /* $br-sm */
|
|
64
|
+
|
|
65
|
+
/* ── Font ── */
|
|
66
|
+
--font-sans: Roboto, sans-serif;
|
|
67
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* HotelFriend status pills — domain → semantic mapping
|
|
3
|
+
* Generated from docs/status-map.json — do NOT edit by hand.
|
|
4
|
+
*
|
|
5
|
+
* Each .status-{domain}-{state} class binds to a semantic status slot
|
|
6
|
+
* (--color-hf-status-{role}) so adding a new domain status is JSON-only —
|
|
7
|
+
* no CSS edit needed.
|
|
8
|
+
*
|
|
9
|
+
* Pair with .hf-pill from components.css for the visual chrome.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
/* Booking */
|
|
13
|
+
.status-booking-new { color: var(--color-hf-status-warning); background: var(--color-hf-status-warning-bg); }
|
|
14
|
+
.status-booking-offer { color: var(--color-hf-status-violet); background: var(--color-hf-status-violet-bg); }
|
|
15
|
+
.status-booking-confirmed { color: var(--color-hf-status-info); background: var(--color-hf-status-info-bg); }
|
|
16
|
+
.status-booking-check-in { color: var(--color-hf-status-olive); background: var(--color-hf-status-olive-bg); }
|
|
17
|
+
.status-booking-check-out { color: var(--color-hf-status-coral); background: var(--color-hf-status-coral-bg); }
|
|
18
|
+
.status-booking-no-show { color: var(--color-hf-status-error); background: var(--color-hf-status-error-bg); }
|
|
19
|
+
.status-booking-due-in { color: var(--color-hf-status-success); background: var(--color-hf-status-success-bg); }
|
|
20
|
+
.status-booking-due-out { color: var(--color-hf-status-orange-deep); background: var(--color-hf-status-orange-deep-bg); }
|
|
21
|
+
.status-booking-canceled,
|
|
22
|
+
.status-booking-canceled-by-hotel,
|
|
23
|
+
.status-booking-canceled-by-guest,
|
|
24
|
+
.status-booking-canceled-by-hf { color: var(--color-hf-status-cancel); background: var(--color-hf-status-cancel-bg); }
|
|
25
|
+
|
|
26
|
+
/* Order */
|
|
27
|
+
.status-order-waiting { color: var(--color-hf-status-warning); background: var(--color-hf-status-warning-bg); }
|
|
28
|
+
.status-order-confirmed { color: var(--color-hf-status-info); background: var(--color-hf-status-info-bg); }
|
|
29
|
+
.status-order-completed { color: var(--color-hf-status-success); background: var(--color-hf-status-success-bg); }
|
|
30
|
+
.status-order-in-progress { color: var(--color-hf-status-coral); background: var(--color-hf-status-coral-bg); }
|
|
31
|
+
.status-order-action-required { color: var(--color-hf-status-error); background: var(--color-hf-status-error-bg); }
|
|
32
|
+
.status-order-canceled,
|
|
33
|
+
.status-order-canceled-by-hotel,
|
|
34
|
+
.status-order-canceled-by-guest,
|
|
35
|
+
.status-order-canceled-by-pos { color: var(--color-hf-status-cancel); background: var(--color-hf-status-cancel-bg); }
|
|
36
|
+
|
|
37
|
+
/* Front Desk */
|
|
38
|
+
.status-front-desk-quota-free { color: var(--color-hf-status-success); background: var(--color-hf-status-success-bg); }
|
|
39
|
+
.status-front-desk-quota-busy { color: var(--color-hf-status-error); background: var(--color-hf-status-error-bg); }
|
|
40
|
+
.status-front-desk-out-of-order { color: var(--color-hf-status-warning-strong); background: var(--color-hf-status-warning-strong-bg); }
|
|
41
|
+
|
|
42
|
+
/* Room Item Cleaning */
|
|
43
|
+
.status-room-item-cleaning-clean { color: var(--color-hf-status-success); background: var(--color-hf-status-success-bg); }
|
|
44
|
+
.status-room-item-cleaning-cleaning { color: var(--color-hf-status-info); background: var(--color-hf-status-info-bg); }
|
|
45
|
+
.status-room-item-cleaning-dirty { color: var(--color-hf-status-error); background: var(--color-hf-status-error-bg); }
|
|
46
|
+
.status-room-item-cleaning-inspected { color: var(--color-hf-status-violet); background: var(--color-hf-status-violet-bg); }
|
|
47
|
+
.status-room-item-cleaning-out-of-service { color: var(--color-hf-status-cancel); background: var(--color-hf-status-cancel-bg); }
|
|
48
|
+
|
|
49
|
+
/* Standalone (no domain prefix) */
|
|
50
|
+
.status-deleted { color: var(--color-hf-status-cancel); background: var(--color-hf-status-cancel-bg); }
|
|
51
|
+
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HotelFriend Design System — Stylelint plugin config
|
|
3
|
+
*
|
|
4
|
+
* Drop-in shareable config that enforces RFC-0001 §4.6 rules:
|
|
5
|
+
* 1. No raw hex colors in app code (use `var(--color-hf-*)` instead).
|
|
6
|
+
* 2. No Tailwind arbitrary values like `bg-[#26ADE4]` (use `bg-hf-accent`).
|
|
7
|
+
* 3. No bespoke `box-shadow` declarations (use `var(--shadow-hf-*)`).
|
|
8
|
+
*
|
|
9
|
+
* Usage in your project's stylelint config:
|
|
10
|
+
*
|
|
11
|
+
* // .stylelintrc.cjs
|
|
12
|
+
* module.exports = {
|
|
13
|
+
* extends: [
|
|
14
|
+
* 'stylelint-config-standard',
|
|
15
|
+
* './docs/portable-design/pre-built/stylelint-design-system.cjs'
|
|
16
|
+
* ],
|
|
17
|
+
* // Override rules per-file if needed:
|
|
18
|
+
* overrides: [
|
|
19
|
+
* { files: ['**\/pre-built/*.css'], rules: { 'color-no-hex': null } }, // generated files OK
|
|
20
|
+
* ],
|
|
21
|
+
* };
|
|
22
|
+
*
|
|
23
|
+
* Requires: stylelint ^16.0.0
|
|
24
|
+
*
|
|
25
|
+
* Phase 3B (RFC-0001 §4.6) — ships shareable config; consumers integrate into their CI.
|
|
26
|
+
*/
|
|
27
|
+
module.exports = {
|
|
28
|
+
rules: {
|
|
29
|
+
/* Hex colors — must use design tokens instead.
|
|
30
|
+
* Exception: --color-hf-white / --color-hf-black (#FFFFFF / #000000) are still OK
|
|
31
|
+
* via their tokens, but raw #fff / #000 in stylesheets is disallowed too.
|
|
32
|
+
*/
|
|
33
|
+
'color-no-hex': [true, {
|
|
34
|
+
message: 'Disallowed hex color. Use a design-system token instead, e.g. `var(--color-hf-accent)`, `var(--color-hf-fg)`, or `var(--color-hf-status-success)`.',
|
|
35
|
+
severity: 'error',
|
|
36
|
+
}],
|
|
37
|
+
|
|
38
|
+
/* Disallow named CSS colors (red, blue, etc.) — even more error-prone than hex. */
|
|
39
|
+
'color-named': ['never', {
|
|
40
|
+
ignore: ['inside-function'],
|
|
41
|
+
message: 'Disallowed named color. Use a design-system token, e.g. `var(--color-hf-accent)`.',
|
|
42
|
+
}],
|
|
43
|
+
|
|
44
|
+
/* Forbid rolling your own box-shadow declarations — must reference a token. */
|
|
45
|
+
'declaration-property-value-disallowed-list': [
|
|
46
|
+
{
|
|
47
|
+
'box-shadow': ['/^\\s*\\d/'], // anything starting with a number = literal shadow
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
message: 'Disallowed literal `box-shadow`. Use `var(--shadow-hf-default)`, `--shadow-hf-modal`, `--shadow-hf-card`, `--shadow-hf-subtle`, `--shadow-hf-outline`, or `--shadow-hf-hover`.',
|
|
51
|
+
severity: 'error',
|
|
52
|
+
},
|
|
53
|
+
],
|
|
54
|
+
|
|
55
|
+
/* Forbid arbitrary-value Tailwind utilities like `bg-[#26ADE4]` in HTML/JSX.
|
|
56
|
+
* Stylelint by itself can't lint HTML — this rule scopes to `@apply` directives.
|
|
57
|
+
* For full Tailwind arbitrary-value linting in HTML/JSX, use ESLint
|
|
58
|
+
* `eslint-plugin-tailwindcss` with the `no-arbitrary-value` rule. */
|
|
59
|
+
'declaration-property-value-disallowed-list': [
|
|
60
|
+
{
|
|
61
|
+
'/^.*$/': ['/bg-\\[#/', '/text-\\[#/', '/border-\\[#/'],
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
message: 'Disallowed Tailwind arbitrary hex (e.g. `bg-[#26ADE4]`). Use a token utility like `bg-hf-accent`.',
|
|
65
|
+
severity: 'warning', // warning because @apply usage of arbitrary values is rare
|
|
66
|
+
},
|
|
67
|
+
],
|
|
68
|
+
},
|
|
69
|
+
};
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* HotelFriend design tokens — Tailwind v4 CSS theme
|
|
3
|
+
* Generated from docs/tokens.figma.json — do NOT edit by hand.
|
|
4
|
+
*
|
|
5
|
+
* Usage in your main CSS entry file:
|
|
6
|
+
* @import "tailwindcss";
|
|
7
|
+
* @import "./pre-built/tailwind.css";
|
|
8
|
+
*
|
|
9
|
+
* Tailwind v4 auto-generates utilities from @theme variables:
|
|
10
|
+
* --color-* → bg-*, text-*, border-*, ring-*, …
|
|
11
|
+
* --text-* → text-*
|
|
12
|
+
* --font-* → font-* (family)
|
|
13
|
+
* --font-weight-*→ font-* (weight)
|
|
14
|
+
* --leading-* → leading-*
|
|
15
|
+
* --radius-* → rounded-*
|
|
16
|
+
* --shadow-* → shadow-*
|
|
17
|
+
* --z-* → z-*
|
|
18
|
+
*/
|
|
19
|
+
@theme {
|
|
20
|
+
/* Colors */
|
|
21
|
+
--color-hf-blue-50: #E9F6FC;
|
|
22
|
+
--color-hf-blue-100: #EFF6FF;
|
|
23
|
+
--color-hf-blue-500: #24AFE8;
|
|
24
|
+
--color-hf-blue-600: #149AD1;
|
|
25
|
+
--color-hf-gray-25: #FBFBFC;
|
|
26
|
+
--color-hf-gray-50: #F6F7FB;
|
|
27
|
+
--color-hf-gray-100: #F1F3F6;
|
|
28
|
+
--color-hf-gray-200: #E4E8EF;
|
|
29
|
+
--color-hf-gray-300: #D1D6DD;
|
|
30
|
+
--color-hf-gray-400: #AEBCCF;
|
|
31
|
+
--color-hf-gray-500: #99A1B7;
|
|
32
|
+
--color-hf-gray-550: #7E8EA6;
|
|
33
|
+
--color-hf-gray-600: #50627E;
|
|
34
|
+
--color-hf-gray-700: #485B78;
|
|
35
|
+
--color-hf-gray-800: #4B5675;
|
|
36
|
+
--color-hf-gray-900: #2B2B2B;
|
|
37
|
+
--color-hf-gray-950: #252F4A;
|
|
38
|
+
--color-hf-green-500: #59B59D;
|
|
39
|
+
--color-hf-amber-400: #FFBD5A;
|
|
40
|
+
--color-hf-amber-600: #FFC900;
|
|
41
|
+
--color-hf-red-400: #EA6565;
|
|
42
|
+
--color-hf-red-500: #FB5A56;
|
|
43
|
+
--color-hf-red-700: #D9534F;
|
|
44
|
+
--color-hf-orange-500: #F87921;
|
|
45
|
+
--color-hf-orange-700: #A55505;
|
|
46
|
+
--color-hf-violet-500: #5761D8;
|
|
47
|
+
--color-hf-slate-500: #7F8FA4;
|
|
48
|
+
--color-hf-olive-700: #5B7A02;
|
|
49
|
+
--color-hf-white: #FFFFFF;
|
|
50
|
+
--color-hf-black: #000000;
|
|
51
|
+
--color-hf-accent: var(--color-hf-blue-500);
|
|
52
|
+
--color-hf-accent-hover: var(--color-hf-blue-600);
|
|
53
|
+
--color-hf-accent-subtle: var(--color-hf-blue-50);
|
|
54
|
+
--color-hf-accent-subtler: var(--color-hf-blue-100);
|
|
55
|
+
--color-hf-on-accent: var(--color-hf-white);
|
|
56
|
+
--color-hf-bg-page: var(--color-hf-gray-25);
|
|
57
|
+
--color-hf-bg-section: var(--color-hf-gray-50);
|
|
58
|
+
--color-hf-bg-muted: var(--color-hf-gray-100);
|
|
59
|
+
--color-hf-bg-surface: var(--color-hf-white);
|
|
60
|
+
--color-hf-fg: var(--color-hf-gray-900);
|
|
61
|
+
--color-hf-fg-muted: var(--color-hf-gray-800);
|
|
62
|
+
--color-hf-fg-subtle: var(--color-hf-gray-550);
|
|
63
|
+
--color-hf-fg-faint: var(--color-hf-gray-400);
|
|
64
|
+
--color-hf-border: var(--color-hf-gray-300);
|
|
65
|
+
--color-hf-border-subtle: var(--color-hf-gray-200);
|
|
66
|
+
--color-hf-border-strong: var(--color-hf-gray-400);
|
|
67
|
+
--color-hf-tab-fg-inactive: var(--color-hf-gray-700);
|
|
68
|
+
--color-hf-tab-count-fg: var(--color-hf-gray-700);
|
|
69
|
+
--color-hf-pagination-fg-inactive: var(--color-hf-gray-700);
|
|
70
|
+
--color-hf-pagination-fg-active: var(--color-hf-gray-950);
|
|
71
|
+
--color-hf-input-border: #DBDFE9;
|
|
72
|
+
--color-hf-menu-bg-hover: #F5F5F5;
|
|
73
|
+
--color-hf-status-success: var(--color-hf-green-500);
|
|
74
|
+
--color-hf-status-success-bg: rgba(89,181,157,0.15);
|
|
75
|
+
--color-hf-status-warning: var(--color-hf-amber-400);
|
|
76
|
+
--color-hf-status-warning-bg: rgba(255,189,90,0.15);
|
|
77
|
+
--color-hf-status-warning-strong: var(--color-hf-amber-600);
|
|
78
|
+
--color-hf-status-warning-strong-bg: rgba(255,201,0,0.15);
|
|
79
|
+
--color-hf-status-error: var(--color-hf-red-400);
|
|
80
|
+
--color-hf-status-error-bg: rgba(234,101,101,0.15);
|
|
81
|
+
--color-hf-status-error-strong: var(--color-hf-red-700);
|
|
82
|
+
--color-hf-status-error-alt: var(--color-hf-red-500);
|
|
83
|
+
--color-hf-status-info: var(--color-hf-accent);
|
|
84
|
+
--color-hf-status-info-bg: rgba(36,175,232,0.15);
|
|
85
|
+
--color-hf-status-cancel: var(--color-hf-slate-500);
|
|
86
|
+
--color-hf-status-cancel-bg: rgba(127,143,164,0.15);
|
|
87
|
+
--color-hf-status-coral: var(--color-hf-orange-500);
|
|
88
|
+
--color-hf-status-coral-bg: rgba(248,121,33,0.15);
|
|
89
|
+
--color-hf-status-violet: var(--color-hf-violet-500);
|
|
90
|
+
--color-hf-status-violet-bg: rgba(87,97,216,0.15);
|
|
91
|
+
--color-hf-status-olive: var(--color-hf-olive-700);
|
|
92
|
+
--color-hf-status-olive-bg: rgba(91,122,2,0.15);
|
|
93
|
+
--color-hf-status-orange-deep: var(--color-hf-orange-700);
|
|
94
|
+
--color-hf-status-orange-deep-bg: rgba(165,85,5,0.15);
|
|
95
|
+
/* Typography — font families */
|
|
96
|
+
--font-hf-sans: Roboto;
|
|
97
|
+
/* Typography — font weights */
|
|
98
|
+
--font-weight-hf-regular: 400;
|
|
99
|
+
--font-weight-hf-medium: 500;
|
|
100
|
+
--font-weight-hf-semibold: 600;
|
|
101
|
+
/* Typography — font sizes */
|
|
102
|
+
--text-hf-xs: 11px;
|
|
103
|
+
--text-hf-sm: 13px;
|
|
104
|
+
--text-hf-base: 14px;
|
|
105
|
+
--text-hf-md: 15px;
|
|
106
|
+
--text-hf-lg: 16px;
|
|
107
|
+
--text-hf-xl: 18px;
|
|
108
|
+
--text-hf-2xl: 20px;
|
|
109
|
+
--text-hf-h2: 24px;
|
|
110
|
+
--text-hf-page: 26px;
|
|
111
|
+
--text-hf-hero: 30px;
|
|
112
|
+
/* Typography — line heights */
|
|
113
|
+
--leading-hf-headings: 1.2;
|
|
114
|
+
--leading-hf-body: 1.5;
|
|
115
|
+
--leading-hf-tight: 1;
|
|
116
|
+
/* Border radius */
|
|
117
|
+
--radius-hf-sm: 6px;
|
|
118
|
+
--radius-hf-md: 8px;
|
|
119
|
+
--radius-hf-lg: 9px;
|
|
120
|
+
--radius-hf-xl: 12px;
|
|
121
|
+
--radius-hf-pill: 99px;
|
|
122
|
+
/* Spacing */
|
|
123
|
+
--spacing-hf-0: 0px;
|
|
124
|
+
--spacing-hf-1: 4px;
|
|
125
|
+
--spacing-hf-2: 8px;
|
|
126
|
+
--spacing-hf-3: 12px;
|
|
127
|
+
--spacing-hf-4: 16px;
|
|
128
|
+
--spacing-hf-5: 20px;
|
|
129
|
+
--spacing-hf-6: 24px;
|
|
130
|
+
--spacing-hf-7: 30px;
|
|
131
|
+
--spacing-hf-8: 32px;
|
|
132
|
+
--spacing-hf-sidebar-expanded: 215px;
|
|
133
|
+
--spacing-hf-sidebar-collapsed: 80px;
|
|
134
|
+
--spacing-hf-header-height: 60px;
|
|
135
|
+
--spacing-hf-content-max: 1440px;
|
|
136
|
+
--spacing-hf-btn-default: 40px;
|
|
137
|
+
--spacing-hf-btn-sm: 32px;
|
|
138
|
+
--spacing-hf-btn-search: 38px;
|
|
139
|
+
--spacing-hf-input-default: 39px;
|
|
140
|
+
--spacing-hf-tap-target: 44px;
|
|
141
|
+
/* Shadows */
|
|
142
|
+
--shadow-hf: 0px 1px 8px 0px rgba(0,0,0,0.1);
|
|
143
|
+
--shadow-hf-subtle: 0px 2px 4px 0px rgba(0,0,0,0.05);
|
|
144
|
+
--shadow-hf-wrapper: 0px 3px 4px 0px rgba(0,0,0,0.03);
|
|
145
|
+
--shadow-hf-card: 0px 12px 24px 0px rgba(26,26,30,0.06);
|
|
146
|
+
--shadow-hf-modal: 0px 6px 18px 0px rgba(0,0,0,0.1);
|
|
147
|
+
--shadow-hf-outline: 0px 1px 2px 0px rgba(72,91,120,0.18);
|
|
148
|
+
--shadow-hf-hover: 0px 2px 3px 0px rgba(0,0,0,0.06);
|
|
149
|
+
/* Z-index */
|
|
150
|
+
--z-hf-sidebar: 1000;
|
|
151
|
+
--z-hf-dropdown: 1001;
|
|
152
|
+
--z-hf-datepicker: 3000;
|
|
153
|
+
--z-hf-sticky-topbar: 4000;
|
|
154
|
+
--z-hf-modal-backdrop: 10050;
|
|
155
|
+
--z-hf-modal-dialog: 10051;
|
|
156
|
+
--z-hf-preloader: 99999;
|
|
157
|
+
--z-hf-topmost-overlay: 1000001;
|
|
158
|
+
}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* HotelFriend design tokens — Tailwind v4 CSS theme
|
|
3
|
+
* Generated from docs/tokens.figma.json — do NOT edit by hand.
|
|
4
|
+
*
|
|
5
|
+
* Usage in your main CSS entry file:
|
|
6
|
+
* @import "tailwindcss";
|
|
7
|
+
* @import "./pre-built/tailwind.css";
|
|
8
|
+
*
|
|
9
|
+
* Tailwind v4 auto-generates utilities from @theme variables:
|
|
10
|
+
* --color-* → bg-*, text-*, border-*, ring-*, …
|
|
11
|
+
* --text-* → text-*
|
|
12
|
+
* --font-* → font-* (family)
|
|
13
|
+
* --font-weight-*→ font-* (weight)
|
|
14
|
+
* --leading-* → leading-*
|
|
15
|
+
* --radius-* → rounded-*
|
|
16
|
+
* --shadow-* → shadow-*
|
|
17
|
+
* --z-* → z-*
|
|
18
|
+
*/
|
|
19
|
+
@theme {
|
|
20
|
+
/* Colors */
|
|
21
|
+
--color-hf-blue-50: #E9F6FC;
|
|
22
|
+
--color-hf-blue-100: #EFF6FF;
|
|
23
|
+
--color-hf-blue-500: #24AFE8;
|
|
24
|
+
--color-hf-blue-600: #149AD1;
|
|
25
|
+
--color-hf-gray-25: #FBFBFC;
|
|
26
|
+
--color-hf-gray-50: #F6F7FB;
|
|
27
|
+
--color-hf-gray-100: #F1F3F6;
|
|
28
|
+
--color-hf-gray-200: #E4E8EF;
|
|
29
|
+
--color-hf-gray-300: #D1D6DD;
|
|
30
|
+
--color-hf-gray-400: #AEBCCF;
|
|
31
|
+
--color-hf-gray-500: #99A1B7;
|
|
32
|
+
--color-hf-gray-550: #7E8EA6;
|
|
33
|
+
--color-hf-gray-600: #50627E;
|
|
34
|
+
--color-hf-gray-700: #485B78;
|
|
35
|
+
--color-hf-gray-800: #4B5675;
|
|
36
|
+
--color-hf-gray-900: #2B2B2B;
|
|
37
|
+
--color-hf-gray-950: #252F4A;
|
|
38
|
+
--color-hf-green-500: #59B59D;
|
|
39
|
+
--color-hf-amber-400: #FFBD5A;
|
|
40
|
+
--color-hf-amber-600: #FFC900;
|
|
41
|
+
--color-hf-red-400: #EA6565;
|
|
42
|
+
--color-hf-red-500: #FB5A56;
|
|
43
|
+
--color-hf-red-700: #D9534F;
|
|
44
|
+
--color-hf-orange-500: #F87921;
|
|
45
|
+
--color-hf-orange-700: #A55505;
|
|
46
|
+
--color-hf-violet-500: #5761D8;
|
|
47
|
+
--color-hf-slate-500: #7F8FA4;
|
|
48
|
+
--color-hf-olive-700: #5B7A02;
|
|
49
|
+
--color-hf-white: #FFFFFF;
|
|
50
|
+
--color-hf-black: #000000;
|
|
51
|
+
--color-hf-accent: var(--color-hf-blue-500);
|
|
52
|
+
--color-hf-accent-hover: var(--color-hf-blue-600);
|
|
53
|
+
--color-hf-accent-subtle: var(--color-hf-blue-50);
|
|
54
|
+
--color-hf-accent-subtler: var(--color-hf-blue-100);
|
|
55
|
+
--color-hf-on-accent: var(--color-hf-white);
|
|
56
|
+
--color-hf-bg-page: var(--color-hf-gray-25);
|
|
57
|
+
--color-hf-bg-section: var(--color-hf-gray-50);
|
|
58
|
+
--color-hf-bg-muted: var(--color-hf-gray-100);
|
|
59
|
+
--color-hf-bg-surface: var(--color-hf-white);
|
|
60
|
+
--color-hf-fg: var(--color-hf-gray-900);
|
|
61
|
+
--color-hf-fg-muted: var(--color-hf-gray-800);
|
|
62
|
+
--color-hf-fg-subtle: var(--color-hf-gray-550);
|
|
63
|
+
--color-hf-fg-faint: var(--color-hf-gray-400);
|
|
64
|
+
--color-hf-border: var(--color-hf-gray-300);
|
|
65
|
+
--color-hf-border-subtle: var(--color-hf-gray-200);
|
|
66
|
+
--color-hf-border-strong: var(--color-hf-gray-400);
|
|
67
|
+
--color-hf-tab-fg-inactive: var(--color-hf-gray-700);
|
|
68
|
+
--color-hf-tab-count-fg: var(--color-hf-gray-700);
|
|
69
|
+
--color-hf-pagination-fg-inactive: var(--color-hf-gray-700);
|
|
70
|
+
--color-hf-pagination-fg-active: var(--color-hf-gray-950);
|
|
71
|
+
--color-hf-input-border: #DBDFE9;
|
|
72
|
+
--color-hf-menu-bg-hover: #F5F5F5;
|
|
73
|
+
--color-hf-status-success: var(--color-hf-green-500);
|
|
74
|
+
--color-hf-status-success-bg: rgba(89,181,157,0.15);
|
|
75
|
+
--color-hf-status-warning: var(--color-hf-amber-400);
|
|
76
|
+
--color-hf-status-warning-bg: rgba(255,189,90,0.15);
|
|
77
|
+
--color-hf-status-warning-strong: var(--color-hf-amber-600);
|
|
78
|
+
--color-hf-status-warning-strong-bg: rgba(255,201,0,0.15);
|
|
79
|
+
--color-hf-status-error: var(--color-hf-red-400);
|
|
80
|
+
--color-hf-status-error-bg: rgba(234,101,101,0.15);
|
|
81
|
+
--color-hf-status-error-strong: var(--color-hf-red-700);
|
|
82
|
+
--color-hf-status-error-alt: var(--color-hf-red-500);
|
|
83
|
+
--color-hf-status-info: var(--color-hf-accent);
|
|
84
|
+
--color-hf-status-info-bg: rgba(36,175,232,0.15);
|
|
85
|
+
--color-hf-status-cancel: var(--color-hf-slate-500);
|
|
86
|
+
--color-hf-status-cancel-bg: rgba(127,143,164,0.15);
|
|
87
|
+
--color-hf-status-coral: var(--color-hf-orange-500);
|
|
88
|
+
--color-hf-status-coral-bg: rgba(248,121,33,0.15);
|
|
89
|
+
--color-hf-status-violet: var(--color-hf-violet-500);
|
|
90
|
+
--color-hf-status-violet-bg: rgba(87,97,216,0.15);
|
|
91
|
+
--color-hf-status-olive: var(--color-hf-olive-700);
|
|
92
|
+
--color-hf-status-olive-bg: rgba(91,122,2,0.15);
|
|
93
|
+
--color-hf-status-orange-deep: var(--color-hf-orange-700);
|
|
94
|
+
--color-hf-status-orange-deep-bg: rgba(165,85,5,0.15);
|
|
95
|
+
/* Typography — font families */
|
|
96
|
+
--font-hf-sans: Roboto;
|
|
97
|
+
/* Typography — font weights */
|
|
98
|
+
--font-weight-hf-regular: 400;
|
|
99
|
+
--font-weight-hf-medium: 500;
|
|
100
|
+
--font-weight-hf-semibold: 600;
|
|
101
|
+
/* Typography — font sizes */
|
|
102
|
+
--text-hf-xs: 11px;
|
|
103
|
+
--text-hf-sm: 13px;
|
|
104
|
+
--text-hf-base: 14px;
|
|
105
|
+
--text-hf-md: 15px;
|
|
106
|
+
--text-hf-lg: 16px;
|
|
107
|
+
--text-hf-xl: 18px;
|
|
108
|
+
--text-hf-2xl: 20px;
|
|
109
|
+
--text-hf-h2: 24px;
|
|
110
|
+
--text-hf-page: 26px;
|
|
111
|
+
--text-hf-hero: 30px;
|
|
112
|
+
/* Typography — line heights */
|
|
113
|
+
--leading-hf-headings: 1.2;
|
|
114
|
+
--leading-hf-body: 1.5;
|
|
115
|
+
--leading-hf-tight: 1;
|
|
116
|
+
/* Border radius */
|
|
117
|
+
--radius-hf-sm: 6px;
|
|
118
|
+
--radius-hf-md: 8px;
|
|
119
|
+
--radius-hf-lg: 9px;
|
|
120
|
+
--radius-hf-xl: 12px;
|
|
121
|
+
--radius-hf-pill: 99px;
|
|
122
|
+
/* Spacing */
|
|
123
|
+
--spacing-hf-0: 0px;
|
|
124
|
+
--spacing-hf-1: 4px;
|
|
125
|
+
--spacing-hf-2: 8px;
|
|
126
|
+
--spacing-hf-3: 12px;
|
|
127
|
+
--spacing-hf-4: 16px;
|
|
128
|
+
--spacing-hf-5: 20px;
|
|
129
|
+
--spacing-hf-6: 24px;
|
|
130
|
+
--spacing-hf-7: 30px;
|
|
131
|
+
--spacing-hf-8: 32px;
|
|
132
|
+
--spacing-hf-sidebar-expanded: 215px;
|
|
133
|
+
--spacing-hf-sidebar-collapsed: 80px;
|
|
134
|
+
--spacing-hf-header-height: 60px;
|
|
135
|
+
--spacing-hf-content-max: 1440px;
|
|
136
|
+
--spacing-hf-btn-default: 40px;
|
|
137
|
+
--spacing-hf-btn-sm: 32px;
|
|
138
|
+
--spacing-hf-btn-search: 38px;
|
|
139
|
+
--spacing-hf-input-default: 39px;
|
|
140
|
+
--spacing-hf-tap-target: 44px;
|
|
141
|
+
/* Shadows */
|
|
142
|
+
--shadow-hf: 0px 1px 8px 0px rgba(0,0,0,0.1);
|
|
143
|
+
--shadow-hf-subtle: 0px 2px 4px 0px rgba(0,0,0,0.05);
|
|
144
|
+
--shadow-hf-wrapper: 0px 3px 4px 0px rgba(0,0,0,0.03);
|
|
145
|
+
--shadow-hf-card: 0px 12px 24px 0px rgba(26,26,30,0.06);
|
|
146
|
+
--shadow-hf-modal: 0px 6px 18px 0px rgba(0,0,0,0.1);
|
|
147
|
+
--shadow-hf-outline: 0px 1px 2px 0px rgba(72,91,120,0.18);
|
|
148
|
+
--shadow-hf-hover: 0px 2px 3px 0px rgba(0,0,0,0.06);
|
|
149
|
+
/* Z-index */
|
|
150
|
+
--z-hf-sidebar: 1000;
|
|
151
|
+
--z-hf-dropdown: 1001;
|
|
152
|
+
--z-hf-datepicker: 3000;
|
|
153
|
+
--z-hf-sticky-topbar: 4000;
|
|
154
|
+
--z-hf-modal-backdrop: 10050;
|
|
155
|
+
--z-hf-modal-dialog: 10051;
|
|
156
|
+
--z-hf-preloader: 99999;
|
|
157
|
+
--z-hf-topmost-overlay: 1000001;
|
|
158
|
+
}
|