@supertype.ai/foundations 0.1.28 → 0.1.30

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 (54) hide show
  1. package/README.md +27 -23
  2. package/bin/foundations.mjs +5 -2
  3. package/dist/blocks/accordion.js +2 -1
  4. package/dist/blocks/badge.d.ts +27 -0
  5. package/dist/blocks/badge.js +86 -0
  6. package/dist/blocks/button.d.ts +32 -0
  7. package/dist/blocks/button.js +127 -0
  8. package/dist/blocks/callout.d.ts +2 -39
  9. package/dist/blocks/callout.js +13 -38
  10. package/dist/blocks/card.d.ts +5 -6
  11. package/dist/blocks/card.js +28 -12
  12. package/dist/blocks/focus.d.ts +9 -0
  13. package/dist/blocks/focus.js +9 -0
  14. package/dist/blocks/index.d.ts +3 -1
  15. package/dist/blocks/index.js +3 -1
  16. package/dist/blocks/interactive-accordion.js +2 -1
  17. package/dist/blocks/render-as.d.ts +11 -0
  18. package/dist/blocks/render-as.js +22 -0
  19. package/dist/blocks/segment.d.ts +22 -14
  20. package/dist/blocks/segment.js +23 -14
  21. package/dist/blocks/tabs.d.ts +52 -17
  22. package/dist/blocks/tabs.js +86 -37
  23. package/dist/cjs/eslint.js +49 -14
  24. package/dist/contrast.d.ts +56 -0
  25. package/dist/contrast.js +144 -12
  26. package/dist/eslint.d.ts +42 -8
  27. package/dist/eslint.js +47 -14
  28. package/dist/essay/essay.js +14 -6
  29. package/dist/essay/index.d.ts +1 -1
  30. package/dist/essay/index.js +1 -1
  31. package/dist/essay/layout.d.ts +37 -1
  32. package/dist/essay/layout.js +33 -1
  33. package/dist/essay/rail.d.ts +11 -1
  34. package/dist/essay/reading.d.ts +1 -1
  35. package/dist/essay/scroll.js +1 -1
  36. package/dist/href.d.ts +42 -0
  37. package/dist/href.js +63 -0
  38. package/dist/index.d.ts +2 -0
  39. package/dist/index.js +9 -0
  40. package/dist/mdx.d.ts +26 -4
  41. package/dist/mdx.js +30 -4
  42. package/dist/tone.d.ts +130 -0
  43. package/dist/tone.js +140 -0
  44. package/dist/typography/header.d.ts +32 -2
  45. package/dist/typography/header.js +10 -5
  46. package/dist/typography/highlight.d.ts +7 -6
  47. package/dist/typography/highlight.js +15 -9
  48. package/dist/typography/paragraph.d.ts +12 -25
  49. package/dist/typography/paragraph.js +40 -29
  50. package/llms.txt +99 -22
  51. package/package.json +2 -1
  52. package/src/theme.css +143 -46
  53. package/src/tokens.css +5 -4
  54. package/src/type.css +1 -1
package/src/theme.css CHANGED
@@ -18,20 +18,31 @@
18
18
  other's, so the ink is what tells two swatches apart. checkSignals holds the
19
19
  fill to 3:1 and the ink to 4.5:1. */
20
20
  --color-terracotta: var(--terracotta);
21
- --color-terracotta-foreground: var(--terracotta-foreground);
21
+ --color-terracotta-ink: var(--terracotta-ink);
22
22
  --color-ochre: var(--ochre);
23
- --color-ochre-foreground: var(--ochre-foreground);
23
+ --color-ochre-ink: var(--ochre-ink);
24
24
  --color-moss: var(--moss);
25
- --color-moss-foreground: var(--moss-foreground);
25
+ --color-moss-ink: var(--moss-ink);
26
26
  --color-fern: var(--fern);
27
- --color-fern-foreground: var(--fern-foreground);
27
+ --color-fern-ink: var(--fern-ink);
28
28
  --color-sage: var(--sage);
29
- --color-sage-foreground: var(--sage-foreground);
29
+ --color-sage-ink: var(--sage-ink);
30
30
  --color-stone: var(--stone);
31
- --color-stone-foreground: var(--stone-foreground);
31
+ --color-stone-ink: var(--stone-ink);
32
32
  --color-fig: var(--fig);
