@ticketlayer/theme 0.1.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/tokens.json ADDED
@@ -0,0 +1,323 @@
1
+ {
2
+ "version": 1,
3
+ "prefix": "tl",
4
+ "description": "The Ticketlayer Live design tokens. This file is the source: every --tl-* custom property, every typed value a native harness reads, and the JSON schema the theme editor and the sales-channel theme API validate against are generated from it by scripts/generate.mjs. Nothing here is generated; nothing generated from here is edited.",
5
+ "groups": {
6
+ "color": {
7
+ "title": "Colour",
8
+ "stripPrefix": "",
9
+ "description": "Palette. A channel theme overrides these through colours on GET /sales/theme."
10
+ },
11
+ "typography": {
12
+ "title": "Type",
13
+ "stripPrefix": "",
14
+ "description": "Font stacks and the base size the type scale is built from."
15
+ },
16
+ "radius": {
17
+ "title": "Radius",
18
+ "stripPrefix": "radius-",
19
+ "description": "Corner radii. A channel theme overrides these through shape."
20
+ },
21
+ "spacing": {
22
+ "title": "Spacing",
23
+ "stripPrefix": "spacing-",
24
+ "description": "The spacing step scale. Not themeable through the API today."
25
+ },
26
+ "motion": {
27
+ "title": "Motion",
28
+ "stripPrefix": "",
29
+ "description": "Durations and easings. Not themeable through the API today."
30
+ }
31
+ },
32
+ "tokens": {
33
+ "primary": {
34
+ "group": "color",
35
+ "value": "#6366f1",
36
+ "dark": "#818cf8",
37
+ "themeKey": "colors.primary",
38
+ "aliases": ["color-primary"],
39
+ "description": "The channel's brand colour; buttons, links and selected state."
40
+ },
41
+ "primary-foreground": {
42
+ "group": "color",
43
+ "value": "#ffffff",
44
+ "dark": "#111827",
45
+ "themeKey": "colors.primaryForeground",
46
+ "aliases": ["color-primary-foreground"],
47
+ "description": "Text and icons on a primary surface."
48
+ },
49
+ "secondary": {
50
+ "group": "color",
51
+ "value": "#f3f4f6",
52
+ "dark": "#1f2937",
53
+ "themeKey": "colors.secondary",
54
+ "aliases": ["color-secondary"],
55
+ "description": "A quieter filled surface: secondary buttons and chips."
56
+ },
57
+ "secondary-foreground": {
58
+ "group": "color",
59
+ "value": "#111827",
60
+ "dark": "#f9fafb",
61
+ "themeKey": "colors.secondaryForeground",
62
+ "aliases": ["color-secondary-foreground"],
63
+ "description": "Text on a secondary surface."
64
+ },
65
+ "accent": {
66
+ "group": "color",
67
+ "value": "#ec4899",
68
+ "dark": "#f472b6",
69
+ "themeKey": "colors.accent",
70
+ "aliases": ["color-accent"],
71
+ "description": "A second brand colour for highlights. No element uses it yet; it exists because the theme API accepts it."
72
+ },
73
+ "accent-foreground": {
74
+ "group": "color",
75
+ "value": "#ffffff",
76
+ "dark": "#111827",
77
+ "themeKey": "colors.accentForeground",
78
+ "aliases": ["color-accent-foreground"],
79
+ "description": "Text on an accent surface."
80
+ },
81
+ "background": {
82
+ "group": "color",
83
+ "value": "#ffffff",
84
+ "dark": "#0b0f19",
85
+ "themeKey": "colors.background",
86
+ "aliases": ["color-background"],
87
+ "description": "The page surface an element sits on."
88
+ },
89
+ "foreground": {
90
+ "group": "color",
91
+ "value": "#111827",
92
+ "dark": "#f9fafb",
93
+ "themeKey": "colors.foreground",
94
+ "aliases": ["color-foreground"],
95
+ "description": "Body text."
96
+ },
97
+ "card": {
98
+ "group": "color",
99
+ "value": "#ffffff",
100
+ "dark": "#111827",
101
+ "aliases": ["color-card"],
102
+ "description": "A raised surface inside the page. Not themeable through the API today; it follows background."
103
+ },
104
+ "muted": {
105
+ "group": "color",
106
+ "value": "#f9fafb",
107
+ "dark": "#111827",
108
+ "themeKey": "colors.muted",
109
+ "aliases": ["color-muted"],
110
+ "description": "A recessed surface: table stripes, empty state, disabled fills."
111
+ },
112
+ "muted-foreground": {
113
+ "group": "color",
114
+ "value": "#6b7280",
115
+ "dark": "#9ca3af",
116
+ "themeKey": "colors.mutedForeground",
117
+ "aliases": ["color-muted-foreground"],
118
+ "description": "Secondary text: captions, hints, metadata."
119
+ },
120
+ "border": {
121
+ "group": "color",
122
+ "value": "#e5e7eb",
123
+ "dark": "#374151",
124
+ "themeKey": "colors.border",
125
+ "aliases": ["color-border"],
126
+ "description": "Hairlines and control outlines."
127
+ },
128
+ "border-hover": {
129
+ "group": "color",
130
+ "value": "#9ca3af",
131
+ "dark": "#4b5563",
132
+ "aliases": ["color-border-hover"],
133
+ "description": "A control outline under the pointer. Not themeable through the API today."
134
+ },
135
+ "input": {
136
+ "group": "color",
137
+ "value": "#e5e7eb",
138
+ "dark": "#374151",
139
+ "themeKey": "colors.input",
140
+ "aliases": ["color-input"],
141
+ "description": "The outline of a text input. No element uses it yet; it exists because the theme API accepts it."
142
+ },
143
+ "ring": {
144
+ "group": "color",
145
+ "value": "#6366f1",
146
+ "dark": "#818cf8",
147
+ "themeKey": "colors.ring",
148
+ "aliases": ["color-ring"],
149
+ "description": "The focus ring."
150
+ },
151
+ "success": {
152
+ "group": "color",
153
+ "value": "#10b981",
154
+ "dark": "#34d399",
155
+ "themeKey": "colors.success",
156
+ "aliases": ["color-success"],
157
+ "description": "A confirmed state: an order placed, a code accepted."
158
+ },
159
+ "success-foreground": {
160
+ "group": "color",
161
+ "value": "#ffffff",
162
+ "dark": "#062a1d",
163
+ "themeKey": "colors.successForeground",
164
+ "aliases": ["color-success-foreground"],
165
+ "description": "Text on a success surface."
166
+ },
167
+ "warning": {
168
+ "group": "color",
169
+ "value": "#f59e0b",
170
+ "dark": "#fbbf24",
171
+ "themeKey": "colors.warning",
172
+ "aliases": ["color-warning"],
173
+ "description": "A cart about to expire, a low-stock notice."
174
+ },
175
+ "warning-foreground": {
176
+ "group": "color",
177
+ "value": "#ffffff",
178
+ "dark": "#2a1a02",
179
+ "themeKey": "colors.warningForeground",
180
+ "aliases": ["color-warning-foreground"],
181
+ "description": "Text on a warning surface."
182
+ },
183
+ "warning-bg": {
184
+ "group": "color",
185
+ "value": "#fef3c7",
186
+ "dark": "#422006",
187
+ "aliases": ["color-warning-bg"],
188
+ "description": "The tinted background of a warning banner. Not themeable through the API today."
189
+ },
190
+ "error": {
191
+ "group": "color",
192
+ "value": "#ef4444",
193
+ "dark": "#f87171",
194
+ "themeKey": "colors.destructive",
195
+ "aliases": ["color-error", "destructive", "color-destructive"],
196
+ "description": "A failed payment, a rejected code. The theme API calls this colour destructive; the elements call it error, so both names resolve."
197
+ },
198
+ "error-foreground": {
199
+ "group": "color",
200
+ "value": "#ffffff",
201
+ "dark": "#2a0a0a",
202
+ "themeKey": "colors.destructiveForeground",
203
+ "aliases": ["color-error-foreground", "destructive-foreground", "color-destructive-foreground"],
204
+ "description": "Text on an error surface."
205
+ },
206
+ "error-bg": {
207
+ "group": "color",
208
+ "value": "#fee2e2",
209
+ "dark": "#450a0a",
210
+ "aliases": ["color-error-bg", "destructive-bg", "color-destructive-bg"],
211
+ "description": "The tinted background of an error banner. Not themeable through the API today."
212
+ },
213
+ "font-family": {
214
+ "group": "typography",
215
+ "value": "system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif",
216
+ "themeKey": "typography.fontFamily",
217
+ "description": "The body font stack."
218
+ },
219
+ "font-family-mono": {
220
+ "group": "typography",
221
+ "value": "ui-monospace, SFMono-Regular, 'SF Mono', Menlo, monospace",
222
+ "themeKey": "typography.fontFamilyMono",
223
+ "description": "The stack for order references, codes and seat labels."
224
+ },
225
+ "font-size-base": {
226
+ "group": "typography",
227
+ "value": "16px",
228
+ "themeKey": "typography.baseSize",
229
+ "aliases": ["base-size"],
230
+ "description": "The root size the scale is built from. The alias exists because Backstage's theme designer emits --tl-base-size and this client emits --tl-font-size-base."
231
+ },
232
+ "font-scale": {
233
+ "group": "typography",
234
+ "value": "1.25",
235
+ "themeKey": "typography.scaleRatio",
236
+ "themeValueType": "number",
237
+ "description": "The ratio between steps of the type scale."
238
+ },
239
+ "radius-none": {
240
+ "group": "radius",
241
+ "value": "0px",
242
+ "themeKey": "shape.radiusNone",
243
+ "description": "No rounding."
244
+ },
245
+ "radius-sm": {
246
+ "group": "radius",
247
+ "value": "0.25rem",
248
+ "themeKey": "shape.radiusSm",
249
+ "description": "Badges, tags, small controls."
250
+ },
251
+ "radius-md": {
252
+ "group": "radius",
253
+ "value": "0.5rem",
254
+ "themeKey": "shape.radiusMd",
255
+ "aliases": ["radius"],
256
+ "description": "Buttons, inputs, cards. The bare --tl-radius alias exists because several stylesheets already ask for it."
257
+ },
258
+ "radius-lg": {
259
+ "group": "radius",
260
+ "value": "0.75rem",
261
+ "themeKey": "shape.radiusLg",
262
+ "description": "Panels, drawers, modals."
263
+ },
264
+ "radius-full": {
265
+ "group": "radius",
266
+ "value": "9999px",
267
+ "themeKey": "shape.radiusFull",
268
+ "description": "Pills and circular controls."
269
+ },
270
+ "spacing-1": { "group": "spacing", "value": "0.25rem", "description": "Step 1." },
271
+ "spacing-2": { "group": "spacing", "value": "0.5rem", "description": "Step 2." },
272
+ "spacing-3": { "group": "spacing", "value": "0.75rem", "description": "Step 3." },
273
+ "spacing-4": { "group": "spacing", "value": "1rem", "description": "Step 4, the base step." },
274
+ "spacing-5": { "group": "spacing", "value": "1.25rem", "description": "Step 5." },
275
+ "spacing-6": { "group": "spacing", "value": "1.5rem", "description": "Step 6." },
276
+ "spacing-8": { "group": "spacing", "value": "2rem", "description": "Step 8." },
277
+ "duration-fast": { "group": "motion", "value": "120ms", "description": "Hover and press feedback." },
278
+ "duration-normal": { "group": "motion", "value": "200ms", "description": "Panels and disclosure." },
279
+ "duration-slow": { "group": "motion", "value": "320ms", "description": "A drawer or modal entering." },
280
+ "easing-standard": { "group": "motion", "value": "cubic-bezier(0.2, 0, 0, 1)", "description": "The default curve." },
281
+ "easing-emphasised": { "group": "motion", "value": "cubic-bezier(0.3, 0, 0, 1)", "description": "For something entering the screen." }
282
+ },
283
+ "themeDocument": {
284
+ "title": "TicketlayerTheme",
285
+ "description": "The theme document a sales channel stores and GET /sales/theme returns. Its colours, typography and shape sections are exactly the tokens above that carry a themeKey; brand and design are not tokens and are described here.",
286
+ "sections": {
287
+ "brand": {
288
+ "description": "Identity that is not a token.",
289
+ "properties": {
290
+ "logoUrl": { "type": "string", "description": "The logo shown on a light surface." },
291
+ "logoDarkUrl": { "type": "string", "description": "The logo shown on a dark surface." },
292
+ "faviconUrl": { "type": "string", "description": "The storefront favicon." },
293
+ "displayName": { "type": "string", "description": "The name shown in place of the organisation's." }
294
+ }
295
+ },
296
+ "design": {
297
+ "description": "Layout choices the hosted storefront reads. Open ended on purpose: unknown keys pass through.",
298
+ "additionalProperties": true,
299
+ "nullable": true,
300
+ "properties": {
301
+ "heroLayout": {
302
+ "type": "object",
303
+ "description": "How an event page leads.",
304
+ "properties": {
305
+ "type": { "type": "string", "enum": ["cinema", "hero"] },
306
+ "size": { "type": "string", "enum": ["small", "medium", "large"] }
307
+ },
308
+ "required": ["type", "size"]
309
+ },
310
+ "cinemaGradient": {
311
+ "type": "object",
312
+ "description": "The gradient over a cinema hero.",
313
+ "properties": {
314
+ "strength": { "type": "number", "enum": [70, 50, 20] },
315
+ "position": { "type": "string", "enum": ["bottom", "center"] }
316
+ },
317
+ "required": ["strength", "position"]
318
+ }
319
+ }
320
+ }
321
+ }
322
+ }
323
+ }