@bettercms-ai/kit 0.1.1 → 2.0.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 +22 -16
- package/dist/_virtual/_rolldown/runtime.js +13 -0
- package/dist/adapters/dock-values.d.ts +28 -0
- package/dist/adapters/dock-values.js +41 -0
- package/dist/adapters/dock-values.js.map +1 -0
- package/dist/adapters/icons.d.ts +15 -0
- package/dist/adapters/icons.js +27 -0
- package/dist/adapters/icons.js.map +1 -0
- package/dist/adapters/lossy.d.ts +326 -0
- package/dist/adapters/lossy.js +414 -0
- package/dist/adapters/lossy.js.map +1 -0
- package/dist/adapters/prod-types.d.ts +546 -0
- package/dist/adapters/prod-types.js +714 -0
- package/dist/adapters/prod-types.js.map +1 -0
- package/dist/adapters/schema.d.ts +154 -0
- package/dist/adapters/schema.js +3020 -0
- package/dist/adapters/schema.js.map +1 -0
- package/dist/adapters/values.d.ts +221 -0
- package/dist/adapters/values.js +623 -0
- package/dist/adapters/values.js.map +1 -0
- package/dist/brand/logo.d.ts +17 -0
- package/dist/brand/logo.js +96 -0
- package/dist/brand/logo.js.map +1 -0
- package/dist/context.d.ts +359 -0
- package/dist/context.js +217 -0
- package/dist/context.js.map +1 -0
- package/dist/controls/button.d.ts +72 -0
- package/dist/controls/button.js +578 -0
- package/dist/controls/button.js.map +1 -0
- package/dist/controls/c1.d.ts +11 -0
- package/dist/controls/c1.js +24 -0
- package/dist/controls/c1.js.map +1 -0
- package/dist/controls/c2.d.ts +10 -0
- package/dist/controls/c2.js +19 -0
- package/dist/controls/c2.js.map +1 -0
- package/dist/controls/choice.d.ts +44 -0
- package/dist/controls/choice.js +463 -0
- package/dist/controls/choice.js.map +1 -0
- package/dist/controls/code-register.d.ts +1 -0
- package/dist/controls/code-register.js +8 -0
- package/dist/controls/code-register.js.map +1 -0
- package/dist/controls/code.d.ts +42 -0
- package/dist/controls/code.js +397 -0
- package/dist/controls/code.js.map +1 -0
- package/dist/controls/color.d.ts +5 -0
- package/dist/controls/color.js +130 -0
- package/dist/controls/color.js.map +1 -0
- package/dist/controls/component-services.d.ts +156 -0
- package/dist/controls/component-services.js +7 -0
- package/dist/controls/component-services.js.map +1 -0
- package/dist/controls/date-register.d.ts +1 -0
- package/dist/controls/date-register.js +9 -0
- package/dist/controls/date-register.js.map +1 -0
- package/dist/controls/date-zone.d.ts +104 -0
- package/dist/controls/date-zone.js +278 -0
- package/dist/controls/date-zone.js.map +1 -0
- package/dist/controls/date.d.ts +7 -0
- package/dist/controls/date.js +466 -0
- package/dist/controls/date.js.map +1 -0
- package/dist/controls/form-picker-register.d.ts +1 -0
- package/dist/controls/form-picker-register.js +19 -0
- package/dist/controls/form-picker-register.js.map +1 -0
- package/dist/controls/form-picker.d.ts +43 -0
- package/dist/controls/form-picker.js +85 -0
- package/dist/controls/form-picker.js.map +1 -0
- package/dist/controls/icon-register.d.ts +1 -0
- package/dist/controls/icon-register.js +8 -0
- package/dist/controls/icon-register.js.map +1 -0
- package/dist/controls/icon.d.ts +40 -0
- package/dist/controls/icon.js +360 -0
- package/dist/controls/icon.js.map +1 -0
- package/dist/controls/index.d.ts +5 -0
- package/dist/controls/index.js +38 -0
- package/dist/controls/index.js.map +1 -0
- package/dist/controls/json-register.d.ts +1 -0
- package/dist/controls/json-register.js +8 -0
- package/dist/controls/json-register.js.map +1 -0
- package/dist/controls/json.d.ts +2 -0
- package/dist/controls/json.js +82 -0
- package/dist/controls/json.js.map +1 -0
- package/dist/controls/link.d.ts +260 -0
- package/dist/controls/link.js +1186 -0
- package/dist/controls/link.js.map +1 -0
- package/dist/controls/location-register.d.ts +1 -0
- package/dist/controls/location-register.js +8 -0
- package/dist/controls/location-register.js.map +1 -0
- package/dist/controls/location.d.ts +16 -0
- package/dist/controls/location.js +221 -0
- package/dist/controls/location.js.map +1 -0
- package/dist/controls/media-register.d.ts +1 -0
- package/dist/controls/media-register.js +12 -0
- package/dist/controls/media-register.js.map +1 -0
- package/dist/controls/media-services.d.ts +46 -0
- package/dist/controls/media-services.js +0 -0
- package/dist/controls/media.d.ts +104 -0
- package/dist/controls/media.js +1396 -0
- package/dist/controls/media.js.map +1 -0
- package/dist/controls/number.d.ts +22 -0
- package/dist/controls/number.js +196 -0
- package/dist/controls/number.js.map +1 -0
- package/dist/controls/reference-register.d.ts +1 -0
- package/dist/controls/reference-register.js +10 -0
- package/dist/controls/reference-register.js.map +1 -0
- package/dist/controls/reference-services.d.ts +58 -0
- package/dist/controls/reference-services.js +0 -0
- package/dist/controls/reference.d.ts +23 -0
- package/dist/controls/reference.js +777 -0
- package/dist/controls/reference.js.map +1 -0
- package/dist/controls/rich-text/blocks.d.ts +49 -0
- package/dist/controls/rich-text/blocks.js +1859 -0
- package/dist/controls/rich-text/blocks.js.map +1 -0
- package/dist/controls/rich-text/catalog.d.ts +101 -0
- package/dist/controls/rich-text/catalog.js +623 -0
- package/dist/controls/rich-text/catalog.js.map +1 -0
- package/dist/controls/rich-text/codec.d.ts +64 -0
- package/dist/controls/rich-text/codec.js +34 -0
- package/dist/controls/rich-text/codec.js.map +1 -0
- package/dist/controls/rich-text/component-card.d.ts +14 -0
- package/dist/controls/rich-text/component-card.js +1024 -0
- package/dist/controls/rich-text/component-card.js.map +1 -0
- package/dist/controls/rich-text/component-panel.d.ts +47 -0
- package/dist/controls/rich-text/component-panel.js +141 -0
- package/dist/controls/rich-text/component-panel.js.map +1 -0
- package/dist/controls/rich-text/control.d.ts +20 -0
- package/dist/controls/rich-text/control.js +296 -0
- package/dist/controls/rich-text/control.js.map +1 -0
- package/dist/controls/rich-text/dom.d.ts +233 -0
- package/dist/controls/rich-text/dom.js +1019 -0
- package/dist/controls/rich-text/dom.js.map +1 -0
- package/dist/controls/rich-text/editor.d.ts +57 -0
- package/dist/controls/rich-text/editor.js +1630 -0
- package/dist/controls/rich-text/editor.js.map +1 -0
- package/dist/controls/rich-text/floating.d.ts +28 -0
- package/dist/controls/rich-text/floating.js +154 -0
- package/dist/controls/rich-text/floating.js.map +1 -0
- package/dist/controls/rich-text/index.d.ts +1 -0
- package/dist/controls/rich-text/index.js +12 -0
- package/dist/controls/rich-text/index.js.map +1 -0
- package/dist/controls/rich-text/link-form.d.ts +13 -0
- package/dist/controls/rich-text/link-form.js +147 -0
- package/dist/controls/rich-text/link-form.js.map +1 -0
- package/dist/controls/rich-text/markdown.d.ts +6 -0
- package/dist/controls/rich-text/markdown.js +181 -0
- package/dist/controls/rich-text/markdown.js.map +1 -0
- package/dist/controls/rich-text/ops.d.ts +35 -0
- package/dist/controls/rich-text/ops.js +316 -0
- package/dist/controls/rich-text/ops.js.map +1 -0
- package/dist/controls/rich-text/plain.d.ts +17 -0
- package/dist/controls/rich-text/plain.js +44 -0
- package/dist/controls/rich-text/plain.js.map +1 -0
- package/dist/controls/rich-text/toolbar.d.ts +89 -0
- package/dist/controls/rich-text/toolbar.js +343 -0
- package/dist/controls/rich-text/toolbar.js.map +1 -0
- package/dist/controls/scale.d.ts +56 -0
- package/dist/controls/scale.js +563 -0
- package/dist/controls/scale.js.map +1 -0
- package/dist/controls/slot-register.d.ts +1 -0
- package/dist/controls/slot-register.js +16 -0
- package/dist/controls/slot-register.js.map +1 -0
- package/dist/controls/slot-services.d.ts +122 -0
- package/dist/controls/slot-services.js +155 -0
- package/dist/controls/slot-services.js.map +1 -0
- package/dist/controls/slot.d.ts +33 -0
- package/dist/controls/slot.js +366 -0
- package/dist/controls/slot.js.map +1 -0
- package/dist/controls/table/index.d.ts +1 -0
- package/dist/controls/table/index.js +12 -0
- package/dist/controls/table/index.js.map +1 -0
- package/dist/controls/table/prod.d.ts +21 -0
- package/dist/controls/table/prod.js +79 -0
- package/dist/controls/table/prod.js.map +1 -0
- package/dist/controls/table/refs.d.ts +50 -0
- package/dist/controls/table/refs.js +79 -0
- package/dist/controls/table/refs.js.map +1 -0
- package/dist/controls/table/stored.d.ts +15 -0
- package/dist/controls/table/stored.js +44 -0
- package/dist/controls/table/stored.js.map +1 -0
- package/dist/controls/table/table-editor.d.ts +103 -0
- package/dist/controls/table/table-editor.js +2725 -0
- package/dist/controls/table/table-editor.js.map +1 -0
- package/dist/controls/table/table-link.d.ts +24 -0
- package/dist/controls/table/table-link.js +180 -0
- package/dist/controls/table/table-link.js.map +1 -0
- package/dist/controls/table/table.d.ts +9 -0
- package/dist/controls/table/table.js +103 -0
- package/dist/controls/table/table.js.map +1 -0
- package/dist/controls/text.d.ts +17 -0
- package/dist/controls/text.js +322 -0
- package/dist/controls/text.js.map +1 -0
- package/dist/controls/unknown-value.d.ts +17 -0
- package/dist/controls/unknown-value.js +66 -0
- package/dist/controls/unknown-value.js.map +1 -0
- package/dist/core/core.d.ts +63 -0
- package/dist/core/core.js +171 -0
- package/dist/core/core.js.map +1 -0
- package/dist/core/facets.d.ts +347 -0
- package/dist/core/facets.js +334 -0
- package/dist/core/facets.js.map +1 -0
- package/dist/core/index.d.ts +3 -0
- package/dist/core/index.js +3 -0
- package/dist/engine/array.d.ts +101 -0
- package/dist/engine/array.js +906 -0
- package/dist/engine/array.js.map +1 -0
- package/dist/engine/bits.d.ts +24 -0
- package/dist/engine/bits.js +60 -0
- package/dist/engine/bits.js.map +1 -0
- package/dist/engine/breadcrumb.d.ts +45 -0
- package/dist/engine/breadcrumb.js +63 -0
- package/dist/engine/breadcrumb.js.map +1 -0
- package/dist/engine/expand.d.ts +66 -0
- package/dist/engine/expand.js +153 -0
- package/dist/engine/expand.js.map +1 -0
- package/dist/engine/field-list.d.ts +20 -0
- package/dist/engine/field-list.js +19 -0
- package/dist/engine/field-list.js.map +1 -0
- package/dist/engine/field-shell.d.ts +49 -0
- package/dist/engine/field-shell.js +988 -0
- package/dist/engine/field-shell.js.map +1 -0
- package/dist/engine/frame.d.ts +122 -0
- package/dist/engine/frame.js +601 -0
- package/dist/engine/frame.js.map +1 -0
- package/dist/engine/group-summary.d.ts +5 -0
- package/dist/engine/group-summary.js +70 -0
- package/dist/engine/group-summary.js.map +1 -0
- package/dist/engine/grouping.d.ts +238 -0
- package/dist/engine/grouping.js +996 -0
- package/dist/engine/grouping.js.map +1 -0
- package/dist/engine/item-list.d.ts +99 -0
- package/dist/engine/item-list.js +725 -0
- package/dist/engine/item-list.js.map +1 -0
- package/dist/engine/kit-field.d.ts +72 -0
- package/dist/engine/kit-field.js +558 -0
- package/dist/engine/kit-field.js.map +1 -0
- package/dist/engine/schema-form.d.ts +116 -0
- package/dist/engine/schema-form.js +462 -0
- package/dist/engine/schema-form.js.map +1 -0
- package/dist/engine/slot.d.ts +13 -0
- package/dist/engine/slot.js +216 -0
- package/dist/engine/slot.js.map +1 -0
- package/dist/index.d.ts +45 -3139
- package/dist/index.js +47 -2036
- package/dist/index.js.map +1 -0
- package/dist/kit.css +75 -0
- package/dist/lib/cn.d.ts +4 -0
- package/dist/lib/cn.js +56 -0
- package/dist/lib/cn.js.map +1 -0
- package/dist/lib/columns.d.ts +14 -0
- package/dist/lib/columns.js +30 -0
- package/dist/lib/columns.js.map +1 -0
- package/dist/lib/frames.d.ts +36 -0
- package/dist/lib/frames.js +214 -0
- package/dist/lib/frames.js.map +1 -0
- package/dist/lib/icon-image.d.ts +10 -0
- package/dist/lib/icon-image.js +8 -0
- package/dist/lib/icon-image.js.map +1 -0
- package/dist/lib/icons.d.ts +16 -0
- package/dist/lib/icons.js +173 -0
- package/dist/lib/icons.js.map +1 -0
- package/dist/lib/input-modality.d.ts +11 -0
- package/dist/lib/input-modality.js +47 -0
- package/dist/lib/input-modality.js.map +1 -0
- package/dist/lib/key-event.d.ts +11 -0
- package/dist/lib/key-event.js +16 -0
- package/dist/lib/key-event.js.map +1 -0
- package/dist/lib/path.d.ts +29 -0
- package/dist/lib/path.js +66 -0
- package/dist/lib/path.js.map +1 -0
- package/dist/lib/schema.d.ts +80 -0
- package/dist/lib/schema.js +384 -0
- package/dist/lib/schema.js.map +1 -0
- package/dist/lib/utils.d.ts +7 -0
- package/dist/lib/utils.js +37 -0
- package/dist/lib/utils.js.map +1 -0
- package/dist/lib/validate.d.ts +30 -0
- package/dist/lib/validate.js +224 -0
- package/dist/lib/validate.js.map +1 -0
- package/dist/library/analysis.d.ts +23 -0
- package/dist/library/analysis.js +160 -0
- package/dist/library/analysis.js.map +1 -0
- package/dist/library/catalog.d.ts +57 -0
- package/dist/library/catalog.js +307 -0
- package/dist/library/catalog.js.map +1 -0
- package/dist/library/coreNotes.d.ts +8 -0
- package/dist/library/coreNotes.js +111 -0
- package/dist/library/coreNotes.js.map +1 -0
- package/dist/library/coverage.d.ts +40 -0
- package/dist/library/coverage.js +59 -0
- package/dist/library/coverage.js.map +1 -0
- package/dist/library/entries/advanced.entries.d.ts +2 -0
- package/dist/library/entries/advanced.entries.js +6579 -0
- package/dist/library/entries/advanced.entries.js.map +1 -0
- package/dist/library/entries/commerce.entries.d.ts +2 -0
- package/dist/library/entries/commerce.entries.js +4140 -0
- package/dist/library/entries/commerce.entries.js.map +1 -0
- package/dist/library/entries/company.entries.d.ts +2 -0
- package/dist/library/entries/company.entries.js +2731 -0
- package/dist/library/entries/company.entries.js.map +1 -0
- package/dist/library/entries/conversion.entries.d.ts +2 -0
- package/dist/library/entries/conversion.entries.js +3707 -0
- package/dist/library/entries/conversion.entries.js.map +1 -0
- package/dist/library/entries/data.entries.d.ts +7 -0
- package/dist/library/entries/data.entries.js +4613 -0
- package/dist/library/entries/data.entries.js.map +1 -0
- package/dist/library/entries/events.entries.d.ts +2 -0
- package/dist/library/entries/events.entries.js +3428 -0
- package/dist/library/entries/events.entries.js.map +1 -0
- package/dist/library/entries/features.entries.d.ts +2 -0
- package/dist/library/entries/features.entries.js +3157 -0
- package/dist/library/entries/features.entries.js.map +1 -0
- package/dist/library/entries/heroes.entries.d.ts +2 -0
- package/dist/library/entries/heroes.entries.js +3401 -0
- package/dist/library/entries/heroes.entries.js.map +1 -0
- package/dist/library/entries/index.d.ts +3 -0
- package/dist/library/entries/index.js +35 -0
- package/dist/library/entries/index.js.map +1 -0
- package/dist/library/entries/listings.entries.d.ts +2 -0
- package/dist/library/entries/listings.entries.js +2976 -0
- package/dist/library/entries/listings.entries.js.map +1 -0
- package/dist/library/entries/longform.entries.d.ts +2 -0
- package/dist/library/entries/longform.entries.js +4227 -0
- package/dist/library/entries/longform.entries.js.map +1 -0
- package/dist/library/entries/media.entries.d.ts +2 -0
- package/dist/library/entries/media.entries.js +2781 -0
- package/dist/library/entries/media.entries.js.map +1 -0
- package/dist/library/entries/navigation.entries.d.ts +2 -0
- package/dist/library/entries/navigation.entries.js +4011 -0
- package/dist/library/entries/navigation.entries.js.map +1 -0
- package/dist/library/entries/pricing.entries.d.ts +2 -0
- package/dist/library/entries/pricing.entries.js +2383 -0
- package/dist/library/entries/pricing.entries.js.map +1 -0
- package/dist/library/entries/social-proof.entries.d.ts +2 -0
- package/dist/library/entries/social-proof.entries.js +2297 -0
- package/dist/library/entries/social-proof.entries.js.map +1 -0
- package/dist/library/examples/bento.d.ts +92 -0
- package/dist/library/examples/bento.js +201 -0
- package/dist/library/examples/bento.js.map +1 -0
- package/dist/library/examples/blocks.d.ts +14 -0
- package/dist/library/examples/blocks.js +313 -0
- package/dist/library/examples/blocks.js.map +1 -0
- package/dist/library/examples/faq.d.ts +28 -0
- package/dist/library/examples/faq.js +230 -0
- package/dist/library/examples/faq.js.map +1 -0
- package/dist/library/examples/hero.d.ts +43 -0
- package/dist/library/examples/hero.js +222 -0
- package/dist/library/examples/hero.js.map +1 -0
- package/dist/library/examples/index.d.ts +36 -0
- package/dist/library/examples/index.js +109 -0
- package/dist/library/examples/index.js.map +1 -0
- package/dist/library/examples/journalStory.d.ts +93 -0
- package/dist/library/examples/journalStory.js +338 -0
- package/dist/library/examples/journalStory.js.map +1 -0
- package/dist/library/examples/megaMenu.d.ts +134 -0
- package/dist/library/examples/megaMenu.js +442 -0
- package/dist/library/examples/megaMenu.js.map +1 -0
- package/dist/library/examples/pricing.d.ts +103 -0
- package/dist/library/examples/pricing.js +479 -0
- package/dist/library/examples/pricing.js.map +1 -0
- package/dist/library/examples/tabs.d.ts +87 -0
- package/dist/library/examples/tabs.js +180 -0
- package/dist/library/examples/tabs.js.map +1 -0
- package/dist/library/export.d.ts +42 -0
- package/dist/library/export.js +80 -0
- package/dist/library/export.js.map +1 -0
- package/dist/library/index.d.ts +13 -0
- package/dist/library/index.js +6 -0
- package/dist/library/kit-catalog.json +1510 -0
- package/dist/library/types.d.ts +42 -0
- package/dist/library/types.js +0 -0
- package/dist/schema/adapters.d.ts +28 -0
- package/dist/schema/adapters.js +492 -0
- package/dist/schema/adapters.js.map +1 -0
- package/dist/schema/help.d.ts +27 -0
- package/dist/schema/help.js +56 -0
- package/dist/schema/help.js.map +1 -0
- package/dist/schema/scale.d.ts +69 -0
- package/dist/schema/scale.js +250 -0
- package/dist/schema/scale.js.map +1 -0
- package/dist/schema/sources.d.ts +103 -0
- package/dist/schema/sources.js +65 -0
- package/dist/schema/sources.js.map +1 -0
- package/dist/schema/table.d.ts +319 -0
- package/dist/schema/table.js +1199 -0
- package/dist/schema/table.js.map +1 -0
- package/dist/schema/types.d.ts +297 -0
- package/dist/schema/types.js +14 -0
- package/dist/schema/types.js.map +1 -0
- package/dist/styles.css +2 -0
- package/dist/table/table-view.d.ts +14 -0
- package/dist/table/table-view.js +140 -0
- package/dist/table/table-view.js.map +1 -0
- package/dist/table/table.css +73 -0
- package/dist/testing/corpus.d.ts +63 -0
- package/dist/testing/corpus.js +129 -0
- package/dist/testing/corpus.js.map +1 -0
- package/dist/testing/test-form.d.ts +11 -0
- package/dist/testing/test-form.js +38 -0
- package/dist/testing/test-form.js.map +1 -0
- package/dist/theme.css +345 -0
- package/dist/theme.d.ts +20 -1504
- package/dist/theme.js +43 -4126
- package/dist/theme.js.map +1 -0
- package/dist/tokens.css +542 -0
- package/dist/types.d.ts +17 -0
- package/dist/types.js +0 -0
- package/dist/ui/action-tray.d.ts +54 -0
- package/dist/ui/action-tray.js +154 -0
- package/dist/ui/action-tray.js.map +1 -0
- package/dist/ui/autocomplete.d.ts +30 -0
- package/dist/ui/autocomplete.js +139 -0
- package/dist/ui/autocomplete.js.map +1 -0
- package/dist/ui/button.d.ts +57 -0
- package/dist/ui/button.js +201 -0
- package/dist/ui/button.js.map +1 -0
- package/dist/ui/choice-switch.d.ts +36 -0
- package/dist/ui/choice-switch.js +57 -0
- package/dist/ui/choice-switch.js.map +1 -0
- package/dist/ui/controls.d.ts +83 -0
- package/dist/ui/controls.js +331 -0
- package/dist/ui/controls.js.map +1 -0
- package/dist/ui/display.d.ts +163 -0
- package/dist/ui/display.js +455 -0
- package/dist/ui/display.js.map +1 -0
- package/dist/ui/expanded-editor-modal.d.ts +26 -0
- package/dist/ui/expanded-editor-modal.js +140 -0
- package/dist/ui/expanded-editor-modal.js.map +1 -0
- package/dist/ui/field-context.d.ts +12 -0
- package/dist/ui/field-context.js +23 -0
- package/dist/ui/field-context.js.map +1 -0
- package/dist/ui/floating-panel.d.ts +152 -0
- package/dist/ui/floating-panel.js +928 -0
- package/dist/ui/floating-panel.js.map +1 -0
- package/dist/ui/index.d.ts +16 -0
- package/dist/ui/index.js +18 -0
- package/dist/ui/input.d.ts +78 -0
- package/dist/ui/input.js +250 -0
- package/dist/ui/input.js.map +1 -0
- package/dist/ui/mode-bar.d.ts +31 -0
- package/dist/ui/mode-bar.js +65 -0
- package/dist/ui/mode-bar.js.map +1 -0
- package/dist/ui/overlay.d.ts +195 -0
- package/dist/ui/overlay.js +697 -0
- package/dist/ui/overlay.js.map +1 -0
- package/dist/ui/path-crumbs.d.ts +90 -0
- package/dist/ui/path-crumbs.js +566 -0
- package/dist/ui/path-crumbs.js.map +1 -0
- package/dist/ui/presence.d.ts +16 -0
- package/dist/ui/presence.js +65 -0
- package/dist/ui/presence.js.map +1 -0
- package/dist/ui/select.d.ts +66 -0
- package/dist/ui/select.js +407 -0
- package/dist/ui/select.js.map +1 -0
- package/dist/ui/shortcut-hint.d.ts +14 -0
- package/dist/ui/shortcut-hint.js +35 -0
- package/dist/ui/shortcut-hint.js.map +1 -0
- package/dist/ui/spinner.d.ts +24 -0
- package/dist/ui/spinner.js +42 -0
- package/dist/ui/spinner.js.map +1 -0
- package/dist/ui/split-button.d.ts +32 -0
- package/dist/ui/split-button.js +60 -0
- package/dist/ui/split-button.js.map +1 -0
- package/dist/ui/surfaces.d.ts +23 -0
- package/dist/ui/surfaces.js +26 -0
- package/dist/ui/surfaces.js.map +1 -0
- package/dist/ui/tab.d.ts +38 -0
- package/dist/ui/tab.js +87 -0
- package/dist/ui/tab.js.map +1 -0
- package/dist/ui/toast.d.ts +20 -0
- package/dist/ui/toast.js +115 -0
- package/dist/ui/toast.js.map +1 -0
- package/dist/ui/tooltip-root.d.ts +13 -0
- package/dist/ui/tooltip-root.js +77 -0
- package/dist/ui/tooltip-root.js.map +1 -0
- package/dist/ui/variants.d.ts +15 -0
- package/dist/ui/variants.js +14 -0
- package/dist/ui/variants.js.map +1 -0
- package/package.json +76 -50
- package/LICENSE +0 -21
- package/dist/_chunks-cjs/_visual-editing.js +0 -5898
- package/dist/_chunks-cjs/refractor.js +0 -22
- package/dist/_chunks-es/_visual-editing.mjs +0 -5904
- package/dist/_chunks-es/refractor.mjs +0 -25
- package/dist/_color.d.mts +0 -119
- package/dist/_color.d.ts +0 -119
- package/dist/_color.js +0 -1412
- package/dist/_color.mjs +0 -1411
- package/dist/_visual-editing.d.mts +0 -1126
- package/dist/_visual-editing.d.ts +0 -1126
- package/dist/_visual-editing.js +0 -30
- package/dist/_visual-editing.mjs +0 -30
- package/dist/index.d.mts +0 -3140
- package/dist/index.mjs +0 -2044
- package/dist/theme.d.mts +0 -1506
- package/dist/theme.mjs +0 -4126
- package/exports/_visual-editing.ts +0 -31
- package/exports/index.ts +0 -1
- package/exports/theme.ts +0 -1
- package/src/color/index.d.mts +0 -119
- package/src/color/index.mjs +0 -1411
- package/src/core/__workshop__/constants.ts +0 -293
- package/src/core/_compat.ts +0 -264
- package/src/core/components/autocomplete/__mocks__/apiStore.ts +0 -49
- package/src/core/components/autocomplete/__mocks__/countries.ts +0 -245
- package/src/core/components/autocomplete/__workshop__/async.tsx +0 -156
- package/src/core/components/autocomplete/__workshop__/constrainedHeight.tsx +0 -137
- package/src/core/components/autocomplete/__workshop__/custom.tsx +0 -89
- package/src/core/components/autocomplete/__workshop__/example.tsx +0 -79
- package/src/core/components/autocomplete/__workshop__/focusAndBlur.tsx +0 -36
- package/src/core/components/autocomplete/__workshop__/fullscreen.tsx +0 -294
- package/src/core/components/autocomplete/__workshop__/index.ts +0 -39
- package/src/core/components/autocomplete/__workshop__/types.ts +0 -4
- package/src/core/components/autocomplete/autocomplete.styles.tsx +0 -39
- package/src/core/components/autocomplete/autocomplete.tsx +0 -767
- package/src/core/components/autocomplete/autocompleteOption.tsx +0 -45
- package/src/core/components/autocomplete/autocompleteReducer.ts +0 -47
- package/src/core/components/autocomplete/constants.ts +0 -28
- package/src/core/components/autocomplete/index.ts +0 -2
- package/src/core/components/autocomplete/types.ts +0 -108
- package/src/core/components/breadcrumbs/__workshop__/example.tsx +0 -62
- package/src/core/components/breadcrumbs/__workshop__/index.ts +0 -14
- package/src/core/components/breadcrumbs/breadcrumbs.styles.ts +0 -18
- package/src/core/components/breadcrumbs/breadcrumbs.test.tsx +0 -51
- package/src/core/components/breadcrumbs/breadcrumbs.tsx +0 -133
- package/src/core/components/breadcrumbs/index.ts +0 -1
- package/src/core/components/dialog/__workshop__/activate.tsx +0 -134
- package/src/core/components/dialog/__workshop__/autoFocus.tsx +0 -29
- package/src/core/components/dialog/__workshop__/index.ts +0 -19
- package/src/core/components/dialog/__workshop__/layering.tsx +0 -41
- package/src/core/components/dialog/__workshop__/nested.tsx +0 -72
- package/src/core/components/dialog/__workshop__/onScroll.tsx +0 -39
- package/src/core/components/dialog/__workshop__/panes.tsx +0 -82
- package/src/core/components/dialog/__workshop__/position.tsx +0 -30
- package/src/core/components/dialog/__workshop__/props.tsx +0 -75
- package/src/core/components/dialog/__workshop__/provider.tsx +0 -11
- package/src/core/components/dialog/__workshop__/wrapped.tsx +0 -76
- package/src/core/components/dialog/dialog.tsx +0 -430
- package/src/core/components/dialog/dialogContext.ts +0 -20
- package/src/core/components/dialog/dialogProvider.tsx +0 -35
- package/src/core/components/dialog/index.ts +0 -4
- package/src/core/components/dialog/styles.ts +0 -77
- package/src/core/components/dialog/useDialog.ts +0 -11
- package/src/core/components/hotkeys/__workshop__/index.ts +0 -14
- package/src/core/components/hotkeys/__workshop__/plain.tsx +0 -9
- package/src/core/components/hotkeys/hotkeys.test.tsx +0 -42
- package/src/core/components/hotkeys/hotkeys.tsx +0 -66
- package/src/core/components/hotkeys/index.ts +0 -1
- package/src/core/components/index.ts +0 -9
- package/src/core/components/menu/__workshop__/asComponent.tsx +0 -45
- package/src/core/components/menu/__workshop__/avatarMenu.tsx +0 -51
- package/src/core/components/menu/__workshop__/closableMenuButton.tsx +0 -46
- package/src/core/components/menu/__workshop__/constrainedInBoundary.tsx +0 -134
- package/src/core/components/menu/__workshop__/customMenuItem.tsx +0 -45
- package/src/core/components/menu/__workshop__/customSelectedState.tsx +0 -39
- package/src/core/components/menu/__workshop__/disableFocusOnClose.tsx +0 -40
- package/src/core/components/menu/__workshop__/groups.tsx +0 -156
- package/src/core/components/menu/__workshop__/index.ts +0 -89
- package/src/core/components/menu/__workshop__/menuButton.tsx +0 -80
- package/src/core/components/menu/__workshop__/menuGroupRight.tsx +0 -58
- package/src/core/components/menu/__workshop__/nestedMenu.tsx +0 -22
- package/src/core/components/menu/__workshop__/onCloseMenuButton.tsx +0 -41
- package/src/core/components/menu/__workshop__/selectedItem.tsx +0 -69
- package/src/core/components/menu/__workshop__/shouldFocus.tsx +0 -47
- package/src/core/components/menu/__workshop__/tones.tsx +0 -25
- package/src/core/components/menu/__workshop__/withoutArrow.tsx +0 -32
- package/src/core/components/menu/helpers.ts +0 -82
- package/src/core/components/menu/index.ts +0 -5
- package/src/core/components/menu/menu.spacing.test.tsx +0 -63
- package/src/core/components/menu/menu.test.tsx +0 -125
- package/src/core/components/menu/menu.tsx +0 -178
- package/src/core/components/menu/menuButton.tsx +0 -268
- package/src/core/components/menu/menuContext.ts +0 -18
- package/src/core/components/menu/menuDivider.ts +0 -23
- package/src/core/components/menu/menuGroup.spacing.test.tsx +0 -63
- package/src/core/components/menu/menuGroup.tsx +0 -233
- package/src/core/components/menu/menuItem.spacing.test.tsx +0 -59
- package/src/core/components/menu/menuItem.tsx +0 -197
- package/src/core/components/menu/useMenu.ts +0 -21
- package/src/core/components/menu/useMenuController.ts +0 -231
- package/src/core/components/skeleton/__workshop__/delay.tsx +0 -70
- package/src/core/components/skeleton/__workshop__/index.ts +0 -11
- package/src/core/components/skeleton/__workshop__/skeleton.tsx +0 -64
- package/src/core/components/skeleton/index.ts +0 -2
- package/src/core/components/skeleton/skeleton.tsx +0 -57
- package/src/core/components/skeleton/styles.ts +0 -50
- package/src/core/components/skeleton/textSkeleton.tsx +0 -122
- package/src/core/components/tab/__workshop__/example.tsx +0 -79
- package/src/core/components/tab/__workshop__/index.ts +0 -14
- package/src/core/components/tab/index.ts +0 -3
- package/src/core/components/tab/tab.tsx +0 -101
- package/src/core/components/tab/tabList.test.tsx +0 -48
- package/src/core/components/tab/tabList.tsx +0 -70
- package/src/core/components/tab/tabPanel.tsx +0 -39
- package/src/core/components/toast/__workshop__/hook.tsx +0 -71
- package/src/core/components/toast/__workshop__/index.ts +0 -19
- package/src/core/components/toast/__workshop__/toast.tsx +0 -26
- package/src/core/components/toast/index.ts +0 -4
- package/src/core/components/toast/styles.ts +0 -77
- package/src/core/components/toast/toast.test.tsx +0 -101
- package/src/core/components/toast/toast.tsx +0 -198
- package/src/core/components/toast/toastContext.ts +0 -7
- package/src/core/components/toast/toastLayer.tsx +0 -51
- package/src/core/components/toast/toastProvider.tsx +0 -113
- package/src/core/components/toast/toastState.ts +0 -6
- package/src/core/components/toast/types.ts +0 -26
- package/src/core/components/toast/useToast.ts +0 -25
- package/src/core/components/tree/__workshop__/basic.perf.ts +0 -19
- package/src/core/components/tree/__workshop__/basic.tsx +0 -105
- package/src/core/components/tree/__workshop__/index.ts +0 -21
- package/src/core/components/tree/__workshop__/tabFromElement.tsx +0 -84
- package/src/core/components/tree/helpers.ts +0 -105
- package/src/core/components/tree/index.ts +0 -4
- package/src/core/components/tree/style.ts +0 -105
- package/src/core/components/tree/tree.test.tsx +0 -55
- package/src/core/components/tree/tree.tsx +0 -240
- package/src/core/components/tree/treeContext.ts +0 -10
- package/src/core/components/tree/treeGroup.tsx +0 -28
- package/src/core/components/tree/treeItem.test.tsx +0 -65
- package/src/core/components/tree/treeItem.tsx +0 -224
- package/src/core/components/tree/types.ts +0 -25
- package/src/core/components/tree/useTree.ts +0 -17
- package/src/core/constants.ts +0 -79
- package/src/core/helpers/animation.ts +0 -27
- package/src/core/helpers/element.ts +0 -55
- package/src/core/helpers/focus.ts +0 -100
- package/src/core/helpers/index.ts +0 -4
- package/src/core/helpers/scroll.ts +0 -15
- package/src/core/hooks/index.ts +0 -12
- package/src/core/hooks/useArrayProp.ts +0 -17
- package/src/core/hooks/useClickOutside.test.tsx +0 -482
- package/src/core/hooks/useClickOutside.ts +0 -118
- package/src/core/hooks/useClickOutsideEvent.test.tsx +0 -115
- package/src/core/hooks/useClickOutsideEvent.ts +0 -73
- package/src/core/hooks/useCustomValidity.ts +0 -13
- package/src/core/hooks/useDelayed.test.ts +0 -88
- package/src/core/hooks/useDelayedState.ts +0 -36
- package/src/core/hooks/useElementRect/__workshop__/example.tsx +0 -32
- package/src/core/hooks/useElementRect/__workshop__/index.ts +0 -14
- package/src/core/hooks/useElementRect/index.ts +0 -1
- package/src/core/hooks/useElementRect/useElementRect.ts +0 -13
- package/src/core/hooks/useElementSize.ts +0 -19
- package/src/core/hooks/useForwardedRef.ts +0 -19
- package/src/core/hooks/useGlobalKeyDown.ts +0 -24
- package/src/core/hooks/useIsomorphicEffect.ts +0 -7
- package/src/core/hooks/useMatchMedia.ts +0 -28
- package/src/core/hooks/useMediaIndex/__workshop__/index.ts +0 -14
- package/src/core/hooks/useMediaIndex/__workshop__/test.tsx +0 -14
- package/src/core/hooks/useMediaIndex/index.ts +0 -1
- package/src/core/hooks/useMediaIndex/useMediaIndex.test.tsx +0 -36
- package/src/core/hooks/useMediaIndex/useMediaIndex.ts +0 -102
- package/src/core/hooks/useMounted.ts +0 -15
- package/src/core/hooks/usePrefersDark.hydration.test.tsx +0 -56
- package/src/core/hooks/usePrefersDark.test.tsx +0 -19
- package/src/core/hooks/usePrefersDark.ts +0 -16
- package/src/core/hooks/usePrefersReducedMotion.hydration.test.tsx +0 -56
- package/src/core/hooks/usePrefersReducedMotion.test.tsx +0 -19
- package/src/core/hooks/usePrefersReducedMotion.ts +0 -16
- package/src/core/index.ts +0 -10
- package/src/core/lib/createGlobalScopedContext.ts +0 -36
- package/src/core/lib/globalScope.ts +0 -19
- package/src/core/lib/isRecord.ts +0 -3
- package/src/core/middleware/origin.ts +0 -47
- package/src/core/observers/elementSizeObserver.ts +0 -116
- package/src/core/observers/index.ts +0 -2
- package/src/core/observers/resizeObserver.ts +0 -9
- package/src/core/primitives/_selectable/index.ts +0 -1
- package/src/core/primitives/_selectable/selectable.tsx +0 -15
- package/src/core/primitives/_selectable/style.ts +0 -115
- package/src/core/primitives/avatar/__workshop__/asButton.tsx +0 -14
- package/src/core/primitives/avatar/__workshop__/index.ts +0 -29
- package/src/core/primitives/avatar/__workshop__/stack.tsx +0 -25
- package/src/core/primitives/avatar/__workshop__/withinButton.tsx +0 -63
- package/src/core/primitives/avatar/__workshop__/withinMenuItem.tsx +0 -70
- package/src/core/primitives/avatar/avatar.tsx +0 -200
- package/src/core/primitives/avatar/avatarCounter.tsx +0 -91
- package/src/core/primitives/avatar/avatarStack.tsx +0 -100
- package/src/core/primitives/avatar/index.ts +0 -4
- package/src/core/primitives/avatar/styles.ts +0 -167
- package/src/core/primitives/avatar/types.ts +0 -17
- package/src/core/primitives/badge/__workshop__/index.ts +0 -19
- package/src/core/primitives/badge/__workshop__/props.tsx +0 -30
- package/src/core/primitives/badge/__workshop__/tones.tsx +0 -21
- package/src/core/primitives/badge/badge.test.tsx +0 -16
- package/src/core/primitives/badge/badge.tsx +0 -70
- package/src/core/primitives/badge/index.ts +0 -1
- package/src/core/primitives/badge/styles.ts +0 -20
- package/src/core/primitives/badge/types.ts +0 -8
- package/src/core/primitives/box/__workshop__/asComponent.tsx +0 -31
- package/src/core/primitives/box/__workshop__/index.ts +0 -24
- package/src/core/primitives/box/__workshop__/props.tsx +0 -20
- package/src/core/primitives/box/__workshop__/responsive.tsx +0 -20
- package/src/core/primitives/box/box.test.tsx +0 -142
- package/src/core/primitives/box/box.tsx +0 -154
- package/src/core/primitives/box/index.ts +0 -1
- package/src/core/primitives/button/__workshop__/custom.tsx +0 -51
- package/src/core/primitives/button/__workshop__/customIcons.tsx +0 -30
- package/src/core/primitives/button/__workshop__/disabled.tsx +0 -74
- package/src/core/primitives/button/__workshop__/index.ts +0 -59
- package/src/core/primitives/button/__workshop__/labelUploadButton.tsx +0 -36
- package/src/core/primitives/button/__workshop__/mixedChildren.tsx +0 -12
- package/src/core/primitives/button/__workshop__/props.tsx +0 -55
- package/src/core/primitives/button/__workshop__/stacked.tsx +0 -58
- package/src/core/primitives/button/__workshop__/styled1.tsx +0 -17
- package/src/core/primitives/button/__workshop__/styled2.tsx +0 -19
- package/src/core/primitives/button/__workshop__/uploadButton.tsx +0 -28
- package/src/core/primitives/button/button.test.tsx +0 -82
- package/src/core/primitives/button/button.tsx +0 -210
- package/src/core/primitives/button/index.ts +0 -1
- package/src/core/primitives/button/styles.ts +0 -117
- package/src/core/primitives/card/__workshop__/allTones.tsx +0 -25
- package/src/core/primitives/card/__workshop__/asButton.tsx +0 -107
- package/src/core/primitives/card/__workshop__/asComponent.tsx +0 -27
- package/src/core/primitives/card/__workshop__/checkered.tsx +0 -26
- package/src/core/primitives/card/__workshop__/index.ts +0 -18
- package/src/core/primitives/card/__workshop__/interactive.tsx +0 -30
- package/src/core/primitives/card/__workshop__/listNavigation.tsx +0 -80
- package/src/core/primitives/card/__workshop__/props.tsx +0 -53
- package/src/core/primitives/card/__workshop__/selected.tsx +0 -94
- package/src/core/primitives/card/__workshop__/styled.tsx +0 -14
- package/src/core/primitives/card/card.tsx +0 -128
- package/src/core/primitives/card/index.ts +0 -2
- package/src/core/primitives/card/styles.ts +0 -147
- package/src/core/primitives/card/types.ts +0 -11
- package/src/core/primitives/checkbox/__workshop__/example.tsx +0 -25
- package/src/core/primitives/checkbox/__workshop__/index.ts +0 -13
- package/src/core/primitives/checkbox/__workshop__/props.tsx +0 -33
- package/src/core/primitives/checkbox/__workshop__/readOnly.tsx +0 -16
- package/src/core/primitives/checkbox/__workshop__/tones.tsx +0 -28
- package/src/core/primitives/checkbox/checkbox.tsx +0 -73
- package/src/core/primitives/checkbox/index.ts +0 -1
- package/src/core/primitives/checkbox/styles.ts +0 -128
- package/src/core/primitives/code/__workshop__/index.ts +0 -19
- package/src/core/primitives/code/__workshop__/opticalAlignment.tsx +0 -48
- package/src/core/primitives/code/__workshop__/props.tsx +0 -21
- package/src/core/primitives/code/code.tsx +0 -55
- package/src/core/primitives/code/index.ts +0 -1
- package/src/core/primitives/code/refractor.tsx +0 -20
- package/src/core/primitives/code/styles.ts +0 -77
- package/src/core/primitives/container/__workshop__/example.tsx +0 -20
- package/src/core/primitives/container/__workshop__/index.ts +0 -8
- package/src/core/primitives/container/container.tsx +0 -54
- package/src/core/primitives/container/index.ts +0 -2
- package/src/core/primitives/container/styles.ts +0 -23
- package/src/core/primitives/container/types.ts +0 -6
- package/src/core/primitives/flex/__workshop__/example.tsx +0 -34
- package/src/core/primitives/flex/__workshop__/gap.tsx +0 -25
- package/src/core/primitives/flex/__workshop__/index.ts +0 -11
- package/src/core/primitives/flex/flex.tsx +0 -64
- package/src/core/primitives/flex/index.ts +0 -1
- package/src/core/primitives/grid/__workshop__/index.ts +0 -10
- package/src/core/primitives/grid/__workshop__/responsive.tsx +0 -54
- package/src/core/primitives/grid/grid.test.tsx +0 -80
- package/src/core/primitives/grid/grid.tsx +0 -74
- package/src/core/primitives/grid/index.ts +0 -1
- package/src/core/primitives/heading/__workshop__/index.ts +0 -19
- package/src/core/primitives/heading/__workshop__/opticalAlignment.tsx +0 -54
- package/src/core/primitives/heading/__workshop__/plain.tsx +0 -32
- package/src/core/primitives/heading/heading.tsx +0 -88
- package/src/core/primitives/heading/index.ts +0 -1
- package/src/core/primitives/heading/styles.ts +0 -64
- package/src/core/primitives/heading/types.ts +0 -7
- package/src/core/primitives/index.ts +0 -27
- package/src/core/primitives/inline/__workshop__/index.ts +0 -8
- package/src/core/primitives/inline/__workshop__/plain.tsx +0 -27
- package/src/core/primitives/inline/index.ts +0 -1
- package/src/core/primitives/inline/inline.test.tsx +0 -51
- package/src/core/primitives/inline/inline.tsx +0 -63
- package/src/core/primitives/inline/styles.ts +0 -32
- package/src/core/primitives/inline/types.ts +0 -6
- package/src/core/primitives/kbd/__workshop__/index.ts +0 -8
- package/src/core/primitives/kbd/__workshop__/plain.tsx +0 -9
- package/src/core/primitives/kbd/index.ts +0 -1
- package/src/core/primitives/kbd/kbd.tsx +0 -69
- package/src/core/primitives/label/__workshop__/index.ts +0 -19
- package/src/core/primitives/label/__workshop__/opticalAlignment.tsx +0 -48
- package/src/core/primitives/label/__workshop__/plain.tsx +0 -24
- package/src/core/primitives/label/index.ts +0 -1
- package/src/core/primitives/label/label.tsx +0 -87
- package/src/core/primitives/label/styles.ts +0 -45
- package/src/core/primitives/popover/__workshop__/AlignedStory.tsx +0 -77
- package/src/core/primitives/popover/__workshop__/MarginsStory.tsx +0 -31
- package/src/core/primitives/popover/__workshop__/MatchReferenceWidthStory.tsx +0 -32
- package/src/core/primitives/popover/__workshop__/OpenOnMountStory.tsx +0 -11
- package/src/core/primitives/popover/__workshop__/PlainStory.tsx +0 -71
- package/src/core/primitives/popover/__workshop__/RecursiveStory.tsx +0 -71
- package/src/core/primitives/popover/__workshop__/SidePanelStory.tsx +0 -89
- package/src/core/primitives/popover/__workshop__/TestStory.tsx +0 -97
- package/src/core/primitives/popover/__workshop__/index.ts +0 -49
- package/src/core/primitives/popover/constants.ts +0 -22
- package/src/core/primitives/popover/floating-ui/size.ts +0 -99
- package/src/core/primitives/popover/helpers.ts +0 -31
- package/src/core/primitives/popover/index.ts +0 -2
- package/src/core/primitives/popover/popover.tsx +0 -511
- package/src/core/primitives/popover/popoverCard.tsx +0 -166
- package/src/core/primitives/popover/types.ts +0 -7
- package/src/core/primitives/radio/__workshop__/example.tsx +0 -63
- package/src/core/primitives/radio/__workshop__/index.ts +0 -11
- package/src/core/primitives/radio/__workshop__/plain.tsx +0 -28
- package/src/core/primitives/radio/index.ts +0 -1
- package/src/core/primitives/radio/radio.tsx +0 -51
- package/src/core/primitives/radio/styles.ts +0 -117
- package/src/core/primitives/select/__workshop__/index.ts +0 -11
- package/src/core/primitives/select/__workshop__/plain.tsx +0 -27
- package/src/core/primitives/select/__workshop__/readOnly.tsx +0 -23
- package/src/core/primitives/select/index.ts +0 -1
- package/src/core/primitives/select/select.test.tsx +0 -52
- package/src/core/primitives/select/select.tsx +0 -94
- package/src/core/primitives/select/styles.ts +0 -166
- package/src/core/primitives/spinner/__workshop__/Props.tsx +0 -15
- package/src/core/primitives/spinner/__workshop__/index.ts +0 -14
- package/src/core/primitives/spinner/index.ts +0 -1
- package/src/core/primitives/spinner/spinner.tsx +0 -46
- package/src/core/primitives/stack/__workshop__/index.ts +0 -14
- package/src/core/primitives/stack/__workshop__/plain.tsx +0 -32
- package/src/core/primitives/stack/index.ts +0 -1
- package/src/core/primitives/stack/stack.test.tsx +0 -57
- package/src/core/primitives/stack/stack.tsx +0 -57
- package/src/core/primitives/stack/styles.ts +0 -32
- package/src/core/primitives/switch/__workshop__/example.tsx +0 -23
- package/src/core/primitives/switch/__workshop__/index.ts +0 -11
- package/src/core/primitives/switch/__workshop__/props.tsx +0 -21
- package/src/core/primitives/switch/index.ts +0 -1
- package/src/core/primitives/switch/styles.ts +0 -173
- package/src/core/primitives/switch/switch.tsx +0 -68
- package/src/core/primitives/text/__workshop__/colored.tsx +0 -30
- package/src/core/primitives/text/__workshop__/example.tsx +0 -39
- package/src/core/primitives/text/__workshop__/index.ts +0 -24
- package/src/core/primitives/text/__workshop__/opticalAlignment.tsx +0 -48
- package/src/core/primitives/text/index.ts +0 -1
- package/src/core/primitives/text/styles.ts +0 -74
- package/src/core/primitives/text/text.tsx +0 -89
- package/src/core/primitives/textArea/__workshop__/index.ts +0 -14
- package/src/core/primitives/textArea/__workshop__/plain.tsx +0 -50
- package/src/core/primitives/textArea/index.ts +0 -1
- package/src/core/primitives/textArea/textArea.tsx +0 -120
- package/src/core/primitives/textInput/__workshop__/clearButton.tsx +0 -30
- package/src/core/primitives/textInput/__workshop__/customValidity.tsx +0 -17
- package/src/core/primitives/textInput/__workshop__/index.ts +0 -44
- package/src/core/primitives/textInput/__workshop__/plain.tsx +0 -98
- package/src/core/primitives/textInput/__workshop__/readOnly.tsx +0 -9
- package/src/core/primitives/textInput/__workshop__/states.tsx +0 -53
- package/src/core/primitives/textInput/__workshop__/tones.tsx +0 -277
- package/src/core/primitives/textInput/__workshop__/typed.tsx +0 -23
- package/src/core/primitives/textInput/index.ts +0 -1
- package/src/core/primitives/textInput/textInput.test.tsx +0 -48
- package/src/core/primitives/textInput/textInput.tsx +0 -395
- package/src/core/primitives/tooltip/__workshop__/customPortal.tsx +0 -102
- package/src/core/primitives/tooltip/__workshop__/index.ts +0 -29
- package/src/core/primitives/tooltip/__workshop__/overflowingBoundary.tsx +0 -74
- package/src/core/primitives/tooltip/__workshop__/props.tsx +0 -107
- package/src/core/primitives/tooltip/__workshop__/resizableBoundary.tsx +0 -86
- package/src/core/primitives/tooltip/constants.ts +0 -23
- package/src/core/primitives/tooltip/index.ts +0 -2
- package/src/core/primitives/tooltip/tooltip.test.tsx +0 -452
- package/src/core/primitives/tooltip/tooltip.tsx +0 -495
- package/src/core/primitives/tooltip/tooltipCard.tsx +0 -109
- package/src/core/primitives/tooltip/tooltipDelayGroup/index.ts +0 -4
- package/src/core/primitives/tooltip/tooltipDelayGroup/tooltipDelayGroupContext.tsx +0 -11
- package/src/core/primitives/tooltip/tooltipDelayGroup/tooltipDelayGroupProvider.tsx +0 -57
- package/src/core/primitives/tooltip/tooltipDelayGroup/types.ts +0 -10
- package/src/core/primitives/tooltip/tooltipDelayGroup/useTooltipDelayGroup.ts +0 -13
- package/src/core/primitives/types.ts +0 -179
- package/src/core/styles/border/borderStyle.ts +0 -56
- package/src/core/styles/border/index.ts +0 -2
- package/src/core/styles/border/types.ts +0 -10
- package/src/core/styles/box/boxStyle.ts +0 -69
- package/src/core/styles/box/index.ts +0 -2
- package/src/core/styles/box/types.ts +0 -11
- package/src/core/styles/card/_cardColorStyle.ts +0 -108
- package/src/core/styles/card/index.ts +0 -1
- package/src/core/styles/flex/flexItemStyle.ts +0 -27
- package/src/core/styles/flex/flexStyle.ts +0 -70
- package/src/core/styles/flex/index.ts +0 -3
- package/src/core/styles/flex/types.ts +0 -25
- package/src/core/styles/focusRing/index.ts +0 -25
- package/src/core/styles/font/codeFontStyle.ts +0 -13
- package/src/core/styles/font/headingFontStyle.ts +0 -13
- package/src/core/styles/font/index.ts +0 -6
- package/src/core/styles/font/labelFontStyle.ts +0 -13
- package/src/core/styles/font/responsiveFont.ts +0 -103
- package/src/core/styles/font/textAlignStyle.ts +0 -19
- package/src/core/styles/font/textFontStyle.ts +0 -13
- package/src/core/styles/font/types.ts +0 -35
- package/src/core/styles/grid/gridItemStyle.ts +0 -82
- package/src/core/styles/grid/gridStyle.ts +0 -108
- package/src/core/styles/grid/index.ts +0 -3
- package/src/core/styles/grid/types.ts +0 -37
- package/src/core/styles/helpers.ts +0 -72
- package/src/core/styles/index.ts +0 -5
- package/src/core/styles/input/index.ts +0 -2
- package/src/core/styles/input/responsiveInputPaddingStyle.ts +0 -78
- package/src/core/styles/input/textInputStyle.ts +0 -263
- package/src/core/styles/internal.ts +0 -12
- package/src/core/styles/margin/index.ts +0 -2
- package/src/core/styles/margin/marginStyle.ts +0 -21
- package/src/core/styles/margin/marginsStyle.test.ts +0 -33
- package/src/core/styles/margin/types.ts +0 -9
- package/src/core/styles/padding/index.ts +0 -2
- package/src/core/styles/padding/paddingStyle.test.ts +0 -33
- package/src/core/styles/padding/paddingStyle.ts +0 -21
- package/src/core/styles/padding/types.ts +0 -12
- package/src/core/styles/radius/index.ts +0 -2
- package/src/core/styles/radius/radiusStyle.ts +0 -23
- package/src/core/styles/radius/types.ts +0 -8
- package/src/core/styles/shadow/index.ts +0 -2
- package/src/core/styles/shadow/shadowStyle.ts +0 -29
- package/src/core/styles/shadow/types.ts +0 -6
- package/src/core/styles/types.ts +0 -8
- package/src/core/theme/__workshop__/build/Root.tsx +0 -367
- package/src/core/theme/__workshop__/build/helpers.ts +0 -46
- package/src/core/theme/__workshop__/build/story.tsx +0 -465
- package/src/core/theme/__workshop__/canvas.tsx +0 -352
- package/src/core/theme/__workshop__/color.tsx +0 -62
- package/src/core/theme/__workshop__/debug/story.tsx +0 -408
- package/src/core/theme/__workshop__/index.ts +0 -39
- package/src/core/theme/__workshop__/layer.tsx +0 -78
- package/src/core/theme/__workshop__/nestedProvider.tsx +0 -15
- package/src/core/theme/index.ts +0 -5
- package/src/core/theme/theme.test.tsx +0 -73
- package/src/core/theme/themeColorProvider.tsx +0 -29
- package/src/core/theme/themeContext.ts +0 -10
- package/src/core/theme/themeProvider.tsx +0 -62
- package/src/core/theme/types.ts +0 -12
- package/src/core/theme/useRootTheme.ts +0 -17
- package/src/core/theme/useTheme.ts +0 -16
- package/src/core/types/avatar.ts +0 -14
- package/src/core/types/badge.ts +0 -12
- package/src/core/types/box.ts +0 -19
- package/src/core/types/button.ts +0 -21
- package/src/core/types/card.ts +0 -6
- package/src/core/types/component.ts +0 -32
- package/src/core/types/dialog.ts +0 -4
- package/src/core/types/flex.ts +0 -30
- package/src/core/types/grid.ts +0 -14
- package/src/core/types/gridItem.ts +0 -29
- package/src/core/types/index.ts +0 -15
- package/src/core/types/placement.ts +0 -18
- package/src/core/types/popover.ts +0 -4
- package/src/core/types/radius.ts +0 -4
- package/src/core/types/selectable.ts +0 -6
- package/src/core/types/text.ts +0 -4
- package/src/core/utils/arrow/arrow.tsx +0 -123
- package/src/core/utils/arrow/cmds.ts +0 -91
- package/src/core/utils/arrow/index.ts +0 -1
- package/src/core/utils/boundaryElement/__workshop__/index.ts +0 -14
- package/src/core/utils/boundaryElement/__workshop__/plain.tsx +0 -19
- package/src/core/utils/boundaryElement/boundaryElement.test.tsx +0 -100
- package/src/core/utils/boundaryElement/boundaryElementContext.ts +0 -7
- package/src/core/utils/boundaryElement/boundaryElementProvider.tsx +0 -24
- package/src/core/utils/boundaryElement/index.ts +0 -3
- package/src/core/utils/boundaryElement/types.ts +0 -7
- package/src/core/utils/boundaryElement/useBoundaryElement.ts +0 -26
- package/src/core/utils/conditionalWrapper/conditionalWrapper.tsx +0 -21
- package/src/core/utils/conditionalWrapper/index.ts +0 -1
- package/src/core/utils/elementQuery/__workshop__/customMedia.tsx +0 -30
- package/src/core/utils/elementQuery/__workshop__/index.ts +0 -14
- package/src/core/utils/elementQuery/elementQuery.tsx +0 -53
- package/src/core/utils/elementQuery/helpers.ts +0 -27
- package/src/core/utils/elementQuery/index.ts +0 -1
- package/src/core/utils/errorBoundary.tsx +0 -48
- package/src/core/utils/getElementRef.ts +0 -26
- package/src/core/utils/index.ts +0 -9
- package/src/core/utils/layer/__workshop__/_debug.tsx +0 -17
- package/src/core/utils/layer/__workshop__/index.ts +0 -24
- package/src/core/utils/layer/__workshop__/multipleRoots.tsx +0 -49
- package/src/core/utils/layer/__workshop__/nested.tsx +0 -98
- package/src/core/utils/layer/__workshop__/responsiveZOffset.tsx +0 -13
- package/src/core/utils/layer/getLayerContext.test.ts +0 -30
- package/src/core/utils/layer/getLayerContext.ts +0 -21
- package/src/core/utils/layer/index.ts +0 -4
- package/src/core/utils/layer/layer.test.tsx +0 -108
- package/src/core/utils/layer/layer.tsx +0 -98
- package/src/core/utils/layer/layerContext.ts +0 -7
- package/src/core/utils/layer/layerProvider.tsx +0 -111
- package/src/core/utils/layer/types.ts +0 -9
- package/src/core/utils/layer/useLayer.ts +0 -26
- package/src/core/utils/portal/__workshop__/index.ts +0 -14
- package/src/core/utils/portal/__workshop__/named.tsx +0 -63
- package/src/core/utils/portal/index.ts +0 -4
- package/src/core/utils/portal/portal.test.tsx +0 -103
- package/src/core/utils/portal/portal.ts +0 -32
- package/src/core/utils/portal/portalContext.ts +0 -31
- package/src/core/utils/portal/portalProvider.tsx +0 -47
- package/src/core/utils/portal/types.ts +0 -9
- package/src/core/utils/portal/usePortal.ts +0 -25
- package/src/core/utils/spanWithTextOverflow.tsx +0 -10
- package/src/core/utils/srOnly/index.ts +0 -1
- package/src/core/utils/srOnly/srOnly.tsx +0 -36
- package/src/core/utils/virtualList/__workshop__/changingProps.tsx +0 -36
- package/src/core/utils/virtualList/__workshop__/elementScroll.tsx +0 -24
- package/src/core/utils/virtualList/__workshop__/index.ts +0 -29
- package/src/core/utils/virtualList/__workshop__/infiniteList.tsx +0 -48
- package/src/core/utils/virtualList/__workshop__/windowScrolll.tsx +0 -22
- package/src/core/utils/virtualList/index.ts +0 -1
- package/src/core/utils/virtualList/virtualList.tsx +0 -200
- package/src/theme/build/_deprecated/color/_selectable/createSelectableTones.ts +0 -76
- package/src/theme/build/_deprecated/color/_solid/createSolidTones.ts +0 -54
- package/src/theme/build/_deprecated/color/button/createButtonModes.ts +0 -22
- package/src/theme/build/_deprecated/color/button/createButtonTones.ts +0 -55
- package/src/theme/build/_deprecated/color/card/createCardStates.ts +0 -60
- package/src/theme/build/_deprecated/color/color.test.ts +0 -63
- package/src/theme/build/_deprecated/color/defaults.ts +0 -390
- package/src/theme/build/_deprecated/color/factory.ts +0 -142
- package/src/theme/build/_deprecated/color/index.ts +0 -1
- package/src/theme/build/_deprecated/color/input/createInputModes.ts +0 -81
- package/src/theme/build/_deprecated/color/muted/createMuted.ts +0 -54
- package/src/theme/build/_deprecated/color/spot/createSpot.ts +0 -20
- package/src/theme/build/buildColorTheme.test.ts +0 -183
- package/src/theme/build/buildColorTheme.ts +0 -499
- package/src/theme/build/buildTheme.test.ts +0 -87
- package/src/theme/build/buildTheme.ts +0 -36
- package/src/theme/build/colorToken/colorToken.ts +0 -19
- package/src/theme/build/colorToken/compileColorToken.ts +0 -21
- package/src/theme/build/colorToken/index.ts +0 -2
- package/src/theme/build/colorToken/types.ts +0 -6
- package/src/theme/build/index.ts +0 -3
- package/src/theme/build/lib/color-fns/blend/index.ts +0 -3
- package/src/theme/build/lib/color-fns/blend/mix.ts +0 -21
- package/src/theme/build/lib/color-fns/blend/multiply.ts +0 -18
- package/src/theme/build/lib/color-fns/blend/screen.ts +0 -18
- package/src/theme/build/lib/color-fns/color-fns.test.ts +0 -68
- package/src/theme/build/lib/color-fns/contrastRatio.ts +0 -31
- package/src/theme/build/lib/color-fns/convert.ts +0 -150
- package/src/theme/build/lib/color-fns/index.ts +0 -6
- package/src/theme/build/lib/color-fns/parse.ts +0 -60
- package/src/theme/build/lib/color-fns/rgba.ts +0 -10
- package/src/theme/build/lib/color-fns/types.ts +0 -28
- package/src/theme/build/lib/isRecord.ts +0 -3
- package/src/theme/build/lib/lazy.ts +0 -30
- package/src/theme/build/lib/utils.ts +0 -19
- package/src/theme/build/merge.ts +0 -26
- package/src/theme/build/mixThemeColor.test.ts +0 -21
- package/src/theme/build/mixThemeColor.ts +0 -53
- package/src/theme/build/renderColorTheme.ts +0 -532
- package/src/theme/build/renderColorValue.ts +0 -85
- package/src/theme/build/resolveColorTokens.ts +0 -268
- package/src/theme/build/theme.test.ts +0 -27
- package/src/theme/config/helpers.ts +0 -55
- package/src/theme/config/index.ts +0 -4
- package/src/theme/config/system.ts +0 -115
- package/src/theme/config/tokens/color/index.ts +0 -1
- package/src/theme/config/tokens/color/types.ts +0 -133
- package/src/theme/config/tokens/index.ts +0 -4
- package/src/theme/config/tokens/parseTokenKey.test.ts +0 -64
- package/src/theme/config/tokens/parseTokenKey.ts +0 -67
- package/src/theme/config/tokens/parseTokenValue.test.ts +0 -42
- package/src/theme/config/tokens/parseTokenValue.ts +0 -133
- package/src/theme/config/tokens/types.ts +0 -53
- package/src/theme/config/types.ts +0 -46
- package/src/theme/defaults/colorPalette.ts +0 -5
- package/src/theme/defaults/colorTokens.ts +0 -648
- package/src/theme/defaults/config.ts +0 -84
- package/src/theme/defaults/fonts.ts +0 -227
- package/src/theme/getScopedTheme.ts +0 -98
- package/src/theme/index.ts +0 -5
- package/src/theme/system/avatar.ts +0 -14
- package/src/theme/system/color/_constants.ts +0 -45
- package/src/theme/system/color/_helpers.ts +0 -24
- package/src/theme/system/color/_system.ts +0 -40
- package/src/theme/system/color/avatar.ts +0 -15
- package/src/theme/system/color/badge.ts +0 -16
- package/src/theme/system/color/button.ts +0 -17
- package/src/theme/system/color/color.ts +0 -34
- package/src/theme/system/color/index.ts +0 -13
- package/src/theme/system/color/input.ts +0 -25
- package/src/theme/system/color/kbd.ts +0 -8
- package/src/theme/system/color/selectable.ts +0 -12
- package/src/theme/system/color/shadow.ts +0 -7
- package/src/theme/system/color/state.ts +0 -43
- package/src/theme/system/color/syntax.ts +0 -41
- package/src/theme/system/css.ts +0 -14
- package/src/theme/system/focusRing.ts +0 -7
- package/src/theme/system/font.ts +0 -52
- package/src/theme/system/index.ts +0 -11
- package/src/theme/system/input.ts +0 -33
- package/src/theme/system/layer.ts +0 -8
- package/src/theme/system/shadow.ts +0 -19
- package/src/theme/system/styles.ts +0 -13
- package/src/theme/system/theme.ts +0 -138
- package/src/theme/system/v0/avatar.ts +0 -10
- package/src/theme/system/v0/color/_generic.ts +0 -35
- package/src/theme/system/v0/color/_system.ts +0 -17
- package/src/theme/system/v0/color/base.ts +0 -21
- package/src/theme/system/v0/color/button.ts +0 -42
- package/src/theme/system/v0/color/card.ts +0 -19
- package/src/theme/system/v0/color/color.ts +0 -40
- package/src/theme/system/v0/color/index.ts +0 -11
- package/src/theme/system/v0/color/input.ts +0 -34
- package/src/theme/system/v0/color/muted.ts +0 -26
- package/src/theme/system/v0/color/selectable.ts +0 -31
- package/src/theme/system/v0/color/solid.ts +0 -26
- package/src/theme/system/v0/color/spot.ts +0 -13
- package/src/theme/system/v0/index.ts +0 -3
- package/src/theme/system/v0/input.ts +0 -23
- package/src/theme/versioning/getTheme_v2.ts +0 -57
- package/src/theme/versioning/index.ts +0 -5
- package/src/theme/versioning/is_v0.ts +0 -6
- package/src/theme/versioning/is_v2.ts +0 -6
- package/src/theme/versioning/themeColor_v0_v2.ts +0 -243
- package/src/theme/versioning/themeColor_v2_v2_9.ts +0 -49
- package/src/theme/versioning/v0_v2.ts +0 -94
- package/src/theme/versioning/v2_v0.ts +0 -135
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pricing.entries.js","names":[],"sources":["../../../src/library/entries/pricing.entries.ts"],"sourcesContent":["/**\n * KIT LIBRARY · Pricing & plans — the edge cases the core `pricing` example (src/schema/examples/pricing.ts) does NOT\n * cover: explicit per-cycle prices with payment-provider ids, seat pricing and \"everything in X, plus\", usage\n * calculators with tiered rates, keyed feature matrices with limits/partials/add-ons, a single plan with add-ons,\n * the enterprise card, a pricing FAQ that never drifts from the prices, and an audience-aware savings banner.\n * Brands: Northwind (developer platform for event pipelines and webhooks) and Juniper Physio (a physical therapy clinic).\n */\nimport type { FieldSchema } from \"../../schema/types\";\nimport type { KitEntry } from \"../types\";\nimport { tableFrom } from \"../../schema/table\";\n\nconst img = (seed: string, w = 400, h = 160, alt = \"\") => ({ url: `https://picsum.photos/seed/${seed}/${w}/${h}`, alt, name: `${seed}.png`, width: w, height: h });\n\nconst currencyField: FieldSchema = {\n name: \"currency\",\n title: \"Currency\",\n type: \"select\",\n group: \"settings\",\n initialValue: \"USD\",\n options: [{ value: \"USD\", label: \"US dollar\" }, { value: \"EUR\", label: \"Euro\" }, { value: \"GBP\", label: \"Pound sterling\" }],\n description: \"Doesn't convert prices.\",\n};\n\nexport const ENTRIES: KitEntry[] = [\n /* ───────────────────────────── 1 · Tiers with a billing toggle ───────────────────────────── */\n {\n id: \"pricing-tiers-billing-toggle\",\n label: \"Plans with monthly / yearly switch\",\n proves: \"Both cycle prices written per tier (no computed discount) · per-seat pricing as a conditional · 'Everything in X, plus' inheritance · developer-locked payment price IDs\",\n category: \"Pricing & plans\",\n brand: \"Northwind\",\n previewLayout: \"grid-3\",\n tags: [\"commerce\", \"conditional\", \"validation\", \"repeater\", \"variants\"],\n schema: {\n name: \"planTiers\",\n title: \"Pricing plans\",\n kind: \"block\",\n icon: \"currency-dollar\",\n category: \"Pricing & plans\",\n description: \"Plan columns with a monthly / yearly switch\",\n variants: [\n { id: \"columns\", name: \"Columns\" },\n { id: \"cards-compact\", name: \"Compact cards\", description: \"Less copy, for a pricing strip on the home page\" },\n ],\n preview: { title: \"heading\", subtitle: \"toggle.defaultCycle\" },\n groups: [\n { name: \"content\", title: \"Content\", default: true },\n { name: \"plans\", title: \"Plans\" },\n { name: \"settings\", title: \"Settings\" },\n ],\n fieldsets: [\n { name: \"monthly\", title: \"Billed monthly\" },\n { name: \"yearly\", title: \"Billed yearly\" },\n { name: \"ids\", title: \"Payment IDs\", description: \"Set by a developer. Checkout uses these, not the numbers above.\", collapsed: true },\n ],\n fields: [\n { name: \"eyebrow\", title: \"Eyebrow\", type: \"string\", validation: { max: 32 } },\n { name: \"heading\", title: \"Heading\", type: \"string\", validation: { required: true, recommendedMax: 48 }, ai: true, localized: true },\n { name: \"intro\", title: \"Intro\", type: \"text\", rows: 2, validation: { recommendedMax: 160 }, ai: true },\n {\n name: \"toggle\",\n title: \"Billing switch\",\n type: \"object\",\n icon: \"toggle-right\",\n openMode: \"inline\",\n fields: [\n {\n name: \"defaultCycle\",\n title: \"Opens on\",\n type: \"select\",\n layout: \"segmented\",\n initialValue: \"yearly\",\n options: [{ value: \"monthly\", label: \"Monthly\" }, { value: \"yearly\", label: \"Yearly\" }],\n },\n { name: \"badge\", title: \"Yearly badge\", type: \"string\", validation: { max: 16 }, placeholder: \"Save 20%\" },\n ],\n },\n {\n name: \"plans\",\n title: \"Plans\",\n type: \"array\",\n group: \"plans\",\n itemNoun: \"plan\",\n validation: { min: 2, max: 4 },\n of: [\n {\n name: \"plan\",\n title: \"Plan\",\n type: \"object\",\n icon: \"badge\",\n preview: { title: \"name\", subtitle: \"audience\", fallback: \"Untitled plan\" },\n fields: [\n { name: \"name\", title: \"Plan name\", type: \"string\", validation: { required: true, max: 20 } },\n { name: \"audience\", title: \"Who it's for\", type: \"string\", validation: { recommendedMax: 60 }, placeholder: \"For teams shipping to production\" },\n {\n name: \"pricing\",\n title: \"Price\",\n type: \"select\",\n layout: \"segmented\",\n initialValue: \"flat\",\n options: [\n { value: \"free\", label: \"Free\" },\n { value: \"flat\", label: \"Flat\" },\n { value: \"seat\", label: \"Per seat\" },\n { value: \"custom\", label: \"Custom\" },\n ],\n },\n { name: \"monthly\", title: \"Price\", type: \"number\", fieldset: \"monthly\", numeric: { unit: \"USD\", min: 0, step: 1 }, hidden: { field: \"pricing\", equals: [\"flat\", \"seat\"] }, validation: { required: true }, description: \"Per month, when paid monthly.\" },\n { name: \"yearly\", title: \"Price a month\", type: \"number\", fieldset: \"yearly\", numeric: { unit: \"USD\", min: 0, step: 1 }, hidden: { field: \"pricing\", equals: [\"flat\", \"seat\"] }, validation: { required: true }, description: \"Per month, when paid yearly.\" },\n { name: \"minSeats\", title: \"Minimum seats\", type: \"number\", hidden: { field: \"pricing\", equals: \"seat\" }, numeric: { min: 1, max: 50, step: 1, unit: \"seats\" }, description: \"The price above is per seat.\" },\n { name: \"customLabel\", title: \"Price label\", type: \"string\", hidden: { field: \"pricing\", equals: \"custom\" }, validation: { max: 20 }, placeholder: \"Let's talk\" },\n { name: \"button\", title: \"Button\", type: \"button\", validation: { required: true } },\n { name: \"badge\", title: \"Badge\", type: \"string\", validation: { max: 18 }, placeholder: \"Most popular\" },\n { name: \"inherits\", title: \"Everything in\", type: \"string\", validation: { max: 20 }, description: \"The previous plan's name. Shows \\\"Everything in Pro, plus:\\\".\" },\n { name: \"features\", title: \"Features\", type: \"array\", itemNoun: \"feature\", of: [{ name: \"feature\", title: \"Feature\", type: \"string\" }], validation: { max: 8 }, description: \"Only what's new when \\\"Everything in\\\" is set.\" },\n { name: \"stripeMonthly\", title: \"Monthly price ID\", type: \"string\", fieldset: \"ids\", access: { edit: \"schema.manage\" }, lockReason: \"Set by the developer in Stripe\", hidden: { field: \"pricing\", equals: [\"flat\", \"seat\"] }, validation: { pattern: \"^price_[A-Za-z0-9]+$\", patternMessage: \"Use a Stripe price ID, like price_1PqRsT.\" } },\n { name: \"stripeYearly\", title: \"Yearly price ID\", type: \"string\", fieldset: \"ids\", access: { edit: \"schema.manage\" }, lockReason: \"Set by the developer in Stripe\", hidden: { field: \"pricing\", equals: [\"flat\", \"seat\"] }, validation: { pattern: \"^price_[A-Za-z0-9]+$\", patternMessage: \"Use a Stripe price ID, like price_1PqRsT.\" } },\n ],\n },\n ],\n },\n { name: \"footnote\", title: \"Footnote\", type: \"text\", rows: 2, group: \"settings\", validation: { max: 200 } },\n currencyField,\n ],\n },\n value: {\n _variant: \"columns\",\n eyebrow: \"Pricing\",\n heading: \"Start free. Pay when you ship.\",\n intro: \"Every plan includes unlimited endpoints, signed webhooks and automatic retries.\",\n toggle: { defaultCycle: \"yearly\", badge: \"Save 20%\" },\n plans: [\n {\n _key: \"pl1\",\n name: \"Hobby\",\n audience: \"For side projects and prototypes\",\n pricing: \"free\",\n button: { label: \"Start building\", href: \"https://app.northwind.dev/signup\", type: \"url\", style: \"outline\" },\n features: [\"100k events a month\", \"3-day event history\", \"Community support\"],\n },\n {\n _key: \"pl2\",\n name: \"Pro\",\n audience: \"For apps in production\",\n pricing: \"flat\",\n monthly: 49,\n yearly: 39,\n button: { label: \"Start 14-day trial\", href: \"https://app.northwind.dev/signup?plan=pro\", type: \"url\", style: \"primary\", arrow: true },\n badge: \"Most popular\",\n inherits: \"Hobby\",\n features: [\"2M events a month\", \"30-day event history\", \"Replay failed deliveries\", \"Email support, 1-day reply\"],\n stripeMonthly: \"price_1PqProMonthly49\",\n stripeYearly: \"price_1PqProYearly468\",\n },\n {\n _key: \"pl3\",\n name: \"Team\",\n audience: \"For teams with on-call rotations\",\n pricing: \"seat\",\n monthly: 25,\n yearly: 20,\n minSeats: 3,\n button: { label: \"Start 14-day trial\", href: \"https://app.northwind.dev/signup?plan=team\", type: \"url\", style: \"secondary\" },\n inherits: \"Pro\",\n features: [\"10M events a month\", \"90-day event history\", \"SSO with Google and Okta\", \"Audit log\"],\n stripeMonthly: \"price_1PqTeamSeatMonthly25\",\n stripeYearly: \"price_1PqTeamSeatYearly240\",\n },\n {\n _key: \"pl4\",\n name: \"Enterprise\",\n audience: \"For regulated industries and high volume\",\n pricing: \"custom\",\n customLabel: \"Let's talk\",\n button: { label: \"Talk to sales\", href: \"/contact-sales\", type: \"page\", style: \"outline\" },\n inherits: \"Team\",\n features: [\"Volume pricing\", \"Dedicated region\", \"99.99% uptime SLA\", \"HIPAA BAA\"],\n },\n ],\n footnote: \"Prices in USD, excluding tax. Events over your plan's allowance are billed at $0.40 per 100k.\",\n currency: \"USD\",\n },\n notes: {\n why:\n \"Unlike the core Pricing block (one amount + a global yearly-discount slider), real SaaS pricing pages publish BOTH cycle prices per plan because they rarely match one tidy percentage ($49 → $39 is 20%, $25 → $20 is 20%, but legacy plans drift). So each plan stores monthly + yearly as explicit numbers, conditional on a 4-way pricing select (free / flat / per seat / custom), with per-seat adding a minimum seats field. 'Everything in X, plus' is modelled as an `inherits` label + a features list of only the deltas, which is how readers scan tiers. Stripe price IDs sit in a collapsed, developer-locked fieldset: the page and checkout share one plan row, so a marketer can change the copy but never which price is charged.\",\n sanity:\n \"`planTiers` object with `plans: array<object{name, pricing: string, monthly: number, yearly: number, minSeats, button, inherits, features: array<string>, stripeMonthly, stripeYearly}>`, `readOnly: ({currentUser}) => !isDev(currentUser)` for the IDs and `hidden: ({parent}) => …` for the price fields. Many teams keep plans as `plan` documents referenced from the section so the pricing page, the in-app upgrade modal and the docs read one source.\",\n htmlSignals: [\n \"a Monthly/Yearly (Annual) segmented switch or toggle above 2–4 plan columns, often with a 'Save 20%' pill\",\n \"each column: plan name, price with '/mo' or '/user/month', a CTA, a ✓ feature list\",\n \"data-monthly / data-yearly attributes or two price spans toggled by the switch\",\n \"'Everything in Pro, plus' lead-in lines\",\n \"checkout links containing price_… / plan= / priceId= parameters\",\n ],\n mcp:\n \"Read BOTH states of the switch (data attributes, hidden spans, or the script's price map) — never derive yearly from monthly with a percentage. Price text with '/user' or '/seat' → pricing:'seat'; '$0' or 'Free' → 'free'; 'Contact'/'Custom'/'Let's talk' → 'custom' + customLabel. 'Everything in X' → inherits:'X' and only the following bullets → features. Badge ribbons → badge. Stripe/Paddle IDs found in checkout URLs → stripeMonthly/stripeYearly (they're developer-locked afterwards). The switch's initially checked state → toggle.defaultCycle.\",\n pitfalls: [\n \"A 'Save 20%' badge that isn't true for every plan is misleading; the schema can't check it yet (no computed fields).\",\n \"`inherits` is a free string, not a reference to a sibling plan — renaming a plan leaves stale 'Everything in' lines (gap: references within the same entry).\",\n \"Per-seat prices must say 'per seat' near the number, not only in the footnote.\",\n ],\n },\n },\n\n /* ───────────────────────────── 2 · Usage-based calculator ───────────────────────────── */\n {\n id: \"pricing-usage-calculator\",\n label: \"Usage-based price calculator\",\n proves: \"Slider inputs keyed for a formula · rates › graduated tiers per input (4 levels) · base price + included units · contact-sales threshold\",\n category: \"Pricing & plans\",\n brand: \"Northwind\",\n previewLayout: \"split\",\n tags: [\"deep-nesting\", \"repeater\", \"validation\", \"conditional\", \"commerce\"],\n schema: {\n name: \"usageCalculator\",\n title: \"Price calculator\",\n kind: \"block\",\n icon: \"calculator\",\n category: \"Pricing & plans\",\n description: \"Sliders for usage, with the monthly estimate worked out live\",\n preview: { title: \"heading\", subtitle: \"intro\" },\n groups: [\n { name: \"content\", title: \"Content\", default: true },\n { name: \"inputs\", title: \"Sliders\" },\n { name: \"rates\", title: \"Rates\" },\n { name: \"settings\", title: \"Settings\" },\n ],\n fields: [\n { name: \"heading\", title: \"Heading\", type: \"string\", validation: { required: true, recommendedMax: 48 } },\n { name: \"intro\", title: \"Intro\", type: \"text\", rows: 2, validation: { recommendedMax: 160 } },\n {\n name: \"inputs\",\n title: \"Sliders\",\n type: \"array\",\n group: \"inputs\",\n itemNoun: \"slider\",\n validation: { min: 1, max: 4 },\n of: [\n {\n name: \"input\",\n title: \"Slider\",\n type: \"object\",\n icon: \"adjustments-horizontal\",\n preview: { title: \"label\", subtitle: \"unit\", fallback: \"Untitled slider\" },\n fields: [\n { name: \"key\", title: \"Key\", type: \"string\", access: { edit: \"schema.manage\" }, lockReason: \"Used by the rates below\", validation: { required: true, pattern: \"^[a-z][a-zA-Z0-9]*$\", patternMessage: \"Use camelCase letters and numbers, like hoursPerRun.\" } },\n { name: \"label\", title: \"Label\", type: \"string\", validation: { required: true, max: 40 } },\n { name: \"help\", title: \"Hint\", type: \"string\", validation: { max: 90 } },\n { name: \"unit\", title: \"Unit\", type: \"string\", validation: { max: 16 }, placeholder: \"events\" },\n { name: \"min\", title: \"Lowest\", type: \"number\", validation: { required: true } },\n { name: \"max\", title: \"Highest\", type: \"number\", validation: { required: true } },\n { name: \"start\", title: \"Starts at\", type: \"number\", validation: { required: true } },\n {\n name: \"scale\",\n title: \"Scale\",\n type: \"select\",\n layout: \"segmented\",\n initialValue: \"linear\",\n options: [\n { value: \"linear\", label: \"Even steps\" },\n { value: \"log\", label: \"Grows faster\", description: \"For ranges like 100k to 100M\" },\n ],\n },\n ],\n },\n ],\n },\n { name: \"basePrice\", title: \"Platform fee\", type: \"number\", group: \"rates\", numeric: { unit: \"USD\", min: 0, step: 1 }, description: \"Monthly, before usage. 0 for pay-as-you-go.\" },\n {\n name: \"rates\",\n title: \"Rates\",\n type: \"array\",\n group: \"rates\",\n itemNoun: \"rate\",\n validation: { min: 1, max: 4 },\n of: [\n {\n name: \"rate\",\n title: \"Rate\",\n type: \"object\",\n icon: \"receipt\",\n preview: { title: \"input\", subtitle: \"included\", fallback: \"Untitled rate\" },\n fields: [\n { name: \"input\", title: \"For slider\", type: \"string\", validation: { required: true }, description: \"The slider's key, e.g. events.\" },\n { name: \"included\", title: \"Included free\", type: \"number\", numeric: { min: 0, step: 1 }, description: \"Units covered by the platform fee.\" },\n { name: \"per\", title: \"Priced per\", type: \"number\", initialValue: 1, numeric: { min: 1, step: 1 }, description: \"Bundle size, e.g. 100000 for \\\"per 100k events\\\".\" },\n {\n name: \"tiers\",\n title: \"Price steps\",\n type: \"array\",\n itemNoun: \"step\",\n openMode: \"inline\",\n validation: { min: 1, max: 6 },\n description: \"Each step prices only the units inside it.\",\n of: [\n {\n name: \"tier\",\n title: \"Step\",\n type: \"object\",\n icon: \"stairs\",\n preview: { title: \"upTo\", subtitle: \"price\", fallback: \"Untitled step\" },\n fields: [\n { name: \"upTo\", title: \"Up to\", type: \"number\", numeric: { min: 1, step: 1 }, description: \"Leave empty on the last step for \\\"and above\\\".\" },\n { name: \"price\", title: \"Price\", type: \"number\", numeric: { unit: \"USD\", min: 0, step: 0.01 }, validation: { required: true } },\n ],\n },\n ],\n },\n ],\n },\n ],\n },\n { name: \"showBreakdown\", title: \"Show the breakdown\", type: \"boolean\", group: \"settings\", initialValue: true },\n { name: \"contactAbove\", title: \"Talk to sales above\", type: \"number\", group: \"settings\", numeric: { unit: \"USD\", min: 0, step: 100 }, description: \"Above this, a sales button replaces the price. Leave empty for never.\" },\n { name: \"salesButton\", title: \"Sales button\", type: \"button\", group: \"settings\", hidden: { field: \"contactAbove\", notEmpty: true } },\n { name: \"button\", title: \"Button\", type: \"button\", validation: { required: true } },\n { name: \"disclaimer\", title: \"Disclaimer\", type: \"string\", group: \"settings\", validation: { max: 140 } },\n currencyField,\n ],\n },\n value: {\n heading: \"Estimate your monthly bill\",\n intro: \"Pay for the events you send. No per-endpoint fees, no surprise overages.\",\n inputs: [\n { _key: \"in1\", key: \"events\", label: \"Events a month\", help: \"Count every webhook delivery attempt, retries included.\", unit: \"events\", min: 100000, max: 100000000, start: 5000000, scale: \"log\" },\n { _key: \"in2\", key: \"retentionDays\", label: \"Event history\", unit: \"days\", min: 3, max: 90, start: 30, scale: \"linear\" },\n ],\n basePrice: 49,\n rates: [\n {\n _key: \"ra1\",\n input: \"events\",\n included: 2000000,\n per: 100000,\n tiers: [\n { _key: \"ti1\", upTo: 10000000, price: 0.4 },\n { _key: \"ti2\", upTo: 50000000, price: 0.3 },\n { _key: \"ti3\", price: 0.2 },\n ],\n },\n {\n _key: \"ra2\",\n input: \"retentionDays\",\n included: 30,\n per: 30,\n tiers: [{ _key: \"ti4\", price: 20 }],\n },\n ],\n showBreakdown: true,\n contactAbove: 2500,\n salesButton: { label: \"Get volume pricing\", href: \"/contact-sales\", type: \"page\", style: \"secondary\" },\n button: { label: \"Start 14-day trial\", href: \"https://app.northwind.dev/signup?plan=pro\", type: \"url\", style: \"primary\", arrow: true },\n disclaimer: \"An estimate before tax. Your invoice uses your actual usage for the month.\",\n currency: \"USD\",\n },\n notes: {\n why:\n \"A calculator is INPUTS + a PRICE MODEL, and the model must be data, not a formula string a marketer can break: sliders are keyed objects (key developer-locked, label/hint/range editable), and each rate points at a slider key and holds included units, a bundle size and graduated steps — section › rates › rate › tiers › tier. That covers the common SaaS shapes (base fee + included allowance + graduated overage, flat add-on per block) without code. The 'Talk to sales above' threshold is conditional with its own button so very large estimates route to a human, which is both honest and how volume deals actually close.\",\n sanity:\n \"`usageCalculator` object with `inputs: array<object{key, label, min, max, start, scale}>` and `rates: array<object{input: string, included, per, tiers: array<object{upTo, price}>}>`; the arithmetic lives in the frontend component. Sanity can't reference a sibling array item either, so `input` would be a string validated with `Rule.custom` against `document.inputs[].key`.\",\n htmlSignals: [\n \"<input type=range> sliders with live-updating number labels and a total price that changes as they move\",\n \"copy like 'Estimate your cost', 'Pricing calculator', '$0.40 per 100k'\",\n \"a breakdown list (base + overage lines) under a big monthly total\",\n \"a script with a rate table / tiers array (look for upTo, unitPrice, included)\",\n ],\n mcp:\n \"Each range input → one slider (min/max/step from attributes, start from value; label from <label for>). Detect log scales from non-linear value mapping in the script (Math.pow/Math.log). Rates: prefer reading the rate table from the page script or the pricing table text ('first 2M included, then $0.40 per 100k up to 10M'); graduated steps → tiers with upTo, the last step without upTo. Never encode the formula as a string field. If the page shows 'Contact us' past a value, set contactAbove.\",\n pitfalls: [\n \"No computed/formula field exists, so the total is calculated by the renderer from the rate data — the schema can't preview the number in the editor (gap).\",\n \"`rate.input` should be a select of slider keys from the same block (gap: options from a sibling array).\",\n \"min < start < max is a cross-field rule the schema can't express yet.\",\n \"Graduated vs volume pricing are different maths; this model is graduated only — say so in notes for volume-priced brands.\",\n ],\n },\n },\n\n /* ───────────────────────────── 3 · Feature comparison matrix ───────────────────────────── */\n {\n id: \"pricing-feature-matrix\",\n label: \"Full feature comparison matrix\",\n proves: \"Plans as keyed columns · one `table` keyed by plan key · Yes / no columns with per-row (limits) and per-cell (partial, add-on, soon) types · row groups · price row → Offers JSON-LD · sticky header + mobile mode\",\n category: \"Pricing & plans\",\n brand: \"Northwind\",\n previewLayout: \"table\",\n tags: [\"deep-nesting\", \"repeater\", \"conditional\", \"validation\", \"responsive-layout\", \"a11y\"],\n schema: {\n name: \"planComparison\",\n title: \"Plan comparison\",\n kind: \"block\",\n icon: \"table-options\",\n category: \"Pricing & plans\",\n description: \"Every feature across every plan, grouped, with a sticky header\",\n preview: { title: \"heading\" },\n groups: [\n { name: \"content\", title: \"Content\", default: true },\n { name: \"design\", title: \"Design\" },\n ],\n fields: [\n { name: \"heading\", title: \"Heading\", type: \"string\", validation: { required: true, recommendedMax: 48 } },\n {\n name: \"plans\",\n title: \"Columns\",\n type: \"array\",\n itemNoun: \"column\",\n validation: { min: 2, max: 5 },\n of: [\n {\n name: \"column\",\n title: \"Column\",\n type: \"object\",\n icon: \"columns\",\n preview: { title: \"name\", subtitle: \"price\", fallback: \"Untitled column\" },\n fields: [\n { name: \"key\", title: \"Key\", type: \"string\", access: { edit: \"schema.manage\" }, lockReason: \"The matrix's plan columns use this key\", validation: { required: true, pattern: \"^[a-z]+$\", patternMessage: \"Use lowercase letters, like email.\", unique: true } },\n { name: \"name\", title: \"Plan name\", type: \"string\", validation: { required: true, max: 20 } },\n { name: \"price\", title: \"Price line\", type: \"string\", validation: { max: 24 }, placeholder: \"$39/mo\" },\n { name: \"button\", title: \"Button\", type: \"button\" },\n ],\n },\n ],\n },\n {\n name: \"matrix\",\n title: \"Matrix\",\n type: \"table\",\n validation: { required: true },\n // D52: the block's Design group owns phones and the sticky header (isHeaderSticky), so the table doesn't offer them twice\n table: { maxColumns: 6, maxRows: 80, columnTypes: [\"text\", \"boolean\", \"money\", \"link\", \"richtext-inline\"], jsonLd: [\"Offers\"], settings: { phones: [], totals: false, sticky: false } },\n },\n { name: \"isHeaderSticky\", title: \"Keep the header row in view\", type: \"boolean\", group: \"design\", initialValue: true },\n {\n name: \"mobile\",\n title: \"On phones\",\n type: \"select\",\n group: \"design\",\n layout: \"cards\",\n initialValue: \"one-plan\",\n options: [\n { value: \"one-plan\", label: \"One plan at a time\", icon: \"device-mobile\", description: \"A plan switcher above the table\" },\n { value: \"scroll\", label: \"Scroll sideways\", icon: \"arrows-horizontal\", description: \"Feature names stay pinned\" },\n ],\n },\n ],\n },\n value: {\n heading: \"Compare every feature\",\n plans: [\n { _key: \"c1\", key: \"hobby\", name: \"Hobby\", price: \"$0\", button: { label: \"Start free\", href: \"https://app.northwind.dev/signup\", type: \"url\", style: \"outline\" } },\n { _key: \"c2\", key: \"pro\", name: \"Pro\", price: \"$39/mo\", button: { label: \"Start trial\", href: \"https://app.northwind.dev/signup?plan=pro\", type: \"url\", style: \"primary\" } },\n { _key: \"c3\", key: \"team\", name: \"Team\", price: \"$20/seat\", button: { label: \"Start trial\", href: \"https://app.northwind.dev/signup?plan=team\", type: \"url\", style: \"secondary\" } },\n { _key: \"c4\", key: \"enterprise\", name: \"Enterprise\", price: \"Custom\", button: { label: \"Talk to sales\", href: \"/contact-sales\", type: \"page\", style: \"outline\" } },\n ],\n matrix: tableFrom(\n \"Northwind plans compared: delivery limits, retries, static IPs, SSO and compliance by plan\",\n [\n { _key: \"feature\", label: \"Feature\" },\n { _key: \"hobby\", label: \"Hobby\", type: \"boolean\" },\n { _key: \"pro\", label: \"Pro\", type: \"boolean\", highlight: true },\n { _key: \"team\", label: \"Team\", type: \"boolean\" },\n { _key: \"enterprise\", label: \"Enterprise\", type: \"boolean\" },\n ],\n [\n { cells: [\"Price a month\", { value: 0, type: \"money\" }, { value: 39, type: \"money\" }, { value: 20, type: \"money\", note: \"f2\" }, { value: \"Custom\", type: \"text\" }], group: \"price\" },\n { cells: [{ value: \"Events a month\", note: \"f1\" }, \"100k\", \"2M\", \"10M\", \"Unlimited\"], group: \"delivery\", type: \"text\" },\n { cells: [{ value: { label: \"Automatic retries\", href: \"https://docs.northwind.dev/delivery/retries\" }, type: \"link\" }, { value: \"3 attempts\", type: \"text\" }, true, true, true], group: \"delivery\" },\n { cells: [\"Static IPs\", false, { value: \"Add-on, $29/mo\", type: \"text\" }, true, true], group: \"delivery\" },\n { cells: [\"SAML SSO\", false, false, { value: \"Google, Okta\", type: \"text\" }, true], group: \"security\" },\n { cells: [{ value: \"HIPAA BAA\", note: \"f3\" }, false, false, false, true], group: \"security\" },\n { cells: [\"Customer-managed keys\", false, false, false, { value: \"Coming soon\", type: \"text\" }], group: \"security\" },\n ],\n {\n id: \"tbl_northwind_plans\",\n headerColumn: true,\n rowGroups: [{ _key: \"price\", label: \"Price\" }, { _key: \"delivery\", label: \"Delivery\" }, { _key: \"security\", label: \"Security & compliance\" }],\n footnotes: [\n { _key: \"f1\", text: \"Every delivery attempt counts, retries included.\" },\n { _key: \"f2\", text: \"Per seat, billed monthly.\" },\n { _key: \"f3\", text: \"A Business Associate Agreement for teams handling health data.\" },\n ],\n design: { responsive: \"scroll\", sticky: true },\n jsonLd: { type: \"Offers\", priceRow: \"r1\" },\n },\n ),\n isHeaderSticky: true,\n mobile: \"one-plan\",\n },\n notes: {\n why:\n \"A pricing matrix was the deepest section most sites have (groups › rows › cells, 5 drill levels). Now it is one `table` (CPO D42): plan columns are KEYED by the plan key, so a missing cell is a dash, not a shifted column, and adding a plan never scrambles rows. Plan columns are Yes / no (✓ with the words 'Included' / 'Not included'); a limit row is Text; a partial, add-on or 'coming soon' is one cell with its own type. Groups are row groups (tbody + th scope=rowgroup). The price row is Money, which is what the opt-in Offers JSON-LD reads. The plan cards above still own name, price line and button (`plans`). Phone behavior is a design choice, not a layout hack.\",\n sanity:\n \"`planComparison` with `plans: array<object{key, name, price, button}>` and nested groups › rows › cells with a `plan` string (a custom input to list plans), or the v6.6 Portable Text table (rows › cells › blocks, `headerRows`) which has no column keys, types or row groups.\",\n htmlSignals: [\n \"a large <table> (or role=table grid) under the plan cards with a header row of plan names + prices + buttons\",\n \"row group headings spanning all columns (<th colspan>, <tbody> per group, or accordion sections)\",\n \"cells with ✓/✕ icons, short limits ('2M', '30 days'), '+$29/mo' add-on text, 'Coming soon' pills\",\n \"info-icon tooltips next to feature names\",\n \"position: sticky on the header row\",\n ],\n mcp:\n \"Header cells → plans[] (lowercase keys from plan names) AND the matrix's plan columns with `_key` = that key, type Yes / no. Run the table detector (docs/TABLES.md): group heading rows / tbody per group → rowGroups; feature cell → row header, its tooltip (title / aria-describedby / data-tooltip) → a footnote; ✓ → true, ✕ / dash / empty → false; a row of limits ('2M', '30 days') → row type Text; '+$29/mo' / 'Add-on' / 'Soon' / a caveat → that cell's own Text type. A header price line → a Money 'Price a month' row (Offers JSON-LD reads it). Collapsed groups are a renderer setting.\",\n pitfalls: [\n \"RESOLVED (D42): cells are keyed by plan key; nothing is aligned by position.\",\n \"Plan columns and `plans` must share keys; keeping them in step is the editor's job until a column source exists (gap 3). The validator should flag a column key with no plan.\",\n \"Collapsed row groups and feature tooltips are presentation; tooltips become footnotes so their words stay on the page for search and AI.\",\n \"Price lines in the header duplicate the plan cards above — they should reference one plan source (gap: plans as CMS items).\",\n \"Icon-only cells need words: Yes / no cells render ✓ / – plus visually hidden 'Included' / 'Not included'.\",\n ],\n },\n },\n\n /* ───────────────────────────── 4 · Single plan with add-ons ───────────────────────────── */\n {\n id: \"pricing-single-plan-addons\",\n label: \"Single plan with add-ons\",\n proves: \"One plan object + add-on array with units, quantities and preselection · eligibility flags · live total\",\n category: \"Pricing & plans\",\n brand: \"Juniper Physio\",\n previewLayout: \"split\",\n tags: [\"commerce\", \"repeater\", \"conditional\", \"validation\", \"rich-text\"],\n schema: {\n name: \"planWithAddons\",\n title: \"Plan with add-ons\",\n kind: \"block\",\n icon: \"playlist-add\",\n category: \"Pricing & plans\",\n description: \"One membership or plan, with optional extras and a running total\",\n preview: { title: \"plan.name\", subtitle: \"heading\" },\n groups: [\n { name: \"content\", title: \"Content\", default: true },\n { name: \"addons\", title: \"Add-ons\" },\n ],\n fieldsets: [{ name: \"price\", title: \"Price\", columns: 2 }],\n fields: [\n { name: \"heading\", title: \"Heading\", type: \"string\", validation: { required: true, recommendedMax: 48 } },\n { name: \"intro\", title: \"Intro\", type: \"text\", rows: 2, validation: { recommendedMax: 180 } },\n {\n name: \"plan\",\n title: \"Plan\",\n type: \"object\",\n icon: \"id-badge\",\n openMode: \"drill\",\n fields: [\n { name: \"name\", title: \"Plan name\", type: \"string\", validation: { required: true, max: 32 } },\n { name: \"price\", title: \"Price\", type: \"number\", fieldset: \"price\", numeric: { unit: \"USD\", min: 0, step: 1 }, validation: { required: true } },\n {\n name: \"interval\",\n title: \"Billed\",\n type: \"select\",\n fieldset: \"price\",\n initialValue: \"month\",\n options: [{ value: \"month\", label: \"Per month\" }, { value: \"year\", label: \"Per year\" }, { value: \"once\", label: \"Once\" }],\n },\n { name: \"commitment\", title: \"Minimum term\", type: \"string\", validation: { max: 40 }, placeholder: \"3 months, then month to month\" },\n { name: \"includes\", title: \"Includes\", type: \"array\", itemNoun: \"benefit\", of: [{ name: \"benefit\", title: \"Benefit\", type: \"string\" }], validation: { min: 1, max: 8 } },\n ],\n },\n {\n name: \"addons\",\n title: \"Add-ons\",\n type: \"array\",\n group: \"addons\",\n itemNoun: \"add-on\",\n validation: { max: 8 },\n of: [\n {\n name: \"addon\",\n title: \"Add-on\",\n type: \"object\",\n icon: \"circle-plus\",\n preview: { title: \"name\", subtitle: \"price\", fallback: \"Untitled add-on\" },\n fields: [\n { name: \"name\", title: \"Name\", type: \"string\", validation: { required: true, max: 40 } },\n { name: \"description\", title: \"Description\", type: \"string\", validation: { recommendedMax: 90 } },\n { name: \"price\", title: \"Price\", type: \"number\", numeric: { unit: \"USD\", min: 0, step: 1 }, validation: { required: true } },\n {\n name: \"unit\",\n title: \"Charged\",\n type: \"select\",\n initialValue: \"session\",\n options: [{ value: \"session\", label: \"Per session\" }, { value: \"month\", label: \"Per month\" }, { value: \"once\", label: \"Once\" }],\n },\n { name: \"allowQuantity\", title: \"Let them choose how many\", type: \"boolean\" },\n { name: \"maxQuantity\", title: \"Up to\", type: \"number\", hidden: { field: \"allowQuantity\", equals: true }, numeric: { min: 2, max: 12, step: 1 } },\n { name: \"isPreselected\", title: \"Selected by default\", type: \"boolean\" },\n { name: \"isHsaEligible\", title: \"HSA or FSA eligible\", type: \"boolean\" },\n ],\n },\n ],\n },\n { name: \"totalLabel\", title: \"Total label\", type: \"string\", validation: { max: 32 }, placeholder: \"Your monthly total\" },\n { name: \"button\", title: \"Button\", type: \"button\", validation: { required: true } },\n { name: \"finePrint\", title: \"Small print\", type: \"richtext\" },\n ],\n },\n value: {\n heading: \"The Recovery Membership\",\n intro: \"Steady, one-to-one care for runners, climbers and anyone coming back from an injury. Book online, cancel any time after three months.\",\n plan: {\n name: \"Recovery Membership\",\n price: 189,\n interval: \"month\",\n commitment: \"3 months, then month to month\",\n includes: [\"Two 45-minute sessions a month\", \"A home program in the Juniper app\", \"Message your physio between visits\", \"10% off retail and taping\"],\n },\n addons: [\n { _key: \"ad1\", name: \"Extra session\", description: \"Another 45-minute visit in the same month.\", price: 95, unit: \"session\", allowQuantity: true, maxQuantity: 4, isHsaEligible: true },\n { _key: \"ad2\", name: \"Dry needling\", description: \"Added to a session for stubborn muscle tension.\", price: 40, unit: \"session\", allowQuantity: true, maxQuantity: 6, isHsaEligible: true },\n { _key: \"ad3\", name: \"Sports massage, 60 min\", description: \"With one of our licensed massage therapists.\", price: 105, unit: \"session\", allowQuantity: false, isHsaEligible: false },\n { _key: \"ad4\", name: \"Running gait analysis\", description: \"Treadmill video analysis and a written report.\", price: 150, unit: \"once\", allowQuantity: false, isHsaEligible: true },\n ],\n totalLabel: \"Your monthly total\",\n button: { label: \"Book your first visit\", href: \"/book\", type: \"page\", style: \"primary\", arrow: true },\n finePrint:\n \"<p>Unused sessions roll over for one month. We'll give you a superbill for out-of-network insurance claims. Cancel with 30 days' notice after the first three months — <a href=\\\"/membership-terms\\\">read the terms</a>.</p>\",\n },\n notes: {\n why:\n \"Single-plan businesses (clinics, studios, memberships) sell one plan plus extras, so the shape is one drill-in `plan` object and an `addons` array — each add-on carrying its unit (per session / month / once), whether it's a checkbox or a quantity stepper (conditional max), and eligibility flags that matter to buyers (HSA/FSA). Preselected add-ons are allowed but the help text keeps them honest. The minimum term is its own field so it can sit next to the price instead of being buried in the small print.\",\n sanity:\n \"`planWithAddons` object: `plan: object{name, price, interval, commitment, includes: array<string>}` and `addons: array<object{name, price, unit, allowQuantity: boolean, maxQuantity, isPreselected, isHsaEligible}>` with `hidden: ({parent}) => !parent.allowQuantity` on maxQty.\",\n htmlSignals: [\n \"one prominent plan card with a price per month and an 'includes' list\",\n \"a list of optional extras with checkboxes or +/- quantity steppers and individual prices\",\n \"a running total that updates as extras are ticked ('Your monthly total')\",\n \"small print about minimum terms, cancellation, insurance/HSA\",\n ],\n mcp:\n \"Plan card → plan (name, price, interval from '/mo', includes from its list). Each optional extra → addons[] with price and unit parsed from '/session', '/mo', 'one-time'; a stepper input → allowQuantity: true + maxQuantity from its max attribute; a pre-checked checkbox → isPreselected: true. Terms paragraphs → finePrint (rich text, keep links). Do not compute the total — the renderer does.\",\n pitfalls: [\n \"Pre-checked paid add-ons can be a dark pattern; keep them rare and visible.\",\n \"A minimum term hidden in small print is a trust killer — it has its own field on purpose.\",\n \"Mixed units (per month + per session) can't be summed into one honest monthly number without an assumption; show the breakdown.\",\n ],\n },\n },\n\n /* ───────────────────────────── 5 · Enterprise contact card ───────────────────────────── */\n {\n id: \"pricing-enterprise-card\",\n label: \"Enterprise contact card\",\n proves: \"Action select → form reference (opens in place) / calendar URL / plain link · compliance badges · customer logos with alt · inline quote\",\n category: \"Pricing & plans\",\n brand: \"Northwind\",\n previewLayout: \"split\",\n tags: [\"conditional\", \"references\", \"form\", \"repeater\", \"a11y\", \"media-heavy\"],\n schema: {\n name: \"enterpriseCard\",\n title: \"Enterprise card\",\n kind: \"block\",\n icon: \"building\",\n category: \"Pricing & plans\",\n description: \"The \\\"talk to us\\\" panel for large customers\",\n preview: { title: \"heading\", subtitle: \"action\" },\n groups: [\n { name: \"content\", title: \"Content\", default: true },\n { name: \"proof\", title: \"Proof\" },\n ],\n fields: [\n { name: \"eyebrow\", title: \"Eyebrow\", type: \"string\", validation: { max: 32 } },\n { name: \"heading\", title: \"Heading\", type: \"string\", validation: { required: true, recommendedMax: 48 }, ai: true },\n { name: \"body\", title: \"Body\", type: \"text\", rows: 3, validation: { recommendedMax: 220 }, ai: true },\n {\n name: \"points\",\n title: \"What's included\",\n type: \"array\",\n itemNoun: \"point\",\n openMode: \"inline\",\n validation: { max: 6 },\n of: [\n {\n name: \"point\",\n title: \"Point\",\n type: \"object\",\n icon: \"check\",\n preview: { title: \"label\", fallback: \"Untitled point\" },\n fields: [\n { name: \"icon\", title: \"Icon\", type: \"icon\" },\n { name: \"label\", title: \"Label\", type: \"string\", validation: { required: true, max: 48 } },\n ],\n },\n ],\n },\n {\n name: \"action\",\n title: \"The button\",\n type: \"select\",\n layout: \"cards\",\n initialValue: \"form\",\n options: [\n { value: \"form\", label: \"Opens a form\", icon: \"forms\", description: \"Submissions arrive in Forms\" },\n { value: \"calendar\", label: \"Books a call\", icon: \"calendar\", description: \"A scheduling page opens in place\" },\n { value: \"link\", label: \"Goes to a page\", icon: \"link\" },\n ],\n },\n { name: \"form\", title: \"Form\", type: \"reference\", reference: { to: [\"form\"] }, hidden: { field: \"action\", equals: \"form\" }, validation: { required: true }, description: \"Shared: every placement uses the same form.\" },\n { name: \"calendarUrl\", title: \"Scheduling page\", type: \"url\", hidden: { field: \"action\", equals: \"calendar\" }, validation: { required: true, pattern: \"^https://(cal\\\\.com|calendly\\\\.com|meetings\\\\.hubspot\\\\.com|savvycal\\\\.com)/\", patternMessage: \"Use a Cal.com, Calendly, HubSpot or SavvyCal link, like https://cal.com/caldera/fitting.\" } },\n { name: \"buttonLabel\", title: \"Button label\", type: \"string\", hidden: { field: \"action\", equals: [\"form\", \"calendar\"] }, validation: { required: true, max: 24 }, placeholder: \"Talk to sales\" },\n { name: \"button\", title: \"Button\", type: \"button\", hidden: { field: \"action\", equals: \"link\" } },\n { name: \"responseTime\", title: \"Reply promise\", type: \"string\", validation: { max: 48 }, placeholder: \"We reply within one business day\" },\n {\n name: \"compliance\",\n title: \"Compliance\",\n type: \"multiselect\",\n group: \"proof\",\n layout: \"checkbox\",\n options: [\n { value: \"soc2\", label: \"SOC 2 Type II\" },\n { value: \"iso27001\", label: \"ISO 27001\" },\n { value: \"hipaa\", label: \"HIPAA\" },\n { value: \"gdpr\", label: \"GDPR\" },\n { value: \"pci\", label: \"PCI DSS\" },\n ],\n },\n {\n name: \"logos\",\n title: \"Customer logos\",\n type: \"array\",\n group: \"proof\",\n itemNoun: \"logo\",\n arrayLayout: \"grid\",\n validation: { max: 6 },\n of: [\n {\n name: \"logo\",\n title: \"Logo\",\n type: \"object\",\n icon: \"building\",\n preview: { title: \"name\", media: \"logo\", fallback: \"Untitled logo\" },\n fields: [\n { name: \"name\", title: \"Company\", type: \"string\", validation: { required: true, max: 32 }, description: \"Not shown. Used as the logo's alt text.\" },\n { name: \"logo\", title: \"Logo\", type: \"image\", validation: { required: true }, description: \"SVG or a transparent PNG, one color.\" },\n ],\n },\n ],\n },\n {\n name: \"quote\",\n title: \"Quote\",\n type: \"object\",\n group: \"proof\",\n icon: \"quote\",\n openMode: \"drill\",\n fields: [\n { name: \"text\", title: \"Quote\", type: \"text\", rows: 3, validation: { recommendedMax: 200 } },\n { name: \"name\", title: \"Name\", type: \"string\", validation: { max: 40 } },\n { name: \"role\", title: \"Role and company\", type: \"string\", validation: { max: 60 } },\n ],\n },\n ],\n },\n value: {\n eyebrow: \"Enterprise\",\n heading: \"Billions of events. One calm on-call.\",\n body: \"Volume pricing, a dedicated region and a named engineer who knows your integration. We'll scope it with you in a 30-minute call.\",\n points: [\n { _key: \"ep1\", icon: \"server\", label: \"Dedicated region in US, EU or APAC\" },\n { _key: \"ep2\", icon: \"shield-lock\", label: \"SAML SSO, SCIM and audit log export\" },\n { _key: \"ep3\", icon: \"clock-check\", label: \"99.99% uptime SLA with credits\" },\n { _key: \"ep4\", icon: \"headset\", label: \"Named support engineer, 1-hour P1 response\" },\n ],\n action: \"form\",\n form: \"form_contact\",\n buttonLabel: \"Talk to sales\",\n responseTime: \"We reply within one business day\",\n compliance: [\"soc2\", \"hipaa\", \"gdpr\"],\n logos: [\n { _key: \"lg1\", name: \"Halcyon Health\", logo: img(\"northwind-logo-halcyon\", 320, 120, \"Halcyon Health logo\") },\n { _key: \"lg2\", name: \"Ferrous Freight\", logo: img(\"northwind-logo-ferrous\", 320, 120, \"Ferrous Freight logo\") },\n { _key: \"lg3\", name: \"Kestrel Pay\", logo: img(\"northwind-logo-kestrel\", 320, 120, \"Kestrel Pay logo\") },\n ],\n quote: { text: \"We moved 4 billion webhooks a month to Northwind and our pager went quiet within a week.\", name: \"Ines Albright\", role: \"Staff Engineer, Kestrel Pay\" },\n },\n notes: {\n why:\n \"The enterprise card's only job is the next step, so the core field is `action`: open a FORM (a reference to a form in Forms — fields, notifications and spam rules live there once, not per section), BOOK a call (a validated scheduling URL), or go to a page (a normal button unit). Each path shows only its own inputs. Proof is grouped separately: compliance as a multiselect of real certifications (help text forbids aspirational ticks), logos with the company name doubling as alt text, and a small inline quote.\",\n sanity:\n \"`enterpriseCard` object with `action: string`, `form: reference to form` (or a `formId` string when forms live in HubSpot/Typeform), `calendarUrl: url` with `Rule.uri({scheme: ['https']})` + custom domain check, `compliance: array<string>` with `options.list`, `logos: array<logo with name>`.\",\n htmlSignals: [\n \"a dark or bordered panel after/beside the plan columns with 'Enterprise', 'Custom', 'Contact sales'\",\n \"a button that opens a modal form, a Calendly/Cal.com embed or links to /contact-sales\",\n \"SOC 2 / ISO / HIPAA badge images or text\",\n \"a small logo row and a single quote inside the panel\",\n ],\n mcp:\n \"A button opening a modal with a <form> → action:'form'; match the form's field names against existing forms in Forms and reference the best match, otherwise create a form with those fields (never inline them into the section). Calendly/Cal.com/HubSpot meeting links → action:'calendar' + calendarUrl. Badges → compliance (map by text/alt). Logo <img alt> → logos[].name.\",\n pitfalls: [\n \"Inlining the contact-sales fields into the section creates a second form with separate submissions and rules.\",\n \"Compliance badges are claims; the converter imports them but flags them for a human to confirm.\",\n ],\n },\n },\n\n /* ───────────────────────────── 6 · Pricing FAQ ───────────────────────────── */\n {\n id: \"pricing-faq\",\n label: \"Pricing FAQ\",\n proves: \"Grouped questions (written here or FAQs collection) · price tokens in answers so copy never drifts from the plans · FAQPage rich results\",\n category: \"Pricing & plans\",\n brand: \"Northwind\",\n previewLayout: \"accordion\",\n tags: [\"rich-text\", \"seo-structured\", \"conditional\", \"references\", \"repeater\", \"validation\"],\n schema: {\n name: \"pricingFaq\",\n title: \"Pricing FAQ\",\n kind: \"block\",\n icon: \"help-circle\",\n category: \"Pricing & plans\",\n description: \"Billing questions, grouped, with prices that stay in sync\",\n variants: [\n { id: \"accordion\", name: \"Accordion\" },\n { id: \"two-col\", name: \"Two columns\", description: \"Group names left, questions right\" },\n ],\n preview: { title: \"heading\" },\n groups: [\n { name: \"content\", title: \"Content\", default: true },\n { name: \"settings\", title: \"Settings\" },\n ],\n fields: [\n { name: \"heading\", title: \"Heading\", type: \"string\", validation: { required: true, recommendedMax: 48 }, localized: true },\n {\n name: \"source\",\n title: \"Questions come from\",\n type: \"select\",\n layout: \"segmented\",\n initialValue: \"inline\",\n options: [{ value: \"inline\", label: \"Written here\" }, { value: \"collection\", label: \"FAQs collection\" }],\n },\n {\n name: \"groups\",\n title: \"Groups\",\n type: \"array\",\n itemNoun: \"group\",\n hidden: { field: \"source\", equals: \"inline\" },\n validation: { min: 1, max: 5 },\n of: [\n {\n name: \"faqGroup\",\n title: \"Group\",\n type: \"object\",\n icon: \"folder\",\n preview: { title: \"title\", fallback: \"Untitled group\" },\n fields: [\n { name: \"title\", title: \"Group title\", type: \"string\", validation: { required: true, max: 32 } },\n {\n name: \"items\",\n title: \"Questions\",\n type: \"array\",\n itemNoun: \"question\",\n validation: { min: 1, max: 10 },\n of: [\n {\n name: \"faqItem\",\n title: \"Question\",\n type: \"object\",\n icon: \"help-circle\",\n preview: { title: \"question\", subtitle: \"answer\", fallback: \"Untitled question\" },\n fields: [\n { name: \"question\", title: \"Question\", type: \"string\", validation: { required: true, max: 120 }, ai: true, localized: true },\n {\n name: \"answer\",\n title: \"Answer\",\n type: \"richtext\",\n validation: { required: true },\n ai: true,\n localized: true,\n description: \"Use {{pro.yearly}}-style tokens so prices stay in step with the plans.\",\n helpMore: \"Tokens read the Plans block on this page: {{key.monthly}}, {{key.yearly}} or {{key.name}}, where key is the plan name in lowercase.\",\n },\n ],\n },\n ],\n },\n ],\n },\n ],\n },\n {\n name: \"questions\",\n title: \"FAQs to show\",\n type: \"array\",\n hidden: { field: \"source\", equals: \"collection\" },\n validation: { max: 12 },\n of: [{ name: \"faqRef\", title: \"FAQ\", type: \"reference\", reference: { to: [\"col_faq\"], filter: \"category == 'billing'\" } }],\n },\n { name: \"contactButton\", title: \"Contact button\", type: \"button\" },\n { name: \"useRichResults\", title: \"FAQ rich results\", type: \"boolean\", group: \"settings\", initialValue: true, description: \"Turn off if another FAQ on this page already sends it.\" },\n { name: \"isFirstOpen\", title: \"Open the first question\", type: \"boolean\", group: \"settings\", initialValue: true },\n ],\n },\n value: {\n _variant: \"two-col\",\n heading: \"Billing questions\",\n source: \"inline\",\n groups: [\n {\n _key: \"fg1\",\n title: \"Plans and billing\",\n items: [\n { _key: \"fq1\", question: \"What happens if I go over my events?\", answer: \"<p>Nothing breaks. Extra events are billed at $0.40 per 100k at the end of the month, and we email you at 80% and 100% of your allowance.</p>\" },\n { _key: \"fq2\", question: \"How much do I save paying yearly?\", answer: \"<p>Pro is {{pro.yearly}} a month billed yearly instead of {{pro.monthly}} monthly — two months free, roughly 20%.</p>\" },\n { _key: \"fq3\", question: \"Can I switch plans later?\", answer: \"<p>Any time, from Settings › Billing. Upgrades are prorated to the day; downgrades take effect at the next renewal.</p>\" },\n ],\n },\n {\n _key: \"fg2\",\n title: \"Payments and invoices\",\n items: [\n { _key: \"fq4\", question: \"Do you accept invoices and purchase orders?\", answer: \"<p>On Team (yearly) and Enterprise, yes — net-30 by ACH or wire. Everyone else pays by card.</p>\" },\n { _key: \"fq5\", question: \"Is there a free trial?\", answer: \"<p>Pro and Team have a 14-day trial with no card required. Hobby is free forever.</p>\" },\n ],\n },\n ],\n questions: [\"fq_ship\"],\n contactButton: { label: \"Ask the billing team\", href: \"mailto:billing@northwind.dev\", type: \"email\", email: \"billing@northwind.dev\", style: \"link\" },\n useRichResults: true,\n isFirstOpen: true,\n },\n notes: {\n why:\n \"A pricing FAQ is different from a general FAQ in two ways: it's GROUPED (plans, payments, security) — so groups › items, one level deeper than the core FAQ example — and its answers quote prices, which is where pricing pages most often contradict themselves. Answers therefore support {{plan.cycle}} tokens resolved from the Plans block on the same page, documented in helpMore. Written-here vs FAQs-collection stays a conditional pair (the collection reference is filtered to billing questions), and FAQPage rich results are a toggle because two FAQ blocks on one page must not both emit it.\",\n sanity:\n \"`pricingFaq` object with `groups: array<object{title, items: array<object{question, answer: portableText}>}>` or `faqs: array<reference to faq>` filtered with `options.filter: 'category == \\\"billing\\\"'`. Price tokens would be a custom Portable Text inline object (`planPrice{plan: reference, cycle}`) — closer to typed than our string tokens.\",\n htmlSignals: [\n \"a 'Pricing FAQ', 'Billing questions' or 'Frequently asked' heading right after the plans\",\n \"<details>/<summary> or aria-expanded accordions, sometimes with group sub-headings\",\n \"answers that mention the same prices as the plan cards\",\n \"existing FAQPage JSON-LD\",\n ],\n mcp:\n \"Group sub-headings → groups; each question/answer → items (answer as rich text, keep links). When an answer contains a price that equals a plan price on the same page, replace it with the matching token ({{pro.monthly}}) and note it in the conversion receipt. If the site has an FAQs collection with the same questions, prefer source:'collection' with references. Existing FAQPage JSON-LD → useRichResults: true (and remove the hand-written script).\",\n pitfalls: [\n \"Tokens are plain strings inside rich text — typos aren't caught until preview (gap: typed inline references to plan fields).\",\n \"Two FAQ blocks emitting FAQPage on one URL is invalid; the toggle exists for that.\",\n ],\n },\n },\n\n /* ───────────────────────────── 7 · Annual savings banner ───────────────────────────── */\n {\n id: \"pricing-annual-savings-banner\",\n label: \"Pay-yearly savings banner\",\n proves: \"Savings expressed three ways (percent / months free / amount) as a conditional unit · audience targeting (members on monthly) · placement\",\n category: \"Pricing & plans\",\n brand: \"Juniper Physio\",\n previewLayout: \"banner\",\n tags: [\"personalization\", \"conditional\", \"validation\", \"commerce\"],\n schema: {\n name: \"savingsBanner\",\n title: \"Savings banner\",\n kind: \"block\",\n icon: \"pig-money\",\n category: \"Pricing & plans\",\n description: \"A nudge to switch to yearly billing, shown to the right people\",\n preview: { title: \"message\", subtitle: \"audience\", icon: \"pig-money\" },\n groups: [\n { name: \"content\", title: \"Content\", default: true },\n { name: \"targeting\", title: \"Who and where\" },\n ],\n fields: [\n { name: \"message\", title: \"Message\", type: \"string\", validation: { required: true, max: 90, recommendedMax: 70 }, ai: true, description: \"{{saving}} becomes the saving.\" },\n {\n name: \"savingType\",\n title: \"Saving shown as\",\n type: \"select\",\n layout: \"segmented\",\n initialValue: \"months\",\n options: [{ value: \"percent\", label: \"Percent\" }, { value: \"months\", label: \"Months free\" }, { value: \"amount\", label: \"Amount\" }],\n },\n { name: \"percent\", title: \"Percent\", type: \"number\", hidden: { field: \"savingType\", equals: \"percent\" }, numeric: { min: 1, max: 50, step: 1, unit: \"%\" }, validation: { required: true } },\n { name: \"months\", title: \"Months free\", type: \"number\", hidden: { field: \"savingType\", equals: \"months\" }, numeric: { min: 1, max: 4, step: 1, unit: \"months\" }, validation: { required: true } },\n { name: \"amount\", title: \"Amount\", type: \"number\", hidden: { field: \"savingType\", equals: \"amount\" }, numeric: { unit: \"USD\", min: 1, step: 1 }, validation: { required: true }, description: \"In dollars.\" },\n { name: \"button\", title: \"Button\", type: \"button\", validation: { required: true } },\n {\n name: \"audience\",\n title: \"Who sees it\",\n type: \"select\",\n group: \"targeting\",\n initialValue: \"monthly-members\",\n options: [\n { value: \"everyone\", label: \"Everyone\" },\n { value: \"visitors\", label: \"Visitors who aren't members\" },\n { value: \"monthly-members\", label: \"Members paying monthly\", description: \"Needs them signed in to the member portal\" },\n ],\n },\n {\n name: \"placements\",\n title: \"Shows on\",\n type: \"multiselect\",\n group: \"targeting\",\n layout: \"checkbox\",\n validation: { min: 1 },\n options: [\n { value: \"pricing\", label: \"Membership page\" },\n { value: \"portal\", label: \"Member portal home\" },\n { value: \"booking\", label: \"After booking confirmation\" },\n ],\n },\n { name: \"until\", title: \"Show until\", type: \"date\", group: \"targeting\", description: \"Leave empty for an always-on offer.\" },\n { name: \"isDismissible\", title: \"Visitors can close it\", type: \"boolean\", group: \"targeting\", initialValue: true, description: \"Closed banners stay hidden for 30 days.\" },\n ],\n },\n value: {\n message: \"Pay yearly and get {{saving}} of membership free.\",\n savingType: \"months\",\n percent: 15,\n months: 2,\n amount: 378,\n button: { label: \"Switch to yearly\", href: \"/portal/billing?cycle=yearly\", type: \"page\", style: \"primary\" },\n audience: \"monthly-members\",\n placements: [\"portal\", \"pricing\"],\n until: \"2026-12-31\",\n isDismissible: true,\n },\n notes: {\n why:\n \"Unlike a sale banner, this one is about the BILLING CYCLE and only makes sense to some people, so audience is first-class (members on monthly need a signed-in portal; visitors see the public version). The saving can be told three ways — percent, months free, dollar amount — and each is a conditional numeric with its own unit and range, substituted into the message through a single {{saving}} token, so the copy and the number can't disagree.\",\n sanity:\n \"`savingsBanner` object with `savingType: string` and three numbers behind `hidden` callbacks, `audience: string`, `placements: array<string>`. Audience evaluation would be in the frontend/middleware (Sanity has no audience primitive; personalization usually comes from a separate tool).\",\n htmlSignals: [\n \"a slim notice on a pricing/billing page: 'Switch to annual and save 20%', '2 months free'\",\n \"links with ?cycle=yearly / ?billing=annual / /billing/switch\",\n \"rendered only for logged-in users (inside an account/portal layout)\",\n ],\n mcp:\n \"Copy → message with the saving replaced by {{saving}}; detect the unit ('%' → percent, 'months free' → months, '$' → amount). A banner inside an authenticated layout → audience:'monthly-members'; on a public pricing page → 'visitors' or 'everyone'. Its URL path → placements.\",\n pitfalls: [\n \"The saving isn't computed from the actual plan prices (no computed fields) — a price change can make the banner untrue.\",\n \"Targeting signed-in members needs the portal integration; without it the banner silently shows to no one.\",\n ],\n },\n },\n];\n"],"mappings":";;AAWA,IAAM,OAAO,MAAc,IAAI,KAAK,IAAI,KAAK,MAAM,QAAQ;CAAE,KAAK,8BAA8B,KAAK,GAAG,EAAE,GAAG;CAAK;CAAK,MAAM,GAAG,KAAK;CAAO,OAAO;CAAG,QAAQ;AAAE;AAEhK,IAAM,gBAA6B;CACjC,MAAM;CACN,OAAO;CACP,MAAM;CACN,OAAO;CACP,cAAc;CACd,SAAS;EAAC;GAAE,OAAO;GAAO,OAAO;EAAY;EAAG;GAAE,OAAO;GAAO,OAAO;EAAO;EAAG;GAAE,OAAO;GAAO,OAAO;EAAiB;CAAC;CAC1H,aAAa;AACf;AAEA,IAAa,UAAsB;CAEjC;EACE,IAAI;EACJ,OAAO;EACP,QAAQ;EACR,UAAU;EACV,OAAO;EACP,eAAe;EACf,MAAM;GAAC;GAAY;GAAe;GAAc;GAAY;EAAU;EACtE,QAAQ;GACN,MAAM;GACN,OAAO;GACP,MAAM;GACN,MAAM;GACN,UAAU;GACV,aAAa;GACb,UAAU,CACR;IAAE,IAAI;IAAW,MAAM;GAAU,GACjC;IAAE,IAAI;IAAiB,MAAM;IAAiB,aAAa;GAAkD,CAC/G;GACA,SAAS;IAAE,OAAO;IAAW,UAAU;GAAsB;GAC7D,QAAQ;IACN;KAAE,MAAM;KAAW,OAAO;KAAW,SAAS;IAAK;IACnD;KAAE,MAAM;KAAS,OAAO;IAAQ;IAChC;KAAE,MAAM;KAAY,OAAO;IAAW;GACxC;GACA,WAAW;IACT;KAAE,MAAM;KAAW,OAAO;IAAiB;IAC3C;KAAE,MAAM;KAAU,OAAO;IAAgB;IACzC;KAAE,MAAM;KAAO,OAAO;KAAe,aAAa;KAAmE,WAAW;IAAK;GACvI;GACA,QAAQ;IACN;KAAE,MAAM;KAAW,OAAO;KAAW,MAAM;KAAU,YAAY,EAAE,KAAK,GAAG;IAAE;IAC7E;KAAE,MAAM;KAAW,OAAO;KAAW,MAAM;KAAU,YAAY;MAAE,UAAU;MAAM,gBAAgB;KAAG;KAAG,IAAI;KAAM,WAAW;IAAK;IACnI;KAAE,MAAM;KAAS,OAAO;KAAS,MAAM;KAAQ,MAAM;KAAG,YAAY,EAAE,gBAAgB,IAAI;KAAG,IAAI;IAAK;IACtG;KACE,MAAM;KACN,OAAO;KACP,MAAM;KACN,MAAM;KACN,UAAU;KACV,QAAQ,CACN;MACE,MAAM;MACN,OAAO;MACP,MAAM;MACN,QAAQ;MACR,cAAc;MACd,SAAS,CAAC;OAAE,OAAO;OAAW,OAAO;MAAU,GAAG;OAAE,OAAO;OAAU,OAAO;MAAS,CAAC;KACxF,GACA;MAAE,MAAM;MAAS,OAAO;MAAgB,MAAM;MAAU,YAAY,EAAE,KAAK,GAAG;MAAG,aAAa;KAAW,CAC3G;IACF;IACA;KACE,MAAM;KACN,OAAO;KACP,MAAM;KACN,OAAO;KACP,UAAU;KACV,YAAY;MAAE,KAAK;MAAG,KAAK;KAAE;KAC7B,IAAI,CACF;MACE,MAAM;MACN,OAAO;MACP,MAAM;MACN,MAAM;MACN,SAAS;OAAE,OAAO;OAAQ,UAAU;OAAY,UAAU;MAAgB;MAC1E,QAAQ;OACN;QAAE,MAAM;QAAQ,OAAO;QAAa,MAAM;QAAU,YAAY;SAAE,UAAU;SAAM,KAAK;QAAG;OAAE;OAC5F;QAAE,MAAM;QAAY,OAAO;QAAgB,MAAM;QAAU,YAAY,EAAE,gBAAgB,GAAG;QAAG,aAAa;OAAmC;OAC/I;QACE,MAAM;QACN,OAAO;QACP,MAAM;QACN,QAAQ;QACR,cAAc;QACd,SAAS;SACP;UAAE,OAAO;UAAQ,OAAO;SAAO;SAC/B;UAAE,OAAO;UAAQ,OAAO;SAAO;SAC/B;UAAE,OAAO;UAAQ,OAAO;SAAW;SACnC;UAAE,OAAO;UAAU,OAAO;SAAS;QACrC;OACF;OACA;QAAE,MAAM;QAAW,OAAO;QAAS,MAAM;QAAU,UAAU;QAAW,SAAS;SAAE,MAAM;SAAO,KAAK;SAAG,MAAM;QAAE;QAAG,QAAQ;SAAE,OAAO;SAAW,QAAQ,CAAC,QAAQ,MAAM;QAAE;QAAG,YAAY,EAAE,UAAU,KAAK;QAAG,aAAa;OAAgC;OACxP;QAAE,MAAM;QAAU,OAAO;QAAiB,MAAM;QAAU,UAAU;QAAU,SAAS;SAAE,MAAM;SAAO,KAAK;SAAG,MAAM;QAAE;QAAG,QAAQ;SAAE,OAAO;SAAW,QAAQ,CAAC,QAAQ,MAAM;QAAE;QAAG,YAAY,EAAE,UAAU,KAAK;QAAG,aAAa;OAA+B;OAC7P;QAAE,MAAM;QAAY,OAAO;QAAiB,MAAM;QAAU,QAAQ;SAAE,OAAO;SAAW,QAAQ;QAAO;QAAG,SAAS;SAAE,KAAK;SAAG,KAAK;SAAI,MAAM;SAAG,MAAM;QAAQ;QAAG,aAAa;OAA+B;OAC5M;QAAE,MAAM;QAAe,OAAO;QAAe,MAAM;QAAU,QAAQ;SAAE,OAAO;SAAW,QAAQ;QAAS;QAAG,YAAY,EAAE,KAAK,GAAG;QAAG,aAAa;OAAa;OAChK;QAAE,MAAM;QAAU,OAAO;QAAU,MAAM;QAAU,YAAY,EAAE,UAAU,KAAK;OAAE;OAClF;QAAE,MAAM;QAAS,OAAO;QAAS,MAAM;QAAU,YAAY,EAAE,KAAK,GAAG;QAAG,aAAa;OAAe;OACtG;QAAE,MAAM;QAAY,OAAO;QAAiB,MAAM;QAAU,YAAY,EAAE,KAAK,GAAG;QAAG,aAAa;OAAgE;OAClK;QAAE,MAAM;QAAY,OAAO;QAAY,MAAM;QAAS,UAAU;QAAW,IAAI,CAAC;SAAE,MAAM;SAAW,OAAO;SAAW,MAAM;QAAS,CAAC;QAAG,YAAY,EAAE,KAAK,EAAE;QAAG,aAAa;OAAiD;OAC9N;QAAE,MAAM;QAAiB,OAAO;QAAoB,MAAM;QAAU,UAAU;QAAO,QAAQ,EAAE,MAAM,gBAAgB;QAAG,YAAY;QAAkC,QAAQ;SAAE,OAAO;SAAW,QAAQ,CAAC,QAAQ,MAAM;QAAE;QAAG,YAAY;SAAE,SAAS;SAAwB,gBAAgB;QAA4C;OAAE;OAC3U;QAAE,MAAM;QAAgB,OAAO;QAAmB,MAAM;QAAU,UAAU;QAAO,QAAQ,EAAE,MAAM,gBAAgB;QAAG,YAAY;QAAkC,QAAQ;SAAE,OAAO;SAAW,QAAQ,CAAC,QAAQ,MAAM;QAAE;QAAG,YAAY;SAAE,SAAS;SAAwB,gBAAgB;QAA4C;OAAE;MAC3U;KACF,CACF;IACF;IACA;KAAE,MAAM;KAAY,OAAO;KAAY,MAAM;KAAQ,MAAM;KAAG,OAAO;KAAY,YAAY,EAAE,KAAK,IAAI;IAAE;IAC1G;GACF;EACF;EACA,OAAO;GACL,UAAU;GACV,SAAS;GACT,SAAS;GACT,OAAO;GACP,QAAQ;IAAE,cAAc;IAAU,OAAO;GAAW;GACpD,OAAO;IACL;KACE,MAAM;KACN,MAAM;KACN,UAAU;KACV,SAAS;KACT,QAAQ;MAAE,OAAO;MAAkB,MAAM;MAAoC,MAAM;MAAO,OAAO;KAAU;KAC3G,UAAU;MAAC;MAAuB;MAAuB;KAAmB;IAC9E;IACA;KACE,MAAM;KACN,MAAM;KACN,UAAU;KACV,SAAS;KACT,SAAS;KACT,QAAQ;KACR,QAAQ;MAAE,OAAO;MAAsB,MAAM;MAA6C,MAAM;MAAO,OAAO;MAAW,OAAO;KAAK;KACrI,OAAO;KACP,UAAU;KACV,UAAU;MAAC;MAAqB;MAAwB;MAA4B;KAA4B;KAChH,eAAe;KACf,cAAc;IAChB;IACA;KACE,MAAM;KACN,MAAM;KACN,UAAU;KACV,SAAS;KACT,SAAS;KACT,QAAQ;KACR,UAAU;KACV,QAAQ;MAAE,OAAO;MAAsB,MAAM;MAA8C,MAAM;MAAO,OAAO;KAAY;KAC3H,UAAU;KACV,UAAU;MAAC;MAAsB;MAAwB;MAA4B;KAAW;KAChG,eAAe;KACf,cAAc;IAChB;IACA;KACE,MAAM;KACN,MAAM;KACN,UAAU;KACV,SAAS;KACT,aAAa;KACb,QAAQ;MAAE,OAAO;MAAiB,MAAM;MAAkB,MAAM;MAAQ,OAAO;KAAU;KACzF,UAAU;KACV,UAAU;MAAC;MAAkB;MAAoB;MAAqB;KAAW;IACnF;GACF;GACA,UAAU;GACV,UAAU;EACZ;EACA,OAAO;GACL,KACE;GACF,QACE;GACF,aAAa;IACX;IACA;IACA;IACA;IACA;GACF;GACA,KACE;GACF,UAAU;IACR;IACA;IACA;GACF;EACF;CACF;CAGA;EACE,IAAI;EACJ,OAAO;EACP,QAAQ;EACR,UAAU;EACV,OAAO;EACP,eAAe;EACf,MAAM;GAAC;GAAgB;GAAY;GAAc;GAAe;EAAU;EAC1E,QAAQ;GACN,MAAM;GACN,OAAO;GACP,MAAM;GACN,MAAM;GACN,UAAU;GACV,aAAa;GACb,SAAS;IAAE,OAAO;IAAW,UAAU;GAAQ;GAC/C,QAAQ;IACN;KAAE,MAAM;KAAW,OAAO;KAAW,SAAS;IAAK;IACnD;KAAE,MAAM;KAAU,OAAO;IAAU;IACnC;KAAE,MAAM;KAAS,OAAO;IAAQ;IAChC;KAAE,MAAM;KAAY,OAAO;IAAW;GACxC;GACA,QAAQ;IACN;KAAE,MAAM;KAAW,OAAO;KAAW,MAAM;KAAU,YAAY;MAAE,UAAU;MAAM,gBAAgB;KAAG;IAAE;IACxG;KAAE,MAAM;KAAS,OAAO;KAAS,MAAM;KAAQ,MAAM;KAAG,YAAY,EAAE,gBAAgB,IAAI;IAAE;IAC5F;KACE,MAAM;KACN,OAAO;KACP,MAAM;KACN,OAAO;KACP,UAAU;KACV,YAAY;MAAE,KAAK;MAAG,KAAK;KAAE;KAC7B,IAAI,CACF;MACE,MAAM;MACN,OAAO;MACP,MAAM;MACN,MAAM;MACN,SAAS;OAAE,OAAO;OAAS,UAAU;OAAQ,UAAU;MAAkB;MACzE,QAAQ;OACN;QAAE,MAAM;QAAO,OAAO;QAAO,MAAM;QAAU,QAAQ,EAAE,MAAM,gBAAgB;QAAG,YAAY;QAA2B,YAAY;SAAE,UAAU;SAAM,SAAS;SAAuB,gBAAgB;QAAuD;OAAE;OAC9P;QAAE,MAAM;QAAS,OAAO;QAAS,MAAM;QAAU,YAAY;SAAE,UAAU;SAAM,KAAK;QAAG;OAAE;OACzF;QAAE,MAAM;QAAQ,OAAO;QAAQ,MAAM;QAAU,YAAY,EAAE,KAAK,GAAG;OAAE;OACvE;QAAE,MAAM;QAAQ,OAAO;QAAQ,MAAM;QAAU,YAAY,EAAE,KAAK,GAAG;QAAG,aAAa;OAAS;OAC9F;QAAE,MAAM;QAAO,OAAO;QAAU,MAAM;QAAU,YAAY,EAAE,UAAU,KAAK;OAAE;OAC/E;QAAE,MAAM;QAAO,OAAO;QAAW,MAAM;QAAU,YAAY,EAAE,UAAU,KAAK;OAAE;OAChF;QAAE,MAAM;QAAS,OAAO;QAAa,MAAM;QAAU,YAAY,EAAE,UAAU,KAAK;OAAE;OACpF;QACE,MAAM;QACN,OAAO;QACP,MAAM;QACN,QAAQ;QACR,cAAc;QACd,SAAS,CACP;SAAE,OAAO;SAAU,OAAO;QAAa,GACvC;SAAE,OAAO;SAAO,OAAO;SAAgB,aAAa;QAA+B,CACrF;OACF;MACF;KACF,CACF;IACF;IACA;KAAE,MAAM;KAAa,OAAO;KAAgB,MAAM;KAAU,OAAO;KAAS,SAAS;MAAE,MAAM;MAAO,KAAK;MAAG,MAAM;KAAE;KAAG,aAAa;IAA8C;IAClL;KACE,MAAM;KACN,OAAO;KACP,MAAM;KACN,OAAO;KACP,UAAU;KACV,YAAY;MAAE,KAAK;MAAG,KAAK;KAAE;KAC7B,IAAI,CACF;MACE,MAAM;MACN,OAAO;MACP,MAAM;MACN,MAAM;MACN,SAAS;OAAE,OAAO;OAAS,UAAU;OAAY,UAAU;MAAgB;MAC3E,QAAQ;OACN;QAAE,MAAM;QAAS,OAAO;QAAc,MAAM;QAAU,YAAY,EAAE,UAAU,KAAK;QAAG,aAAa;OAAiC;OACpI;QAAE,MAAM;QAAY,OAAO;QAAiB,MAAM;QAAU,SAAS;SAAE,KAAK;SAAG,MAAM;QAAE;QAAG,aAAa;OAAqC;OAC5I;QAAE,MAAM;QAAO,OAAO;QAAc,MAAM;QAAU,cAAc;QAAG,SAAS;SAAE,KAAK;SAAG,MAAM;QAAE;QAAG,aAAa;OAAoD;OACpK;QACE,MAAM;QACN,OAAO;QACP,MAAM;QACN,UAAU;QACV,UAAU;QACV,YAAY;SAAE,KAAK;SAAG,KAAK;QAAE;QAC7B,aAAa;QACb,IAAI,CACF;SACE,MAAM;SACN,OAAO;SACP,MAAM;SACN,MAAM;SACN,SAAS;UAAE,OAAO;UAAQ,UAAU;UAAS,UAAU;SAAgB;SACvE,QAAQ,CACN;UAAE,MAAM;UAAQ,OAAO;UAAS,MAAM;UAAU,SAAS;WAAE,KAAK;WAAG,MAAM;UAAE;UAAG,aAAa;SAAkD,GAC7I;UAAE,MAAM;UAAS,OAAO;UAAS,MAAM;UAAU,SAAS;WAAE,MAAM;WAAO,KAAK;WAAG,MAAM;UAAK;UAAG,YAAY,EAAE,UAAU,KAAK;SAAE,CAChI;QACF,CACF;OACF;MACF;KACF,CACF;IACF;IACA;KAAE,MAAM;KAAiB,OAAO;KAAsB,MAAM;KAAW,OAAO;KAAY,cAAc;IAAK;IAC7G;KAAE,MAAM;KAAgB,OAAO;KAAuB,MAAM;KAAU,OAAO;KAAY,SAAS;MAAE,MAAM;MAAO,KAAK;MAAG,MAAM;KAAI;KAAG,aAAa;IAAwE;IAC3N;KAAE,MAAM;KAAe,OAAO;KAAgB,MAAM;KAAU,OAAO;KAAY,QAAQ;MAAE,OAAO;MAAgB,UAAU;KAAK;IAAE;IACnI;KAAE,MAAM;KAAU,OAAO;KAAU,MAAM;KAAU,YAAY,EAAE,UAAU,KAAK;IAAE;IAClF;KAAE,MAAM;KAAc,OAAO;KAAc,MAAM;KAAU,OAAO;KAAY,YAAY,EAAE,KAAK,IAAI;IAAE;IACvG;GACF;EACF;EACA,OAAO;GACL,SAAS;GACT,OAAO;GACP,QAAQ,CACN;IAAE,MAAM;IAAO,KAAK;IAAU,OAAO;IAAkB,MAAM;IAA2D,MAAM;IAAU,KAAK;IAAQ,KAAK;IAAW,OAAO;IAAS,OAAO;GAAM,GAClM;IAAE,MAAM;IAAO,KAAK;IAAiB,OAAO;IAAiB,MAAM;IAAQ,KAAK;IAAG,KAAK;IAAI,OAAO;IAAI,OAAO;GAAS,CACzH;GACA,WAAW;GACX,OAAO,CACL;IACE,MAAM;IACN,OAAO;IACP,UAAU;IACV,KAAK;IACL,OAAO;KACL;MAAE,MAAM;MAAO,MAAM;MAAU,OAAO;KAAI;KAC1C;MAAE,MAAM;MAAO,MAAM;MAAU,OAAO;KAAI;KAC1C;MAAE,MAAM;MAAO,OAAO;KAAI;IAC5B;GACF,GACA;IACE,MAAM;IACN,OAAO;IACP,UAAU;IACV,KAAK;IACL,OAAO,CAAC;KAAE,MAAM;KAAO,OAAO;IAAG,CAAC;GACpC,CACF;GACA,eAAe;GACf,cAAc;GACd,aAAa;IAAE,OAAO;IAAsB,MAAM;IAAkB,MAAM;IAAQ,OAAO;GAAY;GACrG,QAAQ;IAAE,OAAO;IAAsB,MAAM;IAA6C,MAAM;IAAO,OAAO;IAAW,OAAO;GAAK;GACrI,YAAY;GACZ,UAAU;EACZ;EACA,OAAO;GACL,KACE;GACF,QACE;GACF,aAAa;IACX;IACA;IACA;IACA;GACF;GACA,KACE;GACF,UAAU;IACR;IACA;IACA;IACA;GACF;EACF;CACF;CAGA;EACE,IAAI;EACJ,OAAO;EACP,QAAQ;EACR,UAAU;EACV,OAAO;EACP,eAAe;EACf,MAAM;GAAC;GAAgB;GAAY;GAAe;GAAc;GAAqB;EAAM;EAC3F,QAAQ;GACN,MAAM;GACN,OAAO;GACP,MAAM;GACN,MAAM;GACN,UAAU;GACV,aAAa;GACb,SAAS,EAAE,OAAO,UAAU;GAC5B,QAAQ,CACN;IAAE,MAAM;IAAW,OAAO;IAAW,SAAS;GAAK,GACnD;IAAE,MAAM;IAAU,OAAO;GAAS,CACpC;GACA,QAAQ;IACN;KAAE,MAAM;KAAW,OAAO;KAAW,MAAM;KAAU,YAAY;MAAE,UAAU;MAAM,gBAAgB;KAAG;IAAE;IACxG;KACE,MAAM;KACN,OAAO;KACP,MAAM;KACN,UAAU;KACV,YAAY;MAAE,KAAK;MAAG,KAAK;KAAE;KAC7B,IAAI,CACF;MACE,MAAM;MACN,OAAO;MACP,MAAM;MACN,MAAM;MACN,SAAS;OAAE,OAAO;OAAQ,UAAU;OAAS,UAAU;MAAkB;MACzE,QAAQ;OACN;QAAE,MAAM;QAAO,OAAO;QAAO,MAAM;QAAU,QAAQ,EAAE,MAAM,gBAAgB;QAAG,YAAY;QAA0C,YAAY;SAAE,UAAU;SAAM,SAAS;SAAY,gBAAgB;SAAsC,QAAQ;QAAK;OAAE;OAC9P;QAAE,MAAM;QAAQ,OAAO;QAAa,MAAM;QAAU,YAAY;SAAE,UAAU;SAAM,KAAK;QAAG;OAAE;OAC5F;QAAE,MAAM;QAAS,OAAO;QAAc,MAAM;QAAU,YAAY,EAAE,KAAK,GAAG;QAAG,aAAa;OAAS;OACrG;QAAE,MAAM;QAAU,OAAO;QAAU,MAAM;OAAS;MACpD;KACF,CACF;IACF;IACA;KACE,MAAM;KACN,OAAO;KACP,MAAM;KACN,YAAY,EAAE,UAAU,KAAK;KAE7B,OAAO;MAAE,YAAY;MAAG,SAAS;MAAI,aAAa;OAAC;OAAQ;OAAW;OAAS;OAAQ;MAAiB;MAAG,QAAQ,CAAC,QAAQ;MAAG,UAAU;OAAE,QAAQ,CAAC;OAAG,QAAQ;OAAO,QAAQ;MAAM;KAAE;IACxL;IACA;KAAE,MAAM;KAAkB,OAAO;KAA+B,MAAM;KAAW,OAAO;KAAU,cAAc;IAAK;IACrH;KACE,MAAM;KACN,OAAO;KACP,MAAM;KACN,OAAO;KACP,QAAQ;KACR,cAAc;KACd,SAAS,CACP;MAAE,OAAO;MAAY,OAAO;MAAsB,MAAM;MAAiB,aAAa;KAAkC,GACxH;MAAE,OAAO;MAAU,OAAO;MAAmB,MAAM;MAAqB,aAAa;KAA4B,CACnH;IACF;GACF;EACF;EACA,OAAO;GACL,SAAS;GACT,OAAO;IACL;KAAE,MAAM;KAAM,KAAK;KAAS,MAAM;KAAS,OAAO;KAAM,QAAQ;MAAE,OAAO;MAAc,MAAM;MAAoC,MAAM;MAAO,OAAO;KAAU;IAAE;IACjK;KAAE,MAAM;KAAM,KAAK;KAAO,MAAM;KAAO,OAAO;KAAU,QAAQ;MAAE,OAAO;MAAe,MAAM;MAA6C,MAAM;MAAO,OAAO;KAAU;IAAE;IAC3K;KAAE,MAAM;KAAM,KAAK;KAAQ,MAAM;KAAQ,OAAO;KAAY,QAAQ;MAAE,OAAO;MAAe,MAAM;MAA8C,MAAM;MAAO,OAAO;KAAY;IAAE;IAClL;KAAE,MAAM;KAAM,KAAK;KAAc,MAAM;KAAc,OAAO;KAAU,QAAQ;MAAE,OAAO;MAAiB,MAAM;MAAkB,MAAM;MAAQ,OAAO;KAAU;IAAE;GACnK;GACA,QAAQ,UACN,8FACA;IACE;KAAE,MAAM;KAAW,OAAO;IAAU;IACpC;KAAE,MAAM;KAAS,OAAO;KAAS,MAAM;IAAU;IACjD;KAAE,MAAM;KAAO,OAAO;KAAO,MAAM;KAAW,WAAW;IAAK;IAC9D;KAAE,MAAM;KAAQ,OAAO;KAAQ,MAAM;IAAU;IAC/C;KAAE,MAAM;KAAc,OAAO;KAAc,MAAM;IAAU;GAC7D,GACA;IACE;KAAE,OAAO;MAAC;MAAiB;OAAE,OAAO;OAAG,MAAM;MAAQ;MAAG;OAAE,OAAO;OAAI,MAAM;MAAQ;MAAG;OAAE,OAAO;OAAI,MAAM;OAAS,MAAM;MAAK;MAAG;OAAE,OAAO;OAAU,MAAM;MAAO;KAAC;KAAG,OAAO;IAAQ;IACnL;KAAE,OAAO;MAAC;OAAE,OAAO;OAAkB,MAAM;MAAK;MAAG;MAAQ;MAAM;MAAO;KAAW;KAAG,OAAO;KAAY,MAAM;IAAO;IACtH;KAAE,OAAO;MAAC;OAAE,OAAO;QAAE,OAAO;QAAqB,MAAM;OAA8C;OAAG,MAAM;MAAO;MAAG;OAAE,OAAO;OAAc,MAAM;MAAO;MAAG;MAAM;MAAM;KAAI;KAAG,OAAO;IAAW;IACpM;KAAE,OAAO;MAAC;MAAc;MAAO;OAAE,OAAO;OAAkB,MAAM;MAAO;MAAG;MAAM;KAAI;KAAG,OAAO;IAAW;IACzG;KAAE,OAAO;MAAC;MAAY;MAAO;MAAO;OAAE,OAAO;OAAgB,MAAM;MAAO;MAAG;KAAI;KAAG,OAAO;IAAW;IACtG;KAAE,OAAO;MAAC;OAAE,OAAO;OAAa,MAAM;MAAK;MAAG;MAAO;MAAO;MAAO;KAAI;KAAG,OAAO;IAAW;IAC5F;KAAE,OAAO;MAAC;MAAyB;MAAO;MAAO;MAAO;OAAE,OAAO;OAAe,MAAM;MAAO;KAAC;KAAG,OAAO;IAAW;GACrH,GACA;IACE,IAAI;IACJ,cAAc;IACd,WAAW;KAAC;MAAE,MAAM;MAAS,OAAO;KAAQ;KAAG;MAAE,MAAM;MAAY,OAAO;KAAW;KAAG;MAAE,MAAM;MAAY,OAAO;KAAwB;IAAC;IAC5I,WAAW;KACT;MAAE,MAAM;MAAM,MAAM;KAAmD;KACvE;MAAE,MAAM;MAAM,MAAM;KAA4B;KAChD;MAAE,MAAM;MAAM,MAAM;KAAiE;IACvF;IACA,QAAQ;KAAE,YAAY;KAAU,QAAQ;IAAK;IAC7C,QAAQ;KAAE,MAAM;KAAU,UAAU;IAAK;GAC3C,CACF;GACA,gBAAgB;GAChB,QAAQ;EACV;EACA,OAAO;GACL,KACE;GACF,QACE;GACF,aAAa;IACX;IACA;IACA;IACA;IACA;GACF;GACA,KACE;GACF,UAAU;IACR;IACA;IACA;IACA;IACA;GACF;EACF;CACF;CAGA;EACE,IAAI;EACJ,OAAO;EACP,QAAQ;EACR,UAAU;EACV,OAAO;EACP,eAAe;EACf,MAAM;GAAC;GAAY;GAAY;GAAe;GAAc;EAAW;EACvE,QAAQ;GACN,MAAM;GACN,OAAO;GACP,MAAM;GACN,MAAM;GACN,UAAU;GACV,aAAa;GACb,SAAS;IAAE,OAAO;IAAa,UAAU;GAAU;GACnD,QAAQ,CACN;IAAE,MAAM;IAAW,OAAO;IAAW,SAAS;GAAK,GACnD;IAAE,MAAM;IAAU,OAAO;GAAU,CACrC;GACA,WAAW,CAAC;IAAE,MAAM;IAAS,OAAO;IAAS,SAAS;GAAE,CAAC;GACzD,QAAQ;IACN;KAAE,MAAM;KAAW,OAAO;KAAW,MAAM;KAAU,YAAY;MAAE,UAAU;MAAM,gBAAgB;KAAG;IAAE;IACxG;KAAE,MAAM;KAAS,OAAO;KAAS,MAAM;KAAQ,MAAM;KAAG,YAAY,EAAE,gBAAgB,IAAI;IAAE;IAC5F;KACE,MAAM;KACN,OAAO;KACP,MAAM;KACN,MAAM;KACN,UAAU;KACV,QAAQ;MACN;OAAE,MAAM;OAAQ,OAAO;OAAa,MAAM;OAAU,YAAY;QAAE,UAAU;QAAM,KAAK;OAAG;MAAE;MAC5F;OAAE,MAAM;OAAS,OAAO;OAAS,MAAM;OAAU,UAAU;OAAS,SAAS;QAAE,MAAM;QAAO,KAAK;QAAG,MAAM;OAAE;OAAG,YAAY,EAAE,UAAU,KAAK;MAAE;MAC9I;OACE,MAAM;OACN,OAAO;OACP,MAAM;OACN,UAAU;OACV,cAAc;OACd,SAAS;QAAC;SAAE,OAAO;SAAS,OAAO;QAAY;QAAG;SAAE,OAAO;SAAQ,OAAO;QAAW;QAAG;SAAE,OAAO;SAAQ,OAAO;QAAO;OAAC;MAC1H;MACA;OAAE,MAAM;OAAc,OAAO;OAAgB,MAAM;OAAU,YAAY,EAAE,KAAK,GAAG;OAAG,aAAa;MAAgC;MACnI;OAAE,MAAM;OAAY,OAAO;OAAY,MAAM;OAAS,UAAU;OAAW,IAAI,CAAC;QAAE,MAAM;QAAW,OAAO;QAAW,MAAM;OAAS,CAAC;OAAG,YAAY;QAAE,KAAK;QAAG,KAAK;OAAE;MAAE;KACzK;IACF;IACA;KACE,MAAM;KACN,OAAO;KACP,MAAM;KACN,OAAO;KACP,UAAU;KACV,YAAY,EAAE,KAAK,EAAE;KACrB,IAAI,CACF;MACE,MAAM;MACN,OAAO;MACP,MAAM;MACN,MAAM;MACN,SAAS;OAAE,OAAO;OAAQ,UAAU;OAAS,UAAU;MAAkB;MACzE,QAAQ;OACN;QAAE,MAAM;QAAQ,OAAO;QAAQ,MAAM;QAAU,YAAY;SAAE,UAAU;SAAM,KAAK;QAAG;OAAE;OACvF;QAAE,MAAM;QAAe,OAAO;QAAe,MAAM;QAAU,YAAY,EAAE,gBAAgB,GAAG;OAAE;OAChG;QAAE,MAAM;QAAS,OAAO;QAAS,MAAM;QAAU,SAAS;SAAE,MAAM;SAAO,KAAK;SAAG,MAAM;QAAE;QAAG,YAAY,EAAE,UAAU,KAAK;OAAE;OAC3H;QACE,MAAM;QACN,OAAO;QACP,MAAM;QACN,cAAc;QACd,SAAS;SAAC;UAAE,OAAO;UAAW,OAAO;SAAc;SAAG;UAAE,OAAO;UAAS,OAAO;SAAY;SAAG;UAAE,OAAO;UAAQ,OAAO;SAAO;QAAC;OAChI;OACA;QAAE,MAAM;QAAiB,OAAO;QAA4B,MAAM;OAAU;OAC5E;QAAE,MAAM;QAAe,OAAO;QAAS,MAAM;QAAU,QAAQ;SAAE,OAAO;SAAiB,QAAQ;QAAK;QAAG,SAAS;SAAE,KAAK;SAAG,KAAK;SAAI,MAAM;QAAE;OAAE;OAC/I;QAAE,MAAM;QAAiB,OAAO;QAAuB,MAAM;OAAU;OACvE;QAAE,MAAM;QAAiB,OAAO;QAAuB,MAAM;OAAU;MACzE;KACF,CACF;IACF;IACA;KAAE,MAAM;KAAc,OAAO;KAAe,MAAM;KAAU,YAAY,EAAE,KAAK,GAAG;KAAG,aAAa;IAAqB;IACvH;KAAE,MAAM;KAAU,OAAO;KAAU,MAAM;KAAU,YAAY,EAAE,UAAU,KAAK;IAAE;IAClF;KAAE,MAAM;KAAa,OAAO;KAAe,MAAM;IAAW;GAC9D;EACF;EACA,OAAO;GACL,SAAS;GACT,OAAO;GACP,MAAM;IACJ,MAAM;IACN,OAAO;IACP,UAAU;IACV,YAAY;IACZ,UAAU;KAAC;KAAkC;KAAqC;KAAsC;IAA2B;GACrJ;GACA,QAAQ;IACN;KAAE,MAAM;KAAO,MAAM;KAAiB,aAAa;KAA8C,OAAO;KAAI,MAAM;KAAW,eAAe;KAAM,aAAa;KAAG,eAAe;IAAK;IACtL;KAAE,MAAM;KAAO,MAAM;KAAgB,aAAa;KAAmD,OAAO;KAAI,MAAM;KAAW,eAAe;KAAM,aAAa;KAAG,eAAe;IAAK;IAC1L;KAAE,MAAM;KAAO,MAAM;KAA0B,aAAa;KAAgD,OAAO;KAAK,MAAM;KAAW,eAAe;KAAO,eAAe;IAAM;IACpL;KAAE,MAAM;KAAO,MAAM;KAAyB,aAAa;KAAkD,OAAO;KAAK,MAAM;KAAQ,eAAe;KAAO,eAAe;IAAK;GACnL;GACA,YAAY;GACZ,QAAQ;IAAE,OAAO;IAAyB,MAAM;IAAS,MAAM;IAAQ,OAAO;IAAW,OAAO;GAAK;GACrG,WACE;EACJ;EACA,OAAO;GACL,KACE;GACF,QACE;GACF,aAAa;IACX;IACA;IACA;IACA;GACF;GACA,KACE;GACF,UAAU;IACR;IACA;IACA;GACF;EACF;CACF;CAGA;EACE,IAAI;EACJ,OAAO;EACP,QAAQ;EACR,UAAU;EACV,OAAO;EACP,eAAe;EACf,MAAM;GAAC;GAAe;GAAc;GAAQ;GAAY;GAAQ;EAAa;EAC7E,QAAQ;GACN,MAAM;GACN,OAAO;GACP,MAAM;GACN,MAAM;GACN,UAAU;GACV,aAAa;GACb,SAAS;IAAE,OAAO;IAAW,UAAU;GAAS;GAChD,QAAQ,CACN;IAAE,MAAM;IAAW,OAAO;IAAW,SAAS;GAAK,GACnD;IAAE,MAAM;IAAS,OAAO;GAAQ,CAClC;GACA,QAAQ;IACN;KAAE,MAAM;KAAW,OAAO;KAAW,MAAM;KAAU,YAAY,EAAE,KAAK,GAAG;IAAE;IAC7E;KAAE,MAAM;KAAW,OAAO;KAAW,MAAM;KAAU,YAAY;MAAE,UAAU;MAAM,gBAAgB;KAAG;KAAG,IAAI;IAAK;IAClH;KAAE,MAAM;KAAQ,OAAO;KAAQ,MAAM;KAAQ,MAAM;KAAG,YAAY,EAAE,gBAAgB,IAAI;KAAG,IAAI;IAAK;IACpG;KACE,MAAM;KACN,OAAO;KACP,MAAM;KACN,UAAU;KACV,UAAU;KACV,YAAY,EAAE,KAAK,EAAE;KACrB,IAAI,CACF;MACE,MAAM;MACN,OAAO;MACP,MAAM;MACN,MAAM;MACN,SAAS;OAAE,OAAO;OAAS,UAAU;MAAiB;MACtD,QAAQ,CACN;OAAE,MAAM;OAAQ,OAAO;OAAQ,MAAM;MAAO,GAC5C;OAAE,MAAM;OAAS,OAAO;OAAS,MAAM;OAAU,YAAY;QAAE,UAAU;QAAM,KAAK;OAAG;MAAE,CAC3F;KACF,CACF;IACF;IACA;KACE,MAAM;KACN,OAAO;KACP,MAAM;KACN,QAAQ;KACR,cAAc;KACd,SAAS;MACP;OAAE,OAAO;OAAQ,OAAO;OAAgB,MAAM;OAAS,aAAa;MAA8B;MAClG;OAAE,OAAO;OAAY,OAAO;OAAgB,MAAM;OAAY,aAAa;MAAmC;MAC9G;OAAE,OAAO;OAAQ,OAAO;OAAkB,MAAM;MAAO;KACzD;IACF;IACA;KAAE,MAAM;KAAQ,OAAO;KAAQ,MAAM;KAAa,WAAW,EAAE,IAAI,CAAC,MAAM,EAAE;KAAG,QAAQ;MAAE,OAAO;MAAU,QAAQ;KAAO;KAAG,YAAY,EAAE,UAAU,KAAK;KAAG,aAAa;IAA8C;IACvN;KAAE,MAAM;KAAe,OAAO;KAAmB,MAAM;KAAO,QAAQ;MAAE,OAAO;MAAU,QAAQ;KAAW;KAAG,YAAY;MAAE,UAAU;MAAM,SAAS;MAAgF,gBAAgB;KAA2F;IAAE;IACnV;KAAE,MAAM;KAAe,OAAO;KAAgB,MAAM;KAAU,QAAQ;MAAE,OAAO;MAAU,QAAQ,CAAC,QAAQ,UAAU;KAAE;KAAG,YAAY;MAAE,UAAU;MAAM,KAAK;KAAG;KAAG,aAAa;IAAgB;IAC/L;KAAE,MAAM;KAAU,OAAO;KAAU,MAAM;KAAU,QAAQ;MAAE,OAAO;MAAU,QAAQ;KAAO;IAAE;IAC/F;KAAE,MAAM;KAAgB,OAAO;KAAiB,MAAM;KAAU,YAAY,EAAE,KAAK,GAAG;KAAG,aAAa;IAAmC;IACzI;KACE,MAAM;KACN,OAAO;KACP,MAAM;KACN,OAAO;KACP,QAAQ;KACR,SAAS;MACP;OAAE,OAAO;OAAQ,OAAO;MAAgB;MACxC;OAAE,OAAO;OAAY,OAAO;MAAY;MACxC;OAAE,OAAO;OAAS,OAAO;MAAQ;MACjC;OAAE,OAAO;OAAQ,OAAO;MAAO;MAC/B;OAAE,OAAO;OAAO,OAAO;MAAU;KACnC;IACF;IACA;KACE,MAAM;KACN,OAAO;KACP,MAAM;KACN,OAAO;KACP,UAAU;KACV,aAAa;KACb,YAAY,EAAE,KAAK,EAAE;KACrB,IAAI,CACF;MACE,MAAM;MACN,OAAO;MACP,MAAM;MACN,MAAM;MACN,SAAS;OAAE,OAAO;OAAQ,OAAO;OAAQ,UAAU;MAAgB;MACnE,QAAQ,CACN;OAAE,MAAM;OAAQ,OAAO;OAAW,MAAM;OAAU,YAAY;QAAE,UAAU;QAAM,KAAK;OAAG;OAAG,aAAa;MAA0C,GAClJ;OAAE,MAAM;OAAQ,OAAO;OAAQ,MAAM;OAAS,YAAY,EAAE,UAAU,KAAK;OAAG,aAAa;MAAuC,CACpI;KACF,CACF;IACF;IACA;KACE,MAAM;KACN,OAAO;KACP,MAAM;KACN,OAAO;KACP,MAAM;KACN,UAAU;KACV,QAAQ;MACN;OAAE,MAAM;OAAQ,OAAO;OAAS,MAAM;OAAQ,MAAM;OAAG,YAAY,EAAE,gBAAgB,IAAI;MAAE;MAC3F;OAAE,MAAM;OAAQ,OAAO;OAAQ,MAAM;OAAU,YAAY,EAAE,KAAK,GAAG;MAAE;MACvE;OAAE,MAAM;OAAQ,OAAO;OAAoB,MAAM;OAAU,YAAY,EAAE,KAAK,GAAG;MAAE;KACrF;IACF;GACF;EACF;EACA,OAAO;GACL,SAAS;GACT,SAAS;GACT,MAAM;GACN,QAAQ;IACN;KAAE,MAAM;KAAO,MAAM;KAAU,OAAO;IAAqC;IAC3E;KAAE,MAAM;KAAO,MAAM;KAAe,OAAO;IAAsC;IACjF;KAAE,MAAM;KAAO,MAAM;KAAe,OAAO;IAAiC;IAC5E;KAAE,MAAM;KAAO,MAAM;KAAW,OAAO;IAA6C;GACtF;GACA,QAAQ;GACR,MAAM;GACN,aAAa;GACb,cAAc;GACd,YAAY;IAAC;IAAQ;IAAS;GAAM;GACpC,OAAO;IACL;KAAE,MAAM;KAAO,MAAM;KAAkB,MAAM,IAAI,0BAA0B,KAAK,KAAK,qBAAqB;IAAE;IAC5G;KAAE,MAAM;KAAO,MAAM;KAAmB,MAAM,IAAI,0BAA0B,KAAK,KAAK,sBAAsB;IAAE;IAC9G;KAAE,MAAM;KAAO,MAAM;KAAe,MAAM,IAAI,0BAA0B,KAAK,KAAK,kBAAkB;IAAE;GACxG;GACA,OAAO;IAAE,MAAM;IAA4F,MAAM;IAAiB,MAAM;GAA8B;EACxK;EACA,OAAO;GACL,KACE;GACF,QACE;GACF,aAAa;IACX;IACA;IACA;IACA;GACF;GACA,KACE;GACF,UAAU,CACR,iHACA,iGACF;EACF;CACF;CAGA;EACE,IAAI;EACJ,OAAO;EACP,QAAQ;EACR,UAAU;EACV,OAAO;EACP,eAAe;EACf,MAAM;GAAC;GAAa;GAAkB;GAAe;GAAc;GAAY;EAAY;EAC3F,QAAQ;GACN,MAAM;GACN,OAAO;GACP,MAAM;GACN,MAAM;GACN,UAAU;GACV,aAAa;GACb,UAAU,CACR;IAAE,IAAI;IAAa,MAAM;GAAY,GACrC;IAAE,IAAI;IAAW,MAAM;IAAe,aAAa;GAAoC,CACzF;GACA,SAAS,EAAE,OAAO,UAAU;GAC5B,QAAQ,CACN;IAAE,MAAM;IAAW,OAAO;IAAW,SAAS;GAAK,GACnD;IAAE,MAAM;IAAY,OAAO;GAAW,CACxC;GACA,QAAQ;IACN;KAAE,MAAM;KAAW,OAAO;KAAW,MAAM;KAAU,YAAY;MAAE,UAAU;MAAM,gBAAgB;KAAG;KAAG,WAAW;IAAK;IACzH;KACE,MAAM;KACN,OAAO;KACP,MAAM;KACN,QAAQ;KACR,cAAc;KACd,SAAS,CAAC;MAAE,OAAO;MAAU,OAAO;KAAe,GAAG;MAAE,OAAO;MAAc,OAAO;KAAkB,CAAC;IACzG;IACA;KACE,MAAM;KACN,OAAO;KACP,MAAM;KACN,UAAU;KACV,QAAQ;MAAE,OAAO;MAAU,QAAQ;KAAS;KAC5C,YAAY;MAAE,KAAK;MAAG,KAAK;KAAE;KAC7B,IAAI,CACF;MACE,MAAM;MACN,OAAO;MACP,MAAM;MACN,MAAM;MACN,SAAS;OAAE,OAAO;OAAS,UAAU;MAAiB;MACtD,QAAQ,CACN;OAAE,MAAM;OAAS,OAAO;OAAe,MAAM;OAAU,YAAY;QAAE,UAAU;QAAM,KAAK;OAAG;MAAE,GAC/F;OACE,MAAM;OACN,OAAO;OACP,MAAM;OACN,UAAU;OACV,YAAY;QAAE,KAAK;QAAG,KAAK;OAAG;OAC9B,IAAI,CACF;QACE,MAAM;QACN,OAAO;QACP,MAAM;QACN,MAAM;QACN,SAAS;SAAE,OAAO;SAAY,UAAU;SAAU,UAAU;QAAoB;QAChF,QAAQ,CACN;SAAE,MAAM;SAAY,OAAO;SAAY,MAAM;SAAU,YAAY;UAAE,UAAU;UAAM,KAAK;SAAI;SAAG,IAAI;SAAM,WAAW;QAAK,GAC3H;SACE,MAAM;SACN,OAAO;SACP,MAAM;SACN,YAAY,EAAE,UAAU,KAAK;SAC7B,IAAI;SACJ,WAAW;SACX,aAAa;SACb,UAAU;QACZ,CACF;OACF,CACF;MACF,CACF;KACF,CACF;IACF;IACA;KACE,MAAM;KACN,OAAO;KACP,MAAM;KACN,QAAQ;MAAE,OAAO;MAAU,QAAQ;KAAa;KAChD,YAAY,EAAE,KAAK,GAAG;KACtB,IAAI,CAAC;MAAE,MAAM;MAAU,OAAO;MAAO,MAAM;MAAa,WAAW;OAAE,IAAI,CAAC,SAAS;OAAG,QAAQ;MAAwB;KAAE,CAAC;IAC3H;IACA;KAAE,MAAM;KAAiB,OAAO;KAAkB,MAAM;IAAS;IACjE;KAAE,MAAM;KAAkB,OAAO;KAAoB,MAAM;KAAW,OAAO;KAAY,cAAc;KAAM,aAAa;IAAyD;IACnL;KAAE,MAAM;KAAe,OAAO;KAA2B,MAAM;KAAW,OAAO;KAAY,cAAc;IAAK;GAClH;EACF;EACA,OAAO;GACL,UAAU;GACV,SAAS;GACT,QAAQ;GACR,QAAQ,CACN;IACE,MAAM;IACN,OAAO;IACP,OAAO;KACL;MAAE,MAAM;MAAO,UAAU;MAAwC,QAAQ;KAAgJ;KACzN;MAAE,MAAM;MAAO,UAAU;MAAqC,QAAQ;KAAwH;KAC9L;MAAE,MAAM;MAAO,UAAU;MAA6B,QAAQ;KAA0H;IAC1L;GACF,GACA;IACE,MAAM;IACN,OAAO;IACP,OAAO,CACL;KAAE,MAAM;KAAO,UAAU;KAA+C,QAAQ;IAAmG,GACnL;KAAE,MAAM;KAAO,UAAU;KAA0B,QAAQ;IAAwF,CACrJ;GACF,CACF;GACA,WAAW,CAAC,SAAS;GACrB,eAAe;IAAE,OAAO;IAAwB,MAAM;IAAgC,MAAM;IAAS,OAAO;IAAyB,OAAO;GAAO;GACnJ,gBAAgB;GAChB,aAAa;EACf;EACA,OAAO;GACL,KACE;GACF,QACE;GACF,aAAa;IACX;IACA;IACA;IACA;GACF;GACA,KACE;GACF,UAAU,CACR,gIACA,oFACF;EACF;CACF;CAGA;EACE,IAAI;EACJ,OAAO;EACP,QAAQ;EACR,UAAU;EACV,OAAO;EACP,eAAe;EACf,MAAM;GAAC;GAAmB;GAAe;GAAc;EAAU;EACjE,QAAQ;GACN,MAAM;GACN,OAAO;GACP,MAAM;GACN,MAAM;GACN,UAAU;GACV,aAAa;GACb,SAAS;IAAE,OAAO;IAAW,UAAU;IAAY,MAAM;GAAY;GACrE,QAAQ,CACN;IAAE,MAAM;IAAW,OAAO;IAAW,SAAS;GAAK,GACnD;IAAE,MAAM;IAAa,OAAO;GAAgB,CAC9C;GACA,QAAQ;IACN;KAAE,MAAM;KAAW,OAAO;KAAW,MAAM;KAAU,YAAY;MAAE,UAAU;MAAM,KAAK;MAAI,gBAAgB;KAAG;KAAG,IAAI;KAAM,aAAa;IAAiC;IAC1K;KACE,MAAM;KACN,OAAO;KACP,MAAM;KACN,QAAQ;KACR,cAAc;KACd,SAAS;MAAC;OAAE,OAAO;OAAW,OAAO;MAAU;MAAG;OAAE,OAAO;OAAU,OAAO;MAAc;MAAG;OAAE,OAAO;OAAU,OAAO;MAAS;KAAC;IACnI;IACA;KAAE,MAAM;KAAW,OAAO;KAAW,MAAM;KAAU,QAAQ;MAAE,OAAO;MAAc,QAAQ;KAAU;KAAG,SAAS;MAAE,KAAK;MAAG,KAAK;MAAI,MAAM;MAAG,MAAM;KAAI;KAAG,YAAY,EAAE,UAAU,KAAK;IAAE;IAC1L;KAAE,MAAM;KAAU,OAAO;KAAe,MAAM;KAAU,QAAQ;MAAE,OAAO;MAAc,QAAQ;KAAS;KAAG,SAAS;MAAE,KAAK;MAAG,KAAK;MAAG,MAAM;MAAG,MAAM;KAAS;KAAG,YAAY,EAAE,UAAU,KAAK;IAAE;IAChM;KAAE,MAAM;KAAU,OAAO;KAAU,MAAM;KAAU,QAAQ;MAAE,OAAO;MAAc,QAAQ;KAAS;KAAG,SAAS;MAAE,MAAM;MAAO,KAAK;MAAG,MAAM;KAAE;KAAG,YAAY,EAAE,UAAU,KAAK;KAAG,aAAa;IAAc;IAC5M;KAAE,MAAM;KAAU,OAAO;KAAU,MAAM;KAAU,YAAY,EAAE,UAAU,KAAK;IAAE;IAClF;KACE,MAAM;KACN,OAAO;KACP,MAAM;KACN,OAAO;KACP,cAAc;KACd,SAAS;MACP;OAAE,OAAO;OAAY,OAAO;MAAW;MACvC;OAAE,OAAO;OAAY,OAAO;MAA8B;MAC1D;OAAE,OAAO;OAAmB,OAAO;OAA0B,aAAa;MAA4C;KACxH;IACF;IACA;KACE,MAAM;KACN,OAAO;KACP,MAAM;KACN,OAAO;KACP,QAAQ;KACR,YAAY,EAAE,KAAK,EAAE;KACrB,SAAS;MACP;OAAE,OAAO;OAAW,OAAO;MAAkB;MAC7C;OAAE,OAAO;OAAU,OAAO;MAAqB;MAC/C;OAAE,OAAO;OAAW,OAAO;MAA6B;KAC1D;IACF;IACA;KAAE,MAAM;KAAS,OAAO;KAAc,MAAM;KAAQ,OAAO;KAAa,aAAa;IAAsC;IAC3H;KAAE,MAAM;KAAiB,OAAO;KAAyB,MAAM;KAAW,OAAO;KAAa,cAAc;KAAM,aAAa;IAA0C;GAC3K;EACF;EACA,OAAO;GACL,SAAS;GACT,YAAY;GACZ,SAAS;GACT,QAAQ;GACR,QAAQ;GACR,QAAQ;IAAE,OAAO;IAAoB,MAAM;IAAgC,MAAM;IAAQ,OAAO;GAAU;GAC1G,UAAU;GACV,YAAY,CAAC,UAAU,SAAS;GAChC,OAAO;GACP,eAAe;EACjB;EACA,OAAO;GACL,KACE;GACF,QACE;GACF,aAAa;IACX;IACA;IACA;GACF;GACA,KACE;GACF,UAAU,CACR,2HACA,2GACF;EACF;CACF;AACF"}
|