33
- --color-fig-foreground: var(--fig-foreground);
33
+ --color-fig-ink: var(--fig-ink);
34
34
  --color-cocoa: var(--cocoa);
35
+ --color-cocoa-ink: var(--cocoa-ink);
36
+
37
+ /* Deprecated aliases. Registered so an unmigrated call site keeps rendering;
38
+ the ESLint rules flag it so it does not stay unmigrated. */
39
+ --color-terracotta-foreground: var(--terracotta-foreground);
40
+ --color-ochre-foreground: var(--ochre-foreground);
41
+ --color-moss-foreground: var(--moss-foreground);
42
+ --color-fern-foreground: var(--fern-foreground);
43
+ --color-sage-foreground: var(--sage-foreground);
44
+ --color-stone-foreground: var(--stone-foreground);
45
+ --color-fig-foreground: var(--fig-foreground);
35
46
  --color-cocoa-foreground: var(--cocoa-foreground);
36
47
 
37
48
  --color-chart-1: var(--chart-1);
@@ -57,11 +68,19 @@
57
68
  --shadow-recessed: var(--elevation-recessed);
58
69
 
59
70
  /* Additive scale off a 10px `lg` — fixed pixel offsets, so no oddball values a
60
- multiplicative scale would produce. `rounded-full` stays a pill. */
71
+ multiplicative scale would produce. `rounded-full` stays a pill.
72
+
73
+ The container rung was +4px, the one step in the run that was not 2, and 14px
74
+ on a card read softer than anything else the package draws — a panel rounder
75
+ than the button sitting inside it. At +2 the run below the marketing sizes is
76
+ 6 / 8 / 10 / 12, evenly spaced, and the jump to `2xl` is left to say what it
77
+ was always meant to: this one is a feature card, not a container. Card,
78
+ Accordion, and the MDX pre/img/table frames all step down together, which is
79
+ the point of moving the token rather than the five call sites. */
61
80
  --radius-sm: calc(var(--radius) - 4px); /* 6px */
62
81
  --radius-md: calc(var(--radius) - 2px); /* 8px — inputs, menus, small controls */
63
82
  --radius-lg: var(--radius); /* 10px — buttons, default control */
64
- --radius-xl: calc(var(--radius) + 4px); /* 14px — cards */
83
+ --radius-xl: calc(var(--radius) + 2px); /* 12px — cards, panels, framed blocks */
65
84
  --radius-2xl: calc(var(--radius) + 8px); /* 18px — marketing feature cards */
66
85
  --radius-3xl: calc(var(--radius) + 12px); /* 22px */
67
86
  --radius-4xl: calc(var(--radius) + 16px); /* 26px */
@@ -72,40 +91,74 @@
72
91
  both, so its label stays light in both. */
73
92
  --tint-foreground: hsl(0, 0%, 100%);
74
93
 
94
+ /* Which way a control moves under the pointer: away from the page, so it
95
+ deepens on latte and lifts on espresso. How far is the state's own
96
+ business, and hover spends 18%.
97
+
98
+ The extreme rather than `--foreground`, because mixing toward an ink that
99
+ already sits near the fill gives a step the size of the gap between them:
100
+ `--primary` moved 4.9 ΔL* on latte against 6.2 on espresso from the same
101
+ declaration, and read as no hover at all. Against black and white every
102
+ tone clears 6 ΔL* in both themes. */
103
+ --hover-toward: hsl(0, 0%, 0%);
75
104
 
76
- /* Status, on the same two-token rule as the categorical set below: the fill is
77
- a mark (3:1), the ink is the same hue as words (4.5:1). Nothing prints a
78
- label on a status fill orange cannot carry white text at any lightness. */
79
- --success: hsl(142 75% 31%);
105
+
106
+ /* Status, on the same three-cut rule as every other tone: the fill is a mark
107
+ (3:1), the `-ink` is that hue used as words (4.5:1), and the `-foreground`
108
+ is the label printed on the fill (4.5:1 against it). A filled status
109
+ control is a real thing — `Button tone="warn" variant="solid"` — so the
110
+ pair is measured rather than assumed. checkSignals holds all three. */
111
+ --success: hsl(142 75% 29%);
80
112
  --success-ink: hsl(142 68% 28%);
