pricing-renderer 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.
Files changed (85) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/LICENSE +21 -0
  3. package/README.md +419 -0
  4. package/THIRD_PARTY_NOTICES.md +10 -0
  5. package/custom-elements.json +122 -0
  6. package/dist/core/config.d.ts +6 -0
  7. package/dist/core/config.d.ts.map +1 -0
  8. package/dist/core/config.js +62 -0
  9. package/dist/core/config.js.map +1 -0
  10. package/dist/core/expression.d.ts +4 -0
  11. package/dist/core/expression.d.ts.map +1 -0
  12. package/dist/core/expression.js +583 -0
  13. package/dist/core/expression.js.map +1 -0
  14. package/dist/core/i18n.d.ts +10 -0
  15. package/dist/core/i18n.d.ts.map +1 -0
  16. package/dist/core/i18n.js +207 -0
  17. package/dist/core/i18n.js.map +1 -0
  18. package/dist/core/index.d.ts +9 -0
  19. package/dist/core/index.d.ts.map +1 -0
  20. package/dist/core/index.js +8 -0
  21. package/dist/core/index.js.map +1 -0
  22. package/dist/core/normalize.d.ts +4 -0
  23. package/dist/core/normalize.d.ts.map +1 -0
  24. package/dist/core/normalize.js +301 -0
  25. package/dist/core/normalize.js.map +1 -0
  26. package/dist/core/resolve.d.ts +6 -0
  27. package/dist/core/resolve.d.ts.map +1 -0
  28. package/dist/core/resolve.js +123 -0
  29. package/dist/core/resolve.js.map +1 -0
  30. package/dist/core/types.d.ts +308 -0
  31. package/dist/core/types.d.ts.map +1 -0
  32. package/dist/core/types.js +2 -0
  33. package/dist/core/types.js.map +1 -0
  34. package/dist/core/utils.d.ts +16 -0
  35. package/dist/core/utils.d.ts.map +1 -0
  36. package/dist/core/utils.js +125 -0
  37. package/dist/core/utils.js.map +1 -0
  38. package/dist/core/view-model.d.ts +9 -0
  39. package/dist/core/view-model.d.ts.map +1 -0
  40. package/dist/core/view-model.js +427 -0
  41. package/dist/core/view-model.js.map +1 -0
  42. package/dist/element/define.d.ts +6 -0
  43. package/dist/element/define.d.ts.map +1 -0
  44. package/dist/element/define.js +20 -0
  45. package/dist/element/define.js.map +1 -0
  46. package/dist/element/events.d.ts +31 -0
  47. package/dist/element/events.d.ts.map +1 -0
  48. package/dist/element/events.js +2 -0
  49. package/dist/element/events.js.map +1 -0
  50. package/dist/element/index.d.ts +8 -0
  51. package/dist/element/index.d.ts.map +1 -0
  52. package/dist/element/index.js +2 -0
  53. package/dist/element/index.js.map +1 -0
  54. package/dist/element/pricing-renderer-element.d.ts +152 -0
  55. package/dist/element/pricing-renderer-element.d.ts.map +1 -0
  56. package/dist/element/pricing-renderer-element.js +598 -0
  57. package/dist/element/pricing-renderer-element.js.map +1 -0
  58. package/dist/element/renderers.d.ts +43 -0
  59. package/dist/element/renderers.d.ts.map +1 -0
  60. package/dist/element/renderers.js +866 -0
  61. package/dist/element/renderers.js.map +1 -0
  62. package/dist/react/index.d.ts +55 -0
  63. package/dist/react/index.d.ts.map +1 -0
  64. package/dist/react/index.js +23 -0
  65. package/dist/react/index.js.map +1 -0
  66. package/dist/styles/base.css +1110 -0
  67. package/dist/styles/styles.css +2 -0
  68. package/dist/styles/theme.css +84 -0
  69. package/dist/yaml/index.d.ts +4 -0
  70. package/dist/yaml/index.d.ts.map +1 -0
  71. package/dist/yaml/index.js +3 -0
  72. package/dist/yaml/index.js.map +1 -0
  73. package/dist/yaml/load.d.ts +3 -0
  74. package/dist/yaml/load.d.ts.map +1 -0
  75. package/dist/yaml/load.js +97 -0
  76. package/dist/yaml/load.js.map +1 -0
  77. package/dist/yaml/parser.d.ts +4 -0
  78. package/dist/yaml/parser.d.ts.map +1 -0
  79. package/dist/yaml/parser.js +80 -0
  80. package/dist/yaml/parser.js.map +1 -0
  81. package/dist/yaml/types.d.ts +27 -0
  82. package/dist/yaml/types.d.ts.map +1 -0
  83. package/dist/yaml/types.js +2 -0
  84. package/dist/yaml/types.js.map +1 -0
  85. package/package.json +132 -0
