@shapio/cms 0.5.7 → 0.5.8
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/dist/admin/assets/{AssetTile-H0hABhB2.js → AssetTile-BrMzsUZD.js} +2 -2
- package/dist/admin/assets/{AssetTile-H0hABhB2.js.map → AssetTile-BrMzsUZD.js.map} +1 -1
- package/dist/admin/assets/{AssistError-1s3PuY0X.js → AssistError-Cs-r9Ssc.js} +2 -2
- package/dist/admin/assets/{AssistError-1s3PuY0X.js.map → AssistError-Cs-r9Ssc.js.map} +1 -1
- package/dist/admin/assets/{BlockMenuItems-a8zXdfcF.js → BlockMenuItems-DsccXMc_.js} +2 -2
- package/dist/admin/assets/{BlockMenuItems-a8zXdfcF.js.map → BlockMenuItems-DsccXMc_.js.map} +1 -1
- package/dist/admin/assets/{Builder-60jO_nbS.js → Builder-DW-GJA_q.js} +2 -2
- package/dist/admin/assets/{Builder-60jO_nbS.js.map → Builder-DW-GJA_q.js.map} +1 -1
- package/dist/admin/assets/{CodeEditor-BLbJZE9v.js → CodeEditor-CBCR73Wd.js} +2 -2
- package/dist/admin/assets/{CodeEditor-BLbJZE9v.js.map → CodeEditor-CBCR73Wd.js.map} +1 -1
- package/dist/admin/assets/{CopyButton-BOtR_h1H.js → CopyButton-CxFsBHfF.js} +2 -2
- package/dist/admin/assets/{CopyButton-BOtR_h1H.js.map → CopyButton-CxFsBHfF.js.map} +1 -1
- package/dist/admin/assets/{CursorPager-DwLW13ov.js → CursorPager-BW2U3v6l.js} +2 -2
- package/dist/admin/assets/{CursorPager-DwLW13ov.js.map → CursorPager-BW2U3v6l.js.map} +1 -1
- package/dist/admin/assets/{FocalPoint-n-a_AXKN.js → FocalPoint-CpZTve1E.js} +2 -2
- package/dist/admin/assets/{FocalPoint-n-a_AXKN.js.map → FocalPoint-CpZTve1E.js.map} +1 -1
- package/dist/admin/assets/{Form-D_4fhOy0.js → Form-lNrRHc0I.js} +2 -2
- package/dist/admin/assets/{Form-D_4fhOy0.js.map → Form-lNrRHc0I.js.map} +1 -1
- package/dist/admin/assets/{FormCheckboxGroup-1fYisXrr.js → FormCheckboxGroup-DeeaYnzB.js} +2 -2
- package/dist/admin/assets/{FormCheckboxGroup-1fYisXrr.js.map → FormCheckboxGroup-DeeaYnzB.js.map} +1 -1
- package/dist/admin/assets/{FormRadioGroup-B0VZyb1t.js → FormRadioGroup-Cfx5pvzU.js} +2 -2
- package/dist/admin/assets/{FormRadioGroup-B0VZyb1t.js.map → FormRadioGroup-Cfx5pvzU.js.map} +1 -1
- package/dist/admin/assets/{FormSelectField-Br8bkwRF.js → FormSelectField-BzE9Lq9i.js} +2 -2
- package/dist/admin/assets/{FormSelectField-Br8bkwRF.js.map → FormSelectField-BzE9Lq9i.js.map} +1 -1
- package/dist/admin/assets/{FormSwitchField-d8G-YCSX.js → FormSwitchField-BLOh7qei.js} +2 -2
- package/dist/admin/assets/{FormSwitchField-d8G-YCSX.js.map → FormSwitchField-BLOh7qei.js.map} +1 -1
- package/dist/admin/assets/{FormTextareaField-BSKNeTPW.js → FormTextareaField-CO115n_u.js} +2 -2
- package/dist/admin/assets/{FormTextareaField-BSKNeTPW.js.map → FormTextareaField-CO115n_u.js.map} +1 -1
- package/dist/admin/assets/{HintedLabel-CiTDE112.js → HintedLabel-DzHnEdIK.js} +2 -2
- package/dist/admin/assets/{HintedLabel-CiTDE112.js.map → HintedLabel-DzHnEdIK.js.map} +1 -1
- package/dist/admin/assets/{InfoHint-B3XcXtiN.js → InfoHint-CSEtcHjL.js} +2 -2
- package/dist/admin/assets/{InfoHint-B3XcXtiN.js.map → InfoHint-CSEtcHjL.js.map} +1 -1
- package/dist/admin/assets/{InlineConfirm-BfsNH5S_.js → InlineConfirm-yW-iUKFC.js} +2 -2
- package/dist/admin/assets/{InlineConfirm-BfsNH5S_.js.map → InlineConfirm-yW-iUKFC.js.map} +1 -1
- package/dist/admin/assets/{InsertMenuItem-BGwDW_Lu.js → InsertMenuItem-CCr9e0qY.js} +2 -2
- package/dist/admin/assets/{InsertMenuItem-BGwDW_Lu.js.map → InsertMenuItem-CCr9e0qY.js.map} +1 -1
- package/dist/admin/assets/{Match-Dc8bXsKo.js → Match-CcD9KxHH.js} +2 -2
- package/dist/admin/assets/{Match-Dc8bXsKo.js.map → Match-CcD9KxHH.js.map} +1 -1
- package/dist/admin/assets/{NoAccess-CKEKPmqD.js → NoAccess-C8RLPN0I.js} +2 -2
- package/dist/admin/assets/{NoAccess-CKEKPmqD.js.map → NoAccess-C8RLPN0I.js.map} +1 -1
- package/dist/admin/assets/{QueryView-KFtwko9F.js → QueryView-xMP_uJ_t.js} +2 -2
- package/dist/admin/assets/{QueryView-KFtwko9F.js.map → QueryView-xMP_uJ_t.js.map} +1 -1
- package/dist/admin/assets/{RadioTile-CzfxWgHx.js → RadioTile-DQFmni5A.js} +2 -2
- package/dist/admin/assets/{RadioTile-CzfxWgHx.js.map → RadioTile-DQFmni5A.js.map} +1 -1
- package/dist/admin/assets/{RichTextField-BsBoOAP-.js → RichTextField-CVHRIbnu.js} +2 -2
- package/dist/admin/assets/{RichTextField-BsBoOAP-.js.map → RichTextField-CVHRIbnu.js.map} +1 -1
- package/dist/admin/assets/{RowTitle-Cn5mAU58.js → RowTitle-Bqt6evG9.js} +2 -2
- package/dist/admin/assets/{RowTitle-Cn5mAU58.js.map → RowTitle-Bqt6evG9.js.map} +1 -1
- package/dist/admin/assets/{SecretReveal-BCOJAisI.js → SecretReveal-Bm6nYg5J.js} +2 -2
- package/dist/admin/assets/{SecretReveal-BCOJAisI.js.map → SecretReveal-Bm6nYg5J.js.map} +1 -1
- package/dist/admin/assets/{SharedGlyph-CA8tb7UH.js → SharedGlyph-cUmTh0_C.js} +2 -2
- package/dist/admin/assets/{SharedGlyph-CA8tb7UH.js.map → SharedGlyph-cUmTh0_C.js.map} +1 -1
- package/dist/admin/assets/{StepList-sriwGP1e.js → StepList-BXGYD9eJ.js} +2 -2
- package/dist/admin/assets/{StepList-sriwGP1e.js.map → StepList-BXGYD9eJ.js.map} +1 -1
- package/dist/admin/assets/Structure-D8csgrIt.js +2 -0
- package/dist/admin/assets/{Structure-B2HZ9UZu.js.map → Structure-D8csgrIt.js.map} +1 -1
- package/dist/admin/assets/{SuggestAltButton-CqDLAuoa.js → SuggestAltButton-CvIoirnz.js} +2 -2
- package/dist/admin/assets/{SuggestAltButton-CqDLAuoa.js.map → SuggestAltButton-CvIoirnz.js.map} +1 -1
- package/dist/admin/assets/{Thumbnail-mFfESZiW.js → Thumbnail-DNj5TRBI.js} +2 -2
- package/dist/admin/assets/{Thumbnail-mFfESZiW.js.map → Thumbnail-DNj5TRBI.js.map} +1 -1
- package/dist/admin/assets/{UnsavedChangesGuard-C8cDQGEA.js → UnsavedChangesGuard-CUiuMklN.js} +2 -2
- package/dist/admin/assets/{UnsavedChangesGuard-C8cDQGEA.js.map → UnsavedChangesGuard-CUiuMklN.js.map} +1 -1
- package/dist/admin/assets/{UserAvatar-BItYDTyH.js → UserAvatar-p-jV-LoD.js} +2 -2
- package/dist/admin/assets/{UserAvatar-BItYDTyH.js.map → UserAvatar-p-jV-LoD.js.map} +1 -1
- package/dist/admin/assets/{badge-DNQwGXBl.js → badge-CqKF1pwz.js} +2 -2
- package/dist/admin/assets/{badge-DNQwGXBl.js.map → badge-CqKF1pwz.js.map} +1 -1
- package/dist/admin/assets/{changeSets-EMTUJT0M.js → changeSets-8EburmT0.js} +2 -2
- package/dist/admin/assets/{changeSets-EMTUJT0M.js.map → changeSets-8EburmT0.js.map} +1 -1
- package/dist/admin/assets/{constants-miV4q1ur.js → constants-a_15vqOh.js} +2 -2
- package/dist/admin/assets/{constants-miV4q1ur.js.map → constants-a_15vqOh.js.map} +1 -1
- package/dist/admin/assets/{content-CgZS_S7P.js → content-CAjkbZEY.js} +3 -3
- package/dist/admin/assets/content-CAjkbZEY.js.map +1 -0
- package/dist/admin/assets/{contentTypes-CQsHL657.js → contentTypes-84uc0bjR.js} +2 -2
- package/dist/admin/assets/{contentTypes-CQsHL657.js.map → contentTypes-84uc0bjR.js.map} +1 -1
- package/dist/admin/assets/{develop-9ZeAjSIw.js → develop-BOqvnlgt.js} +2 -2
- package/dist/admin/assets/{develop-9ZeAjSIw.js.map → develop-BOqvnlgt.js.map} +1 -1
- package/dist/admin/assets/{dropdown-menu-0dyAtBEd.js → dropdown-menu-_xfaEp5C.js} +2 -2
- package/dist/admin/assets/{dropdown-menu-0dyAtBEd.js.map → dropdown-menu-_xfaEp5C.js.map} +1 -1
- package/dist/admin/assets/{es2015-BJge4oQL.js → es2015-BHmI7wjK.js} +2 -2
- package/dist/admin/assets/es2015-BHmI7wjK.js.map +1 -0
- package/dist/admin/assets/{field-C6NmRYUN.js → field-COOzRptX.js} +2 -2
- package/dist/admin/assets/{field-C6NmRYUN.js.map → field-COOzRptX.js.map} +1 -1
- package/dist/admin/assets/{fileRoute-Bm90K4UY.js → fileRoute-s7mCMYUJ.js} +2 -2
- package/dist/admin/assets/{fileRoute-Bm90K4UY.js.map → fileRoute-s7mCMYUJ.js.map} +1 -1
- package/dist/admin/assets/{followPlural-DEr2kxEc.js → followPlural-Cm7v_Udv.js} +2 -2
- package/dist/admin/assets/{followPlural-DEr2kxEc.js.map → followPlural-Cm7v_Udv.js.map} +1 -1
- package/dist/admin/assets/{inbox-B8XZ8L6s.js → inbox-DGO2D8fa.js} +2 -2
- package/dist/admin/assets/{inbox-B8XZ8L6s.js.map → inbox-DGO2D8fa.js.map} +1 -1
- package/dist/admin/assets/{index-DoJsnLI1.js → index-BIIU9ZI6.js} +4 -4
- package/dist/admin/assets/{index-DoJsnLI1.js.map → index-BIIU9ZI6.js.map} +1 -1
- package/dist/admin/assets/{labels-B2HIVxXg.js → labels-DQckbLGW.js} +2 -2
- package/dist/admin/assets/{labels-B2HIVxXg.js.map → labels-DQckbLGW.js.map} +1 -1
- package/dist/admin/assets/{media-CtbfNgc-.js → media-CURizGns.js} +2 -2
- package/dist/admin/assets/{media-CtbfNgc-.js.map → media-CURizGns.js.map} +1 -1
- package/dist/admin/assets/{network--5X46kWN.js → network-BixABr0o.js} +2 -2
- package/dist/admin/assets/{network--5X46kWN.js.map → network-BixABr0o.js.map} +1 -1
- package/dist/admin/assets/{publishing-DdmWXRaM.js → publishing-Dke9bSKp.js} +2 -2
- package/dist/admin/assets/{publishing-DdmWXRaM.js.map → publishing-Dke9bSKp.js.map} +1 -1
- package/dist/admin/assets/{radio-group-BoN9R_3K.js → radio-group-4ok5evXq.js} +2 -2
- package/dist/admin/assets/{radio-group-BoN9R_3K.js.map → radio-group-4ok5evXq.js.map} +1 -1
- package/dist/admin/assets/{searchSchemas-DNjfDxmj.js → searchSchemas-CSScloG8.js} +2 -2
- package/dist/admin/assets/{searchSchemas-DNjfDxmj.js.map → searchSchemas-CSScloG8.js.map} +1 -1
- package/dist/admin/assets/{sections-BfxPwK0u.js → sections-DqBzSKMP.js} +2 -2
- package/dist/admin/assets/{sections-BfxPwK0u.js.map → sections-DqBzSKMP.js.map} +1 -1
- package/dist/admin/assets/{select-Bp8kO5Ko.js → select-C0USI-Ox.js} +2 -2
- package/dist/admin/assets/{select-Bp8kO5Ko.js.map → select-C0USI-Ox.js.map} +1 -1
- package/dist/admin/assets/{settings-TEbLvC-v.js → settings-B60vHpZd.js} +2 -2
- package/dist/admin/assets/{settings-TEbLvC-v.js.map → settings-B60vHpZd.js.map} +1 -1
- package/dist/admin/assets/{shapes-WrYO9Spf.js → shapes-B5twqZcp.js} +4 -4
- package/dist/admin/assets/{shapes-WrYO9Spf.js.map → shapes-B5twqZcp.js.map} +1 -1
- package/dist/admin/assets/{skeleton-vXOCdnJv.js → skeleton-B5MP72Kw.js} +2 -2
- package/dist/admin/assets/{skeleton-vXOCdnJv.js.map → skeleton-B5MP72Kw.js.map} +1 -1
- package/dist/admin/assets/{switch-B1xClhNG.js → switch-Dp6WYNam.js} +2 -2
- package/dist/admin/assets/{switch-B1xClhNG.js.map → switch-Dp6WYNam.js.map} +1 -1
- package/dist/admin/assets/{tooltip-CS_8cJu2.js → tooltip-BGP1DVBt.js} +2 -2
- package/dist/admin/assets/{tooltip-CS_8cJu2.js.map → tooltip-BGP1DVBt.js.map} +1 -1
- package/dist/admin/assets/{useDiscardGuard-CMMJgkI2.js → useDiscardGuard-BskWSlbT.js} +2 -2
- package/dist/admin/assets/{useDiscardGuard-CMMJgkI2.js.map → useDiscardGuard-BskWSlbT.js.map} +1 -1
- package/dist/admin/assets/{useMediaPickerDialog-xvQ8cofO.js → useMediaPickerDialog-CU-ekPqX.js} +2 -2
- package/dist/admin/assets/{useMediaPickerDialog-xvQ8cofO.js.map → useMediaPickerDialog-CU-ekPqX.js.map} +1 -1
- package/dist/admin/assets/{useMediaUploader-BVNTeSAU.js → useMediaUploader-CBcq1ICg.js} +2 -2
- package/dist/admin/assets/{useMediaUploader-BVNTeSAU.js.map → useMediaUploader-CBcq1ICg.js.map} +1 -1
- package/dist/admin/assets/{useResolvedScheme-CScQpr-P.js → useResolvedScheme-C8vcQVko.js} +2 -2
- package/dist/admin/assets/{useResolvedScheme-CScQpr-P.js.map → useResolvedScheme-C8vcQVko.js.map} +1 -1
- package/dist/admin/assets/{zod-hUh5nXnX.js → zod-Cry7YvLY.js} +2 -2
- package/dist/admin/assets/{zod-hUh5nXnX.js.map → zod-Cry7YvLY.js.map} +1 -1
- package/dist/admin/index.html +25 -25
- package/dist/cli.js +1 -1
- package/dist/{cliMain-D08HeAd_.js → cliMain-papyXJDd.js} +2 -2
- package/dist/{cliMain-D08HeAd_.js.map → cliMain-papyXJDd.js.map} +1 -1
- package/dist/index.js +1 -1
- package/dist/{worker-jspgh10V.js → worker-B-sC-eY2.js} +2 -2
- package/dist/{worker-jspgh10V.js.map → worker-B-sC-eY2.js.map} +1 -1
- package/package.json +5 -5
- package/dist/admin/assets/Structure-B2HZ9UZu.js +0 -2
- package/dist/admin/assets/content-CgZS_S7P.js.map +0 -1
- package/dist/admin/assets/es2015-BJge4oQL.js.map +0 -1
package/dist/admin/assets/{FormCheckboxGroup-1fYisXrr.js.map → FormCheckboxGroup-DeeaYnzB.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FormCheckboxGroup-1fYisXrr.js","names":["__toESM","InfoHint","Checkbox","FieldSet","FieldLabel","FieldDescription","Field","useController","FormFieldError","PUBLICATION_ACTIONS","SCHEDULE_STATUSES","DEPLOYMENT_PROVIDERS","DEPLOYMENT_TRIGGERS","import_jsx_runtime","require_jsx_runtime","FormCheckboxGroup","selected","field","toggle","checked","value","item","errorMessage","fieldState","FieldLegend","legend","description","options","id","name","option","hintId"],"sources":["../../../../packages/client/src/admin/publishingTypes.ts","../../src/components/FormCheckboxGroup/index.tsx"],"sourcesContent":["/**\n * Publishing types (package H, `apps/api/src/routes/admin/{jobs,publishing,webhooks,deployments,preview}`).\n * Dates are ISO-8601 strings.\n */\nimport type { SiteRef } from './sitesTypes.js';\n\nexport type Page<T> = { items: T[]; nextCursor: string | null };\n\n// Jobs ---------------------------------------------------------------------------------------------\n\nexport const JOB_STATUSES = ['pending', 'running', 'succeeded', 'dead'] as const;\nexport type JobStatus = (typeof JOB_STATUSES)[number];\n\nexport type Job = {\n id: string;\n type: string;\n status: JobStatus;\n attempts: number;\n maxAttempts: number;\n /** When it runs next (pending) or ran last. */\n runAt: string;\n idempotencyKey: string | null;\n lockedBy: string | null;\n lockedUntil: string | null;\n /** Payload and result with secret-looking values replaced by `[redacted]`. */\n payload: unknown;\n result: unknown;\n /** Progress a long job saved (e.g. an import's phase and counts); null when it saved none. */\n progress: unknown;\n lastError: string | null;\n createdAt: string;\n updatedAt: string;\n finishedAt: string | null;\n};\n\nexport type JobQuery = { status?: JobStatus; type?: string; cursor?: string; limit?: number };\n\nexport type JobSummary = { counts: Record<JobStatus, number>; types: string[] };\n\n// Scheduled publications ---------------------------------------------------------------------------\n\nexport const PUBLICATION_ACTIONS = ['publish', 'unpublish'] as const;\nexport type PublicationAction = (typeof PUBLICATION_ACTIONS)[number];\n\nexport const SCHEDULE_STATUSES = ['scheduled', 'done', 'failed', 'cancelled'] as const;\nexport type ScheduleStatus = (typeof SCHEDULE_STATUSES)[number];\n\nexport type ScheduledPublication = {\n id: string;\n entryId: string;\n modelId: string;\n /** Null when the model no longer exists. */\n modelKey: string | null;\n locale: string;\n action: PublicationAction;\n runAt: string;\n status: ScheduleStatus;\n error: string | null;\n /** Publication sequence the change was published at (once done). */\n snapshot: number | null;\n createdBy: string | null;\n createdAt: string;\n executedAt: string | null;\n};\n\nexport type ScheduleQuery = { status?: ScheduleStatus; entryId?: string; cursor?: string; limit?: number };\n\nexport type CreateScheduleInput = {\n modelKey: string;\n entryId: string;\n /** Omit for non-localized models (and for the default locale). */\n locale?: string;\n action: PublicationAction;\n runAt: string;\n};\n\n// Webhooks -----------------------------------------------------------------------------------------\n\nexport type WebhookEventType = { type: string; group: string };\n\nexport type WebhookDeliveryStatus = 'pending' | 'retrying' | 'succeeded' | 'dead';\n\nexport type Webhook = {\n id: string;\n name: string;\n url: string;\n /** Event types or `group.*` patterns. */\n events: string[];\n enabled: boolean;\n allowPrivateNetwork: boolean;\n maxAttempts: number;\n /** The site whose events it receives; null for a network-wide webhook (every site's events). */\n site: SiteRef | null;\n lastDelivery: { status: WebhookDeliveryStatus; at: string } | null;\n createdBy: string | null;\n createdAt: string;\n updatedAt: string;\n version: number;\n /** The stored signing secret cannot be decrypted (SESSION_SECRET changed): rotate it to repair the webhook. */\n secretsUnreadable: boolean;\n};\n\nexport type CreateWebhookInput = {\n name: string;\n url: string;\n events: string[];\n enabled?: boolean;\n allowPrivateNetwork?: boolean;\n maxAttempts?: number;\n /** A network-wide webhook (every site's events); otherwise it belongs to the request's site. */\n network?: boolean;\n};\n\n/** A webhook's site is fixed once created. */\nexport type UpdateWebhookInput = Partial<Omit<CreateWebhookInput, 'network'>> & { expectedVersion: number };\n\n/** The JSON body every webhook delivery sends (signed; verify it with `verifyWebhookSignature`). */\nexport type WebhookEventBody = {\n id: string;\n type: string;\n createdAt: string;\n /** The site the event is about; null for events about no site (network-wide). */\n site: SiteRef | null;\n data: unknown;\n};\n\n/** `secret` is shown once: on creation and after rotation. */\nexport type WebhookWithSecret = { webhook: Webhook; secret: string };\n\nexport type WebhookAttempt = {\n attempt: number;\n at: string;\n durationMs: number;\n request: { method: string; url: string; headers: Record<string, string> };\n /** Null when no response arrived (refused, timeout, blocked by the network policy). */\n response: { status: number; headers: Record<string, string>; body: string; truncated: boolean } | null;\n error: string | null;\n};\n\nexport type WebhookDelivery = {\n id: string;\n webhookId: string;\n eventId: string | null;\n eventType: string;\n isTest: boolean;\n status: WebhookDeliveryStatus;\n attempts: number;\n lastResponseStatus: number | null;\n lastError: string | null;\n payload: unknown;\n attemptLog: WebhookAttempt[];\n createdAt: string;\n updatedAt: string;\n deliveredAt: string | null;\n};\n\n// Deployments --------------------------------------------------------------------------------------\n\nexport const DEPLOYMENT_PROVIDERS = [\n 'generic_webhook',\n 'cloudflare_pages',\n 'vercel',\n 'netlify',\n 'github',\n] as const;\nexport type DeploymentProvider = (typeof DEPLOYMENT_PROVIDERS)[number];\n\nexport const DEPLOYMENT_TRIGGERS = ['publish', 'change_set', 'schema', 'manual'] as const;\nexport type DeploymentTriggerPolicy = (typeof DEPLOYMENT_TRIGGERS)[number];\n\nexport const DEPLOYMENT_RUN_STATUSES = [\n 'queued',\n 'triggered',\n 'building',\n 'deployed',\n 'failed',\n 'unknown',\n] as const;\nexport type DeploymentRunStatus = (typeof DEPLOYMENT_RUN_STATUSES)[number];\n\nexport type DeploymentRunTrigger = 'publish' | 'change_set' | 'schema' | 'manual' | 'retry';\n\n/**\n * Provider settings (not secret). Generic: `{ url }`. Cloudflare Pages: `{ accountId, projectName }`.\n * GitHub: `{ owner, repo, branch, mode: 'commit' | 'pull_request', directory }`.\n */\nexport type DeploymentSettings = Record<string, string>;\n\n/**\n * Secret names per provider. Generic: `signingSecret` (generated when omitted). Cloudflare Pages:\n * `deployHookUrl`, `apiToken`. GitHub: `token`. Values are write-only. A value of `${ENV:VAR_NAME}`\n * makes the server read the secret from that environment variable instead of storing it.\n */\nexport type DeploymentSecretsInput = Record<string, string>;\n\n/** Which secrets are set; values never leave the server. `envVar`: read from this environment variable. */\nexport type DeploymentSecretState = Record<string, { set: boolean; envVar: string | null }>;\n\nexport type DeploymentTimelineEvent = {\n status: DeploymentRunStatus;\n at: string;\n source: 'shapio' | 'callback' | 'provider';\n message: string | null;\n};\n\nexport type DeploymentRun = {\n id: string;\n connectionId: string;\n connectionName: string;\n provider: DeploymentProvider;\n status: DeploymentRunStatus;\n trigger: DeploymentRunTrigger;\n /** Publication sequence the run was triggered at (`?snapshot=` on delivery). */\n snapshot: number | null;\n schemaVersion: number | null;\n retryOf: string | null;\n providerRef: string | null;\n logUrl: string | null;\n siteUrl: string | null;\n error: string | null;\n /** False for providers that cannot report completion without callbacks (shown as \"completion unknown\"). */\n completionReported: boolean;\n timeline: DeploymentTimelineEvent[];\n triggeredAt: string | null;\n finishedAt: string | null;\n createdAt: string;\n updatedAt: string;\n};\n\nexport type DeploymentConnection = {\n id: string;\n name: string;\n provider: DeploymentProvider;\n settings: DeploymentSettings;\n secrets: DeploymentSecretState;\n previewUrlTemplate: string | null;\n /** Preview tokens issued for this connection show exactly what this delivery role reads. */\n deliveryRoleId: string | null;\n triggerPolicy: DeploymentTriggerPolicy[];\n debounceSeconds: number;\n allowPrivateNetwork: boolean;\n enabled: boolean;\n /** Where the site posts signed build callbacks (generic webhook connections). */\n callbackUrl: string;\n latestRun: DeploymentRun | null;\n /** The newest deployed run by snapshot: what the site is serving, as far as Shapio knows. */\n currentRun: DeploymentRun | null;\n createdBy: string | null;\n createdAt: string;\n updatedAt: string;\n version: number;\n /**\n * The stored secrets cannot be decrypted (the server's SESSION_SECRET changed): every literal secret reads\n * as not set until it is entered again; secrets read from the environment are unaffected.\n */\n secretsUnreadable: boolean;\n};\n\nexport type CreateDeploymentConnectionInput = {\n name: string;\n provider: DeploymentProvider;\n settings: DeploymentSettings;\n secrets: DeploymentSecretsInput;\n previewUrlTemplate?: string | null;\n triggerPolicy: DeploymentTriggerPolicy[];\n debounceSeconds?: number;\n allowPrivateNetwork?: boolean;\n enabled?: boolean;\n deliveryRoleId?: string | null;\n};\n\nexport type UpdateDeploymentConnectionInput = Partial<Omit<CreateDeploymentConnectionInput, 'provider'>> & {\n expectedVersion: number;\n};\n\n/** `generatedSecrets` holds secrets Shapio generated (the generic signing secret), shown once. */\nexport type DeploymentConnectionCreated = {\n connection: DeploymentConnection;\n generatedSecrets: Record<string, string>;\n};\n\n/** An update's result: `generatedSecrets` holds a secret Shapio minted to replace an unreadable one, shown once. */\nexport type DeploymentConnectionUpdated = DeploymentConnection & {\n generatedSecrets?: Record<string, string>;\n};\n\nexport type ConnectionTestResult = {\n ok: boolean;\n checks: Array<{ name: string; ok: boolean; message: string }>;\n};\n\nexport type DeploymentRunQuery = { connectionId?: string; cursor?: string; limit?: number };\n\n// Preview ------------------------------------------------------------------------------------------\n\nexport type PreviewToken = {\n id: string;\n tokenPrefix: string;\n modelId: string;\n modelKey: string | null;\n entryId: string | null;\n locale: string | null;\n connectionId: string | null;\n /** Fields follow this delivery role (within the creator's access); null = the public fields. */\n deliveryRoleId: string | null;\n createdBy: string;\n expiresAt: string;\n revokedAt: string | null;\n lastUsedAt: string | null;\n createdAt: string;\n};\n\nexport type CreatePreviewTokenInput = {\n modelKey: string;\n entryId?: string;\n locale?: string;\n /** Default 1 hour, at most 30 days. */\n ttlSeconds?: number;\n connectionId?: string;\n /** Defaults to the connection's delivery role. */\n deliveryRoleId?: string;\n};\n\n/** `token` is shown once. `url` is rendered from the connection's preview URL template (null without one). */\nexport type PreviewTokenCreated = { token: string; previewToken: PreviewToken; url: string | null };\n\nexport type OpenPreviewInput = {\n modelKey: string;\n entryId: string;\n locale?: string;\n /** Defaults to the first enabled connection with a preview URL template. */\n connectionId?: string;\n};\n\n/** What the entry form's Preview button opens. `apiUrl` is the preview read endpoint for this entry. */\nexport type OpenPreviewResult = {\n /** The token's ID (revoke it when the preview closes). */\n id: string;\n url: string | null;\n apiUrl: string;\n token: string;\n expiresAt: string;\n connectionId: string | null;\n};\n\n/** A connection the site's previews open on (names and origins only). */\nexport type PreviewTarget = {\n connectionId: string;\n name: string;\n /** null when the preview URL template's origin depends on a variable. */\n origin: string | null;\n /** Whether the admin can show it in its preview frame. */\n framable: boolean;\n};\n","import { useController, type Control, type FieldPath, type FieldValues } from 'react-hook-form';\nimport { Checkbox } from '@/components/ui/checkbox';\nimport { Field, FieldDescription, FieldLabel, FieldLegend, FieldSet } from '@/components/ui/field';\nimport { FormFieldError } from '../FormFieldError';\nimport { InfoHint } from '../InfoHint';\n\nexport type CheckboxOption = {\n value: string;\n label: string;\n description?: string;\n /** An explanation behind an info icon beside the option's label (DESIGN.md, helper-text rule). */\n hint?: string;\n};\n\ntype FormCheckboxGroupProps<TValues extends FieldValues> = {\n control: Control<TValues>;\n name: FieldPath<TValues>;\n legend: string;\n description?: string;\n options: readonly CheckboxOption[];\n disabled?: boolean;\n};\n\n/** A fieldset of checkboxes bound to a `string[]` form value. */\nexport const FormCheckboxGroup = <TValues extends FieldValues>({\n control,\n name,\n legend,\n description,\n options,\n disabled,\n}: FormCheckboxGroupProps<TValues>) => {\n const { field, fieldState } = useController({ control, name });\n const selected = (field.value as string[] | undefined) ?? [];\n const toggle = (value: string, checked: boolean) =>\n field.onChange(checked ? [...selected, value] : selected.filter((item) => item !== value));\n const errorMessage = fieldState.error?.message;\n return (\n <FieldSet data-invalid={fieldState.invalid || undefined}>\n <FieldLegend variant=\"label\">{legend}</FieldLegend>\n {description ? <FieldDescription>{description}</FieldDescription> : null}\n <div data-slot=\"checkbox-group\" className=\"grid gap-3 sm:grid-cols-2\">\n {options.map((option) => {\n const id = `field-${name}-${option.value}`;\n const hintId = option.hint ? `${id}-hint` : undefined;\n return (\n <Field key={option.value} orientation=\"horizontal\">\n <Checkbox\n id={id}\n checked={selected.includes(option.value)}\n onCheckedChange={(checked) => toggle(option.value, checked === true)}\n onBlur={field.onBlur}\n disabled={disabled}\n aria-describedby={hintId}\n />\n {option.hint ? (\n <span className=\"flex items-center gap-1\">\n <FieldLabel htmlFor={id} className=\"font-normal\">\n {option.label}\n </FieldLabel>\n <InfoHint about={option.label} id={hintId}>\n {option.hint}\n </InfoHint>\n </span>\n ) : (\n <FieldLabel htmlFor={id} className=\"font-normal\">\n {option.label}\n </FieldLabel>\n )}\n </Field>\n );\n })}\n </div>\n <FormFieldError message={errorMessage} />\n </FieldSet>\n );\n};\n"],"mappings":"mSAyCA,IAAaS,EAAsB,CAAC,UAAW,WAAW,EAG7CC,EAAoB,CAAC,YAAa,OAAQ,SAAU,WAAW,EAkH/DC,EAAuB,CAClC,kBACA,mBACA,SACA,UACA,QACF,EAGaC,EAAsB,CAAC,UAAW,aAAc,SAAU,QAAQ,aC/IlEG,GAAkD,CAC7D,UACA,OACA,SACA,cACA,UACA,cACqC,CACrC,GAAM,CAAE,QAAO,cAAeR,EAAc,CAAE,UAAS,MAAK,CAAC,EACvDS,EAAYC,EAAM,OAAkC,CAAC,EACrDC,GAAU,EAAe,IAC7BD,EAAM,SAASE,EAAU,CAAC,GAAGH,EAAUI,CAAK,EAAIJ,EAAS,OAAQ,GAASK,IAASD,CAAK,CAAC,EACrFE,EAAeC,EAAW,OAAO,QACvC,OACE,EAAAV,EAAA,KAAA,CAACV,EAAD,CAAU,eAAcoB,EAAW,SAAW,IAAA,GAA9C,SAAA,EACE,EAAAV,EAAA,IAAA,CAACW,EAAD,CAAa,QAAQ,QAAS,SAAAC,CAAoB,CAAA,EACjDC,GAAc,EAAAb,EAAA,IAAA,CAACR,EAAD,CAAA,SAAmBqB,CAA8B,CAAA,EAAI,MACpE,EAAAb,EAAA,IAAA,CAAC,MAAD,CAAK,YAAU,iBAAiB,UAAU,4BACvC,SAAAc,EAAQ,IAAK,GAAW,CACvB,IAAMC,EAAK,SAASC,EAAK,GAAGC,EAAO,QAC7BC,EAASD,EAAO,KAAO,GAAGF,EAAG,OAAS,IAAA,GAC5C,OACE,EAAAf,EAAA,KAAA,CAACP,EAAD,CAA0B,YAAY,aAAtC,SAAA,EACE,EAAAO,EAAA,IAAA,CAACX,EAAD,CACM,KACJ,QAASc,EAAS,SAASc,EAAO,KAAK,EACvC,gBAAkB,GAAYZ,EAAOY,EAAO,MAAOX,IAAY,EAAI,EACnE,OAAQF,EAAM,OACJ,WACV,mBAAkBc,CACnB,CAAA,EACAD,EAAO,MACN,EAAAjB,EAAA,KAAA,CAAC,OAAD,CAAM,UAAU,0BAAhB,SAAA,EACE,EAAAA,EAAA,IAAA,CAACT,EAAD,CAAY,QAASwB,EAAI,UAAU,cAChC,SAAAE,EAAO,KACE,CAAA,GACZ,EAAAjB,EAAA,IAAA,CAACZ,EAAD,CAAU,MAAO6B,EAAO,MAAO,GAAIC,EAChC,SAAAD,EAAO,IACA,CAAA,CACN,CAEN,CAAA,GAAA,EAAAjB,EAAA,IAAA,CAACT,EAAD,CAAY,QAASwB,EAAI,UAAU,cAChC,SAAAE,EAAO,KACE,CAAA,CAET,CAvBK,EAAAA,EAAO,KAuBZ,CAEX,CAAC,CACE,CAAA,GACL,EAAAjB,EAAA,IAAA,CAACL,EAAD,CAAgB,QAASc,CAAe,CAAA,CAChC,GAEd"}
|
|
1
|
+
{"version":3,"file":"FormCheckboxGroup-DeeaYnzB.js","names":["__toESM","InfoHint","Checkbox","FieldSet","FieldLabel","FieldDescription","Field","useController","FormFieldError","PUBLICATION_ACTIONS","SCHEDULE_STATUSES","DEPLOYMENT_PROVIDERS","DEPLOYMENT_TRIGGERS","import_jsx_runtime","require_jsx_runtime","FormCheckboxGroup","selected","field","toggle","checked","value","item","errorMessage","fieldState","FieldLegend","legend","description","options","id","name","option","hintId"],"sources":["../../../../packages/client/src/admin/publishingTypes.ts","../../src/components/FormCheckboxGroup/index.tsx"],"sourcesContent":["/**\n * Publishing types (package H, `apps/api/src/routes/admin/{jobs,publishing,webhooks,deployments,preview}`).\n * Dates are ISO-8601 strings.\n */\nimport type { SiteRef } from './sitesTypes.js';\n\nexport type Page<T> = { items: T[]; nextCursor: string | null };\n\n// Jobs ---------------------------------------------------------------------------------------------\n\nexport const JOB_STATUSES = ['pending', 'running', 'succeeded', 'dead'] as const;\nexport type JobStatus = (typeof JOB_STATUSES)[number];\n\nexport type Job = {\n id: string;\n type: string;\n status: JobStatus;\n attempts: number;\n maxAttempts: number;\n /** When it runs next (pending) or ran last. */\n runAt: string;\n idempotencyKey: string | null;\n lockedBy: string | null;\n lockedUntil: string | null;\n /** Payload and result with secret-looking values replaced by `[redacted]`. */\n payload: unknown;\n result: unknown;\n /** Progress a long job saved (e.g. an import's phase and counts); null when it saved none. */\n progress: unknown;\n lastError: string | null;\n createdAt: string;\n updatedAt: string;\n finishedAt: string | null;\n};\n\nexport type JobQuery = { status?: JobStatus; type?: string; cursor?: string; limit?: number };\n\nexport type JobSummary = { counts: Record<JobStatus, number>; types: string[] };\n\n// Scheduled publications ---------------------------------------------------------------------------\n\nexport const PUBLICATION_ACTIONS = ['publish', 'unpublish'] as const;\nexport type PublicationAction = (typeof PUBLICATION_ACTIONS)[number];\n\nexport const SCHEDULE_STATUSES = ['scheduled', 'done', 'failed', 'cancelled'] as const;\nexport type ScheduleStatus = (typeof SCHEDULE_STATUSES)[number];\n\nexport type ScheduledPublication = {\n id: string;\n entryId: string;\n modelId: string;\n /** Null when the model no longer exists. */\n modelKey: string | null;\n locale: string;\n action: PublicationAction;\n runAt: string;\n status: ScheduleStatus;\n error: string | null;\n /** Publication sequence the change was published at (once done). */\n snapshot: number | null;\n createdBy: string | null;\n createdAt: string;\n executedAt: string | null;\n};\n\nexport type ScheduleQuery = { status?: ScheduleStatus; entryId?: string; cursor?: string; limit?: number };\n\nexport type CreateScheduleInput = {\n modelKey: string;\n entryId: string;\n /** Omit for non-localized models (and for the default locale). */\n locale?: string;\n action: PublicationAction;\n runAt: string;\n};\n\n// Webhooks -----------------------------------------------------------------------------------------\n\nexport type WebhookEventType = { type: string; group: string };\n\nexport type WebhookDeliveryStatus = 'pending' | 'retrying' | 'succeeded' | 'dead';\n\nexport type Webhook = {\n id: string;\n name: string;\n url: string;\n /** Event types or `group.*` patterns. */\n events: string[];\n enabled: boolean;\n allowPrivateNetwork: boolean;\n maxAttempts: number;\n /** The site whose events it receives; null for a network-wide webhook (every site's events). */\n site: SiteRef | null;\n lastDelivery: { status: WebhookDeliveryStatus; at: string } | null;\n createdBy: string | null;\n createdAt: string;\n updatedAt: string;\n version: number;\n /** The stored signing secret cannot be decrypted (SESSION_SECRET changed): rotate it to repair the webhook. */\n secretsUnreadable: boolean;\n};\n\nexport type CreateWebhookInput = {\n name: string;\n url: string;\n events: string[];\n enabled?: boolean;\n allowPrivateNetwork?: boolean;\n maxAttempts?: number;\n /** A network-wide webhook (every site's events); otherwise it belongs to the request's site. */\n network?: boolean;\n};\n\n/** A webhook's site is fixed once created. */\nexport type UpdateWebhookInput = Partial<Omit<CreateWebhookInput, 'network'>> & { expectedVersion: number };\n\n/** The JSON body every webhook delivery sends (signed; verify it with `verifyWebhookSignature`). */\nexport type WebhookEventBody = {\n id: string;\n type: string;\n createdAt: string;\n /** The site the event is about; null for events about no site (network-wide). */\n site: SiteRef | null;\n data: unknown;\n};\n\n/** `secret` is shown once: on creation and after rotation. */\nexport type WebhookWithSecret = { webhook: Webhook; secret: string };\n\nexport type WebhookAttempt = {\n attempt: number;\n at: string;\n durationMs: number;\n request: { method: string; url: string; headers: Record<string, string> };\n /** Null when no response arrived (refused, timeout, blocked by the network policy). */\n response: { status: number; headers: Record<string, string>; body: string; truncated: boolean } | null;\n error: string | null;\n};\n\nexport type WebhookDelivery = {\n id: string;\n webhookId: string;\n eventId: string | null;\n eventType: string;\n isTest: boolean;\n status: WebhookDeliveryStatus;\n attempts: number;\n lastResponseStatus: number | null;\n lastError: string | null;\n payload: unknown;\n attemptLog: WebhookAttempt[];\n createdAt: string;\n updatedAt: string;\n deliveredAt: string | null;\n};\n\n// Deployments --------------------------------------------------------------------------------------\n\nexport const DEPLOYMENT_PROVIDERS = [\n 'generic_webhook',\n 'cloudflare_pages',\n 'vercel',\n 'netlify',\n 'github',\n] as const;\nexport type DeploymentProvider = (typeof DEPLOYMENT_PROVIDERS)[number];\n\nexport const DEPLOYMENT_TRIGGERS = ['publish', 'change_set', 'schema', 'manual'] as const;\nexport type DeploymentTriggerPolicy = (typeof DEPLOYMENT_TRIGGERS)[number];\n\nexport const DEPLOYMENT_RUN_STATUSES = [\n 'queued',\n 'triggered',\n 'building',\n 'deployed',\n 'failed',\n 'unknown',\n] as const;\nexport type DeploymentRunStatus = (typeof DEPLOYMENT_RUN_STATUSES)[number];\n\nexport type DeploymentRunTrigger = 'publish' | 'change_set' | 'schema' | 'manual' | 'retry';\n\n/**\n * Provider settings (not secret). Generic: `{ url }`. Cloudflare Pages: `{ accountId, projectName }`.\n * GitHub: `{ owner, repo, branch, mode: 'commit' | 'pull_request', directory }`.\n */\nexport type DeploymentSettings = Record<string, string>;\n\n/**\n * Secret names per provider. Generic: `signingSecret` (generated when omitted). Cloudflare Pages:\n * `deployHookUrl`, `apiToken`. GitHub: `token`. Values are write-only. A value of `${ENV:VAR_NAME}`\n * makes the server read the secret from that environment variable instead of storing it.\n */\nexport type DeploymentSecretsInput = Record<string, string>;\n\n/** Which secrets are set; values never leave the server. `envVar`: read from this environment variable. */\nexport type DeploymentSecretState = Record<string, { set: boolean; envVar: string | null }>;\n\nexport type DeploymentTimelineEvent = {\n status: DeploymentRunStatus;\n at: string;\n source: 'shapio' | 'callback' | 'provider';\n message: string | null;\n};\n\nexport type DeploymentRun = {\n id: string;\n connectionId: string;\n connectionName: string;\n provider: DeploymentProvider;\n status: DeploymentRunStatus;\n trigger: DeploymentRunTrigger;\n /** Publication sequence the run was triggered at (`?snapshot=` on delivery). */\n snapshot: number | null;\n schemaVersion: number | null;\n retryOf: string | null;\n providerRef: string | null;\n logUrl: string | null;\n siteUrl: string | null;\n error: string | null;\n /** False for providers that cannot report completion without callbacks (shown as \"completion unknown\"). */\n completionReported: boolean;\n timeline: DeploymentTimelineEvent[];\n triggeredAt: string | null;\n finishedAt: string | null;\n createdAt: string;\n updatedAt: string;\n};\n\nexport type DeploymentConnection = {\n id: string;\n name: string;\n provider: DeploymentProvider;\n settings: DeploymentSettings;\n secrets: DeploymentSecretState;\n previewUrlTemplate: string | null;\n /** Preview tokens issued for this connection show exactly what this delivery role reads. */\n deliveryRoleId: string | null;\n triggerPolicy: DeploymentTriggerPolicy[];\n debounceSeconds: number;\n allowPrivateNetwork: boolean;\n enabled: boolean;\n /** Where the site posts signed build callbacks (generic webhook connections). */\n callbackUrl: string;\n latestRun: DeploymentRun | null;\n /** The newest deployed run by snapshot: what the site is serving, as far as Shapio knows. */\n currentRun: DeploymentRun | null;\n createdBy: string | null;\n createdAt: string;\n updatedAt: string;\n version: number;\n /**\n * The stored secrets cannot be decrypted (the server's SESSION_SECRET changed): every literal secret reads\n * as not set until it is entered again; secrets read from the environment are unaffected.\n */\n secretsUnreadable: boolean;\n};\n\nexport type CreateDeploymentConnectionInput = {\n name: string;\n provider: DeploymentProvider;\n settings: DeploymentSettings;\n secrets: DeploymentSecretsInput;\n previewUrlTemplate?: string | null;\n triggerPolicy: DeploymentTriggerPolicy[];\n debounceSeconds?: number;\n allowPrivateNetwork?: boolean;\n enabled?: boolean;\n deliveryRoleId?: string | null;\n};\n\nexport type UpdateDeploymentConnectionInput = Partial<Omit<CreateDeploymentConnectionInput, 'provider'>> & {\n expectedVersion: number;\n};\n\n/** `generatedSecrets` holds secrets Shapio generated (the generic signing secret), shown once. */\nexport type DeploymentConnectionCreated = {\n connection: DeploymentConnection;\n generatedSecrets: Record<string, string>;\n};\n\n/** An update's result: `generatedSecrets` holds a secret Shapio minted to replace an unreadable one, shown once. */\nexport type DeploymentConnectionUpdated = DeploymentConnection & {\n generatedSecrets?: Record<string, string>;\n};\n\nexport type ConnectionTestResult = {\n ok: boolean;\n checks: Array<{ name: string; ok: boolean; message: string }>;\n};\n\nexport type DeploymentRunQuery = { connectionId?: string; cursor?: string; limit?: number };\n\n// Preview ------------------------------------------------------------------------------------------\n\nexport type PreviewToken = {\n id: string;\n tokenPrefix: string;\n modelId: string;\n modelKey: string | null;\n entryId: string | null;\n locale: string | null;\n connectionId: string | null;\n /** Fields follow this delivery role (within the creator's access); null = the public fields. */\n deliveryRoleId: string | null;\n createdBy: string;\n expiresAt: string;\n revokedAt: string | null;\n lastUsedAt: string | null;\n createdAt: string;\n};\n\nexport type CreatePreviewTokenInput = {\n modelKey: string;\n entryId?: string;\n locale?: string;\n /** Default 1 hour, at most 30 days. */\n ttlSeconds?: number;\n connectionId?: string;\n /** Defaults to the connection's delivery role. */\n deliveryRoleId?: string;\n};\n\n/** `token` is shown once. `url` is rendered from the connection's preview URL template (null without one). */\nexport type PreviewTokenCreated = { token: string; previewToken: PreviewToken; url: string | null };\n\nexport type OpenPreviewInput = {\n modelKey: string;\n entryId: string;\n locale?: string;\n /** Defaults to the first enabled connection with a preview URL template. */\n connectionId?: string;\n};\n\n/** What the entry form's Preview button opens. `apiUrl` is the preview read endpoint for this entry. */\nexport type OpenPreviewResult = {\n /** The token's ID (revoke it when the preview closes). */\n id: string;\n url: string | null;\n apiUrl: string;\n token: string;\n expiresAt: string;\n connectionId: string | null;\n};\n\n/** A connection the site's previews open on (names and origins only). */\nexport type PreviewTarget = {\n connectionId: string;\n name: string;\n /** null when the preview URL template's origin depends on a variable. */\n origin: string | null;\n /** Whether the admin can show it in its preview frame. */\n framable: boolean;\n};\n","import { useController, type Control, type FieldPath, type FieldValues } from 'react-hook-form';\nimport { Checkbox } from '@/components/ui/checkbox';\nimport { Field, FieldDescription, FieldLabel, FieldLegend, FieldSet } from '@/components/ui/field';\nimport { FormFieldError } from '../FormFieldError';\nimport { InfoHint } from '../InfoHint';\n\nexport type CheckboxOption = {\n value: string;\n label: string;\n description?: string;\n /** An explanation behind an info icon beside the option's label (DESIGN.md, helper-text rule). */\n hint?: string;\n};\n\ntype FormCheckboxGroupProps<TValues extends FieldValues> = {\n control: Control<TValues>;\n name: FieldPath<TValues>;\n legend: string;\n description?: string;\n options: readonly CheckboxOption[];\n disabled?: boolean;\n};\n\n/** A fieldset of checkboxes bound to a `string[]` form value. */\nexport const FormCheckboxGroup = <TValues extends FieldValues>({\n control,\n name,\n legend,\n description,\n options,\n disabled,\n}: FormCheckboxGroupProps<TValues>) => {\n const { field, fieldState } = useController({ control, name });\n const selected = (field.value as string[] | undefined) ?? [];\n const toggle = (value: string, checked: boolean) =>\n field.onChange(checked ? [...selected, value] : selected.filter((item) => item !== value));\n const errorMessage = fieldState.error?.message;\n return (\n <FieldSet data-invalid={fieldState.invalid || undefined}>\n <FieldLegend variant=\"label\">{legend}</FieldLegend>\n {description ? <FieldDescription>{description}</FieldDescription> : null}\n <div data-slot=\"checkbox-group\" className=\"grid gap-3 sm:grid-cols-2\">\n {options.map((option) => {\n const id = `field-${name}-${option.value}`;\n const hintId = option.hint ? `${id}-hint` : undefined;\n return (\n <Field key={option.value} orientation=\"horizontal\">\n <Checkbox\n id={id}\n checked={selected.includes(option.value)}\n onCheckedChange={(checked) => toggle(option.value, checked === true)}\n onBlur={field.onBlur}\n disabled={disabled}\n aria-describedby={hintId}\n />\n {option.hint ? (\n <span className=\"flex items-center gap-1\">\n <FieldLabel htmlFor={id} className=\"font-normal\">\n {option.label}\n </FieldLabel>\n <InfoHint about={option.label} id={hintId}>\n {option.hint}\n </InfoHint>\n </span>\n ) : (\n <FieldLabel htmlFor={id} className=\"font-normal\">\n {option.label}\n </FieldLabel>\n )}\n </Field>\n );\n })}\n </div>\n <FormFieldError message={errorMessage} />\n </FieldSet>\n );\n};\n"],"mappings":"mSAyCA,IAAaS,EAAsB,CAAC,UAAW,WAAW,EAG7CC,EAAoB,CAAC,YAAa,OAAQ,SAAU,WAAW,EAkH/DC,EAAuB,CAClC,kBACA,mBACA,SACA,UACA,QACF,EAGaC,EAAsB,CAAC,UAAW,aAAc,SAAU,QAAQ,aC/IlEG,GAAkD,CAC7D,UACA,OACA,SACA,cACA,UACA,cACqC,CACrC,GAAM,CAAE,QAAO,cAAeR,EAAc,CAAE,UAAS,MAAK,CAAC,EACvDS,EAAYC,EAAM,OAAkC,CAAC,EACrDC,GAAU,EAAe,IAC7BD,EAAM,SAASE,EAAU,CAAC,GAAGH,EAAUI,CAAK,EAAIJ,EAAS,OAAQ,GAASK,IAASD,CAAK,CAAC,EACrFE,EAAeC,EAAW,OAAO,QACvC,OACE,EAAAV,EAAA,KAAA,CAACV,EAAD,CAAU,eAAcoB,EAAW,SAAW,IAAA,GAA9C,SAAA,EACE,EAAAV,EAAA,IAAA,CAACW,EAAD,CAAa,QAAQ,QAAS,SAAAC,CAAoB,CAAA,EACjDC,GAAc,EAAAb,EAAA,IAAA,CAACR,EAAD,CAAA,SAAmBqB,CAA8B,CAAA,EAAI,MACpE,EAAAb,EAAA,IAAA,CAAC,MAAD,CAAK,YAAU,iBAAiB,UAAU,4BACvC,SAAAc,EAAQ,IAAK,GAAW,CACvB,IAAMC,EAAK,SAASC,EAAK,GAAGC,EAAO,QAC7BC,EAASD,EAAO,KAAO,GAAGF,EAAG,OAAS,IAAA,GAC5C,OACE,EAAAf,EAAA,KAAA,CAACP,EAAD,CAA0B,YAAY,aAAtC,SAAA,EACE,EAAAO,EAAA,IAAA,CAACX,EAAD,CACM,KACJ,QAASc,EAAS,SAASc,EAAO,KAAK,EACvC,gBAAkB,GAAYZ,EAAOY,EAAO,MAAOX,IAAY,EAAI,EACnE,OAAQF,EAAM,OACJ,WACV,mBAAkBc,CACnB,CAAA,EACAD,EAAO,MACN,EAAAjB,EAAA,KAAA,CAAC,OAAD,CAAM,UAAU,0BAAhB,SAAA,EACE,EAAAA,EAAA,IAAA,CAACT,EAAD,CAAY,QAASwB,EAAI,UAAU,cAChC,SAAAE,EAAO,KACE,CAAA,GACZ,EAAAjB,EAAA,IAAA,CAACZ,EAAD,CAAU,MAAO6B,EAAO,MAAO,GAAIC,EAChC,SAAAD,EAAO,IACA,CAAA,CACN,CAEN,CAAA,GAAA,EAAAjB,EAAA,IAAA,CAACT,EAAD,CAAY,QAASwB,EAAI,UAAU,cAChC,SAAAE,EAAO,KACE,CAAA,CAET,CAvBK,EAAAA,EAAO,KAuBZ,CAEX,CAAC,CACE,CAAA,GACL,EAAAjB,EAAA,IAAA,CAACL,EAAD,CAAgB,QAASc,CAAe,CAAA,CAChC,GAEd"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{i as e}from"./rolldown-runtime-Dd_uD5pT.js";import{t}from"./jsx-runtime-DREnUpxT.js";import{c as n,n as r,o as i,r as a,s as o,t as s}from"./field-
|
|
2
|
-
//# sourceMappingURL=FormRadioGroup-
|
|
1
|
+
import{i as e}from"./rolldown-runtime-Dd_uD5pT.js";import{t}from"./jsx-runtime-DREnUpxT.js";import{c as n,n as r,o as i,r as a,s as o,t as s}from"./field-COOzRptX.js";import{n as c,t as l}from"./radio-group-4ok5evXq.js";import{c as u,r as d}from"./zod-Cry7YvLY.js";var f=e(t(),1),p=({control:e,name:t,legend:p,options:m,disabled:h})=>{let{field:g,fieldState:_}=u({control:e,name:t}),v=`field-${t}-legend`,y=`field-${t}-error`,b=_.error?.message;return(0,f.jsxs)(n,{"data-invalid":_.invalid||void 0,children:[(0,f.jsx)(o,{id:v,variant:`label`,children:p}),(0,f.jsx)(l,{"aria-labelledby":v,"aria-describedby":b?y:void 0,"aria-invalid":_.invalid||void 0,value:g.value??``,onValueChange:g.onChange,onBlur:g.onBlur,disabled:h,children:m.map(e=>{let n=`field-${t}-${e.value}`,o=e.description?`${n}-description`:void 0;return(0,f.jsxs)(s,{orientation:`horizontal`,children:[(0,f.jsx)(c,{id:n,value:e.value,"aria-describedby":o}),(0,f.jsxs)(r,{children:[(0,f.jsx)(i,{htmlFor:n,className:`font-normal`,children:e.label}),e.description?(0,f.jsx)(a,{id:o,children:e.description}):null]})]},e.value)})}),(0,f.jsx)(d,{id:y,message:b})]})};export{p as t};
|
|
2
|
+
//# sourceMappingURL=FormRadioGroup-Cfx5pvzU.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FormRadioGroup-
|
|
1
|
+
{"version":3,"file":"FormRadioGroup-Cfx5pvzU.js","names":["__toESM","FieldSet","FieldContent","FieldLabel","FieldDescription","FieldLegend","Field","RadioGroupItem","RadioGroup","useController","FormFieldError","import_jsx_runtime","require_jsx_runtime","FormRadioGroup","legendId","name","errorId","errorMessage","fieldState","legend","field","options","id","option","descriptionId"],"sources":["../../src/components/FormRadioGroup/index.tsx"],"sourcesContent":["import { useController, type Control, type FieldPath, type FieldValues } from 'react-hook-form';\nimport {\n Field,\n FieldContent,\n FieldDescription,\n FieldLabel,\n FieldLegend,\n FieldSet,\n} from '@/components/ui/field';\nimport { RadioGroup, RadioGroupItem } from '@/components/ui/radio-group';\nimport { FormFieldError } from '../FormFieldError';\n\nexport type RadioOption = { value: string; label: string; description?: string };\n\ntype FormRadioGroupProps<TValues extends FieldValues> = {\n control: Control<TValues>;\n name: FieldPath<TValues>;\n legend: string;\n options: readonly RadioOption[];\n disabled?: boolean;\n};\n\n/**\n * A fieldset of radio buttons bound to a `string` form value: exactly one choice. Arrow keys move between\n * options and Tab enters at the checked one; each option's description is linked to its radio.\n */\nexport const FormRadioGroup = <TValues extends FieldValues>({\n control,\n name,\n legend,\n options,\n disabled,\n}: FormRadioGroupProps<TValues>) => {\n const { field, fieldState } = useController({ control, name });\n const legendId = `field-${name}-legend`;\n const errorId = `field-${name}-error`;\n const errorMessage = fieldState.error?.message;\n return (\n <FieldSet data-invalid={fieldState.invalid || undefined}>\n <FieldLegend id={legendId} variant=\"label\">\n {legend}\n </FieldLegend>\n <RadioGroup\n aria-labelledby={legendId}\n aria-describedby={errorMessage ? errorId : undefined}\n aria-invalid={fieldState.invalid || undefined}\n value={field.value ?? ''}\n onValueChange={field.onChange}\n onBlur={field.onBlur}\n disabled={disabled}\n >\n {options.map((option) => {\n const id = `field-${name}-${option.value}`;\n const descriptionId = option.description ? `${id}-description` : undefined;\n return (\n <Field key={option.value} orientation=\"horizontal\">\n <RadioGroupItem id={id} value={option.value} aria-describedby={descriptionId} />\n <FieldContent>\n <FieldLabel htmlFor={id} className=\"font-normal\">\n {option.label}\n </FieldLabel>\n {option.description ? (\n <FieldDescription id={descriptionId}>{option.description}</FieldDescription>\n ) : null}\n </FieldContent>\n </Field>\n );\n })}\n </RadioGroup>\n <FormFieldError id={errorId} message={errorMessage} />\n </FieldSet>\n );\n};\n"],"mappings":"wRA0Baa,GAA+C,CAC1D,UACA,OACA,SACA,UACA,cACkC,CAClC,GAAM,CAAE,QAAO,cAAeJ,EAAc,CAAE,UAAS,MAAK,CAAC,EACvDK,EAAW,SAASC,EAAK,SACzBC,EAAU,SAASD,EAAK,QACxBE,EAAeC,EAAW,OAAO,QACvC,OACE,EAAAP,EAAA,KAAA,CAACV,EAAD,CAAU,eAAciB,EAAW,SAAW,IAAA,GAA9C,SAAA,EACE,EAAAP,EAAA,IAAA,CAACN,EAAD,CAAa,GAAIS,EAAU,QAAQ,QAChC,SAAAK,CACU,CAAA,GACb,EAAAR,EAAA,IAAA,CAACH,EAAD,CACE,kBAAiBM,EACjB,mBAAkBG,EAAeD,EAAU,IAAA,GAC3C,eAAcE,EAAW,SAAW,IAAA,GACpC,MAAOE,EAAM,OAAS,GACtB,cAAeA,EAAM,SACrB,OAAQA,EAAM,OACJ,WAET,SAAAC,EAAQ,IAAK,GAAW,CACvB,IAAMC,EAAK,SAASP,EAAK,GAAGQ,EAAO,QAC7BC,EAAgBD,EAAO,YAAc,GAAGD,EAAG,cAAgB,IAAA,GACjE,OACE,EAAAX,EAAA,KAAA,CAACL,EAAD,CAA0B,YAAY,aAAtC,SAAA,EACE,EAAAK,EAAA,IAAA,CAACJ,EAAD,CAAoB,KAAI,MAAOgB,EAAO,MAAO,mBAAkBC,CAAgB,CAAA,GAC/E,EAAAb,EAAA,KAAA,CAACT,EAAD,CAAA,SAAA,EACE,EAAAS,EAAA,IAAA,CAACR,EAAD,CAAY,QAASmB,EAAI,UAAU,cAChC,SAAAC,EAAO,KACE,CAAA,EACXA,EAAO,aACN,EAAAZ,EAAA,IAAA,CAACP,EAAD,CAAkB,GAAIoB,EAAgB,SAAAD,EAAO,WAA8B,CAAA,EACzE,IACQ,CAAA,CAAA,CACT,CAVK,EAAAA,EAAO,KAUZ,CAEX,CAAC,CACS,CAAA,GACZ,EAAAZ,EAAA,IAAA,CAACD,EAAD,CAAgB,GAAIM,EAAS,QAASC,CAAe,CAAA,CAC7C,GAEd"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{i as e}from"./rolldown-runtime-Dd_uD5pT.js";import{t}from"./jsx-runtime-DREnUpxT.js";import{_ as n,c as r,d as i,f as a,m as o,p as s,u as c}from"./badge-
|
|
2
|
-
//# sourceMappingURL=FormSelectField-
|
|
1
|
+
import{i as e}from"./rolldown-runtime-Dd_uD5pT.js";import{t}from"./jsx-runtime-DREnUpxT.js";import{_ as n,c as r,d as i,f as a,m as o,p as s,u as c}from"./badge-CqKF1pwz.js";import{n as l}from"./createLucideIcon-CLmh7Go-.js";import{i as u}from"./skeleton-B5MP72Kw.js";import{a as d,i as f,n as p,r as m,t as h}from"./select-C0USI-Ox.js";import{a as g,r as _,t as v}from"./field-COOzRptX.js";import{t as y}from"./cn-DVhJ55Mo.js";import{c as b,r as x}from"./zod-Cry7YvLY.js";import{n as S}from"./settle-CFU6YpQ0.js";import{t as C}from"./HintedLabel-DzHnEdIK.js";import{t as w}from"./useDiscardGuard-BskWSlbT.js";var T=e(t(),1),E=({open:e,onOpenChange:t,title:d,description:f,dirty:p,pending:m,submitLabel:h,pendingLabel:_,onSubmit:v,size:b,bodyClassName:x,onCloseAutoFocus:S,children:C})=>{let{t:E}=l(),{requestOpenChange:D,discardPrompt:O}=w({dirty:p,pending:m,onOpenChange:t});return(0,T.jsxs)(T.Fragment,{children:[(0,T.jsx)(r,{open:e,onOpenChange:D,children:(0,T.jsxs)(c,{size:b,...f?{}:{"aria-describedby":void 0},...S?{onCloseAutoFocus:S}:{},children:[(0,T.jsxs)(s,{className:`pr-14`,children:[(0,T.jsx)(o,{children:d}),f?(0,T.jsx)(i,{children:f}):null]}),(0,T.jsxs)(`form`,{noValidate:!0,onSubmit:v,className:`flex min-h-0 flex-1 flex-col`,children:[(0,T.jsx)(g,{className:y(`relative min-h-0 flex-1 gap-5 overflow-y-auto px-6 pt-1 pb-6`,x),children:C}),(0,T.jsxs)(a,{children:[(0,T.jsx)(u,{type:`button`,variant:`outline`,onClick:()=>D(!1),children:E(`common.cancel`)}),(0,T.jsx)(n,{pending:m,pendingLabel:_,children:h})]})]})]})}),O]})},D=({control:e,name:t,label:n,hint:r,description:i,placeholder:a,options:o,disabled:s})=>{let{field:{ref:c,onBlur:l,onChange:u,value:g,name:y},fieldState:w}=b({control:e,name:t}),E=`field-${t}`,D=w.error?.message,O=r?`${E}-hint`:void 0;return(0,T.jsxs)(v,{"data-invalid":w.invalid||void 0,children:[(0,T.jsx)(C,{htmlFor:E,label:n,hint:r,hintId:O}),(0,T.jsxs)(h,{name:y,value:typeof g==`string`?g:``,onValueChange:u,disabled:s,children:[(0,T.jsx)(f,{id:E,ref:c,onBlur:l,"aria-invalid":w.invalid||void 0,"aria-describedby":S(O,i&&`${E}-description`,D&&`${E}-error`),className:`w-full`,children:(0,T.jsx)(d,{placeholder:a})}),(0,T.jsx)(p,{children:o.map(e=>(0,T.jsx)(m,{value:e.value,children:e.label},e.value))})]}),i?(0,T.jsx)(_,{id:`${E}-description`,children:i}):null,(0,T.jsx)(x,{id:`${E}-error`,message:D})]})};export{E as n,D as t};
|
|
2
|
+
//# sourceMappingURL=FormSelectField-BzE9Lq9i.js.map
|
package/dist/admin/assets/{FormSelectField-Br8bkwRF.js.map → FormSelectField-BzE9Lq9i.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FormSelectField-
|
|
1
|
+
{"version":3,"file":"FormSelectField-BzE9Lq9i.js","names":["_Fragment","__toESM","SubmitButton","Sheet","SheetDescription","SheetFooter","SheetTitle","SheetHeader","SheetContent","useTranslation","Button","SelectValue","SelectTrigger","SelectContent","SelectItem","Select","FieldGroup","FieldDescription","Field","cn","useController","FormFieldError","describedBy","HintedLabel","useDiscardGuard","import_jsx_runtime","require_jsx_runtime","FormSheet","requestOpenChange","description","onCloseAutoFocus","title","bodyClassName","t","submitLabel","discardPrompt","FormSelectField","fieldName","id","name","errorMessage","fieldState","hintId","hint","value","onChange","options","option"],"sources":["../../src/components/FormSheet/index.tsx","../../src/components/FormSelectField/index.tsx"],"sourcesContent":["import type { FormEventHandler, ReactNode } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Button } from '@/components/ui/button';\nimport { FieldGroup } from '@/components/ui/field';\nimport {\n Sheet,\n SheetContent,\n SheetDescription,\n SheetFooter,\n SheetHeader,\n SheetTitle,\n} from '@/components/ui/sheet';\nimport { cn } from '@/helpers/cn';\nimport { useDiscardGuard } from '@/hooks/useDiscardGuard';\nimport { SubmitButton } from '../SubmitButton';\n\ntype FormSheetProps = {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n title: string;\n description?: string;\n /** Unsaved edits: closing asks before discarding them. */\n dirty: boolean;\n pending: boolean;\n submitLabel: string;\n pendingLabel: string;\n onSubmit: FormEventHandler<HTMLFormElement>;\n /** sm 400px (default), md 560px, lg 720px from the sm breakpoint; full width on phones. */\n size?: 'sm' | 'md' | 'lg';\n /** Layout overrides for the scrolling body (e.g. a split layout whose panes scroll on their own). */\n bodyClassName?: string;\n /**\n * Runs as the sheet finishes closing, before focus returns to the opener. Call `event.preventDefault()` to\n * keep focus where it is (e.g. on a `SecretReveal` that took it).\n */\n onCloseAutoFocus?: (event: Event) => void;\n children: ReactNode;\n};\n\n/**\n * A form in a right-hand sheet: create or edit a record while the list stays in view. Labelled,\n * keyboard-closable and protected against losing unsaved edits; the header and the footer (Cancel, then the\n * primary action) stay put while a long body scrolls.\n */\nexport const FormSheet = ({\n open,\n onOpenChange,\n title,\n description,\n dirty,\n pending,\n submitLabel,\n pendingLabel,\n onSubmit,\n size,\n bodyClassName,\n onCloseAutoFocus,\n children,\n}: FormSheetProps) => {\n const { t } = useTranslation();\n const { requestOpenChange, discardPrompt } = useDiscardGuard({ dirty, pending, onOpenChange });\n return (\n <>\n <Sheet open={open} onOpenChange={requestOpenChange}>\n <SheetContent\n size={size}\n {...(description ? {} : { 'aria-describedby': undefined })}\n {...(onCloseAutoFocus ? { onCloseAutoFocus } : {})}\n >\n <SheetHeader className=\"pr-14\">\n <SheetTitle>{title}</SheetTitle>\n {description ? <SheetDescription>{description}</SheetDescription> : null}\n </SheetHeader>\n <form noValidate onSubmit={onSubmit} className=\"flex min-h-0 flex-1 flex-col\">\n {/* The scrolling body is the field group itself, so `bodyClassName` lays out the fields. */}\n <FieldGroup\n className={cn('relative min-h-0 flex-1 gap-5 overflow-y-auto px-6 pt-1 pb-6', bodyClassName)}\n >\n {children}\n </FieldGroup>\n <SheetFooter>\n <Button type=\"button\" variant=\"outline\" onClick={() => requestOpenChange(false)}>\n {t('common.cancel')}\n </Button>\n <SubmitButton pending={pending} pendingLabel={pendingLabel}>\n {submitLabel}\n </SubmitButton>\n </SheetFooter>\n </form>\n </SheetContent>\n </Sheet>\n {discardPrompt}\n </>\n );\n};\n","import { useController, type Control, type FieldPath, type FieldValues } from 'react-hook-form';\nimport { Field, FieldDescription } from '@/components/ui/field';\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select';\nimport { describedBy } from '@/helpers/describedBy';\nimport { FormFieldError } from '../FormFieldError';\nimport { HintedLabel } from '../HintedLabel';\n\nexport type SelectOption = { value: string; label: string };\n\ntype FormSelectFieldProps<TValues extends FieldValues> = {\n control: Control<TValues>;\n name: FieldPath<TValues>;\n label: string;\n /** Explanation behind an info icon next to the label (DESIGN.md, helper-text rule). */\n hint?: string;\n description?: string;\n placeholder?: string;\n options: readonly SelectOption[];\n disabled?: boolean;\n};\n\nexport const FormSelectField = <TValues extends FieldValues>({\n control,\n name,\n label,\n hint,\n description,\n placeholder,\n options,\n disabled,\n}: FormSelectFieldProps<TValues>) => {\n const {\n field: { ref, onBlur, onChange, value, name: fieldName },\n fieldState,\n } = useController({ control, name });\n const id = `field-${name}`;\n const errorMessage = fieldState.error?.message;\n const hintId = hint ? `${id}-hint` : undefined;\n return (\n <Field data-invalid={fieldState.invalid || undefined}>\n <HintedLabel htmlFor={id} label={label} hint={hint} hintId={hintId} />\n <Select\n name={fieldName}\n value={typeof value === 'string' ? value : ''}\n onValueChange={onChange}\n disabled={disabled}\n >\n <SelectTrigger\n id={id}\n ref={ref}\n onBlur={onBlur}\n aria-invalid={fieldState.invalid || undefined}\n aria-describedby={describedBy(\n hintId,\n description && `${id}-description`,\n errorMessage && `${id}-error`,\n )}\n className=\"w-full\"\n >\n <SelectValue placeholder={placeholder} />\n </SelectTrigger>\n <SelectContent>\n {options.map((option) => (\n <SelectItem key={option.value} value={option.value}>\n {option.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n {description ? <FieldDescription id={`${id}-description`}>{description}</FieldDescription> : null}\n <FormFieldError id={`${id}-error`} message={errorMessage} />\n </Field>\n );\n};\n"],"mappings":"inBA4Ca2B,GAAa,CACxB,OACA,eACA,QACA,cACA,QACA,UACA,cACA,eACA,WACA,OACA,gBACA,mBACA,cACoB,CACpB,GAAM,CAAE,KAAMlB,EAAe,EACvB,CAAE,oBAAmB,iBAAkBe,EAAgB,CAAE,QAAO,UAAS,cAAa,CAAC,EAC7F,OACE,EAAAC,EAAA,KAAA,CAAAzB,EAAAA,SAAA,CAAA,SAAA,EACE,EAAAyB,EAAA,IAAA,CAACtB,EAAD,CAAa,OAAM,aAAcyB,EAC/B,UAAA,EAAAH,EAAA,KAAA,CAACjB,EAAD,CACQ,OACN,GAAKqB,EAAc,CAAC,EAAI,CAAE,mBAAoB,IAAA,EAAU,EACxD,GAAKC,EAAmB,CAAE,kBAAiB,EAAI,CAAC,EAHlD,SAAA,EAKE,EAAAL,EAAA,KAAA,CAAClB,EAAD,CAAa,UAAU,QAAvB,SAAA,EACE,EAAAkB,EAAA,IAAA,CAACnB,EAAD,CAAA,SAAayB,CAAkB,CAAA,EAC9BF,GAAc,EAAAJ,EAAA,IAAA,CAACrB,EAAD,CAAA,SAAmByB,CAA8B,CAAA,EAAI,IACzD,CACb,CAAA,GAAA,EAAAJ,EAAA,KAAA,CAAC,OAAD,CAAM,WAAA,GAAqB,WAAU,UAAU,+BAA/C,SAAA,EAEE,EAAAA,EAAA,IAAA,CAACT,EAAD,CACE,UAAWG,EAAG,+DAAgEa,CAAa,EAE1F,UACS,CAAA,GACZ,EAAAP,EAAA,KAAA,CAACpB,EAAD,CAAA,SAAA,EACE,EAAAoB,EAAA,IAAA,CAACf,EAAD,CAAQ,KAAK,SAAS,QAAQ,UAAU,YAAekB,EAAkB,EAAK,EAC3E,SAAAK,EAAE,eAAe,CACZ,CAAA,GACR,EAAAR,EAAA,IAAA,CAACvB,EAAD,CAAuB,UAAuB,eAC3C,SAAAgC,CACW,CAAA,CACH,CAAA,CAAA,CACT,CACM,CAAA,CAAA,GACT,CAAA,EACNC,CACD,CAAA,CAAA,CAEN,ECzEaC,GAAgD,CAC3D,UACA,OACA,QACA,OACA,cACA,cACA,UACA,cACmC,CACnC,GAAM,CACJ,MAAO,CAAE,MAAK,SAAQ,WAAU,QAAO,KAAMC,GAC7C,cACEjB,EAAc,CAAE,UAAS,MAAK,CAAC,EAC7BkB,EAAK,SAASC,IACdC,EAAeC,EAAW,OAAO,QACjCC,EAASC,EAAO,GAAGL,EAAG,OAAS,IAAA,GACrC,OACE,EAAAb,EAAA,KAAA,CAACP,EAAD,CAAO,eAAcuB,EAAW,SAAW,IAAA,GAA3C,SAAA,EACE,EAAAhB,EAAA,IAAA,CAACF,EAAD,CAAa,QAASe,EAAW,QAAa,OAAc,QAAS,CAAA,GACrE,EAAAb,EAAA,KAAA,CAACV,EAAD,CACE,KAAMsB,EACN,MAAO,OAAOO,GAAU,SAAWA,EAAQ,GAC3C,cAAeC,EACL,WAJZ,SAAA,EAME,EAAApB,EAAA,IAAA,CAACb,EAAD,CACM,KACC,MACG,SACR,eAAc6B,EAAW,SAAW,IAAA,GACpC,mBAAkBnB,EAChBoB,EACAb,GAAe,GAAGS,EAAG,cACrBE,GAAgB,GAAGF,EAAG,OACxB,EACA,UAAU,SAEV,UAAA,EAAAb,EAAA,IAAA,CAACd,EAAD,CAA0B,aAAc,CAAA,CAC3B,CAAA,GACf,EAAAc,EAAA,IAAA,CAACZ,EAAD,CAAA,SACGiC,EAAQ,IAAK,IACZ,EAAArB,EAAA,IAAA,CAACX,EAAD,CAA+B,MAAOiC,EAAO,MAC1C,SAAAA,EAAO,KACE,EAFKA,EAAO,KAEZ,CACb,CACY,CAAA,CACT,IACPlB,GAAc,EAAAJ,EAAA,IAAA,CAACR,EAAD,CAAkB,GAAI,GAAGqB,EAAG,cAAgB,SAAAT,CAA8B,CAAA,EAAI,MAC7F,EAAAJ,EAAA,IAAA,CAACJ,EAAD,CAAgB,GAAI,GAAGiB,EAAG,QAAS,QAASE,CAAe,CAAA,CACtD,GAEX"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{i as e}from"./rolldown-runtime-Dd_uD5pT.js";import{t}from"./jsx-runtime-DREnUpxT.js";import{o as n}from"./skeleton-
|
|
2
|
-
//# sourceMappingURL=FormSwitchField-
|
|
1
|
+
import{i as e}from"./rolldown-runtime-Dd_uD5pT.js";import{t}from"./jsx-runtime-DREnUpxT.js";import{o as n}from"./skeleton-B5MP72Kw.js";import{n as r,r as i,t as a}from"./field-COOzRptX.js";import{t as o}from"./switch-Dp6WYNam.js";import{c as s,r as c}from"./zod-Cry7YvLY.js";import{n as l}from"./settle-CFU6YpQ0.js";import{t as u}from"./HintedLabel-DzHnEdIK.js";var d=e(t(),1),f=n(``,{variants:{variant:{plain:``,bordered:`gap-4 rounded-lg border bg-card p-4`}},defaultVariants:{variant:`plain`}}),p=({control:e,name:t,label:n,hint:p,description:m,disabled:h,variant:g})=>{let{field:{ref:_,onBlur:v,onChange:y,value:b,name:x},fieldState:S}=s({control:e,name:t}),C=`field-${t}`,w=p?`${C}-hint`:void 0,T=m?`${C}-description`:void 0;return(0,d.jsxs)(a,{orientation:`horizontal`,className:f({variant:g}),"data-invalid":S.invalid||void 0,children:[(0,d.jsxs)(r,{children:[(0,d.jsx)(u,{htmlFor:C,label:n,hint:p,hintId:w}),m?(0,d.jsx)(i,{id:T,children:m}):null,(0,d.jsx)(c,{id:`${C}-error`,message:S.error?.message})]}),(0,d.jsx)(o,{id:C,ref:_,name:x,checked:b===!0,onCheckedChange:y,onBlur:v,disabled:h,"aria-describedby":l(w,T)})]})};export{p as t};
|
|
2
|
+
//# sourceMappingURL=FormSwitchField-BLOh7qei.js.map
|
package/dist/admin/assets/{FormSwitchField-d8G-YCSX.js.map → FormSwitchField-BLOh7qei.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FormSwitchField-
|
|
1
|
+
{"version":3,"file":"FormSwitchField-BLOh7qei.js","names":["__toESM","cva","FieldContent","FieldDescription","Field","Switch","useController","FormFieldError","describedBy","HintedLabel","import_jsx_runtime","require_jsx_runtime","switchFieldVariants","FormSwitchField","fieldName","id","name","hintId","hint","descriptionId","description","fieldState","value","onChange"],"sources":["../../src/components/FormSwitchField/index.tsx"],"sourcesContent":["import { cva } from 'class-variance-authority';\nimport { useController, type Control, type FieldPath, type FieldValues } from 'react-hook-form';\nimport { Field, FieldContent, FieldDescription } from '@/components/ui/field';\nimport { Switch } from '@/components/ui/switch';\nimport { describedBy } from '@/helpers/describedBy';\nimport { FormFieldError } from '../FormFieldError';\nimport { HintedLabel } from '../HintedLabel';\n\nconst switchFieldVariants = cva('', {\n variants: {\n variant: {\n plain: '',\n /** A bordered row: label and hint on the left, the switch on the right. */\n bordered: 'gap-4 rounded-lg border bg-card p-4',\n },\n },\n defaultVariants: { variant: 'plain' },\n});\n\ntype FormSwitchFieldProps<TValues extends FieldValues> = {\n control: Control<TValues>;\n name: FieldPath<TValues>;\n label: string;\n /** Explanation behind an info icon next to the label (DESIGN.md, helper-text rule). */\n hint?: string;\n description?: string;\n disabled?: boolean;\n variant?: 'plain' | 'bordered';\n};\n\n/** An on/off setting bound to a boolean form value, with its label and hint beside the switch. */\nexport const FormSwitchField = <TValues extends FieldValues>({\n control,\n name,\n label,\n hint,\n description,\n disabled,\n variant,\n}: FormSwitchFieldProps<TValues>) => {\n const {\n field: { ref, onBlur, onChange, value, name: fieldName },\n fieldState,\n } = useController({ control, name });\n const id = `field-${name}`;\n const hintId = hint ? `${id}-hint` : undefined;\n const descriptionId = description ? `${id}-description` : undefined;\n return (\n <Field\n orientation=\"horizontal\"\n className={switchFieldVariants({ variant })}\n data-invalid={fieldState.invalid || undefined}\n >\n <FieldContent>\n <HintedLabel htmlFor={id} label={label} hint={hint} hintId={hintId} />\n {description ? <FieldDescription id={descriptionId}>{description}</FieldDescription> : null}\n <FormFieldError id={`${id}-error`} message={fieldState.error?.message} />\n </FieldContent>\n <Switch\n id={id}\n ref={ref}\n name={fieldName}\n checked={value === true}\n onCheckedChange={onChange}\n onBlur={onBlur}\n disabled={disabled}\n aria-describedby={describedBy(hintId, descriptionId)}\n />\n </Field>\n );\n};\n"],"mappings":"yXAQMY,EAAsBX,EAAI,GAAI,CAClC,SAAU,CACR,QAAS,CACP,MAAO,GAEP,SAAU,qCACZ,CACF,EACA,gBAAiB,CAAE,QAAS,OAAQ,CACtC,CAAC,EAcYY,GAAgD,CAC3D,UACA,OACA,QACA,OACA,cACA,WACA,aACmC,CACnC,GAAM,CACJ,MAAO,CAAE,MAAK,SAAQ,WAAU,QAAO,KAAMC,GAC7C,cACER,EAAc,CAAE,UAAS,MAAK,CAAC,EAC7BS,EAAK,SAASC,IACdC,EAASC,EAAO,GAAGH,EAAG,OAAS,IAAA,GAC/BI,EAAgBC,EAAc,GAAGL,EAAG,cAAgB,IAAA,GAC1D,OACE,EAAAL,EAAA,KAAA,CAACN,EAAD,CACE,YAAY,aACZ,UAAWQ,EAAoB,CAAE,SAAQ,CAAC,EAC1C,eAAcS,EAAW,SAAW,IAAA,GAHtC,SAAA,EAKE,EAAAX,EAAA,KAAA,CAACR,EAAD,CAAA,SAAA,EACE,EAAAQ,EAAA,IAAA,CAACD,EAAD,CAAa,QAASM,EAAW,QAAa,OAAc,QAAS,CAAA,EACpEK,GAAc,EAAAV,EAAA,IAAA,CAACP,EAAD,CAAkB,GAAIgB,EAAgB,SAAAC,CAA8B,CAAA,EAAI,MACvF,EAAAV,EAAA,IAAA,CAACH,EAAD,CAAgB,GAAI,GAAGQ,EAAG,QAAS,QAASM,EAAW,OAAO,OAAU,CAAA,CAC5D,CAAA,CAAA,GACd,EAAAX,EAAA,IAAA,CAACL,EAAD,CACM,KACC,MACL,KAAMS,EACN,QAASQ,IAAU,GACnB,gBAAiBC,EACT,SACE,WACV,mBAAkBf,EAAYS,EAAQE,CAAa,CACpD,CAAA,CACI,GAEX"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{i as e}from"./rolldown-runtime-Dd_uD5pT.js";import{t}from"./jsx-runtime-DREnUpxT.js";import{t as n}from"./field-
|
|
2
|
-
//# sourceMappingURL=FormTextareaField-
|
|
1
|
+
import{i as e}from"./rolldown-runtime-Dd_uD5pT.js";import{t}from"./jsx-runtime-DREnUpxT.js";import{t as n}from"./field-COOzRptX.js";import{c as r,r as i}from"./zod-Cry7YvLY.js";import{n as a}from"./settle-CFU6YpQ0.js";import{t as o}from"./HintedLabel-DzHnEdIK.js";import{t as s}from"./textarea-BBjqMF-Y.js";var c=e(t(),1),l=({control:e,name:t,label:l,hint:u,...d})=>{let{field:f,fieldState:p}=r({control:e,name:t}),m=`field-${t}`,h=p.error?.message,g=u?`${m}-hint`:void 0;return(0,c.jsxs)(n,{"data-invalid":p.invalid||void 0,children:[(0,c.jsx)(o,{htmlFor:m,label:l,hint:u,hintId:g}),(0,c.jsx)(s,{...d,...f,value:f.value??``,id:m,"aria-invalid":p.invalid||void 0,"aria-describedby":a(g,h&&`${m}-error`)}),(0,c.jsx)(i,{id:`${m}-error`,message:h})]})};export{l as t};
|
|
2
|
+
//# sourceMappingURL=FormTextareaField-CO115n_u.js.map
|
package/dist/admin/assets/{FormTextareaField-BSKNeTPW.js.map → FormTextareaField-CO115n_u.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FormTextareaField-
|
|
1
|
+
{"version":3,"file":"FormTextareaField-CO115n_u.js","names":["__toESM","Field","useController","FormFieldError","describedBy","HintedLabel","Textarea","import_jsx_runtime","require_jsx_runtime","FormTextareaField","textareaProps","id","name","errorMessage","fieldState","hintId","hint","field"],"sources":["../../src/components/FormTextareaField/index.tsx"],"sourcesContent":["import type { ComponentProps } from 'react';\nimport { useController, type Control, type FieldPath, type FieldValues } from 'react-hook-form';\nimport { Field } from '@/components/ui/field';\nimport { Textarea } from '@/components/ui/textarea';\nimport { describedBy } from '@/helpers/describedBy';\nimport { FormFieldError } from '../FormFieldError';\nimport { HintedLabel } from '../HintedLabel';\n\ntype TextareaProps = Omit<ComponentProps<typeof Textarea>, 'name' | 'value' | 'onChange' | 'onBlur' | 'id'>;\n\ntype FormTextareaFieldProps<TValues extends FieldValues> = TextareaProps & {\n control: Control<TValues>;\n name: FieldPath<TValues>;\n label: string;\n /** Explanation behind an info icon next to the label (DESIGN.md, helper-text rule). */\n hint?: string;\n};\n\nexport const FormTextareaField = <TValues extends FieldValues>({\n control,\n name,\n label,\n hint,\n ...textareaProps\n}: FormTextareaFieldProps<TValues>) => {\n const { field, fieldState } = useController({ control, name });\n const id = `field-${name}`;\n const errorMessage = fieldState.error?.message;\n const hintId = hint ? `${id}-hint` : undefined;\n return (\n <Field data-invalid={fieldState.invalid || undefined}>\n <HintedLabel htmlFor={id} label={label} hint={hint} hintId={hintId} />\n <Textarea\n {...textareaProps}\n {...field}\n value={field.value ?? ''}\n id={id}\n aria-invalid={fieldState.invalid || undefined}\n aria-describedby={describedBy(hintId, errorMessage && `${id}-error`)}\n />\n <FormFieldError id={`${id}-error`} message={errorMessage} />\n </Field>\n );\n};\n"],"mappings":"kUAkBaS,GAAkD,CAC7D,UACA,OACA,QACA,OACA,GAAGC,KACkC,CACrC,GAAM,CAAE,QAAO,cAAeR,EAAc,CAAE,UAAS,MAAK,CAAC,EACvDS,EAAK,SAASC,IACdC,EAAeC,EAAW,OAAO,QACjCC,EAASC,EAAO,GAAGL,EAAG,OAAS,IAAA,GACrC,OACE,EAAAJ,EAAA,KAAA,CAACN,EAAD,CAAO,eAAca,EAAW,SAAW,IAAA,GAA3C,SAAA,EACE,EAAAP,EAAA,IAAA,CAACF,EAAD,CAAa,QAASM,EAAW,QAAa,OAAc,QAAS,CAAA,GACrE,EAAAJ,EAAA,IAAA,CAACD,EAAD,CACE,GAAII,EACJ,GAAIO,EACJ,MAAOA,EAAM,OAAS,GAClB,KACJ,eAAcH,EAAW,SAAW,IAAA,GACpC,mBAAkBV,EAAYW,EAAQF,GAAgB,GAAGF,EAAG,OAAO,CACpE,CAAA,GACD,EAAAJ,EAAA,IAAA,CAACJ,EAAD,CAAgB,GAAI,GAAGQ,EAAG,QAAS,QAASE,CAAe,CAAA,CACtD,GAEX"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{i as e}from"./rolldown-runtime-Dd_uD5pT.js";import{t}from"./jsx-runtime-DREnUpxT.js";import{t as n}from"./InfoHint-
|
|
2
|
-
//# sourceMappingURL=HintedLabel-
|
|
1
|
+
import{i as e}from"./rolldown-runtime-Dd_uD5pT.js";import{t}from"./jsx-runtime-DREnUpxT.js";import{t as n}from"./InfoHint-CSEtcHjL.js";import{o as r}from"./field-COOzRptX.js";import{t as i}from"./cn-DVhJ55Mo.js";var a=e(t(),1),o=({htmlFor:e,label:t,hint:o,hintId:s,className:c})=>(0,a.jsxs)(`div`,{className:i(`flex items-center gap-1`,c),children:[(0,a.jsx)(r,{htmlFor:e,children:t}),o?(0,a.jsx)(n,{about:t,id:s,children:o}):null]});export{o as t};
|
|
2
|
+
//# sourceMappingURL=HintedLabel-DzHnEdIK.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HintedLabel-
|
|
1
|
+
{"version":3,"file":"HintedLabel-DzHnEdIK.js","names":["__toESM","InfoHint","FieldLabel","cn","import_jsx_runtime","require_jsx_runtime","HintedLabel","className","label","hint","hintId"],"sources":["../../src/components/HintedLabel/index.tsx"],"sourcesContent":["import { FieldLabel } from '@/components/ui/field';\nimport { cn } from '@/helpers/cn';\nimport { InfoHint } from '../InfoHint';\n\ntype HintedLabelProps = {\n htmlFor: string;\n label: string;\n /** Optional explanation behind an info icon (see InfoHint). */\n hint?: string;\n /** Id of the hidden hint text; put it in the control's `aria-describedby`. */\n hintId?: string;\n className?: string;\n};\n\n/** A field label with an optional info-icon hint beside it (the label stays the click target). */\nexport const HintedLabel = ({ htmlFor, label, hint, hintId, className }: HintedLabelProps) => (\n <div className={cn('flex items-center gap-1', className)}>\n <FieldLabel htmlFor={htmlFor}>{label}</FieldLabel>\n {hint ? (\n <InfoHint about={label} id={hintId}>\n {hint}\n </InfoHint>\n ) : null}\n </div>\n);\n"],"mappings":"mOAeaM,GAAe,CAAE,UAAS,QAAO,OAAM,SAAQ,gBAC1D,EAAAF,EAAA,KAAA,CAAC,MAAD,CAAK,UAAWD,EAAG,0BAA2BI,CAAS,EAAvD,SAAA,EACE,EAAAH,EAAA,IAAA,CAACF,EAAD,CAAqB,UAAU,SAAAM,CAAkB,CAAA,EAChDC,GACC,EAAAL,EAAA,IAAA,CAACH,EAAD,CAAU,MAAOO,EAAO,GAAIE,EACzB,SAAAD,CACO,CAAA,EACR,IACD"}
|