113
+ /* White clears 4.94:1 here. At the old 31% it measured 4.42:1, which passed
114
+ nothing and shipped anyway, because no component was checked against it. */
115
+ --success-foreground: var(--tint-foreground);
81
116
  /* Was 52%, which measured 2.27:1 on latte — a dot you could not see. */
82
117
  --warn: hsl(30 100% 43%);
83
118
  --warn-ink: hsl(22 85% 36%);
84
- /* Deprecated: --warn-foreground was always this ink, under shadcn's name for
85
- the opposite thing. Use --warn-ink; the ESLint rules flag the old name. */
86
- --warn-foreground: var(--warn-ink);
119
+ /* The label on the warn fill, and one value for both themes: amber is a mark
120
+ in each, so the ink that reads on it is deep in each. 4.84:1 on latte,
121
+ 6.70:1 on espresso. White measured 3.37:1 and 2.44:1. */
122
+ --warn-foreground: hsl(30 25% 12%);
87
123
  --info: hsl(211 80% 43%);
88
124
  --info-ink: hsl(211 80% 40%);
89
125
  /* Danger ships as an ink only: a vivid brick red harmonised toward terracotta. */
90
126
  --danger: hsl(5 72% 43%);
91
127
 
92
- /* Latte-warm greens, clays and stone. Both cuts of each hue, light theme. */
128
+ /* Latte-warm greens, clays and stone. Both cuts of each hue, light theme.
129
+ `-ink`, not `-foreground`: in this package `-foreground` is the label printed
130
+ on a fill and `-ink` is the hue used as words, and these are the latter —
131
+ `checkSignals` holds them to 4.5:1 against the page, and printing one on its
132
+ own fill measures about 1.2:1. They shipped under the wrong suffix for long
133
+ enough that a docs page believed it and rendered them as bare squares. The
134
+ old names are kept below as aliases; the ESLint rules flag them. */
93
135
  --terracotta: hsl(10 54% 60%);
94
- --terracotta-foreground: hsl(10 72% 40%);
136
+ --terracotta-ink: hsl(10 72% 40%);
95
137
  --ochre: hsl(44 60% 42%);
96
- --ochre-foreground: hsl(44 78% 27%);
138
+ --ochre-ink: hsl(44 78% 27%);
97
139
  --moss: hsl(68 42% 41%);
98
- --moss-foreground: hsl(68 60% 26%);
140
+ --moss-ink: hsl(68 60% 26%);
99
141
  --fern: hsl(133 30% 47%);
100
- --fern-foreground: hsl(133 48% 30%);
142
+ --fern-ink: hsl(133 48% 30%);
101
143
  --sage: hsl(168 28% 47%);
102
- --sage-foreground: hsl(168 46% 29%);
144
+ --sage-ink: hsl(168 46% 29%);
103
145
  --stone: hsl(202 24% 55%);
104
- --stone-foreground: hsl(202 42% 36%);
146
+ --stone-ink: hsl(202 42% 36%);
105
147
  --fig: hsl(332 32% 61%);
106
- --fig-foreground: hsl(332 50% 43%);
148
+ --fig-ink: hsl(332 50% 43%);
107
149
  --cocoa: hsl(20 16% 56%);
108
- --cocoa-foreground: hsl(20 34% 39%);
150
+ --cocoa-ink: hsl(20 34% 39%);
151
+
152
+ /* Deprecated: these were always the ink, under shadcn's name for the opposite
153
+ thing. Use `-ink`; the ESLint rules flag the old name. */
154
+ --terracotta-foreground: var(--terracotta-ink);
155
+ --ochre-foreground: var(--ochre-ink);
156
+ --moss-foreground: var(--moss-ink);
157
+ --fern-foreground: var(--fern-ink);
158
+ --sage-foreground: var(--sage-ink);
159
+ --stone-foreground: var(--stone-ink);
160
+ --fig-foreground: var(--fig-ink);
161
+ --cocoa-foreground: var(--cocoa-ink);
109
162
 
110
163
  --background: hsl(43 33% 96%); /* #FAF8F3 */
111
164
  /* Near-black keyed to the latte hue, not a neutral #333: grey reads cold over
@@ -117,6 +170,12 @@
117
170
  --popover-foreground: hsl(30 14% 12%);
118
171
  --primary: hsl(133 11% 33%); /* #4A5D4E */
