@10x-media/form-builder 0.1.0-beta.2 → 0.1.0-beta.21
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/CHANGELOG.md +360 -0
- package/README.md +7 -5
- package/dist/actions/assertNoBlockCollision.js +18 -0
- package/dist/actions/assertNoBlockCollision.js.map +1 -0
- package/dist/actions/body/converters.d.ts +20 -0
- package/dist/actions/body/converters.js +57 -0
- package/dist/actions/body/converters.js.map +1 -0
- package/dist/actions/body/escapeHtml.d.ts +6 -0
- package/dist/actions/body/escapeHtml.js +14 -0
- package/dist/actions/body/escapeHtml.js.map +1 -0
- package/dist/actions/body/serializeBody.d.ts +55 -0
- package/dist/actions/body/serializeBody.js +78 -0
- package/dist/actions/body/serializeBody.js.map +1 -0
- package/dist/actions/body/serializeSlate.js +31 -0
- package/dist/actions/body/serializeSlate.js.map +1 -0
- package/dist/actions/body/textOfBody.d.ts +13 -0
- package/dist/actions/body/textOfBody.js +35 -0
- package/dist/actions/body/textOfBody.js.map +1 -0
- package/dist/actions/body/wildcards.d.ts +10 -0
- package/dist/actions/body/wildcards.js +33 -0
- package/dist/actions/body/wildcards.js.map +1 -0
- package/dist/actions/buildActionBlocks.js +12 -9
- package/dist/actions/buildActionBlocks.js.map +1 -1
- package/dist/actions/builtin/confirmation.js +47 -43
- package/dist/actions/builtin/confirmation.js.map +1 -1
- package/dist/actions/builtin/emailAction.d.ts +20 -0
- package/dist/actions/builtin/emailAction.js +120 -0
- package/dist/actions/builtin/emailAction.js.map +1 -0
- package/dist/actions/builtin/emailTeam.js +20 -38
- package/dist/actions/builtin/emailTeam.js.map +1 -1
- package/dist/actions/builtin/index.d.ts +16 -1
- package/dist/actions/builtin/index.js +21 -7
- package/dist/actions/builtin/index.js.map +1 -1
- package/dist/actions/builtin/signedWebhook.js +6 -2
- package/dist/actions/builtin/signedWebhook.js.map +1 -1
- package/dist/actions/defineAction.d.ts +17 -5
- package/dist/actions/defineAction.js.map +1 -1
- package/dist/actions/dispatch.js +51 -6
- package/dist/actions/dispatch.js.map +1 -1
- package/dist/actions/dispatchContext.js +13 -0
- package/dist/actions/dispatchContext.js.map +1 -0
- package/dist/actions/emailRecipients.d.ts +12 -0
- package/dist/actions/emailRecipients.js +146 -0
- package/dist/actions/emailRecipients.js.map +1 -0
- package/dist/actions/fromAddresses.d.ts +37 -0
- package/dist/actions/fromAddresses.js +131 -0
- package/dist/actions/fromAddresses.js.map +1 -0
- package/dist/actions/recipientSources.d.ts +34 -0
- package/dist/actions/recipientSources.js +11 -0
- package/dist/actions/recipientSources.js.map +1 -0
- package/dist/actions/registry.d.ts +2 -1
- package/dist/actions/registry.js +5 -7
- package/dist/actions/registry.js.map +1 -1
- package/dist/actions/runActions.js +10 -1
- package/dist/actions/runActions.js.map +1 -1
- package/dist/actions/task.js +47 -16
- package/dist/actions/task.js.map +1 -1
- package/dist/aggregation/aggregateResponses.d.ts +9 -0
- package/dist/aggregation/aggregateResponses.js +8 -14
- package/dist/aggregation/aggregateResponses.js.map +1 -1
- package/dist/aggregation/resolveResultsRequest.d.ts +41 -6
- package/dist/aggregation/resolveResultsRequest.js +97 -11
- package/dist/aggregation/resolveResultsRequest.js.map +1 -1
- package/dist/calc/computeCalcFields.d.ts +5 -3
- package/dist/calc/computeCalcFields.js +6 -4
- package/dist/calc/computeCalcFields.js.map +1 -1
- package/dist/calc/evaluate.d.ts +26 -3
- package/dist/calc/evaluate.js +34 -13
- package/dist/calc/evaluate.js.map +1 -1
- package/dist/calc/formatCalc.d.ts +11 -0
- package/dist/calc/formatCalc.js +35 -0
- package/dist/calc/formatCalc.js.map +1 -0
- package/dist/calc/formatCalcValue.d.ts +17 -0
- package/dist/calc/formatCalcValue.js +17 -0
- package/dist/calc/formatCalcValue.js.map +1 -0
- package/dist/calc/normalizeCalc.d.ts +17 -3
- package/dist/calc/normalizeCalc.js +42 -33
- package/dist/calc/normalizeCalc.js.map +1 -1
- package/dist/calc/registry.d.ts +43 -0
- package/dist/calc/registry.js +27 -0
- package/dist/calc/registry.js.map +1 -0
- package/dist/calc/resolveCalcContext.d.ts +36 -0
- package/dist/calc/resolveCalcContext.js +87 -0
- package/dist/calc/resolveCalcContext.js.map +1 -0
- package/dist/calc/types.d.ts +25 -4
- package/dist/calc/types.js +23 -0
- package/dist/calc/types.js.map +1 -0
- package/dist/client/ByteSizeField.d.ts +29 -0
- package/dist/client/ByteSizeField.js +58 -0
- package/dist/client/ByteSizeField.js.map +1 -0
- package/dist/client/CalcExpressionBuilder.d.ts +20 -0
- package/dist/client/CalcExpressionBuilder.js +890 -0
- package/dist/client/CalcExpressionBuilder.js.map +1 -0
- package/dist/client/ClosePollButton.d.ts +15 -0
- package/dist/client/ClosePollButton.js +80 -0
- package/dist/client/ClosePollButton.js.map +1 -0
- package/dist/client/CondensedArray.d.ts +15 -0
- package/dist/client/CondensedArray.js +97 -0
- package/dist/client/CondensedArray.js.map +1 -0
- package/dist/client/ConditionBuilder.js +2 -1
- package/dist/client/ConditionBuilder.js.map +1 -1
- package/dist/client/ConsentBlockLabel.d.ts +15 -0
- package/dist/client/ConsentBlockLabel.js +71 -0
- package/dist/client/ConsentBlockLabel.js.map +1 -0
- package/dist/client/ConsentSourceRowLabel.d.ts +9 -0
- package/dist/client/ConsentSourceRowLabel.js +21 -0
- package/dist/client/ConsentSourceRowLabel.js.map +1 -0
- package/dist/client/EndpointOptionsSelect.d.ts +55 -0
- package/dist/client/EndpointOptionsSelect.js +112 -0
- package/dist/client/EndpointOptionsSelect.js.map +1 -0
- package/dist/client/FieldBlockLabel.d.ts +18 -0
- package/dist/client/FieldBlockLabel.js +34 -0
- package/dist/client/FieldBlockLabel.js.map +1 -0
- package/dist/client/FieldNameSelect.d.ts +37 -0
- package/dist/client/FieldNameSelect.js +72 -0
- package/dist/client/FieldNameSelect.js.map +1 -0
- package/dist/client/FlowBuilder.d.ts +2 -2
- package/dist/client/FlowBuilder.js +137 -88
- package/dist/client/FlowBuilder.js.map +1 -1
- package/dist/client/FormConditionField.js +1 -4
- package/dist/client/FormConditionField.js.map +1 -1
- package/dist/client/RecipientsSelect.d.ts +37 -0
- package/dist/client/RecipientsSelect.js +197 -0
- package/dist/client/RecipientsSelect.js.map +1 -0
- package/dist/client/RuleDescription.d.ts +21 -0
- package/dist/client/RuleDescription.js +19 -0
- package/dist/client/RuleDescription.js.map +1 -0
- package/dist/client/admin.css +557 -0
- package/dist/client/endpointOptions.d.ts +11 -0
- package/dist/client/endpointOptions.js +38 -0
- package/dist/client/endpointOptions.js.map +1 -0
- package/dist/client/flowAuthoring.js +142 -0
- package/dist/client/flowAuthoring.js.map +1 -0
- package/dist/client/synthesizeClientField.js +21 -10
- package/dist/client/synthesizeClientField.js.map +1 -1
- package/dist/client/toStaticLabel.js +13 -0
- package/dist/client/toStaticLabel.js.map +1 -0
- package/dist/collections/buttonFields.d.ts +34 -0
- package/dist/collections/buttonFields.js +35 -0
- package/dist/collections/buttonFields.js.map +1 -0
- package/dist/collections/cells/FieldCountCell.d.ts +15 -0
- package/dist/collections/cells/FieldCountCell.js +18 -0
- package/dist/collections/cells/FieldCountCell.js.map +1 -0
- package/dist/collections/cells/FlowStepsCell.d.ts +14 -0
- package/dist/collections/cells/FlowStepsCell.js +17 -0
- package/dist/collections/cells/FlowStepsCell.js.map +1 -0
- package/dist/collections/formSubmissions.js +114 -28
- package/dist/collections/formSubmissions.js.map +1 -1
- package/dist/collections/forms.js +449 -112
- package/dist/collections/forms.js.map +1 -1
- package/dist/collections/formsEndpoints.js +106 -0
- package/dist/collections/formsEndpoints.js.map +1 -0
- package/dist/collections/redirectFields.d.ts +29 -0
- package/dist/collections/settingsFields.d.ts +31 -0
- package/dist/collections/settingsFields.js +45 -0
- package/dist/collections/settingsFields.js.map +1 -0
- package/dist/conditions/conditionType.js +9 -2
- package/dist/conditions/conditionType.js.map +1 -1
- package/dist/conditions/evaluate.js +1 -1
- package/dist/conditions/evaluate.js.map +1 -1
- package/dist/conditions/fieldTypes.d.ts +3 -1
- package/dist/conditions/fieldTypes.js +4 -1
- package/dist/conditions/fieldTypes.js.map +1 -1
- package/dist/conditions/normalizeConditions.js +20 -6
- package/dist/conditions/normalizeConditions.js.map +1 -1
- package/dist/consent/applyConsentStatements.d.ts +14 -0
- package/dist/consent/applyConsentStatements.js +17 -0
- package/dist/consent/applyConsentStatements.js.map +1 -0
- package/dist/consent/captureConsent.d.ts +39 -11
- package/dist/consent/captureConsent.js +63 -13
- package/dist/consent/captureConsent.js.map +1 -1
- package/dist/consent/consentSourcesField.d.ts +66 -0
- package/dist/consent/consentSourcesField.js +98 -0
- package/dist/consent/consentSourcesField.js.map +1 -0
- package/dist/consent/effectiveStatement.js +16 -0
- package/dist/consent/effectiveStatement.js.map +1 -0
- package/dist/consent/resolveConsentEntries.d.ts +24 -0
- package/dist/consent/resolveConsentEntries.js +40 -0
- package/dist/consent/resolveConsentEntries.js.map +1 -0
- package/dist/consent/resolveConsentSourcesRequest.d.ts +37 -0
- package/dist/consent/resolveConsentSourcesRequest.js +54 -0
- package/dist/consent/resolveConsentSourcesRequest.js.map +1 -0
- package/dist/consent/resolveConsentStatements.d.ts +45 -0
- package/dist/consent/resolveConsentStatements.js +46 -0
- package/dist/consent/resolveConsentStatements.js.map +1 -0
- package/dist/consent/resolvePublishedVersionRef.d.ts +17 -11
- package/dist/consent/resolvePublishedVersionRef.js +13 -10
- package/dist/consent/resolvePublishedVersionRef.js.map +1 -1
- package/dist/consent/types.d.ts +69 -0
- package/dist/context/formContext.d.ts +30 -0
- package/dist/context/formContext.js +54 -0
- package/dist/context/formContext.js.map +1 -0
- package/dist/email/departments.d.ts +59 -0
- package/dist/email/departments.js +87 -0
- package/dist/email/departments.js.map +1 -0
- package/dist/email/departmentsField.d.ts +53 -0
- package/dist/email/departmentsField.js +73 -0
- package/dist/email/departmentsField.js.map +1 -0
- package/dist/exports/client.d.ts +14 -1
- package/dist/exports/client.js +14 -1
- package/dist/exports/i18n.d.ts +5 -2
- package/dist/exports/i18n.js +5 -2
- package/dist/exports/react.d.ts +34 -10
- package/dist/exports/react.js +24 -4
- package/dist/exports/rsc.d.ts +10 -1
- package/dist/exports/rsc.js +10 -1
- package/dist/exports/types.d.ts +20 -12
- package/dist/fields/buildFieldBlocks.js +46 -25
- package/dist/fields/buildFieldBlocks.js.map +1 -1
- package/dist/fields/builtin/calculation.d.ts +17 -0
- package/dist/fields/builtin/calculation.js +193 -18
- package/dist/fields/builtin/calculation.js.map +1 -1
- package/dist/fields/builtin/checkbox.js +23 -0
- package/dist/fields/builtin/checkbox.js.map +1 -1
- package/dist/fields/builtin/consent.js +49 -14
- package/dist/fields/builtin/consent.js.map +1 -1
- package/dist/fields/builtin/country.d.ts +13 -0
- package/dist/fields/builtin/country.js +30 -0
- package/dist/fields/builtin/country.js.map +1 -0
- package/dist/fields/builtin/date.js +31 -0
- package/dist/fields/builtin/date.js.map +1 -0
- package/dist/fields/builtin/email.js +8 -1
- package/dist/fields/builtin/email.js.map +1 -1
- package/dist/fields/builtin/file.d.ts +15 -0
- package/dist/fields/builtin/file.js +95 -8
- package/dist/fields/builtin/file.js.map +1 -1
- package/dist/fields/builtin/index.d.ts +30 -0
- package/dist/fields/builtin/index.js +37 -10
- package/dist/fields/builtin/index.js.map +1 -1
- package/dist/fields/builtin/message.js +30 -0
- package/dist/fields/builtin/message.js.map +1 -0
- package/dist/fields/builtin/repeater.js +8 -3
- package/dist/fields/builtin/repeater.js.map +1 -1
- package/dist/fields/builtin/select.js +28 -4
- package/dist/fields/builtin/select.js.map +1 -1
- package/dist/fields/builtin/state.d.ts +13 -0
- package/dist/fields/builtin/state.js +30 -0
- package/dist/fields/builtin/state.js.map +1 -0
- package/dist/fields/builtin/text.js +7 -0
- package/dist/fields/builtin/text.js.map +1 -1
- package/dist/fields/data/regions.d.ts +21 -0
- package/dist/fields/data/regions.js +1238 -0
- package/dist/fields/data/regions.js.map +1 -0
- package/dist/fields/fieldKey.d.ts +15 -0
- package/dist/fields/fieldKey.js +16 -0
- package/dist/fields/fieldKey.js.map +1 -0
- package/dist/fields/fieldNamesOfType.js +30 -0
- package/dist/fields/fieldNamesOfType.js.map +1 -0
- package/dist/fields/instanceOptions.js +20 -0
- package/dist/fields/instanceOptions.js.map +1 -0
- package/dist/fields/localizedIf.d.ts +13 -0
- package/dist/fields/localizedIf.js +12 -0
- package/dist/fields/localizedIf.js.map +1 -0
- package/dist/fields/registry.d.ts +3 -1
- package/dist/fields/registry.js +23 -8
- package/dist/fields/registry.js.map +1 -1
- package/dist/fields/sharedConfig.js +125 -59
- package/dist/fields/sharedConfig.js.map +1 -1
- package/dist/fields/types.d.ts +78 -9
- package/dist/flow/engine.d.ts +6 -4
- package/dist/flow/engine.js +11 -6
- package/dist/flow/engine.js.map +1 -1
- package/dist/flow/normalizeFlow.js +28 -9
- package/dist/flow/normalizeFlow.js.map +1 -1
- package/dist/flow/stepLabel.js +15 -0
- package/dist/flow/stepLabel.js.map +1 -0
- package/dist/flow/types.d.ts +12 -3
- package/dist/flow/types.js +11 -0
- package/dist/flow/types.js.map +1 -0
- package/dist/form/pollState.d.ts +23 -0
- package/dist/form/pollState.js +17 -0
- package/dist/form/pollState.js.map +1 -0
- package/dist/form/toFormDocument.d.ts +110 -0
- package/dist/form/toFormDocument.js +89 -0
- package/dist/form/toFormDocument.js.map +1 -0
- package/dist/form/types.d.ts +73 -0
- package/dist/index.d.ts +67 -61
- package/dist/index.js +120 -25
- package/dist/index.js.map +1 -1
- package/dist/options.d.ts +281 -0
- package/dist/plugin/applyRegistryConfig.d.ts +11 -0
- package/dist/plugin/applyRegistryConfig.js +20 -0
- package/dist/plugin/applyRegistryConfig.js.map +1 -0
- package/dist/plugin/customState.js +26 -0
- package/dist/plugin/customState.js.map +1 -0
- package/dist/plugin/registerCollections.js +43 -40
- package/dist/plugin/registerCollections.js.map +1 -1
- package/dist/plugin/uploadsCollection.d.ts +16 -0
- package/dist/plugin/uploadsCollection.js +53 -0
- package/dist/plugin/uploadsCollection.js.map +1 -0
- package/dist/poll/applyPollOptions.js +18 -0
- package/dist/poll/applyPollOptions.js.map +1 -0
- package/dist/poll/buildPollOptionSourceFields.js +50 -0
- package/dist/poll/buildPollOptionSourceFields.js.map +1 -0
- package/dist/poll/closeJob.d.ts +53 -0
- package/dist/poll/closeJob.js +121 -0
- package/dist/poll/closeJob.js.map +1 -0
- package/dist/poll/definePollOptionSource.d.ts +44 -0
- package/dist/poll/definePollOptionSource.js +6 -0
- package/dist/poll/definePollOptionSource.js.map +1 -0
- package/dist/poll/definePollType.d.ts +34 -0
- package/dist/poll/definePollType.js +6 -0
- package/dist/poll/definePollType.js.map +1 -0
- package/dist/poll/effectivePollOptions.d.ts +38 -0
- package/dist/poll/effectivePollOptions.js +64 -0
- package/dist/poll/effectivePollOptions.js.map +1 -0
- package/dist/poll/mostVoted.d.ts +21 -0
- package/dist/poll/mostVoted.js +32 -0
- package/dist/poll/mostVoted.js.map +1 -0
- package/dist/poll/outcomeBeforeChange.js +91 -0
- package/dist/poll/outcomeBeforeChange.js.map +1 -0
- package/dist/poll/outcomeFields.d.ts +38 -0
- package/dist/poll/outcomeFields.js +52 -0
- package/dist/poll/outcomeFields.js.map +1 -0
- package/dist/poll/pollTypeRegistry.d.ts +34 -0
- package/dist/poll/pollTypeRegistry.js +69 -0
- package/dist/poll/pollTypeRegistry.js.map +1 -0
- package/dist/poll/registry.d.ts +17 -0
- package/dist/poll/registry.js +12 -0
- package/dist/poll/registry.js.map +1 -0
- package/dist/poll/resolvePollCloseRequest.js +106 -0
- package/dist/poll/resolvePollCloseRequest.js.map +1 -0
- package/dist/poll/resolvePollOptions.d.ts +29 -0
- package/dist/poll/resolvePollOptions.js +52 -0
- package/dist/poll/resolvePollOptions.js.map +1 -0
- package/dist/poll/resolvePollOptionsRequest.js +50 -0
- package/dist/poll/resolvePollOptionsRequest.js.map +1 -0
- package/dist/poll/resolvePollOutcome.d.ts +40 -0
- package/dist/poll/resolvePollOutcome.js +90 -0
- package/dist/poll/resolvePollOutcome.js.map +1 -0
- package/dist/poll/resultsField.js +21 -0
- package/dist/poll/resultsField.js.map +1 -0
- package/dist/poll/votes/aggregateFromVotes.d.ts +27 -0
- package/dist/poll/votes/aggregateFromVotes.js +54 -0
- package/dist/poll/votes/aggregateFromVotes.js.map +1 -0
- package/dist/poll/votes/answerValues.js +16 -0
- package/dist/poll/votes/answerValues.js.map +1 -0
- package/dist/poll/votes/bumpPollVote.js +88 -0
- package/dist/poll/votes/bumpPollVote.js.map +1 -0
- package/dist/poll/votes/recountPollVotes.d.ts +20 -0
- package/dist/poll/votes/recountPollVotes.js +63 -0
- package/dist/poll/votes/recountPollVotes.js.map +1 -0
- package/dist/poll/votes/voteTallyHook.js +76 -0
- package/dist/poll/votes/voteTallyHook.js.map +1 -0
- package/dist/poll/votes/votesCollection.d.ts +19 -0
- package/dist/poll/votes/votesCollection.js +89 -0
- package/dist/poll/votes/votesCollection.js.map +1 -0
- package/dist/prefill/valuesFromSearchParams.js +5 -9
- package/dist/prefill/valuesFromSearchParams.js.map +1 -1
- package/dist/presentations/types.d.ts +3 -2
- package/dist/react/Form.d.ts +77 -35
- package/dist/react/Form.js +368 -222
- package/dist/react/Form.js.map +1 -1
- package/dist/react/FormContext.d.ts +51 -1
- package/dist/react/FormContext.js.map +1 -1
- package/dist/react/FormControls.d.ts +55 -0
- package/dist/react/FormControls.js +56 -0
- package/dist/react/FormControls.js.map +1 -0
- package/dist/react/FormFields.d.ts +18 -0
- package/dist/react/FormFields.js +114 -0
- package/dist/react/FormFields.js.map +1 -0
- package/dist/react/FormLayout.d.ts +4 -2
- package/dist/react/FormLayout.js +3 -2
- package/dist/react/FormLayout.js.map +1 -1
- package/dist/react/FormResults.d.ts +8 -3
- package/dist/react/FormResults.js +50 -29
- package/dist/react/FormResults.js.map +1 -1
- package/dist/react/FormSteps.d.ts +17 -0
- package/dist/react/FormSteps.js +35 -0
- package/dist/react/FormSteps.js.map +1 -0
- package/dist/react/Poll.d.ts +40 -6
- package/dist/react/Poll.js +137 -33
- package/dist/react/Poll.js.map +1 -1
- package/dist/react/adapters.d.ts +35 -0
- package/dist/react/adapters.js +11 -0
- package/dist/react/adapters.js.map +1 -0
- package/dist/react/captcha/HcaptchaCaptcha.d.ts +31 -0
- package/dist/react/captcha/HcaptchaCaptcha.js +53 -0
- package/dist/react/captcha/HcaptchaCaptcha.js.map +1 -0
- package/dist/react/captcha/RecaptchaCaptcha.d.ts +44 -0
- package/dist/react/captcha/RecaptchaCaptcha.js +93 -0
- package/dist/react/captcha/RecaptchaCaptcha.js.map +1 -0
- package/dist/react/captcha/TurnstileCaptcha.d.ts +31 -0
- package/dist/react/captcha/TurnstileCaptcha.js +53 -0
- package/dist/react/captcha/TurnstileCaptcha.js.map +1 -0
- package/dist/react/captcha/types.d.ts +8 -0
- package/dist/react/captcha/useCaptchaScript.js +63 -0
- package/dist/react/captcha/useCaptchaScript.js.map +1 -0
- package/dist/react/captcha/vendors.js +8 -0
- package/dist/react/captcha/vendors.js.map +1 -0
- package/dist/react/contract.d.ts +2 -3
- package/dist/react/contract.js.map +1 -1
- package/dist/react/fetchResults.d.ts +1 -1
- package/dist/react/fetchResults.js +1 -1
- package/dist/react/fetchResults.js.map +1 -1
- package/dist/react/presentation/DialogSurface.js +1 -4
- package/dist/react/presentation/DialogSurface.js.map +1 -1
- package/dist/react/primitives/Checkbox.d.ts +6 -2
- package/dist/react/primitives/Checkbox.js +4 -2
- package/dist/react/primitives/Checkbox.js.map +1 -1
- package/dist/react/primitives/ChoiceGroup.d.ts +40 -0
- package/dist/react/primitives/ChoiceGroup.js +33 -0
- package/dist/react/primitives/ChoiceGroup.js.map +1 -0
- package/dist/react/primitives/FieldShell.d.ts +13 -5
- package/dist/react/primitives/FieldShell.js +35 -32
- package/dist/react/primitives/FieldShell.js.map +1 -1
- package/dist/react/primitives/Input.d.ts +4 -2
- package/dist/react/primitives/Input.js +2 -1
- package/dist/react/primitives/Input.js.map +1 -1
- package/dist/react/renderers/calculation.js +7 -5
- package/dist/react/renderers/calculation.js.map +1 -1
- package/dist/react/renderers/checkbox.js +3 -5
- package/dist/react/renderers/checkbox.js.map +1 -1
- package/dist/react/renderers/consent.js +84 -36
- package/dist/react/renderers/consent.js.map +1 -1
- package/dist/react/renderers/date.js +33 -0
- package/dist/react/renderers/date.js.map +1 -0
- package/dist/react/renderers/email.js +4 -5
- package/dist/react/renderers/email.js.map +1 -1
- package/dist/react/renderers/file.js +29 -14
- package/dist/react/renderers/file.js.map +1 -1
- package/dist/react/renderers/index.js +7 -0
- package/dist/react/renderers/index.js.map +1 -1
- package/dist/react/renderers/message.js +41 -0
- package/dist/react/renderers/message.js.map +1 -0
- package/dist/react/renderers/number.js +1 -4
- package/dist/react/renderers/number.js.map +1 -1
- package/dist/react/renderers/region.js +43 -0
- package/dist/react/renderers/region.js.map +1 -0
- package/dist/react/renderers/repeater.js +32 -14
- package/dist/react/renderers/repeater.js.map +1 -1
- package/dist/react/renderers/select.js +21 -6
- package/dist/react/renderers/select.js.map +1 -1
- package/dist/react/renderers/text.js +4 -5
- package/dist/react/renderers/text.js.map +1 -1
- package/dist/react/renderers/textarea.js +1 -4
- package/dist/react/renderers/textarea.js.map +1 -1
- package/dist/react/state.d.ts +46 -3
- package/dist/react/state.js +73 -10
- package/dist/react/state.js.map +1 -1
- package/dist/react/submitForm.js +1 -1
- package/dist/react/submitForm.js.map +1 -1
- package/dist/react/uploadFile.d.ts +2 -2
- package/dist/react/uploadFile.js +1 -1
- package/dist/react/uploadFile.js.map +1 -1
- package/dist/react/useCalcValues.d.ts +10 -0
- package/dist/react/useCalcValues.js +13 -0
- package/dist/react/useCalcValues.js.map +1 -0
- package/dist/react/useField.d.ts +0 -1
- package/dist/react/useField.js +7 -6
- package/dist/react/useField.js.map +1 -1
- package/dist/react/useFormState.d.ts +1 -1
- package/dist/react/useFormState.js +1 -1
- package/dist/react/useFormState.js.map +1 -1
- package/dist/react/validateField.js +3 -6
- package/dist/react/validateField.js.map +1 -1
- package/dist/recall/interpolate.d.ts +4 -3
- package/dist/recall/interpolate.js +5 -4
- package/dist/recall/interpolate.js.map +1 -1
- package/dist/recall/resolver.d.ts +1 -1
- package/dist/recall/resolver.js +15 -3
- package/dist/recall/resolver.js.map +1 -1
- package/dist/spam/captcha.d.ts +4 -3
- package/dist/spam/captcha.js +4 -3
- package/dist/spam/captcha.js.map +1 -1
- package/dist/spam/clientIp.js +9 -0
- package/dist/spam/clientIp.js.map +1 -0
- package/dist/spam/constants.js +13 -1
- package/dist/spam/constants.js.map +1 -1
- package/dist/spam/identify.js +3 -6
- package/dist/spam/identify.js.map +1 -1
- package/dist/spam/providers/hcaptcha.d.ts +17 -0
- package/dist/spam/providers/hcaptcha.js +18 -0
- package/dist/spam/providers/hcaptcha.js.map +1 -0
- package/dist/spam/providers/recaptcha.d.ts +23 -0
- package/dist/spam/providers/recaptcha.js +23 -0
- package/dist/spam/providers/recaptcha.js.map +1 -0
- package/dist/spam/providers/siteverify.js +34 -0
- package/dist/spam/providers/siteverify.js.map +1 -0
- package/dist/spam/providers/turnstile.d.ts +17 -0
- package/dist/spam/providers/turnstile.js +18 -0
- package/dist/spam/providers/turnstile.js.map +1 -0
- package/dist/spam/resolveSpam.js +2 -1
- package/dist/spam/resolveSpam.js.map +1 -1
- package/dist/spam/spamGuard.js +25 -11
- package/dist/spam/spamGuard.js.map +1 -1
- package/dist/spam/types.d.ts +19 -4
- package/dist/submissions/SubmissionAnswers.js +6 -2
- package/dist/submissions/SubmissionAnswers.js.map +1 -1
- package/dist/submissions/SubmissionAnswersClient.js +100 -64
- package/dist/submissions/SubmissionAnswersClient.js.map +1 -1
- package/dist/submissions/coerceBoolean.js +14 -0
- package/dist/submissions/coerceBoolean.js.map +1 -0
- package/dist/submissions/createSubmission.d.ts +36 -0
- package/dist/submissions/createSubmission.js +26 -0
- package/dist/submissions/createSubmission.js.map +1 -0
- package/dist/submissions/formIdOf.js +13 -0
- package/dist/submissions/formIdOf.js.map +1 -0
- package/dist/submissions/resolveVotedSubmission.d.ts +27 -0
- package/dist/submissions/resolveVotedSubmission.js +51 -0
- package/dist/submissions/resolveVotedSubmission.js.map +1 -0
- package/dist/submissions/runSubmission.d.ts +10 -0
- package/dist/submissions/runSubmission.js +104 -54
- package/dist/submissions/runSubmission.js.map +1 -1
- package/dist/submissions/types.d.ts +11 -4
- package/dist/submissions/validateSubmission.js +99 -13
- package/dist/submissions/validateSubmission.js.map +1 -1
- package/dist/submissions/verifyContext.js +35 -0
- package/dist/submissions/verifyContext.js.map +1 -0
- package/dist/submissions/voteChangeEndpoint.js +105 -0
- package/dist/submissions/voteChangeEndpoint.js.map +1 -0
- package/dist/submissions/votedCookie.d.ts +15 -0
- package/dist/submissions/votedCookie.js +74 -0
- package/dist/submissions/votedCookie.js.map +1 -0
- package/dist/translations/clientRuntimeKeys.d.ts +17 -0
- package/dist/translations/clientRuntimeKeys.js +48 -0
- package/dist/translations/clientRuntimeKeys.js.map +1 -0
- package/dist/translations/de.d.ts +12 -0
- package/dist/translations/de.js +380 -0
- package/dist/translations/de.js.map +1 -0
- package/dist/translations/en.js +250 -28
- package/dist/translations/en.js.map +1 -1
- package/dist/translations/index.d.ts +14 -5
- package/dist/translations/index.js +14 -3
- package/dist/translations/index.js.map +1 -1
- package/dist/translations/keys.d.ts +245 -23
- package/dist/translations/keys.js +246 -24
- package/dist/translations/keys.js.map +1 -1
- package/dist/translations/makeTranslate.d.ts +7 -3
- package/dist/translations/makeTranslate.js +12 -3
- package/dist/translations/makeTranslate.js.map +1 -1
- package/dist/translations/server.js +8 -1
- package/dist/translations/server.js.map +1 -1
- package/dist/uploads/captureFileRef.d.ts +10 -3
- package/dist/uploads/captureFileRef.js +18 -9
- package/dist/uploads/captureFileRef.js.map +1 -1
- package/dist/uploads/formatBytes.d.ts +9 -0
- package/dist/uploads/formatBytes.js +25 -0
- package/dist/uploads/formatBytes.js.map +1 -0
- package/dist/uploads/resolveFileRef.js +3 -2
- package/dist/uploads/resolveFileRef.js.map +1 -1
- package/dist/uploads/types.d.ts +1 -2
- package/dist/validation/buildRuleBlocks.js +18 -17
- package/dist/validation/buildRuleBlocks.js.map +1 -1
- package/dist/validation/builtin/email.js +2 -1
- package/dist/validation/builtin/email.js.map +1 -1
- package/dist/validation/builtin/index.d.ts +14 -0
- package/dist/validation/builtin/index.js +14 -1
- package/dist/validation/builtin/index.js.map +1 -1
- package/dist/validation/builtin/integer.js +15 -0
- package/dist/validation/builtin/integer.js.map +1 -0
- package/dist/validation/builtin/matchesField.js +3 -7
- package/dist/validation/builtin/matchesField.js.map +1 -1
- package/dist/validation/builtin/max.js +1 -0
- package/dist/validation/builtin/max.js.map +1 -1
- package/dist/validation/builtin/maxDate.js +24 -0
- package/dist/validation/builtin/maxDate.js.map +1 -0
- package/dist/validation/builtin/maxLength.js +1 -0
- package/dist/validation/builtin/maxLength.js.map +1 -1
- package/dist/validation/builtin/min.js +1 -0
- package/dist/validation/builtin/min.js.map +1 -1
- package/dist/validation/builtin/minDate.js +24 -0
- package/dist/validation/builtin/minDate.js.map +1 -0
- package/dist/validation/builtin/minLength.js +1 -0
- package/dist/validation/builtin/minLength.js.map +1 -1
- package/dist/validation/builtin/notAlreadySubmitted.js +5 -1
- package/dist/validation/builtin/notAlreadySubmitted.js.map +1 -1
- package/dist/validation/builtin/oneOf.js +1 -0
- package/dist/validation/builtin/oneOf.js.map +1 -1
- package/dist/validation/builtin/pattern.js +11 -2
- package/dist/validation/builtin/pattern.js.map +1 -1
- package/dist/validation/builtin/url.js +1 -0
- package/dist/validation/builtin/url.js.map +1 -1
- package/dist/validation/builtin/validateDateBound.js +18 -0
- package/dist/validation/builtin/validateDateBound.js.map +1 -0
- package/dist/validation/builtin/validateRegexParams.js +44 -0
- package/dist/validation/builtin/validateRegexParams.js.map +1 -0
- package/dist/validation/emailPattern.js +10 -0
- package/dist/validation/emailPattern.js.map +1 -0
- package/dist/validation/fieldTargetParam.d.ts +22 -0
- package/dist/validation/fieldTargetParam.js +38 -0
- package/dist/validation/fieldTargetParam.js.map +1 -0
- package/dist/validation/registry.d.ts +2 -1
- package/dist/validation/registry.js +2 -9
- package/dist/validation/registry.js.map +1 -1
- package/dist/validation/runValidation.js +8 -29
- package/dist/validation/runValidation.js.map +1 -1
- package/dist/validation/types.d.ts +5 -11
- package/dist/validation/validateUrl.js +22 -0
- package/dist/validation/validateUrl.js.map +1 -0
- package/package.json +14 -6
- package/styles/form-builder.css +94 -190
- package/dist/collections/uploads.d.ts +0 -30
- package/dist/collections/uploads.js +0 -55
- package/dist/collections/uploads.js.map +0 -1
- package/dist/consent/buildConsentSourceConfig.js +0 -49
- package/dist/consent/buildConsentSourceConfig.js.map +0 -1
- package/dist/consent/builtin/index.d.ts +0 -7
- package/dist/consent/builtin/index.js +0 -11
- package/dist/consent/builtin/index.js.map +0 -1
- package/dist/consent/builtin/pageReference.js +0 -75
- package/dist/consent/builtin/pageReference.js.map +0 -1
- package/dist/consent/builtin/static.js +0 -44
- package/dist/consent/builtin/static.js.map +0 -1
- package/dist/consent/defineConsentSource.d.ts +0 -35
- package/dist/consent/defineConsentSource.js +0 -6
- package/dist/consent/defineConsentSource.js.map +0 -1
- package/dist/consent/registry.d.ts +0 -16
- package/dist/consent/registry.js +0 -16
- package/dist/consent/registry.js.map +0 -1
- package/dist/consent/resolveConsentLinks.d.ts +0 -19
- package/dist/consent/resolveConsentLinks.js +0 -26
- package/dist/consent/resolveConsentLinks.js.map +0 -1
- package/dist/presentations/registry.d.ts +0 -15
- package/dist/presentations/registry.js +0 -15
- package/dist/presentations/registry.js.map +0 -1
- package/dist/react/toFormDocument.d.ts +0 -24
- package/dist/react/toFormDocument.js +0 -22
- package/dist/react/toFormDocument.js.map +0 -1
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
//#region src/react/primitives/ChoiceGroup.tsx
|
|
4
|
+
/**
|
|
5
|
+
* A native `role="radiogroup"` of radio inputs backing a single-select field: the `radio` and
|
|
6
|
+
* `buttons` display variants of the select field type. `aria-invalid` sits on each radio input, not
|
|
7
|
+
* the group `div` (a `div` can't take focus), so the terminal-submit focus routing
|
|
8
|
+
* (`[aria-invalid="true"]`) can land on it same as any other control.
|
|
9
|
+
*/
|
|
10
|
+
const ChoiceGroup = ({ name, value, options, onChange, onBlur, required, disabled, invalid, describedById, labelledById, variant }) => /* @__PURE__ */ jsx("div", {
|
|
11
|
+
role: "radiogroup",
|
|
12
|
+
"aria-labelledby": labelledById,
|
|
13
|
+
"aria-describedby": describedById,
|
|
14
|
+
className: variant === "buttons" ? "fb-choice fb-choice--buttons" : "fb-choice",
|
|
15
|
+
children: options.map((option) => /* @__PURE__ */ jsxs("label", {
|
|
16
|
+
className: "fb-choice__option",
|
|
17
|
+
children: [/* @__PURE__ */ jsx("input", {
|
|
18
|
+
type: "radio",
|
|
19
|
+
name,
|
|
20
|
+
value: option.value,
|
|
21
|
+
checked: value === option.value,
|
|
22
|
+
onChange: () => onChange(option.value),
|
|
23
|
+
onBlur,
|
|
24
|
+
required,
|
|
25
|
+
disabled,
|
|
26
|
+
"aria-invalid": invalid || void 0
|
|
27
|
+
}), /* @__PURE__ */ jsx("span", { children: option.label })]
|
|
28
|
+
}, option.value))
|
|
29
|
+
});
|
|
30
|
+
//#endregion
|
|
31
|
+
export { ChoiceGroup };
|
|
32
|
+
|
|
33
|
+
//# sourceMappingURL=ChoiceGroup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChoiceGroup.js","names":[],"sources":["../../../src/react/primitives/ChoiceGroup.tsx"],"sourcesContent":["'use client'\n\nexport type ChoiceOption = { label: string; value: string }\n\nexport type ChoiceGroupProps = {\n\tname: string\n\tvalue: string\n\toptions: ChoiceOption[]\n\tonChange: (value: string) => void\n\tonBlur?: () => void\n\trequired?: boolean\n\tdisabled?: boolean\n\tinvalid?: boolean\n\tdescribedById?: string\n\t/** id of the element that names the group (`aria-labelledby`); omit when the field has no label. */\n\tlabelledById?: string\n\t/** `radio` is the plain native list; `buttons` is the same semantics styled as a segmented control. */\n\tvariant: 'radio' | 'buttons'\n}\n\n/**\n * A native `role=\"radiogroup\"` of radio inputs backing a single-select field: the `radio` and\n * `buttons` display variants of the select field type. `aria-invalid` sits on each radio input, not\n * the group `div` (a `div` can't take focus), so the terminal-submit focus routing\n * (`[aria-invalid=\"true\"]`) can land on it same as any other control.\n */\nexport const ChoiceGroup = ({\n\tname,\n\tvalue,\n\toptions,\n\tonChange,\n\tonBlur,\n\trequired,\n\tdisabled,\n\tinvalid,\n\tdescribedById,\n\tlabelledById,\n\tvariant,\n}: ChoiceGroupProps) => (\n\t<div\n\t\trole=\"radiogroup\"\n\t\taria-labelledby={labelledById}\n\t\taria-describedby={describedById}\n\t\tclassName={variant === 'buttons' ? 'fb-choice fb-choice--buttons' : 'fb-choice'}\n\t>\n\t\t{options.map((option) => (\n\t\t\t<label key={option.value} className=\"fb-choice__option\">\n\t\t\t\t<input\n\t\t\t\t\ttype=\"radio\"\n\t\t\t\t\tname={name}\n\t\t\t\t\tvalue={option.value}\n\t\t\t\t\tchecked={value === option.value}\n\t\t\t\t\tonChange={() => onChange(option.value)}\n\t\t\t\t\tonBlur={onBlur}\n\t\t\t\t\trequired={required}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\taria-invalid={invalid || undefined}\n\t\t\t\t/>\n\t\t\t\t<span>{option.label}</span>\n\t\t\t</label>\n\t\t))}\n\t</div>\n)\n"],"mappings":";;;;;;;;;AA0BA,MAAa,eAAe,EAC3B,MACA,OACA,SACA,UACA,QACA,UACA,UACA,SACA,eACA,cACA,cAEA,oBAAC,OAAD;CACC,MAAK;CACL,mBAAiB;CACjB,oBAAkB;CAClB,WAAW,YAAY,YAAY,iCAAiC;WAEnE,QAAQ,KAAK,WACb,qBAAC,SAAD;EAA0B,WAAU;YAApC,CACC,oBAAC,SAAD;GACC,MAAK;GACC;GACN,OAAO,OAAO;GACd,SAAS,UAAU,OAAO;GAC1B,gBAAgB,SAAS,OAAO,KAAK;GAC7B;GACE;GACA;GACV,gBAAc,WAAW,KAAA;EACzB,CAAA,GACD,oBAAC,QAAD,EAAA,UAAO,OAAO,MAAY,CAAA,CACpB;IAbK,OAAO,KAaZ,CACP;AACG,CAAA"}
|
|
@@ -6,15 +6,23 @@ type FieldShellProps = {
|
|
|
6
6
|
label?: string;
|
|
7
7
|
description?: string;
|
|
8
8
|
required?: boolean;
|
|
9
|
-
errors?: string[];
|
|
10
|
-
warnings?: string[]; /** id used for aria-describedby on the control; the shell renders description + messages under it. */
|
|
9
|
+
errors?: string[]; /** id used for aria-describedby on the control; the shell renders description + messages under it. */
|
|
11
10
|
describedById: string;
|
|
11
|
+
/**
|
|
12
|
+
* When true, the caption renders as a plain `<span>` instead of a `<label htmlFor>`: for a control
|
|
13
|
+
* with no single element to bind to (a native radiogroup), `htmlFor` pointing at a nonexistent id is
|
|
14
|
+
* a dead click and invalid HTML. The caption still carries `id={`${id}-label`}` either way, so the
|
|
15
|
+
* child wires `aria-labelledby={`${id}-label`}` itself.
|
|
16
|
+
*/
|
|
17
|
+
group?: boolean;
|
|
12
18
|
children: ReactNode;
|
|
13
19
|
};
|
|
14
20
|
/**
|
|
15
|
-
* Accessible wrapper for a single field: a
|
|
16
|
-
* description, and error
|
|
21
|
+
* Accessible wrapper for a single field: a caption bound to the control, the control slot, an optional
|
|
22
|
+
* description, and error messages. The control inside must set `aria-describedby={describedById}`
|
|
17
23
|
* and `aria-invalid` when errors exist; this shell renders the matching `id={describedById}` region.
|
|
24
|
+
* The caption carries `id={`${id}-label`}`, so a control with no single element to `htmlFor` (see
|
|
25
|
+
* `group`) can still name itself via `aria-labelledby`.
|
|
18
26
|
*/
|
|
19
27
|
declare const FieldShell: ({
|
|
20
28
|
id,
|
|
@@ -22,8 +30,8 @@ declare const FieldShell: ({
|
|
|
22
30
|
description,
|
|
23
31
|
required,
|
|
24
32
|
errors,
|
|
25
|
-
warnings,
|
|
26
33
|
describedById,
|
|
34
|
+
group,
|
|
27
35
|
children
|
|
28
36
|
}: FieldShellProps) => import("react/jsx-runtime").JSX.Element;
|
|
29
37
|
//#endregion
|
|
@@ -2,33 +2,40 @@
|
|
|
2
2
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
3
|
//#region src/react/primitives/FieldShell.tsx
|
|
4
4
|
/**
|
|
5
|
-
* Accessible wrapper for a single field: a
|
|
6
|
-
* description, and error
|
|
5
|
+
* Accessible wrapper for a single field: a caption bound to the control, the control slot, an optional
|
|
6
|
+
* description, and error messages. The control inside must set `aria-describedby={describedById}`
|
|
7
7
|
* and `aria-invalid` when errors exist; this shell renders the matching `id={describedById}` region.
|
|
8
|
+
* The caption carries `id={`${id}-label`}`, so a control with no single element to `htmlFor` (see
|
|
9
|
+
* `group`) can still name itself via `aria-labelledby`.
|
|
8
10
|
*/
|
|
9
|
-
const FieldShell = ({ id, label, description, required, errors = [],
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
11
|
+
const FieldShell = ({ id, label, description, required, errors = [], describedById, group = false, children }) => {
|
|
12
|
+
const requiredMark = required ? /* @__PURE__ */ jsx("span", {
|
|
13
|
+
className: "fb-field__required",
|
|
14
|
+
"aria-hidden": "true",
|
|
15
|
+
children: " *"
|
|
16
|
+
}) : null;
|
|
17
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
18
|
+
className: "fb-field",
|
|
19
|
+
"data-invalid": errors.length > 0 ? "" : void 0,
|
|
20
|
+
children: [
|
|
21
|
+
label ? group ? /* @__PURE__ */ jsxs("span", {
|
|
22
|
+
className: "fb-field__label",
|
|
23
|
+
id: `${id}-label`,
|
|
24
|
+
children: [label, requiredMark]
|
|
25
|
+
}) : /* @__PURE__ */ jsxs("label", {
|
|
26
|
+
className: "fb-field__label",
|
|
27
|
+
htmlFor: id,
|
|
28
|
+
id: `${id}-label`,
|
|
29
|
+
children: [label, requiredMark]
|
|
30
|
+
}) : null,
|
|
31
|
+
children,
|
|
32
|
+
/* @__PURE__ */ jsxs("div", {
|
|
33
|
+
id: describedById,
|
|
34
|
+
className: "fb-field__messages",
|
|
35
|
+
children: [description ? /* @__PURE__ */ jsx("p", {
|
|
28
36
|
className: "fb-field__description",
|
|
29
37
|
children: description
|
|
30
|
-
}) : null,
|
|
31
|
-
errors.length > 0 ? /* @__PURE__ */ jsx("div", {
|
|
38
|
+
}) : null, errors.length > 0 ? /* @__PURE__ */ jsx("div", {
|
|
32
39
|
role: "alert",
|
|
33
40
|
"aria-atomic": "true",
|
|
34
41
|
className: "fb-field__errors",
|
|
@@ -36,15 +43,11 @@ const FieldShell = ({ id, label, description, required, errors = [], warnings =
|
|
|
36
43
|
className: "fb-field__error",
|
|
37
44
|
children: message
|
|
38
45
|
}, message))
|
|
39
|
-
}) : null
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
]
|
|
45
|
-
})
|
|
46
|
-
]
|
|
47
|
-
});
|
|
46
|
+
}) : null]
|
|
47
|
+
})
|
|
48
|
+
]
|
|
49
|
+
});
|
|
50
|
+
};
|
|
48
51
|
//#endregion
|
|
49
52
|
export { FieldShell };
|
|
50
53
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FieldShell.js","names":[],"sources":["../../../src/react/primitives/FieldShell.tsx"],"sourcesContent":["'use client'\n\nimport type { ReactNode } from 'react'\n\nexport type FieldShellProps = {\n\t/** The control id this shell labels and describes. */\n\tid: string\n\tlabel?: string\n\tdescription?: string\n\trequired?: boolean\n\terrors?: string[]\n\
|
|
1
|
+
{"version":3,"file":"FieldShell.js","names":[],"sources":["../../../src/react/primitives/FieldShell.tsx"],"sourcesContent":["'use client'\n\nimport type { ReactNode } from 'react'\n\nexport type FieldShellProps = {\n\t/** The control id this shell labels and describes. */\n\tid: string\n\tlabel?: string\n\tdescription?: string\n\trequired?: boolean\n\terrors?: string[]\n\t/** id used for aria-describedby on the control; the shell renders description + messages under it. */\n\tdescribedById: string\n\t/**\n\t * When true, the caption renders as a plain `<span>` instead of a `<label htmlFor>`: for a control\n\t * with no single element to bind to (a native radiogroup), `htmlFor` pointing at a nonexistent id is\n\t * a dead click and invalid HTML. The caption still carries `id={`${id}-label`}` either way, so the\n\t * child wires `aria-labelledby={`${id}-label`}` itself.\n\t */\n\tgroup?: boolean\n\tchildren: ReactNode\n}\n\n/**\n * Accessible wrapper for a single field: a caption bound to the control, the control slot, an optional\n * description, and error messages. The control inside must set `aria-describedby={describedById}`\n * and `aria-invalid` when errors exist; this shell renders the matching `id={describedById}` region.\n * The caption carries `id={`${id}-label`}`, so a control with no single element to `htmlFor` (see\n * `group`) can still name itself via `aria-labelledby`.\n */\nexport const FieldShell = ({\n\tid,\n\tlabel,\n\tdescription,\n\trequired,\n\terrors = [],\n\tdescribedById,\n\tgroup = false,\n\tchildren,\n}: FieldShellProps) => {\n\tconst requiredMark = required ? (\n\t\t<span className=\"fb-field__required\" aria-hidden=\"true\">\n\t\t\t{' *'}\n\t\t</span>\n\t) : null\n\n\treturn (\n\t\t<div className=\"fb-field\" data-invalid={errors.length > 0 ? '' : undefined}>\n\t\t\t{label ? (\n\t\t\t\tgroup ? (\n\t\t\t\t\t<span className=\"fb-field__label\" id={`${id}-label`}>\n\t\t\t\t\t\t{label}\n\t\t\t\t\t\t{requiredMark}\n\t\t\t\t\t</span>\n\t\t\t\t) : (\n\t\t\t\t\t<label className=\"fb-field__label\" htmlFor={id} id={`${id}-label`}>\n\t\t\t\t\t\t{label}\n\t\t\t\t\t\t{requiredMark}\n\t\t\t\t\t</label>\n\t\t\t\t)\n\t\t\t) : null}\n\t\t\t{children}\n\t\t\t<div id={describedById} className=\"fb-field__messages\">\n\t\t\t\t{description ? <p className=\"fb-field__description\">{description}</p> : null}\n\t\t\t\t{errors.length > 0 ? (\n\t\t\t\t\t<div role=\"alert\" aria-atomic=\"true\" className=\"fb-field__errors\">\n\t\t\t\t\t\t{errors.map((message) => (\n\t\t\t\t\t\t\t<p key={message} className=\"fb-field__error\">\n\t\t\t\t\t\t\t\t{message}\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</div>\n\t\t\t\t) : null}\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n"],"mappings":";;;;;;;;;;AA8BA,MAAa,cAAc,EAC1B,IACA,OACA,aACA,UACA,SAAS,CAAC,GACV,eACA,QAAQ,OACR,eACsB;CACtB,MAAM,eAAe,WACpB,oBAAC,QAAD;EAAM,WAAU;EAAqB,eAAY;YAC/C;CACI,CAAA,IACH;CAEJ,OACC,qBAAC,OAAD;EAAK,WAAU;EAAW,gBAAc,OAAO,SAAS,IAAI,KAAK,KAAA;YAAjE;GACE,QACA,QACC,qBAAC,QAAD;IAAM,WAAU;IAAkB,IAAI,GAAG,GAAG;cAA5C,CACE,OACA,YACI;QAEN,qBAAC,SAAD;IAAO,WAAU;IAAkB,SAAS;IAAI,IAAI,GAAG,GAAG;cAA1D,CACE,OACA,YACK;QAEL;GACH;GACD,qBAAC,OAAD;IAAK,IAAI;IAAe,WAAU;cAAlC,CACE,cAAc,oBAAC,KAAD;KAAG,WAAU;eAAyB;IAAe,CAAA,IAAI,MACvE,OAAO,SAAS,IAChB,oBAAC,OAAD;KAAK,MAAK;KAAQ,eAAY;KAAO,WAAU;eAC7C,OAAO,KAAK,YACZ,oBAAC,KAAD;MAAiB,WAAU;gBACzB;KACC,GAFK,OAEL,CACH;IACG,CAAA,IACF,IACA;;EACD;;AAEP"}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
type InputProps = {
|
|
3
3
|
id: string;
|
|
4
4
|
name: string;
|
|
5
|
-
type?: 'text' | 'email' | 'number';
|
|
5
|
+
type?: 'text' | 'email' | 'number' | 'date';
|
|
6
6
|
value: string;
|
|
7
7
|
onChange: (value: string) => void;
|
|
8
8
|
onBlur?: () => void;
|
|
@@ -11,6 +11,7 @@ type InputProps = {
|
|
|
11
11
|
disabled?: boolean;
|
|
12
12
|
invalid?: boolean;
|
|
13
13
|
describedById?: string;
|
|
14
|
+
autoComplete?: string;
|
|
14
15
|
};
|
|
15
16
|
declare const Input: ({
|
|
16
17
|
id,
|
|
@@ -23,7 +24,8 @@ declare const Input: ({
|
|
|
23
24
|
required,
|
|
24
25
|
disabled,
|
|
25
26
|
invalid,
|
|
26
|
-
describedById
|
|
27
|
+
describedById,
|
|
28
|
+
autoComplete
|
|
27
29
|
}: InputProps) => import("react/jsx-runtime").JSX.Element;
|
|
28
30
|
//#endregion
|
|
29
31
|
export { Input, InputProps };
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { jsx } from "react/jsx-runtime";
|
|
3
3
|
//#region src/react/primitives/Input.tsx
|
|
4
|
-
const Input = ({ id, name, type = "text", value, onChange, onBlur, placeholder, required, disabled, invalid, describedById }) => /* @__PURE__ */ jsx("input", {
|
|
4
|
+
const Input = ({ id, name, type = "text", value, onChange, onBlur, placeholder, required, disabled, invalid, describedById, autoComplete }) => /* @__PURE__ */ jsx("input", {
|
|
5
5
|
id,
|
|
6
6
|
name,
|
|
7
7
|
type,
|
|
@@ -12,6 +12,7 @@ const Input = ({ id, name, type = "text", value, onChange, onBlur, placeholder,
|
|
|
12
12
|
disabled,
|
|
13
13
|
"aria-invalid": invalid || void 0,
|
|
14
14
|
"aria-describedby": describedById,
|
|
15
|
+
autoComplete,
|
|
15
16
|
onChange: (event) => onChange(event.target.value),
|
|
16
17
|
onBlur
|
|
17
18
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Input.js","names":[],"sources":["../../../src/react/primitives/Input.tsx"],"sourcesContent":["'use client'\n\nexport type InputProps = {\n\tid: string\n\tname: string\n\ttype?: 'text' | 'email' | 'number'\n\tvalue: string\n\tonChange: (value: string) => void\n\tonBlur?: () => void\n\tplaceholder?: string\n\trequired?: boolean\n\tdisabled?: boolean\n\tinvalid?: boolean\n\tdescribedById?: string\n}\n\nexport const Input = ({\n\tid,\n\tname,\n\ttype = 'text',\n\tvalue,\n\tonChange,\n\tonBlur,\n\tplaceholder,\n\trequired,\n\tdisabled,\n\tinvalid,\n\tdescribedById,\n}: InputProps) => (\n\t<input\n\t\tid={id}\n\t\tname={name}\n\t\ttype={type}\n\t\tclassName=\"fb-input\"\n\t\tvalue={value}\n\t\tplaceholder={placeholder}\n\t\trequired={required}\n\t\tdisabled={disabled}\n\t\taria-invalid={invalid || undefined}\n\t\taria-describedby={describedById}\n\t\tonChange={(event) => onChange(event.target.value)}\n\t\tonBlur={onBlur}\n\t/>\n)\n"],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"Input.js","names":[],"sources":["../../../src/react/primitives/Input.tsx"],"sourcesContent":["'use client'\n\nexport type InputProps = {\n\tid: string\n\tname: string\n\ttype?: 'text' | 'email' | 'number' | 'date'\n\tvalue: string\n\tonChange: (value: string) => void\n\tonBlur?: () => void\n\tplaceholder?: string\n\trequired?: boolean\n\tdisabled?: boolean\n\tinvalid?: boolean\n\tdescribedById?: string\n\tautoComplete?: string\n}\n\nexport const Input = ({\n\tid,\n\tname,\n\ttype = 'text',\n\tvalue,\n\tonChange,\n\tonBlur,\n\tplaceholder,\n\trequired,\n\tdisabled,\n\tinvalid,\n\tdescribedById,\n\tautoComplete,\n}: InputProps) => (\n\t<input\n\t\tid={id}\n\t\tname={name}\n\t\ttype={type}\n\t\tclassName=\"fb-input\"\n\t\tvalue={value}\n\t\tplaceholder={placeholder}\n\t\trequired={required}\n\t\tdisabled={disabled}\n\t\taria-invalid={invalid || undefined}\n\t\taria-describedby={describedById}\n\t\tautoComplete={autoComplete}\n\t\tonChange={(event) => onChange(event.target.value)}\n\t\tonBlur={onBlur}\n\t/>\n)\n"],"mappings":";;;AAiBA,MAAa,SAAS,EACrB,IACA,MACA,OAAO,QACP,OACA,UACA,QACA,aACA,UACA,UACA,SACA,eACA,mBAEA,oBAAC,SAAD;CACK;CACE;CACA;CACN,WAAU;CACH;CACM;CACH;CACA;CACV,gBAAc,WAAW,KAAA;CACzB,oBAAkB;CACJ;CACd,WAAW,UAAU,SAAS,MAAM,OAAO,KAAK;CACxC;AACR,CAAA"}
|
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
"use client";
|
|
2
|
+
import { formatCalcValue } from "../../calc/formatCalcValue.js";
|
|
2
3
|
import { defineFieldRenderer } from "../contract.js";
|
|
3
4
|
import { FieldShell } from "../primitives/FieldShell.js";
|
|
4
|
-
import { useId } from "react";
|
|
5
5
|
import { jsx } from "react/jsx-runtime";
|
|
6
6
|
//#region src/react/renderers/calculation.tsx
|
|
7
7
|
/** Read-only renderer for a calculation field: the value is derived, never user-editable, so it shows in an `<output>` rather than an input. */
|
|
8
|
-
const calculationRenderer = defineFieldRenderer(({ field, value, errors,
|
|
9
|
-
const id = useId();
|
|
8
|
+
const calculationRenderer = defineFieldRenderer(({ field, id, value, errors, required }) => {
|
|
10
9
|
const describedById = `${id}-desc`;
|
|
11
10
|
return /* @__PURE__ */ jsx(FieldShell, {
|
|
12
11
|
id,
|
|
@@ -14,13 +13,16 @@ const calculationRenderer = defineFieldRenderer(({ field, value, errors, warning
|
|
|
14
13
|
description: typeof field.description === "string" ? field.description : void 0,
|
|
15
14
|
required,
|
|
16
15
|
errors,
|
|
17
|
-
warnings,
|
|
18
16
|
describedById,
|
|
19
17
|
children: /* @__PURE__ */ jsx("output", {
|
|
20
18
|
id,
|
|
21
19
|
className: "fb-field__calc",
|
|
22
20
|
"aria-describedby": describedById,
|
|
23
|
-
children: value == null ? "" :
|
|
21
|
+
children: value == null ? "" : formatCalcValue(value, {
|
|
22
|
+
decimals: field.decimals,
|
|
23
|
+
prefix: field.prefix,
|
|
24
|
+
suffix: field.suffix
|
|
25
|
+
})
|
|
24
26
|
})
|
|
25
27
|
});
|
|
26
28
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"calculation.js","names":[],"sources":["../../../src/react/renderers/calculation.tsx"],"sourcesContent":["'use client'\n\nimport {
|
|
1
|
+
{"version":3,"file":"calculation.js","names":[],"sources":["../../../src/react/renderers/calculation.tsx"],"sourcesContent":["'use client'\n\nimport { formatCalcValue } from '../../calc/formatCalcValue'\nimport { defineFieldRenderer } from '../contract'\nimport { FieldShell } from '../primitives/FieldShell'\n\n/** Read-only renderer for a calculation field: the value is derived, never user-editable, so it shows in an `<output>` rather than an input. */\nexport const calculationRenderer = defineFieldRenderer<number | undefined>(\n\t({ field, id, value, errors, required }) => {\n\t\tconst describedById = `${id}-desc`\n\t\treturn (\n\t\t\t<FieldShell\n\t\t\t\tid={id}\n\t\t\t\tlabel={field.label}\n\t\t\t\tdescription={typeof field.description === 'string' ? field.description : undefined}\n\t\t\t\trequired={required}\n\t\t\t\terrors={errors}\n\t\t\t\tdescribedById={describedById}\n\t\t\t>\n\t\t\t\t<output id={id} className=\"fb-field__calc\" aria-describedby={describedById}>\n\t\t\t\t\t{value == null\n\t\t\t\t\t\t? ''\n\t\t\t\t\t\t: formatCalcValue(value, {\n\t\t\t\t\t\t\t\tdecimals: field.decimals,\n\t\t\t\t\t\t\t\tprefix: field.prefix,\n\t\t\t\t\t\t\t\tsuffix: field.suffix,\n\t\t\t\t\t\t\t})}\n\t\t\t\t</output>\n\t\t\t</FieldShell>\n\t\t)\n\t}\n)\n"],"mappings":";;;;;;;AAOA,MAAa,sBAAsB,qBACjC,EAAE,OAAO,IAAI,OAAO,QAAQ,eAAe;CAC3C,MAAM,gBAAgB,GAAG,GAAG;CAC5B,OACC,oBAAC,YAAD;EACK;EACJ,OAAO,MAAM;EACb,aAAa,OAAO,MAAM,gBAAgB,WAAW,MAAM,cAAc,KAAA;EAC/D;EACF;EACO;YAEf,oBAAC,UAAD;GAAY;GAAI,WAAU;GAAiB,oBAAkB;aAC3D,SAAS,OACP,KACA,gBAAgB,OAAO;IACvB,UAAU,MAAM;IAChB,QAAQ,MAAM;IACd,QAAQ,MAAM;GACf,CAAC;EACI,CAAA;CACG,CAAA;AAEd,CACD"}
|
|
@@ -2,11 +2,9 @@
|
|
|
2
2
|
import { defineFieldRenderer } from "../contract.js";
|
|
3
3
|
import { FieldShell } from "../primitives/FieldShell.js";
|
|
4
4
|
import { Checkbox } from "../primitives/Checkbox.js";
|
|
5
|
-
import { useId } from "react";
|
|
6
5
|
import { jsx } from "react/jsx-runtime";
|
|
7
6
|
//#region src/react/renderers/checkbox.tsx
|
|
8
|
-
const checkboxRenderer = defineFieldRenderer(({ field, name, value, onChange, onBlur, errors,
|
|
9
|
-
const id = useId();
|
|
7
|
+
const checkboxRenderer = defineFieldRenderer(({ field, id, name, value, onChange, onBlur, errors, required, disabled }) => {
|
|
10
8
|
const describedById = `${id}-desc`;
|
|
11
9
|
return /* @__PURE__ */ jsx(FieldShell, {
|
|
12
10
|
id,
|
|
@@ -14,7 +12,6 @@ const checkboxRenderer = defineFieldRenderer(({ field, name, value, onChange, on
|
|
|
14
12
|
description: typeof field.description === "string" ? field.description : void 0,
|
|
15
13
|
required,
|
|
16
14
|
errors,
|
|
17
|
-
warnings,
|
|
18
15
|
describedById,
|
|
19
16
|
children: /* @__PURE__ */ jsx(Checkbox, {
|
|
20
17
|
id,
|
|
@@ -25,7 +22,8 @@ const checkboxRenderer = defineFieldRenderer(({ field, name, value, onChange, on
|
|
|
25
22
|
required,
|
|
26
23
|
disabled,
|
|
27
24
|
invalid: errors.length > 0,
|
|
28
|
-
describedById
|
|
25
|
+
describedById,
|
|
26
|
+
variant: field.display === "switch" ? "switch" : void 0
|
|
29
27
|
})
|
|
30
28
|
});
|
|
31
29
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"checkbox.js","names":[],"sources":["../../../src/react/renderers/checkbox.tsx"],"sourcesContent":["'use client'\n\nimport {
|
|
1
|
+
{"version":3,"file":"checkbox.js","names":[],"sources":["../../../src/react/renderers/checkbox.tsx"],"sourcesContent":["'use client'\n\nimport { defineFieldRenderer } from '../contract'\nimport { Checkbox } from '../primitives/Checkbox'\nimport { FieldShell } from '../primitives/FieldShell'\n\nexport const checkboxRenderer = defineFieldRenderer<boolean>(\n\t({ field, id, name, value, onChange, onBlur, errors, required, disabled }) => {\n\t\tconst describedById = `${id}-desc`\n\t\treturn (\n\t\t\t<FieldShell\n\t\t\t\tid={id}\n\t\t\t\tlabel={field.label}\n\t\t\t\tdescription={typeof field.description === 'string' ? field.description : undefined}\n\t\t\t\trequired={required}\n\t\t\t\terrors={errors}\n\t\t\t\tdescribedById={describedById}\n\t\t\t>\n\t\t\t\t<Checkbox\n\t\t\t\t\tid={id}\n\t\t\t\t\tname={name}\n\t\t\t\t\tchecked={value ?? false}\n\t\t\t\t\tonChange={onChange}\n\t\t\t\t\tonBlur={onBlur}\n\t\t\t\t\trequired={required}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tinvalid={errors.length > 0}\n\t\t\t\t\tdescribedById={describedById}\n\t\t\t\t\tvariant={field.display === 'switch' ? 'switch' : undefined}\n\t\t\t\t/>\n\t\t\t</FieldShell>\n\t\t)\n\t}\n)\n"],"mappings":";;;;;;AAMA,MAAa,mBAAmB,qBAC9B,EAAE,OAAO,IAAI,MAAM,OAAO,UAAU,QAAQ,QAAQ,UAAU,eAAe;CAC7E,MAAM,gBAAgB,GAAG,GAAG;CAC5B,OACC,oBAAC,YAAD;EACK;EACJ,OAAO,MAAM;EACb,aAAa,OAAO,MAAM,gBAAgB,WAAW,MAAM,cAAc,KAAA;EAC/D;EACF;EACO;YAEf,oBAAC,UAAD;GACK;GACE;GACN,SAAS,SAAS;GACR;GACF;GACE;GACA;GACV,SAAS,OAAO,SAAS;GACV;GACf,SAAS,MAAM,YAAY,WAAW,WAAW,KAAA;EACjD,CAAA;CACU,CAAA;AAEd,CACD"}
|
|
@@ -1,51 +1,99 @@
|
|
|
1
1
|
"use client";
|
|
2
|
+
import { sanitizeUrl } from "../../actions/body/converters.js";
|
|
3
|
+
import { serializeBody } from "../../actions/body/serializeBody.js";
|
|
4
|
+
import { textOfBody } from "../../actions/body/textOfBody.js";
|
|
2
5
|
import { defineFieldRenderer } from "../contract.js";
|
|
3
6
|
import { FieldShell } from "../primitives/FieldShell.js";
|
|
4
7
|
import { Checkbox } from "../primitives/Checkbox.js";
|
|
5
|
-
import { useId } from "react";
|
|
6
8
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
9
|
+
import { useMemo } from "react";
|
|
7
10
|
//#region src/react/renderers/consent.tsx
|
|
8
|
-
const
|
|
9
|
-
|
|
11
|
+
const text = (raw) => typeof raw === "string" && raw.trim() !== "" ? raw : void 0;
|
|
12
|
+
/**
|
|
13
|
+
* HTML for a rich text statement. A plain string never goes through this path: `serializeBody`
|
|
14
|
+
* interpolates a string body unescaped (its pre-richText behavior), so rendering one as HTML would
|
|
15
|
+
* let literal markup execute; the renderer shows a plain string as text instead.
|
|
16
|
+
*/
|
|
17
|
+
const richStatementHtml = (statement) => {
|
|
18
|
+
if (typeof statement === "string" || statement == null) return;
|
|
19
|
+
const html = serializeBody(statement, {
|
|
20
|
+
values: [],
|
|
21
|
+
descriptors: []
|
|
22
|
+
});
|
|
23
|
+
return html === "" ? void 0 : html;
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* The resolved policy link, or nothing unless the source carries both a url and a name to show
|
|
27
|
+
* for it: an anchor labelled by a raw URL or a machine key is worse than no anchor. The href is
|
|
28
|
+
* sanitized like every other url the package renders, since a source is admin-authored and can
|
|
29
|
+
* point anywhere (`sanitizeUrl` keeps http(s)/mailto/tel and relative urls, and neutralizes the
|
|
30
|
+
* rest to `#`).
|
|
31
|
+
*/
|
|
32
|
+
const linkOf = (raw) => {
|
|
33
|
+
const link = raw;
|
|
34
|
+
const label = text(link?.label);
|
|
35
|
+
return label && typeof link?.url === "string" && link.url !== "" ? {
|
|
36
|
+
label,
|
|
37
|
+
url: sanitizeUrl(link.url)
|
|
38
|
+
} : void 0;
|
|
39
|
+
};
|
|
40
|
+
/**
|
|
41
|
+
* The `statement` and `link` this reads are server-resolved from the field's consent source and
|
|
42
|
+
* injected by `toFormDocument(doc, { consentStatements })`; the form document itself carries only
|
|
43
|
+
* the source key, so a form rendered without that step shows no statement rather than a stale one.
|
|
44
|
+
* The wording arrives already selected for the field's display (a notice source's
|
|
45
|
+
* `noticeStatement` lands here as `statement`), so this renderer never picks between phrasings.
|
|
46
|
+
* A `display: 'notice'` field renders the statement and link as passive prose with no checkbox and
|
|
47
|
+
* no required marker: submitting the form is the consent, and the server records the agreement.
|
|
48
|
+
*/
|
|
49
|
+
const consentRenderer = defineFieldRenderer(({ field, id, name, value, onChange, onBlur, errors, required, disabled }) => {
|
|
10
50
|
const describedById = `${id}-desc`;
|
|
11
|
-
const
|
|
12
|
-
const
|
|
13
|
-
const
|
|
14
|
-
|
|
15
|
-
if (sc && typeof sc.url === "string" && sc.url) return [{
|
|
16
|
-
label: typeof sc.label === "string" ? sc.label : "Policy",
|
|
17
|
-
url: sc.url
|
|
18
|
-
}];
|
|
19
|
-
return [];
|
|
20
|
-
})();
|
|
51
|
+
const isNotice = field.display === "notice";
|
|
52
|
+
const plainStatement = text(textOfBody(field.statement));
|
|
53
|
+
const html = useMemo(() => richStatementHtml(field.statement), [field.statement]);
|
|
54
|
+
const link = linkOf(field.link);
|
|
21
55
|
return /* @__PURE__ */ jsxs(FieldShell, {
|
|
22
56
|
id,
|
|
23
|
-
label: statement,
|
|
24
57
|
description: typeof field.description === "string" ? field.description : void 0,
|
|
25
|
-
required,
|
|
58
|
+
required: isNotice ? false : required,
|
|
26
59
|
errors,
|
|
27
|
-
warnings,
|
|
28
60
|
describedById,
|
|
29
|
-
children: [
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
61
|
+
children: [
|
|
62
|
+
html ? /* @__PURE__ */ jsx("div", {
|
|
63
|
+
className: "fb-consent__statement",
|
|
64
|
+
dangerouslySetInnerHTML: { __html: html }
|
|
65
|
+
}) : plainStatement ? /* @__PURE__ */ jsx("span", {
|
|
66
|
+
className: "fb-consent__statement",
|
|
67
|
+
children: plainStatement
|
|
68
|
+
}) : null,
|
|
69
|
+
!isNotice && required && (html || plainStatement) ? /* @__PURE__ */ jsx("span", {
|
|
70
|
+
className: "fb-field__required",
|
|
71
|
+
"aria-hidden": "true",
|
|
72
|
+
children: " *"
|
|
73
|
+
}) : null,
|
|
74
|
+
isNotice ? null : /* @__PURE__ */ jsx(Checkbox, {
|
|
75
|
+
id,
|
|
76
|
+
name,
|
|
77
|
+
checked: value ?? false,
|
|
78
|
+
onChange,
|
|
79
|
+
onBlur,
|
|
80
|
+
required,
|
|
81
|
+
disabled,
|
|
82
|
+
invalid: errors.length > 0,
|
|
83
|
+
describedById,
|
|
84
|
+
ariaLabel: plainStatement ?? name
|
|
85
|
+
}),
|
|
86
|
+
link ? /* @__PURE__ */ jsx("span", {
|
|
87
|
+
className: "fb-consent__links",
|
|
88
|
+
children: /* @__PURE__ */ jsx("a", {
|
|
89
|
+
href: link.url,
|
|
90
|
+
target: "_blank",
|
|
91
|
+
rel: "noopener noreferrer",
|
|
92
|
+
className: "fb-consent__link",
|
|
93
|
+
children: link.label
|
|
94
|
+
})
|
|
95
|
+
}) : null
|
|
96
|
+
]
|
|
49
97
|
});
|
|
50
98
|
});
|
|
51
99
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"consent.js","names":[],"sources":["../../../src/react/renderers/consent.tsx"],"sourcesContent":["'use client'\n\nimport {
|
|
1
|
+
{"version":3,"file":"consent.js","names":[],"sources":["../../../src/react/renderers/consent.tsx"],"sourcesContent":["'use client'\n\nimport { useMemo } from 'react'\nimport { sanitizeUrl } from '../../actions/body/converters'\nimport { serializeBody } from '../../actions/body/serializeBody'\nimport { textOfBody } from '../../actions/body/textOfBody'\nimport { defineFieldRenderer } from '../contract'\nimport { Checkbox } from '../primitives/Checkbox'\nimport { FieldShell } from '../primitives/FieldShell'\n\ntype ConsentLink = { label: string; url: string }\n\nconst text = (raw: unknown): string | undefined =>\n\ttypeof raw === 'string' && raw.trim() !== '' ? raw : undefined\n\n/**\n * HTML for a rich text statement. A plain string never goes through this path: `serializeBody`\n * interpolates a string body unescaped (its pre-richText behavior), so rendering one as HTML would\n * let literal markup execute; the renderer shows a plain string as text instead.\n */\nconst richStatementHtml = (statement: unknown): string | undefined => {\n\tif (typeof statement === 'string' || statement == null) {\n\t\treturn undefined\n\t}\n\tconst html = serializeBody(statement, { values: [], descriptors: [] })\n\treturn html === '' ? undefined : html\n}\n\n/**\n * The resolved policy link, or nothing unless the source carries both a url and a name to show\n * for it: an anchor labelled by a raw URL or a machine key is worse than no anchor. The href is\n * sanitized like every other url the package renders, since a source is admin-authored and can\n * point anywhere (`sanitizeUrl` keeps http(s)/mailto/tel and relative urls, and neutralizes the\n * rest to `#`).\n */\nconst linkOf = (raw: unknown): ConsentLink | undefined => {\n\tconst link = raw as Partial<ConsentLink> | undefined\n\tconst label = text(link?.label)\n\treturn label && typeof link?.url === 'string' && link.url !== ''\n\t\t? { label, url: sanitizeUrl(link.url) }\n\t\t: undefined\n}\n\n/**\n * The `statement` and `link` this reads are server-resolved from the field's consent source and\n * injected by `toFormDocument(doc, { consentStatements })`; the form document itself carries only\n * the source key, so a form rendered without that step shows no statement rather than a stale one.\n * The wording arrives already selected for the field's display (a notice source's\n * `noticeStatement` lands here as `statement`), so this renderer never picks between phrasings.\n * A `display: 'notice'` field renders the statement and link as passive prose with no checkbox and\n * no required marker: submitting the form is the consent, and the server records the agreement.\n */\nexport const consentRenderer = defineFieldRenderer<boolean>(\n\t({ field, id, name, value, onChange, onBlur, errors, required, disabled }) => {\n\t\tconst describedById = `${id}-desc`\n\t\tconst isNotice = field.display === 'notice'\n\n\t\t// The checkbox's accessible name is always plain text, regardless of the statement's shape,\n\t\t// so it stays a single unambiguous string even though the visible statement can carry\n\t\t// formatting and inline links. With no statement resolved the field is misconfigured; the\n\t\t// machine name still beats leaving the control unnamed.\n\t\tconst plainStatement = text(textOfBody(field.statement))\n\t\tconst html = useMemo(() => richStatementHtml(field.statement), [field.statement])\n\t\tconst link = linkOf(field.link)\n\n\t\treturn (\n\t\t\t<FieldShell\n\t\t\t\tid={id}\n\t\t\t\tdescription={typeof field.description === 'string' ? field.description : undefined}\n\t\t\t\trequired={isNotice ? false : required}\n\t\t\t\terrors={errors}\n\t\t\t\tdescribedById={describedById}\n\t\t\t>\n\t\t\t\t{html ? (\n\t\t\t\t\t// The statement is a plain sibling, never a <label>: a native <label> forwards clicks to\n\t\t\t\t\t// its control even for descendant links (they aren't \"labelable\" elements per the HTML\n\t\t\t\t\t// spec), so an inline link here would also silently toggle the checkbox. The checkbox's\n\t\t\t\t\t// name comes from aria-label instead. A <div>, because serializeBody emits block\n\t\t\t\t\t// elements (<p>, headings, lists) that are invalid inside inline wrappers.\n\t\t\t\t\t// Safe to inject: serializeBody HTML-escapes all text and sanitizes link URLs.\n\t\t\t\t\t// biome-ignore lint/security/noDangerouslySetInnerHtml: HTML is produced by our escaping serializer, never raw user input\n\t\t\t\t\t<div className=\"fb-consent__statement\" dangerouslySetInnerHTML={{ __html: html }} />\n\t\t\t\t) : plainStatement ? (\n\t\t\t\t\t<span className=\"fb-consent__statement\">{plainStatement}</span>\n\t\t\t\t) : null}\n\t\t\t\t{!isNotice && required && (html || plainStatement) ? (\n\t\t\t\t\t<span className=\"fb-field__required\" aria-hidden=\"true\">\n\t\t\t\t\t\t{' *'}\n\t\t\t\t\t</span>\n\t\t\t\t) : null}\n\t\t\t\t{isNotice ? null : (\n\t\t\t\t\t<Checkbox\n\t\t\t\t\t\tid={id}\n\t\t\t\t\t\tname={name}\n\t\t\t\t\t\tchecked={value ?? false}\n\t\t\t\t\t\tonChange={onChange}\n\t\t\t\t\t\tonBlur={onBlur}\n\t\t\t\t\t\trequired={required}\n\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\tinvalid={errors.length > 0}\n\t\t\t\t\t\tdescribedById={describedById}\n\t\t\t\t\t\tariaLabel={plainStatement ?? name}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t\t{link ? (\n\t\t\t\t\t<span className=\"fb-consent__links\">\n\t\t\t\t\t\t<a\n\t\t\t\t\t\t\thref={link.url}\n\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\trel=\"noopener noreferrer\"\n\t\t\t\t\t\t\tclassName=\"fb-consent__link\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{link.label}\n\t\t\t\t\t\t</a>\n\t\t\t\t\t</span>\n\t\t\t\t) : null}\n\t\t\t</FieldShell>\n\t\t)\n\t}\n)\n"],"mappings":";;;;;;;;;;AAYA,MAAM,QAAQ,QACb,OAAO,QAAQ,YAAY,IAAI,KAAK,MAAM,KAAK,MAAM,KAAA;;;;;;AAOtD,MAAM,qBAAqB,cAA2C;CACrE,IAAI,OAAO,cAAc,YAAY,aAAa,MACjD;CAED,MAAM,OAAO,cAAc,WAAW;EAAE,QAAQ,CAAC;EAAG,aAAa,CAAC;CAAE,CAAC;CACrE,OAAO,SAAS,KAAK,KAAA,IAAY;AAClC;;;;;;;;AASA,MAAM,UAAU,QAA0C;CACzD,MAAM,OAAO;CACb,MAAM,QAAQ,KAAK,MAAM,KAAK;CAC9B,OAAO,SAAS,OAAO,MAAM,QAAQ,YAAY,KAAK,QAAQ,KAC3D;EAAE;EAAO,KAAK,YAAY,KAAK,GAAG;CAAE,IACpC,KAAA;AACJ;;;;;;;;;;AAWA,MAAa,kBAAkB,qBAC7B,EAAE,OAAO,IAAI,MAAM,OAAO,UAAU,QAAQ,QAAQ,UAAU,eAAe;CAC7E,MAAM,gBAAgB,GAAG,GAAG;CAC5B,MAAM,WAAW,MAAM,YAAY;CAMnC,MAAM,iBAAiB,KAAK,WAAW,MAAM,SAAS,CAAC;CACvD,MAAM,OAAO,cAAc,kBAAkB,MAAM,SAAS,GAAG,CAAC,MAAM,SAAS,CAAC;CAChF,MAAM,OAAO,OAAO,MAAM,IAAI;CAE9B,OACC,qBAAC,YAAD;EACK;EACJ,aAAa,OAAO,MAAM,gBAAgB,WAAW,MAAM,cAAc,KAAA;EACzE,UAAU,WAAW,QAAQ;EACrB;EACO;YALhB;GAOE,OAQA,oBAAC,OAAD;IAAK,WAAU;IAAwB,yBAAyB,EAAE,QAAQ,KAAK;GAAI,CAAA,IAChF,iBACH,oBAAC,QAAD;IAAM,WAAU;cAAyB;GAAqB,CAAA,IAC3D;GACH,CAAC,YAAY,aAAa,QAAQ,kBAClC,oBAAC,QAAD;IAAM,WAAU;IAAqB,eAAY;cAC/C;GACI,CAAA,IACH;GACH,WAAW,OACX,oBAAC,UAAD;IACK;IACE;IACN,SAAS,SAAS;IACR;IACF;IACE;IACA;IACV,SAAS,OAAO,SAAS;IACV;IACf,WAAW,kBAAkB;GAC7B,CAAA;GAED,OACA,oBAAC,QAAD;IAAM,WAAU;cACf,oBAAC,KAAD;KACC,MAAM,KAAK;KACX,QAAO;KACP,KAAI;KACJ,WAAU;eAET,KAAK;IACJ,CAAA;GACE,CAAA,IACH;EACO;;AAEd,CACD"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { defineFieldRenderer } from "../contract.js";
|
|
3
|
+
import { FieldShell } from "../primitives/FieldShell.js";
|
|
4
|
+
import { Input } from "../primitives/Input.js";
|
|
5
|
+
import { jsx } from "react/jsx-runtime";
|
|
6
|
+
//#region src/react/renderers/date.tsx
|
|
7
|
+
const dateRenderer = defineFieldRenderer(({ field, id, name, value, onChange, onBlur, errors, required, disabled }) => {
|
|
8
|
+
const describedById = `${id}-desc`;
|
|
9
|
+
return /* @__PURE__ */ jsx(FieldShell, {
|
|
10
|
+
id,
|
|
11
|
+
label: field.label,
|
|
12
|
+
description: typeof field.description === "string" ? field.description : void 0,
|
|
13
|
+
required,
|
|
14
|
+
errors,
|
|
15
|
+
describedById,
|
|
16
|
+
children: /* @__PURE__ */ jsx(Input, {
|
|
17
|
+
id,
|
|
18
|
+
name,
|
|
19
|
+
type: "date",
|
|
20
|
+
value: value ?? "",
|
|
21
|
+
onChange,
|
|
22
|
+
onBlur,
|
|
23
|
+
required,
|
|
24
|
+
disabled,
|
|
25
|
+
invalid: errors.length > 0,
|
|
26
|
+
describedById
|
|
27
|
+
})
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
//#endregion
|
|
31
|
+
export { dateRenderer };
|
|
32
|
+
|
|
33
|
+
//# sourceMappingURL=date.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"date.js","names":[],"sources":["../../../src/react/renderers/date.tsx"],"sourcesContent":["'use client'\n\nimport { defineFieldRenderer } from '../contract'\nimport { FieldShell } from '../primitives/FieldShell'\nimport { Input } from '../primitives/Input'\n\nexport const dateRenderer = defineFieldRenderer<string>(\n\t({ field, id, name, value, onChange, onBlur, errors, required, disabled }) => {\n\t\tconst describedById = `${id}-desc`\n\t\treturn (\n\t\t\t<FieldShell\n\t\t\t\tid={id}\n\t\t\t\tlabel={field.label}\n\t\t\t\tdescription={typeof field.description === 'string' ? field.description : undefined}\n\t\t\t\trequired={required}\n\t\t\t\terrors={errors}\n\t\t\t\tdescribedById={describedById}\n\t\t\t>\n\t\t\t\t<Input\n\t\t\t\t\tid={id}\n\t\t\t\t\tname={name}\n\t\t\t\t\ttype=\"date\"\n\t\t\t\t\tvalue={value ?? ''}\n\t\t\t\t\tonChange={onChange}\n\t\t\t\t\tonBlur={onBlur}\n\t\t\t\t\trequired={required}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tinvalid={errors.length > 0}\n\t\t\t\t\tdescribedById={describedById}\n\t\t\t\t/>\n\t\t\t</FieldShell>\n\t\t)\n\t}\n)\n"],"mappings":";;;;;;AAMA,MAAa,eAAe,qBAC1B,EAAE,OAAO,IAAI,MAAM,OAAO,UAAU,QAAQ,QAAQ,UAAU,eAAe;CAC7E,MAAM,gBAAgB,GAAG,GAAG;CAC5B,OACC,oBAAC,YAAD;EACK;EACJ,OAAO,MAAM;EACb,aAAa,OAAO,MAAM,gBAAgB,WAAW,MAAM,cAAc,KAAA;EAC/D;EACF;EACO;YAEf,oBAAC,OAAD;GACK;GACE;GACN,MAAK;GACL,OAAO,SAAS;GACN;GACF;GACE;GACA;GACV,SAAS,OAAO,SAAS;GACV;EACf,CAAA;CACU,CAAA;AAEd,CACD"}
|
|
@@ -2,19 +2,17 @@
|
|
|
2
2
|
import { defineFieldRenderer } from "../contract.js";
|
|
3
3
|
import { FieldShell } from "../primitives/FieldShell.js";
|
|
4
4
|
import { Input } from "../primitives/Input.js";
|
|
5
|
-
import { useId } from "react";
|
|
6
5
|
import { jsx } from "react/jsx-runtime";
|
|
7
6
|
//#region src/react/renderers/email.tsx
|
|
8
|
-
const emailRenderer = defineFieldRenderer(({ field, name, value, onChange, onBlur, errors,
|
|
9
|
-
const id = useId();
|
|
7
|
+
const emailRenderer = defineFieldRenderer(({ field, id, name, value, onChange, onBlur, errors, required, disabled }) => {
|
|
10
8
|
const describedById = `${id}-desc`;
|
|
9
|
+
const autoComplete = typeof field.autocomplete === "string" && field.autocomplete.trim() ? field.autocomplete : void 0;
|
|
11
10
|
return /* @__PURE__ */ jsx(FieldShell, {
|
|
12
11
|
id,
|
|
13
12
|
label: field.label,
|
|
14
13
|
description: typeof field.description === "string" ? field.description : void 0,
|
|
15
14
|
required,
|
|
16
15
|
errors,
|
|
17
|
-
warnings,
|
|
18
16
|
describedById,
|
|
19
17
|
children: /* @__PURE__ */ jsx(Input, {
|
|
20
18
|
id,
|
|
@@ -27,7 +25,8 @@ const emailRenderer = defineFieldRenderer(({ field, name, value, onChange, onBlu
|
|
|
27
25
|
required,
|
|
28
26
|
disabled,
|
|
29
27
|
invalid: errors.length > 0,
|
|
30
|
-
describedById
|
|
28
|
+
describedById,
|
|
29
|
+
autoComplete
|
|
31
30
|
})
|
|
32
31
|
});
|
|
33
32
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"email.js","names":[],"sources":["../../../src/react/renderers/email.tsx"],"sourcesContent":["'use client'\n\nimport {
|
|
1
|
+
{"version":3,"file":"email.js","names":[],"sources":["../../../src/react/renderers/email.tsx"],"sourcesContent":["'use client'\n\nimport { defineFieldRenderer } from '../contract'\nimport { FieldShell } from '../primitives/FieldShell'\nimport { Input } from '../primitives/Input'\n\nexport const emailRenderer = defineFieldRenderer<string>(\n\t({ field, id, name, value, onChange, onBlur, errors, required, disabled }) => {\n\t\tconst describedById = `${id}-desc`\n\t\tconst autoComplete =\n\t\t\ttypeof field.autocomplete === 'string' && field.autocomplete.trim()\n\t\t\t\t? field.autocomplete\n\t\t\t\t: undefined\n\t\treturn (\n\t\t\t<FieldShell\n\t\t\t\tid={id}\n\t\t\t\tlabel={field.label}\n\t\t\t\tdescription={typeof field.description === 'string' ? field.description : undefined}\n\t\t\t\trequired={required}\n\t\t\t\terrors={errors}\n\t\t\t\tdescribedById={describedById}\n\t\t\t>\n\t\t\t\t<Input\n\t\t\t\t\tid={id}\n\t\t\t\t\tname={name}\n\t\t\t\t\ttype=\"email\"\n\t\t\t\t\tvalue={value ?? ''}\n\t\t\t\t\tonChange={onChange}\n\t\t\t\t\tonBlur={onBlur}\n\t\t\t\t\tplaceholder={typeof field.placeholder === 'string' ? field.placeholder : undefined}\n\t\t\t\t\trequired={required}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tinvalid={errors.length > 0}\n\t\t\t\t\tdescribedById={describedById}\n\t\t\t\t\tautoComplete={autoComplete}\n\t\t\t\t/>\n\t\t\t</FieldShell>\n\t\t)\n\t}\n)\n"],"mappings":";;;;;;AAMA,MAAa,gBAAgB,qBAC3B,EAAE,OAAO,IAAI,MAAM,OAAO,UAAU,QAAQ,QAAQ,UAAU,eAAe;CAC7E,MAAM,gBAAgB,GAAG,GAAG;CAC5B,MAAM,eACL,OAAO,MAAM,iBAAiB,YAAY,MAAM,aAAa,KAAK,IAC/D,MAAM,eACN,KAAA;CACJ,OACC,oBAAC,YAAD;EACK;EACJ,OAAO,MAAM;EACb,aAAa,OAAO,MAAM,gBAAgB,WAAW,MAAM,cAAc,KAAA;EAC/D;EACF;EACO;YAEf,oBAAC,OAAD;GACK;GACE;GACN,MAAK;GACL,OAAO,SAAS;GACN;GACF;GACR,aAAa,OAAO,MAAM,gBAAgB,WAAW,MAAM,cAAc,KAAA;GAC/D;GACA;GACV,SAAS,OAAO,SAAS;GACV;GACD;EACd,CAAA;CACU,CAAA;AAEd,CACD"}
|