@signalcore/ui 0.1.0 → 1.0.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +896 -513
- package/dist/AgentAbout.d.ts +186 -0
- package/dist/AgentAbout.js +1020 -0
- package/dist/AgentAbout.js.map +1 -0
- package/dist/AgentCard.d.ts +49 -0
- package/dist/AgentCard.js +77 -0
- package/dist/AgentCard.js.map +1 -0
- package/dist/AgentChat.d.ts +233 -0
- package/dist/AgentChat.js +1127 -0
- package/dist/AgentChat.js.map +1 -0
- package/dist/AgentSpace.d.ts +112 -0
- package/dist/AgentSpace.js +339 -0
- package/dist/AgentSpace.js.map +1 -0
- package/dist/AgentTasks.d.ts +48 -0
- package/dist/AgentTasks.js +120 -0
- package/dist/AgentTasks.js.map +1 -0
- package/dist/BrowserView.d.ts +52 -0
- package/dist/BrowserView.js +328 -0
- package/dist/BrowserView.js.map +1 -0
- package/dist/FileView.d.ts +63 -0
- package/dist/FileView.js +449 -0
- package/dist/FileView.js.map +1 -0
- package/dist/Modes.d.ts +13 -0
- package/dist/Modes.js +75 -0
- package/dist/Modes.js.map +1 -0
- package/dist/VoiceCall.d.ts +91 -0
- package/dist/VoiceCall.js +302 -0
- package/dist/VoiceCall.js.map +1 -0
- package/dist/about.d.ts +212 -0
- package/dist/about.js +136 -0
- package/dist/about.js.map +1 -0
- package/dist/agentIcons.d.ts +33 -0
- package/dist/agentIcons.js +36 -0
- package/dist/agentIcons.js.map +1 -0
- package/dist/automation/Automation.d.ts +35 -0
- package/dist/automation/Automation.js +268 -0
- package/dist/automation/Automation.js.map +1 -0
- package/dist/automation/RunView.d.ts +25 -0
- package/dist/automation/RunView.js +187 -0
- package/dist/automation/RunView.js.map +1 -0
- package/dist/automation/cron.d.ts +41 -0
- package/dist/automation/cron.js +169 -0
- package/dist/automation/cron.js.map +1 -0
- package/dist/automation/marks.js +121 -0
- package/dist/automation/marks.js.map +1 -0
- package/dist/automation/messages.d.ts +113 -0
- package/dist/automation/messages.js +113 -0
- package/dist/automation/messages.js.map +1 -0
- package/dist/automation/record.d.ts +47 -0
- package/dist/automation/record.js +177 -0
- package/dist/automation/record.js.map +1 -0
- package/dist/automation/types.d.ts +143 -0
- package/dist/automation/when.d.ts +36 -0
- package/dist/automation/when.js +168 -0
- package/dist/automation/when.js.map +1 -0
- package/dist/blocks.d.ts +185 -0
- package/dist/browser.js +292 -0
- package/dist/browser.js.map +1 -0
- package/dist/call.d.ts +89 -0
- package/dist/call.js +218 -0
- package/dist/call.js.map +1 -0
- package/dist/channelParts.js +26 -0
- package/dist/channelParts.js.map +1 -0
- package/dist/classes.js +8 -3
- package/dist/classes.js.map +1 -0
- package/dist/client.d.ts +146 -54
- package/dist/client.js +204 -1
- package/dist/client.js.map +1 -0
- package/dist/conversationFiles.js +46 -0
- package/dist/conversationFiles.js.map +1 -0
- package/dist/credentials.d.ts +45 -0
- package/dist/credentials.js +98 -0
- package/dist/credentials.js.map +1 -0
- package/dist/dev.js +17 -0
- package/dist/dev.js.map +1 -0
- package/dist/es.d.ts +17 -0
- package/dist/es.js +382 -0
- package/dist/es.js.map +1 -0
- package/dist/files.d.ts +21 -0
- package/dist/files.js +214 -0
- package/dist/files.js.map +1 -0
- package/dist/frames.d.ts +115 -0
- package/dist/frames.js +219 -0
- package/dist/frames.js.map +1 -0
- package/dist/icons.js +29 -0
- package/dist/icons.js.map +1 -0
- package/dist/index.d.ts +63 -60
- package/dist/index.js +59 -45
- package/dist/kit/AudioPlayer.d.ts +20 -0
- package/dist/kit/AudioPlayer.js +116 -0
- package/dist/kit/AudioPlayer.js.map +1 -0
- package/dist/kit/Button.d.ts +29 -0
- package/dist/kit/Button.js +59 -0
- package/dist/kit/Button.js.map +1 -0
- package/dist/kit/Card.d.ts +16 -0
- package/dist/kit/Card.js +36 -0
- package/dist/kit/Card.js.map +1 -0
- package/dist/kit/Chart.js +152 -0
- package/dist/kit/Chart.js.map +1 -0
- package/dist/kit/Choices.d.ts +21 -0
- package/dist/kit/Choices.js +99 -0
- package/dist/kit/Choices.js.map +1 -0
- package/dist/kit/Combobox.d.ts +26 -0
- package/dist/kit/Combobox.js +190 -0
- package/dist/kit/Combobox.js.map +1 -0
- package/dist/kit/DateField.d.ts +17 -0
- package/dist/kit/DateField.js +133 -0
- package/dist/kit/DateField.js.map +1 -0
- package/dist/kit/Field.d.ts +40 -0
- package/dist/kit/Field.js +98 -0
- package/dist/kit/Field.js.map +1 -0
- package/dist/kit/FileField.d.ts +113 -0
- package/dist/kit/FileField.js +341 -0
- package/dist/kit/FileField.js.map +1 -0
- package/dist/kit/FileMark.d.ts +15 -0
- package/dist/kit/FileMark.js +39 -0
- package/dist/kit/FileMark.js.map +1 -0
- package/dist/kit/Inputs.d.ts +59 -0
- package/dist/kit/Inputs.js +205 -0
- package/dist/kit/Inputs.js.map +1 -0
- package/dist/kit/List.d.ts +47 -0
- package/dist/kit/List.js +85 -0
- package/dist/kit/List.js.map +1 -0
- package/dist/kit/Mark.d.ts +30 -0
- package/dist/kit/Mark.js +27 -0
- package/dist/kit/Mark.js.map +1 -0
- package/dist/kit/MarkStack.d.ts +15 -0
- package/dist/kit/MarkStack.js +26 -0
- package/dist/kit/MarkStack.js.map +1 -0
- package/dist/kit/Note.d.ts +11 -0
- package/dist/kit/Note.js +31 -0
- package/dist/kit/Note.js.map +1 -0
- package/dist/kit/Popover.js +90 -0
- package/dist/kit/Popover.js.map +1 -0
- package/dist/kit/RangeField.d.ts +14 -0
- package/dist/kit/RangeField.js +47 -0
- package/dist/kit/RangeField.js.map +1 -0
- package/dist/kit/RatingField.d.ts +14 -0
- package/dist/kit/RatingField.js +50 -0
- package/dist/kit/RatingField.js.map +1 -0
- package/dist/kit/Stat.d.ts +26 -0
- package/dist/kit/Stat.js +46 -0
- package/dist/kit/Stat.js.map +1 -0
- package/dist/kit/Switch.d.ts +14 -0
- package/dist/kit/Switch.js +21 -0
- package/dist/kit/Switch.js.map +1 -0
- package/dist/kit/Tag.d.ts +16 -0
- package/dist/kit/Tag.js +20 -0
- package/dist/kit/Tag.js.map +1 -0
- package/dist/kit/Tile.d.ts +34 -0
- package/dist/kit/Tile.js +52 -0
- package/dist/kit/Tile.js.map +1 -0
- package/dist/kit/TimeField.d.ts +31 -0
- package/dist/kit/TimeField.js +109 -0
- package/dist/kit/TimeField.js.map +1 -0
- package/dist/kit/context.d.ts +22 -0
- package/dist/kit/context.js +46 -0
- package/dist/kit/context.js.map +1 -0
- package/dist/kit/dates.d.ts +14 -0
- package/dist/kit/dates.js +129 -0
- package/dist/kit/dates.js.map +1 -0
- package/dist/kit/messages.d.ts +99 -0
- package/dist/kit/messages.js +66 -0
- package/dist/kit/messages.js.map +1 -0
- package/dist/kit/numbers.d.ts +12 -0
- package/dist/kit/numbers.js +40 -0
- package/dist/kit/numbers.js.map +1 -0
- package/dist/kit/options.d.ts +10 -0
- package/dist/kit/options.js +23 -0
- package/dist/kit/options.js.map +1 -0
- package/dist/kit/uploads.d.ts +42 -0
- package/dist/kit/uploads.js +165 -0
- package/dist/kit/uploads.js.map +1 -0
- package/dist/kit/waveform.js +76 -0
- package/dist/kit/waveform.js.map +1 -0
- package/dist/locale.d.ts +1 -0
- package/dist/locale.js +1 -0
- package/dist/markdown.js +84 -0
- package/dist/markdown.js.map +1 -0
- package/dist/marks.js +217 -0
- package/dist/marks.js.map +1 -0
- package/dist/reveal.js +48 -0
- package/dist/reveal.js.map +1 -0
- package/dist/stepGlyphs.js +62 -0
- package/dist/stepGlyphs.js.map +1 -0
- package/dist/surface/Form.js +264 -0
- package/dist/surface/Form.js.map +1 -0
- package/dist/surface/Markdown.js +42 -0
- package/dist/surface/Markdown.js.map +1 -0
- package/dist/surface/Surface.d.ts +31 -17
- package/dist/surface/Surface.js +480 -57
- package/dist/surface/Surface.js.map +1 -0
- package/dist/surface/scope.d.ts +32 -0
- package/dist/surface/scope.js +23 -0
- package/dist/surface/scope.js.map +1 -0
- package/dist/surface/values.d.ts +44 -0
- package/dist/surface/values.js +237 -0
- package/dist/surface/values.js.map +1 -0
- package/dist/tint.d.ts +10 -0
- package/dist/tint.js +19 -0
- package/dist/tint.js.map +1 -0
- package/dist/types.d.ts +541 -0
- package/dist/types.js +16 -0
- package/dist/types.js.map +1 -0
- package/dist/useAgentFace.d.ts +18 -0
- package/dist/useAgentFace.js +45 -0
- package/dist/useAgentFace.js.map +1 -0
- package/dist/useCall.d.ts +39 -0
- package/dist/useCall.js +273 -0
- package/dist/useCall.js.map +1 -0
- package/dist/useConversation.d.ts +77 -0
- package/dist/useConversation.js +523 -0
- package/dist/useConversation.js.map +1 -0
- package/dist/useDictation.d.ts +17 -0
- package/dist/useDictation.js +68 -0
- package/dist/useDictation.js.map +1 -0
- package/dist/useLive.d.ts +26 -0
- package/dist/useLive.js +88 -0
- package/dist/useLive.js.map +1 -0
- package/dist/usePolled.js +68 -0
- package/dist/usePolled.js.map +1 -0
- package/dist/voice/Orb.d.ts +10 -9
- package/dist/voice/Orb.js +43 -39
- package/dist/voice/Orb.js.map +1 -0
- package/dist/voice/StillOrb.js +33 -0
- package/dist/voice/StillOrb.js.map +1 -0
- package/dist/voice/WebGLOrb.js +98 -0
- package/dist/voice/WebGLOrb.js.map +1 -0
- package/dist/voice/fluidDots.js +161 -0
- package/dist/voice/fluidDots.js.map +1 -0
- package/dist/voice/motion.js +84 -0
- package/dist/voice/motion.js.map +1 -0
- package/dist/voice/orbs.d.ts +32 -0
- package/dist/voice/orbs.js +16 -0
- package/dist/voice/orbs.js.map +1 -0
- package/dist/voice/useReducedMotion.js +16 -16
- package/dist/voice/useReducedMotion.js.map +1 -0
- package/dist/voice/wave.js +116 -0
- package/dist/voice/wave.js.map +1 -0
- package/dist/voice/webgl.js +177 -0
- package/dist/voice/webgl.js.map +1 -0
- package/dist/widget.js +284 -8
- package/package.json +49 -39
- package/src/AgentAbout.tsx +1621 -0
- package/src/AgentCard.tsx +123 -0
- package/src/AgentChat.tsx +1812 -0
- package/src/AgentSpace.tsx +540 -0
- package/src/AgentTasks.tsx +163 -0
- package/src/BrowserView.tsx +442 -0
- package/src/FileView.tsx +620 -0
- package/src/Modes.tsx +112 -0
- package/src/VoiceCall.tsx +411 -0
- package/src/about.ts +355 -0
- package/src/agentIcons.ts +56 -0
- package/src/automation/Automation.tsx +308 -0
- package/src/automation/RunView.tsx +213 -0
- package/src/automation/cron.ts +196 -0
- package/src/automation/marks.tsx +144 -0
- package/src/automation/messages.ts +231 -0
- package/src/automation/record.ts +206 -0
- package/src/automation/types.ts +146 -0
- package/src/automation/when.ts +195 -0
- package/src/blocks.ts +249 -0
- package/src/browser.ts +334 -0
- package/src/call.ts +300 -0
- package/src/channelParts.ts +17 -0
- package/src/classes.ts +10 -0
- package/src/client.ts +397 -0
- package/src/conversationFiles.ts +54 -0
- package/src/credentials.ts +158 -0
- package/src/dev.ts +20 -0
- package/src/es.ts +423 -0
- package/src/files.ts +238 -0
- package/src/frames.ts +291 -0
- package/src/icons.tsx +49 -0
- package/src/index.ts +271 -0
- package/src/kit/AudioPlayer.tsx +129 -0
- package/src/kit/Button.tsx +97 -0
- package/src/kit/Card.tsx +47 -0
- package/src/kit/Chart.tsx +129 -0
- package/src/kit/Choices.tsx +131 -0
- package/src/kit/Combobox.tsx +247 -0
- package/src/kit/DateField.tsx +156 -0
- package/src/kit/Field.tsx +137 -0
- package/src/kit/FileField.tsx +492 -0
- package/src/kit/FileMark.tsx +56 -0
- package/src/kit/Inputs.tsx +250 -0
- package/src/kit/List.tsx +135 -0
- package/src/kit/Mark.tsx +64 -0
- package/src/kit/MarkStack.tsx +29 -0
- package/src/kit/Note.tsx +42 -0
- package/src/kit/Popover.tsx +121 -0
- package/src/kit/RangeField.tsx +53 -0
- package/src/kit/RatingField.tsx +62 -0
- package/src/kit/Stat.tsx +60 -0
- package/src/kit/Switch.tsx +28 -0
- package/src/kit/Tag.tsx +32 -0
- package/src/kit/Tile.tsx +74 -0
- package/src/kit/TimeField.tsx +157 -0
- package/src/kit/context.tsx +246 -0
- package/src/kit/dates.ts +150 -0
- package/src/kit/messages.ts +160 -0
- package/src/kit/numbers.ts +44 -0
- package/src/kit/options.ts +30 -0
- package/src/kit/uploads.ts +244 -0
- package/src/kit/waveform.ts +84 -0
- package/src/locale.ts +6 -0
- package/src/markdown.ts +69 -0
- package/src/marks.tsx +328 -0
- package/src/reveal.ts +52 -0
- package/src/stepGlyphs.ts +83 -0
- package/src/styles.css +6970 -0
- package/src/surface/Form.tsx +299 -0
- package/src/surface/Markdown.tsx +55 -0
- package/src/surface/Surface.tsx +605 -0
- package/src/surface/scope.ts +82 -0
- package/src/surface/values.ts +361 -0
- package/src/tint.ts +14 -0
- package/src/types.ts +604 -0
- package/src/useAgentFace.ts +47 -0
- package/src/useCall.ts +292 -0
- package/src/useConversation.ts +627 -0
- package/src/useDictation.ts +83 -0
- package/src/useLive.ts +115 -0
- package/src/usePolled.ts +60 -0
- package/src/voice/Orb.tsx +45 -0
- package/src/voice/StillOrb.tsx +29 -0
- package/src/voice/WebGLOrb.tsx +98 -0
- package/src/voice/fluidDots.tsx +171 -0
- package/src/voice/motion.ts +112 -0
- package/src/voice/orbs.ts +39 -0
- package/src/voice/useReducedMotion.ts +24 -0
- package/src/voice/wave.tsx +129 -0
- package/src/voice/webgl.ts +209 -0
- package/src/widget/css.d.ts +5 -0
- package/src/widget/element.tsx +535 -0
- package/src/widget/index.ts +10 -0
- package/src/widget/mount.ts +27 -0
- package/src/widget/widget.css +253 -0
- package/dist/SignalcoreProvider.d.ts +0 -113
- package/dist/SignalcoreProvider.js +0 -84
- package/dist/automations/AppMarks.d.ts +0 -11
- package/dist/automations/AppMarks.js +0 -18
- package/dist/automations/AutomationCard.d.ts +0 -27
- package/dist/automations/AutomationCard.js +0 -53
- package/dist/automations/AutomationsWindow.d.ts +0 -38
- package/dist/automations/AutomationsWindow.js +0 -57
- package/dist/automations/Card.d.ts +0 -46
- package/dist/automations/Card.js +0 -45
- package/dist/automations/ScheduleMarks.d.ts +0 -13
- package/dist/automations/ScheduleMarks.js +0 -24
- package/dist/automations/presentationIcons.d.ts +0 -7
- package/dist/automations/presentationIcons.js +0 -67
- package/dist/automations/schedule.d.ts +0 -25
- package/dist/automations/schedule.js +0 -59
- package/dist/automations/time.d.ts +0 -3
- package/dist/automations/time.js +0 -25
- package/dist/browser/BrowserView.d.ts +0 -43
- package/dist/browser/BrowserView.js +0 -94
- package/dist/browser/room.d.ts +0 -21
- package/dist/browser/room.js +0 -33
- package/dist/browser/useBrowserSession.d.ts +0 -17
- package/dist/browser/useBrowserSession.js +0 -67
- package/dist/builder/BuilderChat.d.ts +0 -32
- package/dist/builder/BuilderChat.js +0 -41
- package/dist/builder/BuilderTranscript.d.ts +0 -49
- package/dist/builder/BuilderTranscript.js +0 -62
- package/dist/builder/StatusLine.d.ts +0 -8
- package/dist/builder/StatusLine.js +0 -17
- package/dist/builder/answer.d.ts +0 -7
- package/dist/builder/answer.js +0 -8
- package/dist/builder/blocks.d.ts +0 -31
- package/dist/builder/blocks.js +0 -74
- package/dist/builder/items.d.ts +0 -15
- package/dist/builder/items.js +0 -21
- package/dist/builder/steps.d.ts +0 -20
- package/dist/builder/steps.js +0 -120
- package/dist/builder/time.d.ts +0 -4
- package/dist/builder/time.js +0 -24
- package/dist/builder/useBuildSession.d.ts +0 -36
- package/dist/builder/useBuildSession.js +0 -130
- package/dist/builder/workingOn.d.ts +0 -7
- package/dist/builder/workingOn.js +0 -15
- package/dist/chat/AgentChat.d.ts +0 -37
- package/dist/chat/AgentChat.js +0 -21
- package/dist/chat/ChatView.d.ts +0 -25
- package/dist/chat/ChatView.js +0 -34
- package/dist/chat/Composer.d.ts +0 -20
- package/dist/chat/Composer.js +0 -22
- package/dist/chat/MessageRow.d.ts +0 -22
- package/dist/chat/MessageRow.js +0 -32
- package/dist/chat/arrival.d.ts +0 -15
- package/dist/chat/arrival.js +0 -25
- package/dist/chat/history.d.ts +0 -24
- package/dist/chat/history.js +0 -45
- package/dist/chat/moments.d.ts +0 -25
- package/dist/chat/moments.js +0 -72
- package/dist/chat/types.d.ts +0 -12
- package/dist/chat/types.js +0 -1
- package/dist/chat/useComposer.d.ts +0 -46
- package/dist/chat/useComposer.js +0 -62
- package/dist/chat/useConversation.d.ts +0 -35
- package/dist/chat/useConversation.js +0 -71
- package/dist/chat/useStickToBottom.d.ts +0 -9
- package/dist/chat/useStickToBottom.js +0 -33
- package/dist/chat/useTurns.d.ts +0 -49
- package/dist/chat/useTurns.js +0 -111
- package/dist/classes.d.ts +0 -2
- package/dist/development.d.ts +0 -5
- package/dist/development.js +0 -8
- package/dist/flow/FlowWindow.d.ts +0 -42
- package/dist/flow/FlowWindow.js +0 -126
- package/dist/flow/index.d.ts +0 -16
- package/dist/flow/index.js +0 -16
- package/dist/flow/kinds.d.ts +0 -23
- package/dist/flow/kinds.js +0 -48
- package/dist/flow/map.d.ts +0 -44
- package/dist/flow/map.js +0 -225
- package/dist/flow/nodePaths.d.ts +0 -7
- package/dist/flow/nodePaths.js +0 -17
- package/dist/flow/relations.d.ts +0 -42
- package/dist/flow/relations.js +0 -174
- package/dist/host.d.ts +0 -124
- package/dist/host.js +0 -1
- package/dist/live/LiveView.d.ts +0 -28
- package/dist/live/LiveView.js +0 -55
- package/dist/live/capture.d.ts +0 -20
- package/dist/live/capture.js +0 -100
- package/dist/live/follow.d.ts +0 -26
- package/dist/live/follow.js +0 -72
- package/dist/live/paint.d.ts +0 -13
- package/dist/live/paint.js +0 -77
- package/dist/live/useLiveStream.d.ts +0 -16
- package/dist/live/useLiveStream.js +0 -57
- package/dist/look.d.ts +0 -33
- package/dist/look.js +0 -241
- package/dist/messages/en.d.ts +0 -3
- package/dist/messages/en.js +0 -251
- package/dist/messages/es.d.ts +0 -3
- package/dist/messages/es.js +0 -251
- package/dist/messages/index.d.ts +0 -16
- package/dist/messages/index.js +0 -33
- package/dist/messages/types.d.ts +0 -246
- package/dist/messages/types.js +0 -1
- package/dist/parts/Button.d.ts +0 -18
- package/dist/parts/Button.js +0 -17
- package/dist/parts/Icon.d.ts +0 -39
- package/dist/parts/Icon.js +0 -37
- package/dist/parts/Input.d.ts +0 -6
- package/dist/parts/Input.js +0 -11
- package/dist/parts/Spinner.d.ts +0 -2
- package/dist/parts/Spinner.js +0 -7
- package/dist/patterns.d.ts +0 -15
- package/dist/patterns.js +0 -5
- package/dist/presets.d.ts +0 -82
- package/dist/presets.js +0 -81
- package/dist/primitives.d.ts +0 -22
- package/dist/primitives.js +0 -58
- package/dist/request/RequestCard.d.ts +0 -34
- package/dist/request/RequestCard.js +0 -101
- package/dist/request/approval/ApprovalPreview.d.ts +0 -5
- package/dist/request/approval/ApprovalPreview.js +0 -27
- package/dist/request/approval/shapes.d.ts +0 -32
- package/dist/request/approval/shapes.js +0 -68
- package/dist/request/apps.d.ts +0 -11
- package/dist/request/apps.js +0 -27
- package/dist/request/cards.d.ts +0 -12
- package/dist/request/cards.js +0 -24
- package/dist/request/deliver.d.ts +0 -12
- package/dist/request/deliver.js +0 -21
- package/dist/request/handOver.d.ts +0 -18
- package/dist/request/handOver.js +0 -33
- package/dist/request/kinds/Approval.d.ts +0 -3
- package/dist/request/kinds/Approval.js +0 -9
- package/dist/request/kinds/Choice.d.ts +0 -3
- package/dist/request/kinds/Choice.js +0 -8
- package/dist/request/kinds/Connect.d.ts +0 -9
- package/dist/request/kinds/Connect.js +0 -119
- package/dist/request/kinds/FreeText.d.ts +0 -3
- package/dist/request/kinds/FreeText.js +0 -20
- package/dist/request/kinds/HandOver.d.ts +0 -13
- package/dist/request/kinds/HandOver.js +0 -20
- package/dist/request/kinds/Secret.d.ts +0 -7
- package/dist/request/kinds/Secret.js +0 -49
- package/dist/request/kinds/Upload.d.ts +0 -6
- package/dist/request/kinds/Upload.js +0 -47
- package/dist/request/types.d.ts +0 -83
- package/dist/request/types.js +0 -1
- package/dist/safeUrl.d.ts +0 -6
- package/dist/safeUrl.js +0 -8
- package/dist/stream/builder.d.ts +0 -176
- package/dist/stream/builder.js +0 -202
- package/dist/stream/reduce.d.ts +0 -51
- package/dist/stream/reduce.js +0 -58
- package/dist/stream/untilAborted.d.ts +0 -7
- package/dist/stream/untilAborted.js +0 -32
- package/dist/stream/useRunStream.d.ts +0 -26
- package/dist/stream/useRunStream.js +0 -137
- package/dist/styles.css +0 -2318
- package/dist/surface/HostNode.d.ts +0 -14
- package/dist/surface/HostNode.js +0 -30
- package/dist/surface/Node.d.ts +0 -7
- package/dist/surface/Node.js +0 -49
- package/dist/surface/SurfaceBoundary.d.ts +0 -26
- package/dist/surface/SurfaceBoundary.js +0 -20
- package/dist/surface/bindings.d.ts +0 -14
- package/dist/surface/bindings.js +0 -37
- package/dist/surface/check.d.ts +0 -27
- package/dist/surface/check.js +0 -102
- package/dist/surface/format.d.ts +0 -10
- package/dist/surface/format.js +0 -32
- package/dist/surface/hosts.d.ts +0 -6
- package/dist/surface/hosts.js +0 -11
- package/dist/surface/scene.d.ts +0 -21
- package/dist/surface/scene.js +0 -8
- package/dist/surface/templates/Browser.d.ts +0 -6
- package/dist/surface/templates/Browser.js +0 -11
- package/dist/surface/templates/Chart.d.ts +0 -6
- package/dist/surface/templates/Chart.js +0 -13
- package/dist/surface/templates/Choices.d.ts +0 -3
- package/dist/surface/templates/Choices.js +0 -12
- package/dist/surface/templates/Form.d.ts +0 -3
- package/dist/surface/templates/Form.js +0 -44
- package/dist/surface/templates/KeyValue.d.ts +0 -3
- package/dist/surface/templates/KeyValue.js +0 -7
- package/dist/surface/templates/Layout.d.ts +0 -5
- package/dist/surface/templates/Layout.js +0 -16
- package/dist/surface/templates/Live.d.ts +0 -6
- package/dist/surface/templates/Live.js +0 -9
- package/dist/surface/templates/Media.d.ts +0 -5
- package/dist/surface/templates/Media.js +0 -13
- package/dist/surface/templates/Slots.d.ts +0 -3
- package/dist/surface/templates/Slots.js +0 -19
- package/dist/surface/templates/Table.d.ts +0 -3
- package/dist/surface/templates/Table.js +0 -12
- package/dist/surface/templates/Text.d.ts +0 -4
- package/dist/surface/templates/Text.js +0 -15
- package/dist/surface/templates/index.d.ts +0 -7
- package/dist/surface/templates/index.js +0 -32
- package/dist/surface/types.d.ts +0 -68
- package/dist/surface/types.js +0 -6
- package/dist/theme.d.ts +0 -62
- package/dist/theme.js +0 -9
- package/dist/useTokens.d.ts +0 -7
- package/dist/useTokens.js +0 -41
- package/dist/voice/VoiceWindow.d.ts +0 -18
- package/dist/voice/VoiceWindow.js +0 -35
- package/dist/voice/index.d.ts +0 -13
- package/dist/voice/index.js +0 -12
- package/dist/voice/meter.d.ts +0 -16
- package/dist/voice/meter.js +0 -52
- package/dist/voice/orbColors.d.ts +0 -16
- package/dist/voice/orbColors.js +0 -75
- package/dist/voice/pushable.d.ts +0 -16
- package/dist/voice/pushable.js +0 -56
- package/dist/voice/useDictation.d.ts +0 -24
- package/dist/voice/useDictation.js +0 -60
- package/dist/voice/useReducedMotion.d.ts +0 -5
- package/dist/voice/useVoice.d.ts +0 -70
- package/dist/voice/useVoice.js +0 -197
- package/dist/voice/useVoicePrimitives.d.ts +0 -7
- package/dist/voice/useVoicePrimitives.js +0 -11
- package/dist/voice/voice.d.ts +0 -55
- package/dist/voice/voice.js +0 -9
- package/dist/voice/webSpeech.d.ts +0 -33
- package/dist/voice/webSpeech.js +0 -258
- package/dist/widget.js.map +0 -1
- package/dist/windows/AgentSpace.d.ts +0 -78
- package/dist/windows/AgentSpace.js +0 -135
- package/dist/windows/Captions.d.ts +0 -13
- package/dist/windows/Captions.js +0 -22
- package/dist/windows/Dock.d.ts +0 -37
- package/dist/windows/Dock.js +0 -22
- package/dist/windows/Journal.d.ts +0 -15
- package/dist/windows/Journal.js +0 -19
- package/dist/windows/KindMark.d.ts +0 -7
- package/dist/windows/KindMark.js +0 -31
- package/dist/windows/Pending.d.ts +0 -8
- package/dist/windows/Pending.js +0 -17
- package/dist/windows/Stage.d.ts +0 -18
- package/dist/windows/Stage.js +0 -21
- package/dist/windows/StatusLabel.d.ts +0 -9
- package/dist/windows/StatusLabel.js +0 -7
- package/dist/windows/Strip.d.ts +0 -17
- package/dist/windows/Strip.js +0 -42
- package/dist/windows/SurfaceWindow.d.ts +0 -20
- package/dist/windows/SurfaceWindow.js +0 -12
- package/dist/windows/WindowFrame.d.ts +0 -23
- package/dist/windows/WindowFrame.js +0 -22
- package/dist/windows/hearing.d.ts +0 -11
- package/dist/windows/hearing.js +0 -26
- package/dist/windows/kinds.d.ts +0 -47
- package/dist/windows/kinds.js +0 -28
- package/dist/windows/reduce.d.ts +0 -98
- package/dist/windows/reduce.js +0 -151
- package/dist/windows/registry.d.ts +0 -18
- package/dist/windows/registry.js +0 -61
- package/dist/windows/reveal.d.ts +0 -9
- package/dist/windows/reveal.js +0 -6
- package/dist/windows/space.d.ts +0 -21
- package/dist/windows/space.js +0 -6
- package/dist/windows/status.d.ts +0 -11
- package/dist/windows/status.js +0 -30
- package/dist/windows/types.d.ts +0 -15
- package/dist/windows/types.js +0 -1
- package/dist/windows/useLoaded.d.ts +0 -44
- package/dist/windows/useLoaded.js +0 -58
- package/dist/windows/useUnread.d.ts +0 -7
- package/dist/windows/useUnread.js +0 -21
- package/dist/windows/useWindows.d.ts +0 -70
- package/dist/windows/useWindows.js +0 -60
|
@@ -0,0 +1,361 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What a surface sends, as pure functions: each block's action, a form's values from its fields,
|
|
3
|
+
* the words the person's answer reads as, and what is wrong with a value. The controls hold
|
|
4
|
+
* values in the shapes the contract sends (`blocks.ts`); nothing here touches the page.
|
|
5
|
+
*/
|
|
6
|
+
import type {
|
|
7
|
+
ButtonBlock,
|
|
8
|
+
ChoiceBlock,
|
|
9
|
+
Entry,
|
|
10
|
+
FieldValue,
|
|
11
|
+
FormBlock,
|
|
12
|
+
FormField,
|
|
13
|
+
ListBlock,
|
|
14
|
+
Option,
|
|
15
|
+
} from "../blocks";
|
|
16
|
+
import {
|
|
17
|
+
DAY,
|
|
18
|
+
dayAllowed,
|
|
19
|
+
formatDay,
|
|
20
|
+
formatMoment,
|
|
21
|
+
formatTime,
|
|
22
|
+
MOMENT,
|
|
23
|
+
momentParts,
|
|
24
|
+
slotAllowed,
|
|
25
|
+
TIME,
|
|
26
|
+
} from "../kit/dates";
|
|
27
|
+
import type { KitMessages } from "../kit/messages";
|
|
28
|
+
import { formatNumber, withUnit } from "../kit/numbers";
|
|
29
|
+
import { STARS } from "../kit/RatingField";
|
|
30
|
+
import type { Action, Attachment } from "../types";
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* What a block sends when the person uses it: its action's name, what it carries, and the words
|
|
34
|
+
* the app shows for it (the option picked, the button, the form's answer).
|
|
35
|
+
*/
|
|
36
|
+
export type SurfaceAction = Omit<Action, "surface">;
|
|
37
|
+
|
|
38
|
+
/** A form's values by field name, as its controls hold them. */
|
|
39
|
+
export type Values = Record<string, FieldValue>;
|
|
40
|
+
|
|
41
|
+
/** The field kinds this renderer draws; a surface with another falls back to its text. */
|
|
42
|
+
export const FIELD_KINDS: ReadonlySet<string> = new Set([
|
|
43
|
+
"text",
|
|
44
|
+
"textarea",
|
|
45
|
+
"email",
|
|
46
|
+
"phone",
|
|
47
|
+
"url",
|
|
48
|
+
"number",
|
|
49
|
+
"date",
|
|
50
|
+
"time",
|
|
51
|
+
"datetime",
|
|
52
|
+
"select",
|
|
53
|
+
"multiselect",
|
|
54
|
+
"checkbox",
|
|
55
|
+
"range",
|
|
56
|
+
"rating",
|
|
57
|
+
"file",
|
|
58
|
+
"secret",
|
|
59
|
+
]);
|
|
60
|
+
|
|
61
|
+
/** Up to this many options, a select shows them all; more go in a list to search. */
|
|
62
|
+
export const FEW_OPTIONS = 5;
|
|
63
|
+
/** Up to this many, a multiselect is chips; more go in a list to search. */
|
|
64
|
+
export const FEW_CHIPS = 8;
|
|
65
|
+
/** What a secret reads as, anywhere it is shown. */
|
|
66
|
+
export const MASK = "••••••••";
|
|
67
|
+
/** The longest answer label the API takes. */
|
|
68
|
+
const LABEL_MAX = 2000;
|
|
69
|
+
|
|
70
|
+
const EMAIL = /^[^\s@]+@[^\s@]+\.[^\s@]{2,}$/;
|
|
71
|
+
const PHONE = /^\+?[\d\s().-]+$/;
|
|
72
|
+
const URL_SHAPE = /^(https?:\/\/)?[^\s/.]+(\.[^\s/.]+)+(\/\S*)?$/i;
|
|
73
|
+
|
|
74
|
+
// --- The blocks' actions ------------------------------------------------------------------
|
|
75
|
+
|
|
76
|
+
/** A button's action: its name, nothing more, under its label. */
|
|
77
|
+
export function pressed(block: ButtonBlock & { action: string }): SurfaceAction {
|
|
78
|
+
return { name: block.action, data: {}, label: block.label };
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/** A choice's action: the option's id, under its label. */
|
|
82
|
+
export function picked(block: ChoiceBlock, option: Option): SurfaceAction {
|
|
83
|
+
return { name: block.action, data: { option: option.id }, label: option.label };
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/** A choice answered in the person's own words, under them. */
|
|
87
|
+
export function answeredIn(block: ChoiceBlock, text: string): SurfaceAction {
|
|
88
|
+
return { name: block.action, data: { text }, label: text };
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/** A list's action: the entry's id, under its title. */
|
|
92
|
+
export function chosen(block: ListBlock & { action: string }, entry: Entry): SurfaceAction {
|
|
93
|
+
return { name: block.action, data: { item: entry.id }, label: entry.title };
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* A form's action: its values by field name (an empty field as null), under the words of its
|
|
98
|
+
* one answer when it asks one thing (the day, the slot, the options picked, the files' names,
|
|
99
|
+
* read from `files`), its submit's when it asks more.
|
|
100
|
+
*/
|
|
101
|
+
export function filled(
|
|
102
|
+
block: FormBlock,
|
|
103
|
+
values: Values,
|
|
104
|
+
code: string,
|
|
105
|
+
messages: KitMessages,
|
|
106
|
+
files?: ReadonlyMap<string, Attachment>,
|
|
107
|
+
): SurfaceAction {
|
|
108
|
+
const data: Values = {};
|
|
109
|
+
for (const field of block.fields) data[field.name] = sent(field, values[field.name] ?? null);
|
|
110
|
+
const only = block.fields.length === 1 ? block.fields[0] : undefined;
|
|
111
|
+
const answer = only ? labelOf(only, data[only.name] ?? null, code, messages, { files }) : "";
|
|
112
|
+
return { name: block.action, data, label: clip(answer) || (block.submit ?? messages.send) };
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/** A value as it goes: words trimmed, an empty one as null, a moment only once whole. */
|
|
116
|
+
export function sent(field: FormField, value: FieldValue): FieldValue {
|
|
117
|
+
if (typeof value === "string") {
|
|
118
|
+
const text = value.trim();
|
|
119
|
+
if (field.kind === "datetime") return MOMENT.test(text) ? text : null;
|
|
120
|
+
return text === "" ? null : text;
|
|
121
|
+
}
|
|
122
|
+
if (typeof value === "number") return Number.isFinite(value) ? value : null;
|
|
123
|
+
return value;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
// --- Where a form starts ------------------------------------------------------------------
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Each field's first value: what the person already sent (`answered`, the form's own action's
|
|
130
|
+
* data), else what the agent gave it, else empty; a value that does not fit its kind is left out.
|
|
131
|
+
*/
|
|
132
|
+
export function startValues(fields: FormField[], answered?: Record<string, unknown>): Values {
|
|
133
|
+
const values: Values = {};
|
|
134
|
+
for (const field of fields) {
|
|
135
|
+
const given = answered && field.name in answered ? answered[field.name] : field.value;
|
|
136
|
+
values[field.name] = fit(field, given) ?? emptyOf(field);
|
|
137
|
+
}
|
|
138
|
+
return values;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/** A field with nothing given: unticked, none picked, a slider at its least, else nothing. */
|
|
142
|
+
export function emptyOf(field: FormField): FieldValue {
|
|
143
|
+
switch (field.kind) {
|
|
144
|
+
case "checkbox":
|
|
145
|
+
return false;
|
|
146
|
+
case "multiselect":
|
|
147
|
+
case "file":
|
|
148
|
+
return [];
|
|
149
|
+
case "range":
|
|
150
|
+
return field.min ?? 0;
|
|
151
|
+
default:
|
|
152
|
+
return null;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/** A value read as the field's kind holds it, or null when it does not fit. */
|
|
157
|
+
export function fit(field: FormField, raw: unknown): FieldValue {
|
|
158
|
+
switch (field.kind) {
|
|
159
|
+
case "checkbox":
|
|
160
|
+
return raw === true || raw === "true"
|
|
161
|
+
? true
|
|
162
|
+
: raw === false || raw === "false"
|
|
163
|
+
? false
|
|
164
|
+
: null;
|
|
165
|
+
case "number":
|
|
166
|
+
case "range":
|
|
167
|
+
case "rating": {
|
|
168
|
+
const number = typeof raw === "string" && raw.trim() !== "" ? Number(raw) : raw;
|
|
169
|
+
return typeof number === "number" && Number.isFinite(number) ? number : null;
|
|
170
|
+
}
|
|
171
|
+
case "multiselect": {
|
|
172
|
+
const ids = Array.isArray(raw) ? raw : typeof raw === "string" ? [raw] : [];
|
|
173
|
+
return ids.filter((id): id is string => typeof id === "string" && hasOption(field, id));
|
|
174
|
+
}
|
|
175
|
+
case "file": {
|
|
176
|
+
const ids = Array.isArray(raw) ? raw : typeof raw === "string" ? [raw] : [];
|
|
177
|
+
const strings = ids.filter((id): id is string => typeof id === "string" && id !== "");
|
|
178
|
+
return field.multiple ? strings : strings.slice(0, 1);
|
|
179
|
+
}
|
|
180
|
+
case "select":
|
|
181
|
+
return typeof raw === "string" && hasOption(field, raw) ? raw : null;
|
|
182
|
+
case "date":
|
|
183
|
+
return typeof raw === "string" && DAY.test(raw) ? raw : null;
|
|
184
|
+
case "time":
|
|
185
|
+
return typeof raw === "string" && TIME.test(raw) ? raw : null;
|
|
186
|
+
case "datetime":
|
|
187
|
+
return typeof raw === "string" && MOMENT.test(raw.slice(0, 16)) ? raw.slice(0, 16) : null;
|
|
188
|
+
default:
|
|
189
|
+
return typeof raw === "string" || typeof raw === "number" ? String(raw) : null;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
// --- What a value reads as ----------------------------------------------------------------
|
|
194
|
+
|
|
195
|
+
/**
|
|
196
|
+
* A value in words, as the person's answer reads in the chat: a day and a time in the host's
|
|
197
|
+
* language (against `today`), the options' labels joined, the files' names (from `files`), a
|
|
198
|
+
* number with its unit; "" when it is empty. A secret is never shown.
|
|
199
|
+
*/
|
|
200
|
+
export function labelOf(
|
|
201
|
+
field: FormField,
|
|
202
|
+
value: FieldValue,
|
|
203
|
+
code: string,
|
|
204
|
+
messages: KitMessages,
|
|
205
|
+
{
|
|
206
|
+
today = new Date(),
|
|
207
|
+
files,
|
|
208
|
+
}: { today?: Date | undefined; files?: ReadonlyMap<string, Attachment> | undefined } = {},
|
|
209
|
+
): string {
|
|
210
|
+
if (field.kind === "secret") return value === null || value === "" ? "" : MASK;
|
|
211
|
+
if (field.kind === "checkbox") return value === true ? messages.yes : messages.no;
|
|
212
|
+
if (value === null) return "";
|
|
213
|
+
if (Array.isArray(value)) {
|
|
214
|
+
const labels = value.map((id) =>
|
|
215
|
+
field.kind === "file"
|
|
216
|
+
? (files?.get(id)?.name ?? messages.file)
|
|
217
|
+
: (optionOf(field, id)?.label ?? id),
|
|
218
|
+
);
|
|
219
|
+
return labels.length === 0
|
|
220
|
+
? ""
|
|
221
|
+
: new Intl.ListFormat(code, { type: "conjunction" }).format(labels);
|
|
222
|
+
}
|
|
223
|
+
if (typeof value === "number") {
|
|
224
|
+
if (field.kind === "rating") return messages.rated(value, field.max ?? STARS);
|
|
225
|
+
return withUnit(formatNumber(value, code), field.unit);
|
|
226
|
+
}
|
|
227
|
+
if (typeof value !== "string") return "";
|
|
228
|
+
switch (field.kind) {
|
|
229
|
+
case "select":
|
|
230
|
+
return optionOf(field, value)?.label ?? value;
|
|
231
|
+
case "date":
|
|
232
|
+
return formatDay(value, code, today);
|
|
233
|
+
case "time":
|
|
234
|
+
return TIME.test(value) ? formatTime(value, code) : value;
|
|
235
|
+
case "datetime":
|
|
236
|
+
return formatMoment(value, code, today);
|
|
237
|
+
default:
|
|
238
|
+
return value.trim();
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
function clip(text: string): string {
|
|
243
|
+
return text.length > LABEL_MAX ? `${text.slice(0, LABEL_MAX - 1)}…` : text;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
// --- What is wrong with a value -----------------------------------------------------------
|
|
247
|
+
|
|
248
|
+
/** What is wrong with each field's value, by name; a field with nothing wrong is not in it. */
|
|
249
|
+
export function problemsOf(
|
|
250
|
+
fields: FormField[],
|
|
251
|
+
values: Values,
|
|
252
|
+
code: string,
|
|
253
|
+
messages: KitMessages,
|
|
254
|
+
): Record<string, string> {
|
|
255
|
+
const problems: Record<string, string> = {};
|
|
256
|
+
for (const field of fields) {
|
|
257
|
+
const problem = problemOf(field, values[field.name] ?? null, code, messages);
|
|
258
|
+
if (problem !== null) problems[field.name] = problem;
|
|
259
|
+
}
|
|
260
|
+
return problems;
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
/**
|
|
264
|
+
* What is wrong with a value, in words, or null: empty when it must be filled, a shape that is
|
|
265
|
+
* not an email, a phone or an address, a number out of its bounds, a day or a time the field
|
|
266
|
+
* does not offer.
|
|
267
|
+
*/
|
|
268
|
+
export function problemOf(
|
|
269
|
+
field: FormField,
|
|
270
|
+
value: FieldValue,
|
|
271
|
+
code: string,
|
|
272
|
+
messages: KitMessages,
|
|
273
|
+
): string | null {
|
|
274
|
+
if (isEmpty(field, value)) return field.required ? emptyWords(field, messages) : null;
|
|
275
|
+
const text = typeof value === "string" ? value.trim() : "";
|
|
276
|
+
switch (field.kind) {
|
|
277
|
+
case "email":
|
|
278
|
+
return EMAIL.test(text) ? null : messages.invalidEmail;
|
|
279
|
+
case "phone":
|
|
280
|
+
return PHONE.test(text) && text.replace(/\D/g, "").length >= 6 ? null : messages.invalidPhone;
|
|
281
|
+
case "url":
|
|
282
|
+
return URL_SHAPE.test(text) ? null : messages.invalidUrl;
|
|
283
|
+
case "number":
|
|
284
|
+
case "range":
|
|
285
|
+
case "rating":
|
|
286
|
+
return typeof value === "number" && Number.isFinite(value)
|
|
287
|
+
? outOfBounds(field, value, code, messages)
|
|
288
|
+
: messages.invalidNumber;
|
|
289
|
+
case "date":
|
|
290
|
+
return dayAllowed(field, text) ? null : messages.unavailableDate;
|
|
291
|
+
case "time":
|
|
292
|
+
if (!TIME.test(text)) return messages.invalidTime;
|
|
293
|
+
return slotAllowed(field.times, text) ? null : messages.unavailableTime;
|
|
294
|
+
case "datetime": {
|
|
295
|
+
const [date, time] = momentParts(text);
|
|
296
|
+
if (date === "" || time === "") return messages.chooseMoment;
|
|
297
|
+
if (!dayAllowed(field, date)) return messages.unavailableDate;
|
|
298
|
+
if (!TIME.test(time)) return messages.invalidTime;
|
|
299
|
+
return slotAllowed(field.times, time) ? null : messages.unavailableTime;
|
|
300
|
+
}
|
|
301
|
+
case "select":
|
|
302
|
+
return hasOption(field, text) ? null : messages.chooseOption;
|
|
303
|
+
case "multiselect":
|
|
304
|
+
return Array.isArray(value) && value.every((id) => hasOption(field, id))
|
|
305
|
+
? null
|
|
306
|
+
: messages.chooseOption;
|
|
307
|
+
default:
|
|
308
|
+
return null;
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
/** Whether nothing was given: no words, no pick, an unticked box, no stars. */
|
|
313
|
+
export function isEmpty(field: FormField, value: FieldValue): boolean {
|
|
314
|
+
if (value === null) return true;
|
|
315
|
+
if (field.kind === "checkbox") return value !== true;
|
|
316
|
+
if (typeof value === "string") return value.trim() === "";
|
|
317
|
+
if (Array.isArray(value)) return value.length === 0;
|
|
318
|
+
return false;
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
function emptyWords(field: FormField, messages: KitMessages): string {
|
|
322
|
+
switch (field.kind) {
|
|
323
|
+
case "date":
|
|
324
|
+
return messages.chooseDate;
|
|
325
|
+
case "time":
|
|
326
|
+
return messages.chooseTime;
|
|
327
|
+
case "datetime":
|
|
328
|
+
return messages.chooseMoment;
|
|
329
|
+
case "select":
|
|
330
|
+
case "multiselect":
|
|
331
|
+
return messages.chooseOption;
|
|
332
|
+
case "rating":
|
|
333
|
+
return messages.chooseRating;
|
|
334
|
+
case "checkbox":
|
|
335
|
+
return messages.check;
|
|
336
|
+
case "file":
|
|
337
|
+
return messages.chooseFile;
|
|
338
|
+
default:
|
|
339
|
+
return messages.required;
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
function outOfBounds(
|
|
344
|
+
field: FormField,
|
|
345
|
+
value: number,
|
|
346
|
+
code: string,
|
|
347
|
+
messages: KitMessages,
|
|
348
|
+
): string | null {
|
|
349
|
+
const { min, max } = field;
|
|
350
|
+
if (min !== undefined && value < min) return messages.atLeast(formatNumber(min, code));
|
|
351
|
+
if (max !== undefined && value > max) return messages.atMost(formatNumber(max, code));
|
|
352
|
+
return null;
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
export function optionOf(field: FormField, id: string): Option | undefined {
|
|
356
|
+
return field.options?.find((option) => option.id === id);
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
function hasOption(field: FormField, id: string): boolean {
|
|
360
|
+
return optionOf(field, id) !== undefined;
|
|
361
|
+
}
|
package/src/tint.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/** The tints an agent's tile can take: the soft ones, never a state or the accent. */
|
|
2
|
+
export type AgentTint = "sky" | "rose" | "sand";
|
|
3
|
+
|
|
4
|
+
const TINTS: readonly AgentTint[] = ["sky", "rose", "sand"];
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* The tint an agent keeps wherever it appears (a squad's map, its profile, its card): picked from
|
|
8
|
+
* its id, so a rename changes nothing, and spread evenly over the three.
|
|
9
|
+
*/
|
|
10
|
+
export function agentTint(id: string): AgentTint {
|
|
11
|
+
let hash = 0;
|
|
12
|
+
for (const char of id) hash = (hash * 31 + (char.codePointAt(0) ?? 0)) >>> 0;
|
|
13
|
+
return TINTS[hash % TINTS.length] ?? "sky";
|
|
14
|
+
}
|