119
172
  --primary-foreground: hsl(0 0% 100%);
173
+ /* The third cut, the one `--secondary` and every status hue already shipped.
174
+ A fill is a mark and words are read, so one value doing both jobs is tuned
175
+ for neither — and that is why the espresso CTA measured Lc 48.9 against
176
+ this theme's 89.3. On latte the two happen to coincide, so this is an
177
+ alias here and a value of its own under .dark. */
178
+ --primary-ink: var(--primary);
120
179
  /* Three tokens, because the accent pulls opposite ways: fill, the label on it,
121
180
  and the accent as text. Tuning any one for another sinks the third. */
122
181
  --secondary: hsl(14, 67%, 72%);
@@ -131,13 +190,23 @@
131
190
  --accent-foreground: hsl(133 11% 33%);
132
191
  --destructive: hsl(0 50% 36%);
133
192
  --destructive-foreground: hsl(0 0% 98%);
134
- /* Soft beige-grey, to keep a rule un-intrusive. */
135
- --border: hsl(40 15% 88%); /* #E3DFD8 */
193
+ /* Soft beige-grey, to keep a rule un-intrusive — but a rule still has to be
194
+ seen. L88 measured 1.20:1 on --background and 1.29:1 on --card, below the
195
+ 1.34:1 the dark twin at L22 was rejected for, so the light theme shipped the
196
+ fainter hairline of the two. L80 puts --card at 1.56:1, within a point of
197
+ the dark theme's 1.57:1, so the same border reads the same weight in both. */
198
+ --border: hsl(40 15% 80%); /* #CFC8BA */
136
199
  --input: var(--border);
137
200
  --ring: hsl(133 11% 33%); /* the brand green */
201
+ /* A series is a fill: docs/cli.md promises every one of them clears 3:1 on the
202
+ page and on a card, and until `checkSignals` measured them two did not. The
203
+ sand was the worst in the palette at 2.18:1 — a 43° hue on a 43° ground, the
204
+ same colour 36 points apart in lightness. Saturation rises as it darkens, or
205
+ it lands as mud rather than as sand. The six stay 17.1 ΔE76 apart at their
206
+ closest (chart-4 against chart-6), which is where the floor sat before. */
138
207
  --chart-1: hsl(133 18% 45%);
139
- --chart-2: hsl(14 47% 59%);
140
- --chart-3: hsl(43 33% 60%);
208
+ --chart-2: hsl(14 47% 56%); /* 2.98:1 at L59 */
209
+ --chart-3: hsl(43 45% 42%); /* 2.18:1 at 33% L60 */
141
210
  --chart-4: hsl(200 20% 50%);
142
211
  --chart-5: hsl(30 12% 40%);
143
212
  /* A muted teal: the one cool hue the warm set leaves open, and far enough from
@@ -155,21 +224,27 @@
155
224
  inset 0 1px 3px hsl(30 18% 12% / 0.07),
156
225
  inset 0 0 0 1px hsl(30 18% 12% / 0.03);
157
226
  --sidebar: hsl(40 25% 94%); /* #F5F2EC */
158
- --sidebar-foreground: hsl(0 0% 25%);
227
+ /* Warm-keyed like every other ink here. It shipped as hsl(0 0% 25%), the one
228
+ neutral grey in the light theme, on a surface hued at 40° — the same cold
229
+ read L146 rules out for --foreground. Same lightness step, 9.43:1. */
230
+ --sidebar-foreground: hsl(30 12% 24%);
159
231
  --sidebar-primary: hsl(133 11% 33%);
160
232
  --sidebar-primary-foreground: hsl(0 0% 100%);
161
233
  --sidebar-accent: hsl(133 15% 88%);
162
234
  --sidebar-accent-foreground: hsl(133 11% 25%);
163
- --sidebar-border: hsl(40 15% 88%);
235
+ /* A sidebar rule sits on --sidebar, not the page, and that surface is lighter
236
+ than --background — so it needs 2 points more than --border to read the same
237
+ (1.49:1, against the dark twin's 1.49:1). */
238
+ --sidebar-border: hsl(40 15% 77%);
164
239
  --sidebar-ring: hsl(133 11% 33%);
165
240
  }
