@flextudio/scenario 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +202 -0
- package/README.md +260 -0
- package/bin/flex-scenario.mjs +895 -0
- package/commands/flex-spec.md +28 -0
- package/contract-data/README.md +267 -0
- package/contract-data/examples/README.md +147 -0
- package/contract-data/examples/basic/basic-list-detail.json +2521 -0
- package/contract-data/examples/basic/delivery-address-popup.json +2175 -0
- package/contract-data/examples/basic/fixedtop-floating-form.json +1524 -0
- package/contract-data/examples/basic/search-period-popup.json +1524 -0
- package/contract-data/examples/design/booking-wizard-3step.json +1335 -0
- package/contract-data/examples/design/list-detail-form-3step.json +1516 -0
- package/contract-data/examples/design/list-filter-2step.json +1365 -0
- package/contract-data/examples/design/list-filter-detail-3step.json +1570 -0
- package/contract-data/examples/design/result-entry-wizard-4step.json +1861 -0
- package/contract-data/examples/intent/mock-employee-list.json +54 -0
- package/contract-data/examples/intent/script-cart-flow.json +96 -0
- package/contract-data/examples/intent/script-dialog-confirm.json +61 -0
- package/contract-data/runtime/v1/collection/README.md +119 -0
- package/contract-data/runtime/v1/collection/_c.md +205 -0
- package/contract-data/runtime/v1/collection/category.md +165 -0
- package/contract-data/runtime/v1/collection/collection.md +135 -0
- package/contract-data/runtime/v1/collection/lifecycle.md +140 -0
- package/contract-data/runtime/v1/collection/naming.md +174 -0
- package/contract-data/runtime/v1/collection/sector.md +176 -0
- package/contract-data/runtime/v1/collection/status.md +114 -0
- package/contract-data/runtime/v1/intent-system/INTENT.md +552 -0
- package/contract-data/runtime/v1/intent-system/README.md +118 -0
- package/contract-data/runtime/v1/intent-system/intent.schema.json +164 -0
- package/contract-data/runtime/v1/intent-system/kinds/_base.mjs +137 -0
- package/contract-data/runtime/v1/intent-system/kinds/clearCategory.mjs +35 -0
- package/contract-data/runtime/v1/intent-system/kinds/copyStepValues.mjs +100 -0
- package/contract-data/runtime/v1/intent-system/kinds/deleteActive.mjs +45 -0
- package/contract-data/runtime/v1/intent-system/kinds/dialog.mjs +127 -0
- package/contract-data/runtime/v1/intent-system/kinds/reloadGroup.mjs +28 -0
- package/contract-data/runtime/v1/intent-system/kinds/updateActive.mjs +74 -0
- package/contract-data/runtime/v1/intent-system/materialize.mjs +495 -0
- package/contract-data/runtime/v1/script/README.md +37 -0
- package/contract-data/runtime/v1/script/current_step.md +112 -0
- package/contract-data/runtime/v1/script/f_collection.md +142 -0
- package/contract-data/runtime/v1/script/f_content.md +133 -0
- package/contract-data/runtime/v1/script/f_messagebox.md +132 -0
- package/contract-data/runtime/v1/script/scenario-gen-rules.md +264 -0
- package/contract-data/schema/v1/SKELETON-SHELL.md +120 -0
- package/contract-data/schema/v1/bottom-buttons.md +155 -0
- package/contract-data/schema/v1/bottom-buttons.schema.json +134 -0
- package/contract-data/schema/v1/control/_base.schema.json +1296 -0
- package/contract-data/schema/v1/control/button.md +147 -0
- package/contract-data/schema/v1/control/button.schema.json +55 -0
- package/contract-data/schema/v1/control/calendar-navigator.md +143 -0
- package/contract-data/schema/v1/control/calendar-navigator.schema.json +164 -0
- package/contract-data/schema/v1/control/calendar.md +128 -0
- package/contract-data/schema/v1/control/calendar.schema.json +18 -0
- package/contract-data/schema/v1/control/check-box.md +117 -0
- package/contract-data/schema/v1/control/check-box.schema.json +41 -0
- package/contract-data/schema/v1/control/combo.md +293 -0
- package/contract-data/schema/v1/control/combo.schema.json +23 -0
- package/contract-data/schema/v1/control/embed.md +211 -0
- package/contract-data/schema/v1/control/embed.schema.json +30 -0
- package/contract-data/schema/v1/control/image-box.md +237 -0
- package/contract-data/schema/v1/control/image-box.schema.json +49 -0
- package/contract-data/schema/v1/control/input-date.md +175 -0
- package/contract-data/schema/v1/control/input-date.schema.json +27 -0
- package/contract-data/schema/v1/control/input-file.md +192 -0
- package/contract-data/schema/v1/control/input-file.schema.json +139 -0
- package/contract-data/schema/v1/control/input-mask.md +89 -0
- package/contract-data/schema/v1/control/input-mask.schema.json +45 -0
- package/contract-data/schema/v1/control/input-number.md +55 -0
- package/contract-data/schema/v1/control/input-number.schema.json +24 -0
- package/contract-data/schema/v1/control/input-text.md +73 -0
- package/contract-data/schema/v1/control/input-text.schema.json +24 -0
- package/contract-data/schema/v1/control/label.md +127 -0
- package/contract-data/schema/v1/control/label.schema.json +113 -0
- package/contract-data/schema/v1/control/multi-input-box.md +51 -0
- package/contract-data/schema/v1/control/multi-input-box.schema.json +19 -0
- package/contract-data/schema/v1/control/other.schema.json +24 -0
- package/contract-data/schema/v1/control/radio-box.md +150 -0
- package/contract-data/schema/v1/control/radio-box.schema.json +87 -0
- package/contract-data/schema/v1/control/search.md +163 -0
- package/contract-data/schema/v1/control/search.schema.json +23 -0
- package/contract-data/schema/v1/control/tab.md +240 -0
- package/contract-data/schema/v1/control/tab.schema.json +112 -0
- package/contract-data/schema/v1/control/tree.md +278 -0
- package/contract-data/schema/v1/control/tree.schema.json +83 -0
- package/contract-data/schema/v1/control.md +264 -0
- package/contract-data/schema/v1/control.schema.json +30 -0
- package/contract-data/schema/v1/data-objects.md +278 -0
- package/contract-data/schema/v1/data-objects.schema.json +161 -0
- package/contract-data/schema/v1/data-sources.md +215 -0
- package/contract-data/schema/v1/data-sources.schema.json +184 -0
- package/contract-data/schema/v1/design-system/DESIGN.md +282 -0
- package/contract-data/schema/v1/design-system/README.md +235 -0
- package/contract-data/schema/v1/design-system/design.schema.json +496 -0
- package/contract-data/schema/v1/design-system/error-mapping.mjs +132 -0
- package/contract-data/schema/v1/design-system/materialize.mjs +1435 -0
- package/contract-data/schema/v1/design-system/tests/_base.additional-meta.test.mjs +98 -0
- package/contract-data/schema/v1/design-system/tests/_base.materialize.test.mjs +596 -0
- package/contract-data/schema/v1/design-system/tests/checklist.test.mjs +135 -0
- package/contract-data/schema/v1/design-system/tests/design.schema.test.mjs +487 -0
- package/contract-data/schema/v1/design-system/tests/error-mapping.test.mjs +244 -0
- package/contract-data/schema/v1/design-system/tests/materialize.test.mjs +1093 -0
- package/contract-data/schema/v1/design-system/tests/move-step.test.mjs +119 -0
- package/contract-data/schema/v1/design-system/tests/override.integration.test.mjs +116 -0
- package/contract-data/schema/v1/design-system/tokens.json +76 -0
- package/contract-data/schema/v1/events.md +467 -0
- package/contract-data/schema/v1/events.schema.json +272 -0
- package/contract-data/schema/v1/group.md +146 -0
- package/contract-data/schema/v1/group.schema.json +133 -0
- package/contract-data/schema/v1/mockup-data.md +186 -0
- package/contract-data/schema/v1/naming-objects.schema.json +133 -0
- package/contract-data/schema/v1/node.md +32 -0
- package/contract-data/schema/v1/node.schema.json +24 -0
- package/contract-data/schema/v1/patterns/_base.additional-meta.mjs +135 -0
- package/contract-data/schema/v1/patterns/_base.controls.mjs +759 -0
- package/contract-data/schema/v1/patterns/_base.icon.mjs +61 -0
- package/contract-data/schema/v1/patterns/_base.id.mjs +15 -0
- package/contract-data/schema/v1/patterns/_base.materialize.mjs +1181 -0
- package/contract-data/schema/v1/patterns/_base.style.mjs +312 -0
- package/contract-data/schema/v1/patterns/atom/badge.materialize.mjs +68 -0
- package/contract-data/schema/v1/patterns/atom/badge.schema.json +44 -0
- package/contract-data/schema/v1/patterns/atom/button.materialize.mjs +91 -0
- package/contract-data/schema/v1/patterns/atom/button.schema.json +70 -0
- package/contract-data/schema/v1/patterns/atom/checkbox.materialize.mjs +40 -0
- package/contract-data/schema/v1/patterns/atom/checkbox.schema.json +39 -0
- package/contract-data/schema/v1/patterns/atom/segmented-radio.materialize.mjs +67 -0
- package/contract-data/schema/v1/patterns/atom/segmented-radio.schema.json +49 -0
- package/contract-data/schema/v1/patterns/atom/switch.materialize.mjs +58 -0
- package/contract-data/schema/v1/patterns/atom/switch.schema.json +27 -0
- package/contract-data/schema/v1/patterns/molecule/checklist.materialize.mjs +130 -0
- package/contract-data/schema/v1/patterns/molecule/checklist.schema.json +63 -0
- package/contract-data/schema/v1/patterns/molecule/input-action.materialize.mjs +356 -0
- package/contract-data/schema/v1/patterns/molecule/input-action.schema.json +251 -0
- package/contract-data/schema/v1/patterns/molecule/input-button.materialize.mjs +183 -0
- package/contract-data/schema/v1/patterns/molecule/input-button.schema.json +141 -0
- package/contract-data/schema/v1/patterns/molecule/input-pair.materialize.mjs +254 -0
- package/contract-data/schema/v1/patterns/molecule/input-pair.schema.json +210 -0
- package/contract-data/schema/v1/scenario.md +112 -0
- package/contract-data/schema/v1/scenario.schema.json +161 -0
- package/contract-data/schema/v1/service/CustomSystem.md +139 -0
- package/contract-data/schema/v1/service/CustomSystem.schema.json +41 -0
- package/contract-data/schema/v1/service/Firestore.md +125 -0
- package/contract-data/schema/v1/service/Firestore.schema.json +28 -0
- package/contract-data/schema/v1/service/FlexAutoQuery.md +128 -0
- package/contract-data/schema/v1/service/FlexAutoQuery.schema.json +35 -0
- package/contract-data/schema/v1/service/FlexSQL.md +96 -0
- package/contract-data/schema/v1/service/FlexSQL.schema.json +33 -0
- package/contract-data/schema/v1/service/Flextudio API.md +161 -0
- package/contract-data/schema/v1/service/Flextudio API.schema.json +115 -0
- package/contract-data/schema/v1/service/Flextudio.md +87 -0
- package/contract-data/schema/v1/service/Flextudio.schema.json +26 -0
- package/contract-data/schema/v1/service/GoogleSheet.md +71 -0
- package/contract-data/schema/v1/service/GoogleSheet.schema.json +31 -0
- package/contract-data/schema/v1/service/README.md +127 -0
- package/contract-data/schema/v1/service/_base.schema.json +31 -0
- package/contract-data/schema/v1/service/ksystem.md +76 -0
- package/contract-data/schema/v1/service/ksystem.schema.json +36 -0
- package/contract-data/schema/v1/service-binding.md +228 -0
- package/contract-data/schema/v1/service-binding.schema.json +51 -0
- package/contract-data/schema/v1/step.md +546 -0
- package/contract-data/schema/v1/step.schema.json +258 -0
- package/contract-data/schema/v1/style-objects.md +183 -0
- package/contract-data/schema/v1/style-objects.schema.json +155 -0
- package/contract-data/spec/catalog.json +406 -0
- package/contract-data/spec/rules.md +400 -0
- package/node_modules/@flextudio/contract-core/contract.mjs +367 -0
- package/node_modules/@flextudio/contract-core/index.mjs +16 -0
- package/node_modules/@flextudio/contract-core/package.json +21 -0
- package/node_modules/@flextudio/contract-core/paths.mjs +72 -0
- package/node_modules/@flextudio/contract-core/schemas.mjs +474 -0
- package/node_modules/@flextudio/contract-core/validators.mjs +2471 -0
- package/node_modules/ajv/.runkit_example.js +23 -0
- package/node_modules/ajv/LICENSE +22 -0
- package/node_modules/ajv/README.md +207 -0
- package/node_modules/ajv/dist/2019.d.ts +19 -0
- package/node_modules/ajv/dist/2019.js +61 -0
- package/node_modules/ajv/dist/2019.js.map +1 -0
- package/node_modules/ajv/dist/2020.d.ts +19 -0
- package/node_modules/ajv/dist/2020.js +55 -0
- package/node_modules/ajv/dist/2020.js.map +1 -0
- package/node_modules/ajv/dist/ajv.d.ts +18 -0
- package/node_modules/ajv/dist/ajv.js +50 -0
- package/node_modules/ajv/dist/ajv.js.map +1 -0
- package/node_modules/ajv/dist/compile/codegen/code.d.ts +40 -0
- package/node_modules/ajv/dist/compile/codegen/code.js +156 -0
- package/node_modules/ajv/dist/compile/codegen/code.js.map +1 -0
- package/node_modules/ajv/dist/compile/codegen/index.d.ts +79 -0
- package/node_modules/ajv/dist/compile/codegen/index.js +697 -0
- package/node_modules/ajv/dist/compile/codegen/index.js.map +1 -0
- package/node_modules/ajv/dist/compile/codegen/scope.d.ts +79 -0
- package/node_modules/ajv/dist/compile/codegen/scope.js +143 -0
- package/node_modules/ajv/dist/compile/codegen/scope.js.map +1 -0
- package/node_modules/ajv/dist/compile/errors.d.ts +13 -0
- package/node_modules/ajv/dist/compile/errors.js +123 -0
- package/node_modules/ajv/dist/compile/errors.js.map +1 -0
- package/node_modules/ajv/dist/compile/index.d.ts +80 -0
- package/node_modules/ajv/dist/compile/index.js +242 -0
- package/node_modules/ajv/dist/compile/index.js.map +1 -0
- package/node_modules/ajv/dist/compile/jtd/parse.d.ts +4 -0
- package/node_modules/ajv/dist/compile/jtd/parse.js +350 -0
- package/node_modules/ajv/dist/compile/jtd/parse.js.map +1 -0
- package/node_modules/ajv/dist/compile/jtd/serialize.d.ts +4 -0
- package/node_modules/ajv/dist/compile/jtd/serialize.js +236 -0
- package/node_modules/ajv/dist/compile/jtd/serialize.js.map +1 -0
- package/node_modules/ajv/dist/compile/jtd/types.d.ts +6 -0
- package/node_modules/ajv/dist/compile/jtd/types.js +14 -0
- package/node_modules/ajv/dist/compile/jtd/types.js.map +1 -0
- package/node_modules/ajv/dist/compile/names.d.ts +20 -0
- package/node_modules/ajv/dist/compile/names.js +28 -0
- package/node_modules/ajv/dist/compile/names.js.map +1 -0
- package/node_modules/ajv/dist/compile/ref_error.d.ts +6 -0
- package/node_modules/ajv/dist/compile/ref_error.js +12 -0
- package/node_modules/ajv/dist/compile/ref_error.js.map +1 -0
- package/node_modules/ajv/dist/compile/resolve.d.ts +12 -0
- package/node_modules/ajv/dist/compile/resolve.js +155 -0
- package/node_modules/ajv/dist/compile/resolve.js.map +1 -0
- package/node_modules/ajv/dist/compile/rules.d.ts +28 -0
- package/node_modules/ajv/dist/compile/rules.js +26 -0
- package/node_modules/ajv/dist/compile/rules.js.map +1 -0
- package/node_modules/ajv/dist/compile/util.d.ts +40 -0
- package/node_modules/ajv/dist/compile/util.js +178 -0
- package/node_modules/ajv/dist/compile/util.js.map +1 -0
- package/node_modules/ajv/dist/compile/validate/applicability.d.ts +6 -0
- package/node_modules/ajv/dist/compile/validate/applicability.js +19 -0
- package/node_modules/ajv/dist/compile/validate/applicability.js.map +1 -0
- package/node_modules/ajv/dist/compile/validate/boolSchema.d.ts +4 -0
- package/node_modules/ajv/dist/compile/validate/boolSchema.js +50 -0
- package/node_modules/ajv/dist/compile/validate/boolSchema.js.map +1 -0
- package/node_modules/ajv/dist/compile/validate/dataType.d.ts +17 -0
- package/node_modules/ajv/dist/compile/validate/dataType.js +203 -0
- package/node_modules/ajv/dist/compile/validate/dataType.js.map +1 -0
- package/node_modules/ajv/dist/compile/validate/defaults.d.ts +2 -0
- package/node_modules/ajv/dist/compile/validate/defaults.js +35 -0
- package/node_modules/ajv/dist/compile/validate/defaults.js.map +1 -0
- package/node_modules/ajv/dist/compile/validate/index.d.ts +42 -0
- package/node_modules/ajv/dist/compile/validate/index.js +520 -0
- package/node_modules/ajv/dist/compile/validate/index.js.map +1 -0
- package/node_modules/ajv/dist/compile/validate/keyword.d.ts +8 -0
- package/node_modules/ajv/dist/compile/validate/keyword.js +124 -0
- package/node_modules/ajv/dist/compile/validate/keyword.js.map +1 -0
- package/node_modules/ajv/dist/compile/validate/subschema.d.ts +47 -0
- package/node_modules/ajv/dist/compile/validate/subschema.js +81 -0
- package/node_modules/ajv/dist/compile/validate/subschema.js.map +1 -0
- package/node_modules/ajv/dist/core.d.ts +174 -0
- package/node_modules/ajv/dist/core.js +618 -0
- package/node_modules/ajv/dist/core.js.map +1 -0
- package/node_modules/ajv/dist/jtd.d.ts +47 -0
- package/node_modules/ajv/dist/jtd.js +72 -0
- package/node_modules/ajv/dist/jtd.js.map +1 -0
- package/node_modules/ajv/dist/refs/data.json +13 -0
- package/node_modules/ajv/dist/refs/json-schema-2019-09/index.d.ts +2 -0
- package/node_modules/ajv/dist/refs/json-schema-2019-09/index.js +28 -0
- package/node_modules/ajv/dist/refs/json-schema-2019-09/index.js.map +1 -0
- package/node_modules/ajv/dist/refs/json-schema-2019-09/meta/applicator.json +53 -0
- package/node_modules/ajv/dist/refs/json-schema-2019-09/meta/content.json +17 -0
- package/node_modules/ajv/dist/refs/json-schema-2019-09/meta/core.json +57 -0
- package/node_modules/ajv/dist/refs/json-schema-2019-09/meta/format.json +14 -0
- package/node_modules/ajv/dist/refs/json-schema-2019-09/meta/meta-data.json +37 -0
- package/node_modules/ajv/dist/refs/json-schema-2019-09/meta/validation.json +90 -0
- package/node_modules/ajv/dist/refs/json-schema-2019-09/schema.json +39 -0
- package/node_modules/ajv/dist/refs/json-schema-2020-12/index.d.ts +2 -0
- package/node_modules/ajv/dist/refs/json-schema-2020-12/index.js +30 -0
- package/node_modules/ajv/dist/refs/json-schema-2020-12/index.js.map +1 -0
- package/node_modules/ajv/dist/refs/json-schema-2020-12/meta/applicator.json +48 -0
- package/node_modules/ajv/dist/refs/json-schema-2020-12/meta/content.json +17 -0
- package/node_modules/ajv/dist/refs/json-schema-2020-12/meta/core.json +51 -0
- package/node_modules/ajv/dist/refs/json-schema-2020-12/meta/format-annotation.json +14 -0
- package/node_modules/ajv/dist/refs/json-schema-2020-12/meta/meta-data.json +37 -0
- package/node_modules/ajv/dist/refs/json-schema-2020-12/meta/unevaluated.json +15 -0
- package/node_modules/ajv/dist/refs/json-schema-2020-12/meta/validation.json +90 -0
- package/node_modules/ajv/dist/refs/json-schema-2020-12/schema.json +55 -0
- package/node_modules/ajv/dist/refs/json-schema-draft-06.json +137 -0
- package/node_modules/ajv/dist/refs/json-schema-draft-07.json +151 -0
- package/node_modules/ajv/dist/refs/json-schema-secure.json +88 -0
- package/node_modules/ajv/dist/refs/jtd-schema.d.ts +3 -0
- package/node_modules/ajv/dist/refs/jtd-schema.js +118 -0
- package/node_modules/ajv/dist/refs/jtd-schema.js.map +1 -0
- package/node_modules/ajv/dist/runtime/equal.d.ts +6 -0
- package/node_modules/ajv/dist/runtime/equal.js +7 -0
- package/node_modules/ajv/dist/runtime/equal.js.map +1 -0
- package/node_modules/ajv/dist/runtime/parseJson.d.ts +18 -0
- package/node_modules/ajv/dist/runtime/parseJson.js +185 -0
- package/node_modules/ajv/dist/runtime/parseJson.js.map +1 -0
- package/node_modules/ajv/dist/runtime/quote.d.ts +5 -0
- package/node_modules/ajv/dist/runtime/quote.js +30 -0
- package/node_modules/ajv/dist/runtime/quote.js.map +1 -0
- package/node_modules/ajv/dist/runtime/re2.d.ts +6 -0
- package/node_modules/ajv/dist/runtime/re2.js +6 -0
- package/node_modules/ajv/dist/runtime/re2.js.map +1 -0
- package/node_modules/ajv/dist/runtime/timestamp.d.ts +5 -0
- package/node_modules/ajv/dist/runtime/timestamp.js +42 -0
- package/node_modules/ajv/dist/runtime/timestamp.js.map +1 -0
- package/node_modules/ajv/dist/runtime/ucs2length.d.ts +5 -0
- package/node_modules/ajv/dist/runtime/ucs2length.js +24 -0
- package/node_modules/ajv/dist/runtime/ucs2length.js.map +1 -0
- package/node_modules/ajv/dist/runtime/uri.d.ts +6 -0
- package/node_modules/ajv/dist/runtime/uri.js +6 -0
- package/node_modules/ajv/dist/runtime/uri.js.map +1 -0
- package/node_modules/ajv/dist/runtime/validation_error.d.ts +7 -0
- package/node_modules/ajv/dist/runtime/validation_error.js +11 -0
- package/node_modules/ajv/dist/runtime/validation_error.js.map +1 -0
- package/node_modules/ajv/dist/standalone/index.d.ts +6 -0
- package/node_modules/ajv/dist/standalone/index.js +90 -0
- package/node_modules/ajv/dist/standalone/index.js.map +1 -0
- package/node_modules/ajv/dist/standalone/instance.d.ts +12 -0
- package/node_modules/ajv/dist/standalone/instance.js +35 -0
- package/node_modules/ajv/dist/standalone/instance.js.map +1 -0
- package/node_modules/ajv/dist/types/index.d.ts +183 -0
- package/node_modules/ajv/dist/types/index.js +3 -0
- package/node_modules/ajv/dist/types/index.js.map +1 -0
- package/node_modules/ajv/dist/types/json-schema.d.ts +125 -0
- package/node_modules/ajv/dist/types/json-schema.js +3 -0
- package/node_modules/ajv/dist/types/json-schema.js.map +1 -0
- package/node_modules/ajv/dist/types/jtd-schema.d.ts +174 -0
- package/node_modules/ajv/dist/types/jtd-schema.js +3 -0
- package/node_modules/ajv/dist/types/jtd-schema.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/applicator/additionalItems.d.ts +8 -0
- package/node_modules/ajv/dist/vocabularies/applicator/additionalItems.js +49 -0
- package/node_modules/ajv/dist/vocabularies/applicator/additionalItems.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/applicator/additionalProperties.d.ts +6 -0
- package/node_modules/ajv/dist/vocabularies/applicator/additionalProperties.js +106 -0
- package/node_modules/ajv/dist/vocabularies/applicator/additionalProperties.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/applicator/allOf.d.ts +3 -0
- package/node_modules/ajv/dist/vocabularies/applicator/allOf.js +23 -0
- package/node_modules/ajv/dist/vocabularies/applicator/allOf.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/applicator/anyOf.d.ts +4 -0
- package/node_modules/ajv/dist/vocabularies/applicator/anyOf.js +12 -0
- package/node_modules/ajv/dist/vocabularies/applicator/anyOf.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/applicator/contains.d.ts +7 -0
- package/node_modules/ajv/dist/vocabularies/applicator/contains.js +95 -0
- package/node_modules/ajv/dist/vocabularies/applicator/contains.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/applicator/dependencies.d.ts +21 -0
- package/node_modules/ajv/dist/vocabularies/applicator/dependencies.js +85 -0
- package/node_modules/ajv/dist/vocabularies/applicator/dependencies.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/applicator/dependentSchemas.d.ts +3 -0
- package/node_modules/ajv/dist/vocabularies/applicator/dependentSchemas.js +11 -0
- package/node_modules/ajv/dist/vocabularies/applicator/dependentSchemas.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/applicator/if.d.ts +6 -0
- package/node_modules/ajv/dist/vocabularies/applicator/if.js +66 -0
- package/node_modules/ajv/dist/vocabularies/applicator/if.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/applicator/index.d.ts +13 -0
- package/node_modules/ajv/dist/vocabularies/applicator/index.js +44 -0
- package/node_modules/ajv/dist/vocabularies/applicator/index.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/applicator/items.d.ts +5 -0
- package/node_modules/ajv/dist/vocabularies/applicator/items.js +52 -0
- package/node_modules/ajv/dist/vocabularies/applicator/items.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/applicator/items2020.d.ts +6 -0
- package/node_modules/ajv/dist/vocabularies/applicator/items2020.js +30 -0
- package/node_modules/ajv/dist/vocabularies/applicator/items2020.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/applicator/not.d.ts +4 -0
- package/node_modules/ajv/dist/vocabularies/applicator/not.js +26 -0
- package/node_modules/ajv/dist/vocabularies/applicator/not.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/applicator/oneOf.d.ts +6 -0
- package/node_modules/ajv/dist/vocabularies/applicator/oneOf.js +60 -0
- package/node_modules/ajv/dist/vocabularies/applicator/oneOf.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/applicator/patternProperties.d.ts +3 -0
- package/node_modules/ajv/dist/vocabularies/applicator/patternProperties.js +75 -0
- package/node_modules/ajv/dist/vocabularies/applicator/patternProperties.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/applicator/prefixItems.d.ts +3 -0
- package/node_modules/ajv/dist/vocabularies/applicator/prefixItems.js +12 -0
- package/node_modules/ajv/dist/vocabularies/applicator/prefixItems.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/applicator/properties.d.ts +3 -0
- package/node_modules/ajv/dist/vocabularies/applicator/properties.js +54 -0
- package/node_modules/ajv/dist/vocabularies/applicator/properties.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/applicator/propertyNames.d.ts +6 -0
- package/node_modules/ajv/dist/vocabularies/applicator/propertyNames.js +38 -0
- package/node_modules/ajv/dist/vocabularies/applicator/propertyNames.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/applicator/thenElse.d.ts +3 -0
- package/node_modules/ajv/dist/vocabularies/applicator/thenElse.js +13 -0
- package/node_modules/ajv/dist/vocabularies/applicator/thenElse.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/code.d.ts +17 -0
- package/node_modules/ajv/dist/vocabularies/code.js +131 -0
- package/node_modules/ajv/dist/vocabularies/code.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/core/id.d.ts +3 -0
- package/node_modules/ajv/dist/vocabularies/core/id.js +10 -0
- package/node_modules/ajv/dist/vocabularies/core/id.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/core/index.d.ts +3 -0
- package/node_modules/ajv/dist/vocabularies/core/index.js +16 -0
- package/node_modules/ajv/dist/vocabularies/core/index.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/core/ref.d.ts +8 -0
- package/node_modules/ajv/dist/vocabularies/core/ref.js +122 -0
- package/node_modules/ajv/dist/vocabularies/core/ref.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/discriminator/index.d.ts +5 -0
- package/node_modules/ajv/dist/vocabularies/discriminator/index.js +104 -0
- package/node_modules/ajv/dist/vocabularies/discriminator/index.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/discriminator/types.d.ts +10 -0
- package/node_modules/ajv/dist/vocabularies/discriminator/types.js +9 -0
- package/node_modules/ajv/dist/vocabularies/discriminator/types.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/draft2020.d.ts +3 -0
- package/node_modules/ajv/dist/vocabularies/draft2020.js +23 -0
- package/node_modules/ajv/dist/vocabularies/draft2020.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/draft7.d.ts +3 -0
- package/node_modules/ajv/dist/vocabularies/draft7.js +17 -0
- package/node_modules/ajv/dist/vocabularies/draft7.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/dynamic/dynamicAnchor.d.ts +5 -0
- package/node_modules/ajv/dist/vocabularies/dynamic/dynamicAnchor.js +30 -0
- package/node_modules/ajv/dist/vocabularies/dynamic/dynamicAnchor.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/dynamic/dynamicRef.d.ts +5 -0
- package/node_modules/ajv/dist/vocabularies/dynamic/dynamicRef.js +51 -0
- package/node_modules/ajv/dist/vocabularies/dynamic/dynamicRef.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/dynamic/index.d.ts +3 -0
- package/node_modules/ajv/dist/vocabularies/dynamic/index.js +9 -0
- package/node_modules/ajv/dist/vocabularies/dynamic/index.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/dynamic/recursiveAnchor.d.ts +3 -0
- package/node_modules/ajv/dist/vocabularies/dynamic/recursiveAnchor.js +16 -0
- package/node_modules/ajv/dist/vocabularies/dynamic/recursiveAnchor.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/dynamic/recursiveRef.d.ts +3 -0
- package/node_modules/ajv/dist/vocabularies/dynamic/recursiveRef.js +10 -0
- package/node_modules/ajv/dist/vocabularies/dynamic/recursiveRef.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/errors.d.ts +9 -0
- package/node_modules/ajv/dist/vocabularies/errors.js +3 -0
- package/node_modules/ajv/dist/vocabularies/errors.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/format/format.d.ts +8 -0
- package/node_modules/ajv/dist/vocabularies/format/format.js +92 -0
- package/node_modules/ajv/dist/vocabularies/format/format.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/format/index.d.ts +3 -0
- package/node_modules/ajv/dist/vocabularies/format/index.js +6 -0
- package/node_modules/ajv/dist/vocabularies/format/index.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/jtd/discriminator.d.ts +6 -0
- package/node_modules/ajv/dist/vocabularies/jtd/discriminator.js +71 -0
- package/node_modules/ajv/dist/vocabularies/jtd/discriminator.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/jtd/elements.d.ts +5 -0
- package/node_modules/ajv/dist/vocabularies/jtd/elements.js +24 -0
- package/node_modules/ajv/dist/vocabularies/jtd/elements.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/jtd/enum.d.ts +6 -0
- package/node_modules/ajv/dist/vocabularies/jtd/enum.js +43 -0
- package/node_modules/ajv/dist/vocabularies/jtd/enum.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/jtd/error.d.ts +9 -0
- package/node_modules/ajv/dist/vocabularies/jtd/error.js +20 -0
- package/node_modules/ajv/dist/vocabularies/jtd/error.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/jtd/index.d.ts +10 -0
- package/node_modules/ajv/dist/vocabularies/jtd/index.js +29 -0
- package/node_modules/ajv/dist/vocabularies/jtd/index.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/jtd/metadata.d.ts +5 -0
- package/node_modules/ajv/dist/vocabularies/jtd/metadata.js +25 -0
- package/node_modules/ajv/dist/vocabularies/jtd/metadata.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/jtd/nullable.d.ts +4 -0
- package/node_modules/ajv/dist/vocabularies/jtd/nullable.js +22 -0
- package/node_modules/ajv/dist/vocabularies/jtd/nullable.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/jtd/optionalProperties.d.ts +3 -0
- package/node_modules/ajv/dist/vocabularies/jtd/optionalProperties.js +15 -0
- package/node_modules/ajv/dist/vocabularies/jtd/optionalProperties.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/jtd/properties.d.ts +22 -0
- package/node_modules/ajv/dist/vocabularies/jtd/properties.js +149 -0
- package/node_modules/ajv/dist/vocabularies/jtd/properties.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/jtd/ref.d.ts +4 -0
- package/node_modules/ajv/dist/vocabularies/jtd/ref.js +67 -0
- package/node_modules/ajv/dist/vocabularies/jtd/ref.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/jtd/type.d.ts +10 -0
- package/node_modules/ajv/dist/vocabularies/jtd/type.js +69 -0
- package/node_modules/ajv/dist/vocabularies/jtd/type.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/jtd/union.d.ts +3 -0
- package/node_modules/ajv/dist/vocabularies/jtd/union.js +12 -0
- package/node_modules/ajv/dist/vocabularies/jtd/union.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/jtd/values.d.ts +5 -0
- package/node_modules/ajv/dist/vocabularies/jtd/values.js +51 -0
- package/node_modules/ajv/dist/vocabularies/jtd/values.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/metadata.d.ts +3 -0
- package/node_modules/ajv/dist/vocabularies/metadata.js +18 -0
- package/node_modules/ajv/dist/vocabularies/metadata.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/next.d.ts +3 -0
- package/node_modules/ajv/dist/vocabularies/next.js +8 -0
- package/node_modules/ajv/dist/vocabularies/next.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/unevaluated/index.d.ts +3 -0
- package/node_modules/ajv/dist/vocabularies/unevaluated/index.js +7 -0
- package/node_modules/ajv/dist/vocabularies/unevaluated/index.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/unevaluated/unevaluatedItems.d.ts +6 -0
- package/node_modules/ajv/dist/vocabularies/unevaluated/unevaluatedItems.js +40 -0
- package/node_modules/ajv/dist/vocabularies/unevaluated/unevaluatedItems.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/unevaluated/unevaluatedProperties.d.ts +6 -0
- package/node_modules/ajv/dist/vocabularies/unevaluated/unevaluatedProperties.js +65 -0
- package/node_modules/ajv/dist/vocabularies/unevaluated/unevaluatedProperties.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/validation/const.d.ts +6 -0
- package/node_modules/ajv/dist/vocabularies/validation/const.js +25 -0
- package/node_modules/ajv/dist/vocabularies/validation/const.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/validation/dependentRequired.d.ts +5 -0
- package/node_modules/ajv/dist/vocabularies/validation/dependentRequired.js +12 -0
- package/node_modules/ajv/dist/vocabularies/validation/dependentRequired.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/validation/enum.d.ts +8 -0
- package/node_modules/ajv/dist/vocabularies/validation/enum.js +48 -0
- package/node_modules/ajv/dist/vocabularies/validation/enum.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/validation/index.d.ts +16 -0
- package/node_modules/ajv/dist/vocabularies/validation/index.js +33 -0
- package/node_modules/ajv/dist/vocabularies/validation/index.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/validation/limitContains.d.ts +3 -0
- package/node_modules/ajv/dist/vocabularies/validation/limitContains.js +15 -0
- package/node_modules/ajv/dist/vocabularies/validation/limitContains.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/validation/limitItems.d.ts +3 -0
- package/node_modules/ajv/dist/vocabularies/validation/limitItems.js +24 -0
- package/node_modules/ajv/dist/vocabularies/validation/limitItems.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/validation/limitLength.d.ts +3 -0
- package/node_modules/ajv/dist/vocabularies/validation/limitLength.js +27 -0
- package/node_modules/ajv/dist/vocabularies/validation/limitLength.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/validation/limitNumber.d.ts +11 -0
- package/node_modules/ajv/dist/vocabularies/validation/limitNumber.js +27 -0
- package/node_modules/ajv/dist/vocabularies/validation/limitNumber.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/validation/limitProperties.d.ts +3 -0
- package/node_modules/ajv/dist/vocabularies/validation/limitProperties.js +24 -0
- package/node_modules/ajv/dist/vocabularies/validation/limitProperties.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/validation/multipleOf.d.ts +8 -0
- package/node_modules/ajv/dist/vocabularies/validation/multipleOf.js +26 -0
- package/node_modules/ajv/dist/vocabularies/validation/multipleOf.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/validation/pattern.d.ts +8 -0
- package/node_modules/ajv/dist/vocabularies/validation/pattern.js +33 -0
- package/node_modules/ajv/dist/vocabularies/validation/pattern.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/validation/required.d.ts +8 -0
- package/node_modules/ajv/dist/vocabularies/validation/required.js +79 -0
- package/node_modules/ajv/dist/vocabularies/validation/required.js.map +1 -0
- package/node_modules/ajv/dist/vocabularies/validation/uniqueItems.d.ts +9 -0
- package/node_modules/ajv/dist/vocabularies/validation/uniqueItems.js +64 -0
- package/node_modules/ajv/dist/vocabularies/validation/uniqueItems.js.map +1 -0
- package/node_modules/ajv/lib/2019.ts +81 -0
- package/node_modules/ajv/lib/2020.ts +75 -0
- package/node_modules/ajv/lib/ajv.ts +70 -0
- package/node_modules/ajv/lib/compile/codegen/code.ts +169 -0
- package/node_modules/ajv/lib/compile/codegen/index.ts +852 -0
- package/node_modules/ajv/lib/compile/codegen/scope.ts +215 -0
- package/node_modules/ajv/lib/compile/errors.ts +184 -0
- package/node_modules/ajv/lib/compile/index.ts +324 -0
- package/node_modules/ajv/lib/compile/jtd/parse.ts +411 -0
- package/node_modules/ajv/lib/compile/jtd/serialize.ts +277 -0
- package/node_modules/ajv/lib/compile/jtd/types.ts +16 -0
- package/node_modules/ajv/lib/compile/names.ts +27 -0
- package/node_modules/ajv/lib/compile/ref_error.ts +13 -0
- package/node_modules/ajv/lib/compile/resolve.ts +149 -0
- package/node_modules/ajv/lib/compile/rules.ts +50 -0
- package/node_modules/ajv/lib/compile/util.ts +213 -0
- package/node_modules/ajv/lib/compile/validate/applicability.ts +22 -0
- package/node_modules/ajv/lib/compile/validate/boolSchema.ts +47 -0
- package/node_modules/ajv/lib/compile/validate/dataType.ts +230 -0
- package/node_modules/ajv/lib/compile/validate/defaults.ts +32 -0
- package/node_modules/ajv/lib/compile/validate/index.ts +582 -0
- package/node_modules/ajv/lib/compile/validate/keyword.ts +171 -0
- package/node_modules/ajv/lib/compile/validate/subschema.ts +135 -0
- package/node_modules/ajv/lib/core.ts +892 -0
- package/node_modules/ajv/lib/jtd.ts +132 -0
- package/node_modules/ajv/lib/refs/data.json +13 -0
- package/node_modules/ajv/lib/refs/json-schema-2019-09/index.ts +28 -0
- package/node_modules/ajv/lib/refs/json-schema-2019-09/meta/applicator.json +53 -0
- package/node_modules/ajv/lib/refs/json-schema-2019-09/meta/content.json +17 -0
- package/node_modules/ajv/lib/refs/json-schema-2019-09/meta/core.json +57 -0
- package/node_modules/ajv/lib/refs/json-schema-2019-09/meta/format.json +14 -0
- package/node_modules/ajv/lib/refs/json-schema-2019-09/meta/meta-data.json +37 -0
- package/node_modules/ajv/lib/refs/json-schema-2019-09/meta/validation.json +90 -0
- package/node_modules/ajv/lib/refs/json-schema-2019-09/schema.json +39 -0
- package/node_modules/ajv/lib/refs/json-schema-2020-12/index.ts +30 -0
- package/node_modules/ajv/lib/refs/json-schema-2020-12/meta/applicator.json +48 -0
- package/node_modules/ajv/lib/refs/json-schema-2020-12/meta/content.json +17 -0
- package/node_modules/ajv/lib/refs/json-schema-2020-12/meta/core.json +51 -0
- package/node_modules/ajv/lib/refs/json-schema-2020-12/meta/format-annotation.json +14 -0
- package/node_modules/ajv/lib/refs/json-schema-2020-12/meta/meta-data.json +37 -0
- package/node_modules/ajv/lib/refs/json-schema-2020-12/meta/unevaluated.json +15 -0
- package/node_modules/ajv/lib/refs/json-schema-2020-12/meta/validation.json +90 -0
- package/node_modules/ajv/lib/refs/json-schema-2020-12/schema.json +55 -0
- package/node_modules/ajv/lib/refs/json-schema-draft-06.json +137 -0
- package/node_modules/ajv/lib/refs/json-schema-draft-07.json +151 -0
- package/node_modules/ajv/lib/refs/json-schema-secure.json +88 -0
- package/node_modules/ajv/lib/refs/jtd-schema.ts +130 -0
- package/node_modules/ajv/lib/runtime/equal.ts +7 -0
- package/node_modules/ajv/lib/runtime/parseJson.ts +177 -0
- package/node_modules/ajv/lib/runtime/quote.ts +31 -0
- package/node_modules/ajv/lib/runtime/re2.ts +6 -0
- package/node_modules/ajv/lib/runtime/timestamp.ts +46 -0
- package/node_modules/ajv/lib/runtime/ucs2length.ts +20 -0
- package/node_modules/ajv/lib/runtime/uri.ts +6 -0
- package/node_modules/ajv/lib/runtime/validation_error.ts +13 -0
- package/node_modules/ajv/lib/standalone/index.ts +100 -0
- package/node_modules/ajv/lib/standalone/instance.ts +36 -0
- package/node_modules/ajv/lib/types/index.ts +244 -0
- package/node_modules/ajv/lib/types/json-schema.ts +187 -0
- package/node_modules/ajv/lib/types/jtd-schema.ts +273 -0
- package/node_modules/ajv/lib/vocabularies/applicator/additionalItems.ts +56 -0
- package/node_modules/ajv/lib/vocabularies/applicator/additionalProperties.ts +118 -0
- package/node_modules/ajv/lib/vocabularies/applicator/allOf.ts +22 -0
- package/node_modules/ajv/lib/vocabularies/applicator/anyOf.ts +14 -0
- package/node_modules/ajv/lib/vocabularies/applicator/contains.ts +109 -0
- package/node_modules/ajv/lib/vocabularies/applicator/dependencies.ts +112 -0
- package/node_modules/ajv/lib/vocabularies/applicator/dependentSchemas.ts +11 -0
- package/node_modules/ajv/lib/vocabularies/applicator/if.ts +80 -0
- package/node_modules/ajv/lib/vocabularies/applicator/index.ts +53 -0
- package/node_modules/ajv/lib/vocabularies/applicator/items.ts +59 -0
- package/node_modules/ajv/lib/vocabularies/applicator/items2020.ts +36 -0
- package/node_modules/ajv/lib/vocabularies/applicator/not.ts +38 -0
- package/node_modules/ajv/lib/vocabularies/applicator/oneOf.ts +82 -0
- package/node_modules/ajv/lib/vocabularies/applicator/patternProperties.ts +91 -0
- package/node_modules/ajv/lib/vocabularies/applicator/prefixItems.ts +12 -0
- package/node_modules/ajv/lib/vocabularies/applicator/properties.ts +57 -0
- package/node_modules/ajv/lib/vocabularies/applicator/propertyNames.ts +50 -0
- package/node_modules/ajv/lib/vocabularies/applicator/thenElse.ts +13 -0
- package/node_modules/ajv/lib/vocabularies/code.ts +168 -0
- package/node_modules/ajv/lib/vocabularies/core/id.ts +10 -0
- package/node_modules/ajv/lib/vocabularies/core/index.ts +16 -0
- package/node_modules/ajv/lib/vocabularies/core/ref.ts +129 -0
- package/node_modules/ajv/lib/vocabularies/discriminator/index.ts +113 -0
- package/node_modules/ajv/lib/vocabularies/discriminator/types.ts +12 -0
- package/node_modules/ajv/lib/vocabularies/draft2020.ts +23 -0
- package/node_modules/ajv/lib/vocabularies/draft7.ts +17 -0
- package/node_modules/ajv/lib/vocabularies/dynamic/dynamicAnchor.ts +31 -0
- package/node_modules/ajv/lib/vocabularies/dynamic/dynamicRef.ts +51 -0
- package/node_modules/ajv/lib/vocabularies/dynamic/index.ts +9 -0
- package/node_modules/ajv/lib/vocabularies/dynamic/recursiveAnchor.ts +14 -0
- package/node_modules/ajv/lib/vocabularies/dynamic/recursiveRef.ts +10 -0
- package/node_modules/ajv/lib/vocabularies/errors.ts +18 -0
- package/node_modules/ajv/lib/vocabularies/format/format.ts +120 -0
- package/node_modules/ajv/lib/vocabularies/format/index.ts +6 -0
- package/node_modules/ajv/lib/vocabularies/jtd/discriminator.ts +89 -0
- package/node_modules/ajv/lib/vocabularies/jtd/elements.ts +32 -0
- package/node_modules/ajv/lib/vocabularies/jtd/enum.ts +45 -0
- package/node_modules/ajv/lib/vocabularies/jtd/error.ts +23 -0
- package/node_modules/ajv/lib/vocabularies/jtd/index.ts +37 -0
- package/node_modules/ajv/lib/vocabularies/jtd/metadata.ts +24 -0
- package/node_modules/ajv/lib/vocabularies/jtd/nullable.ts +21 -0
- package/node_modules/ajv/lib/vocabularies/jtd/optionalProperties.ts +15 -0
- package/node_modules/ajv/lib/vocabularies/jtd/properties.ts +184 -0
- package/node_modules/ajv/lib/vocabularies/jtd/ref.ts +76 -0
- package/node_modules/ajv/lib/vocabularies/jtd/type.ts +75 -0
- package/node_modules/ajv/lib/vocabularies/jtd/union.ts +12 -0
- package/node_modules/ajv/lib/vocabularies/jtd/values.ts +58 -0
- package/node_modules/ajv/lib/vocabularies/metadata.ts +17 -0
- package/node_modules/ajv/lib/vocabularies/next.ts +8 -0
- package/node_modules/ajv/lib/vocabularies/unevaluated/index.ts +7 -0
- package/node_modules/ajv/lib/vocabularies/unevaluated/unevaluatedItems.ts +47 -0
- package/node_modules/ajv/lib/vocabularies/unevaluated/unevaluatedProperties.ts +85 -0
- package/node_modules/ajv/lib/vocabularies/validation/const.ts +28 -0
- package/node_modules/ajv/lib/vocabularies/validation/dependentRequired.ts +23 -0
- package/node_modules/ajv/lib/vocabularies/validation/enum.ts +54 -0
- package/node_modules/ajv/lib/vocabularies/validation/index.ts +49 -0
- package/node_modules/ajv/lib/vocabularies/validation/limitContains.ts +16 -0
- package/node_modules/ajv/lib/vocabularies/validation/limitItems.ts +26 -0
- package/node_modules/ajv/lib/vocabularies/validation/limitLength.ts +30 -0
- package/node_modules/ajv/lib/vocabularies/validation/limitNumber.ts +42 -0
- package/node_modules/ajv/lib/vocabularies/validation/limitProperties.ts +26 -0
- package/node_modules/ajv/lib/vocabularies/validation/multipleOf.ts +34 -0
- package/node_modules/ajv/lib/vocabularies/validation/pattern.ts +39 -0
- package/node_modules/ajv/lib/vocabularies/validation/required.ts +98 -0
- package/node_modules/ajv/lib/vocabularies/validation/uniqueItems.ts +79 -0
- package/node_modules/ajv/package.json +126 -0
- package/node_modules/fast-deep-equal/LICENSE +21 -0
- package/node_modules/fast-deep-equal/README.md +96 -0
- package/node_modules/fast-deep-equal/es6/index.d.ts +2 -0
- package/node_modules/fast-deep-equal/es6/index.js +72 -0
- package/node_modules/fast-deep-equal/es6/react.d.ts +2 -0
- package/node_modules/fast-deep-equal/es6/react.js +79 -0
- package/node_modules/fast-deep-equal/index.d.ts +4 -0
- package/node_modules/fast-deep-equal/index.js +46 -0
- package/node_modules/fast-deep-equal/package.json +61 -0
- package/node_modules/fast-deep-equal/react.d.ts +2 -0
- package/node_modules/fast-deep-equal/react.js +53 -0
- package/node_modules/fast-uri/.gitattributes +2 -0
- package/node_modules/fast-uri/.github/dependabot.yml +13 -0
- package/node_modules/fast-uri/.github/workflows/ci.yml +106 -0
- package/node_modules/fast-uri/.github/workflows/lock-threads.yml +19 -0
- package/node_modules/fast-uri/.github/workflows/package-manager-ci.yml +24 -0
- package/node_modules/fast-uri/LICENSE +30 -0
- package/node_modules/fast-uri/README.md +152 -0
- package/node_modules/fast-uri/benchmark/benchmark.mjs +159 -0
- package/node_modules/fast-uri/benchmark/equal.mjs +51 -0
- package/node_modules/fast-uri/benchmark/non-simple-domain.mjs +22 -0
- package/node_modules/fast-uri/benchmark/package.json +17 -0
- package/node_modules/fast-uri/benchmark/string-array-to-hex-stripped.mjs +24 -0
- package/node_modules/fast-uri/benchmark/ws-is-secure.mjs +65 -0
- package/node_modules/fast-uri/eslint.config.js +6 -0
- package/node_modules/fast-uri/index.js +406 -0
- package/node_modules/fast-uri/lib/schemes.js +267 -0
- package/node_modules/fast-uri/lib/utils.js +443 -0
- package/node_modules/fast-uri/package.json +68 -0
- package/node_modules/fast-uri/test/ajv.test.js +43 -0
- package/node_modules/fast-uri/test/equal.test.js +117 -0
- package/node_modules/fast-uri/test/fixtures/uri-js-parse.json +501 -0
- package/node_modules/fast-uri/test/fixtures/uri-js-serialize.json +120 -0
- package/node_modules/fast-uri/test/parse.test.js +323 -0
- package/node_modules/fast-uri/test/resolve.test.js +87 -0
- package/node_modules/fast-uri/test/rfc-3986.test.js +90 -0
- package/node_modules/fast-uri/test/security-normalization.test.js +39 -0
- package/node_modules/fast-uri/test/security.test.js +133 -0
- package/node_modules/fast-uri/test/serialize.test.js +151 -0
- package/node_modules/fast-uri/test/uri-js-compatibility.test.js +33 -0
- package/node_modules/fast-uri/test/uri-js.test.js +912 -0
- package/node_modules/fast-uri/test/util.test.js +38 -0
- package/node_modules/fast-uri/tsconfig.json +9 -0
- package/node_modules/fast-uri/types/index.d.ts +60 -0
- package/node_modules/fast-uri/types/index.test-d.ts +17 -0
- package/node_modules/json-schema-traverse/.eslintrc.yml +27 -0
- package/node_modules/json-schema-traverse/.github/FUNDING.yml +2 -0
- package/node_modules/json-schema-traverse/.github/workflows/build.yml +28 -0
- package/node_modules/json-schema-traverse/.github/workflows/publish.yml +27 -0
- package/node_modules/json-schema-traverse/LICENSE +21 -0
- package/node_modules/json-schema-traverse/README.md +95 -0
- package/node_modules/json-schema-traverse/index.d.ts +40 -0
- package/node_modules/json-schema-traverse/index.js +93 -0
- package/node_modules/json-schema-traverse/package.json +43 -0
- package/node_modules/json-schema-traverse/spec/.eslintrc.yml +6 -0
- package/node_modules/json-schema-traverse/spec/fixtures/schema.js +125 -0
- package/node_modules/json-schema-traverse/spec/index.spec.js +171 -0
- package/node_modules/require-from-string/index.js +34 -0
- package/node_modules/require-from-string/license +21 -0
- package/node_modules/require-from-string/package.json +28 -0
- package/node_modules/require-from-string/readme.md +56 -0
- package/package.json +51 -0
- package/scripts/api-call.mjs +59 -0
- package/scripts/auth.mjs +262 -0
- package/scripts/build-skill-payload.mjs +338 -0
- package/scripts/cleanup.mjs +166 -0
- package/scripts/install-paths.mjs +146 -0
- package/scripts/postinstall.mjs +218 -0
- package/scripts/postpack.mjs +43 -0
- package/scripts/prepack.mjs +222 -0
- package/scripts/tty-menu.mjs +100 -0
- package/skill/README.md +55 -0
- package/skill/SKILL.md +138 -0
- package/skill/catalog.json +406 -0
- package/skill/design-rules.md +282 -0
- package/skill/design-system.md +235 -0
- package/skill/docs/SKELETON-SHELL.md +120 -0
- package/skill/docs/bottom-buttons.md +155 -0
- package/skill/docs/control/button.md +147 -0
- package/skill/docs/control/calendar-navigator.md +143 -0
- package/skill/docs/control/calendar.md +128 -0
- package/skill/docs/control/check-box.md +117 -0
- package/skill/docs/control/combo.md +293 -0
- package/skill/docs/control/embed.md +211 -0
- package/skill/docs/control/image-box.md +237 -0
- package/skill/docs/control/input-date.md +175 -0
- package/skill/docs/control/input-file.md +192 -0
- package/skill/docs/control/input-mask.md +89 -0
- package/skill/docs/control/input-number.md +55 -0
- package/skill/docs/control/input-text.md +73 -0
- package/skill/docs/control/label.md +127 -0
- package/skill/docs/control/multi-input-box.md +51 -0
- package/skill/docs/control/radio-box.md +150 -0
- package/skill/docs/control/search.md +163 -0
- package/skill/docs/control/tab.md +240 -0
- package/skill/docs/control/tree.md +278 -0
- package/skill/docs/control.md +264 -0
- package/skill/docs/data-objects.md +278 -0
- package/skill/docs/data-sources.md +215 -0
- package/skill/docs/events.md +467 -0
- package/skill/docs/group.md +146 -0
- package/skill/docs/index.json +125 -0
- package/skill/docs/mockup-data.md +186 -0
- package/skill/docs/node.md +32 -0
- package/skill/docs/scenario.md +112 -0
- package/skill/docs/service/CustomSystem.md +139 -0
- package/skill/docs/service/Firestore.md +125 -0
- package/skill/docs/service/FlexAutoQuery.md +128 -0
- package/skill/docs/service/FlexSQL.md +96 -0
- package/skill/docs/service/Flextudio API.md +161 -0
- package/skill/docs/service/Flextudio.md +87 -0
- package/skill/docs/service/GoogleSheet.md +71 -0
- package/skill/docs/service/README.md +127 -0
- package/skill/docs/service/ksystem.md +76 -0
- package/skill/docs/service-binding.md +228 -0
- package/skill/docs/step.md +546 -0
- package/skill/docs/style-objects.md +183 -0
- package/skill/examples/README.md +147 -0
- package/skill/examples/basic/basic-list-detail.json +2521 -0
- package/skill/examples/basic/delivery-address-popup.json +2175 -0
- package/skill/examples/basic/fixedtop-floating-form.json +1524 -0
- package/skill/examples/basic/search-period-popup.json +1524 -0
- package/skill/examples/design/booking-wizard-3step.json +1335 -0
- package/skill/examples/design/list-detail-form-3step.json +1516 -0
- package/skill/examples/design/list-filter-2step.json +1365 -0
- package/skill/examples/design/list-filter-detail-3step.json +1570 -0
- package/skill/examples/design/result-entry-wizard-4step.json +1861 -0
- package/skill/examples/index.json +150 -0
- package/skill/examples/intent/mock-employee-list.json +54 -0
- package/skill/examples/intent/script-cart-flow.json +96 -0
- package/skill/examples/intent/script-dialog-confirm.json +61 -0
- package/skill/intent-rules.md +552 -0
- package/skill/intent-system.md +118 -0
- package/skill/patterns/atom/badge.json +103 -0
- package/skill/patterns/atom/button.json +111 -0
- package/skill/patterns/atom/checkbox.json +70 -0
- package/skill/patterns/atom/segmented-radio.json +92 -0
- package/skill/patterns/atom/switch.json +57 -0
- package/skill/patterns/index.json +471 -0
- package/skill/patterns/molecule/checklist.json +107 -0
- package/skill/patterns/molecule/input-action.json +355 -0
- package/skill/patterns/molecule/input-button.json +212 -0
- package/skill/patterns/molecule/input-pair.json +284 -0
- package/skill/references/build-sequence.md +55 -0
- package/skill/references/patterns-cheatsheet.md +87 -0
- package/skill/references/spec-evolve/README.md +43 -0
- package/skill/references/spec-evolve/conventions.md +92 -0
- package/skill/references/spec-evolve/data-connection.md +102 -0
- package/skill/references/spec-evolve/intake.md +41 -0
- package/skill/references/spec-evolve/key-roles.md +44 -0
- package/skill/references/spec-evolve/lint.md +27 -0
- package/skill/references/spec-evolve/mockup.md +50 -0
- package/skill/references/spec-evolve/query-screens.md +66 -0
- package/skill/references/spec-evolve/routing.md +43 -0
- package/skill/references/spec-evolve/spec-format.md +76 -0
- package/skill/references/spec-evolve/templates/master-detail.spec.md +97 -0
- package/skill/references/spec-evolve/templates/query-screen.spec.md +96 -0
- package/skill/references/spec-evolve/templates/static-prototype.spec.md +54 -0
- package/skill/references/spec-evolve/templates-index.json +26 -0
- package/skill/rules.md +400 -0
- package/skill/schemas/bottom-buttons.schema.json +134 -0
- package/skill/schemas/control/_base.schema.json +1296 -0
- package/skill/schemas/control/button.schema.json +55 -0
- package/skill/schemas/control/calendar-navigator.schema.json +164 -0
- package/skill/schemas/control/calendar.schema.json +18 -0
- package/skill/schemas/control/check-box.schema.json +41 -0
- package/skill/schemas/control/combo.schema.json +23 -0
- package/skill/schemas/control/embed.schema.json +30 -0
- package/skill/schemas/control/image-box.schema.json +49 -0
- package/skill/schemas/control/input-date.schema.json +27 -0
- package/skill/schemas/control/input-file.schema.json +139 -0
- package/skill/schemas/control/input-mask.schema.json +45 -0
- package/skill/schemas/control/input-number.schema.json +24 -0
- package/skill/schemas/control/input-text.schema.json +24 -0
- package/skill/schemas/control/label.schema.json +113 -0
- package/skill/schemas/control/multi-input-box.schema.json +19 -0
- package/skill/schemas/control/other.schema.json +24 -0
- package/skill/schemas/control/radio-box.schema.json +87 -0
- package/skill/schemas/control/search.schema.json +23 -0
- package/skill/schemas/control/tab.schema.json +112 -0
- package/skill/schemas/control/tree.schema.json +83 -0
- package/skill/schemas/control.schema.json +30 -0
- package/skill/schemas/data-objects.schema.json +161 -0
- package/skill/schemas/data-sources.schema.json +184 -0
- package/skill/schemas/design-system/design.schema.json +496 -0
- package/skill/schemas/events.schema.json +272 -0
- package/skill/schemas/group.schema.json +133 -0
- package/skill/schemas/index.json +362 -0
- package/skill/schemas/naming-objects.schema.json +133 -0
- package/skill/schemas/node.schema.json +24 -0
- package/skill/schemas/patterns/atom/badge.schema.json +44 -0
- package/skill/schemas/patterns/atom/button.schema.json +70 -0
- package/skill/schemas/patterns/atom/checkbox.schema.json +39 -0
- package/skill/schemas/patterns/atom/segmented-radio.schema.json +49 -0
- package/skill/schemas/patterns/atom/switch.schema.json +27 -0
- package/skill/schemas/patterns/molecule/checklist.schema.json +63 -0
- package/skill/schemas/patterns/molecule/input-action.schema.json +251 -0
- package/skill/schemas/patterns/molecule/input-button.schema.json +141 -0
- package/skill/schemas/patterns/molecule/input-pair.schema.json +210 -0
- package/skill/schemas/scenario.schema.json +161 -0
- package/skill/schemas/service/CustomSystem.schema.json +41 -0
- package/skill/schemas/service/Firestore.schema.json +28 -0
- package/skill/schemas/service/FlexAutoQuery.schema.json +35 -0
- package/skill/schemas/service/FlexSQL.schema.json +33 -0
- package/skill/schemas/service/Flextudio API.schema.json +115 -0
- package/skill/schemas/service/Flextudio.schema.json +26 -0
- package/skill/schemas/service/GoogleSheet.schema.json +31 -0
- package/skill/schemas/service/_base.schema.json +31 -0
- package/skill/schemas/service/ksystem.schema.json +36 -0
- package/skill/schemas/service-binding.schema.json +51 -0
- package/skill/schemas/step.schema.json +258 -0
- package/skill/schemas/style-objects.schema.json +155 -0
- package/skill/skill-guides/README.md +50 -0
- package/skill/skill-guides/control-options.md +126 -0
- package/skill/skill-guides/events.md +61 -0
- package/skill/skill-guides/failure-discipline.md +95 -0
- package/skill/skill-guides/index.json +40 -0
- package/skill/skill-guides/prompt-interview.md +92 -0
- package/skill/skill-guides/scripts.md +169 -0
- package/skill/skill-guides/step-navigation.md +98 -0
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
# Flextudio scenario styling
|
|
2
|
+
|
|
3
|
+
## Modes — pattern / design / raw
|
|
4
|
+
|
|
5
|
+
For each unit in `Contents[]`, pick ONE styling mode:
|
|
6
|
+
|
|
7
|
+
| Mode | Form | When |
|
|
8
|
+
|---|---|---|
|
|
9
|
+
| **Pattern** (preset) | `{ "<patternName>": { ...props } }` | Recurring unit, consistency matters (every CTA, every status badge). Pattern owns its style. |
|
|
10
|
+
| **`design` key on raw control** | `{ "ControlType": "Label", "labeltext": "...", "design": { font: "body-large", color: "body" } }` | One-off control. Default for ad-hoc visuals. |
|
|
11
|
+
| **Raw style fields** | `{ "ControlType": "Label", "labeltext": "...", "FontStyle": { ... }, "Width": { ... } }` | Only when `design` cannot express the case |
|
|
12
|
+
|
|
13
|
+
The materializer expands `design` to raw style fields before validation.
|
|
14
|
+
|
|
15
|
+
```jsonc
|
|
16
|
+
// Same Label, three forms
|
|
17
|
+
{ "button": { "label": "확인", "variant": "primary", "width": "full" } } // pattern
|
|
18
|
+
{ "ControlType": "Label", "labeltext": "확인", "design": { "font": "title-medium", "w": "full" } } // design
|
|
19
|
+
{ "ControlType": "Label", "labeltext": "확인", "FontStyle": { "UseFont": true, ... } } // raw — verbose
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## The `design` key
|
|
23
|
+
|
|
24
|
+
A short stylesheet attached to any raw control or raw Group.
|
|
25
|
+
|
|
26
|
+
## `design` key — slots
|
|
27
|
+
|
|
28
|
+
| key | format | maps to |
|
|
29
|
+
|---|---|---|
|
|
30
|
+
| `font` | typography role | `FontStyle.FontSize` + `FontWeight` |
|
|
31
|
+
| `color` | text color slot | `FontStyle.FontColor` |
|
|
32
|
+
| `align` | `start` / `center` / `end` | `FontStyle.FontAlign` |
|
|
33
|
+
| `w`, `h` | `full` / `text` / `<n>px` / `<n>%` / `<n>vh` / `<n>vw` | `Width` / `Height` |
|
|
34
|
+
| `p`, `m` | CSS shorthand `"16"` / `"16 20"` / `"16 20 8 4"` (TRBL) or `{t,r,b,l}` | `Padding` / `Margin` |
|
|
35
|
+
| `bg` | surface color slot | `BgStyle.BgColor` (auto `UseBackground:true`) |
|
|
36
|
+
| `border` | slot \| `false` \| `"none"` \| `{ color, type?, size? \| sides? }` | `BorderStyle` |
|
|
37
|
+
| `radius` | non-neg int string, or `{ tl?, tr?, br?, bl? }` | `BorderStyle.BorderRadius` (uniform or per-corner) |
|
|
38
|
+
| `elevation` | `rect-shadow` / `radius-shadow` | `ContentStyle` |
|
|
39
|
+
| `flex` | `{ dir, gap?, align?, valign? }` — **Group only** | `DisplayStyle` |
|
|
40
|
+
| `caption` | `{ text?, font?, color?, pos?, align? }` | `text`→root `Caption` (content); 나머지→`CaptionStyle` (auto `UseDesign:true`). 한 행에서 다른 컨트롤과 묶을 땐 캡션 대신 라벨을 상위로 — §Layout "Captioned input in a row" |
|
|
41
|
+
| `abs` | `{ t?, r?, b?, l? }` | `UseAbsoluteLayout:true` + `AbsolutePosition` |
|
|
42
|
+
| `opacity` | int 0..100 | `UseOpacity:true` + `OpacityValue` |
|
|
43
|
+
| `itemBg` | color slot — CheckBox/RadioBox only | `ItemBgStyle` |
|
|
44
|
+
| `tabHeader` | `{ container?, selectedContainer?, item?, selectedItem? }` — Tab only | `TabHeader*` family |
|
|
45
|
+
| `fixed` | boolean | `UseFixedSize` |
|
|
46
|
+
| `surface` | `flat` / `outlined` / `elevated` — **Group only** | expands to `bg`+`border`+`radius`+`elevation` |
|
|
47
|
+
|
|
48
|
+
For inner shape details (`border.sides`, `flex.dir/gap/align/valign`, `caption.pos`, `tabHeader.*`), read `design.schema.json` or validate with `flex-scenario validate --schema design`.
|
|
49
|
+
|
|
50
|
+
## Slot enums (names only — pixel mappings in §Colors / §Typography below)
|
|
51
|
+
|
|
52
|
+
**Color** (text / bg / border share one enum; slot taxonomy guides intent):
|
|
53
|
+
- Brand: `main`, `main-light`, `sub`, `sub-light`
|
|
54
|
+
- Surface: `canvas`, `card`, `subtle`, `surface-strong`, `dark`
|
|
55
|
+
- Hairline (border): `hairline`, `hairline-soft`, `hairline-strong`
|
|
56
|
+
- Text (color): `ink`, `body`, `body-soft`, `muted`, `on-brand`
|
|
57
|
+
- Semantic: `warning`, `preview`, `success`, `error`
|
|
58
|
+
**Typography roles** (`font`): `display-large/medium/small`, `title-large/medium`, `body-large` (default body anchor), `body-medium`, `body-small`, `caption`, `micro`. Closed enum — no separate weight override. For non-listed combos (e.g. 14px SemiBold), escape to raw `FontStyle`.
|
|
59
|
+
|
|
60
|
+
**Radius**: `"0"` / `"4"` / `"8"` / `"12"` / `"16"` (default cards) / `"20"` / `"9999"` (pill — auto `RadiusSet:"None"`)
|
|
61
|
+
|
|
62
|
+
**Spacing** (base 4px): `4` / `8` / `12` / `16` / `20` / `24` in `p`, `m`, `flex.gap`.
|
|
63
|
+
|
|
64
|
+
## Rules
|
|
65
|
+
|
|
66
|
+
- **Slot-only inside `design`.** Raw `var(--...)` / hex / arbitrary px are Ajv-rejected. Use slot names; escape to raw style fields if truly needed.
|
|
67
|
+
- **`design` wins on overlap** (leaf-level merge). Non-overlapping raw leaves preserved.
|
|
68
|
+
- **`flex` and `surface` are Group-only.** Putting either on a Control raises `kind:"design"` error.
|
|
69
|
+
- **Column is default.** Omit `flex` for vertical stacks.
|
|
70
|
+
- **Border / radius uniform vs per-side mutually exclusive.** `border` rejects `size` + `sides` together; `radius` rejects string + `{tl,tr,br,bl}` together.
|
|
71
|
+
|
|
72
|
+
### Layout & sizing semantics
|
|
73
|
+
|
|
74
|
+
- **Step padding.** Every Step body comes with 20px horizontal padding out of the box (no need to set it). For edge-to-edge content, set the Step padding to **0**:
|
|
75
|
+
|
|
76
|
+
```json
|
|
77
|
+
"Padding": {
|
|
78
|
+
"All": "0",
|
|
79
|
+
"SizeUnit": "px",
|
|
80
|
+
"UseEach": "false",
|
|
81
|
+
"UseAuto": "true"
|
|
82
|
+
}
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
Add this inside the Step JSON.
|
|
86
|
+
- **Row sibling width rule.** Inside `design: { flex: { dir:"row", ... } }`, the renderer can stretch any *content-sized* child (anything not declaring an explicit `w`) to claim leftover flex space, which squeezes a sibling that asked for `w: "full"`. To prevent this, set `design: { fixed: true }` on every content-sized child in a row. Children with explicit `%` widths (`"50%"`, etc.) need no `fixed` flag.
|
|
87
|
+
|
|
88
|
+
- **Gap defaults to 0.** Multi-child rows need explicit `flex.gap`. Omit only when (a) a child has `w: "full"` (claims the row alone), or (b) `align:"between"` (renderer distributes inter-child space).
|
|
89
|
+
- **Reach for molecule patterns first.** `input-button`, `input-pair` encode gap + `fixed` invariants internally — author hand-rolled rows only after checking the pattern catalog (`patterns/index.json`).
|
|
90
|
+
|
|
91
|
+
- **Captioned input in a row — lift the label out.** `design.caption` (default `pos:"top"`) grows the control's *box* by the caption height (the materializer adds ~24px to a px `h` to keep the input body at its intended size). Fine for a standalone field, but inside `flex: { dir:"row" }` it breaks vertical alignment: a sibling — typically a button — centers against the *caption-inflated* box, so it sits too low relative to the input body. When an input shares a row with another control, **do not put the label on the input via `design.caption`.** Lift the label to a sibling Label above the row:
|
|
92
|
+
|
|
93
|
+
```jsonc
|
|
94
|
+
// field block — label on top, input + action centered in the row below
|
|
95
|
+
{ "ContentsType": "Group",
|
|
96
|
+
"design": { "flex": { "dir": "column", "gap": 4 }, "w": "full" },
|
|
97
|
+
"Contents": [
|
|
98
|
+
{ "ControlType": "Label", "labeltext": "부서",
|
|
99
|
+
"design": { "font": "body-small", "color": "body-soft", "w": "full", "h": "text" } },
|
|
100
|
+
{ "ContentsType": "Group",
|
|
101
|
+
"design": { "flex": { "dir": "row", "gap": 8, "valign": "center" }, "w": "full" },
|
|
102
|
+
"Contents": [
|
|
103
|
+
{ "ControlType": "InputText", "Placeholder": "부서명 검색",
|
|
104
|
+
"design": { "w": "full", "h": "48px", "border": "hairline-strong", "radius": "8" } }, // no caption
|
|
105
|
+
{ "ControlType": "Button", "labeltext": "검색",
|
|
106
|
+
"design": { "h": "48px", "fixed": true } } ] } ] }
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
Row rules: give the input and the adjacent control the **same explicit `h`** (e.g. `"48px"`), set `valign:"center"`, set `fixed:true` on the content-sized control (Row sibling width rule), and space label↔row with the column `gap:4`. Keep `design.caption` only for a **standalone** input with no adjacent control in the same row.
|
|
110
|
+
|
|
111
|
+
### Elevation patterns (composition of slots)
|
|
112
|
+
|
|
113
|
+
| Level | Compose with | Use |
|
|
114
|
+
|---|---|---|
|
|
115
|
+
| Flat (canvas) | (no `bg`, no `border`) | Step body |
|
|
116
|
+
| Card | `bg: "card"` + `border: "hairline"` + `radius: "16"` | Content cards |
|
|
117
|
+
| Subtle band | `bg: "subtle"` | Section grouping |
|
|
118
|
+
| Hairline-only outline | `border: "hairline"` + `radius: "12"` | Card outline without fill |
|
|
119
|
+
| Shadow card | above + `elevation: "rect-shadow"` (or `"radius-shadow"`) | Floating cards |
|
|
120
|
+
| Dark inversion | `bg: "dark"` + `color: "on-brand"` | Strong CTAs, featured cards |
|
|
121
|
+
|
|
122
|
+
No custom shadows, gradients, or blurs. `elevation` accepts engine-preset slots only.
|
|
123
|
+
|
|
124
|
+
### `surface` preset — named elevation recipe (Paper)
|
|
125
|
+
|
|
126
|
+
`design.surface` packages the elevation recipe above into one named handle, so every elevated container is consistent (MUI Paper 영감). **Group only** — it styles a container surface; on a Control it raises a `kind:"design"` error. Expands to `bg`+`border`+`radius`+`elevation`:
|
|
127
|
+
|
|
128
|
+
| `surface` | expands to | Use |
|
|
129
|
+
|---|---|---|
|
|
130
|
+
| `flat` | `bg:"card"` + `radius:"16"` | Filled surface, no outline/shadow |
|
|
131
|
+
| `outlined` | `bg:"card"` + `border:"hairline"` + `radius:"16"` | Card outline |
|
|
132
|
+
| `elevated` | `bg:"card"` + `radius:"16"` + `elevation:"radius-shadow"` | Floating card (Paper) |
|
|
133
|
+
|
|
134
|
+
The preset is a **baseline** — any explicit `bg`/`border`/`radius`/`elevation` key on the same `design` overrides it (`{ "surface":"elevated", "radius":"20" }` → elevated recipe with 20px corners). The engine has no shadow-depth scale (only `rect-shadow`/`radius-shadow`, differing by corner shape), so `surface` is a closed 3-variant enum, not a numeric elevation.
|
|
135
|
+
|
|
136
|
+
```jsonc
|
|
137
|
+
// Elevated Paper container — styled Group, freeform children
|
|
138
|
+
{ "ContentsType": "Group",
|
|
139
|
+
"design": { "surface": "elevated", "p": "16", "flex": { "dir": "column", "gap": 12 } },
|
|
140
|
+
"Contents": [ /* patterns · raw controls · nested Groups */ ] }
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
`surface` is Group-only, same as `flex`. Wrap content in a Group; do not put `surface` on a Control.
|
|
144
|
+
|
|
145
|
+
---
|
|
146
|
+
|
|
147
|
+
## Colors
|
|
148
|
+
|
|
149
|
+
The slot enum for `design.color` (text), `design.bg` (surface), `design.border` (outline).
|
|
150
|
+
|
|
151
|
+
### Brand & Accent
|
|
152
|
+
- **`main`** (`var(--colorMain)`) — Primary CTA fill, active state. Default green; per-tenant overridable.
|
|
153
|
+
- **`main-light`** (`var(--colorMainLight)`) — Soft primary surface (selected zone, hover).
|
|
154
|
+
- **`sub`** (`var(--colorSub0)`) — Secondary accent. Default purple; per-tenant overridable. Never on a CTA.
|
|
155
|
+
- **`sub-light`** (`var(--colorSub0Light)`) — Soft accent surface.
|
|
156
|
+
|
|
157
|
+
### Surface
|
|
158
|
+
- **`canvas`** (`var(--colorWhite)`) — Pure white screen floor.
|
|
159
|
+
- **`card`** (`var(--colorWhite)`) — Default card / sheet fill.
|
|
160
|
+
- **`subtle`** (`var(--colorGray9)`) — Section background.
|
|
161
|
+
- **`surface-strong`** (`var(--colorGray10)`) — Chip / badge default fill.
|
|
162
|
+
- **`dark`** (`var(--colorBlack)`) — Dark feature cards, emphasized featured rows.
|
|
163
|
+
|
|
164
|
+
### Hairlines (border slot)
|
|
165
|
+
- **`hairline`** (`var(--colorGray5)`) — Default 1px divider, card outline.
|
|
166
|
+
- **`hairline-soft`** (`var(--colorGray9)`) — Lighter divider — section breaks within a card.
|
|
167
|
+
- **`hairline-strong`** (`var(--colorGray4)`) — Stronger panel outline — interactive boundary, focus.
|
|
168
|
+
|
|
169
|
+
### Text (color slot)
|
|
170
|
+
- **`ink`** (`var(--colorBlack)`) — Strong emphasis, icon stroke.
|
|
171
|
+
- **`body`** (`var(--colorGray1)`) — Heading / body emphasis.
|
|
172
|
+
- **`body-soft`** (`var(--colorGray3)`) — Subtitle, label, caption — most used.
|
|
173
|
+
- **`muted`** (`var(--colorGray4)`) — Placeholder, disabled, soft meta.
|
|
174
|
+
- **`on-brand`** (`var(--colorWhite)`) — Text on Main / Sub / Semantic fill.
|
|
175
|
+
|
|
176
|
+
### Semantic
|
|
177
|
+
- **`warning`** (`var(--colorSub4)`) — Caution / pending state.
|
|
178
|
+
- **`preview`** (`var(--colorSub3)`) — "Preview" tag, in-progress flag.
|
|
179
|
+
- **`success`** (`var(--colorSub1)`) — Confirmation, approved state.
|
|
180
|
+
- **`error`** (`var(--colorSub2)`) — Validation error, destructive action.
|
|
181
|
+
|
|
182
|
+
All four color slot groups share one enum — `design.bg: "ink"` is technically accepted (Ajv won't reject), but semantically use Surface for `bg`, Text for `color`, Hairlines for `border`. The slot taxonomy guides intent.
|
|
183
|
+
|
|
184
|
+
---
|
|
185
|
+
|
|
186
|
+
## Typography
|
|
187
|
+
|
|
188
|
+
The role enum for `design.font`. Anchored at **16px body** (1rem).
|
|
189
|
+
|
|
190
|
+
| Role | `FontSize` | `FontWeight` | Use |
|
|
191
|
+
|---|---|---|---|
|
|
192
|
+
| `display-large` | `"28"` | `"SemiBold"` | Step header, hero title |
|
|
193
|
+
| `display-medium` | `"24"` | `"SemiBold"` | Section heads |
|
|
194
|
+
| `display-small` | `"20"` | `"SemiBold"` | Sub-section heads |
|
|
195
|
+
| `title-large` | `"18"` | `"SemiBold"` | Card group titles |
|
|
196
|
+
| `title-medium` | `"16"` | `"SemiBold"` | Card titles, list labels |
|
|
197
|
+
| `body-large` | `"16"` | `"Regular"` | Default body — anchor |
|
|
198
|
+
| `body-medium` | `"14"` | `"Regular"` | Sub body, input text |
|
|
199
|
+
| `body-small` | `"13"` | `"Regular"` | Caption, secondary meta |
|
|
200
|
+
| `caption` | `"12"` | `"Regular"` | Photo captions, footer text |
|
|
201
|
+
| `micro` | `"11"` | `"Medium"` | Section labels, badges (sparing) |
|
|
202
|
+
|
|
203
|
+
---
|
|
204
|
+
|
|
205
|
+
## Shapes — `design.radius` scale
|
|
206
|
+
|
|
207
|
+
Emit as integer **string** to `design.radius`. The materializer sets `BorderStyle.BorderRadius` directly; pill geometry gets `RadiusSet: "None"` auto-applied.
|
|
208
|
+
|
|
209
|
+
| `design.radius` | Use |
|
|
210
|
+
|---|---|
|
|
211
|
+
| `"0"` | Flat — no radius |
|
|
212
|
+
| `"4"` | Inline tags |
|
|
213
|
+
| `"8"` | Form inputs, CTA buttons, chips |
|
|
214
|
+
| `"12"` | Default cards, code blocks |
|
|
215
|
+
| `"16"` | Main cards — most used |
|
|
216
|
+
| `"20"` | Strong cards, sheets |
|
|
217
|
+
| `"9999"` | Badges and avatar plates (pill) — auto `RadiusSet:"None"` |
|
|
218
|
+
|
|
219
|
+
---
|
|
220
|
+
|
|
221
|
+
## Spacing system
|
|
222
|
+
|
|
223
|
+
The integer values emitted in `design.p` / `design.m` / `design.row.gap`.
|
|
224
|
+
|
|
225
|
+
- **Base unit:** 4px. Padding / margin values are quantized to **4×n**.
|
|
226
|
+
- **Allowed values:** `4` · `8` · `12` · `16` · `20` · `24`. Author other values only with strong reason.
|
|
227
|
+
- Every Group and Control already carries an engine-default inset — only set `p` / `m` when the design demands tighter or looser fit.
|
|
228
|
+
|
|
229
|
+
Typical gap values: `"8"` for tight pairs, `"12"`–`"16"` for card grids.
|
|
230
|
+
|
|
231
|
+
You need to know the step has a default 20px horizontal padding.
|
|
232
|
+
|
|
233
|
+
---
|
|
234
|
+
|
|
235
|
+
## Raw escape — when `design` cannot express it
|
|
236
|
+
|
|
237
|
+
Read the full raw shape from `group.schema.json` / `control/<name>.schema.json`.
|
|
238
|
+
|
|
239
|
+
| Need | Raw target |
|
|
240
|
+
|---|---|
|
|
241
|
+
| Non-default FontWeight (14px SemiBold etc.) | `FontStyle: { FontSize, FontWeight, ... }` |
|
|
242
|
+
| `LetterSpacing` (자간) | `FontStyle.LetterSpacing` |
|
|
243
|
+
| Image background | `BgStyle: { UseImage:true, Image:{...} }` |
|
|
244
|
+
| Non-slot color (brand hex) | raw `FontColor` / `BgColor` |
|
|
245
|
+
| Mixed `BorderType` per side | `BorderStyle` directly |
|
|
246
|
+
| `FlexWrap` independent of `dir` | `DisplayStyle: { ..., FlexWrap:true }` |
|
|
247
|
+
| Per-item CheckBox/RadioBox styling | author `Items[*]` raw |
|
|
248
|
+
| Tab legacy `ArrangeItems` | raw string field |
|
|
249
|
+
|
|
250
|
+
**Raw field-name traps** (strict-fields rejects invented variants):
|
|
251
|
+
- `Padding` / `Margin` use **`Btm`**; `BorderStyle` uses **`Bottom`** (asymmetric)
|
|
252
|
+
- `BorderStyle` toggle is **`Useborder`** (lowercase `b`)
|
|
253
|
+
- `CaptionStyle` toggle is **`UseDesign`** (not `UseCaption`)
|
|
254
|
+
- No `UseMargin` / `UseBorder` / `UseCaption`
|
|
255
|
+
|
|
256
|
+
## Examples
|
|
257
|
+
|
|
258
|
+
```jsonc
|
|
259
|
+
// Body Label
|
|
260
|
+
{ "ControlType": "Label", "labeltext": "{=Name}",
|
|
261
|
+
"design": { "font": "body-large", "color": "body", "w": "full", "h": "text" } }
|
|
262
|
+
|
|
263
|
+
// Card Group — padded white surface with hairline outline
|
|
264
|
+
{ "ContentsType": "Group",
|
|
265
|
+
"design": { "p": "16", "bg": "card", "border": "hairline", "radius": "16" },
|
|
266
|
+
"Contents": [ ... ] }
|
|
267
|
+
|
|
268
|
+
// Row with space-between + 8px gap
|
|
269
|
+
{ "ContentsType": "Group",
|
|
270
|
+
"design": { "flex": { "dir": "row", "align": "between", "valign": "center", "gap": 8 }, "p": "12 16" },
|
|
271
|
+
"Contents": [ ... ] }
|
|
272
|
+
|
|
273
|
+
// Tab with underline selection
|
|
274
|
+
{ "ControlType": "Tab",
|
|
275
|
+
"design": {
|
|
276
|
+
"tabHeader": {
|
|
277
|
+
"container": { "arrange": { "type": "equal" }, "bg": "card", "p": "0 16" },
|
|
278
|
+
"item": { "font": "body-medium", "color": "body-soft", "align": "center", "p": "12 0" },
|
|
279
|
+
"selectedItem": { "color": "main", "border": { "color": "main", "sides": { "b": "2" } } }
|
|
280
|
+
}
|
|
281
|
+
} }
|
|
282
|
+
```
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
# Patterns — Design Rationale
|
|
2
|
+
|
|
3
|
+
A handoff document for picking up the pattern-system discussion across sessions. Captures the reasoning behind decisions, not the implementation details (see `patterns-development-guide-v2.md` for that). Read this when you need to understand *why* the architecture looks the way it does, or when you're about to revisit a decision.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 1. Context: what Flextudio metadata looks like
|
|
8
|
+
|
|
9
|
+
Flextudio scenarios are deeply nested JSON describing UI controls. A single screen scenario is typically:
|
|
10
|
+
|
|
11
|
+
- **Depth 7+** — `Sectors[].Controls[].Children[].Children[]...`
|
|
12
|
+
- **50kb+** of JSON for a non-trivial screen
|
|
13
|
+
- **~30 styling fields per control** — `BgStyle`, `FontStyle`, `BorderStyle`, `Padding`, `Margin`, `Width`, `Height`, plus per-ControlType fields
|
|
14
|
+
- **ControlType is the engine primitive** — `Label`, `Group`, `ImageBox`, `TextField`, `Button`, `Icon`, `Checkbox`, `Radio`, etc. Enumerated in `catalog.json`.
|
|
15
|
+
- **Tokens live in `DESIGN.md`** — colors as `var(--colorXxx)`, FontWeight as string enums (`Regular`/`Medium`/`SemiBold`/`Bold`), spacing on a scale (`xs`–`xxl` = 4–24 px)
|
|
16
|
+
- **`validate.mjs` enforces 16 cross-checks** — naming, ID format, legacy-field bans, image-field defaults, font/border rules, etc. This is the actual contract.
|
|
17
|
+
- **Build sequence** — the original MCP server enforced a fixed call order via `build_id`. The CLI replacement (`flex-scenario session start/status/finish`) keeps a build id for traceability but does not force stage order.
|
|
18
|
+
|
|
19
|
+
The original assumption was that the LLM emits this metadata directly, with `assets.json` providing reference snippets for common shapes.
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## 2. Why `assets.json` failed
|
|
24
|
+
|
|
25
|
+
`assets.json` accumulated 174 entries across 9 "kinds" (colors, controls, compositions, layouts, etc.) intended as a reference library. In practice:
|
|
26
|
+
|
|
27
|
+
1. **Ambiguous positioning** — it tried to be three things simultaneously:
|
|
28
|
+
- Token reference (but DESIGN.md already does this)
|
|
29
|
+
- Pattern library (but compositions are prose, not generation-ready)
|
|
30
|
+
- Search index (but mixing 9 kinds in a flat list fragmented results)
|
|
31
|
+
2. **Low LLM utilization** — the workflow `find → get × 5 → translate prose to JSON → maintain 30 fields consistently` puts the LLM on the steps it does worst.
|
|
32
|
+
3. **Maintenance cost > value** — sync with DESIGN.md required ongoing effort; only ~10 of 174 entries (deprecated mappings + usage-rank stats) carried real value.
|
|
33
|
+
|
|
34
|
+
Conclusion: replace with something the LLM can actually consume cheaply.
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
## 3. The core question: how should the LLM produce metadata?
|
|
39
|
+
|
|
40
|
+
Two models on the table:
|
|
41
|
+
|
|
42
|
+
### Model A — Hybrid output
|
|
43
|
+
|
|
44
|
+
```
|
|
45
|
+
LLM → [ raw control JSON (escape) , pattern invocation (abstracted) ]
|
|
46
|
+
→ merge → meta
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
LLM freely moves between layers. Some controls drawn raw, others via patterns, all in the same scenario.
|
|
50
|
+
|
|
51
|
+
**Pros**: Maximum flexibility. LLM can always drop down a level when a pattern doesn't fit (e.g. unusual data binding, one-off event hook).
|
|
52
|
+
|
|
53
|
+
**Cons**:
|
|
54
|
+
- LLM must decide *per control* whether to use a pattern or raw output. This is the kind of judgment LLMs handle worst — and it has to happen continuously.
|
|
55
|
+
- Result quality drifts: two cards in the same list end up styled differently (one token-based, one inline hex) because the LLM made different micro-decisions.
|
|
56
|
+
- The deep-JSON cost stays — every raw control means ~30 fields the LLM must emit consistently.
|
|
57
|
+
- The original principle of the project ("don't push judgment onto the LLM") gets violated.
|
|
58
|
+
|
|
59
|
+
### Model B — Single layer
|
|
60
|
+
|
|
61
|
+
```
|
|
62
|
+
LLM → pattern invocations only → materializer → meta
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
LLM emits only `{ pattern, props }`. Materializer expands to full metadata.
|
|
66
|
+
|
|
67
|
+
**Pros**:
|
|
68
|
+
- LLM stays in its strong zone — enum selection, shallow schema filling.
|
|
69
|
+
- Computing cost moves from LLM token-generation to deterministic materializer.
|
|
70
|
+
- Output consistency is enforced by the materializer.
|
|
71
|
+
- Validation passes more reliably (materializer produces conformant output by construction).
|
|
72
|
+
|
|
73
|
+
**Cons**:
|
|
74
|
+
- Patterns might not cover every case → need escape hatches.
|
|
75
|
+
- The pattern library has to be designed carefully; missing coverage forces escape, which is expensive.
|
|
76
|
+
|
|
77
|
+
### Decision: Model B, with a visible escape ladder
|
|
78
|
+
|
|
79
|
+
The deciding factor was **computing cost on deep JSON**. The LLM producing 50kb+ of 7-level-nested metadata under a forced build sequence is the worst possible workload — high token cost, easy to hit tool-call limits, easy to lose consistency mid-output. Model B eliminates that entirely for the 90% case.
|
|
80
|
+
|
|
81
|
+
Model A's "drop to raw" capability is preserved via an escape ladder (§7), but it's deliberately more expensive than the default path. The cost asymmetry steers the LLM toward patterns.
|
|
82
|
+
|
|
83
|
+
---
|
|
84
|
+
|
|
85
|
+
## 4. Layer architecture: why three layers, not two
|
|
86
|
+
|
|
87
|
+
After deciding on Model B, the next question is how to organize the implementation. Naive version: one materializer per pattern, each producing full metadata directly. This works but two problems emerge:
|
|
88
|
+
|
|
89
|
+
1. **Boilerplate repetition** — every materializer that uses a `Label` repeats the same 8–10 ControlType setup fields (`LabelType: "labeltext"`, `Caption`, `ControlStyle: "None"`, `isColumnCtrl: false`, empty `Width`/`Height`/`BgStyle`/`FontStyle` defaults). New atoms get authored by copying an existing one and tweaking — drift inevitable.
|
|
90
|
+
2. **Mixing concerns** — design decisions (semantic→token mapping) get tangled with engine contract (which fields the ControlType requires).
|
|
91
|
+
|
|
92
|
+
Three-layer solution:
|
|
93
|
+
|
|
94
|
+
| Layer | Responsibility | Example |
|
|
95
|
+
|-------|---------------|---------|
|
|
96
|
+
| `_base.controls.mjs` | Engine contract — "to emit ControlType X, the metadata must look like this" | `makeLabel({ text, name })` |
|
|
97
|
+
| `_base.style.mjs` | Design system — "this token translates to this metadata object" | `font({ size, weight, color })` |
|
|
98
|
+
| `<pattern>.materialize.mjs` | Design decision — "this pattern uses control X with tokens Y" | StatusChip = Label + semantic bg + pill |
|
|
99
|
+
|
|
100
|
+
### Why factory is separate from token helper
|
|
101
|
+
|
|
102
|
+
Two different domains:
|
|
103
|
+
- Factory answers: "what fields does the engine require for this ControlType?"
|
|
104
|
+
- Token helper answers: "what styling object does this design token become?"
|
|
105
|
+
|
|
106
|
+
Mixing them produces design-aware factories like `makeStatusChip()`, which:
|
|
107
|
+
- Duplicate the pattern schema's responsibility
|
|
108
|
+
- Hide design decisions inside a helper (materializer becomes one-liner `makeStatusChip(label, color)` with no visible reasoning)
|
|
109
|
+
- Force factories to know about design tokens, blurring the layer boundary
|
|
110
|
+
|
|
111
|
+
Keeping them split lets the materializer remain the single, readable place where "this pattern is this design" is expressed.
|
|
112
|
+
|
|
113
|
+
### Why factory ≠ atom
|
|
114
|
+
|
|
115
|
+
This is subtle but important. A factory is *not* a tiny atom. A factory is an internal author-facing helper. An atom is an LLM-facing semantic primitive. They serve different audiences:
|
|
116
|
+
|
|
117
|
+
- Factory: visible to whoever writes `<pattern>.materialize.mjs`
|
|
118
|
+
- Atom: visible to the LLM via schema
|
|
119
|
+
|
|
120
|
+
Confusing them led to the brief consideration of "one atom per ControlType" — which fails because:
|
|
121
|
+
- ControlType is engine-level (~10–15 enums)
|
|
122
|
+
- Atom is design-level (`StatusChip`, `Avatar`, `BadgePill` — meaningful units the LLM picks by intent)
|
|
123
|
+
- The relationship is N:M, not 1:1 (one Label → multiple atoms; one Avatar might use ImageBox + Label fallback)
|
|
124
|
+
|
|
125
|
+
---
|
|
126
|
+
|
|
127
|
+
## 5. Atom qualification: what earns atom status
|
|
128
|
+
|
|
129
|
+
Three tests (must satisfy ≥1):
|
|
130
|
+
|
|
131
|
+
1. **Semantic pickability** — the LLM would meaningfully choose this by intent. "Status indicator" → `status-chip`. But "text" → `label` is not a meaningful pick; the LLM doesn't think "I need a label," it thinks "I need this card's title."
|
|
132
|
+
2. **Slot suitability** — fits inside an organism's slot as a self-contained unit.
|
|
133
|
+
3. **Absorbs design decisions** — owns semantic→token mapping, geometry choices, or interaction state. Beyond just "wrap a ControlType with styling."
|
|
134
|
+
|
|
135
|
+
Fails all three → factory helper instead. This is why Label, Heading, Caption, Divider, Spacer are factories, not atoms — they're styling wrappers, not design primitives.
|
|
136
|
+
|
|
137
|
+
### Practical consequence
|
|
138
|
+
|
|
139
|
+
The first atom batch isn't "one atom per ControlType" (would be a bloated list of trivial wrappers). It's the design-schema primitives decided in the prior session:
|
|
140
|
+
|
|
141
|
+
`Button`, `Chip`, `Checkbox`, `RadioGroup`, `TextField`, `Switch`, `Tab`, `IconButton`
|
|
142
|
+
|
|
143
|
+
These each carry real design decisions (8px radius for CTA, pill geometry as Switch's intentional exception, dual focus-ring system, four IconButton variants) that an atom is the right place to encode.
|
|
144
|
+
|
|
145
|
+
---
|
|
146
|
+
|
|
147
|
+
## 6. Tier structure: why Atomic Design
|
|
148
|
+
|
|
149
|
+
Atomic Design (atom/molecule/organism) maps cleanly to Flextudio's compositional structure:
|
|
150
|
+
|
|
151
|
+
- **atom** — 1 control, no slots, 2–4 props. Engine-leaf primitives with design opinion.
|
|
152
|
+
- **molecule** — 2–5 controls, no slots, 4–8 props. Fixed compositions (`InfoRow` = label + value).
|
|
153
|
+
- **organism** — composition with slots. The unit of screen-level structure (`ListCard`, `FormSection`).
|
|
154
|
+
|
|
155
|
+
### Why the constraints
|
|
156
|
+
|
|
157
|
+
- **Atom has no slot** — if you need composition, you've crossed into molecule/organism territory. Keeps atoms a clear primitive.
|
|
158
|
+
- **Molecule has no slot** — same reason, applied to the next level. Composition is the organism's job. Allowing slots in molecules would create a third "composable" tier and blur the boundary.
|
|
159
|
+
- **Organism slots accept atom/molecule only** — preventing organism-in-organism keeps the composition tree at most three levels deep. Screen-level reuse is a different concern (a separate composition pipeline, not nesting).
|
|
160
|
+
- **Slot names are semantic** (`trailing`, `leading`, `footer` — not `slot1`/`slot2`) — the LLM picks slots by meaning; positional names force it to reason about layout, which is the pattern's job.
|
|
161
|
+
|
|
162
|
+
---
|
|
163
|
+
|
|
164
|
+
## 7. Escape hatches: a cost ladder
|
|
165
|
+
|
|
166
|
+
Coverage gaps are inevitable. The question is how the escape behaves.
|
|
167
|
+
|
|
168
|
+
Design principle: **escape must exist, but must cost more than the default path.** Otherwise the LLM will gravitate to raw output whenever it's faster — and we're back to Model A.
|
|
169
|
+
|
|
170
|
+
| Level | Mechanism | LLM cost | When |
|
|
171
|
+
|-------|-----------|----------|------|
|
|
172
|
+
| L0 | `pattern + props` | Lowest | Pattern fits |
|
|
173
|
+
| L1 | `pattern + props + override` (named-anchor deep-merge patch on materialized nodes) | Slightly higher (must pick an anchor + reason about field shape) | Pattern's structure fits, but needs a field the props don't expose (e.g. `UseMove`/`MoveSteps`, a data connection) or a small tweak |
|
|
174
|
+
| L2 | `pattern.escape.raw-control` | Much higher (must emit full control metadata, no token helpers available) | No pattern fits; one-off binding or event |
|
|
175
|
+
| L3 | Add a new pattern | Author cost, not LLM cost | L2 recurs for the same shape |
|
|
176
|
+
|
|
177
|
+
### Why this shape
|
|
178
|
+
|
|
179
|
+
- **L1 (override)** absorbs two cases without forcing pattern proliferation: the common "90% of pattern + small tweak" *and* injecting engine metadata the simplified props deliberately don't expose (data binding, navigation, one-off flags). Both are the same mechanism — a deep-merge patch onto a materialized node.
|
|
180
|
+
- The patch is keyed by **anchor name**, not by mirroring the output tree. Every pattern supports `root` (the result's top node); multi-node patterns (molecules/organisms) expose semantic anchors for their children — e.g. `input-action` has `root` / `input` / `iconButton` / `badge`. The available anchors are listed in each schema's `override.propertyNames`.
|
|
181
|
+
- Anchors exist because a naive root-only deep-merge can't reach into array children (`Contents[]` gets replaced wholesale, not merged). The materializer knows which built node is which anchor and merges there directly — see `_base.additional-meta.mjs`.
|
|
182
|
+
- Validation: an injected field passes `[strict-fields]` as long as the field name is defined in *some* engine schema (the global `knownProps` union). A field defined nowhere (a typo) is still rejected — the escape is for real engine fields, not arbitrary keys. Caveat: the field must also be valid on the *node type* it lands on — e.g. `UseMove`/`MoveSteps` (Step navigation) is a Group-level feature, so inject it on a Group anchor (a molecule's `root` / a raw Group), not on an atom control. A field whose nested dynamic keys aren't covered by the target node's schema (e.g. `MoveSteps.StepN` on a Label) will fail strict validation on those keys.
|
|
183
|
+
- Cheap to specify: `{ "input": { "UseDataConnection": true } }` or `{ "root": { "FontStyle": { "FontSize": "16" } } }`.
|
|
184
|
+
- **L2 (raw-control)** is the (A)-model raw-output capability, reframed as a single named escape pattern. The reframing matters: it makes the cost visible (LLM must populate ~30 fields with no helpers), and it routes through the same validate / materialize path as everything else.
|
|
185
|
+
- **L3** is the maintenance signal: if the same L2 invocation recurs, the pattern library has a gap. Add the pattern; remove the escape.
|
|
186
|
+
|
|
187
|
+
### Measurement as a coverage signal
|
|
188
|
+
|
|
189
|
+
In Phase 4 validation (rewriting 4 example scenarios), L1 and L2 usage rates become a coverage metric:
|
|
190
|
+
- L1 > 10% → pattern shapes don't quite match real cases; add variants or relax schema
|
|
191
|
+
- L2 > 1% → real coverage gaps; add atoms/molecules
|
|
192
|
+
|
|
193
|
+
This is the feedback loop that grows the library to fit actual usage, instead of guessing.
|
|
194
|
+
|
|
195
|
+
---
|
|
196
|
+
|
|
197
|
+
## 8. Documentation philosophy
|
|
198
|
+
|
|
199
|
+
Decision: **no separate `.md` files per pattern.** The schema's `description` field is the doc.
|
|
200
|
+
|
|
201
|
+
Reasoning:
|
|
202
|
+
- Two-file maintenance (`.schema.json` + `.md`) inevitably drifts.
|
|
203
|
+
- Schema descriptions can be multi-paragraph; nothing forces them to be one-liners.
|
|
204
|
+
- The LLM consumes schemas by reading the static skill assets (`schemas/`, `patterns/`); putting docs anywhere else means the LLM never sees them.
|
|
205
|
+
- `examples` field carries concrete usage; `x-related` carries cross-references. Together with `description` this matches the information density of a typical component `.md`.
|
|
206
|
+
|
|
207
|
+
The cost is that schema files become longer (~30–80 lines for a typical atom). The benefit is single-source documentation that's actually used.
|
|
208
|
+
|
|
209
|
+
---
|
|
210
|
+
|
|
211
|
+
## 9. Migration sequencing: why strict order
|
|
212
|
+
|
|
213
|
+
The deprecation must happen *after* the replacement is built. Specifically: removing `assets.json` before the pattern library is functional destroys the `deprecated → replacedBy` token mappings (gray, gray-middle, gray-light, gray-6) that normalize legacy metadata.
|
|
214
|
+
|
|
215
|
+
Order:
|
|
216
|
+
1. Build pattern library (helpers → atoms → molecules → organisms)
|
|
217
|
+
2. Wire the CLI (`flex-scenario`) + skill assets
|
|
218
|
+
3. Salvage migration data into `migrations.json`
|
|
219
|
+
4. Verify on real scenarios
|
|
220
|
+
5. Only then deprecate
|
|
221
|
+
|
|
222
|
+
Phase 1 has its own internal order: factories must exist before atoms can use them; `_base.materialize.mjs` (slot resolution) must exist before organisms can be authored. Building atoms before factories means writing raw metadata literals, defeating the purpose.
|
|
223
|
+
|
|
224
|
+
---
|
|
225
|
+
|
|
226
|
+
## 10. Reading order for re-entry
|
|
227
|
+
|
|
228
|
+
If you're picking up this work in a future session:
|
|
229
|
+
|
|
230
|
+
1. This document (rationale)
|
|
231
|
+
2. `patterns-development-guide-v2.md` (implementation brief)
|
|
232
|
+
3. `DESIGN.md` (tokens — single source of truth)
|
|
233
|
+
4. `catalog.json` (engine enums)
|
|
234
|
+
5. `examples/enhanced/search-period-popup.json` (a working scenario; ground truth for what valid metadata looks like)
|
|
235
|
+
6. `validate.mjs` (the actual contract — 16 cross-checks)
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
# Scenario shell — outer wrap of every scenario JSON
|
|
2
|
+
|
|
3
|
+
> The outer wrap — ScenarioMeta + `Steps` map + each Step's metadata — is **always raw**. Use the skeleton below; schemas (`scenario.schema.json`, `step.schema.json`, `bottom-buttons.schema.json`) are the validation contract.
|
|
4
|
+
|
|
5
|
+
## 1. Canonical scenario skeleton (copy → fill `…`)
|
|
6
|
+
|
|
7
|
+
```jsonc
|
|
8
|
+
{
|
|
9
|
+
// ─── ScenarioMeta — top-level fixed slots (DO NOT vary const fields) ───
|
|
10
|
+
"modules": {}, // ★ const {}
|
|
11
|
+
"htmlkey": "stephtml", // ★ const "stephtml"
|
|
12
|
+
"ScenarioTitle": "", // ★ const "" — display name lives in fScenarioName
|
|
13
|
+
"fConverterVersion": 1, // ★ const number 1 (not string)
|
|
14
|
+
"fScenarioName": "…", // display name (free string)
|
|
15
|
+
"Collections": {}, // ★ const {} — engine fills at runtime
|
|
16
|
+
"FlexSQLService": {}, // ★ const {}
|
|
17
|
+
"ServiceBinding": {}, // ★ const {} — [no-service] strict
|
|
18
|
+
|
|
19
|
+
// ─── Steps routing ───
|
|
20
|
+
"StartSteps": ["Step1"], // ≥1 required when Steps non-empty
|
|
21
|
+
|
|
22
|
+
// ─── Steps map (keys: ^Step[1-9][0-9]*$) ───
|
|
23
|
+
"Steps": {
|
|
24
|
+
"Step1": {
|
|
25
|
+
"StepName": "…", // internal name
|
|
26
|
+
"StepType": "StepView", // "StepView" | "StepSub". Always author explicitly
|
|
27
|
+
"StepRow": 0,
|
|
28
|
+
"StepCol": 0,
|
|
29
|
+
"Contents": [ // pattern invocations + raw Groups
|
|
30
|
+
// { "<patternName>": { ...props } }
|
|
31
|
+
// { "ContentsType": "Group", "UseDataConnection": false, "Contents": [ … ] } // raw Group fallback — UseDataConnection 필수(생략 시 [group-dc])
|
|
32
|
+
],
|
|
33
|
+
"Next": ["Step2"], // forward-only StepIds. [] for terminal
|
|
34
|
+
"UseStepHeader": false, // true ⇒ author StepTitle
|
|
35
|
+
"UseBackButton": false, // StepSub forces false
|
|
36
|
+
"UseBottomButton": false, // StepSub forces false
|
|
37
|
+
"UseEvents": false, // true ⇒ Events is object (§3); false ⇒ Events is []
|
|
38
|
+
"Events": []
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
|
|
42
|
+
// ─── Optional top-level slots ───
|
|
43
|
+
"Language": {}, // i18n map for {{key}} substitution
|
|
44
|
+
"Events": {}, // scenario-level handlers — Script / LinkedEvent only (NO Service/API)
|
|
45
|
+
"DataSources": {}, // for Combo / RadioBox / Search / Tree
|
|
46
|
+
"Scenario": { "StyleURLs": [] }, // external JS lib URLs
|
|
47
|
+
"Panel": { // data model slot — AI emits empty shapes
|
|
48
|
+
"Collection": { "Ckeys": [] },
|
|
49
|
+
"Category": {},
|
|
50
|
+
"CategoryOrder": [],
|
|
51
|
+
"Table": [],
|
|
52
|
+
"ExternalTable": [],
|
|
53
|
+
"AuthKey": []
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
**Common rejections by `flex-scenario validate`:**
|
|
59
|
+
- ❌ Scenario name in `ScenarioTitle` → must be `""`; use `fScenarioName`
|
|
60
|
+
- ❌ `fConverterVersion: "1"` string → must be number `1`
|
|
61
|
+
- ❌ `ServiceBinding: { ... }` non-empty → must be `{}` ([no-service])
|
|
62
|
+
- ❌ Missing `StartSteps` when `Steps` non-empty
|
|
63
|
+
- ❌ `Collections` or `Panel.Collection.Ckeys` non-empty
|
|
64
|
+
- ❌ Authoring `EmbedScenarioPrefix` → schema forbids the key
|
|
65
|
+
|
|
66
|
+
## 2. Step shape
|
|
67
|
+
|
|
68
|
+
StepId pattern: `^Step[1-9][0-9]*$`. Always author `StepType: "StepView"` explicitly unless embedding a sub-scenario.
|
|
69
|
+
|
|
70
|
+
| Field | Type | Notes |
|
|
71
|
+
|---|---|---|
|
|
72
|
+
| `StepName` | `string` | Always author — internal display name |
|
|
73
|
+
| `StepType` | `"StepView"` \| `"StepSub"` | Omit ⇒ runtime treats as StepView |
|
|
74
|
+
| `Contents` | `Group[]` | Page body — patterns + raw Groups |
|
|
75
|
+
| `Next` | `string[]` | Forward-only StepIds. `[]` for terminal |
|
|
76
|
+
| `StepTitle` | `string` | Only with `UseStepHeader: true` |
|
|
77
|
+
| `UseStepHeader` | `boolean` | Top header toggle |
|
|
78
|
+
| `FixedContentsTop` | `Group[]` | Sticky top region (top-bar pattern) |
|
|
79
|
+
| `FixedContentsBottom` | `Group[]` | Sticky bottom — canonical place for primary `button` atom |
|
|
80
|
+
| `UseBackButton` | `boolean` | + author `BackButton` block. **StepSub forces false** |
|
|
81
|
+
| `UseBottomButton` | `boolean` | + author `BottomButtons[]` for fixed-bottom CTAs. **StepSub forces false**. For *inline body* buttons use the `button` pattern instead |
|
|
82
|
+
| `UseEvents` | `boolean` | See §3. **StepSub forces false** |
|
|
83
|
+
|
|
84
|
+
Step-level styling (`Padding` / `Margin` / `BgStyle`, plus dialog-only `Width` / `Height`) uses **raw** shapes. Engine defaults usually fit — author only when overriding. Read `step.schema.json` for shapes.
|
|
85
|
+
|
|
86
|
+
## 3. `Step.Events` shape
|
|
87
|
+
|
|
88
|
+
```jsonc
|
|
89
|
+
// UseEvents: true → Events is an OBJECT
|
|
90
|
+
{
|
|
91
|
+
"UseEvents": true,
|
|
92
|
+
"Events": {
|
|
93
|
+
"StepEventOrder": ["Init", "Loaded"], // enum the events that fire
|
|
94
|
+
"Init": "handlerName_a", // required for each entry in StepEventOrder (matching key)
|
|
95
|
+
"Loaded": "handlerName_b"
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// UseEvents: false → Events MUST be an empty ARRAY (not {})
|
|
100
|
+
{ "UseEvents": false, "Events": [] }
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
Event enum (6): `Init` / `Loaded` / `OnBackLoaded` / `OnLeave` / `OnForeground` / `ScrollEnd`.
|
|
104
|
+
Each handler name must exist in scenario-level `Events` — else `[event-ref]` fails.
|
|
105
|
+
|
|
106
|
+
**Common mistakes:**
|
|
107
|
+
- ❌ `UseEvents: false, Events: {}` → must be `[]`
|
|
108
|
+
- ❌ Listing `"Init"` in `StepEventOrder` without the matching `"Init": "handler"` key
|
|
109
|
+
- ❌ Authoring `"Init"` handler key but omitting it from `StepEventOrder` (won't fire)
|
|
110
|
+
|
|
111
|
+
## 4. When to fetch full schemas
|
|
112
|
+
|
|
113
|
+
The §1 skeleton covers ~95%. Read the schema file directly for edge cases:
|
|
114
|
+
|
|
115
|
+
- `scenario.schema.json` — top-level scenarioMeta
|
|
116
|
+
- `step.schema.json` — single Step. Required for **StepSub** (`Protocol` block) and **Dialog variants** (`StepDialogType: "SlideUp"` / `"PopUp"` — unlocks `useDim` / `dimTransp` / `Width` / `Height` / `PopupPosition`)
|
|
117
|
+
- `bottom-buttons.schema.json` — BottomButtons[] item
|
|
118
|
+
- `group.schema.json` — raw Group
|
|
119
|
+
- `data-sources.schema.json` — DataSources map
|
|
120
|
+
- `events.schema.json` — Action shapes for scenario-level Events
|