@@ -0,0 +1,1110 @@
1
+ @layer pricing-renderer {
2
+ pricing-renderer[data-pr-root] {
3
+ display: block;
4
+ container: pricing-renderer / inline-size;
5
+ min-inline-size: 0;
6
+ color: var(--pr-color-text);
7
+ font: inherit;
8
+ line-height: 1.5;
9
+ text-rendering: optimizeLegibility;
10
+ }
11
+
12
+ pricing-renderer[data-pr-root],
13
+ pricing-renderer[data-pr-root] *,
14
+ pricing-renderer[data-pr-root] *::before,
15
+ pricing-renderer[data-pr-root] *::after {
16
+ box-sizing: border-box;
17
+ }
18
+
19
+ pricing-renderer[data-pr-root] :where(button, input, select, textarea) {
20
+ color: inherit;
21
+ font: inherit;
22
+ }
23
+
24
+ pricing-renderer[data-pr-root] :where(button, a, input, select):focus-visible {
25
+ outline: 2px solid var(--pr-color-focus);
26
+ outline-offset: 3px;
27
+ }
28
+
29
+ pricing-renderer[data-pr-root] :where(a) {
30
+ color: var(--pr-color-link);
31
+ text-underline-offset: 0.18em;
32
+ }
33
+
34
+ pricing-renderer[data-pr-root] .pr-sr-only {
35
+ position: absolute !important;
36
+ width: 1px !important;
37
+ height: 1px !important;
38
+ padding: 0 !important;
39
+ margin: -1px !important;
40
+ overflow: hidden !important;
41
+ clip: rect(0, 0, 0, 0) !important;
42
+ white-space: nowrap !important;
43
+ border: 0 !important;
44
+ }
45
+
46
+ pricing-renderer[data-pr-root] .pr-shell {
47
+ position: relative;
48
+ isolation: isolate;
49
+ inline-size: 100%;
50
+ min-inline-size: 0;
51
+ overflow-wrap: anywhere;
52
+ }
53
+
54
+ pricing-renderer[data-pr-root] .pr-content {
55
+ display: grid;
56
+ gap: var(--pr-space-section);
57
+ padding: var(--pr-shell-padding);
58
+ }
59
+
60
+ pricing-renderer[data-pr-root] .pr-hero {
61
+ display: grid;
62
+ justify-items: center;
63
+ max-inline-size: 760px;
64
+ margin-inline: auto;
65
+ text-align: center;
66
+ }
67
+
68
+ pricing-renderer[data-pr-root] .pr-hero__eyebrow,
69
+ pricing-renderer[data-pr-root] .pr-section__eyebrow {
70
+ margin: 0 0 var(--pr-space-2);
71
+ color: var(--pr-color-accent);
72
+ font-size: var(--pr-font-size-sm);
73
+ font-weight: 750;
74
+ letter-spacing: 0.09em;
75
+ text-transform: uppercase;
76
+ }
77
+
78
+ pricing-renderer[data-pr-root] .pr-hero__title {
79
+ margin: 0;
80
+ font-size: clamp(2rem, 8cqi, 4rem);
81
+ font-weight: 780;
82
+ letter-spacing: -0.045em;
83
+ line-height: 1.02;
84
+ text-wrap: balance;
85
+ }
86
+
87
+ pricing-renderer[data-pr-root] .pr-hero__subtitle {
88
+ max-inline-size: 62ch;
89
+ margin: var(--pr-space-4) 0 0;
90
+ color: var(--pr-color-muted);
91
+ font-size: var(--pr-font-size-lg);
92
+ text-wrap: pretty;
93
+ }
94
+
95
+ pricing-renderer[data-pr-root] .pr-tag-list {
96
+ display: flex;
97
+ flex-wrap: wrap;
98
+ justify-content: center;
99
+ gap: var(--pr-space-2);
100
+ padding: 0;
101
+ margin: var(--pr-space-5) 0 0;
102
+ list-style: none;
103
+ }
104
+
105
+ pricing-renderer[data-pr-root] .pr-tag,
106
+ pricing-renderer[data-pr-root] .pr-badge {
107
+ display: inline-flex;
108
+ align-items: center;
109
+ min-block-size: 28px;
110
+ padding: 0.2rem 0.65rem;
111
+ border: 1px solid var(--pr-color-border);
112
+ border-radius: 999px;
113
+ background: var(--pr-color-surface-raised);
114
+ color: var(--pr-color-muted);
115
+ font-size: var(--pr-font-size-xs);
116
+ font-weight: 700;
117
+ }
118
+
119
+ pricing-renderer[data-pr-root] .pr-badge[data-tone='accent'] {
120
+ border-color: color-mix(in srgb, var(--pr-color-accent) 45%, var(--pr-color-border));
121
+ background: color-mix(in srgb, var(--pr-color-accent) 11%, var(--pr-color-surface-raised));
122
+ color: var(--pr-color-link);
123
+ }
124
+
125
+ pricing-renderer[data-pr-root] .pr-badge[data-tone='success'] {
126
+ border-color: color-mix(in srgb, var(--pr-color-success) 42%, var(--pr-color-border));
127
+ background: color-mix(in srgb, var(--pr-color-success) 10%, var(--pr-color-surface-raised));
128
+ color: var(--pr-color-success);
129
+ }
130
+
131
+ pricing-renderer[data-pr-root] .pr-badge[data-tone='warning'] {
132
+ border-color: color-mix(in srgb, var(--pr-color-warning) 42%, var(--pr-color-border));
133
+ background: var(--pr-color-warning-surface);
134
+ color: var(--pr-color-warning);
135
+ }
136
+
137
+ pricing-renderer[data-pr-root] .pr-section,
138
+ pricing-renderer[data-pr-root] .pr-configurator,
139
+ pricing-renderer[data-pr-root] .pr-metadata {
140
+ min-inline-size: 0;
141
+ }
142
+
143
+ pricing-renderer[data-pr-root] .pr-section__heading {
144
+ display: flex;
145
+ align-items: end;
146
+ justify-content: space-between;
147
+ gap: var(--pr-space-4);
148
+ margin-block-end: var(--pr-space-5);
149
+ }
150
+
151
+ pricing-renderer[data-pr-root] :where(.pr-section__heading, .pr-configurator, .pr-metadata) h3 {
152
+ margin: 0;
153
+ font-size: var(--pr-font-size-2xl);
154
+ letter-spacing: -0.025em;
155
+ }
156
+
157
+ pricing-renderer[data-pr-root] .pr-billing {
158
+ width: fit-content;
159
+ max-width: 100%;
160
+ padding: 0;
161
+ margin: 0 auto;
162
+ border: 0;
163
+ }
164
+
165
+ pricing-renderer[data-pr-root] .pr-billing legend {
166
+ margin: 0 auto var(--pr-space-2);
167
+ color: var(--pr-color-muted);
168
+ font-size: var(--pr-font-size-sm);
169
+ font-weight: 700;
170
+ text-align: center;
171
+ }
172
+
173
+ pricing-renderer[data-pr-root] .pr-segmented {
174
+ display: flex;
175
+ max-inline-size: 100%;
176
+ padding: 4px;
177
+ overflow-x: auto;
178
+ border: 1px solid var(--pr-color-border);
179
+ border-radius: var(--pr-radius-pill);
180
+ background: var(--pr-color-surface-subtle);
181
+ }
182
+
183
+ pricing-renderer[data-pr-root] .pr-segmented__option {
184
+ position: relative;
185
+ display: grid;
186
+ flex: 1 0 auto;
187
+ place-items: center;
188
+ min-block-size: 44px;
189
+ padding: 0.35rem 1rem;
190
+ border-radius: var(--pr-radius-pill);
191
+ cursor: pointer;
192
+ }
193
+
194
+ pricing-renderer[data-pr-root] .pr-segmented__option input {
195
+ position: absolute;
196
+ inset: 0;
197
+ opacity: 0;
198
+ cursor: pointer;
199
+ }
200
+
201
+ pricing-renderer[data-pr-root] .pr-segmented__option:has(input:checked) {
202
+ background: var(--pr-color-surface-raised);
203
+ box-shadow: var(--pr-shadow-sm);
204
+ color: var(--pr-color-text);
205
+ }
206
+
207
+ pricing-renderer[data-pr-root] .pr-segmented__option small {
208
+ color: var(--pr-color-success);
209
+ font-size: var(--pr-font-size-xs);
210
+ font-weight: 750;
211
+ }
212
+
213
+ pricing-renderer[data-pr-root] .pr-plan-grid,
214
+ pricing-renderer[data-pr-root] .pr-addon-grid,
215
+ pricing-renderer[data-pr-root] .pr-variable-grid {
216
+ display: grid;
217
+ grid-template-columns: minmax(0, 1fr);
218
+ gap: var(--pr-space-4);
219
+ }
220
+
221
+ pricing-renderer[data-pr-root] .pr-plan-card,
222
+ pricing-renderer[data-pr-root] .pr-addon-card,
223
+ pricing-renderer[data-pr-root] .pr-configurator,
224
+ pricing-renderer[data-pr-root] .pr-metadata,
225
+ pricing-renderer[data-pr-root] .pr-feature-card,
226
+ pricing-renderer[data-pr-root] .pr-summary {
227
+ border: 1px solid var(--pr-color-border);
228
+ border-radius: var(--pr-radius-lg);
229
+ background: var(--pr-color-surface);
230
+ box-shadow: var(--pr-shadow-sm);
231
+ }
232
+
233
+ pricing-renderer[data-pr-root] .pr-plan-card {
234
+ position: relative;
235
+ display: flex;
236
+ flex-direction: column;
237
+ min-inline-size: 0;
238
+ min-block-size: 100%;
239
+ padding: var(--pr-space-5);
240
+ transition:
241
+ background-color var(--pr-motion-fast),
242
+ border-color var(--pr-motion-fast),
243
+ box-shadow var(--pr-motion-fast),
244
+ translate var(--pr-motion-fast);
245
+ }
246
+
247
+ pricing-renderer[data-pr-root] .pr-selectable-card {
248
+ cursor: pointer;
249
+ }
250
+
251
+ @media (hover: hover) {
252
+ pricing-renderer[data-pr-root] .pr-selectable-card:hover:not(.is-unavailable) {
253
+ border-color: color-mix(in srgb, var(--pr-color-accent) 58%, var(--pr-color-border));
254
+ box-shadow: var(--pr-shadow-accent);
255
+ translate: 0 -2px;
256
+ }
257
+ }
258
+
259
+ pricing-renderer[data-pr-root] .pr-plan-card.is-selected {
260
+ border-color: var(--pr-color-accent);
261
+ background: color-mix(in srgb, var(--pr-color-accent) 4%, var(--pr-color-surface));
262
+ box-shadow: var(--pr-shadow-accent);
263
+ }
264
+
265
+ pricing-renderer[data-pr-root] .pr-plan-card.is-featured:not(.is-selected) {
266
+ border-color: var(--pr-color-border-strong);
267
+ }
268
+
269
+ pricing-renderer[data-pr-root] .pr-plan-card__status {
270
+ display: flex;
271
+ flex-wrap: wrap;
272
+ align-items: center;
273
+ justify-content: space-between;
274
+ gap: var(--pr-space-2);
275
+ min-block-size: 44px;
276
+ }
277
+
278
+ pricing-renderer[data-pr-root] .pr-plan-card__selector {
279
+ margin-inline-start: auto;
280
+ }
281
+
282
+ pricing-renderer[data-pr-root] .pr-plan-card__badges {
283
+ display: flex;
284
+ flex-wrap: wrap;
285
+ gap: var(--pr-space-2);
286
+ }
287
+
288
+ pricing-renderer[data-pr-root] .pr-selection-control {
289
+ position: relative;
290
+ display: inline-flex;
291
+ flex: 0 0 auto;
292
+ align-items: center;
293
+ justify-content: center;
294
+ gap: var(--pr-space-2);
295
+ min-block-size: 44px;
296
+ padding: 0.45rem 0.75rem;
297
+ border: 1px solid var(--pr-color-border);
298
+ border-radius: var(--pr-radius-pill);
299
+ background: var(--pr-color-surface-raised);
300
+ color: var(--pr-color-muted);
301
+ font-size: var(--pr-font-size-sm);
302
+ font-weight: 750;
303
+ line-height: 1;
304
+ cursor: pointer;
305
+ transition:
306
+ background-color var(--pr-motion-fast),
307
+ border-color var(--pr-motion-fast),
308
+ color var(--pr-motion-fast),
309
+ box-shadow var(--pr-motion-fast);
310
+ }
311
+
312
+ pricing-renderer[data-pr-root] .pr-selection-control input {
313
+ position: absolute;
314
+ inset: 0;
315
+ inline-size: 100%;
316
+ block-size: 100%;
317
+ margin: 0;
318
+ opacity: 0;
319
+ cursor: inherit;
320
+ }
321
+
322
+ pricing-renderer[data-pr-root] .pr-selection-control input:focus-visible {
323
+ outline: 0;
324
+ }
325
+
326
+ pricing-renderer[data-pr-root] .pr-selection-control__icon {
327
+ display: grid;
328
+ place-items: center;
329
+ inline-size: 1.15rem;
330
+ block-size: 1.15rem;
331
+ border: 1.5px solid var(--pr-color-border-strong);
332
+ border-radius: 50%;
333
+ background: var(--pr-color-surface);
334
+ }
335
+
336
+ pricing-renderer[data-pr-root] .pr-selection-control__icon::after {
337
+ color: var(--pr-color-on-accent);
338
+ font-size: 0.75rem;
339
+ font-weight: 900;
340
+ line-height: 1;
341
+ content: '✓';
342
+ opacity: 0;
343
+ scale: 0.7;
344
+ transition:
345
+ opacity var(--pr-motion-fast),
346
+ scale var(--pr-motion-fast);
347
+ }
348
+
349
+ pricing-renderer[data-pr-root] .pr-selection-control:has(input:checked) {
350
+ border-color: var(--pr-color-accent);
351
+ background: var(--pr-color-accent);
352
+ color: var(--pr-color-on-accent);
353
+ box-shadow: 0 5px 18px color-mix(in srgb, var(--pr-color-accent) 24%, transparent);
354
+ }
355
+
356
+ pricing-renderer[data-pr-root] .pr-selection-control input:checked ~ .pr-selection-control__icon {
357
+ border-color: var(--pr-color-on-accent);
358
+ background: transparent;
359
+ }
360
+
361
+ pricing-renderer[data-pr-root]
362
+ .pr-selection-control
363
+ input:checked
364
+ ~ .pr-selection-control__icon::after {
365
+ opacity: 1;
366
+ scale: 1;
367
+ }
368
+
369
+ pricing-renderer[data-pr-root] .pr-selection-control:focus-within {
370
+ outline: 2px solid var(--pr-color-focus);
371
+ outline-offset: 3px;
372
+ }
373
+
374
+ pricing-renderer[data-pr-root] .pr-selection-control:has(input:disabled) {
375
+ cursor: not-allowed;
376
+ opacity: 0.62;
377
+ }
378
+
379
+ pricing-renderer[data-pr-root] .pr-plan-card__top h4,
380
+ pricing-renderer[data-pr-root] .pr-addon-card h4 {
381
+ margin: var(--pr-space-3) 0 0;
382
+ font-size: var(--pr-font-size-xl);
383
+ letter-spacing: -0.02em;
384
+ }
385
+
386
+ pricing-renderer[data-pr-root] .pr-plan-card__top p,
387
+ pricing-renderer[data-pr-root] .pr-addon-card p {
388
+ margin: var(--pr-space-2) 0 0;
389
+ color: var(--pr-color-muted);
390
+ }
391
+
392
+ pricing-renderer[data-pr-root] .pr-price {
393
+ display: flex;
394
+ flex-wrap: wrap;
395
+ align-items: baseline;
396
+ gap: var(--pr-space-2);
397
+ min-block-size: 4.5rem;
398
+ padding-block: var(--pr-space-5);
399
+ }
400
+
401
+ pricing-renderer[data-pr-root] .pr-price__amount,
402
+ pricing-renderer[data-pr-root] .pr-price__quote {
403
+ font-size: clamp(2rem, 8cqi, 3rem);
404
+ font-weight: 790;
405
+ letter-spacing: -0.05em;
406
+ line-height: 1;
407
+ }
408
+
409
+ pricing-renderer[data-pr-root] .pr-price__quote {
410
+ font-size: var(--pr-font-size-2xl);
411
+ letter-spacing: -0.02em;
412
+ }
413
+
414
+ pricing-renderer[data-pr-root] .pr-price__unit {
415
+ color: var(--pr-color-muted);
416
+ font-size: var(--pr-font-size-sm);
417
+ }
418
+
419
+ pricing-renderer[data-pr-root] .pr-highlight-list {
420
+ display: grid;
421
+ gap: var(--pr-space-3);
422
+ padding: 0;
423
+ margin: 0 0 var(--pr-space-5);
424
+ list-style: none;
425
+ }
426
+
427
+ pricing-renderer[data-pr-root] .pr-plan-inheritance {
428
+ padding-block-start: var(--pr-space-1);
429
+ margin: 0 0 var(--pr-space-3);
430
+ color: var(--pr-color-text);
431
+ font-size: var(--pr-font-size-sm);
432
+ font-weight: 750;
433
+ }
434
+
435
+ pricing-renderer[data-pr-root] .pr-highlight-list li {
436
+ display: grid;
437
+ grid-template-columns: auto minmax(0, 1fr) auto;
438
+ align-items: start;
439
+ gap: var(--pr-space-2);
440
+ }
441
+
442
+ pricing-renderer[data-pr-root] .pr-highlight-list__icon {
443
+ color: var(--pr-color-success);
444
+ font-weight: 800;
445
+ }
446
+
447
+ pricing-renderer[data-pr-root] .pr-highlight-list__value {
448
+ color: var(--pr-color-muted);
449
+ font-size: var(--pr-font-size-sm);
450
+ }
451
+
452
+ pricing-renderer[data-pr-root] .pr-button {
453
+ display: inline-flex;
454
+ align-items: center;
455
+ justify-content: center;
456
+ min-block-size: 44px;
457
+ padding: 0.65rem 1rem;
458
+ border: 1px solid transparent;
459
+ border-radius: var(--pr-radius-md);
460
+ font-weight: 750;
461
+ line-height: 1.2;
462
+ text-align: center;
463
+ text-decoration: none;
464
+ white-space: nowrap;
465
+ cursor: pointer;
466
+ }
467
+
468
+ pricing-renderer[data-pr-root] .pr-plan-card > .pr-button {
469
+ width: 100%;
470
+ margin-block-start: auto;
471
+ }
472
+
473
+ pricing-renderer[data-pr-root] .pr-button--primary {
474
+ border-color: var(--pr-color-accent);
475
+ background: var(--pr-color-accent);
476
+ color: var(--pr-color-on-accent);
477
+ }
478
+
479
+ pricing-renderer[data-pr-root] .pr-button--secondary,
480
+ pricing-renderer[data-pr-root] .pr-button--quiet {
481
+ border-color: var(--pr-color-border);
482
+ background: var(--pr-color-surface);
483
+ color: var(--pr-color-text);
484
+ }
485
+
486
+ pricing-renderer[data-pr-root] .pr-button--quiet {
487
+ padding-inline: 0.8rem;
488
+ }
489
+
490
+ pricing-renderer[data-pr-root] .pr-configurator,
491
+ pricing-renderer[data-pr-root] .pr-metadata {
492
+ padding: var(--pr-space-5);
493
+ }
494
+
495
+ pricing-renderer[data-pr-root] .pr-field {
496
+ display: grid;
497
+ align-content: start;
498
+ gap: var(--pr-space-2);
499
+ }
500
+
501
+ pricing-renderer[data-pr-root] .pr-field > label,
502
+ pricing-renderer[data-pr-root] .pr-stepper > span {
503
+ font-size: var(--pr-font-size-sm);
504
+ font-weight: 750;
505
+ }
506
+
507
+ pricing-renderer[data-pr-root] .pr-field p {
508
+ margin: 0;
509
+ color: var(--pr-color-muted);
510
+ font-size: var(--pr-font-size-sm);
511
+ }
512
+
513
+ pricing-renderer[data-pr-root] .pr-field.is-invalid :where(input, select) {
514
+ border-color: var(--pr-color-warning);
515
+ }
516
+
517
+ pricing-renderer[data-pr-root] .pr-field .pr-field__error {
518
+ color: var(--pr-color-warning);
519
+ font-weight: 650;
520
+ }
521
+
522
+ pricing-renderer[data-pr-root]
523
+ .pr-field
524
+ :where(input:not([type='checkbox']):not([type='range']), select),
525
+ pricing-renderer[data-pr-root] .pr-search input,
526
+ pricing-renderer[data-pr-root] .pr-stepper input {
527
+ width: 100%;
528
+ min-block-size: 44px;
529
+ padding: 0.6rem 0.75rem;
530
+ border: 1px solid var(--pr-color-border);
531
+ border-radius: var(--pr-radius-sm);
532
+ background: var(--pr-color-surface);
533
+ font-size: 1rem;
534
+ }
535
+
536
+ pricing-renderer[data-pr-root] .pr-switch {
537
+ position: relative;
538
+ display: inline-flex;
539
+ inline-size: 52px;
540
+ block-size: 30px;
541
+ cursor: pointer;
542
+ }
543
+
544
+ pricing-renderer[data-pr-root] .pr-switch input {
545
+ position: absolute;
546
+ inset: 0;
547
+ opacity: 0;
548
+ }
549
+
550
+ pricing-renderer[data-pr-root] .pr-switch__track {
551
+ inline-size: 100%;
552
+ border: 1px solid var(--pr-color-border-strong);
553
+ border-radius: 999px;
554
+ background: var(--pr-color-surface-subtle);
555
+ }
556
+
557
+ pricing-renderer[data-pr-root] .pr-switch__track::after {
558
+ content: '';
559
+ position: absolute;
560
+ inset-block-start: 4px;
561
+ inset-inline-start: 4px;
562
+ inline-size: 22px;
563
+ block-size: 22px;
564
+ border-radius: 50%;
565
+ background: var(--pr-color-muted);
566
+ transition: translate var(--pr-motion-fast);
567
+ }
568
+
569
+ pricing-renderer[data-pr-root] .pr-switch input:checked + .pr-switch__track {
570
+ background: var(--pr-color-accent);
571
+ }
572
+
573
+ pricing-renderer[data-pr-root] .pr-switch input:checked + .pr-switch__track::after {
574
+ background: var(--pr-color-on-accent);
575
+ translate: 22px 0;
576
+ }
577
+
578
+ [dir='rtl'] pricing-renderer[data-pr-root] .pr-switch input:checked + .pr-switch__track::after {
579
+ translate: -22px 0;
580
+ }
581
+
582
+ pricing-renderer[data-pr-root] .pr-slider {
583
+ display: grid;
584
+ grid-template-columns: minmax(0, 1fr) 6rem;
585
+ align-items: center;
586
+ gap: var(--pr-space-3);
587
+ }
588
+
589
+ pricing-renderer[data-pr-root] .pr-comparison-toolbar {
590
+ position: sticky;
591
+ z-index: 3;
592
+ inset-block-start: 0;
593
+ display: flex;
594
+ flex-wrap: wrap;
595
+ align-items: center;
596
+ gap: var(--pr-space-3);
597
+ padding: var(--pr-space-3);
598
+ margin-block-end: var(--pr-space-4);
599
+ border: 1px solid var(--pr-color-border);
600
+ border-radius: var(--pr-radius-md);
601
+ background: color-mix(in srgb, var(--pr-color-surface) 94%, transparent);
602
+ backdrop-filter: blur(12px);
603
+ }
604
+
605
+ pricing-renderer[data-pr-root] .pr-search {
606
+ flex: 1 1 15rem;
607
+ }
608
+
609
+ pricing-renderer[data-pr-root] .pr-check {
610
+ display: inline-flex;
611
+ align-items: center;
612
+ gap: var(--pr-space-2);
613
+ min-block-size: 44px;
614
+ }
615
+
616
+ pricing-renderer[data-pr-root] .pr-check input {
617
+ inline-size: 20px;
618
+ block-size: 20px;
619
+ accent-color: var(--pr-color-accent);
620
+ }
621
+
622
+ pricing-renderer[data-pr-root] .pr-toolbar-actions {
623
+ display: flex;
624
+ gap: var(--pr-space-2);
625
+ }
626
+
627
+ pricing-renderer[data-pr-root] .pr-toolbar-actions button,
628
+ pricing-renderer[data-pr-root] .pr-comparison-group h4 button,
629
+ pricing-renderer[data-pr-root] .pr-category-row button {
630
+ min-block-size: 44px;
631
+ padding: 0.5rem 0.7rem;
632
+ border: 0;
633
+ background: transparent;
634
+ font-weight: 750;
635
+ cursor: pointer;
636
+ }
637
+
638
+ pricing-renderer[data-pr-root] .pr-compact-comparison {
639
+ display: grid;
640
+ gap: var(--pr-space-3);
641
+ }
642
+
643
+ pricing-renderer[data-pr-root] .pr-comparison-group {
644
+ border-block-end: 1px solid var(--pr-color-border);
645
+ }
646
+
647
+ pricing-renderer[data-pr-root] .pr-comparison-group h4 {
648
+ margin: 0;
649
+ }
650
+
651
+ pricing-renderer[data-pr-root] .pr-comparison-group h4 button {
652
+ display: flex;
653
+ justify-content: space-between;
654
+ width: 100%;
655
+ padding-inline: 0;
656
+ font-size: var(--pr-font-size-lg);
657
+ }
658
+
659
+ pricing-renderer[data-pr-root] .pr-feature-card {
660
+ display: grid;
661
+ gap: var(--pr-space-4);
662
+ padding: var(--pr-space-4);
663
+ margin-block-end: var(--pr-space-3);
664
+ }
665
+
666
+ pricing-renderer[data-pr-root] .pr-feature-card h5,
667
+ pricing-renderer[data-pr-root] .pr-feature-card p {
668
+ margin: 0;
669
+ }
670
+
671
+ pricing-renderer[data-pr-root] .pr-feature-card p {
672
+ color: var(--pr-color-muted);
673
+ font-size: var(--pr-font-size-sm);
674
+ }
675
+
676
+ pricing-renderer[data-pr-root] .pr-feature-card dl {
677
+ display: grid;
678
+ gap: var(--pr-space-2);
679
+ margin: 0;
680
+ }
681
+
682
+ pricing-renderer[data-pr-root] .pr-feature-card dl div {
683
+ display: grid;
684
+ grid-template-columns: minmax(0, 1fr) auto;
685
+ gap: var(--pr-space-3);
686
+ padding-block: var(--pr-space-2);
687
+ border-block-start: 1px solid var(--pr-color-border);
688
+ }
689
+
690
+ pricing-renderer[data-pr-root] .pr-feature-card :where(dt, dd) {
691
+ margin: 0;
692
+ }
693
+
694
+ pricing-renderer[data-pr-root] .pr-feature-card dt {
695
+ color: var(--pr-color-muted);
696
+ }
697
+
698
+ pricing-renderer[data-pr-root] .pr-table-scroll {
699
+ max-inline-size: 100%;
700
+ overflow: auto;
701
+ border: 1px solid var(--pr-color-border);
702
+ border-radius: var(--pr-radius-lg);
703
+ background: var(--pr-color-surface);
704
+ overscroll-behavior-inline: contain;
705
+ }
706
+
707
+ pricing-renderer[data-pr-root] .pr-comparison-table {
708
+ width: 100%;
709
+ min-width: 720px;
710
+ border-collapse: separate;
711
+ border-spacing: 0;
712
+ }
713
+
714
+ pricing-renderer[data-pr-root] .pr-comparison-table :where(th, td) {
715
+ min-inline-size: 190px;
716
+ padding: var(--pr-space-3) var(--pr-space-4);
717
+ border-block-end: 1px solid var(--pr-color-border);
718
+ text-align: center;
719
+ vertical-align: top;
720
+ }
721
+
722
+ pricing-renderer[data-pr-root] .pr-comparison-table :where(th, td):first-child {
723
+ position: sticky;
724
+ z-index: 1;
725
+ inset-inline-start: 0;
726
+ min-inline-size: 230px;
727
+ max-inline-size: 260px;
728
+ background: var(--pr-color-surface);
729
+ text-align: start;
730
+ }
731
+
732
+ pricing-renderer[data-pr-root] .pr-comparison-table thead th {
733
+ position: sticky;
734
+ z-index: 2;
735
+ inset-block-start: 0;
736
+ background: var(--pr-color-surface-raised);
737
+ }
738
+
739
+ pricing-renderer[data-pr-root] .pr-comparison-table thead th:first-child {
740
+ z-index: 3;
741
+ }
742
+
743
+ pricing-renderer[data-pr-root] .pr-comparison-table th small {
744
+ display: block;
745
+ margin-block-start: var(--pr-space-1);
746
+ color: var(--pr-color-muted);
747
+ font-weight: 400;
748
+ }
749
+
750
+ pricing-renderer[data-pr-root] .pr-row-metadata {
751
+ display: block;
752
+ margin-block-start: var(--pr-space-1);
753
+ color: var(--pr-color-muted);
754
+ font-size: var(--pr-font-size-xs);
755
+ font-weight: 500;
756
+ }
757
+
758
+ pricing-renderer[data-pr-root] .pr-category-row th {
759
+ padding: 0;
760
+ background: var(--pr-color-surface-subtle) !important;
761
+ }
762
+
763
+ pricing-renderer[data-pr-root] .pr-category-row button {
764
+ display: flex;
765
+ justify-content: space-between;
766
+ width: 100%;
767
+ padding-inline: var(--pr-space-4);
768
+ }
769
+
770
+ pricing-renderer[data-pr-root] .pr-value--included {
771
+ color: var(--pr-color-success);
772
+ font-weight: 800;
773
+ }
774
+
775
+ pricing-renderer[data-pr-root] .pr-value--excluded {
776
+ color: var(--pr-color-muted);
777
+ }
778
+
779
+ pricing-renderer[data-pr-root] .pr-value--code {
780
+ white-space: pre-wrap;
781
+ }
782
+
783
+ pricing-renderer[data-pr-root] .pr-addon-layout {
784
+ display: grid;
785
+ gap: var(--pr-space-5);
786
+ }
787
+
788
+ pricing-renderer[data-pr-root] .pr-addon-card {
789
+ display: flex;
790
+ flex-direction: column;
791
+ gap: var(--pr-space-3);
792
+ padding: var(--pr-space-4);
793
+ transition:
794
+ background-color var(--pr-motion-fast),
795
+ border-color var(--pr-motion-fast),
796
+ box-shadow var(--pr-motion-fast),
797
+ translate var(--pr-motion-fast);
798
+ }
799
+
800
+ pricing-renderer[data-pr-root] .pr-addon-card.is-selected {
801
+ border-color: var(--pr-color-accent);
802
+ background: color-mix(in srgb, var(--pr-color-accent) 4%, var(--pr-color-surface));
803
+ box-shadow: var(--pr-shadow-accent);
804
+ }
805
+
806
+ pricing-renderer[data-pr-root] .pr-addon-card.is-unavailable {
807
+ background: var(--pr-color-surface-subtle);
808
+ cursor: not-allowed;
809
+ }
810
+
811
+ pricing-renderer[data-pr-root] .pr-addon-card__heading {
812
+ display: flex;
813
+ align-items: start;
814
+ justify-content: space-between;
815
+ gap: var(--pr-space-3);
816
+ }
817
+
818
+ pricing-renderer[data-pr-root] .pr-addon-card__heading > div {
819
+ min-inline-size: 0;
820
+ }
821
+
822
+ pricing-renderer[data-pr-root] .pr-price--addon {
823
+ min-block-size: auto;
824
+ padding-block: var(--pr-space-2);
825
+ }
826
+
827
+ pricing-renderer[data-pr-root] .pr-price--addon .pr-price__amount {
828
+ font-size: var(--pr-font-size-2xl);
829
+ }
830
+
831
+ pricing-renderer[data-pr-root] .pr-addon-card__details {
832
+ display: grid;
833
+ gap: var(--pr-space-1);
834
+ font-size: var(--pr-font-size-sm);
835
+ }
836
+
837
+ pricing-renderer[data-pr-root] .pr-addon-effects {
838
+ padding-block-start: var(--pr-space-3);
839
+ border-block-start: 1px solid var(--pr-color-border);
840
+ }
841
+
842
+ pricing-renderer[data-pr-root] .pr-addon-effects summary {
843
+ font-size: var(--pr-font-size-sm);
844
+ font-weight: 750;
845
+ cursor: pointer;
846
+ }
847
+
848
+ pricing-renderer[data-pr-root] .pr-addon-effects dl {
849
+ display: grid;
850
+ gap: var(--pr-space-2);
851
+ margin: var(--pr-space-3) 0 0;
852
+ }
853
+
854
+ pricing-renderer[data-pr-root] .pr-addon-effects dl div {
855
+ display: flex;
856
+ justify-content: space-between;
857
+ gap: var(--pr-space-3);
858
+ }
859
+
860
+ pricing-renderer[data-pr-root] .pr-addon-effects :where(dt, dd) {
861
+ margin: 0;
862
+ font-size: var(--pr-font-size-sm);
863
+ }
864
+
865
+ pricing-renderer[data-pr-root] .pr-stepper {
866
+ display: flex;
867
+ flex-wrap: wrap;
868
+ align-items: center;
869
+ justify-content: space-between;
870
+ gap: var(--pr-space-3);
871
+ padding-block-start: var(--pr-space-3);
872
+ margin-block-start: auto;
873
+ border-block-start: 1px solid var(--pr-color-border);
874
+ }
875
+
876
+ pricing-renderer[data-pr-root] .pr-stepper > div {
877
+ display: grid;
878
+ grid-template-columns: 44px 5rem 44px;
879
+ }
880
+
881
+ pricing-renderer[data-pr-root] .pr-stepper button {
882
+ min-inline-size: 44px;
883
+ min-block-size: 44px;
884
+ border: 1px solid var(--pr-color-border);
885
+ background: var(--pr-color-surface);
886
+ font-size: 1.2rem;
887
+ cursor: pointer;
888
+ }
889
+
890
+ pricing-renderer[data-pr-root] .pr-stepper input {
891
+ border-radius: 0;
892
+ text-align: center;
893
+ }
894
+
895
+ pricing-renderer[data-pr-root] .pr-summary {
896
+ position: sticky;
897
+ z-index: 4;
898
+ inset-block-end: max(0px, env(safe-area-inset-bottom));
899
+ display: grid;
900
+ grid-template-columns: minmax(0, 1fr) auto;
901
+ align-items: center;
902
+ gap: var(--pr-space-2) var(--pr-space-4);
903
+ padding: var(--pr-space-4);
904
+ background: color-mix(in srgb, var(--pr-color-surface) 95%, transparent);
905
+ backdrop-filter: blur(16px);
906
+ }
907
+
908
+ pricing-renderer[data-pr-root] .pr-summary :where(p, strong, span) {
909
+ margin: 0;
910
+ }
911
+
912
+ pricing-renderer[data-pr-root] .pr-summary strong {
913
+ font-size: var(--pr-font-size-xl);
914
+ }
915
+
916
+ pricing-renderer[data-pr-root] .pr-summary span {
917
+ grid-column: 1 / -1;
918
+ color: var(--pr-color-warning);
919
+ font-size: var(--pr-font-size-sm);
920
+ }
921
+
922
+ pricing-renderer[data-pr-root] .pr-metadata dl {
923
+ display: grid;
924
+ gap: var(--pr-space-2);
925
+ margin: var(--pr-space-4) 0 0;
926
+ }
927
+
928
+ pricing-renderer[data-pr-root] .pr-metadata dl div {
929
+ display: grid;
930
+ grid-template-columns: minmax(7rem, 0.3fr) minmax(0, 1fr);
931
+ gap: var(--pr-space-3);
932
+ padding-block: var(--pr-space-2);
933
+ border-block-start: 1px solid var(--pr-color-border);
934
+ }
935
+
936
+ pricing-renderer[data-pr-root] .pr-metadata :where(dt, dd) {
937
+ margin: 0;
938
+ }
939
+
940
+ pricing-renderer[data-pr-root] .pr-metadata dt {
941
+ color: var(--pr-color-muted);
942
+ }
943
+
944
+ pricing-renderer[data-pr-root] .pr-diagnostics,
945
+ pricing-renderer[data-pr-root] .pr-error {
946
+ padding: var(--pr-space-4);
947
+ border: 1px solid var(--pr-color-warning);
948
+ border-radius: var(--pr-radius-md);
949
+ background: var(--pr-color-warning-surface);
950
+ }
951
+
952
+ pricing-renderer[data-pr-root] .pr-diagnostics summary {
953
+ font-weight: 750;
954
+ cursor: pointer;
955
+ }
956
+
957
+ pricing-renderer[data-pr-root] .pr-diagnostics ul,
958
+ pricing-renderer[data-pr-root] .pr-error ul {
959
+ margin-block-end: 0;
960
+ }
961
+
962
+ pricing-renderer[data-pr-root] .pr-dialog-backdrop {
963
+ position: fixed;
964
+ z-index: 1000;
965
+ inset: 0;
966
+ display: grid;
967
+ place-items: end center;
968
+ padding: 0;
969
+ background: color-mix(in srgb, var(--pr-color-overlay) 70%, transparent);
970
+ }
971
+
972
+ pricing-renderer[data-pr-root] .pr-dialog {
973
+ width: 100%;
974
+ max-height: 100dvh;
975
+ padding: var(--pr-space-5);
976
+ overflow: auto;
977
+ border-radius: var(--pr-radius-lg) var(--pr-radius-lg) 0 0;
978
+ background: var(--pr-color-surface);
979
+ box-shadow: var(--pr-shadow-lg);
980
+ }
981
+
982
+ pricing-renderer[data-pr-root] .pr-dialog h3 {
983
+ margin-block-start: 0;
984
+ }
985
+
986
+ pricing-renderer[data-pr-root] .pr-dialog__actions {
987
+ display: flex;
988
+ justify-content: flex-end;
989
+ gap: var(--pr-space-3);
990
+ padding-block-start: var(--pr-space-4);
991
+ }
992
+
993
+ pricing-renderer[data-pr-root] .pr-skeleton {
994
+ display: grid;
995
+ grid-template-columns: repeat(3, minmax(0, 1fr));
996
+ gap: var(--pr-space-4);
997
+ min-block-size: 28rem;
998
+ padding: var(--pr-shell-padding);
999
+ }
1000
+
1001
+ pricing-renderer[data-pr-root] .pr-skeleton > span {
1002
+ grid-column: 1 / -1;
1003
+ color: var(--pr-color-muted);
1004
+ text-align: center;
1005
+ }
1006
+
1007
+ pricing-renderer[data-pr-root] .pr-skeleton > div {
1008
+ min-block-size: 22rem;
1009
+ border-radius: var(--pr-radius-lg);
1010
+ background: var(--pr-color-surface-subtle);
1011
+ animation: pr-pulse 1.6s ease-in-out infinite alternate;
1012
+ }
1013
+
1014
+ @keyframes pr-pulse {
1015
+ to {
1016
+ opacity: 0.55;
1017
+ }
1018
+ }
1019
+
1020
+ @container pricing-renderer (min-width: 600px) {
1021
+ pricing-renderer[data-pr-root] .pr-plan-grid {
1022
+ grid-template-columns: repeat(2, minmax(0, 320px));
1023
+ justify-content: center;
1024
+ }
1025
+
1026
+ pricing-renderer[data-pr-root] .pr-addon-grid,
1027
+ pricing-renderer[data-pr-root] .pr-variable-grid {
1028
+ grid-template-columns: repeat(2, minmax(0, 1fr));
1029
+ }
1030
+
1031
+ pricing-renderer[data-pr-root] .pr-feature-card {
1032
+ grid-template-columns: minmax(0, 0.8fr) minmax(0, 1.2fr);
1033
+ }
1034
+
1035
+ pricing-renderer[data-pr-root] .pr-dialog-backdrop {
1036
+ place-items: center;
1037
+ padding: var(--pr-space-5);
1038
+ }
1039
+
1040
+ pricing-renderer[data-pr-root] .pr-dialog {
1041
+ width: min(720px, 100%);
1042
+ max-height: 90dvh;
1043
+ border-radius: var(--pr-radius-lg);
1044
+ }
1045
+ }
1046
+
1047
+ @container pricing-renderer (min-width: 840px) {
1048
+ pricing-renderer[data-pr-root] .pr-plan-grid {
1049
+ grid-template-columns: repeat(auto-fit, minmax(220px, 320px));
1050
+ }
1051
+
1052
+ pricing-renderer[data-pr-root] .pr-addon-layout {
1053
+ grid-template-columns: minmax(0, 1fr) 288px;
1054
+ align-items: start;
1055
+ }
1056
+
1057
+ pricing-renderer[data-pr-root] .pr-summary {
1058
+ inset-block-start: var(--pr-space-4);
1059
+ inset-block-end: auto;
1060
+ grid-template-columns: 1fr;
1061
+ }
1062
+ }
1063
+
1064
+ @container pricing-renderer (min-width: 1200px) {
1065
+ pricing-renderer[data-pr-root] .pr-plan-grid {
1066
+ grid-template-columns: repeat(auto-fit, minmax(220px, 320px));
1067
+ }
1068
+
1069
+ pricing-renderer[data-pr-root] .pr-addon-grid {
1070
+ grid-template-columns: repeat(3, minmax(0, 1fr));
1071
+ }
1072
+
1073
+ pricing-renderer[data-pr-root] .pr-addon-layout {
1074
+ grid-template-columns: minmax(0, 1fr) minmax(320px, 360px);
1075
+ }
1076
+
1077
+ pricing-renderer[data-pr-root] .pr-dialog {
1078
+ width: min(960px, 100%);
1079
+ }
1080
+ }
1081
+
1082
+ @media (prefers-reduced-motion: reduce) {
1083
+ pricing-renderer[data-pr-root] *,
1084
+ pricing-renderer[data-pr-root] *::before,
1085
+ pricing-renderer[data-pr-root] *::after {
1086
+ scroll-behavior: auto !important;
1087
+ animation-duration: 0.01ms !important;
1088
+ animation-iteration-count: 1 !important;
1089
+ transition-duration: 0.01ms !important;
1090
+ }
1091
+ }
1092
+
1093
+ @media (forced-colors: active) {
1094
+ pricing-renderer[data-pr-root] .pr-plan-card.is-selected,
1095
+ pricing-renderer[data-pr-root] .pr-addon-card.is-selected {
1096
+ outline: 3px solid Highlight;
1097
+ }
1098
+
1099
+ pricing-renderer[data-pr-root] .pr-selection-control:has(input:checked) {
1100
+ border-color: Highlight;
1101
+ background: Highlight;
1102
+ color: HighlightText;
1103
+ forced-color-adjust: none;
1104
+ }
1105
+
1106
+ pricing-renderer[data-pr-root] .pr-button--primary {
1107
+ border-color: ButtonText;
1108
+ }
1109
+ }
1110
+ }