166
241
 
167
242
  .dark {
243
+ --hover-toward: hsl(0, 0%, 100%);
168
244
  /* --success does not flip: the same green clears 3:1 on espresso as on latte. */
169
245
  --success-ink: hsl(142 55% 58%);
170
246
  --warn: hsl(30 90% 55%);
171
247
  --warn-ink: hsl(33 60% 72%);
172
- --warn-foreground: var(--warn-ink);
173
248
  --info: hsl(211 75% 60%);
174
249
  --info-ink: hsl(211 75% 64%);
175
250
  /* Soft terracotta-red. The light cut measured ~2.9:1 on espresso and read muddy. */
@@ -177,21 +252,29 @@
177
252
 
178
253
  /* Espresso twins: fills darken and inks lift to hold the same two bars. */
179
254
  --terracotta: hsl(10 54% 47%);
180
- --terracotta-foreground: hsl(10 66% 66%);
255
+ --terracotta-ink: hsl(10 66% 66%);
181
256
  --ochre: hsl(44 60% 33%);
182
- --ochre-foreground: hsl(44 72% 45%);
257
+ --ochre-ink: hsl(44 72% 45%);
183
258
  --moss: hsl(68 42% 32%);
184
- --moss-foreground: hsl(68 54% 43%);
259
+ --moss-ink: hsl(68 54% 43%);
185
260
  --fern: hsl(133 30% 37%);
186
- --fern-foreground: hsl(133 42% 49%);
261
+ --fern-ink: hsl(133 42% 49%);
187
262
  --sage: hsl(168 28% 37%);
188
- --sage-foreground: hsl(168 40% 49%);
263
+ --sage-ink: hsl(168 40% 49%);
189
264
  --stone: hsl(202 24% 42%);
190
- --stone-foreground: hsl(202 36% 60%);
265
+ --stone-ink: hsl(202 36% 60%);
191
266
  --fig: hsl(332 32% 49%);
192
- --fig-foreground: hsl(332 44% 67%);
267
+ --fig-ink: hsl(332 44% 67%);
193
268
  --cocoa: hsl(20 16% 44%);
194
- --cocoa-foreground: hsl(20 28% 62%);
269
+ --cocoa-ink: hsl(20 28% 62%);
270
+ --terracotta-foreground: var(--terracotta-ink);
271
+ --ochre-foreground: var(--ochre-ink);
272
+ --moss-foreground: var(--moss-ink);
273
+ --fern-foreground: var(--fern-ink);
274
+ --sage-foreground: var(--sage-ink);
275
+ --stone-foreground: var(--stone-ink);
276
+ --fig-foreground: var(--fig-ink);
277
+ --cocoa-foreground: var(--cocoa-ink);
195
278
 
196
279
  /* 4 points of lightness at L10 reads flat where the same 4 at L96 reads raised;
197
280
  ssite wrote `bg-card dark:bg-muted` at 109 sites before the ground dropped.
@@ -204,8 +287,14 @@
204
287
  --card-foreground: hsl(43 20% 92%);
205
288
  --popover: hsl(30 8% 14%);
206
289
  --popover-foreground: hsl(43 20% 92%);
207
- --primary: hsl(133 18% 58%); /* #7A9E7E */
208
- --primary-foreground: hsl(30 10% 13%);
290
+ /* Split in two, so each cut is tuned for its own job. The fill takes a white
291
+ label at Lc 83.0 against latte's 89.3, and still clears 3:1 as a mark on
292
+ espresso (3.36:1). The ink reads as words at Lc 73.8 against latte's 79.1.
293
+ Both sit inside the 15 Lc the themes are held to; the single token they
294
+ replace sat 30 Lc adrift on both counts. */
295
+ --primary: hsl(133 34% 34%);
296
+ --primary-foreground: var(--tint-foreground);
297
+ --primary-ink: hsl(133 26% 76%);
209
298
  /* Espresso twin: the fill darkens under a white label, the ink lifts as text. */
210
299
  --secondary: hsl(14, 64%, 37%);
211
300
  --secondary-foreground: hsl(0 0% 100%);
@@ -220,8 +309,12 @@
220
309
  --accent: hsl(133 12% 20%);
221
310
  --accent-foreground: hsl(133 18% 78%);
222
311
  /* Overwhelmingly an ink: sixty `text-destructive` sites, no fill carrying text.
223
- The light value measured 2.08:1 here — a colour, not words. */
224
- --destructive: hsl(0 65% 67%);
312
+ The light value measured 2.08:1 here — a colour, not words.
313
+ L67 read 4.48:1 on --muted, which is AA to two decimal places and under it
314
+ to three, on a surface with several hundred call sites. L68 is the smallest
315
+ step that clears with room to spare (4.64:1) rather than landing back on the
316
+ line; --background and --card, already clear, rise with it. */
317
+ --destructive: hsl(0 65% 68%);
225
318
  /* The ink is light here, so anything printed on it must be dark. Nothing does
226
319
  today; white would arm a 1.3:1 trap for whoever tries first. */
227
320
  --destructive-foreground: hsl(30 10% 10%);
@@ -234,7 +327,9 @@
234
327
  --chart-2: hsl(14 45% 55%);
235
328
  --chart-3: hsl(43 20% 70%);
236
329
  --chart-4: hsl(200 15% 55%);
237
- --chart-5: hsl(30 8% 35%);
330
+ /* The espresso twin of the light sand: 2.26:1 on --card, the same failure the
331
+ light theme carried, in the theme that usually gets tuned first. */
332
+ --chart-5: hsl(30 8% 46%);
238
333
  --chart-6: hsl(178 30% 52%);
239
334
  /* A warm tint reads as haze on espresso: deep black, more spread. */
240
335
  --elevation-raised:
@@ -251,7 +346,9 @@
251
346
  --sidebar-primary-foreground: hsl(133 20% 10%);
252
347
  --sidebar-accent: hsl(30 8% 19%);
253
348
  --sidebar-accent-foreground: hsl(43 20% 85%);
254
- --sidebar-border: hsl(30 8% 20%);
349
+ /* L20 measured 1.28:1 on --sidebar, the same too-faint rule the light theme
350
+ shipped. L24 is the twin of the light 1.49:1. */
351
+ --sidebar-border: hsl(30 8% 24%);
255
352
  --sidebar-ring: hsl(133 18% 58%);
256
353
  }
