@times-design-system/theme-android 1.5.0 → 1.6.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/README.md +314 -0
- package/dist/TimesSpacing.kt +22 -22
- package/dist/TimesTypography.kt +164 -124
- package/dist/interfaces/TDSChannelsColors.kt +316 -280
- package/dist/interfaces/TDSColors.kt +150 -117
- package/dist/interfaces/TDSSpacing.kt +27 -0
- package/dist/interfaces/TDSTypography.kt +134 -0
- package/dist/palettes/DarkBrandColors.kt +140 -160
- package/dist/palettes/DarkBusinessColors.kt +67 -27
- package/dist/palettes/DarkChannelsColors.kt +315 -273
- package/dist/palettes/DarkCommentColors.kt +68 -28
- package/dist/palettes/DarkCoreColors.kt +189 -156
- package/dist/palettes/DarkCultureColors.kt +67 -27
- package/dist/palettes/DarkDataVisualisationColors.kt +196 -196
- package/dist/palettes/DarkHomeColors.kt +67 -27
- package/dist/palettes/DarkIrelandColors.kt +68 -28
- package/dist/palettes/DarkLifeAndStyleColors.kt +68 -28
- package/dist/palettes/DarkMoneyColors.kt +68 -29
- package/dist/palettes/DarkObituariesColors.kt +67 -27
- package/dist/palettes/DarkPuzzlesColors.kt +68 -26
- package/dist/palettes/DarkSportColors.kt +67 -27
- package/dist/palettes/DarkTravelColors.kt +68 -28
- package/dist/palettes/DarkUkColors.kt +68 -27
- package/dist/palettes/DarkWorldColors.kt +68 -28
- package/dist/palettes/LightBrandColors.kt +140 -160
- package/dist/palettes/LightBusinessColors.kt +51 -20
- package/dist/palettes/LightChannelsColors.kt +315 -273
- package/dist/palettes/LightCommentColors.kt +51 -20
- package/dist/palettes/LightCoreColors.kt +192 -155
- package/dist/palettes/LightCultureColors.kt +51 -20
- package/dist/palettes/LightDataVisualisationColors.kt +196 -196
- package/dist/palettes/LightHomeColors.kt +51 -19
- package/dist/palettes/LightIrelandColors.kt +51 -20
- package/dist/palettes/LightLifeAndStyleColors.kt +51 -20
- package/dist/palettes/LightMoneyColors.kt +51 -20
- package/dist/palettes/LightObituariesColors.kt +51 -20
- package/dist/palettes/LightPuzzlesColors.kt +51 -18
- package/dist/palettes/LightSportColors.kt +51 -20
- package/dist/palettes/LightTravelColors.kt +51 -20
- package/dist/palettes/LightUkColors.kt +51 -20
- package/dist/palettes/LightWorldColors.kt +51 -20
- package/package.json +2 -2
- package/dist/interfaces/TDSBrandColors.kt +0 -172
- package/dist/interfaces/TDSDataVisualisationColors.kt +0 -208
- package/dist/interfaces/TDSMarketingColors.kt +0 -22
- package/dist/palettes/DarkMarketingColors.kt +0 -16
- package/dist/palettes/LightMarketingColors.kt +0 -16
package/README.md
ADDED
|
@@ -0,0 +1,314 @@
|
|
|
1
|
+
# @times-design-system/theme-android
|
|
2
|
+
|
|
3
|
+
Times Design System theme package for Android with Kotlin color definitions, typography tokens, and Compose support for building themed Android applications.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @times-design-system/theme-android
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Contents
|
|
12
|
+
|
|
13
|
+
### Kotlin Color & Typography Files
|
|
14
|
+
|
|
15
|
+
Pre-generated Kotlin files for Android color and typography assets:
|
|
16
|
+
|
|
17
|
+
```
|
|
18
|
+
dist/
|
|
19
|
+
├── TimesTypography.kt # Typography token definitions
|
|
20
|
+
├── TimesSpacing.kt # Spacing token definitions (Dp values)
|
|
21
|
+
└── palettes/
|
|
22
|
+
├── DarkCoreColors.kt
|
|
23
|
+
├── LightCoreColors.kt
|
|
24
|
+
├── DarkBrandColors.kt
|
|
25
|
+
├── LightBrandColors.kt
|
|
26
|
+
├── DarkChannelsColors.kt
|
|
27
|
+
├── LightChannelsColors.kt
|
|
28
|
+
└── ... (30+ color definition files)
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## Usage
|
|
32
|
+
|
|
33
|
+
### In Your Android Project
|
|
34
|
+
|
|
35
|
+
1. **Copy the generated files** to your Android project:
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
cp -r node_modules/@times-design-system/theme-android/dist/* app/src/main/kotlin/com/yourcompany/designsystem/
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
2. **Use in Kotlin code**:
|
|
42
|
+
|
|
43
|
+
```kotlin
|
|
44
|
+
import androidx.compose.ui.graphics.Color
|
|
45
|
+
import androidx.compose.material3.Surface
|
|
46
|
+
import androidx.compose.material3.Text
|
|
47
|
+
|
|
48
|
+
@Composable
|
|
49
|
+
fun MyScreen() {
|
|
50
|
+
val colors = DarkCoreColors()
|
|
51
|
+
|
|
52
|
+
Surface(
|
|
53
|
+
color = colors.surfaceCanvas,
|
|
54
|
+
modifier = Modifier.fillMaxSize()
|
|
55
|
+
) {
|
|
56
|
+
Text(
|
|
57
|
+
text = "Hello World",
|
|
58
|
+
color = colors.textPrimary,
|
|
59
|
+
fontSize = TimesTypography.display100.fontSize
|
|
60
|
+
)
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
### Jetpack Compose Integration
|
|
66
|
+
|
|
67
|
+
```kotlin
|
|
68
|
+
import androidx.compose.foundation.background
|
|
69
|
+
import androidx.compose.foundation.layout.Box
|
|
70
|
+
import androidx.compose.foundation.layout.padding
|
|
71
|
+
import androidx.compose.material3.Button
|
|
72
|
+
import androidx.compose.material3.ButtonDefaults
|
|
73
|
+
import androidx.compose.material3.Text
|
|
74
|
+
import androidx.compose.runtime.Composable
|
|
75
|
+
import androidx.compose.ui.Modifier
|
|
76
|
+
import androidx.compose.ui.unit.dp
|
|
77
|
+
|
|
78
|
+
@Composable
|
|
79
|
+
fun StyledCard() {
|
|
80
|
+
val darkColors = DarkCoreColors()
|
|
81
|
+
|
|
82
|
+
Box(
|
|
83
|
+
modifier = Modifier
|
|
84
|
+
.background(color = darkColors.surfaceLevel1)
|
|
85
|
+
.padding(TimesSpacing.spacing100.value.dp)
|
|
86
|
+
) {
|
|
87
|
+
Button(
|
|
88
|
+
onClick = { },
|
|
89
|
+
colors = ButtonDefaults.buttonColors(
|
|
90
|
+
containerColor = darkColors.interactivePrimaryFillDefault,
|
|
91
|
+
contentColor = darkColors.interactivePrimaryTextDefault
|
|
92
|
+
)
|
|
93
|
+
) {
|
|
94
|
+
Text("Click Me")
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
### Using Material Design 3 Integration
|
|
101
|
+
|
|
102
|
+
```kotlin
|
|
103
|
+
import androidx.compose.material3.MaterialTheme
|
|
104
|
+
import androidx.compose.material3.lightColorScheme
|
|
105
|
+
import androidx.compose.material3.darkColorScheme
|
|
106
|
+
import androidx.compose.runtime.Composable
|
|
107
|
+
|
|
108
|
+
private val LightColorPalette = lightColorScheme(
|
|
109
|
+
primary = Color(0xFF135DCB), // Brand primary
|
|
110
|
+
secondary = Color(0xFF595959), // Semantic secondary
|
|
111
|
+
tertiary = Color(0xFFA6A6A6), // Semantic tertiary
|
|
112
|
+
surface = Color(0xFFFFFFFF), // Surface canvas
|
|
113
|
+
onSurface = Color(0xFF1A1A1A), // Text primary
|
|
114
|
+
error = Color(0xFFFF0000) // Feedback error
|
|
115
|
+
)
|
|
116
|
+
|
|
117
|
+
private val DarkColorPalette = darkColorScheme(
|
|
118
|
+
primary = Color(0xFF135DCB),
|
|
119
|
+
secondary = Color(0xFF595959),
|
|
120
|
+
tertiary = Color(0xFFA6A6A6),
|
|
121
|
+
surface = Color(0xFF000000),
|
|
122
|
+
onSurface = Color(0xFFFFFFFF),
|
|
123
|
+
error = Color(0xFFFF1A1A)
|
|
124
|
+
)
|
|
125
|
+
|
|
126
|
+
@Composable
|
|
127
|
+
fun TimesDesignSystemTheme(
|
|
128
|
+
darkTheme: Boolean = isSystemInDarkTheme(),
|
|
129
|
+
content: @Composable () -> Unit
|
|
130
|
+
) {
|
|
131
|
+
val colorScheme = if (darkTheme) DarkColorPalette else LightColorPalette
|
|
132
|
+
|
|
133
|
+
MaterialTheme(
|
|
134
|
+
colorScheme = colorScheme,
|
|
135
|
+
content = content
|
|
136
|
+
)
|
|
137
|
+
}
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
## Token Categories
|
|
141
|
+
|
|
142
|
+
### Colors (2,700+)
|
|
143
|
+
|
|
144
|
+
#### Core Colors (Semantic)
|
|
145
|
+
|
|
146
|
+
```kotlin
|
|
147
|
+
surfaceCanvas // Background
|
|
148
|
+
surfaceLevel1-4 // Surface elevation levels
|
|
149
|
+
textPrimary // Primary text
|
|
150
|
+
textSecondary // Secondary text
|
|
151
|
+
borderPrimary // Primary border
|
|
152
|
+
interactivePrimary // Primary interactive elements
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
#### Brand & Channel Colors
|
|
156
|
+
|
|
157
|
+
```kotlin
|
|
158
|
+
brandCoreRampHome500 // Home channel
|
|
159
|
+
brandCoreRampBusiness500 // Business channel
|
|
160
|
+
brandCoreRampSport500 // Sport channel
|
|
161
|
+
brandChannelsRampMoney500 // Money channel
|
|
162
|
+
// ... and more
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
#### Interactive & Feedback Colors
|
|
166
|
+
|
|
167
|
+
```kotlin
|
|
168
|
+
interactivePrimaryFillDefault // Button styles
|
|
169
|
+
interactiveDisabledA/B/C // Disabled states
|
|
170
|
+
feedbackErrorFill // Error states
|
|
171
|
+
feedbackSuccessFill // Success states
|
|
172
|
+
inputBorderError // Input errors
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
### Spacing (20 values)
|
|
176
|
+
|
|
177
|
+
```kotlin
|
|
178
|
+
object TimesSpacing {
|
|
179
|
+
val spacing025 = 4.dp // 0.25rem
|
|
180
|
+
val spacing050 = 8.dp // 0.5rem
|
|
181
|
+
val spacing100 = 16.dp // 1rem
|
|
182
|
+
val spacing200 = 24.dp // 1.5rem
|
|
183
|
+
val spacing300 = 32.dp // 2rem
|
|
184
|
+
val spacing400 = 40.dp // 2.5rem
|
|
185
|
+
}
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
### Typography
|
|
189
|
+
|
|
190
|
+
```kotlin
|
|
191
|
+
object TimesTypography {
|
|
192
|
+
val display100 = TextStyle(
|
|
193
|
+
fontSize = 36.sp,
|
|
194
|
+
lineHeight = 43.2.sp,
|
|
195
|
+
fontFamily = FontFamily.Serif,
|
|
196
|
+
fontWeight = FontWeight.Bold
|
|
197
|
+
)
|
|
198
|
+
|
|
199
|
+
val bodyRegular = TextStyle(
|
|
200
|
+
fontSize = 16.sp,
|
|
201
|
+
lineHeight = 24.sp,
|
|
202
|
+
fontFamily = FontFamily.Serif,
|
|
203
|
+
fontWeight = FontWeight.Normal
|
|
204
|
+
)
|
|
205
|
+
}
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
## Dark Mode Support
|
|
209
|
+
|
|
210
|
+
All color files include both light and dark variants:
|
|
211
|
+
|
|
212
|
+
```kotlin
|
|
213
|
+
// Automatic switching based on system theme
|
|
214
|
+
val colors = if (isSystemInDarkTheme()) {
|
|
215
|
+
DarkCoreColors()
|
|
216
|
+
} else {
|
|
217
|
+
LightCoreColors()
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
// Use with Compose
|
|
221
|
+
Surface(
|
|
222
|
+
color = colors.surfaceCanvas,
|
|
223
|
+
contentColor = colors.textPrimary
|
|
224
|
+
) {
|
|
225
|
+
// Content...
|
|
226
|
+
}
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
## File Structure
|
|
230
|
+
|
|
231
|
+
```
|
|
232
|
+
dist/
|
|
233
|
+
├── TimesTypography.kt # Typography definitions
|
|
234
|
+
├── TimesSpacing.kt # Spacing/Dimen definitions
|
|
235
|
+
└── palettes/
|
|
236
|
+
├── DarkCoreColors.kt
|
|
237
|
+
├── LightCoreColors.kt
|
|
238
|
+
├── DarkBrandColors.kt
|
|
239
|
+
├── LightBrandColors.kt
|
|
240
|
+
├── DarkChannelsColors.kt
|
|
241
|
+
├── LightChannelsColors.kt
|
|
242
|
+
├── DarkDataVisualisationColors.kt
|
|
243
|
+
├── DarkMarketingColors.kt
|
|
244
|
+
└── ... (25+ more palettes)
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
## Compatibility
|
|
248
|
+
|
|
249
|
+
- **Android**: 5.0+ (API 21+)
|
|
250
|
+
- **Kotlin**: 1.5.0+
|
|
251
|
+
- **Jetpack Compose**: 1.0.0+
|
|
252
|
+
- **Gradle**: 7.0+
|
|
253
|
+
|
|
254
|
+
## Best Practices
|
|
255
|
+
|
|
256
|
+
### 1. Use Semantic Tokens
|
|
257
|
+
|
|
258
|
+
```kotlin
|
|
259
|
+
// ✅ Good - Use semantic tokens
|
|
260
|
+
Surface(color = colors.surfaceCanvas)
|
|
261
|
+
Text(color = colors.textPrimary)
|
|
262
|
+
|
|
263
|
+
// ❌ Avoid - Hard-coded colors
|
|
264
|
+
Surface(color = Color(0xFF000000))
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
### 2. Support Dark Mode
|
|
268
|
+
|
|
269
|
+
```kotlin
|
|
270
|
+
// ✅ Good - Responsive to system theme
|
|
271
|
+
val colors = if (isSystemInDarkTheme()) DarkCoreColors() else LightCoreColors()
|
|
272
|
+
|
|
273
|
+
// ❌ Avoid - Always light
|
|
274
|
+
val colors = LightCoreColors()
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
### 3. Use Spacing Tokens
|
|
278
|
+
|
|
279
|
+
```kotlin
|
|
280
|
+
// ✅ Good
|
|
281
|
+
modifier = Modifier.padding(TimesSpacing.spacing100)
|
|
282
|
+
|
|
283
|
+
// ❌ Avoid
|
|
284
|
+
modifier = Modifier.padding(16.dp)
|
|
285
|
+
```
|
|
286
|
+
|
|
287
|
+
## Building
|
|
288
|
+
|
|
289
|
+
To rebuild after token changes:
|
|
290
|
+
|
|
291
|
+
```bash
|
|
292
|
+
npm run build
|
|
293
|
+
```
|
|
294
|
+
|
|
295
|
+
This generates:
|
|
296
|
+
|
|
297
|
+
- Kotlin color class definitions
|
|
298
|
+
- Removes duplicate values (deduplication)
|
|
299
|
+
- Distributes files to dist/
|
|
300
|
+
|
|
301
|
+
## Deduplication
|
|
302
|
+
|
|
303
|
+
The build process automatically removes duplicate color values that exist in core reference files:
|
|
304
|
+
|
|
305
|
+
```bash
|
|
306
|
+
npm run dedupe # Run deduplication only
|
|
307
|
+
npm run build # Build with automatic deduplication
|
|
308
|
+
```
|
|
309
|
+
|
|
310
|
+
This reduces file size and eliminates color redundancy across palette files.
|
|
311
|
+
|
|
312
|
+
## License
|
|
313
|
+
|
|
314
|
+
ISC
|
package/dist/TimesSpacing.kt
CHANGED
|
@@ -3,26 +3,26 @@ package uk.co.thetimes.timesDesignSystem
|
|
|
3
3
|
import androidx.compose.ui.unit.dp
|
|
4
4
|
import androidx.compose.ui.unit.Dp
|
|
5
5
|
|
|
6
|
-
class
|
|
7
|
-
val spacingStatic10: Dp = 18.dp
|
|
8
|
-
val spacingStatic11: Dp = 20.dp
|
|
9
|
-
val spacingStatic12: Dp = 23.dp
|
|
10
|
-
val spacingStatic13: Dp = 24.dp
|
|
11
|
-
val spacingStatic14: Dp = 28.dp
|
|
12
|
-
val spacingStatic15: Dp = 32.dp
|
|
13
|
-
val spacingStatic16: Dp = 36.dp
|
|
14
|
-
val spacingStatic17: Dp = 40.dp
|
|
15
|
-
val spacingStatic18: Dp = 48.dp
|
|
16
|
-
val spacingStatic19: Dp = 56.dp
|
|
17
|
-
val spacingStatic20: Dp = 64.dp
|
|
18
|
-
val spacingStatic21: Dp = 80.dp
|
|
19
|
-
val spacingStatic01: Dp = 2.dp
|
|
20
|
-
val spacingStatic02: Dp = 3.dp
|
|
21
|
-
val spacingStatic03: Dp = 4.dp
|
|
22
|
-
val spacingStatic04: Dp = 6.dp
|
|
23
|
-
val spacingStatic05: Dp = 8.dp
|
|
24
|
-
val spacingStatic06: Dp = 10.dp
|
|
25
|
-
val spacingStatic07: Dp = 12.dp
|
|
26
|
-
val spacingStatic08: Dp = 14.dp
|
|
27
|
-
val spacingStatic09: Dp = 16.dp
|
|
6
|
+
class TDSSpacingImpl : TDSSpacing {
|
|
7
|
+
override val spacingStatic10: Dp = 18.dp
|
|
8
|
+
override val spacingStatic11: Dp = 20.dp
|
|
9
|
+
override val spacingStatic12: Dp = 23.dp
|
|
10
|
+
override val spacingStatic13: Dp = 24.dp
|
|
11
|
+
override val spacingStatic14: Dp = 28.dp
|
|
12
|
+
override val spacingStatic15: Dp = 32.dp
|
|
13
|
+
override val spacingStatic16: Dp = 36.dp
|
|
14
|
+
override val spacingStatic17: Dp = 40.dp
|
|
15
|
+
override val spacingStatic18: Dp = 48.dp
|
|
16
|
+
override val spacingStatic19: Dp = 56.dp
|
|
17
|
+
override val spacingStatic20: Dp = 64.dp
|
|
18
|
+
override val spacingStatic21: Dp = 80.dp
|
|
19
|
+
override val spacingStatic01: Dp = 2.dp
|
|
20
|
+
override val spacingStatic02: Dp = 3.dp
|
|
21
|
+
override val spacingStatic03: Dp = 4.dp
|
|
22
|
+
override val spacingStatic04: Dp = 6.dp
|
|
23
|
+
override val spacingStatic05: Dp = 8.dp
|
|
24
|
+
override val spacingStatic06: Dp = 10.dp
|
|
25
|
+
override val spacingStatic07: Dp = 12.dp
|
|
26
|
+
override val spacingStatic08: Dp = 14.dp
|
|
27
|
+
override val spacingStatic09: Dp = 16.dp
|
|
28
28
|
}
|