crew-recommendation-ui 0.0.1
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/README.md +156 -0
- package/dist/Card-C6fF0ZrH.js +197 -0
- package/dist/Card-C6fF0ZrH.js.map +1 -0
- package/dist/dls/index.d.ts +8 -0
- package/dist/dls/index.d.ts.map +1 -0
- package/dist/dls/index.js +25 -0
- package/dist/dls/index.js.map +1 -0
- package/dist/dls/tokens/colors.d.ts +77 -0
- package/dist/dls/tokens/colors.d.ts.map +1 -0
- package/dist/dls/tokens/index.d.ts +215 -0
- package/dist/dls/tokens/index.d.ts.map +1 -0
- package/dist/dls/tokens/spacing.d.ts +46 -0
- package/dist/dls/tokens/spacing.d.ts.map +1 -0
- package/dist/dls/tokens/typography.d.ts +102 -0
- package/dist/dls/tokens/typography.d.ts.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/package.json +60 -0
- package/dist/recommendation/components/Card.d.ts +13 -0
- package/dist/recommendation/components/Card.d.ts.map +1 -0
- package/dist/recommendation/components/index.d.ts +6 -0
- package/dist/recommendation/components/index.d.ts.map +1 -0
- package/dist/recommendation/index.d.ts +9 -0
- package/dist/recommendation/index.d.ts.map +1 -0
- package/dist/recommendation/index.js +6 -0
- package/dist/recommendation/index.js.map +1 -0
- package/dist/recommendation/types.d.ts +71 -0
- package/dist/recommendation/types.d.ts.map +1 -0
- package/dist/typography-zz5GzgjI.js +245 -0
- package/dist/typography-zz5GzgjI.js.map +1 -0
- package/package.json +60 -0
- package/src/dls/index.ts +15 -0
- package/src/dls/tokens/colors.ts +94 -0
- package/src/dls/tokens/index.ts +30 -0
- package/src/dls/tokens/spacing.ts +62 -0
- package/src/dls/tokens/typography.ts +119 -0
- package/src/index.ts +25 -0
- package/src/recommendation/components/Card.tsx +191 -0
- package/src/recommendation/components/index.ts +14 -0
- package/src/recommendation/index.ts +15 -0
- package/src/recommendation/types.ts +87 -0
package/README.md
ADDED
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
# @crew-copilot/recommendation-ui
|
|
2
|
+
|
|
3
|
+
A shared UI library for recommendation listing components that can be used across web, mobile, and dashboard applications.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- **DLS (Design Language System)**: Consistent design tokens for colors, spacing, typography
|
|
8
|
+
- **Recommendation Cards**: Pre-built components for hotels, flights, cabs, etc.
|
|
9
|
+
- **Platform Agnostic**: Works with React DOM and React Native Web
|
|
10
|
+
|
|
11
|
+
## Installation
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
# From the monorepo root
|
|
15
|
+
yarn workspace @crew-copilot/recommendation-ui build
|
|
16
|
+
|
|
17
|
+
# Or install as a dependency in another package
|
|
18
|
+
yarn add @crew-copilot/recommendation-ui
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## Usage
|
|
22
|
+
|
|
23
|
+
### Import DLS Tokens
|
|
24
|
+
|
|
25
|
+
```tsx
|
|
26
|
+
import { colors, spacing, textStyles, tokens } from '@crew-copilot/recommendation-ui/dls';
|
|
27
|
+
|
|
28
|
+
// Use tokens in your styles
|
|
29
|
+
const styles = {
|
|
30
|
+
container: {
|
|
31
|
+
padding: spacing[4],
|
|
32
|
+
backgroundColor: colors.neutral[900],
|
|
33
|
+
},
|
|
34
|
+
title: {
|
|
35
|
+
...textStyles.h2,
|
|
36
|
+
color: colors.neutral[0],
|
|
37
|
+
},
|
|
38
|
+
};
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
### Import Recommendation Components
|
|
42
|
+
|
|
43
|
+
```tsx
|
|
44
|
+
import { Card, RecommendationCard } from '@crew-copilot/recommendation-ui/recommendation';
|
|
45
|
+
import type { HotelItem } from '@crew-copilot/recommendation-ui/recommendation';
|
|
46
|
+
|
|
47
|
+
const hotelData: HotelItem = {
|
|
48
|
+
id: '1',
|
|
49
|
+
type: 'hotel',
|
|
50
|
+
title: 'Luxury Resort & Spa',
|
|
51
|
+
subtitle: 'Beachfront property',
|
|
52
|
+
price: '₹12,500',
|
|
53
|
+
originalPrice: '₹15,000',
|
|
54
|
+
rating: '4.8',
|
|
55
|
+
location: 'Goa, India',
|
|
56
|
+
image_signed_urls: ['https://example.com/hotel.jpg'],
|
|
57
|
+
tags: ['Pool', 'Spa', 'Beach Access'],
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
function MyComponent() {
|
|
61
|
+
return (
|
|
62
|
+
<Card
|
|
63
|
+
item={hotelData}
|
|
64
|
+
onSelect={(item) => console.log('Selected:', item)}
|
|
65
|
+
onExpand={(item) => console.log('Expanded:', item)}
|
|
66
|
+
/>
|
|
67
|
+
);
|
|
68
|
+
}
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### Import Everything
|
|
72
|
+
|
|
73
|
+
```tsx
|
|
74
|
+
import {
|
|
75
|
+
// DLS
|
|
76
|
+
colors,
|
|
77
|
+
spacing,
|
|
78
|
+
tokens,
|
|
79
|
+
|
|
80
|
+
// Recommendation
|
|
81
|
+
Card,
|
|
82
|
+
RecommendationCard,
|
|
83
|
+
|
|
84
|
+
// Types
|
|
85
|
+
HotelItem,
|
|
86
|
+
FlightItem,
|
|
87
|
+
CabItem,
|
|
88
|
+
} from '@crew-copilot/recommendation-ui';
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
## Development
|
|
92
|
+
|
|
93
|
+
```bash
|
|
94
|
+
# Install dependencies
|
|
95
|
+
cd packages/recommendation-ui
|
|
96
|
+
yarn install
|
|
97
|
+
|
|
98
|
+
# Build the library
|
|
99
|
+
yarn build
|
|
100
|
+
|
|
101
|
+
# Watch mode for development
|
|
102
|
+
yarn dev
|
|
103
|
+
|
|
104
|
+
# Type check
|
|
105
|
+
yarn type-check
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
## Library Structure
|
|
109
|
+
|
|
110
|
+
```
|
|
111
|
+
src/
|
|
112
|
+
├── index.ts # Main entry point
|
|
113
|
+
├── dls/ # Design Language System
|
|
114
|
+
│ ├── index.ts
|
|
115
|
+
│ └── tokens/
|
|
116
|
+
│ ├── colors.ts
|
|
117
|
+
│ ├── spacing.ts
|
|
118
|
+
│ ├── typography.ts
|
|
119
|
+
│ └── index.ts
|
|
120
|
+
└── recommendation/ # Recommendation components
|
|
121
|
+
├── index.ts
|
|
122
|
+
├── types.ts
|
|
123
|
+
└── components/
|
|
124
|
+
├── Card.tsx
|
|
125
|
+
└── index.ts
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
## Consuming in Other Packages
|
|
129
|
+
|
|
130
|
+
### In crew-website (Vite)
|
|
131
|
+
|
|
132
|
+
```tsx
|
|
133
|
+
// Already configured in yarn workspaces
|
|
134
|
+
import { Card } from '@crew-copilot/recommendation-ui';
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
### In crew-app (React Native / Expo)
|
|
138
|
+
|
|
139
|
+
```tsx
|
|
140
|
+
// Add to package.json dependencies:
|
|
141
|
+
// "@crew-copilot/recommendation-ui": "workspace:*"
|
|
142
|
+
|
|
143
|
+
import { tokens, Card } from '@crew-copilot/recommendation-ui';
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
## Future Additions
|
|
147
|
+
|
|
148
|
+
- [ ] HotelCard component
|
|
149
|
+
- [ ] FlightCard component
|
|
150
|
+
- [ ] CabCard component
|
|
151
|
+
- [ ] VoteButton component
|
|
152
|
+
- [ ] BottomMsgBar component
|
|
153
|
+
- [ ] React Native Web primitives
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
import { jsxs, jsx } from "react/jsx-runtime";
|
|
2
|
+
import { c as colors, s as spacing, t as textStyles } from "./typography-zz5GzgjI.js";
|
|
3
|
+
function r(e) {
|
|
4
|
+
var t, f, n = "";
|
|
5
|
+
if ("string" == typeof e || "number" == typeof e) n += e;
|
|
6
|
+
else if ("object" == typeof e) if (Array.isArray(e)) {
|
|
7
|
+
var o = e.length;
|
|
8
|
+
for (t = 0; t < o; t++) e[t] && (f = r(e[t])) && (n && (n += " "), n += f);
|
|
9
|
+
} else for (f in e) e[f] && (n && (n += " "), n += f);
|
|
10
|
+
return n;
|
|
11
|
+
}
|
|
12
|
+
function clsx() {
|
|
13
|
+
for (var e, t, f = 0, n = "", o = arguments.length; f < o; f++) (e = arguments[f]) && (t = r(e)) && (n && (n += " "), n += t);
|
|
14
|
+
return n;
|
|
15
|
+
}
|
|
16
|
+
const Card = ({
|
|
17
|
+
item,
|
|
18
|
+
onSelect,
|
|
19
|
+
onExpand,
|
|
20
|
+
isSelected = false,
|
|
21
|
+
isExpanded = false
|
|
22
|
+
}) => {
|
|
23
|
+
var _a, _b, _c;
|
|
24
|
+
const handleClick = () => {
|
|
25
|
+
if (onExpand) {
|
|
26
|
+
onExpand(item);
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
const handleSelect = (e) => {
|
|
30
|
+
e.stopPropagation();
|
|
31
|
+
if (onSelect) {
|
|
32
|
+
onSelect(item);
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
const imageUrl = ((_a = item.image_signed_urls) == null ? void 0 : _a[0]) || ((_c = (_b = item.image) == null ? void 0 : _b[0]) == null ? void 0 : _c.data);
|
|
36
|
+
return /* @__PURE__ */ jsxs(
|
|
37
|
+
"div",
|
|
38
|
+
{
|
|
39
|
+
onClick: handleClick,
|
|
40
|
+
className: clsx(
|
|
41
|
+
"recommendation-card",
|
|
42
|
+
isSelected && "recommendation-card--selected",
|
|
43
|
+
isExpanded && "recommendation-card--expanded"
|
|
44
|
+
),
|
|
45
|
+
style: {
|
|
46
|
+
display: "flex",
|
|
47
|
+
flexDirection: "column",
|
|
48
|
+
backgroundColor: isSelected ? colors.card.selected.dark : colors.card.background.dark,
|
|
49
|
+
borderRadius: 16,
|
|
50
|
+
overflow: "hidden",
|
|
51
|
+
cursor: "pointer",
|
|
52
|
+
transition: "all 0.2s ease-in-out",
|
|
53
|
+
border: `1px solid ${isSelected ? colors.primary[500] : colors.card.border.dark}`
|
|
54
|
+
},
|
|
55
|
+
children: [
|
|
56
|
+
imageUrl && /* @__PURE__ */ jsx(
|
|
57
|
+
"div",
|
|
58
|
+
{
|
|
59
|
+
style: {
|
|
60
|
+
width: "100%",
|
|
61
|
+
height: 180,
|
|
62
|
+
overflow: "hidden"
|
|
63
|
+
},
|
|
64
|
+
children: /* @__PURE__ */ jsx(
|
|
65
|
+
"img",
|
|
66
|
+
{
|
|
67
|
+
src: imageUrl,
|
|
68
|
+
alt: item.title,
|
|
69
|
+
style: {
|
|
70
|
+
width: "100%",
|
|
71
|
+
height: "100%",
|
|
72
|
+
objectFit: "cover"
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
)
|
|
76
|
+
}
|
|
77
|
+
),
|
|
78
|
+
/* @__PURE__ */ jsxs(
|
|
79
|
+
"div",
|
|
80
|
+
{
|
|
81
|
+
style: {
|
|
82
|
+
padding: spacing[4],
|
|
83
|
+
display: "flex",
|
|
84
|
+
flexDirection: "column",
|
|
85
|
+
gap: spacing[2]
|
|
86
|
+
},
|
|
87
|
+
children: [
|
|
88
|
+
/* @__PURE__ */ jsx(
|
|
89
|
+
"h3",
|
|
90
|
+
{
|
|
91
|
+
style: {
|
|
92
|
+
...textStyles.cardTitle,
|
|
93
|
+
color: colors.neutral[0],
|
|
94
|
+
margin: 0
|
|
95
|
+
},
|
|
96
|
+
children: item.title
|
|
97
|
+
}
|
|
98
|
+
),
|
|
99
|
+
item.subtitle && /* @__PURE__ */ jsx(
|
|
100
|
+
"p",
|
|
101
|
+
{
|
|
102
|
+
style: {
|
|
103
|
+
...textStyles.cardSubtitle,
|
|
104
|
+
color: colors.neutral[400],
|
|
105
|
+
margin: 0
|
|
106
|
+
},
|
|
107
|
+
children: item.subtitle
|
|
108
|
+
}
|
|
109
|
+
),
|
|
110
|
+
item.tags && item.tags.length > 0 && /* @__PURE__ */ jsx(
|
|
111
|
+
"div",
|
|
112
|
+
{
|
|
113
|
+
style: {
|
|
114
|
+
display: "flex",
|
|
115
|
+
flexWrap: "wrap",
|
|
116
|
+
gap: spacing[1]
|
|
117
|
+
},
|
|
118
|
+
children: item.tags.map((tag, index) => /* @__PURE__ */ jsx(
|
|
119
|
+
"span",
|
|
120
|
+
{
|
|
121
|
+
style: {
|
|
122
|
+
...textStyles.caption,
|
|
123
|
+
backgroundColor: colors.primary[900],
|
|
124
|
+
color: colors.primary[300],
|
|
125
|
+
padding: `${spacing[0.5]}px ${spacing[2]}px`,
|
|
126
|
+
borderRadius: 4
|
|
127
|
+
},
|
|
128
|
+
children: tag
|
|
129
|
+
},
|
|
130
|
+
index
|
|
131
|
+
))
|
|
132
|
+
}
|
|
133
|
+
),
|
|
134
|
+
/* @__PURE__ */ jsxs(
|
|
135
|
+
"div",
|
|
136
|
+
{
|
|
137
|
+
style: {
|
|
138
|
+
display: "flex",
|
|
139
|
+
alignItems: "baseline",
|
|
140
|
+
gap: spacing[2],
|
|
141
|
+
marginTop: spacing[2]
|
|
142
|
+
},
|
|
143
|
+
children: [
|
|
144
|
+
/* @__PURE__ */ jsx(
|
|
145
|
+
"span",
|
|
146
|
+
{
|
|
147
|
+
style: {
|
|
148
|
+
...textStyles.cardPrice,
|
|
149
|
+
color: colors.neutral[0]
|
|
150
|
+
},
|
|
151
|
+
children: item.price
|
|
152
|
+
}
|
|
153
|
+
),
|
|
154
|
+
item.originalPrice && /* @__PURE__ */ jsx(
|
|
155
|
+
"span",
|
|
156
|
+
{
|
|
157
|
+
style: {
|
|
158
|
+
...textStyles.bodySmall,
|
|
159
|
+
color: colors.neutral[500],
|
|
160
|
+
textDecoration: "line-through"
|
|
161
|
+
},
|
|
162
|
+
children: item.originalPrice
|
|
163
|
+
}
|
|
164
|
+
)
|
|
165
|
+
]
|
|
166
|
+
}
|
|
167
|
+
),
|
|
168
|
+
/* @__PURE__ */ jsx(
|
|
169
|
+
"button",
|
|
170
|
+
{
|
|
171
|
+
onClick: handleSelect,
|
|
172
|
+
style: {
|
|
173
|
+
marginTop: spacing[2],
|
|
174
|
+
padding: `${spacing[2]}px ${spacing[4]}px`,
|
|
175
|
+
backgroundColor: isSelected ? colors.success[600] : colors.primary[600],
|
|
176
|
+
color: colors.neutral[0],
|
|
177
|
+
border: "none",
|
|
178
|
+
borderRadius: 8,
|
|
179
|
+
cursor: "pointer",
|
|
180
|
+
...textStyles.label,
|
|
181
|
+
transition: "background-color 0.2s ease-in-out"
|
|
182
|
+
},
|
|
183
|
+
children: isSelected ? "✓ Selected" : "Select"
|
|
184
|
+
}
|
|
185
|
+
)
|
|
186
|
+
]
|
|
187
|
+
}
|
|
188
|
+
)
|
|
189
|
+
]
|
|
190
|
+
}
|
|
191
|
+
);
|
|
192
|
+
};
|
|
193
|
+
Card.displayName = "RecommendationCard";
|
|
194
|
+
export {
|
|
195
|
+
Card as C
|
|
196
|
+
};
|
|
197
|
+
//# sourceMappingURL=Card-C6fF0ZrH.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Card-C6fF0ZrH.js","sources":["../../../node_modules/clsx/dist/clsx.mjs","../src/recommendation/components/Card.tsx"],"sourcesContent":["function r(e){var t,f,n=\"\";if(\"string\"==typeof e||\"number\"==typeof e)n+=e;else if(\"object\"==typeof e)if(Array.isArray(e)){var o=e.length;for(t=0;t<o;t++)e[t]&&(f=r(e[t]))&&(n&&(n+=\" \"),n+=f)}else for(f in e)e[f]&&(n&&(n+=\" \"),n+=f);return n}export function clsx(){for(var e,t,f=0,n=\"\",o=arguments.length;f<o;f++)(e=arguments[f])&&(t=r(e))&&(n&&(n+=\" \"),n+=t);return n}export default clsx;","import React from 'react';\nimport { clsx } from 'clsx';\nimport { colors, spacing, textStyles } from '../../dls/tokens';\nimport type { BaseRecommendationItem, RecommendationCardProps } from '../types';\n\n/**\n * Base Recommendation Card Component\n * \n * This is a generic card that can display any recommendation item.\n * Specific card types (Hotel, Flight, Cab) will extend this.\n */\nexport const Card = <T extends BaseRecommendationItem>({\n item,\n onSelect,\n onExpand,\n isSelected = false,\n isExpanded = false,\n}: RecommendationCardProps<T>) => {\n const handleClick = () => {\n if (onExpand) {\n onExpand(item);\n }\n };\n\n const handleSelect = (e: React.MouseEvent) => {\n e.stopPropagation();\n if (onSelect) {\n onSelect(item);\n }\n };\n\n // Get the first image URL\n const imageUrl = item.image_signed_urls?.[0] || item.image?.[0]?.data;\n\n return (\n <div\n onClick={handleClick}\n className={clsx(\n 'recommendation-card',\n isSelected && 'recommendation-card--selected',\n isExpanded && 'recommendation-card--expanded'\n )}\n style={{\n display: 'flex',\n flexDirection: 'column',\n backgroundColor: isSelected ? colors.card.selected.dark : colors.card.background.dark,\n borderRadius: 16,\n overflow: 'hidden',\n cursor: 'pointer',\n transition: 'all 0.2s ease-in-out',\n border: `1px solid ${isSelected ? colors.primary[500] : colors.card.border.dark}`,\n }}\n >\n {/* Image Section */}\n {imageUrl && (\n <div\n style={{\n width: '100%',\n height: 180,\n overflow: 'hidden',\n }}\n >\n <img\n src={imageUrl}\n alt={item.title}\n style={{\n width: '100%',\n height: '100%',\n objectFit: 'cover',\n }}\n />\n </div>\n )}\n\n {/* Content Section */}\n <div\n style={{\n padding: spacing[4],\n display: 'flex',\n flexDirection: 'column',\n gap: spacing[2],\n }}\n >\n {/* Title */}\n <h3\n style={{\n ...textStyles.cardTitle,\n color: colors.neutral[0],\n margin: 0,\n }}\n >\n {item.title}\n </h3>\n\n {/* Subtitle */}\n {item.subtitle && (\n <p\n style={{\n ...textStyles.cardSubtitle,\n color: colors.neutral[400],\n margin: 0,\n }}\n >\n {item.subtitle}\n </p>\n )}\n\n {/* Tags */}\n {item.tags && item.tags.length > 0 && (\n <div\n style={{\n display: 'flex',\n flexWrap: 'wrap',\n gap: spacing[1],\n }}\n >\n {item.tags.map((tag, index) => (\n <span\n key={index}\n style={{\n ...textStyles.caption,\n backgroundColor: colors.primary[900],\n color: colors.primary[300],\n padding: `${spacing[0.5]}px ${spacing[2]}px`,\n borderRadius: 4,\n }}\n >\n {tag}\n </span>\n ))}\n </div>\n )}\n\n {/* Price Section */}\n <div\n style={{\n display: 'flex',\n alignItems: 'baseline',\n gap: spacing[2],\n marginTop: spacing[2],\n }}\n >\n <span\n style={{\n ...textStyles.cardPrice,\n color: colors.neutral[0],\n }}\n >\n {item.price}\n </span>\n {item.originalPrice && (\n <span\n style={{\n ...textStyles.bodySmall,\n color: colors.neutral[500],\n textDecoration: 'line-through',\n }}\n >\n {item.originalPrice}\n </span>\n )}\n </div>\n\n {/* Select Button */}\n <button\n onClick={handleSelect}\n style={{\n marginTop: spacing[2],\n padding: `${spacing[2]}px ${spacing[4]}px`,\n backgroundColor: isSelected ? colors.success[600] : colors.primary[600],\n color: colors.neutral[0],\n border: 'none',\n borderRadius: 8,\n cursor: 'pointer',\n ...textStyles.label,\n transition: 'background-color 0.2s ease-in-out',\n }}\n >\n {isSelected ? '✓ Selected' : 'Select'}\n </button>\n </div>\n </div>\n );\n};\n\nCard.displayName = 'RecommendationCard';\n\nexport default Card;\n\n"],"names":[],"mappings":"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","x_google_ignoreList":[0]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/dls/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,cAAc,UAAU,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { t as textStyles, e as letterSpacing, l as lineHeight, d as fontWeight, b as fontSize, f as fontFamily, a as semanticSpacing, s as spacing, c as colors } from "../typography-zz5GzgjI.js";
|
|
2
|
+
const tokens = {
|
|
3
|
+
colors,
|
|
4
|
+
spacing,
|
|
5
|
+
semanticSpacing,
|
|
6
|
+
fontFamily,
|
|
7
|
+
fontSize,
|
|
8
|
+
fontWeight,
|
|
9
|
+
lineHeight,
|
|
10
|
+
letterSpacing,
|
|
11
|
+
textStyles
|
|
12
|
+
};
|
|
13
|
+
export {
|
|
14
|
+
colors,
|
|
15
|
+
fontFamily,
|
|
16
|
+
fontSize,
|
|
17
|
+
fontWeight,
|
|
18
|
+
letterSpacing,
|
|
19
|
+
lineHeight,
|
|
20
|
+
semanticSpacing,
|
|
21
|
+
spacing,
|
|
22
|
+
textStyles,
|
|
23
|
+
tokens
|
|
24
|
+
};
|
|
25
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/dls/tokens/index.ts"],"sourcesContent":["/**\n * Design Language System - Tokens\n * Export all design tokens from a single entry point\n */\n\nexport * from './colors';\nexport * from './spacing';\nexport * from './typography';\n\n// Combined tokens object for convenience\nimport { colors } from './colors';\nimport { spacing, semanticSpacing } from './spacing';\nimport { fontFamily, fontSize, fontWeight, lineHeight, letterSpacing, textStyles } from './typography';\n\nexport const tokens = {\n colors,\n spacing,\n semanticSpacing,\n fontFamily,\n fontSize,\n fontWeight,\n lineHeight,\n letterSpacing,\n textStyles,\n} as const;\n\nexport type Tokens = typeof tokens;\n\n"],"names":[],"mappings":";AAcO,MAAM,SAAS;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Color tokens for the Crew Design Language System
|
|
3
|
+
* These colors are used across all recommendation cards and UI components
|
|
4
|
+
*/
|
|
5
|
+
export declare const colors: {
|
|
6
|
+
readonly primary: {
|
|
7
|
+
readonly 50: "#f0f9ff";
|
|
8
|
+
readonly 100: "#e0f2fe";
|
|
9
|
+
readonly 200: "#bae6fd";
|
|
10
|
+
readonly 300: "#7dd3fc";
|
|
11
|
+
readonly 400: "#38bdf8";
|
|
12
|
+
readonly 500: "#0ea5e9";
|
|
13
|
+
readonly 600: "#0284c7";
|
|
14
|
+
readonly 700: "#0369a1";
|
|
15
|
+
readonly 800: "#075985";
|
|
16
|
+
readonly 900: "#0c4a6e";
|
|
17
|
+
};
|
|
18
|
+
readonly neutral: {
|
|
19
|
+
readonly 0: "#ffffff";
|
|
20
|
+
readonly 50: "#fafafa";
|
|
21
|
+
readonly 100: "#f4f4f5";
|
|
22
|
+
readonly 200: "#e4e4e7";
|
|
23
|
+
readonly 300: "#d4d4d8";
|
|
24
|
+
readonly 400: "#a1a1aa";
|
|
25
|
+
readonly 500: "#71717a";
|
|
26
|
+
readonly 600: "#52525b";
|
|
27
|
+
readonly 700: "#3f3f46";
|
|
28
|
+
readonly 800: "#27272a";
|
|
29
|
+
readonly 900: "#18181b";
|
|
30
|
+
readonly 950: "#09090b";
|
|
31
|
+
};
|
|
32
|
+
readonly success: {
|
|
33
|
+
readonly 50: "#f0fdf4";
|
|
34
|
+
readonly 100: "#dcfce7";
|
|
35
|
+
readonly 500: "#22c55e";
|
|
36
|
+
readonly 600: "#16a34a";
|
|
37
|
+
readonly 700: "#15803d";
|
|
38
|
+
};
|
|
39
|
+
readonly warning: {
|
|
40
|
+
readonly 50: "#fffbeb";
|
|
41
|
+
readonly 100: "#fef3c7";
|
|
42
|
+
readonly 500: "#f59e0b";
|
|
43
|
+
readonly 600: "#d97706";
|
|
44
|
+
readonly 700: "#b45309";
|
|
45
|
+
};
|
|
46
|
+
readonly error: {
|
|
47
|
+
readonly 50: "#fef2f2";
|
|
48
|
+
readonly 100: "#fee2e2";
|
|
49
|
+
readonly 500: "#ef4444";
|
|
50
|
+
readonly 600: "#dc2626";
|
|
51
|
+
readonly 700: "#b91c1c";
|
|
52
|
+
};
|
|
53
|
+
readonly card: {
|
|
54
|
+
readonly background: {
|
|
55
|
+
readonly light: "#ffffff";
|
|
56
|
+
readonly dark: "#1a1a1a";
|
|
57
|
+
};
|
|
58
|
+
readonly border: {
|
|
59
|
+
readonly light: "#e4e4e7";
|
|
60
|
+
readonly dark: "#3f3f46";
|
|
61
|
+
};
|
|
62
|
+
readonly selected: {
|
|
63
|
+
readonly light: "#e0f2fe";
|
|
64
|
+
readonly dark: "#0c4a6e";
|
|
65
|
+
};
|
|
66
|
+
};
|
|
67
|
+
readonly categoryHue: {
|
|
68
|
+
readonly hotel: 220;
|
|
69
|
+
readonly flight: 200;
|
|
70
|
+
readonly cab: 35;
|
|
71
|
+
readonly restaurant: 15;
|
|
72
|
+
readonly gifting: 280;
|
|
73
|
+
readonly default: 220;
|
|
74
|
+
};
|
|
75
|
+
};
|
|
76
|
+
export type Colors = typeof colors;
|
|
77
|
+
//# sourceMappingURL=colors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"colors.d.ts","sourceRoot":"","sources":["../../../src/dls/tokens/colors.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmFT,CAAC;AAEX,MAAM,MAAM,MAAM,GAAG,OAAO,MAAM,CAAC"}
|