257
354
 
package/src/tokens.css CHANGED
@@ -15,6 +15,7 @@
15
15
  --color-popover-foreground: var(--popover-foreground);
16
16
  --color-primary: var(--primary);
17
17
  --color-primary-foreground: var(--primary-foreground);
18
+ --color-primary-ink: var(--primary-ink);
18
19
  --color-secondary: var(--secondary);
19
20
  --color-secondary-foreground: var(--secondary-foreground);
20
21
  --color-muted: var(--muted);
@@ -25,18 +26,18 @@
25
26
  --color-destructive-foreground: var(--destructive-foreground);
26
27
 
27
28
  /* Named for meaning, not hue: a `success` a project renders blue still reads
28
- right. Each status hue ships twice — the fill is a mark, the ink is words. */
29
+ right. The fill is a mark, the ink is words, the foreground is the label
30
+ printed on the fill. */
29
31
  --color-success: var(--success);
30
32
  --color-success-ink: var(--success-ink);
33
+ --color-success-foreground: var(--success-foreground);
31
34
  --color-warn: var(--warn);
32
35
  --color-warn-ink: var(--warn-ink);
36
+ --color-warn-foreground: var(--warn-foreground);
33
37
  --color-info: var(--info);
34
38
  --color-info-ink: var(--info-ink);
35
39
  --color-danger: var(--danger);
36
40
 
37
- /* Deprecated: this was always an ink. Use `warn-ink`. */
38
- --color-warn-foreground: var(--warn-foreground);
39
-
40
41
  --color-border: var(--border);
41
42
  --color-input: var(--input);
42
43
  --color-ring: var(--ring);
package/src/type.css CHANGED
@@ -39,7 +39,7 @@
39
39
 
40
40
  @layer base {
41
41
  :root {
42
- /* 680, not 600: Ubuntu Sans steps 500600 by 9.3% where Geist stepped 11.9%,
42
+ /* 680, not 600: Ubuntu Sans steps 500 to 600 by 9.3% where Geist stepped 11.9%,
43
43
  and panel titles stopped separating from the labels inside them. */
44
44
  --heading-weight: 680;
45
45
  }