@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,2781 @@
|
|
|
1
|
+
//#region src/library/entries/media.entries.ts
|
|
2
|
+
var img = (seed, alt, w = 1600, h = 1067, focal) => ({
|
|
3
|
+
url: `https://picsum.photos/seed/${seed}/${w}/${h}`,
|
|
4
|
+
alt,
|
|
5
|
+
name: `${seed}.jpg`,
|
|
6
|
+
width: w * 2,
|
|
7
|
+
height: h * 2,
|
|
8
|
+
...focal ? { focal } : {}
|
|
9
|
+
});
|
|
10
|
+
var GROUPS = [
|
|
11
|
+
{
|
|
12
|
+
name: "content",
|
|
13
|
+
title: "Content",
|
|
14
|
+
default: true
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
name: "media",
|
|
18
|
+
title: "Media"
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
name: "design",
|
|
22
|
+
title: "Design"
|
|
23
|
+
}
|
|
24
|
+
];
|
|
25
|
+
var theme = {
|
|
26
|
+
name: "theme",
|
|
27
|
+
title: "Theme",
|
|
28
|
+
type: "select",
|
|
29
|
+
group: "design",
|
|
30
|
+
layout: "segmented",
|
|
31
|
+
initialValue: "light",
|
|
32
|
+
options: [
|
|
33
|
+
{
|
|
34
|
+
value: "light",
|
|
35
|
+
label: "Light"
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
value: "dark",
|
|
39
|
+
label: "Dark"
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
value: "brand",
|
|
43
|
+
label: "Brand"
|
|
44
|
+
}
|
|
45
|
+
]
|
|
46
|
+
};
|
|
47
|
+
var credit = {
|
|
48
|
+
name: "credit",
|
|
49
|
+
title: "Credit",
|
|
50
|
+
type: "object",
|
|
51
|
+
icon: "camera",
|
|
52
|
+
openMode: "inline",
|
|
53
|
+
fields: [{
|
|
54
|
+
name: "name",
|
|
55
|
+
title: "Name",
|
|
56
|
+
type: "string",
|
|
57
|
+
validation: { max: 48 }
|
|
58
|
+
}, {
|
|
59
|
+
name: "link",
|
|
60
|
+
title: "Link",
|
|
61
|
+
type: "link"
|
|
62
|
+
}]
|
|
63
|
+
};
|
|
64
|
+
var masonry = {
|
|
65
|
+
name: "masonryGallery",
|
|
66
|
+
title: "Masonry gallery",
|
|
67
|
+
kind: "block",
|
|
68
|
+
icon: "layout-board",
|
|
69
|
+
category: "Media & galleries",
|
|
70
|
+
description: "Photos at their natural shapes, packed in columns, with captions and credits",
|
|
71
|
+
variants: [{
|
|
72
|
+
id: "masonry",
|
|
73
|
+
name: "Masonry",
|
|
74
|
+
description: "Natural heights, columns"
|
|
75
|
+
}, {
|
|
76
|
+
id: "justified",
|
|
77
|
+
name: "Justified rows",
|
|
78
|
+
description: "Equal row heights, natural widths"
|
|
79
|
+
}],
|
|
80
|
+
preview: {
|
|
81
|
+
title: "heading",
|
|
82
|
+
media: "images.0.image",
|
|
83
|
+
icon: "layout-board"
|
|
84
|
+
},
|
|
85
|
+
groups: GROUPS,
|
|
86
|
+
fields: [
|
|
87
|
+
{
|
|
88
|
+
name: "heading",
|
|
89
|
+
title: "Heading",
|
|
90
|
+
type: "string",
|
|
91
|
+
validation: { recommendedMax: 60 },
|
|
92
|
+
localized: true
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
name: "intro",
|
|
96
|
+
title: "Intro",
|
|
97
|
+
type: "text",
|
|
98
|
+
rows: 2,
|
|
99
|
+
localized: true
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
name: "images",
|
|
103
|
+
title: "Photos",
|
|
104
|
+
type: "array",
|
|
105
|
+
group: "media",
|
|
106
|
+
itemNoun: "photo",
|
|
107
|
+
arrayLayout: "grid",
|
|
108
|
+
validation: {
|
|
109
|
+
min: 3,
|
|
110
|
+
max: 60
|
|
111
|
+
},
|
|
112
|
+
of: [{
|
|
113
|
+
name: "photo",
|
|
114
|
+
title: "Photo",
|
|
115
|
+
type: "object",
|
|
116
|
+
icon: "photo",
|
|
117
|
+
preview: {
|
|
118
|
+
title: "caption",
|
|
119
|
+
subtitle: "credit.name",
|
|
120
|
+
media: "image",
|
|
121
|
+
fallback: "Untitled photo"
|
|
122
|
+
},
|
|
123
|
+
fields: [
|
|
124
|
+
{
|
|
125
|
+
name: "image",
|
|
126
|
+
title: "Image",
|
|
127
|
+
type: "image",
|
|
128
|
+
validation: { required: true },
|
|
129
|
+
description: "At least 1600px on the long side."
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
name: "caption",
|
|
133
|
+
title: "Caption",
|
|
134
|
+
type: "text",
|
|
135
|
+
rows: 2,
|
|
136
|
+
validation: { max: 200 },
|
|
137
|
+
localized: true,
|
|
138
|
+
description: "Shown on hover and in the lightbox."
|
|
139
|
+
},
|
|
140
|
+
credit,
|
|
141
|
+
{
|
|
142
|
+
name: "link",
|
|
143
|
+
title: "Link",
|
|
144
|
+
type: "link",
|
|
145
|
+
description: "Opens this instead of the lightbox."
|
|
146
|
+
}
|
|
147
|
+
]
|
|
148
|
+
}]
|
|
149
|
+
},
|
|
150
|
+
{
|
|
151
|
+
name: "useLightbox",
|
|
152
|
+
title: "Open in a lightbox",
|
|
153
|
+
type: "boolean",
|
|
154
|
+
group: "design",
|
|
155
|
+
initialValue: true
|
|
156
|
+
},
|
|
157
|
+
{
|
|
158
|
+
name: "captionDisplay",
|
|
159
|
+
title: "Captions",
|
|
160
|
+
type: "select",
|
|
161
|
+
group: "design",
|
|
162
|
+
layout: "segmented",
|
|
163
|
+
initialValue: "hover",
|
|
164
|
+
options: [
|
|
165
|
+
{
|
|
166
|
+
value: "below",
|
|
167
|
+
label: "Below"
|
|
168
|
+
},
|
|
169
|
+
{
|
|
170
|
+
value: "hover",
|
|
171
|
+
label: "On hover"
|
|
172
|
+
},
|
|
173
|
+
{
|
|
174
|
+
value: "lightbox",
|
|
175
|
+
label: "Lightbox only"
|
|
176
|
+
}
|
|
177
|
+
]
|
|
178
|
+
},
|
|
179
|
+
{
|
|
180
|
+
name: "desktopColumns",
|
|
181
|
+
title: "Columns on desktop",
|
|
182
|
+
type: "number",
|
|
183
|
+
group: "design",
|
|
184
|
+
layout: "slider",
|
|
185
|
+
initialValue: 3,
|
|
186
|
+
numeric: {
|
|
187
|
+
min: 2,
|
|
188
|
+
max: 5,
|
|
189
|
+
step: 1
|
|
190
|
+
}
|
|
191
|
+
},
|
|
192
|
+
{
|
|
193
|
+
name: "tabletColumns",
|
|
194
|
+
title: "Columns on tablet",
|
|
195
|
+
type: "number",
|
|
196
|
+
group: "design",
|
|
197
|
+
layout: "slider",
|
|
198
|
+
initialValue: 2,
|
|
199
|
+
numeric: {
|
|
200
|
+
min: 1,
|
|
201
|
+
max: 3,
|
|
202
|
+
step: 1
|
|
203
|
+
}
|
|
204
|
+
},
|
|
205
|
+
{
|
|
206
|
+
name: "phoneColumns",
|
|
207
|
+
title: "Columns on phones",
|
|
208
|
+
type: "number",
|
|
209
|
+
group: "design",
|
|
210
|
+
layout: "slider",
|
|
211
|
+
initialValue: 1,
|
|
212
|
+
numeric: {
|
|
213
|
+
min: 1,
|
|
214
|
+
max: 2,
|
|
215
|
+
step: 1
|
|
216
|
+
}
|
|
217
|
+
},
|
|
218
|
+
{
|
|
219
|
+
name: "gap",
|
|
220
|
+
title: "Gap",
|
|
221
|
+
type: "select",
|
|
222
|
+
group: "design",
|
|
223
|
+
layout: "segmented",
|
|
224
|
+
initialValue: "md",
|
|
225
|
+
options: [
|
|
226
|
+
{
|
|
227
|
+
value: "none",
|
|
228
|
+
label: "None"
|
|
229
|
+
},
|
|
230
|
+
{
|
|
231
|
+
value: "sm",
|
|
232
|
+
label: "S"
|
|
233
|
+
},
|
|
234
|
+
{
|
|
235
|
+
value: "md",
|
|
236
|
+
label: "M"
|
|
237
|
+
},
|
|
238
|
+
{
|
|
239
|
+
value: "lg",
|
|
240
|
+
label: "L"
|
|
241
|
+
}
|
|
242
|
+
]
|
|
243
|
+
},
|
|
244
|
+
theme
|
|
245
|
+
]
|
|
246
|
+
};
|
|
247
|
+
var filterGallery = {
|
|
248
|
+
name: "filterGallery",
|
|
249
|
+
title: "Gallery with filters",
|
|
250
|
+
kind: "block",
|
|
251
|
+
icon: "photo-search",
|
|
252
|
+
category: "Media & galleries",
|
|
253
|
+
description: "A uniform grid filtered by category chips; every photo opens in a lightbox",
|
|
254
|
+
variants: [{
|
|
255
|
+
id: "square",
|
|
256
|
+
name: "Square tiles"
|
|
257
|
+
}, {
|
|
258
|
+
id: "landscape",
|
|
259
|
+
name: "Landscape tiles",
|
|
260
|
+
description: "4:3"
|
|
261
|
+
}],
|
|
262
|
+
preview: {
|
|
263
|
+
title: "heading",
|
|
264
|
+
media: "images.0.image",
|
|
265
|
+
icon: "photo-search"
|
|
266
|
+
},
|
|
267
|
+
groups: GROUPS,
|
|
268
|
+
fields: [
|
|
269
|
+
{
|
|
270
|
+
name: "heading",
|
|
271
|
+
title: "Heading",
|
|
272
|
+
type: "string",
|
|
273
|
+
validation: { recommendedMax: 60 },
|
|
274
|
+
localized: true
|
|
275
|
+
},
|
|
276
|
+
{
|
|
277
|
+
name: "categories",
|
|
278
|
+
title: "Filters",
|
|
279
|
+
type: "array",
|
|
280
|
+
itemNoun: "filter",
|
|
281
|
+
validation: {
|
|
282
|
+
min: 2,
|
|
283
|
+
max: 8
|
|
284
|
+
},
|
|
285
|
+
of: [{
|
|
286
|
+
name: "category",
|
|
287
|
+
title: "Filter",
|
|
288
|
+
type: "object",
|
|
289
|
+
icon: "filter",
|
|
290
|
+
openMode: "inline",
|
|
291
|
+
preview: {
|
|
292
|
+
title: "label",
|
|
293
|
+
subtitle: "key"
|
|
294
|
+
},
|
|
295
|
+
fields: [{
|
|
296
|
+
name: "label",
|
|
297
|
+
title: "Label",
|
|
298
|
+
type: "string",
|
|
299
|
+
validation: {
|
|
300
|
+
required: true,
|
|
301
|
+
max: 20
|
|
302
|
+
},
|
|
303
|
+
localized: true
|
|
304
|
+
}, {
|
|
305
|
+
name: "key",
|
|
306
|
+
title: "Key",
|
|
307
|
+
type: "slug",
|
|
308
|
+
validation: {
|
|
309
|
+
required: true,
|
|
310
|
+
unique: true
|
|
311
|
+
},
|
|
312
|
+
description: "Changing it unlinks the photos that use it."
|
|
313
|
+
}]
|
|
314
|
+
}]
|
|
315
|
+
},
|
|
316
|
+
{
|
|
317
|
+
name: "allLabel",
|
|
318
|
+
title: "\"All\" chip label",
|
|
319
|
+
type: "string",
|
|
320
|
+
initialValue: "All",
|
|
321
|
+
validation: { max: 16 },
|
|
322
|
+
localized: true,
|
|
323
|
+
description: "Leave empty to hide the All chip."
|
|
324
|
+
},
|
|
325
|
+
{
|
|
326
|
+
name: "images",
|
|
327
|
+
title: "Photos",
|
|
328
|
+
type: "array",
|
|
329
|
+
group: "media",
|
|
330
|
+
itemNoun: "photo",
|
|
331
|
+
arrayLayout: "grid",
|
|
332
|
+
validation: {
|
|
333
|
+
min: 4,
|
|
334
|
+
max: 120
|
|
335
|
+
},
|
|
336
|
+
of: [{
|
|
337
|
+
name: "photo",
|
|
338
|
+
title: "Photo",
|
|
339
|
+
type: "object",
|
|
340
|
+
icon: "photo",
|
|
341
|
+
preview: {
|
|
342
|
+
title: "caption",
|
|
343
|
+
subtitle: "categories",
|
|
344
|
+
media: "image",
|
|
345
|
+
fallback: "Untitled photo"
|
|
346
|
+
},
|
|
347
|
+
fields: [
|
|
348
|
+
{
|
|
349
|
+
name: "image",
|
|
350
|
+
title: "Image",
|
|
351
|
+
type: "image",
|
|
352
|
+
validation: { required: true }
|
|
353
|
+
},
|
|
354
|
+
{
|
|
355
|
+
name: "categories",
|
|
356
|
+
title: "Filters",
|
|
357
|
+
type: "tags",
|
|
358
|
+
validation: { min: 1 },
|
|
359
|
+
description: "Filter keys, e.g. rooms, dining."
|
|
360
|
+
},
|
|
361
|
+
{
|
|
362
|
+
name: "caption",
|
|
363
|
+
title: "Caption",
|
|
364
|
+
type: "text",
|
|
365
|
+
rows: 2,
|
|
366
|
+
validation: { max: 160 },
|
|
367
|
+
localized: true,
|
|
368
|
+
description: "Shown in the lightbox."
|
|
369
|
+
}
|
|
370
|
+
]
|
|
371
|
+
}]
|
|
372
|
+
},
|
|
373
|
+
{
|
|
374
|
+
name: "useUrlFilter",
|
|
375
|
+
title: "Remember filter in the URL",
|
|
376
|
+
type: "boolean",
|
|
377
|
+
group: "design",
|
|
378
|
+
advanced: true
|
|
379
|
+
},
|
|
380
|
+
{
|
|
381
|
+
name: "columns",
|
|
382
|
+
title: "Columns on desktop",
|
|
383
|
+
type: "number",
|
|
384
|
+
group: "design",
|
|
385
|
+
layout: "slider",
|
|
386
|
+
initialValue: 4,
|
|
387
|
+
numeric: {
|
|
388
|
+
min: 2,
|
|
389
|
+
max: 6,
|
|
390
|
+
step: 1
|
|
391
|
+
}
|
|
392
|
+
},
|
|
393
|
+
{
|
|
394
|
+
name: "initialCount",
|
|
395
|
+
title: "Show before \"Load more\"",
|
|
396
|
+
type: "number",
|
|
397
|
+
group: "design",
|
|
398
|
+
initialValue: 12,
|
|
399
|
+
numeric: {
|
|
400
|
+
min: 4,
|
|
401
|
+
max: 48,
|
|
402
|
+
step: 4
|
|
403
|
+
}
|
|
404
|
+
},
|
|
405
|
+
theme
|
|
406
|
+
]
|
|
407
|
+
};
|
|
408
|
+
var videoSection = {
|
|
409
|
+
name: "videoSection",
|
|
410
|
+
title: "Video",
|
|
411
|
+
kind: "block",
|
|
412
|
+
icon: "player-play",
|
|
413
|
+
category: "Media & galleries",
|
|
414
|
+
description: "A featured video from YouTube, Vimeo or your own host, with captions, chapters and a transcript",
|
|
415
|
+
variants: [
|
|
416
|
+
{
|
|
417
|
+
id: "contained",
|
|
418
|
+
name: "Contained",
|
|
419
|
+
description: "Inside the page width with a title above"
|
|
420
|
+
},
|
|
421
|
+
{
|
|
422
|
+
id: "fullbleed",
|
|
423
|
+
name: "Full width"
|
|
424
|
+
},
|
|
425
|
+
{
|
|
426
|
+
id: "split",
|
|
427
|
+
name: "Split",
|
|
428
|
+
description: "Video beside the text and chapter list"
|
|
429
|
+
}
|
|
430
|
+
],
|
|
431
|
+
preview: {
|
|
432
|
+
title: "title",
|
|
433
|
+
media: "poster",
|
|
434
|
+
icon: "player-play"
|
|
435
|
+
},
|
|
436
|
+
groups: [
|
|
437
|
+
{
|
|
438
|
+
name: "content",
|
|
439
|
+
title: "Content",
|
|
440
|
+
default: true
|
|
441
|
+
},
|
|
442
|
+
{
|
|
443
|
+
name: "access",
|
|
444
|
+
title: "Captions & chapters"
|
|
445
|
+
},
|
|
446
|
+
{
|
|
447
|
+
name: "design",
|
|
448
|
+
title: "Playback"
|
|
449
|
+
}
|
|
450
|
+
],
|
|
451
|
+
fields: [
|
|
452
|
+
{
|
|
453
|
+
name: "eyebrow",
|
|
454
|
+
title: "Eyebrow",
|
|
455
|
+
type: "string",
|
|
456
|
+
validation: { max: 32 }
|
|
457
|
+
},
|
|
458
|
+
{
|
|
459
|
+
name: "title",
|
|
460
|
+
title: "Title",
|
|
461
|
+
type: "string",
|
|
462
|
+
validation: {
|
|
463
|
+
required: true,
|
|
464
|
+
recommendedMax: 70
|
|
465
|
+
},
|
|
466
|
+
localized: true,
|
|
467
|
+
description: "Also the video's name for search engines."
|
|
468
|
+
},
|
|
469
|
+
{
|
|
470
|
+
name: "description",
|
|
471
|
+
title: "Description",
|
|
472
|
+
type: "text",
|
|
473
|
+
rows: 3,
|
|
474
|
+
validation: { recommendedMax: 300 },
|
|
475
|
+
localized: true,
|
|
476
|
+
description: "Also sent to search engines."
|
|
477
|
+
},
|
|
478
|
+
{
|
|
479
|
+
name: "source",
|
|
480
|
+
title: "Hosted on",
|
|
481
|
+
type: "select",
|
|
482
|
+
layout: "segmented",
|
|
483
|
+
initialValue: "youtube",
|
|
484
|
+
options: [
|
|
485
|
+
{
|
|
486
|
+
value: "youtube",
|
|
487
|
+
label: "YouTube"
|
|
488
|
+
},
|
|
489
|
+
{
|
|
490
|
+
value: "vimeo",
|
|
491
|
+
label: "Vimeo"
|
|
492
|
+
},
|
|
493
|
+
{
|
|
494
|
+
value: "hosted",
|
|
495
|
+
label: "Our media library"
|
|
496
|
+
}
|
|
497
|
+
]
|
|
498
|
+
},
|
|
499
|
+
{
|
|
500
|
+
name: "video",
|
|
501
|
+
title: "Video link",
|
|
502
|
+
type: "video",
|
|
503
|
+
hidden: {
|
|
504
|
+
field: "source",
|
|
505
|
+
equals: ["youtube", "vimeo"]
|
|
506
|
+
},
|
|
507
|
+
validation: { required: true },
|
|
508
|
+
description: "Paste the watch link."
|
|
509
|
+
},
|
|
510
|
+
{
|
|
511
|
+
name: "file",
|
|
512
|
+
title: "Video file",
|
|
513
|
+
type: "file",
|
|
514
|
+
hidden: {
|
|
515
|
+
field: "source",
|
|
516
|
+
equals: "hosted"
|
|
517
|
+
},
|
|
518
|
+
validation: { required: true },
|
|
519
|
+
description: "MP4 (H.264) up to 500 MB."
|
|
520
|
+
},
|
|
521
|
+
{
|
|
522
|
+
name: "poster",
|
|
523
|
+
title: "Poster",
|
|
524
|
+
type: "image",
|
|
525
|
+
validation: { required: true },
|
|
526
|
+
description: "At 16:9."
|
|
527
|
+
},
|
|
528
|
+
{
|
|
529
|
+
name: "duration",
|
|
530
|
+
title: "Length",
|
|
531
|
+
type: "string",
|
|
532
|
+
placeholder: "4:32",
|
|
533
|
+
validation: {
|
|
534
|
+
required: true,
|
|
535
|
+
pattern: "^(\\d{1,2}:)?\\d{1,2}:\\d{2}$",
|
|
536
|
+
patternMessage: "Use m:ss or h:mm:ss, like 4:05."
|
|
537
|
+
},
|
|
538
|
+
description: "Also sent to search engines."
|
|
539
|
+
},
|
|
540
|
+
{
|
|
541
|
+
name: "uploadDate",
|
|
542
|
+
title: "Published",
|
|
543
|
+
type: "date",
|
|
544
|
+
validation: { required: true },
|
|
545
|
+
description: "The date the video first went public."
|
|
546
|
+
},
|
|
547
|
+
{
|
|
548
|
+
name: "captions",
|
|
549
|
+
title: "Caption tracks",
|
|
550
|
+
type: "array",
|
|
551
|
+
group: "access",
|
|
552
|
+
itemNoun: "caption track",
|
|
553
|
+
hidden: {
|
|
554
|
+
field: "source",
|
|
555
|
+
equals: "hosted"
|
|
556
|
+
},
|
|
557
|
+
validation: {
|
|
558
|
+
min: 1,
|
|
559
|
+
max: 12
|
|
560
|
+
},
|
|
561
|
+
description: "One WebVTT file per language.",
|
|
562
|
+
of: [{
|
|
563
|
+
name: "track",
|
|
564
|
+
title: "Caption track",
|
|
565
|
+
type: "object",
|
|
566
|
+
icon: "badge-cc",
|
|
567
|
+
preview: {
|
|
568
|
+
title: "label",
|
|
569
|
+
subtitle: "language"
|
|
570
|
+
},
|
|
571
|
+
fields: [
|
|
572
|
+
{
|
|
573
|
+
name: "language",
|
|
574
|
+
title: "Language",
|
|
575
|
+
type: "string",
|
|
576
|
+
validation: {
|
|
577
|
+
required: true,
|
|
578
|
+
pattern: "^[a-z]{2}(-[A-Z]{2})?$",
|
|
579
|
+
patternMessage: "Use a language code, like en or es-MX."
|
|
580
|
+
},
|
|
581
|
+
placeholder: "en"
|
|
582
|
+
},
|
|
583
|
+
{
|
|
584
|
+
name: "label",
|
|
585
|
+
title: "Label",
|
|
586
|
+
type: "string",
|
|
587
|
+
validation: {
|
|
588
|
+
required: true,
|
|
589
|
+
max: 24
|
|
590
|
+
},
|
|
591
|
+
placeholder: "English",
|
|
592
|
+
description: "Shown in the captions menu."
|
|
593
|
+
},
|
|
594
|
+
{
|
|
595
|
+
name: "file",
|
|
596
|
+
title: "WebVTT file",
|
|
597
|
+
type: "file",
|
|
598
|
+
validation: { required: true }
|
|
599
|
+
},
|
|
600
|
+
{
|
|
601
|
+
name: "kind",
|
|
602
|
+
title: "Kind",
|
|
603
|
+
type: "select",
|
|
604
|
+
layout: "segmented",
|
|
605
|
+
initialValue: "captions",
|
|
606
|
+
options: [{
|
|
607
|
+
value: "captions",
|
|
608
|
+
label: "Captions",
|
|
609
|
+
description: "Speech plus sounds"
|
|
610
|
+
}, {
|
|
611
|
+
value: "subtitles",
|
|
612
|
+
label: "Subtitles",
|
|
613
|
+
description: "Translated speech only"
|
|
614
|
+
}]
|
|
615
|
+
},
|
|
616
|
+
{
|
|
617
|
+
name: "isOnByDefault",
|
|
618
|
+
title: "On by default",
|
|
619
|
+
type: "boolean",
|
|
620
|
+
description: "One track at most."
|
|
621
|
+
}
|
|
622
|
+
]
|
|
623
|
+
}]
|
|
624
|
+
},
|
|
625
|
+
{
|
|
626
|
+
name: "chapters",
|
|
627
|
+
title: "Chapters",
|
|
628
|
+
type: "array",
|
|
629
|
+
group: "access",
|
|
630
|
+
itemNoun: "chapter",
|
|
631
|
+
validation: { max: 30 },
|
|
632
|
+
description: "The first one must start at 0:00.",
|
|
633
|
+
of: [{
|
|
634
|
+
name: "chapter",
|
|
635
|
+
title: "Chapter",
|
|
636
|
+
type: "object",
|
|
637
|
+
icon: "list",
|
|
638
|
+
openMode: "inline",
|
|
639
|
+
preview: {
|
|
640
|
+
title: "title",
|
|
641
|
+
subtitle: "start"
|
|
642
|
+
},
|
|
643
|
+
fields: [{
|
|
644
|
+
name: "start",
|
|
645
|
+
title: "Starts at",
|
|
646
|
+
type: "string",
|
|
647
|
+
placeholder: "1:05",
|
|
648
|
+
validation: {
|
|
649
|
+
required: true,
|
|
650
|
+
pattern: "^(\\d{1,2}:)?\\d{1,2}:\\d{2}$",
|
|
651
|
+
patternMessage: "Use m:ss or h:mm:ss, like 4:05."
|
|
652
|
+
}
|
|
653
|
+
}, {
|
|
654
|
+
name: "title",
|
|
655
|
+
title: "Title",
|
|
656
|
+
type: "string",
|
|
657
|
+
validation: {
|
|
658
|
+
required: true,
|
|
659
|
+
max: 60
|
|
660
|
+
},
|
|
661
|
+
localized: true
|
|
662
|
+
}]
|
|
663
|
+
}]
|
|
664
|
+
},
|
|
665
|
+
{
|
|
666
|
+
name: "transcript",
|
|
667
|
+
title: "Transcript",
|
|
668
|
+
type: "richtext",
|
|
669
|
+
group: "access",
|
|
670
|
+
localized: true
|
|
671
|
+
},
|
|
672
|
+
{
|
|
673
|
+
name: "button",
|
|
674
|
+
title: "Button",
|
|
675
|
+
type: "button"
|
|
676
|
+
},
|
|
677
|
+
{
|
|
678
|
+
name: "autoplay",
|
|
679
|
+
title: "Play automatically",
|
|
680
|
+
type: "boolean",
|
|
681
|
+
group: "design"
|
|
682
|
+
},
|
|
683
|
+
{
|
|
684
|
+
name: "loop",
|
|
685
|
+
title: "Loop the video",
|
|
686
|
+
type: "boolean",
|
|
687
|
+
group: "design",
|
|
688
|
+
hidden: {
|
|
689
|
+
field: "autoplay",
|
|
690
|
+
equals: true
|
|
691
|
+
}
|
|
692
|
+
},
|
|
693
|
+
{
|
|
694
|
+
name: "controls",
|
|
695
|
+
title: "Show player controls",
|
|
696
|
+
type: "boolean",
|
|
697
|
+
group: "design",
|
|
698
|
+
initialValue: true
|
|
699
|
+
},
|
|
700
|
+
{
|
|
701
|
+
name: "startAt",
|
|
702
|
+
title: "Start at",
|
|
703
|
+
type: "string",
|
|
704
|
+
group: "design",
|
|
705
|
+
advanced: true,
|
|
706
|
+
placeholder: "0:30",
|
|
707
|
+
validation: {
|
|
708
|
+
pattern: "^((\\d{1,2}:)?\\d{1,2}:\\d{2})?$",
|
|
709
|
+
patternMessage: "Use m:ss, like 1:24."
|
|
710
|
+
}
|
|
711
|
+
},
|
|
712
|
+
{
|
|
713
|
+
name: "usePrivacyMode",
|
|
714
|
+
title: "Privacy-enhanced embed",
|
|
715
|
+
type: "boolean",
|
|
716
|
+
group: "design",
|
|
717
|
+
initialValue: true,
|
|
718
|
+
hidden: {
|
|
719
|
+
field: "source",
|
|
720
|
+
equals: "youtube"
|
|
721
|
+
},
|
|
722
|
+
description: "No tracking cookies until play."
|
|
723
|
+
},
|
|
724
|
+
theme
|
|
725
|
+
]
|
|
726
|
+
};
|
|
727
|
+
var beforeAfter = {
|
|
728
|
+
name: "beforeAfter",
|
|
729
|
+
title: "Before and after",
|
|
730
|
+
kind: "block",
|
|
731
|
+
icon: "arrows-horizontal",
|
|
732
|
+
category: "Media & galleries",
|
|
733
|
+
description: "A draggable divider comparing two photos of the same view",
|
|
734
|
+
variants: [{
|
|
735
|
+
id: "single",
|
|
736
|
+
name: "Single comparison"
|
|
737
|
+
}, {
|
|
738
|
+
id: "tabs",
|
|
739
|
+
name: "Several comparisons",
|
|
740
|
+
description: "Tabs switch between projects"
|
|
741
|
+
}],
|
|
742
|
+
preview: {
|
|
743
|
+
title: "heading",
|
|
744
|
+
media: "comparisons.0.after",
|
|
745
|
+
icon: "arrows-horizontal"
|
|
746
|
+
},
|
|
747
|
+
groups: GROUPS,
|
|
748
|
+
fields: [
|
|
749
|
+
{
|
|
750
|
+
name: "eyebrow",
|
|
751
|
+
title: "Eyebrow",
|
|
752
|
+
type: "string",
|
|
753
|
+
validation: { max: 32 }
|
|
754
|
+
},
|
|
755
|
+
{
|
|
756
|
+
name: "heading",
|
|
757
|
+
title: "Heading",
|
|
758
|
+
type: "string",
|
|
759
|
+
validation: { recommendedMax: 60 },
|
|
760
|
+
localized: true
|
|
761
|
+
},
|
|
762
|
+
{
|
|
763
|
+
name: "comparisons",
|
|
764
|
+
title: "Comparisons",
|
|
765
|
+
type: "array",
|
|
766
|
+
group: "media",
|
|
767
|
+
itemNoun: "comparison",
|
|
768
|
+
validation: {
|
|
769
|
+
min: 1,
|
|
770
|
+
max: 6
|
|
771
|
+
},
|
|
772
|
+
description: "Add more than one to show tabs.",
|
|
773
|
+
of: [{
|
|
774
|
+
name: "comparison",
|
|
775
|
+
title: "Comparison",
|
|
776
|
+
type: "object",
|
|
777
|
+
icon: "arrows-horizontal",
|
|
778
|
+
preview: {
|
|
779
|
+
title: "label",
|
|
780
|
+
subtitle: "caption",
|
|
781
|
+
media: "after",
|
|
782
|
+
fallback: "Untitled comparison"
|
|
783
|
+
},
|
|
784
|
+
fields: [
|
|
785
|
+
{
|
|
786
|
+
name: "label",
|
|
787
|
+
title: "Tab label",
|
|
788
|
+
type: "string",
|
|
789
|
+
validation: { max: 24 },
|
|
790
|
+
localized: true,
|
|
791
|
+
description: "Only shown when there are several."
|
|
792
|
+
},
|
|
793
|
+
{
|
|
794
|
+
name: "before",
|
|
795
|
+
title: "Before",
|
|
796
|
+
type: "image",
|
|
797
|
+
validation: { required: true },
|
|
798
|
+
description: "Same position, size and crop as After."
|
|
799
|
+
},
|
|
800
|
+
{
|
|
801
|
+
name: "after",
|
|
802
|
+
title: "After",
|
|
803
|
+
type: "image",
|
|
804
|
+
validation: { required: true }
|
|
805
|
+
},
|
|
806
|
+
{
|
|
807
|
+
name: "beforeLabel",
|
|
808
|
+
title: "Before label",
|
|
809
|
+
type: "string",
|
|
810
|
+
initialValue: "Before",
|
|
811
|
+
validation: { max: 16 },
|
|
812
|
+
localized: true
|
|
813
|
+
},
|
|
814
|
+
{
|
|
815
|
+
name: "afterLabel",
|
|
816
|
+
title: "After label",
|
|
817
|
+
type: "string",
|
|
818
|
+
initialValue: "After",
|
|
819
|
+
validation: { max: 16 },
|
|
820
|
+
localized: true
|
|
821
|
+
},
|
|
822
|
+
{
|
|
823
|
+
name: "caption",
|
|
824
|
+
title: "Caption",
|
|
825
|
+
type: "text",
|
|
826
|
+
rows: 2,
|
|
827
|
+
validation: { max: 200 },
|
|
828
|
+
localized: true
|
|
829
|
+
},
|
|
830
|
+
credit
|
|
831
|
+
]
|
|
832
|
+
}]
|
|
833
|
+
},
|
|
834
|
+
{
|
|
835
|
+
name: "start",
|
|
836
|
+
title: "Divider starts at",
|
|
837
|
+
type: "number",
|
|
838
|
+
group: "design",
|
|
839
|
+
layout: "slider",
|
|
840
|
+
initialValue: 50,
|
|
841
|
+
numeric: {
|
|
842
|
+
min: 10,
|
|
843
|
+
max: 90,
|
|
844
|
+
step: 5,
|
|
845
|
+
unit: "%"
|
|
846
|
+
}
|
|
847
|
+
},
|
|
848
|
+
{
|
|
849
|
+
name: "orientation",
|
|
850
|
+
title: "Direction",
|
|
851
|
+
type: "select",
|
|
852
|
+
group: "design",
|
|
853
|
+
layout: "segmented",
|
|
854
|
+
initialValue: "horizontal",
|
|
855
|
+
options: [{
|
|
856
|
+
value: "horizontal",
|
|
857
|
+
label: "Side by side"
|
|
858
|
+
}, {
|
|
859
|
+
value: "vertical",
|
|
860
|
+
label: "Top and bottom"
|
|
861
|
+
}]
|
|
862
|
+
},
|
|
863
|
+
{
|
|
864
|
+
name: "showHint",
|
|
865
|
+
title: "Nudge on first view",
|
|
866
|
+
type: "boolean",
|
|
867
|
+
group: "design",
|
|
868
|
+
initialValue: true
|
|
869
|
+
},
|
|
870
|
+
theme
|
|
871
|
+
]
|
|
872
|
+
};
|
|
873
|
+
var hotspots = {
|
|
874
|
+
name: "imageHotspots",
|
|
875
|
+
title: "Image with hotspots",
|
|
876
|
+
kind: "block",
|
|
877
|
+
icon: "focus-2",
|
|
878
|
+
category: "Media & galleries",
|
|
879
|
+
description: "Pins on a photo that open a product card or a note: shop the look, label the parts",
|
|
880
|
+
variants: [{
|
|
881
|
+
id: "pins",
|
|
882
|
+
name: "Pins",
|
|
883
|
+
description: "Numbered dots with pop-up cards"
|
|
884
|
+
}, {
|
|
885
|
+
id: "sidebar",
|
|
886
|
+
name: "Pins + list",
|
|
887
|
+
description: "A list beside the photo highlights each pin"
|
|
888
|
+
}],
|
|
889
|
+
preview: {
|
|
890
|
+
title: "heading",
|
|
891
|
+
media: "image",
|
|
892
|
+
icon: "focus-2"
|
|
893
|
+
},
|
|
894
|
+
groups: GROUPS,
|
|
895
|
+
fields: [
|
|
896
|
+
{
|
|
897
|
+
name: "eyebrow",
|
|
898
|
+
title: "Eyebrow",
|
|
899
|
+
type: "string",
|
|
900
|
+
validation: { max: 32 }
|
|
901
|
+
},
|
|
902
|
+
{
|
|
903
|
+
name: "heading",
|
|
904
|
+
title: "Heading",
|
|
905
|
+
type: "string",
|
|
906
|
+
validation: { recommendedMax: 60 },
|
|
907
|
+
localized: true
|
|
908
|
+
},
|
|
909
|
+
{
|
|
910
|
+
name: "image",
|
|
911
|
+
title: "Image",
|
|
912
|
+
type: "image",
|
|
913
|
+
group: "media",
|
|
914
|
+
validation: { required: true },
|
|
915
|
+
description: "Pins are placed in % of this photo. Changing the crop moves them."
|
|
916
|
+
},
|
|
917
|
+
{
|
|
918
|
+
name: "mobileImage",
|
|
919
|
+
title: "Phone photo",
|
|
920
|
+
type: "image",
|
|
921
|
+
group: "media",
|
|
922
|
+
advanced: true,
|
|
923
|
+
description: "Pins show as a list on this crop."
|
|
924
|
+
},
|
|
925
|
+
{
|
|
926
|
+
name: "hotspots",
|
|
927
|
+
title: "Hotspots",
|
|
928
|
+
type: "array",
|
|
929
|
+
itemNoun: "hotspot",
|
|
930
|
+
validation: {
|
|
931
|
+
min: 1,
|
|
932
|
+
max: 12
|
|
933
|
+
},
|
|
934
|
+
of: [{
|
|
935
|
+
name: "hotspot",
|
|
936
|
+
title: "Hotspot",
|
|
937
|
+
type: "object",
|
|
938
|
+
icon: "point",
|
|
939
|
+
preview: {
|
|
940
|
+
title: "label",
|
|
941
|
+
subtitle: "kind",
|
|
942
|
+
fallback: "Untitled hotspot"
|
|
943
|
+
},
|
|
944
|
+
fields: [
|
|
945
|
+
{
|
|
946
|
+
name: "label",
|
|
947
|
+
title: "Label",
|
|
948
|
+
type: "string",
|
|
949
|
+
validation: {
|
|
950
|
+
required: true,
|
|
951
|
+
max: 48
|
|
952
|
+
},
|
|
953
|
+
localized: true,
|
|
954
|
+
description: "Not shown. Read by screen readers."
|
|
955
|
+
},
|
|
956
|
+
{
|
|
957
|
+
name: "x",
|
|
958
|
+
title: "Across",
|
|
959
|
+
type: "number",
|
|
960
|
+
layout: "slider",
|
|
961
|
+
validation: { required: true },
|
|
962
|
+
numeric: {
|
|
963
|
+
min: 0,
|
|
964
|
+
max: 100,
|
|
965
|
+
step: .5,
|
|
966
|
+
unit: "%"
|
|
967
|
+
},
|
|
968
|
+
description: "0 is the left edge, 100 the right."
|
|
969
|
+
},
|
|
970
|
+
{
|
|
971
|
+
name: "y",
|
|
972
|
+
title: "Down",
|
|
973
|
+
type: "number",
|
|
974
|
+
layout: "slider",
|
|
975
|
+
validation: { required: true },
|
|
976
|
+
numeric: {
|
|
977
|
+
min: 0,
|
|
978
|
+
max: 100,
|
|
979
|
+
step: .5,
|
|
980
|
+
unit: "%"
|
|
981
|
+
},
|
|
982
|
+
description: "0 is the top edge, 100 the bottom."
|
|
983
|
+
},
|
|
984
|
+
{
|
|
985
|
+
name: "kind",
|
|
986
|
+
title: "Opens",
|
|
987
|
+
type: "select",
|
|
988
|
+
layout: "segmented",
|
|
989
|
+
initialValue: "product",
|
|
990
|
+
options: [{
|
|
991
|
+
value: "product",
|
|
992
|
+
label: "Product"
|
|
993
|
+
}, {
|
|
994
|
+
value: "note",
|
|
995
|
+
label: "Note"
|
|
996
|
+
}]
|
|
997
|
+
},
|
|
998
|
+
{
|
|
999
|
+
name: "product",
|
|
1000
|
+
title: "Product",
|
|
1001
|
+
type: "reference",
|
|
1002
|
+
reference: { to: ["shopify"] },
|
|
1003
|
+
hidden: {
|
|
1004
|
+
field: "kind",
|
|
1005
|
+
equals: "product"
|
|
1006
|
+
},
|
|
1007
|
+
validation: { required: true }
|
|
1008
|
+
},
|
|
1009
|
+
{
|
|
1010
|
+
name: "title",
|
|
1011
|
+
title: "Title",
|
|
1012
|
+
type: "string",
|
|
1013
|
+
hidden: {
|
|
1014
|
+
field: "kind",
|
|
1015
|
+
equals: "note"
|
|
1016
|
+
},
|
|
1017
|
+
validation: {
|
|
1018
|
+
required: true,
|
|
1019
|
+
max: 48
|
|
1020
|
+
},
|
|
1021
|
+
localized: true
|
|
1022
|
+
},
|
|
1023
|
+
{
|
|
1024
|
+
name: "body",
|
|
1025
|
+
title: "Body",
|
|
1026
|
+
type: "text",
|
|
1027
|
+
rows: 3,
|
|
1028
|
+
hidden: {
|
|
1029
|
+
field: "kind",
|
|
1030
|
+
equals: "note"
|
|
1031
|
+
},
|
|
1032
|
+
validation: { max: 240 },
|
|
1033
|
+
localized: true
|
|
1034
|
+
},
|
|
1035
|
+
{
|
|
1036
|
+
name: "link",
|
|
1037
|
+
title: "Link",
|
|
1038
|
+
type: "link",
|
|
1039
|
+
hidden: {
|
|
1040
|
+
field: "kind",
|
|
1041
|
+
equals: "note"
|
|
1042
|
+
}
|
|
1043
|
+
},
|
|
1044
|
+
{
|
|
1045
|
+
name: "cardSide",
|
|
1046
|
+
title: "Card opens",
|
|
1047
|
+
type: "select",
|
|
1048
|
+
layout: "segmented",
|
|
1049
|
+
initialValue: "auto",
|
|
1050
|
+
advanced: true,
|
|
1051
|
+
options: [
|
|
1052
|
+
{
|
|
1053
|
+
value: "auto",
|
|
1054
|
+
label: "Auto"
|
|
1055
|
+
},
|
|
1056
|
+
{
|
|
1057
|
+
value: "left",
|
|
1058
|
+
label: "Left"
|
|
1059
|
+
},
|
|
1060
|
+
{
|
|
1061
|
+
value: "right",
|
|
1062
|
+
label: "Right"
|
|
1063
|
+
},
|
|
1064
|
+
{
|
|
1065
|
+
value: "top",
|
|
1066
|
+
label: "Above"
|
|
1067
|
+
}
|
|
1068
|
+
]
|
|
1069
|
+
}
|
|
1070
|
+
]
|
|
1071
|
+
}]
|
|
1072
|
+
},
|
|
1073
|
+
{
|
|
1074
|
+
name: "pinStyle",
|
|
1075
|
+
title: "Pin style",
|
|
1076
|
+
type: "select",
|
|
1077
|
+
group: "design",
|
|
1078
|
+
layout: "segmented",
|
|
1079
|
+
initialValue: "number",
|
|
1080
|
+
options: [
|
|
1081
|
+
{
|
|
1082
|
+
value: "dot",
|
|
1083
|
+
label: "Dot"
|
|
1084
|
+
},
|
|
1085
|
+
{
|
|
1086
|
+
value: "plus",
|
|
1087
|
+
label: "Plus"
|
|
1088
|
+
},
|
|
1089
|
+
{
|
|
1090
|
+
value: "number",
|
|
1091
|
+
label: "Number"
|
|
1092
|
+
}
|
|
1093
|
+
]
|
|
1094
|
+
},
|
|
1095
|
+
{
|
|
1096
|
+
name: "usePulse",
|
|
1097
|
+
title: "Pulse pins",
|
|
1098
|
+
type: "boolean",
|
|
1099
|
+
group: "design",
|
|
1100
|
+
initialValue: true
|
|
1101
|
+
},
|
|
1102
|
+
theme
|
|
1103
|
+
]
|
|
1104
|
+
};
|
|
1105
|
+
var interactiveEmbed = {
|
|
1106
|
+
name: "interactiveEmbed",
|
|
1107
|
+
title: "Interactive embed",
|
|
1108
|
+
kind: "block",
|
|
1109
|
+
icon: "box",
|
|
1110
|
+
category: "Media & galleries",
|
|
1111
|
+
description: "A spinnable 3D model, a Lottie animation or a hosted 360°/Spline scene, with a still fallback",
|
|
1112
|
+
variants: [{
|
|
1113
|
+
id: "contained",
|
|
1114
|
+
name: "Contained"
|
|
1115
|
+
}, {
|
|
1116
|
+
id: "split",
|
|
1117
|
+
name: "Split",
|
|
1118
|
+
description: "Viewer beside heading and copy"
|
|
1119
|
+
}],
|
|
1120
|
+
preview: {
|
|
1121
|
+
title: "heading",
|
|
1122
|
+
media: "fallback",
|
|
1123
|
+
icon: "box"
|
|
1124
|
+
},
|
|
1125
|
+
groups: GROUPS,
|
|
1126
|
+
fields: [
|
|
1127
|
+
{
|
|
1128
|
+
name: "eyebrow",
|
|
1129
|
+
title: "Eyebrow",
|
|
1130
|
+
type: "string",
|
|
1131
|
+
validation: { max: 32 }
|
|
1132
|
+
},
|
|
1133
|
+
{
|
|
1134
|
+
name: "heading",
|
|
1135
|
+
title: "Heading",
|
|
1136
|
+
type: "string",
|
|
1137
|
+
validation: { recommendedMax: 60 },
|
|
1138
|
+
localized: true
|
|
1139
|
+
},
|
|
1140
|
+
{
|
|
1141
|
+
name: "body",
|
|
1142
|
+
title: "Body",
|
|
1143
|
+
type: "richtext",
|
|
1144
|
+
localized: true
|
|
1145
|
+
},
|
|
1146
|
+
{
|
|
1147
|
+
name: "kind",
|
|
1148
|
+
title: "Type",
|
|
1149
|
+
type: "select",
|
|
1150
|
+
layout: "cards",
|
|
1151
|
+
group: "media",
|
|
1152
|
+
initialValue: "model",
|
|
1153
|
+
options: [
|
|
1154
|
+
{
|
|
1155
|
+
value: "model",
|
|
1156
|
+
label: "3D model",
|
|
1157
|
+
icon: "box",
|
|
1158
|
+
description: "A .glb file people can spin and view in AR"
|
|
1159
|
+
},
|
|
1160
|
+
{
|
|
1161
|
+
value: "lottie",
|
|
1162
|
+
label: "Lottie animation",
|
|
1163
|
+
icon: "sparkles",
|
|
1164
|
+
description: "A .json or .lottie file"
|
|
1165
|
+
},
|
|
1166
|
+
{
|
|
1167
|
+
value: "iframe",
|
|
1168
|
+
label: "Hosted scene",
|
|
1169
|
+
icon: "world",
|
|
1170
|
+
description: "Spline, Sketchfab, Matterport or a 360° tour"
|
|
1171
|
+
}
|
|
1172
|
+
]
|
|
1173
|
+
},
|
|
1174
|
+
{
|
|
1175
|
+
name: "model",
|
|
1176
|
+
title: "Model file",
|
|
1177
|
+
type: "file",
|
|
1178
|
+
group: "media",
|
|
1179
|
+
hidden: {
|
|
1180
|
+
field: "kind",
|
|
1181
|
+
equals: "model"
|
|
1182
|
+
},
|
|
1183
|
+
validation: { required: true },
|
|
1184
|
+
description: "GLB under 8 MB."
|
|
1185
|
+
},
|
|
1186
|
+
{
|
|
1187
|
+
name: "iosModel",
|
|
1188
|
+
title: "iPhone AR file",
|
|
1189
|
+
type: "file",
|
|
1190
|
+
group: "media",
|
|
1191
|
+
hidden: {
|
|
1192
|
+
field: "kind",
|
|
1193
|
+
equals: "model"
|
|
1194
|
+
},
|
|
1195
|
+
description: "USDZ, so iPhones can place it in the room."
|
|
1196
|
+
},
|
|
1197
|
+
{
|
|
1198
|
+
name: "cameraOrbit",
|
|
1199
|
+
title: "Starting angle",
|
|
1200
|
+
type: "string",
|
|
1201
|
+
group: "media",
|
|
1202
|
+
hidden: {
|
|
1203
|
+
field: "kind",
|
|
1204
|
+
equals: "model"
|
|
1205
|
+
},
|
|
1206
|
+
placeholder: "30deg 75deg 2m",
|
|
1207
|
+
advanced: true,
|
|
1208
|
+
description: "Rotation, tilt and distance, e.g. 45deg 60deg 2m."
|
|
1209
|
+
},
|
|
1210
|
+
{
|
|
1211
|
+
name: "useAutoRotate",
|
|
1212
|
+
title: "Rotate slowly",
|
|
1213
|
+
type: "boolean",
|
|
1214
|
+
group: "design",
|
|
1215
|
+
hidden: {
|
|
1216
|
+
field: "kind",
|
|
1217
|
+
equals: "model"
|
|
1218
|
+
},
|
|
1219
|
+
initialValue: true
|
|
1220
|
+
},
|
|
1221
|
+
{
|
|
1222
|
+
name: "lottie",
|
|
1223
|
+
title: "Animation file",
|
|
1224
|
+
type: "file",
|
|
1225
|
+
group: "media",
|
|
1226
|
+
hidden: {
|
|
1227
|
+
field: "kind",
|
|
1228
|
+
equals: "lottie"
|
|
1229
|
+
},
|
|
1230
|
+
validation: { required: true },
|
|
1231
|
+
description: "Lottie .json or .lottie, under 500 KB."
|
|
1232
|
+
},
|
|
1233
|
+
{
|
|
1234
|
+
name: "loop",
|
|
1235
|
+
title: "Loop the animation",
|
|
1236
|
+
type: "boolean",
|
|
1237
|
+
group: "design",
|
|
1238
|
+
hidden: {
|
|
1239
|
+
field: "kind",
|
|
1240
|
+
equals: "lottie"
|
|
1241
|
+
},
|
|
1242
|
+
initialValue: true
|
|
1243
|
+
},
|
|
1244
|
+
{
|
|
1245
|
+
name: "playOn",
|
|
1246
|
+
title: "Play",
|
|
1247
|
+
type: "select",
|
|
1248
|
+
group: "design",
|
|
1249
|
+
hidden: {
|
|
1250
|
+
field: "kind",
|
|
1251
|
+
equals: "lottie"
|
|
1252
|
+
},
|
|
1253
|
+
layout: "segmented",
|
|
1254
|
+
initialValue: "view",
|
|
1255
|
+
options: [
|
|
1256
|
+
{
|
|
1257
|
+
value: "view",
|
|
1258
|
+
label: "In view"
|
|
1259
|
+
},
|
|
1260
|
+
{
|
|
1261
|
+
value: "hover",
|
|
1262
|
+
label: "On hover"
|
|
1263
|
+
},
|
|
1264
|
+
{
|
|
1265
|
+
value: "scroll",
|
|
1266
|
+
label: "With scroll"
|
|
1267
|
+
}
|
|
1268
|
+
]
|
|
1269
|
+
},
|
|
1270
|
+
{
|
|
1271
|
+
name: "embedUrl",
|
|
1272
|
+
title: "Scene link",
|
|
1273
|
+
type: "url",
|
|
1274
|
+
group: "media",
|
|
1275
|
+
hidden: {
|
|
1276
|
+
field: "kind",
|
|
1277
|
+
equals: "iframe"
|
|
1278
|
+
},
|
|
1279
|
+
validation: {
|
|
1280
|
+
required: true,
|
|
1281
|
+
pattern: "^https://(my\\.spline\\.design|prod\\.spline\\.design|sketchfab\\.com|my\\.matterport\\.com|kuula\\.co)/",
|
|
1282
|
+
patternMessage: "Use a Spline, Sketchfab, Matterport or Kuula link, like https://my.spline.design/caldera."
|
|
1283
|
+
},
|
|
1284
|
+
description: "The share or embed link from the host.",
|
|
1285
|
+
helpMore: "Only allow-listed hosts load. Ask a developer to add another."
|
|
1286
|
+
},
|
|
1287
|
+
{
|
|
1288
|
+
name: "fallback",
|
|
1289
|
+
title: "Still image",
|
|
1290
|
+
type: "image",
|
|
1291
|
+
group: "media",
|
|
1292
|
+
validation: { required: true }
|
|
1293
|
+
},
|
|
1294
|
+
{
|
|
1295
|
+
name: "label",
|
|
1296
|
+
title: "Accessible name",
|
|
1297
|
+
type: "string",
|
|
1298
|
+
validation: {
|
|
1299
|
+
required: true,
|
|
1300
|
+
max: 120
|
|
1301
|
+
},
|
|
1302
|
+
localized: true,
|
|
1303
|
+
description: "Not shown. Read by screen readers."
|
|
1304
|
+
},
|
|
1305
|
+
{
|
|
1306
|
+
name: "aspect",
|
|
1307
|
+
title: "Shape",
|
|
1308
|
+
type: "select",
|
|
1309
|
+
group: "design",
|
|
1310
|
+
layout: "segmented",
|
|
1311
|
+
initialValue: "4:3",
|
|
1312
|
+
options: [
|
|
1313
|
+
{
|
|
1314
|
+
value: "1:1",
|
|
1315
|
+
label: "Square"
|
|
1316
|
+
},
|
|
1317
|
+
{
|
|
1318
|
+
value: "4:3",
|
|
1319
|
+
label: "4:3"
|
|
1320
|
+
},
|
|
1321
|
+
{
|
|
1322
|
+
value: "16:9",
|
|
1323
|
+
label: "16:9"
|
|
1324
|
+
}
|
|
1325
|
+
]
|
|
1326
|
+
},
|
|
1327
|
+
{
|
|
1328
|
+
name: "loadOn",
|
|
1329
|
+
title: "Load",
|
|
1330
|
+
type: "select",
|
|
1331
|
+
group: "design",
|
|
1332
|
+
layout: "segmented",
|
|
1333
|
+
initialValue: "click",
|
|
1334
|
+
options: [{
|
|
1335
|
+
value: "view",
|
|
1336
|
+
label: "In view"
|
|
1337
|
+
}, {
|
|
1338
|
+
value: "click",
|
|
1339
|
+
label: "On click"
|
|
1340
|
+
}]
|
|
1341
|
+
},
|
|
1342
|
+
theme
|
|
1343
|
+
]
|
|
1344
|
+
};
|
|
1345
|
+
var carousel = {
|
|
1346
|
+
name: "mediaCarousel",
|
|
1347
|
+
title: "Mixed-media carousel",
|
|
1348
|
+
kind: "block",
|
|
1349
|
+
icon: "carousel-horizontal",
|
|
1350
|
+
category: "Media & galleries",
|
|
1351
|
+
description: "Slides of different kinds (photo, video, quote, product) in one swipeable row",
|
|
1352
|
+
variants: [
|
|
1353
|
+
{
|
|
1354
|
+
id: "peek",
|
|
1355
|
+
name: "Peek",
|
|
1356
|
+
description: "Shows a slice of the next slide"
|
|
1357
|
+
},
|
|
1358
|
+
{
|
|
1359
|
+
id: "full",
|
|
1360
|
+
name: "One at a time"
|
|
1361
|
+
},
|
|
1362
|
+
{
|
|
1363
|
+
id: "cards",
|
|
1364
|
+
name: "Cards",
|
|
1365
|
+
description: "Several slides visible"
|
|
1366
|
+
}
|
|
1367
|
+
],
|
|
1368
|
+
preview: {
|
|
1369
|
+
title: "heading",
|
|
1370
|
+
icon: "carousel-horizontal"
|
|
1371
|
+
},
|
|
1372
|
+
groups: GROUPS,
|
|
1373
|
+
fields: [
|
|
1374
|
+
{
|
|
1375
|
+
name: "eyebrow",
|
|
1376
|
+
title: "Eyebrow",
|
|
1377
|
+
type: "string",
|
|
1378
|
+
validation: { max: 32 }
|
|
1379
|
+
},
|
|
1380
|
+
{
|
|
1381
|
+
name: "heading",
|
|
1382
|
+
title: "Heading",
|
|
1383
|
+
type: "string",
|
|
1384
|
+
validation: { recommendedMax: 60 },
|
|
1385
|
+
localized: true
|
|
1386
|
+
},
|
|
1387
|
+
{
|
|
1388
|
+
name: "slides",
|
|
1389
|
+
title: "Slides",
|
|
1390
|
+
type: "array",
|
|
1391
|
+
itemNoun: "slide",
|
|
1392
|
+
validation: {
|
|
1393
|
+
min: 2,
|
|
1394
|
+
max: 16
|
|
1395
|
+
},
|
|
1396
|
+
of: [
|
|
1397
|
+
{
|
|
1398
|
+
name: "imageSlide",
|
|
1399
|
+
title: "Photo",
|
|
1400
|
+
type: "object",
|
|
1401
|
+
icon: "photo",
|
|
1402
|
+
preview: {
|
|
1403
|
+
title: "caption",
|
|
1404
|
+
media: "image",
|
|
1405
|
+
fallback: "Untitled photo slide"
|
|
1406
|
+
},
|
|
1407
|
+
fields: [
|
|
1408
|
+
{
|
|
1409
|
+
name: "image",
|
|
1410
|
+
title: "Image",
|
|
1411
|
+
type: "image",
|
|
1412
|
+
validation: { required: true }
|
|
1413
|
+
},
|
|
1414
|
+
{
|
|
1415
|
+
name: "caption",
|
|
1416
|
+
title: "Caption",
|
|
1417
|
+
type: "string",
|
|
1418
|
+
validation: { max: 120 },
|
|
1419
|
+
localized: true
|
|
1420
|
+
},
|
|
1421
|
+
{
|
|
1422
|
+
name: "link",
|
|
1423
|
+
title: "Link",
|
|
1424
|
+
type: "link"
|
|
1425
|
+
}
|
|
1426
|
+
]
|
|
1427
|
+
},
|
|
1428
|
+
{
|
|
1429
|
+
name: "videoSlide",
|
|
1430
|
+
title: "Video",
|
|
1431
|
+
type: "object",
|
|
1432
|
+
icon: "player-play",
|
|
1433
|
+
preview: {
|
|
1434
|
+
title: "caption",
|
|
1435
|
+
media: "poster",
|
|
1436
|
+
fallback: "Untitled video slide"
|
|
1437
|
+
},
|
|
1438
|
+
fields: [
|
|
1439
|
+
{
|
|
1440
|
+
name: "video",
|
|
1441
|
+
title: "Video",
|
|
1442
|
+
type: "video",
|
|
1443
|
+
validation: { required: true }
|
|
1444
|
+
},
|
|
1445
|
+
{
|
|
1446
|
+
name: "poster",
|
|
1447
|
+
title: "Poster",
|
|
1448
|
+
type: "image",
|
|
1449
|
+
validation: { required: true }
|
|
1450
|
+
},
|
|
1451
|
+
{
|
|
1452
|
+
name: "captions",
|
|
1453
|
+
title: "Captions",
|
|
1454
|
+
type: "file",
|
|
1455
|
+
description: "WebVTT. Required if the clip has speech."
|
|
1456
|
+
},
|
|
1457
|
+
{
|
|
1458
|
+
name: "caption",
|
|
1459
|
+
title: "Caption",
|
|
1460
|
+
type: "string",
|
|
1461
|
+
validation: { max: 120 },
|
|
1462
|
+
localized: true
|
|
1463
|
+
},
|
|
1464
|
+
{
|
|
1465
|
+
name: "muted",
|
|
1466
|
+
title: "Start muted",
|
|
1467
|
+
type: "boolean",
|
|
1468
|
+
initialValue: true
|
|
1469
|
+
}
|
|
1470
|
+
]
|
|
1471
|
+
},
|
|
1472
|
+
{
|
|
1473
|
+
name: "quoteSlide",
|
|
1474
|
+
title: "Quote",
|
|
1475
|
+
type: "object",
|
|
1476
|
+
icon: "quote",
|
|
1477
|
+
preview: {
|
|
1478
|
+
title: "author",
|
|
1479
|
+
subtitle: "quote",
|
|
1480
|
+
media: "photo",
|
|
1481
|
+
fallback: "Untitled quote slide"
|
|
1482
|
+
},
|
|
1483
|
+
fields: [
|
|
1484
|
+
{
|
|
1485
|
+
name: "quote",
|
|
1486
|
+
title: "Quote",
|
|
1487
|
+
type: "text",
|
|
1488
|
+
rows: 3,
|
|
1489
|
+
validation: {
|
|
1490
|
+
required: true,
|
|
1491
|
+
recommendedMax: 180
|
|
1492
|
+
},
|
|
1493
|
+
localized: true
|
|
1494
|
+
},
|
|
1495
|
+
{
|
|
1496
|
+
name: "author",
|
|
1497
|
+
title: "Name",
|
|
1498
|
+
type: "string",
|
|
1499
|
+
validation: { required: true }
|
|
1500
|
+
},
|
|
1501
|
+
{
|
|
1502
|
+
name: "role",
|
|
1503
|
+
title: "Role",
|
|
1504
|
+
type: "string",
|
|
1505
|
+
localized: true
|
|
1506
|
+
},
|
|
1507
|
+
{
|
|
1508
|
+
name: "photo",
|
|
1509
|
+
title: "Photo",
|
|
1510
|
+
type: "image"
|
|
1511
|
+
},
|
|
1512
|
+
{
|
|
1513
|
+
name: "background",
|
|
1514
|
+
title: "Background image",
|
|
1515
|
+
type: "image"
|
|
1516
|
+
}
|
|
1517
|
+
]
|
|
1518
|
+
},
|
|
1519
|
+
{
|
|
1520
|
+
name: "productSlide",
|
|
1521
|
+
title: "Product",
|
|
1522
|
+
type: "object",
|
|
1523
|
+
icon: "shopping-bag",
|
|
1524
|
+
preview: {
|
|
1525
|
+
title: "badge",
|
|
1526
|
+
subtitle: "product",
|
|
1527
|
+
media: "image",
|
|
1528
|
+
fallback: "Untitled product slide"
|
|
1529
|
+
},
|
|
1530
|
+
fields: [
|
|
1531
|
+
{
|
|
1532
|
+
name: "product",
|
|
1533
|
+
title: "Product",
|
|
1534
|
+
type: "reference",
|
|
1535
|
+
reference: { to: ["shopify"] },
|
|
1536
|
+
validation: { required: true }
|
|
1537
|
+
},
|
|
1538
|
+
{
|
|
1539
|
+
name: "image",
|
|
1540
|
+
title: "Image",
|
|
1541
|
+
type: "image",
|
|
1542
|
+
description: "Leave empty to use the product photo."
|
|
1543
|
+
},
|
|
1544
|
+
{
|
|
1545
|
+
name: "badge",
|
|
1546
|
+
title: "Badge",
|
|
1547
|
+
type: "string",
|
|
1548
|
+
validation: { max: 16 },
|
|
1549
|
+
placeholder: "New"
|
|
1550
|
+
}
|
|
1551
|
+
]
|
|
1552
|
+
}
|
|
1553
|
+
]
|
|
1554
|
+
},
|
|
1555
|
+
{
|
|
1556
|
+
name: "autoplay",
|
|
1557
|
+
title: "Play automatically",
|
|
1558
|
+
type: "boolean",
|
|
1559
|
+
group: "design"
|
|
1560
|
+
},
|
|
1561
|
+
{
|
|
1562
|
+
name: "interval",
|
|
1563
|
+
title: "Seconds per slide",
|
|
1564
|
+
type: "number",
|
|
1565
|
+
group: "design",
|
|
1566
|
+
layout: "slider",
|
|
1567
|
+
hidden: {
|
|
1568
|
+
field: "autoplay",
|
|
1569
|
+
equals: true
|
|
1570
|
+
},
|
|
1571
|
+
initialValue: 6,
|
|
1572
|
+
numeric: {
|
|
1573
|
+
min: 3,
|
|
1574
|
+
max: 15,
|
|
1575
|
+
step: 1,
|
|
1576
|
+
unit: "s"
|
|
1577
|
+
}
|
|
1578
|
+
},
|
|
1579
|
+
{
|
|
1580
|
+
name: "loop",
|
|
1581
|
+
title: "Loop back to the start",
|
|
1582
|
+
type: "boolean",
|
|
1583
|
+
group: "design",
|
|
1584
|
+
initialValue: true
|
|
1585
|
+
},
|
|
1586
|
+
{
|
|
1587
|
+
name: "perViewDesktop",
|
|
1588
|
+
title: "Slides visible on desktop",
|
|
1589
|
+
type: "number",
|
|
1590
|
+
group: "design",
|
|
1591
|
+
layout: "slider",
|
|
1592
|
+
initialValue: 3,
|
|
1593
|
+
numeric: {
|
|
1594
|
+
min: 1,
|
|
1595
|
+
max: 5,
|
|
1596
|
+
step: .5
|
|
1597
|
+
},
|
|
1598
|
+
description: "Halves show a peek of the next slide."
|
|
1599
|
+
},
|
|
1600
|
+
{
|
|
1601
|
+
name: "perViewMobile",
|
|
1602
|
+
title: "Slides visible on phones",
|
|
1603
|
+
type: "number",
|
|
1604
|
+
group: "design",
|
|
1605
|
+
layout: "slider",
|
|
1606
|
+
initialValue: 1.2,
|
|
1607
|
+
numeric: {
|
|
1608
|
+
min: 1,
|
|
1609
|
+
max: 2,
|
|
1610
|
+
step: .1
|
|
1611
|
+
}
|
|
1612
|
+
},
|
|
1613
|
+
{
|
|
1614
|
+
name: "controls",
|
|
1615
|
+
title: "Controls",
|
|
1616
|
+
type: "multiselect",
|
|
1617
|
+
group: "design",
|
|
1618
|
+
initialValue: ["arrows", "dots"],
|
|
1619
|
+
options: [
|
|
1620
|
+
{
|
|
1621
|
+
value: "arrows",
|
|
1622
|
+
label: "Arrows"
|
|
1623
|
+
},
|
|
1624
|
+
{
|
|
1625
|
+
value: "dots",
|
|
1626
|
+
label: "Dots"
|
|
1627
|
+
},
|
|
1628
|
+
{
|
|
1629
|
+
value: "progress",
|
|
1630
|
+
label: "Progress bar"
|
|
1631
|
+
}
|
|
1632
|
+
]
|
|
1633
|
+
},
|
|
1634
|
+
theme
|
|
1635
|
+
]
|
|
1636
|
+
};
|
|
1637
|
+
var parallax = {
|
|
1638
|
+
name: "parallaxImage",
|
|
1639
|
+
title: "Full-bleed image",
|
|
1640
|
+
kind: "block",
|
|
1641
|
+
icon: "photo-scan",
|
|
1642
|
+
category: "Media & galleries",
|
|
1643
|
+
description: "An edge-to-edge photo with optional parallax and text over it",
|
|
1644
|
+
variants: [
|
|
1645
|
+
{
|
|
1646
|
+
id: "parallax",
|
|
1647
|
+
name: "Parallax",
|
|
1648
|
+
description: "The photo moves slower than the page"
|
|
1649
|
+
},
|
|
1650
|
+
{
|
|
1651
|
+
id: "fixed",
|
|
1652
|
+
name: "Fixed",
|
|
1653
|
+
description: "The page scrolls over a still photo"
|
|
1654
|
+
},
|
|
1655
|
+
{
|
|
1656
|
+
id: "static",
|
|
1657
|
+
name: "Static"
|
|
1658
|
+
}
|
|
1659
|
+
],
|
|
1660
|
+
preview: {
|
|
1661
|
+
title: "heading",
|
|
1662
|
+
media: "image",
|
|
1663
|
+
icon: "photo-scan"
|
|
1664
|
+
},
|
|
1665
|
+
groups: GROUPS,
|
|
1666
|
+
fields: [
|
|
1667
|
+
{
|
|
1668
|
+
name: "eyebrow",
|
|
1669
|
+
title: "Eyebrow",
|
|
1670
|
+
type: "string",
|
|
1671
|
+
validation: { max: 32 }
|
|
1672
|
+
},
|
|
1673
|
+
{
|
|
1674
|
+
name: "heading",
|
|
1675
|
+
title: "Heading",
|
|
1676
|
+
type: "string",
|
|
1677
|
+
validation: { recommendedMax: 60 },
|
|
1678
|
+
ai: true,
|
|
1679
|
+
localized: true
|
|
1680
|
+
},
|
|
1681
|
+
{
|
|
1682
|
+
name: "body",
|
|
1683
|
+
title: "Body",
|
|
1684
|
+
type: "text",
|
|
1685
|
+
rows: 2,
|
|
1686
|
+
validation: { recommendedMax: 160 },
|
|
1687
|
+
localized: true
|
|
1688
|
+
},
|
|
1689
|
+
{
|
|
1690
|
+
name: "button",
|
|
1691
|
+
title: "Button",
|
|
1692
|
+
type: "button"
|
|
1693
|
+
},
|
|
1694
|
+
{
|
|
1695
|
+
name: "image",
|
|
1696
|
+
title: "Image",
|
|
1697
|
+
type: "image",
|
|
1698
|
+
group: "media",
|
|
1699
|
+
validation: { required: true },
|
|
1700
|
+
description: "At least 2400px wide."
|
|
1701
|
+
},
|
|
1702
|
+
{
|
|
1703
|
+
name: "mobileImage",
|
|
1704
|
+
title: "Phone photo",
|
|
1705
|
+
type: "image",
|
|
1706
|
+
group: "media"
|
|
1707
|
+
},
|
|
1708
|
+
{
|
|
1709
|
+
name: "isDecorative",
|
|
1710
|
+
title: "Decorative only",
|
|
1711
|
+
type: "boolean",
|
|
1712
|
+
group: "media",
|
|
1713
|
+
description: "Screen readers skip the photo."
|
|
1714
|
+
},
|
|
1715
|
+
{
|
|
1716
|
+
name: "credit",
|
|
1717
|
+
title: "Photo credit",
|
|
1718
|
+
type: "string",
|
|
1719
|
+
group: "media",
|
|
1720
|
+
validation: { max: 64 }
|
|
1721
|
+
},
|
|
1722
|
+
{
|
|
1723
|
+
name: "position",
|
|
1724
|
+
title: "Text position",
|
|
1725
|
+
type: "select",
|
|
1726
|
+
group: "design",
|
|
1727
|
+
layout: "grid",
|
|
1728
|
+
initialValue: "bottom-left",
|
|
1729
|
+
hidden: {
|
|
1730
|
+
field: "heading",
|
|
1731
|
+
notEmpty: true
|
|
1732
|
+
},
|
|
1733
|
+
options: [
|
|
1734
|
+
{
|
|
1735
|
+
value: "top-left",
|
|
1736
|
+
label: "Top left"
|
|
1737
|
+
},
|
|
1738
|
+
{
|
|
1739
|
+
value: "top-center",
|
|
1740
|
+
label: "Top"
|
|
1741
|
+
},
|
|
1742
|
+
{
|
|
1743
|
+
value: "top-right",
|
|
1744
|
+
label: "Top right"
|
|
1745
|
+
},
|
|
1746
|
+
{
|
|
1747
|
+
value: "middle-left",
|
|
1748
|
+
label: "Left"
|
|
1749
|
+
},
|
|
1750
|
+
{
|
|
1751
|
+
value: "center",
|
|
1752
|
+
label: "Center"
|
|
1753
|
+
},
|
|
1754
|
+
{
|
|
1755
|
+
value: "middle-right",
|
|
1756
|
+
label: "Right"
|
|
1757
|
+
},
|
|
1758
|
+
{
|
|
1759
|
+
value: "bottom-left",
|
|
1760
|
+
label: "Bottom left"
|
|
1761
|
+
},
|
|
1762
|
+
{
|
|
1763
|
+
value: "bottom-center",
|
|
1764
|
+
label: "Bottom"
|
|
1765
|
+
},
|
|
1766
|
+
{
|
|
1767
|
+
value: "bottom-right",
|
|
1768
|
+
label: "Bottom right"
|
|
1769
|
+
}
|
|
1770
|
+
]
|
|
1771
|
+
},
|
|
1772
|
+
{
|
|
1773
|
+
name: "overlay",
|
|
1774
|
+
title: "Overlay",
|
|
1775
|
+
type: "number",
|
|
1776
|
+
group: "design",
|
|
1777
|
+
layout: "slider",
|
|
1778
|
+
initialValue: 40,
|
|
1779
|
+
numeric: {
|
|
1780
|
+
min: 0,
|
|
1781
|
+
max: 80,
|
|
1782
|
+
step: 5,
|
|
1783
|
+
unit: "%"
|
|
1784
|
+
}
|
|
1785
|
+
},
|
|
1786
|
+
{
|
|
1787
|
+
name: "overlayStyle",
|
|
1788
|
+
title: "Overlay shape",
|
|
1789
|
+
type: "select",
|
|
1790
|
+
group: "design",
|
|
1791
|
+
layout: "segmented",
|
|
1792
|
+
initialValue: "gradient",
|
|
1793
|
+
options: [{
|
|
1794
|
+
value: "flat",
|
|
1795
|
+
label: "Flat"
|
|
1796
|
+
}, {
|
|
1797
|
+
value: "gradient",
|
|
1798
|
+
label: "Gradient"
|
|
1799
|
+
}]
|
|
1800
|
+
},
|
|
1801
|
+
{
|
|
1802
|
+
name: "height",
|
|
1803
|
+
title: "Height",
|
|
1804
|
+
type: "select",
|
|
1805
|
+
group: "design",
|
|
1806
|
+
layout: "segmented",
|
|
1807
|
+
initialValue: "tall",
|
|
1808
|
+
options: [
|
|
1809
|
+
{
|
|
1810
|
+
value: "medium",
|
|
1811
|
+
label: "60%"
|
|
1812
|
+
},
|
|
1813
|
+
{
|
|
1814
|
+
value: "tall",
|
|
1815
|
+
label: "80%"
|
|
1816
|
+
},
|
|
1817
|
+
{
|
|
1818
|
+
value: "screen",
|
|
1819
|
+
label: "Full screen"
|
|
1820
|
+
}
|
|
1821
|
+
],
|
|
1822
|
+
description: "Share of the browser window's height."
|
|
1823
|
+
},
|
|
1824
|
+
{
|
|
1825
|
+
name: "intensity",
|
|
1826
|
+
title: "Parallax strength",
|
|
1827
|
+
type: "number",
|
|
1828
|
+
group: "design",
|
|
1829
|
+
layout: "slider",
|
|
1830
|
+
hidden: {
|
|
1831
|
+
field: "_variant",
|
|
1832
|
+
equals: "parallax"
|
|
1833
|
+
},
|
|
1834
|
+
initialValue: 20,
|
|
1835
|
+
numeric: {
|
|
1836
|
+
min: 5,
|
|
1837
|
+
max: 40,
|
|
1838
|
+
step: 5,
|
|
1839
|
+
unit: "%"
|
|
1840
|
+
}
|
|
1841
|
+
}
|
|
1842
|
+
]
|
|
1843
|
+
};
|
|
1844
|
+
var ugcFeed = {
|
|
1845
|
+
name: "ugcFeed",
|
|
1846
|
+
title: "Social photo feed",
|
|
1847
|
+
kind: "block",
|
|
1848
|
+
icon: "brand-instagram",
|
|
1849
|
+
category: "Media & galleries",
|
|
1850
|
+
description: "A grid of customer photos from a connected Instagram account or hashtag, or picked by hand",
|
|
1851
|
+
variants: [{
|
|
1852
|
+
id: "grid",
|
|
1853
|
+
name: "Grid"
|
|
1854
|
+
}, {
|
|
1855
|
+
id: "strip",
|
|
1856
|
+
name: "Strip",
|
|
1857
|
+
description: "One scrolling row"
|
|
1858
|
+
}],
|
|
1859
|
+
preview: {
|
|
1860
|
+
title: "heading",
|
|
1861
|
+
icon: "brand-instagram"
|
|
1862
|
+
},
|
|
1863
|
+
groups: GROUPS,
|
|
1864
|
+
fields: [
|
|
1865
|
+
{
|
|
1866
|
+
name: "heading",
|
|
1867
|
+
title: "Heading",
|
|
1868
|
+
type: "string",
|
|
1869
|
+
validation: { recommendedMax: 48 },
|
|
1870
|
+
localized: true
|
|
1871
|
+
},
|
|
1872
|
+
{
|
|
1873
|
+
name: "followButton",
|
|
1874
|
+
title: "Follow button",
|
|
1875
|
+
type: "button"
|
|
1876
|
+
},
|
|
1877
|
+
{
|
|
1878
|
+
name: "source",
|
|
1879
|
+
title: "Photos from",
|
|
1880
|
+
type: "select",
|
|
1881
|
+
layout: "radio",
|
|
1882
|
+
initialValue: "account",
|
|
1883
|
+
options: [
|
|
1884
|
+
{
|
|
1885
|
+
value: "account",
|
|
1886
|
+
label: "Our account",
|
|
1887
|
+
description: "Newest posts from the connected profile"
|
|
1888
|
+
},
|
|
1889
|
+
{
|
|
1890
|
+
value: "hashtag",
|
|
1891
|
+
label: "A hashtag",
|
|
1892
|
+
description: "Only posts you approve in Media › Social"
|
|
1893
|
+
},
|
|
1894
|
+
{
|
|
1895
|
+
value: "manual",
|
|
1896
|
+
label: "Picked photos"
|
|
1897
|
+
}
|
|
1898
|
+
]
|
|
1899
|
+
},
|
|
1900
|
+
{
|
|
1901
|
+
name: "account",
|
|
1902
|
+
title: "Account",
|
|
1903
|
+
type: "string",
|
|
1904
|
+
access: { edit: "schema.manage" },
|
|
1905
|
+
lockReason: "Connected in Settings › Integrations.",
|
|
1906
|
+
hidden: {
|
|
1907
|
+
field: "source",
|
|
1908
|
+
equals: "account"
|
|
1909
|
+
},
|
|
1910
|
+
placeholder: "@calderaoutside"
|
|
1911
|
+
},
|
|
1912
|
+
{
|
|
1913
|
+
name: "hashtag",
|
|
1914
|
+
title: "Hashtag",
|
|
1915
|
+
type: "string",
|
|
1916
|
+
hidden: {
|
|
1917
|
+
field: "source",
|
|
1918
|
+
equals: "hashtag"
|
|
1919
|
+
},
|
|
1920
|
+
validation: {
|
|
1921
|
+
required: true,
|
|
1922
|
+
pattern: "^#?[A-Za-z0-9_]+$",
|
|
1923
|
+
patternMessage: "Use letters, numbers and underscores, like utm_source."
|
|
1924
|
+
},
|
|
1925
|
+
placeholder: "#cookedoncaldera"
|
|
1926
|
+
},
|
|
1927
|
+
{
|
|
1928
|
+
name: "limit",
|
|
1929
|
+
title: "How many",
|
|
1930
|
+
type: "number",
|
|
1931
|
+
hidden: {
|
|
1932
|
+
field: "source",
|
|
1933
|
+
equals: ["account", "hashtag"]
|
|
1934
|
+
},
|
|
1935
|
+
initialValue: 8,
|
|
1936
|
+
numeric: {
|
|
1937
|
+
min: 4,
|
|
1938
|
+
max: 24,
|
|
1939
|
+
step: 4
|
|
1940
|
+
}
|
|
1941
|
+
},
|
|
1942
|
+
{
|
|
1943
|
+
name: "posts",
|
|
1944
|
+
title: "Photos",
|
|
1945
|
+
type: "array",
|
|
1946
|
+
group: "media",
|
|
1947
|
+
itemNoun: "photo",
|
|
1948
|
+
arrayLayout: "grid",
|
|
1949
|
+
hidden: {
|
|
1950
|
+
field: "source",
|
|
1951
|
+
equals: "manual"
|
|
1952
|
+
},
|
|
1953
|
+
validation: {
|
|
1954
|
+
min: 4,
|
|
1955
|
+
max: 24
|
|
1956
|
+
},
|
|
1957
|
+
of: [{
|
|
1958
|
+
name: "post",
|
|
1959
|
+
title: "Photo",
|
|
1960
|
+
type: "object",
|
|
1961
|
+
icon: "photo",
|
|
1962
|
+
preview: {
|
|
1963
|
+
title: "handle",
|
|
1964
|
+
subtitle: "permalink",
|
|
1965
|
+
media: "image",
|
|
1966
|
+
fallback: "Untitled photo"
|
|
1967
|
+
},
|
|
1968
|
+
fields: [
|
|
1969
|
+
{
|
|
1970
|
+
name: "image",
|
|
1971
|
+
title: "Image",
|
|
1972
|
+
type: "image",
|
|
1973
|
+
validation: { required: true }
|
|
1974
|
+
},
|
|
1975
|
+
{
|
|
1976
|
+
name: "handle",
|
|
1977
|
+
title: "Creator",
|
|
1978
|
+
type: "string",
|
|
1979
|
+
validation: { required: true },
|
|
1980
|
+
placeholder: "@trailkitchen"
|
|
1981
|
+
},
|
|
1982
|
+
{
|
|
1983
|
+
name: "permalink",
|
|
1984
|
+
title: "Original post",
|
|
1985
|
+
type: "url",
|
|
1986
|
+
validation: { required: true }
|
|
1987
|
+
},
|
|
1988
|
+
{
|
|
1989
|
+
name: "hasRights",
|
|
1990
|
+
title: "Creator gave permission",
|
|
1991
|
+
type: "boolean",
|
|
1992
|
+
validation: { required: true },
|
|
1993
|
+
description: "Required before it can be published."
|
|
1994
|
+
},
|
|
1995
|
+
{
|
|
1996
|
+
name: "products",
|
|
1997
|
+
title: "Products shown",
|
|
1998
|
+
type: "array",
|
|
1999
|
+
of: [{
|
|
2000
|
+
name: "product",
|
|
2001
|
+
title: "Product",
|
|
2002
|
+
type: "reference",
|
|
2003
|
+
reference: { to: ["shopify"] }
|
|
2004
|
+
}]
|
|
2005
|
+
}
|
|
2006
|
+
]
|
|
2007
|
+
}]
|
|
2008
|
+
},
|
|
2009
|
+
{
|
|
2010
|
+
name: "columns",
|
|
2011
|
+
title: "Columns on desktop",
|
|
2012
|
+
type: "number",
|
|
2013
|
+
group: "design",
|
|
2014
|
+
layout: "slider",
|
|
2015
|
+
initialValue: 4,
|
|
2016
|
+
numeric: {
|
|
2017
|
+
min: 3,
|
|
2018
|
+
max: 6,
|
|
2019
|
+
step: 1
|
|
2020
|
+
}
|
|
2021
|
+
},
|
|
2022
|
+
theme
|
|
2023
|
+
]
|
|
2024
|
+
};
|
|
2025
|
+
var ENTRIES = [
|
|
2026
|
+
{
|
|
2027
|
+
id: "masonry-gallery",
|
|
2028
|
+
label: "Masonry gallery",
|
|
2029
|
+
proves: "Bulk image array as tiles · caption + structured credit per photo · columns per breakpoint as design",
|
|
2030
|
+
category: "Media & galleries",
|
|
2031
|
+
tags: [
|
|
2032
|
+
"media-heavy",
|
|
2033
|
+
"a11y",
|
|
2034
|
+
"responsive-layout",
|
|
2035
|
+
"repeater",
|
|
2036
|
+
"validation",
|
|
2037
|
+
"localized"
|
|
2038
|
+
],
|
|
2039
|
+
brand: "Halden Studio",
|
|
2040
|
+
previewLayout: "gallery",
|
|
2041
|
+
schema: masonry,
|
|
2042
|
+
value: {
|
|
2043
|
+
_variant: "masonry",
|
|
2044
|
+
heading: "Cedar House, Whidbey Island",
|
|
2045
|
+
intro: "A 1,400 sq ft retreat built around three old-growth cedars. Completed 2025.",
|
|
2046
|
+
images: [
|
|
2047
|
+
{
|
|
2048
|
+
_key: "i1",
|
|
2049
|
+
image: img("halden-cedar-exterior", "Timber house with floor-to-ceiling glass among cedar trunks at dusk", 1200, 1600, {
|
|
2050
|
+
x: 50,
|
|
2051
|
+
y: 45
|
|
2052
|
+
}),
|
|
2053
|
+
caption: "The north façade, glazed full height so the cedars read as part of the room.",
|
|
2054
|
+
credit: {
|
|
2055
|
+
name: "Lina Okafor",
|
|
2056
|
+
link: {
|
|
2057
|
+
type: "url",
|
|
2058
|
+
href: "https://linaokafor.photo",
|
|
2059
|
+
newTab: true
|
|
2060
|
+
}
|
|
2061
|
+
}
|
|
2062
|
+
},
|
|
2063
|
+
{
|
|
2064
|
+
_key: "i2",
|
|
2065
|
+
image: img("halden-cedar-kitchen", "Kitchen with charred-oak cabinets and a concrete island", 1600, 1067),
|
|
2066
|
+
caption: "Charred oak and board-formed concrete in the kitchen.",
|
|
2067
|
+
credit: { name: "Lina Okafor" }
|
|
2068
|
+
},
|
|
2069
|
+
{
|
|
2070
|
+
_key: "i3",
|
|
2071
|
+
image: img("halden-cedar-stair", "A floating timber stair lit from a skylight", 1200, 1800),
|
|
2072
|
+
caption: "The stair hangs from a single steel spine.",
|
|
2073
|
+
credit: { name: "Lina Okafor" }
|
|
2074
|
+
},
|
|
2075
|
+
{
|
|
2076
|
+
_key: "i4",
|
|
2077
|
+
image: img("halden-cedar-bath", "Soaking tub facing a forest view", 1600, 1067),
|
|
2078
|
+
caption: "",
|
|
2079
|
+
credit: { name: "Lina Okafor" }
|
|
2080
|
+
},
|
|
2081
|
+
{
|
|
2082
|
+
_key: "i5",
|
|
2083
|
+
image: img("halden-cedar-detail", "Close-up of a hand-cut cedar shingle wall", 1200, 1200),
|
|
2084
|
+
caption: "Hand-split shingles from fallen site trees.",
|
|
2085
|
+
credit: { name: "Halden Studio" }
|
|
2086
|
+
},
|
|
2087
|
+
{
|
|
2088
|
+
_key: "i6",
|
|
2089
|
+
image: img("halden-cedar-deck", "Deck wrapped around a cedar trunk at sunrise", 1600, 1067, {
|
|
2090
|
+
x: 35,
|
|
2091
|
+
y: 60
|
|
2092
|
+
}),
|
|
2093
|
+
caption: "The deck steps around the oldest cedar rather than through it.",
|
|
2094
|
+
credit: { name: "Lina Okafor" }
|
|
2095
|
+
}
|
|
2096
|
+
],
|
|
2097
|
+
useLightbox: true,
|
|
2098
|
+
captionDisplay: "hover",
|
|
2099
|
+
desktopColumns: 3,
|
|
2100
|
+
tabletColumns: 2,
|
|
2101
|
+
phoneColumns: 1,
|
|
2102
|
+
gap: "sm",
|
|
2103
|
+
theme: "light"
|
|
2104
|
+
},
|
|
2105
|
+
notes: {
|
|
2106
|
+
why: "Photos are an array of small objects (image + caption + credit + optional link) shown as a GRID of tiles because galleries are managed visually and in bulk. Caption and credit are separate: the caption is localised content, the credit is attribution (name + link) that must survive translation and appear in the lightbox. Alt text lives on the image value itself. Column counts per breakpoint are DESIGN in the Design group — never per-photo sizes, because masonry keeps each photo's natural aspect ratio from its stored width/height.",
|
|
2107
|
+
sanity: "`masonryGallery` with `images: array<object{image (hotspot: true), caption, credit: object{name, url}}>` and `options.layout: 'grid'`; Sanity stores alt as a custom field on the image object.",
|
|
2108
|
+
htmlSignals: [
|
|
2109
|
+
"Many `<img>` (6+) inside a container with `column-count`, `columns-3`, `grid-template-rows: masonry`, or Masonry.js / `data-masonry`",
|
|
2110
|
+
"Images of differing aspect ratios with no fixed height",
|
|
2111
|
+
"`<figure>` + `<figcaption>` per image, often with “Photo: Name” or © text",
|
|
2112
|
+
"Links to full-size images (`href` ending .jpg) or useLightbox libraries (PhotoSwipe, GLightbox, fancybox) via `data-pswp-*`, `data-fancybox`"
|
|
2113
|
+
],
|
|
2114
|
+
mcp: "Each figure → a photo: highest-resolution source (`srcset` largest, or the useLightbox `href`) → image.url, intrinsic width/height from `data-pswp-width`/natural size, `alt` → image.alt. Split `<figcaption>`: text after “Photo:”, “©”, “Credit:” or in a `<small>`/`<cite>` → credit.name (+ any link), the rest → caption. Count CSS columns at 1280/768/375px → desktopColumns/tabletColumns/phoneColumns. Lightbox library present → useLightbox true.",
|
|
2115
|
+
pitfalls: [
|
|
2116
|
+
"Importing the thumbnail instead of the full-size file — always prefer the lightbox href or the largest srcset entry.",
|
|
2117
|
+
"Credits pasted into captions get translated; keep them in the credit object.",
|
|
2118
|
+
"Empty alt is right for decorative photos but wrong for a portfolio — flag empties for review."
|
|
2119
|
+
]
|
|
2120
|
+
}
|
|
2121
|
+
},
|
|
2122
|
+
{
|
|
2123
|
+
id: "lightbox-gallery-filters",
|
|
2124
|
+
label: "Gallery with category filters",
|
|
2125
|
+
proves: "Filters defined once as key/label objects · photos tag themselves by key · URL-synced filter state",
|
|
2126
|
+
category: "Media & galleries",
|
|
2127
|
+
tags: [
|
|
2128
|
+
"media-heavy",
|
|
2129
|
+
"a11y",
|
|
2130
|
+
"repeater",
|
|
2131
|
+
"validation",
|
|
2132
|
+
"localized"
|
|
2133
|
+
],
|
|
2134
|
+
brand: "Tidewater Hotel",
|
|
2135
|
+
previewLayout: "gallery",
|
|
2136
|
+
schema: filterGallery,
|
|
2137
|
+
value: {
|
|
2138
|
+
_variant: "landscape",
|
|
2139
|
+
heading: "Inside Tidewater",
|
|
2140
|
+
categories: [
|
|
2141
|
+
{
|
|
2142
|
+
_key: "c1",
|
|
2143
|
+
label: "Rooms",
|
|
2144
|
+
key: "rooms"
|
|
2145
|
+
},
|
|
2146
|
+
{
|
|
2147
|
+
_key: "c2",
|
|
2148
|
+
label: "Dining",
|
|
2149
|
+
key: "dining"
|
|
2150
|
+
},
|
|
2151
|
+
{
|
|
2152
|
+
_key: "c3",
|
|
2153
|
+
label: "Spa",
|
|
2154
|
+
key: "spa"
|
|
2155
|
+
},
|
|
2156
|
+
{
|
|
2157
|
+
_key: "c4",
|
|
2158
|
+
label: "The beach",
|
|
2159
|
+
key: "beach"
|
|
2160
|
+
}
|
|
2161
|
+
],
|
|
2162
|
+
allLabel: "All",
|
|
2163
|
+
images: [
|
|
2164
|
+
{
|
|
2165
|
+
_key: "g1",
|
|
2166
|
+
image: img("tidewater-king-suite", "King suite with linen bedding and a balcony over the bay", 1600, 1200),
|
|
2167
|
+
categories: ["rooms"],
|
|
2168
|
+
caption: "Bay King Suite — every suite faces the water."
|
|
2169
|
+
},
|
|
2170
|
+
{
|
|
2171
|
+
_key: "g2",
|
|
2172
|
+
image: img("tidewater-oyster-bar", "Oyster bar counter with a chef shucking oysters", 1600, 1200),
|
|
2173
|
+
categories: ["dining"],
|
|
2174
|
+
caption: "The Shell Bar opens at 4pm daily."
|
|
2175
|
+
},
|
|
2176
|
+
{
|
|
2177
|
+
_key: "g3",
|
|
2178
|
+
image: img("tidewater-steam-room", "Cedar steam room with soft light", 1600, 1200),
|
|
2179
|
+
categories: ["spa"],
|
|
2180
|
+
caption: ""
|
|
2181
|
+
},
|
|
2182
|
+
{
|
|
2183
|
+
_key: "g4",
|
|
2184
|
+
image: img("tidewater-dunes", "Boardwalk through dunes to the beach at sunset", 1600, 1200),
|
|
2185
|
+
categories: ["beach"],
|
|
2186
|
+
caption: "A two-minute walk from the lobby."
|
|
2187
|
+
},
|
|
2188
|
+
{
|
|
2189
|
+
_key: "g5",
|
|
2190
|
+
image: img("tidewater-terrace-breakfast", "Breakfast on a terrace above the beach", 1600, 1200),
|
|
2191
|
+
categories: ["dining", "beach"],
|
|
2192
|
+
caption: "Breakfast on the Dune Terrace."
|
|
2193
|
+
},
|
|
2194
|
+
{
|
|
2195
|
+
_key: "g6",
|
|
2196
|
+
image: img("tidewater-twin-room", "Twin room with two double beds and a reading nook", 1600, 1200),
|
|
2197
|
+
categories: ["rooms"],
|
|
2198
|
+
caption: "Harbour Twin."
|
|
2199
|
+
}
|
|
2200
|
+
],
|
|
2201
|
+
useUrlFilter: true,
|
|
2202
|
+
columns: 3,
|
|
2203
|
+
initialCount: 12,
|
|
2204
|
+
theme: "light"
|
|
2205
|
+
},
|
|
2206
|
+
notes: {
|
|
2207
|
+
why: "Filter categories are defined ONCE on the section (label + stable key, localised labels) and each photo tags itself with keys, so renaming “Dining” to “Restaurant” never touches the photos and a photo can sit in two filters. The keys are a `tags` field today because our schema can't populate a select's options from a sibling array — a real gap (see notes). If the same photos are reused across pages, move them into the media library with media tags and switch the section to a query.",
|
|
2208
|
+
sanity: "`categories: array<object{title, value: slug}>` + `images: array<object{image, categories: array<string>}>` with a custom input listing the parent's categories (Sanity also can't do this without a custom component).",
|
|
2209
|
+
htmlSignals: [
|
|
2210
|
+
"Filter buttons above a grid (`data-filter`, `aria-pressed`, Isotope/MixItUp/`data-category`) and tiles carrying category classes (`.dining`, `data-groups='[\"spa\"]'`)",
|
|
2211
|
+
"A uniform tile grid (fixed aspect ratio, `object-fit: cover`)",
|
|
2212
|
+
"A lightbox on click; sometimes a “Load more” button"
|
|
2213
|
+
],
|
|
2214
|
+
mcp: "Filter button labels → categories (skip the “All”/“Everything” chip → allLabel; key from `data-filter` minus `.`/`*` or slugified label). For each tile, read its category classes/data attributes → categories (keys). Image from the lightbox href or largest srcset, alt → alt, lightbox caption → caption. Tile aspect → variant (1:1 square, else landscape). Visible count before “Load more” → initialCount. `?filter=`/hash usage in links → useUrlFilter.",
|
|
2215
|
+
pitfalls: ["A photo tagged with a key that no filter defines is invisible under every filter except All — validate keys against the filters.", "Free-typed keys are error-prone; a select fed by the section's filters is the right control (schema gap)."]
|
|
2216
|
+
}
|
|
2217
|
+
},
|
|
2218
|
+
{
|
|
2219
|
+
id: "video-section",
|
|
2220
|
+
label: "Video section (YouTube · Vimeo · hosted)",
|
|
2221
|
+
proves: "Source select switches link vs file · captions per language required for hosted · chapters with timestamp validation · VideoObject JSON-LD",
|
|
2222
|
+
category: "Media & galleries",
|
|
2223
|
+
tags: [
|
|
2224
|
+
"media-heavy",
|
|
2225
|
+
"a11y",
|
|
2226
|
+
"seo-structured",
|
|
2227
|
+
"conditional",
|
|
2228
|
+
"validation",
|
|
2229
|
+
"embed",
|
|
2230
|
+
"localized",
|
|
2231
|
+
"variants"
|
|
2232
|
+
],
|
|
2233
|
+
brand: "Caldera",
|
|
2234
|
+
previewLayout: "media",
|
|
2235
|
+
schema: videoSection,
|
|
2236
|
+
value: {
|
|
2237
|
+
_variant: "split",
|
|
2238
|
+
eyebrow: "The film",
|
|
2239
|
+
title: "How we pour a skillet: a day at the Bend foundry",
|
|
2240
|
+
description: "Follow one Ridge Skillet from scrap iron to seasoned pan — the pour, the machining and the three-coat seasoning.",
|
|
2241
|
+
source: "hosted",
|
|
2242
|
+
file: {
|
|
2243
|
+
name: "foundry-day-1080p.mp4",
|
|
2244
|
+
size: 412e6,
|
|
2245
|
+
url: "https://cdn.caldera.co/film/foundry-day-1080p.mp4"
|
|
2246
|
+
},
|
|
2247
|
+
poster: img("caldera-foundry-film-poster", "Caster in a leather apron pouring molten iron", 1920, 1080),
|
|
2248
|
+
duration: "6:48",
|
|
2249
|
+
uploadDate: "2026-03-02",
|
|
2250
|
+
captions: [{
|
|
2251
|
+
_key: "cc1",
|
|
2252
|
+
language: "en",
|
|
2253
|
+
label: "English",
|
|
2254
|
+
file: {
|
|
2255
|
+
name: "foundry-day.en.vtt",
|
|
2256
|
+
size: 18400,
|
|
2257
|
+
url: "https://cdn.caldera.co/film/foundry-day.en.vtt"
|
|
2258
|
+
},
|
|
2259
|
+
kind: "captions",
|
|
2260
|
+
isOnByDefault: true
|
|
2261
|
+
}, {
|
|
2262
|
+
_key: "cc2",
|
|
2263
|
+
language: "es",
|
|
2264
|
+
label: "Español",
|
|
2265
|
+
file: {
|
|
2266
|
+
name: "foundry-day.es.vtt",
|
|
2267
|
+
size: 19100,
|
|
2268
|
+
url: "https://cdn.caldera.co/film/foundry-day.es.vtt"
|
|
2269
|
+
},
|
|
2270
|
+
kind: "subtitles"
|
|
2271
|
+
}],
|
|
2272
|
+
chapters: [
|
|
2273
|
+
{
|
|
2274
|
+
_key: "ch1",
|
|
2275
|
+
start: "0:00",
|
|
2276
|
+
title: "Scrap iron in"
|
|
2277
|
+
},
|
|
2278
|
+
{
|
|
2279
|
+
_key: "ch2",
|
|
2280
|
+
start: "1:12",
|
|
2281
|
+
title: "Making the sand moulds"
|
|
2282
|
+
},
|
|
2283
|
+
{
|
|
2284
|
+
_key: "ch3",
|
|
2285
|
+
start: "2:40",
|
|
2286
|
+
title: "The pour at 2,600°F"
|
|
2287
|
+
},
|
|
2288
|
+
{
|
|
2289
|
+
_key: "ch4",
|
|
2290
|
+
start: "4:05",
|
|
2291
|
+
title: "Machining the surface"
|
|
2292
|
+
},
|
|
2293
|
+
{
|
|
2294
|
+
_key: "ch5",
|
|
2295
|
+
start: "5:30",
|
|
2296
|
+
title: "Three coats of seasoning"
|
|
2297
|
+
}
|
|
2298
|
+
],
|
|
2299
|
+
transcript: "<p><strong>Ana Ruiz:</strong> Every pan starts as something else — an engine block, a radiator, a fence post. We melt it down at about 2,600 degrees…</p>",
|
|
2300
|
+
button: {
|
|
2301
|
+
label: "Shop the Ridge Skillet",
|
|
2302
|
+
href: "/products/ridge-skillet",
|
|
2303
|
+
type: "entry",
|
|
2304
|
+
title: "Ridge Skillet 10\"",
|
|
2305
|
+
style: "primary"
|
|
2306
|
+
},
|
|
2307
|
+
autoplay: false,
|
|
2308
|
+
controls: true,
|
|
2309
|
+
usePrivacyMode: true,
|
|
2310
|
+
theme: "dark"
|
|
2311
|
+
},
|
|
2312
|
+
notes: {
|
|
2313
|
+
why: "One block covers all three hosts with a `source` select: YouTube/Vimeo store a link (the renderer lazy-loads a facade until play), hosted stores a FILE so we can transcode and serve renditions. Captions are a per-language array required for hosted video (WCAG 1.2.2) — YouTube/Vimeo carry their own. Chapters are validated timestamps so the renderer can seek and emit `Clip` markup. Title, description, poster, duration and upload date are REQUIRED because they feed VideoObject JSON-LD — that is native SEO generated from content the section already needs, not modelled meta fields. Playback settings are design; loop only shows with autoplay.",
|
|
2314
|
+
sanity: "`videoSection` with `source: string`, `url: url`, `file: mux.video` (Mux plugin) or `file`, `captions: array<object{lang, file}>`, `chapters: array<object{start: string, title}>`; JSON-LD built in the frontend.",
|
|
2315
|
+
htmlSignals: [
|
|
2316
|
+
"`<iframe src=\"https://www.youtube(-nocookie).com/embed/…\">`, `player.vimeo.com/video/…`, `lite-youtube` / `lite-vimeo` facades",
|
|
2317
|
+
"`<video>` with `<source type=\"video/mp4\">`, `poster=` and `<track kind=\"captions\" srclang=…>`",
|
|
2318
|
+
"A list of timestamps (“1:12 Making the moulds”) next to or under the player",
|
|
2319
|
+
"`application/ld+json` with `VideoObject`, `duration` (ISO 8601 like PT6M48S), `uploadDate`"
|
|
2320
|
+
],
|
|
2321
|
+
mcp: "Host from the iframe/src domain → source; canonicalise YouTube/Vimeo to watch URLs (`youtube.com/watch?v=ID`, `vimeo.com/ID`) and keep `?start=`/`#t=` as startAt. `<video><source>` → source hosted + file (download the MP4); every `<track>` → captions (srclang → language, label → label, kind). Read title/description/duration/uploadDate from VideoObject JSON-LD first (convert PT6M48S → 6:48), else from visible text. Timestamp list → chapters (first must be 0:00 — prepend “Intro” if missing). `autoplay muted loop` attributes → design flags.",
|
|
2322
|
+
pitfalls: [
|
|
2323
|
+
"Autoplay with sound is blocked by browsers; autoplay always means muted here.",
|
|
2324
|
+
"Missing uploadDate/duration silently drops the video from rich results — they are required for that reason.",
|
|
2325
|
+
"Embedding raw YouTube iframes costs ~1 MB of JS per video; the renderer uses a facade until play."
|
|
2326
|
+
]
|
|
2327
|
+
}
|
|
2328
|
+
},
|
|
2329
|
+
{
|
|
2330
|
+
id: "before-after-slider",
|
|
2331
|
+
label: "Before / after slider",
|
|
2332
|
+
proves: "Paired required images per comparison · localised labels with defaults · single vs tabs via one array",
|
|
2333
|
+
category: "Media & galleries",
|
|
2334
|
+
tags: [
|
|
2335
|
+
"media-heavy",
|
|
2336
|
+
"a11y",
|
|
2337
|
+
"repeater",
|
|
2338
|
+
"validation",
|
|
2339
|
+
"variants",
|
|
2340
|
+
"localized"
|
|
2341
|
+
],
|
|
2342
|
+
brand: "Halden Studio",
|
|
2343
|
+
previewLayout: "media",
|
|
2344
|
+
schema: beforeAfter,
|
|
2345
|
+
value: {
|
|
2346
|
+
_variant: "tabs",
|
|
2347
|
+
eyebrow: "Renovations",
|
|
2348
|
+
heading: "Same walls, a different house.",
|
|
2349
|
+
comparisons: [
|
|
2350
|
+
{
|
|
2351
|
+
_key: "b1",
|
|
2352
|
+
label: "Kitchen",
|
|
2353
|
+
before: img("halden-reno-kitchen-before", "Dated kitchen with oak cabinets and a dropped ceiling", 1600, 1067),
|
|
2354
|
+
after: img("halden-reno-kitchen-after", "The same kitchen opened to the rafters with white oak and a skylight", 1600, 1067),
|
|
2355
|
+
beforeLabel: "1987",
|
|
2356
|
+
afterLabel: "2025",
|
|
2357
|
+
caption: "We removed the dropped ceiling and found the original fir rafters.",
|
|
2358
|
+
credit: { name: "Lina Okafor" }
|
|
2359
|
+
},
|
|
2360
|
+
{
|
|
2361
|
+
_key: "b2",
|
|
2362
|
+
label: "Living room",
|
|
2363
|
+
before: img("halden-reno-living-before", "Living room with carpet and a small window", 1600, 1067),
|
|
2364
|
+
after: img("halden-reno-living-after", "Living room with polished concrete and a wide picture window", 1600, 1067),
|
|
2365
|
+
beforeLabel: "Before",
|
|
2366
|
+
afterLabel: "After",
|
|
2367
|
+
caption: "",
|
|
2368
|
+
credit: { name: "Lina Okafor" }
|
|
2369
|
+
},
|
|
2370
|
+
{
|
|
2371
|
+
_key: "b3",
|
|
2372
|
+
label: "Façade",
|
|
2373
|
+
before: img("halden-reno-facade-before", "Vinyl-sided house front", 1600, 1067),
|
|
2374
|
+
after: img("halden-reno-facade-after", "The same house clad in charred cedar", 1600, 1067),
|
|
2375
|
+
beforeLabel: "Before",
|
|
2376
|
+
afterLabel: "After",
|
|
2377
|
+
caption: "Shou sugi ban cedar over the original frame.",
|
|
2378
|
+
credit: { name: "Halden Studio" }
|
|
2379
|
+
}
|
|
2380
|
+
],
|
|
2381
|
+
start: 50,
|
|
2382
|
+
orientation: "horizontal",
|
|
2383
|
+
showHint: true,
|
|
2384
|
+
theme: "light"
|
|
2385
|
+
},
|
|
2386
|
+
notes: {
|
|
2387
|
+
why: "A comparison is a PAIR of required images plus labels, so it's an object; an array of comparisons covers both the single and tabbed layouts without two blocks. Labels default to “Before/After” but are editable and localised (“1987 / 2025” is stronger). Divider start, orientation and the first-view nudge are design. Both images keep their own alt — screen readers get “Before: …, After: …” and a keyboard-operable slider from the renderer.",
|
|
2388
|
+
sanity: "array of `comparison` objects {before: image, after: image, labels}; Sanity can't validate matching dimensions without `Rule.custom` reading asset metadata.",
|
|
2389
|
+
htmlSignals: [
|
|
2390
|
+
"Two stacked images in one container where the top one is clipped (`clip-path: inset(0 50% 0 0)` or a width %) with a draggable handle",
|
|
2391
|
+
"`<input type=\"range\">` overlaid on images, or libraries `img-comparison-slider`, `twentytwenty`, `juxtapose`, `beer-slider`",
|
|
2392
|
+
"Labels “Before” / “After” pinned in the corners"
|
|
2393
|
+
],
|
|
2394
|
+
mcp: "Find the two images inside the comparison container: the clipped/overlay one is usually AFTER (check the label nearest each image rather than assuming). Labels → beforeLabel/afterLabel. Initial clip/range value → start. Vertical clip (inset top/bottom) → orientation vertical. Multiple comparisons under tabs → one block with several comparisons and variant tabs. Compare the two images' natural sizes; if they differ by more than 2%, flag it.",
|
|
2395
|
+
pitfalls: ["Before and after with different crops make the slider useless — dimensions should match (not enforceable in our schema yet).", "A slider built from a div with mouse events only is not keyboard accessible; the renderer must use a real range input."]
|
|
2396
|
+
}
|
|
2397
|
+
},
|
|
2398
|
+
{
|
|
2399
|
+
id: "image-hotspots",
|
|
2400
|
+
label: "Image with hotspots (shop the look)",
|
|
2401
|
+
proves: "Points stored as % coordinates · each pin opens a live product reference OR a note (conditional) · required pin labels",
|
|
2402
|
+
category: "Media & galleries",
|
|
2403
|
+
tags: [
|
|
2404
|
+
"media-heavy",
|
|
2405
|
+
"conditional",
|
|
2406
|
+
"references",
|
|
2407
|
+
"commerce",
|
|
2408
|
+
"a11y",
|
|
2409
|
+
"validation",
|
|
2410
|
+
"variants"
|
|
2411
|
+
],
|
|
2412
|
+
brand: "Caldera",
|
|
2413
|
+
previewLayout: "media",
|
|
2414
|
+
schema: hotspots,
|
|
2415
|
+
value: {
|
|
2416
|
+
_variant: "sidebar",
|
|
2417
|
+
eyebrow: "Shop the camp kitchen",
|
|
2418
|
+
heading: "Everything on the tailgate, ready by sundown.",
|
|
2419
|
+
image: img("caldera-camp-kitchen", "A tailgate camp kitchen with a Dutch oven, folding grill, skillet and kettle", 2e3, 1250, {
|
|
2420
|
+
x: 50,
|
|
2421
|
+
y: 55
|
|
2422
|
+
}),
|
|
2423
|
+
hotspots: [
|
|
2424
|
+
{
|
|
2425
|
+
_key: "h1",
|
|
2426
|
+
label: "Ember Dutch Oven",
|
|
2427
|
+
x: 24,
|
|
2428
|
+
y: 58,
|
|
2429
|
+
kind: "product",
|
|
2430
|
+
product: "gid://shopify/Product/8813",
|
|
2431
|
+
cardSide: "auto"
|
|
2432
|
+
},
|
|
2433
|
+
{
|
|
2434
|
+
_key: "h2",
|
|
2435
|
+
label: "Cable Fold Grill",
|
|
2436
|
+
x: 52.5,
|
|
2437
|
+
y: 66,
|
|
2438
|
+
kind: "product",
|
|
2439
|
+
product: "gid://shopify/Product/8812",
|
|
2440
|
+
cardSide: "auto"
|
|
2441
|
+
},
|
|
2442
|
+
{
|
|
2443
|
+
_key: "h3",
|
|
2444
|
+
label: "Ridge Skillet 10 inch",
|
|
2445
|
+
x: 71,
|
|
2446
|
+
y: 49,
|
|
2447
|
+
kind: "product",
|
|
2448
|
+
product: "gid://shopify/Product/8814",
|
|
2449
|
+
cardSide: "left"
|
|
2450
|
+
},
|
|
2451
|
+
{
|
|
2452
|
+
_key: "h4",
|
|
2453
|
+
label: "Why the tailgate height matters",
|
|
2454
|
+
x: 88,
|
|
2455
|
+
y: 30,
|
|
2456
|
+
kind: "note",
|
|
2457
|
+
title: "Cook at hip height",
|
|
2458
|
+
body: "A tailgate puts the grate at 34 inches — the same as a kitchen counter. Your back will thank you on day three.",
|
|
2459
|
+
link: {
|
|
2460
|
+
type: "page",
|
|
2461
|
+
href: "/journal/tailgate-kitchen",
|
|
2462
|
+
label: "Set up a tailgate kitchen",
|
|
2463
|
+
title: "Tailgate kitchen"
|
|
2464
|
+
},
|
|
2465
|
+
cardSide: "left"
|
|
2466
|
+
}
|
|
2467
|
+
],
|
|
2468
|
+
pinStyle: "number",
|
|
2469
|
+
usePulse: true,
|
|
2470
|
+
theme: "light"
|
|
2471
|
+
},
|
|
2472
|
+
notes: {
|
|
2473
|
+
why: "Each hotspot stores its position as PERCENTAGES of the image (x, y 0–100), not pixels, so pins stay put at every screen size — which is why the image's crop must not change after pins are placed. A pin opens either a PRODUCT (a Shopify reference — name, price and stock stay live, never copied) or a NOTE (title/body/link); the `kind` select shows only the relevant fields. Every pin needs a text label because pins are tiny buttons with no visible text. The phone image is optional and shows the hotspots as a list, since pins on a small crop are unusable.",
|
|
2474
|
+
sanity: "`sanity-plugin-hotspot-array` gives a visual point picker storing `x`/`y` %; items `{x, y, kind, product: reference, title, body}`.",
|
|
2475
|
+
htmlSignals: [
|
|
2476
|
+
"A relatively-positioned image wrapper containing absolutely-positioned buttons with `style=\"left: 24%; top: 58%\"`",
|
|
2477
|
+
"Small circular buttons (“+”, numbers, pulsing dots) that open popovers with a product name, price and Add-to-cart",
|
|
2478
|
+
"Shopify product handles/IDs in `data-product-id`, `data-handle` or links to `/products/…` inside the popovers"
|
|
2479
|
+
],
|
|
2480
|
+
mcp: "For each positioned pin: parse `left`/`top` (or `inset`, `transform: translate`) as percentages of the wrapper → x/y (convert px using the wrapper's rendered size if needed, round to 0.5). Popover with a product link/handle → kind product + reference (resolve handle → Shopify GID); else kind note with heading → title, text → body, link → link. Label from the pin's `aria-label`, else the product title or note title. Keep the base image at its original crop.",
|
|
2481
|
+
pitfalls: [
|
|
2482
|
+
"Pixel positions break on every other screen size — always convert to %.",
|
|
2483
|
+
"Copying product price into the note text goes stale; reference the product.",
|
|
2484
|
+
"Re-cropping the image after placing pins moves every pin. A visual point picker would prevent this (schema gap)."
|
|
2485
|
+
]
|
|
2486
|
+
}
|
|
2487
|
+
},
|
|
2488
|
+
{
|
|
2489
|
+
id: "interactive-3d-lottie-embed",
|
|
2490
|
+
label: "3D model / Lottie / 360° embed",
|
|
2491
|
+
proves: "Embed kind decides file vs allow-listed URL · required still fallback + accessible name · load-on-click for performance",
|
|
2492
|
+
category: "Media & galleries",
|
|
2493
|
+
tags: [
|
|
2494
|
+
"embed",
|
|
2495
|
+
"conditional",
|
|
2496
|
+
"media-heavy",
|
|
2497
|
+
"a11y",
|
|
2498
|
+
"validation",
|
|
2499
|
+
"variants"
|
|
2500
|
+
],
|
|
2501
|
+
brand: "Caldera",
|
|
2502
|
+
previewLayout: "split",
|
|
2503
|
+
schema: interactiveEmbed,
|
|
2504
|
+
value: {
|
|
2505
|
+
_variant: "split",
|
|
2506
|
+
eyebrow: "Spin it",
|
|
2507
|
+
heading: "See how the Cable Fold folds.",
|
|
2508
|
+
body: "<p>Drag to turn it. On an iPhone, tap <strong>View in your space</strong> to put it on your own table.</p>",
|
|
2509
|
+
kind: "model",
|
|
2510
|
+
model: {
|
|
2511
|
+
name: "cable-fold.glb",
|
|
2512
|
+
size: 58e5,
|
|
2513
|
+
url: "https://cdn.caldera.co/3d/cable-fold.glb"
|
|
2514
|
+
},
|
|
2515
|
+
iosModel: {
|
|
2516
|
+
name: "cable-fold.usdz",
|
|
2517
|
+
size: 72e5,
|
|
2518
|
+
url: "https://cdn.caldera.co/3d/cable-fold.usdz"
|
|
2519
|
+
},
|
|
2520
|
+
cameraOrbit: "35deg 70deg 1.6m",
|
|
2521
|
+
useAutoRotate: true,
|
|
2522
|
+
fallback: img("cable-fold-3d-still", "The Cable Fold Grill half unfolded on a white background", 1600, 1200),
|
|
2523
|
+
label: "Interactive 3D model of the Cable Fold Grill, shown half unfolded",
|
|
2524
|
+
aspect: "4:3",
|
|
2525
|
+
loadOn: "click",
|
|
2526
|
+
theme: "light"
|
|
2527
|
+
},
|
|
2528
|
+
notes: {
|
|
2529
|
+
why: "Three very different embeds share one block because they share the hard parts: a REQUIRED still fallback (loading, slow networks, reduced motion), a REQUIRED accessible name, and a load strategy. `kind` decides what is stored — uploaded files for 3D (GLB + optional USDZ for iOS AR) and Lottie, or an iframe URL for hosted scenes. The URL is pattern-validated against an allow-list of hosts so a marketer can't paste an arbitrary site into an iframe; raw HTML/script embeds are deliberately NOT offered here (that's a developer-only code block).",
|
|
2530
|
+
sanity: "object with `kind: string`, `model: file` (accept .glb), `lottie: file`, `embedUrl: url` with `Rule.uri({scheme:['https']})` + custom host check; rendering via `<model-viewer>` / `lottie-web` in the frontend.",
|
|
2531
|
+
htmlSignals: [
|
|
2532
|
+
"`<model-viewer src=\"….glb\" ios-src=\"….usdz\" camera-orbit=… auto-rotate ar>`",
|
|
2533
|
+
"`<lottie-player>`, `<dotlottie-player>`, `lottie.loadAnimation({ path: '….json' })` or `data-animation-path`",
|
|
2534
|
+
"Iframes from `my.spline.design`, `sketchfab.com/models/…/embed`, `my.matterport.com/show`, `kuula.co/share`",
|
|
2535
|
+
"A canvas element (`<canvas>` from three.js/Spline runtime) with a poster image fallback"
|
|
2536
|
+
],
|
|
2537
|
+
mcp: "`<model-viewer>` → kind model: src → model (download the GLB), ios-src → iosModel, camera-orbit → cameraOrbit, auto-rotate → useAutoRotate, poster → fallback, alt → label. Lottie players → kind lottie: src/path → lottie file, loop/autoplay/hover/scroll triggers → loop/playOn. Allow-listed iframes → kind iframe + embedUrl; any other iframe host → do NOT import into this block — emit a developer task instead. If no poster exists, capture a screenshot of the first frame as fallback and flag it.",
|
|
2538
|
+
pitfalls: [
|
|
2539
|
+
"A 40 MB GLB will tank the page — validate size and recommend Draco/meshopt compression.",
|
|
2540
|
+
"Iframe embeds from un-vetted hosts are a security hole — the host allow-list is intentional.",
|
|
2541
|
+
"Lottie animations that loop forever must stop for reduced-motion users; the renderer shows the fallback instead."
|
|
2542
|
+
]
|
|
2543
|
+
}
|
|
2544
|
+
},
|
|
2545
|
+
{
|
|
2546
|
+
id: "mixed-media-carousel",
|
|
2547
|
+
label: "Mixed-media carousel",
|
|
2548
|
+
proves: "Polymorphic slides (photo · video · quote · product) · per-breakpoint slides visible · interval shown only with autoplay",
|
|
2549
|
+
category: "Media & galleries",
|
|
2550
|
+
tags: [
|
|
2551
|
+
"polymorphic-array",
|
|
2552
|
+
"media-heavy",
|
|
2553
|
+
"a11y",
|
|
2554
|
+
"responsive-layout",
|
|
2555
|
+
"references",
|
|
2556
|
+
"conditional",
|
|
2557
|
+
"commerce"
|
|
2558
|
+
],
|
|
2559
|
+
brand: "Caldera",
|
|
2560
|
+
previewLayout: "carousel",
|
|
2561
|
+
schema: carousel,
|
|
2562
|
+
value: {
|
|
2563
|
+
_variant: "peek",
|
|
2564
|
+
eyebrow: "Field notes",
|
|
2565
|
+
heading: "A weekend on the Deschutes.",
|
|
2566
|
+
slides: [
|
|
2567
|
+
{
|
|
2568
|
+
_key: "s1",
|
|
2569
|
+
_type: "imageSlide",
|
|
2570
|
+
image: img("deschutes-camp-dawn", "Tent and campfire on a riverbank at dawn", 1600, 1067, {
|
|
2571
|
+
x: 40,
|
|
2572
|
+
y: 55
|
|
2573
|
+
}),
|
|
2574
|
+
caption: "Dawn at Mile 12 camp."
|
|
2575
|
+
},
|
|
2576
|
+
{
|
|
2577
|
+
_key: "s2",
|
|
2578
|
+
_type: "videoSlide",
|
|
2579
|
+
video: { url: "https://cdn.caldera.co/film/deschutes-sear-loop.mp4" },
|
|
2580
|
+
poster: img("deschutes-sear-poster", "Trout searing in a skillet over coals", 1600, 1067),
|
|
2581
|
+
caption: "Trout, butter, coals. That's the recipe.",
|
|
2582
|
+
muted: true
|
|
2583
|
+
},
|
|
2584
|
+
{
|
|
2585
|
+
_key: "s3",
|
|
2586
|
+
_type: "quoteSlide",
|
|
2587
|
+
quote: "We packed one skillet for four people and three days. It was the only pan we needed.",
|
|
2588
|
+
author: "Maya Reyes",
|
|
2589
|
+
role: "Backcountry guide, Montana",
|
|
2590
|
+
photo: {
|
|
2591
|
+
url: "https://i.pravatar.cc/192?img=47",
|
|
2592
|
+
alt: "",
|
|
2593
|
+
name: "maya.jpg"
|
|
2594
|
+
},
|
|
2595
|
+
background: img("deschutes-river-dusk", "River canyon at dusk", 1600, 1067)
|
|
2596
|
+
},
|
|
2597
|
+
{
|
|
2598
|
+
_key: "s4",
|
|
2599
|
+
_type: "productSlide",
|
|
2600
|
+
product: "gid://shopify/Product/8814",
|
|
2601
|
+
image: img("deschutes-skillet-rock", "Ridge Skillet resting on a river stone", 1600, 1067),
|
|
2602
|
+
badge: "In this trip"
|
|
2603
|
+
},
|
|
2604
|
+
{
|
|
2605
|
+
_key: "s5",
|
|
2606
|
+
_type: "imageSlide",
|
|
2607
|
+
image: img("deschutes-raft", "Two rafts pulled up on a gravel bar", 1600, 1067),
|
|
2608
|
+
caption: "Lunch stop at Whitehorse Rapids.",
|
|
2609
|
+
link: {
|
|
2610
|
+
type: "page",
|
|
2611
|
+
href: "/journal/deschutes-float",
|
|
2612
|
+
label: "Read the trip",
|
|
2613
|
+
title: "Three days on the Deschutes"
|
|
2614
|
+
}
|
|
2615
|
+
}
|
|
2616
|
+
],
|
|
2617
|
+
autoplay: false,
|
|
2618
|
+
interval: 6,
|
|
2619
|
+
loop: true,
|
|
2620
|
+
perViewDesktop: 2.5,
|
|
2621
|
+
perViewMobile: 1.15,
|
|
2622
|
+
controls: ["arrows", "progress"],
|
|
2623
|
+
theme: "light"
|
|
2624
|
+
},
|
|
2625
|
+
notes: {
|
|
2626
|
+
why: "Slides are a POLYMORPHIC ARRAY (`imageSlide`, `videoSlide`, `quoteSlide`, `productSlide`) because each kind needs different required fields — a video needs a poster, a product needs a live Shopify reference, a quote needs an author. Using small object types (not a slot of full blocks) keeps slides lightweight and the carousel's rendering predictable. Products are REFERENCES so price/stock stay live. Slides-per-view per breakpoint, autoplay, interval (hidden unless autoplay) and controls are design.",
|
|
2627
|
+
sanity: "`array` with `of: [{type:'imageSlide'},{type:'videoSlide'},{type:'quoteSlide'},{type:'productSlide'}]`; same polymorphic `_type` approach.",
|
|
2628
|
+
htmlSignals: [
|
|
2629
|
+
"Carousel libraries: `swiper-slide`, `splide__slide`, `embla__slide`, `glide__slide`, `keen-slider__slide`, or `scroll-snap-type: x mandatory`",
|
|
2630
|
+
"Slides with different internal structures (one `<img>`, one `<video>`, one `<blockquote>`, one product card with price)",
|
|
2631
|
+
"`slidesPerView`/`perPage` options in inline JS or `data-*` attributes; prev/next buttons, pagination dots"
|
|
2632
|
+
],
|
|
2633
|
+
mcp: "Classify each slide by content: `<video>`/video iframe → videoSlide (poster required; extract or generate one), `<blockquote>`/quote marks + name → quoteSlide, price + add-to-cart or `/products/` link → productSlide (resolve to a Shopify GID), otherwise imageSlide. Read the library config (`slidesPerView`, breakpoints, `autoplay.delay`, `loop`) → perViewDesktop/perViewMobile, autoplay + interval (ms → s), loop. Pagination/arrows/progress elements → controls. Ignore cloned slides (`swiper-slide-duplicate`, `aria-hidden` clones).",
|
|
2634
|
+
pitfalls: ["Loop mode clones slides in the DOM — import only originals.", "Autoplaying carousels need a pause control and must stop on focus (WCAG 2.2.2); the renderer adds both."]
|
|
2635
|
+
}
|
|
2636
|
+
},
|
|
2637
|
+
{
|
|
2638
|
+
id: "parallax-image-overlay",
|
|
2639
|
+
label: "Full-bleed parallax image with overlay text",
|
|
2640
|
+
proves: "Art-directed phone image · decorative flag · 9-position text grid shown only when there is text · parallax strength only for the parallax variant",
|
|
2641
|
+
category: "Media & galleries",
|
|
2642
|
+
tags: [
|
|
2643
|
+
"media-heavy",
|
|
2644
|
+
"a11y",
|
|
2645
|
+
"responsive-layout",
|
|
2646
|
+
"variants",
|
|
2647
|
+
"conditional"
|
|
2648
|
+
],
|
|
2649
|
+
brand: "Tidewater Hotel",
|
|
2650
|
+
previewLayout: "media",
|
|
2651
|
+
schema: parallax,
|
|
2652
|
+
value: {
|
|
2653
|
+
_variant: "parallax",
|
|
2654
|
+
eyebrow: "The coast",
|
|
2655
|
+
heading: "Where the tide sets the schedule.",
|
|
2656
|
+
body: "Ninety rooms on a quiet stretch of the Oregon coast. No resort fee, no wristbands.",
|
|
2657
|
+
button: {
|
|
2658
|
+
label: "Check availability",
|
|
2659
|
+
href: "/book",
|
|
2660
|
+
type: "page",
|
|
2661
|
+
title: "Book",
|
|
2662
|
+
style: "primary",
|
|
2663
|
+
arrow: true
|
|
2664
|
+
},
|
|
2665
|
+
image: img("tidewater-coast-aerial", "Aerial view of the hotel above a long empty beach at low tide", 2400, 1200, {
|
|
2666
|
+
x: 62,
|
|
2667
|
+
y: 48
|
|
2668
|
+
}),
|
|
2669
|
+
mobileImage: img("tidewater-coast-portrait", "The hotel's dune boardwalk leading to the beach", 1080, 1600, {
|
|
2670
|
+
x: 50,
|
|
2671
|
+
y: 60
|
|
2672
|
+
}),
|
|
2673
|
+
isDecorative: false,
|
|
2674
|
+
credit: "Photo: Jonah Reyes",
|
|
2675
|
+
position: "bottom-left",
|
|
2676
|
+
overlay: 45,
|
|
2677
|
+
overlayStyle: "gradient",
|
|
2678
|
+
height: "tall",
|
|
2679
|
+
intensity: 20
|
|
2680
|
+
},
|
|
2681
|
+
notes: {
|
|
2682
|
+
why: "A full-bleed image is mostly DESIGN with a little content: the photo, an optional art-directed phone crop (a 2:1 landscape becomes a sliver on phones), and optional overlay text. Focal points live on the image values so automatic crops keep the subject. `isDecorative` is explicit because empty alt must be a decision, not an accident. Text position, overlay (with a recommended 35–55% range in the help), height and parallax strength are design; position only shows when there is a heading, and parallax strength only for the parallax variant. The renderer disables parallax for reduced motion and on iOS where `background-attachment: fixed` is unsupported.",
|
|
2683
|
+
sanity: "object with `image` (hotspot: true), `mobileImage`, `isDecorative: boolean`, `overlay: number`, `position: string`; parallax is a frontend concern.",
|
|
2684
|
+
htmlSignals: [
|
|
2685
|
+
"A full-viewport-width section with `background-image` and `background-attachment: fixed`, or an `<img>` translated on scroll (`data-speed`, `data-parallax`, Rellax, GSAP ScrollTrigger)",
|
|
2686
|
+
"A gradient/scrim overlay (`linear-gradient(rgba(0,0,0,.5)…)`, an absolutely positioned dark `div`)",
|
|
2687
|
+
"`<picture>` with `<source media=\"(max-width: …)\">` providing a different crop for phones",
|
|
2688
|
+
"Little or no text — a heading and maybe one button — positioned in a corner"
|
|
2689
|
+
],
|
|
2690
|
+
mcp: "Background image or `<img>` → image (largest source); a `<picture><source media>` for small screens → mobileImage. Empty `alt=\"\"` or `role=\"presentation\"` → isDecorative true. Scrim opacity → overlay (gradient vs flat from the background value). Text block alignment (flex justify/alignment) → position. Section height in vh → height (≥95 → screen, ≥75 → tall, else medium). `background-attachment: fixed` → variant fixed; scroll-linked transforms → parallax with intensity from the speed factor; none → static. Photo credit text → credit.",
|
|
2691
|
+
pitfalls: [
|
|
2692
|
+
"`background-attachment: fixed` doesn't work on iOS Safari — the renderer falls back to static.",
|
|
2693
|
+
"Text over a busy photo fails contrast; the overlay help gives a range and the renderer checks contrast.",
|
|
2694
|
+
"A background-image has no alt — converting to an `<img>` with alt (or decorative) is part of the import."
|
|
2695
|
+
]
|
|
2696
|
+
}
|
|
2697
|
+
},
|
|
2698
|
+
{
|
|
2699
|
+
id: "ugc-social-feed",
|
|
2700
|
+
label: "Social photo feed (UGC)",
|
|
2701
|
+
proves: "Connected account vs approved hashtag vs hand-picked · developer-locked connection · rights + permalink required per photo",
|
|
2702
|
+
category: "Media & galleries",
|
|
2703
|
+
tags: [
|
|
2704
|
+
"dynamic-query",
|
|
2705
|
+
"embed",
|
|
2706
|
+
"conditional",
|
|
2707
|
+
"media-heavy",
|
|
2708
|
+
"references",
|
|
2709
|
+
"commerce",
|
|
2710
|
+
"validation"
|
|
2711
|
+
],
|
|
2712
|
+
brand: "Caldera",
|
|
2713
|
+
previewLayout: "gallery",
|
|
2714
|
+
schema: ugcFeed,
|
|
2715
|
+
value: {
|
|
2716
|
+
_variant: "grid",
|
|
2717
|
+
heading: "#cookedoncaldera",
|
|
2718
|
+
followButton: {
|
|
2719
|
+
label: "Follow @calderaoutside",
|
|
2720
|
+
href: "https://www.instagram.com/calderaoutside",
|
|
2721
|
+
type: "url",
|
|
2722
|
+
style: "outline",
|
|
2723
|
+
newTab: true
|
|
2724
|
+
},
|
|
2725
|
+
source: "manual",
|
|
2726
|
+
account: "@calderaoutside",
|
|
2727
|
+
limit: 8,
|
|
2728
|
+
posts: [
|
|
2729
|
+
{
|
|
2730
|
+
_key: "u1",
|
|
2731
|
+
image: img("ugc-dutch-oven-snow", "Dutch oven on coals in fresh snow", 1080, 1080),
|
|
2732
|
+
handle: "@wintercamper",
|
|
2733
|
+
permalink: "https://www.instagram.com/p/C8wq1LzS0aB/",
|
|
2734
|
+
hasRights: true,
|
|
2735
|
+
products: ["gid://shopify/Product/8813"]
|
|
2736
|
+
},
|
|
2737
|
+
{
|
|
2738
|
+
_key: "u2",
|
|
2739
|
+
image: img("ugc-skillet-pancakes", "Blueberry pancakes in a skillet on a camp stove", 1080, 1080),
|
|
2740
|
+
handle: "@sierrasunday",
|
|
2741
|
+
permalink: "https://www.instagram.com/p/C8zT4mGJ9kQ/",
|
|
2742
|
+
hasRights: true,
|
|
2743
|
+
products: ["gid://shopify/Product/8814"]
|
|
2744
|
+
},
|
|
2745
|
+
{
|
|
2746
|
+
_key: "u3",
|
|
2747
|
+
image: img("ugc-grill-beach", "Cable Fold grill on a beach fire at sunset", 1080, 1080),
|
|
2748
|
+
handle: "@coastcooks",
|
|
2749
|
+
permalink: "https://www.instagram.com/p/C90bR2nLx4e/",
|
|
2750
|
+
hasRights: true,
|
|
2751
|
+
products: ["gid://shopify/Product/8812"]
|
|
2752
|
+
},
|
|
2753
|
+
{
|
|
2754
|
+
_key: "u4",
|
|
2755
|
+
image: img("ugc-kettle-summit", "Trail Kettle steaming on a summit rock", 1080, 1080),
|
|
2756
|
+
handle: "@theohikes",
|
|
2757
|
+
permalink: "https://www.instagram.com/p/C92XvQ8Ln1s/",
|
|
2758
|
+
hasRights: true,
|
|
2759
|
+
products: []
|
|
2760
|
+
}
|
|
2761
|
+
],
|
|
2762
|
+
columns: 4,
|
|
2763
|
+
theme: "light"
|
|
2764
|
+
},
|
|
2765
|
+
notes: {
|
|
2766
|
+
why: "A social feed is a DYNAMIC source, not content: the connected account is developer-locked (credentials live in Integrations), hashtag mode only shows posts approved in the media library, and manual mode stores hand-picked photos. Picked photos carry a required permalink and a required rights flag because UGC reposting needs the creator's permission. Products shown in a photo are references so “Shop this photo” stays live. We never store an embed script — the renderer fetches through the integration and caches.",
|
|
2767
|
+
sanity: "usually not modelled in Sanity at all (a third-party widget); a manual version is `array<object{image, handle, permalink, hasRights, products: array<reference>}>`.",
|
|
2768
|
+
htmlSignals: [
|
|
2769
|
+
"Instagram widget scripts/markup: `elfsight`, `snapwidget`, `curator.io`, `taggbox`, `behold.so`, `juicer.io`, `instafeed`",
|
|
2770
|
+
"A grid of square images linking to `instagram.com/p/…` or `tiktok.com/@…/video/…`",
|
|
2771
|
+
"A heading with a hashtag or @handle and a “Follow us” button"
|
|
2772
|
+
],
|
|
2773
|
+
mcp: "If a feed widget script is present: source account (or hashtag if the widget config names one), copy the handle into the developer task to connect the integration — do NOT copy the widget script. If the grid is static images linking to posts: source manual, each tile → a post with permalink from the link, handle from the alt/caption, hasRights false + flag for review. Products tagged in a tile (shop-the-look overlays) → products references.",
|
|
2774
|
+
pitfalls: ["Widget scripts from UGC vendors add 200–500 KB and third-party cookies — replace, don't import.", "Never mark rightsGranted true on import; only a person can confirm permission."]
|
|
2775
|
+
}
|
|
2776
|
+
}
|
|
2777
|
+
];
|
|
2778
|
+
//#endregion
|
|
2779
|
+
export { ENTRIES };
|
|
2780
|
+
|
|
2781
|
+
//# sourceMappingURL=media.entries.js.map
|