@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.
Files changed (47) hide show
  1. package/README.md +314 -0
  2. package/dist/TimesSpacing.kt +22 -22
  3. package/dist/TimesTypography.kt +164 -124
  4. package/dist/interfaces/TDSChannelsColors.kt +316 -280
  5. package/dist/interfaces/TDSColors.kt +150 -117
  6. package/dist/interfaces/TDSSpacing.kt +27 -0
  7. package/dist/interfaces/TDSTypography.kt +134 -0
  8. package/dist/palettes/DarkBrandColors.kt +140 -160
  9. package/dist/palettes/DarkBusinessColors.kt +67 -27
  10. package/dist/palettes/DarkChannelsColors.kt +315 -273
  11. package/dist/palettes/DarkCommentColors.kt +68 -28
  12. package/dist/palettes/DarkCoreColors.kt +189 -156
  13. package/dist/palettes/DarkCultureColors.kt +67 -27
  14. package/dist/palettes/DarkDataVisualisationColors.kt +196 -196
  15. package/dist/palettes/DarkHomeColors.kt +67 -27
  16. package/dist/palettes/DarkIrelandColors.kt +68 -28
  17. package/dist/palettes/DarkLifeAndStyleColors.kt +68 -28
  18. package/dist/palettes/DarkMoneyColors.kt +68 -29
  19. package/dist/palettes/DarkObituariesColors.kt +67 -27
  20. package/dist/palettes/DarkPuzzlesColors.kt +68 -26
  21. package/dist/palettes/DarkSportColors.kt +67 -27
  22. package/dist/palettes/DarkTravelColors.kt +68 -28
  23. package/dist/palettes/DarkUkColors.kt +68 -27
  24. package/dist/palettes/DarkWorldColors.kt +68 -28
  25. package/dist/palettes/LightBrandColors.kt +140 -160
  26. package/dist/palettes/LightBusinessColors.kt +51 -20
  27. package/dist/palettes/LightChannelsColors.kt +315 -273
  28. package/dist/palettes/LightCommentColors.kt +51 -20
  29. package/dist/palettes/LightCoreColors.kt +192 -155
  30. package/dist/palettes/LightCultureColors.kt +51 -20
  31. package/dist/palettes/LightDataVisualisationColors.kt +196 -196
  32. package/dist/palettes/LightHomeColors.kt +51 -19
  33. package/dist/palettes/LightIrelandColors.kt +51 -20
  34. package/dist/palettes/LightLifeAndStyleColors.kt +51 -20
  35. package/dist/palettes/LightMoneyColors.kt +51 -20
  36. package/dist/palettes/LightObituariesColors.kt +51 -20
  37. package/dist/palettes/LightPuzzlesColors.kt +51 -18
  38. package/dist/palettes/LightSportColors.kt +51 -20
  39. package/dist/palettes/LightTravelColors.kt +51 -20
  40. package/dist/palettes/LightUkColors.kt +51 -20
  41. package/dist/palettes/LightWorldColors.kt +51 -20
  42. package/package.json +2 -2
  43. package/dist/interfaces/TDSBrandColors.kt +0 -172
  44. package/dist/interfaces/TDSDataVisualisationColors.kt +0 -208
  45. package/dist/interfaces/TDSMarketingColors.kt +0 -22
  46. package/dist/palettes/DarkMarketingColors.kt +0 -16
  47. 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
@@ -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 TimesSpacing {
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
  }