@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,341 @@
|
|
|
1
|
+
import { formatSize } from "./numbers.js";
|
|
2
|
+
import { useKit, useParts } from "./context.js";
|
|
3
|
+
import { failureOf, familyOf, isAbort, limitsOf, refusalOf } from "./uploads.js";
|
|
4
|
+
import { FileMark } from "./FileMark.js";
|
|
5
|
+
import { ariaOf } from "./Field.js";
|
|
6
|
+
import { useEffect, useRef, useState } from "react";
|
|
7
|
+
import { ArrowClockwiseIcon, UploadSimpleIcon, XIcon } from "@phosphor-icons/react";
|
|
8
|
+
import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
|
|
9
|
+
//#region src/kit/FileField.tsx
|
|
10
|
+
/**
|
|
11
|
+
* A file as a chip: the glyph of its family, its name, and under it its size, how much has gone while it uploads (a line filling at its foot), or what went wrong in the danger
|
|
12
|
+
* tone; at its end, trying it again and taking it away. With `onOpen` it opens on a click.
|
|
13
|
+
*/
|
|
14
|
+
function FileChip({ name, size, type = "", progress, problem, onOpen, onRetry, onRemove }) {
|
|
15
|
+
const { code, messages } = useKit();
|
|
16
|
+
const part = useParts();
|
|
17
|
+
const family = familyOf(name, type);
|
|
18
|
+
const meta = problem ?? (progress !== void 0 ? `${messages.uploading} ${new Intl.NumberFormat(code, { style: "percent" }).format(progress)}` : size !== void 0 ? formatSize(size, code) : "");
|
|
19
|
+
const body = /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx(FileMark, {
|
|
20
|
+
name,
|
|
21
|
+
type,
|
|
22
|
+
size: 28
|
|
23
|
+
}), /* @__PURE__ */ jsxs("span", {
|
|
24
|
+
className: part("sc-attachment__text"),
|
|
25
|
+
children: [/* @__PURE__ */ jsx("span", {
|
|
26
|
+
className: part("sc-attachment__name"),
|
|
27
|
+
title: name,
|
|
28
|
+
children: name
|
|
29
|
+
}), meta !== "" && /* @__PURE__ */ jsx("span", {
|
|
30
|
+
className: part("sc-attachment__meta"),
|
|
31
|
+
children: meta
|
|
32
|
+
})]
|
|
33
|
+
})] });
|
|
34
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
35
|
+
"data-family": family,
|
|
36
|
+
className: part("sc-attachment", ...problem ? ["sc-attachment--failed"] : []),
|
|
37
|
+
children: [
|
|
38
|
+
onOpen ? /* @__PURE__ */ jsx("button", {
|
|
39
|
+
type: "button",
|
|
40
|
+
onClick: onOpen,
|
|
41
|
+
"aria-label": messages.open(name),
|
|
42
|
+
className: part("sc-attachment__main"),
|
|
43
|
+
children: body
|
|
44
|
+
}) : /* @__PURE__ */ jsx("span", {
|
|
45
|
+
className: part("sc-attachment__main"),
|
|
46
|
+
children: body
|
|
47
|
+
}),
|
|
48
|
+
onRetry && /* @__PURE__ */ jsx("button", {
|
|
49
|
+
type: "button",
|
|
50
|
+
onClick: onRetry,
|
|
51
|
+
"aria-label": messages.retry,
|
|
52
|
+
title: messages.retry,
|
|
53
|
+
className: part("sc-attachment__action"),
|
|
54
|
+
children: /* @__PURE__ */ jsx(ArrowClockwiseIcon, {
|
|
55
|
+
"aria-hidden": true,
|
|
56
|
+
weight: "bold"
|
|
57
|
+
})
|
|
58
|
+
}),
|
|
59
|
+
onRemove && /* @__PURE__ */ jsx("button", {
|
|
60
|
+
type: "button",
|
|
61
|
+
onClick: onRemove,
|
|
62
|
+
"aria-label": messages.remove(name),
|
|
63
|
+
title: messages.remove(name),
|
|
64
|
+
className: part("sc-attachment__action"),
|
|
65
|
+
children: /* @__PURE__ */ jsx(XIcon, {
|
|
66
|
+
"aria-hidden": true,
|
|
67
|
+
weight: "bold"
|
|
68
|
+
})
|
|
69
|
+
}),
|
|
70
|
+
progress !== void 0 && /* @__PURE__ */ jsx("span", {
|
|
71
|
+
role: "progressbar",
|
|
72
|
+
"aria-label": name,
|
|
73
|
+
"aria-valuemin": 0,
|
|
74
|
+
"aria-valuemax": 100,
|
|
75
|
+
"aria-valuenow": Math.round(progress * 100),
|
|
76
|
+
style: { "--_progress": progress },
|
|
77
|
+
className: part("sc-attachment__bar")
|
|
78
|
+
})
|
|
79
|
+
]
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
/** Files already sent, as chips in a row that wraps; with `onOpen`, each opens on a click. */
|
|
83
|
+
function FileChips({ files, onOpen }) {
|
|
84
|
+
const part = useParts();
|
|
85
|
+
return /* @__PURE__ */ jsx("ul", {
|
|
86
|
+
className: part("sc-attachments"),
|
|
87
|
+
children: files.map((file) => /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsx(FileChip, {
|
|
88
|
+
name: file.name,
|
|
89
|
+
size: file.size,
|
|
90
|
+
type: file.media_type,
|
|
91
|
+
onOpen: onOpen && (() => onOpen(file))
|
|
92
|
+
}) }, file.id))
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
let picks = 0;
|
|
96
|
+
/** A file already in, by its id: what `useUploads` starts from. */
|
|
97
|
+
function uploaded(id, known) {
|
|
98
|
+
return {
|
|
99
|
+
key: ++picks,
|
|
100
|
+
name: known?.name ?? "",
|
|
101
|
+
size: known?.size,
|
|
102
|
+
type: known?.media_type ?? "",
|
|
103
|
+
state: "done",
|
|
104
|
+
progress: 1,
|
|
105
|
+
id,
|
|
106
|
+
problem: null,
|
|
107
|
+
file: null
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Files picked and sent at once through `host`: each is refused before it goes when it is not a
|
|
112
|
+
* kind taken, is too heavy, or is one too many; then it is on its way, then in (its id) or failed
|
|
113
|
+
* (to be tried again). With `multiple` false a new pick replaces what was there. Whatever is on
|
|
114
|
+
* its way when its file goes (taken away, cleared, the component gone) is let go.
|
|
115
|
+
*/
|
|
116
|
+
function useUploads(host, { accept, maxMb, multiple = true, max = Infinity }, start = () => []) {
|
|
117
|
+
const { code, messages } = useKit();
|
|
118
|
+
const [items, setItems] = useState(start);
|
|
119
|
+
const running = useRef(/* @__PURE__ */ new Map());
|
|
120
|
+
useEffect(() => {
|
|
121
|
+
const now = running.current;
|
|
122
|
+
return () => {
|
|
123
|
+
for (const controller of now.values()) controller.abort();
|
|
124
|
+
now.clear();
|
|
125
|
+
};
|
|
126
|
+
}, []);
|
|
127
|
+
const change = (key, patch) => {
|
|
128
|
+
setItems((now) => now.map((item) => item.key === key ? {
|
|
129
|
+
...item,
|
|
130
|
+
...patch
|
|
131
|
+
} : item));
|
|
132
|
+
};
|
|
133
|
+
const letGo = (key) => {
|
|
134
|
+
running.current.get(key)?.abort();
|
|
135
|
+
running.current.delete(key);
|
|
136
|
+
};
|
|
137
|
+
const send = (key, file) => {
|
|
138
|
+
if (!host) return;
|
|
139
|
+
const controller = new AbortController();
|
|
140
|
+
running.current.set(key, controller);
|
|
141
|
+
host.upload(file, (progress) => change(key, { progress }), controller.signal).then((stored) => {
|
|
142
|
+
change(key, {
|
|
143
|
+
state: "done",
|
|
144
|
+
id: stored.id,
|
|
145
|
+
progress: 1,
|
|
146
|
+
file: null
|
|
147
|
+
});
|
|
148
|
+
}, (error) => {
|
|
149
|
+
if (isAbort(error)) return;
|
|
150
|
+
change(key, {
|
|
151
|
+
state: "failed",
|
|
152
|
+
problem: failureOf(error, maxMb, code, messages)
|
|
153
|
+
});
|
|
154
|
+
}).finally(() => {
|
|
155
|
+
if (running.current.get(key) === controller) running.current.delete(key);
|
|
156
|
+
});
|
|
157
|
+
};
|
|
158
|
+
const add = (files) => {
|
|
159
|
+
if (!host || files.length === 0) return;
|
|
160
|
+
const picked = multiple ? files : files.slice(0, 1);
|
|
161
|
+
const kept = multiple ? items.filter((item) => item.state !== "refused").length : 0;
|
|
162
|
+
const fresh = picked.map((file, index) => {
|
|
163
|
+
const problem = kept + index >= max ? messages.tooMany(max) : refusalOf(file, accept, maxMb, code, messages);
|
|
164
|
+
return {
|
|
165
|
+
key: ++picks,
|
|
166
|
+
name: file.name || messages.file,
|
|
167
|
+
size: file.size,
|
|
168
|
+
type: file.type,
|
|
169
|
+
state: problem === null ? "uploading" : "refused",
|
|
170
|
+
progress: 0,
|
|
171
|
+
id: null,
|
|
172
|
+
problem,
|
|
173
|
+
file: problem === null ? file : null
|
|
174
|
+
};
|
|
175
|
+
});
|
|
176
|
+
if (!multiple) for (const key of running.current.keys()) letGo(key);
|
|
177
|
+
setItems((now) => multiple ? [...now, ...fresh] : fresh);
|
|
178
|
+
for (const item of fresh) if (item.file) send(item.key, item.file);
|
|
179
|
+
};
|
|
180
|
+
const remove = (key) => {
|
|
181
|
+
letGo(key);
|
|
182
|
+
setItems((now) => now.filter((item) => item.key !== key));
|
|
183
|
+
};
|
|
184
|
+
const retry = (key) => {
|
|
185
|
+
const item = items.find((each) => each.key === key);
|
|
186
|
+
if (item?.state !== "failed" || !item.file) return;
|
|
187
|
+
change(key, {
|
|
188
|
+
state: "uploading",
|
|
189
|
+
progress: 0,
|
|
190
|
+
problem: null
|
|
191
|
+
});
|
|
192
|
+
send(key, item.file);
|
|
193
|
+
};
|
|
194
|
+
const clear = () => {
|
|
195
|
+
for (const key of [...running.current.keys()]) letGo(key);
|
|
196
|
+
setItems([]);
|
|
197
|
+
};
|
|
198
|
+
return {
|
|
199
|
+
items,
|
|
200
|
+
ids: items.flatMap((item) => item.state === "done" && item.id ? [item.id] : []),
|
|
201
|
+
waiting: items.some((item) => item.state === "uploading") ? "uploading" : items.some((item) => item.state === "failed" || item.state === "refused") ? "failed" : null,
|
|
202
|
+
add,
|
|
203
|
+
remove,
|
|
204
|
+
retry,
|
|
205
|
+
clear
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* The files picked, as chips: each with how it goes; taken away while they can be, the failed
|
|
210
|
+
* tried again; once in, a name not known here is read from the host's files, and opens there.
|
|
211
|
+
*/
|
|
212
|
+
function UploadChips({ uploads, host, closed = false }) {
|
|
213
|
+
const { messages } = useKit();
|
|
214
|
+
const part = useParts();
|
|
215
|
+
return /* @__PURE__ */ jsx("ul", {
|
|
216
|
+
className: part("sc-attachments"),
|
|
217
|
+
children: uploads.items.map((item) => {
|
|
218
|
+
const stored = item.id !== null ? host?.known.get(item.id) : void 0;
|
|
219
|
+
const { open } = host ?? {};
|
|
220
|
+
return /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsx(FileChip, {
|
|
221
|
+
name: stored?.name ?? (item.name || messages.file),
|
|
222
|
+
size: stored?.size ?? item.size,
|
|
223
|
+
type: stored?.media_type ?? item.type,
|
|
224
|
+
progress: item.state === "uploading" ? item.progress : void 0,
|
|
225
|
+
problem: item.problem,
|
|
226
|
+
onOpen: stored && open && (() => open(stored)),
|
|
227
|
+
onRetry: !closed && item.state === "failed" ? () => uploads.retry(item.key) : void 0,
|
|
228
|
+
onRemove: closed ? void 0 : () => uploads.remove(item.key)
|
|
229
|
+
}) }, item.key);
|
|
230
|
+
})
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
/** Whether what is dragged carries files (not words, not a link). */
|
|
234
|
+
function carriesFiles(event) {
|
|
235
|
+
return [...event.dataTransfer.types].includes("Files");
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Files to give: a zone to drop them on or press to choose them, saying what it takes; each file
|
|
239
|
+
* uploads at once (a line fills under it), then sits as a chip to take away; what is wrong with
|
|
240
|
+
* one (too heavy, a kind not taken, an upload that failed, to try again) says so on its chip.
|
|
241
|
+
* The value is the ids of the files in. One file unless `multiple`: once it is in, the zone
|
|
242
|
+
* steps aside until it is taken away. Closed, the chips are read, and open where the host shows
|
|
243
|
+
* files.
|
|
244
|
+
*/
|
|
245
|
+
function FileField({ value, onChange, files, accept, multiple = false, maxMb, onWait, ...control }) {
|
|
246
|
+
const { code, messages } = useKit();
|
|
247
|
+
const part = useParts();
|
|
248
|
+
const picker = useRef(null);
|
|
249
|
+
const [over, setOver] = useState(false);
|
|
250
|
+
const uploads = useUploads(files, {
|
|
251
|
+
accept,
|
|
252
|
+
maxMb,
|
|
253
|
+
multiple
|
|
254
|
+
}, () => value.map((id) => uploaded(id, files?.known.get(id))));
|
|
255
|
+
const closed = control.disabled === true || files === void 0;
|
|
256
|
+
const sent = useRef(value.join(" "));
|
|
257
|
+
const ids = uploads.ids;
|
|
258
|
+
useEffect(() => {
|
|
259
|
+
const now = ids.join(" ");
|
|
260
|
+
if (now === sent.current) return;
|
|
261
|
+
sent.current = now;
|
|
262
|
+
onChange(ids);
|
|
263
|
+
}, [ids, onChange]);
|
|
264
|
+
const wait = uploads.waiting === "uploading" ? messages.stillUploading : uploads.waiting === "failed" ? messages.fixFiles : null;
|
|
265
|
+
useEffect(() => {
|
|
266
|
+
onWait?.(wait);
|
|
267
|
+
}, [wait, onWait]);
|
|
268
|
+
const missing = ids.filter((id) => !files?.known.has(id)).join(" ");
|
|
269
|
+
useEffect(() => {
|
|
270
|
+
if (missing !== "") files?.find?.(missing.split(" "));
|
|
271
|
+
}, [missing, files]);
|
|
272
|
+
const held = uploads.items.some((item) => item.state !== "refused" && item.state !== "failed");
|
|
273
|
+
const zone = closed ? uploads.items.length === 0 : multiple || !held;
|
|
274
|
+
const { id, labelledBy } = control;
|
|
275
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
276
|
+
className: part("sc-upload"),
|
|
277
|
+
children: [
|
|
278
|
+
zone && /* @__PURE__ */ jsxs("button", {
|
|
279
|
+
type: "button",
|
|
280
|
+
id,
|
|
281
|
+
disabled: closed,
|
|
282
|
+
"data-drop": true,
|
|
283
|
+
"data-over": over || void 0,
|
|
284
|
+
"data-invalid": control.invalid || void 0,
|
|
285
|
+
...ariaOf(control),
|
|
286
|
+
"aria-labelledby": labelledBy === void 0 || id === void 0 ? labelledBy : `${labelledBy} ${id}`,
|
|
287
|
+
"aria-required": void 0,
|
|
288
|
+
onClick: () => picker.current?.click(),
|
|
289
|
+
onDragOver: (event) => {
|
|
290
|
+
if (closed || !carriesFiles(event)) return;
|
|
291
|
+
event.preventDefault();
|
|
292
|
+
event.dataTransfer.dropEffect = "copy";
|
|
293
|
+
setOver(true);
|
|
294
|
+
},
|
|
295
|
+
onDragLeave: () => {
|
|
296
|
+
setOver(false);
|
|
297
|
+
},
|
|
298
|
+
onDrop: (event) => {
|
|
299
|
+
if (closed) return;
|
|
300
|
+
event.preventDefault();
|
|
301
|
+
setOver(false);
|
|
302
|
+
uploads.add([...event.dataTransfer.files]);
|
|
303
|
+
},
|
|
304
|
+
className: part("sc-upload__zone"),
|
|
305
|
+
children: [/* @__PURE__ */ jsx("span", {
|
|
306
|
+
"aria-hidden": true,
|
|
307
|
+
className: part("sc-upload__icon"),
|
|
308
|
+
children: /* @__PURE__ */ jsx(UploadSimpleIcon, { weight: "bold" })
|
|
309
|
+
}), /* @__PURE__ */ jsxs("span", {
|
|
310
|
+
className: part("sc-upload__text"),
|
|
311
|
+
children: [/* @__PURE__ */ jsx("strong", { children: messages.upload(multiple) }), /* @__PURE__ */ jsxs("small", { children: [
|
|
312
|
+
messages.drop,
|
|
313
|
+
". ",
|
|
314
|
+
limitsOf(accept, maxMb, code, messages)
|
|
315
|
+
] })]
|
|
316
|
+
})]
|
|
317
|
+
}),
|
|
318
|
+
/* @__PURE__ */ jsx("input", {
|
|
319
|
+
ref: picker,
|
|
320
|
+
type: "file",
|
|
321
|
+
hidden: true,
|
|
322
|
+
tabIndex: -1,
|
|
323
|
+
accept: accept?.join(","),
|
|
324
|
+
multiple,
|
|
325
|
+
onChange: (event) => {
|
|
326
|
+
uploads.add([...event.target.files ?? []]);
|
|
327
|
+
event.target.value = "";
|
|
328
|
+
}
|
|
329
|
+
}),
|
|
330
|
+
uploads.items.length > 0 && /* @__PURE__ */ jsx(UploadChips, {
|
|
331
|
+
uploads,
|
|
332
|
+
host: files,
|
|
333
|
+
closed
|
|
334
|
+
})
|
|
335
|
+
]
|
|
336
|
+
});
|
|
337
|
+
}
|
|
338
|
+
//#endregion
|
|
339
|
+
export { FileChip, FileChips, FileField, UploadChips, carriesFiles, uploaded, useUploads };
|
|
340
|
+
|
|
341
|
+
//# sourceMappingURL=FileField.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FileField.js","names":[],"sources":["../../src/kit/FileField.tsx"],"sourcesContent":["import { ArrowClockwiseIcon, UploadSimpleIcon, XIcon } from \"@phosphor-icons/react\";\nimport { useEffect, useRef, useState, type CSSProperties, type DragEvent } from \"react\";\n\nimport type { Attachment } from \"../types\";\nimport { useKit, useParts } from \"./context\";\nimport { ariaOf, type ControlBase } from \"./Field\";\nimport { FileMark } from \"./FileMark\";\nimport { formatSize } from \"./numbers\";\nimport { failureOf, familyOf, isAbort, limitsOf, refusalOf, type FileHost } from \"./uploads\";\n\n// --- One file -----------------------------------------------------------------------------\n\nexport interface FileChipProps {\n name: string;\n /** Its weight in bytes; none while it is not known. */\n size?: number | undefined;\n /** Its type, for its glyph when its name has no extension. */\n type?: string | undefined;\n /** On its way: how much of it has gone, from 0 to 1. */\n progress?: number | undefined;\n /** What went wrong with it, in place of its size. */\n problem?: string | null | undefined;\n /** Opens it: the chip is a button. */\n onOpen?: (() => void) | undefined;\n onRetry?: (() => void) | undefined;\n onRemove?: (() => void) | undefined;\n}\n\n/**\n * A file as a chip: the glyph of its family, its name, and under it its size, how much has gone while it uploads (a line filling at its foot), or what went wrong in the danger\n * tone; at its end, trying it again and taking it away. With `onOpen` it opens on a click.\n */\nexport function FileChip({\n name,\n size,\n type = \"\",\n progress,\n problem,\n onOpen,\n onRetry,\n onRemove,\n}: FileChipProps) {\n const { code, messages } = useKit();\n const part = useParts();\n const family = familyOf(name, type);\n // The name says its extension; under it, how big it is, or how far it has gone.\n const meta =\n problem ??\n (progress !== undefined\n ? `${messages.uploading} ${new Intl.NumberFormat(code, { style: \"percent\" }).format(progress)}`\n : size !== undefined\n ? formatSize(size, code)\n : \"\");\n const body = (\n <>\n <FileMark name={name} type={type} size={28} />\n <span className={part(\"sc-attachment__text\")}>\n <span className={part(\"sc-attachment__name\")} title={name}>\n {name}\n </span>\n {meta !== \"\" && <span className={part(\"sc-attachment__meta\")}>{meta}</span>}\n </span>\n </>\n );\n return (\n <div\n data-family={family}\n className={part(\"sc-attachment\", ...(problem ? ([\"sc-attachment--failed\"] as const) : []))}\n >\n {onOpen ? (\n <button\n type=\"button\"\n onClick={onOpen}\n aria-label={messages.open(name)}\n className={part(\"sc-attachment__main\")}\n >\n {body}\n </button>\n ) : (\n <span className={part(\"sc-attachment__main\")}>{body}</span>\n )}\n {onRetry && (\n <button\n type=\"button\"\n onClick={onRetry}\n aria-label={messages.retry}\n title={messages.retry}\n className={part(\"sc-attachment__action\")}\n >\n <ArrowClockwiseIcon aria-hidden weight=\"bold\" />\n </button>\n )}\n {onRemove && (\n <button\n type=\"button\"\n onClick={onRemove}\n aria-label={messages.remove(name)}\n title={messages.remove(name)}\n className={part(\"sc-attachment__action\")}\n >\n <XIcon aria-hidden weight=\"bold\" />\n </button>\n )}\n {progress !== undefined && (\n <span\n role=\"progressbar\"\n aria-label={name}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-valuenow={Math.round(progress * 100)}\n style={{ \"--_progress\": progress } as CSSProperties}\n className={part(\"sc-attachment__bar\")}\n />\n )}\n </div>\n );\n}\n\n/** Files already sent, as chips in a row that wraps; with `onOpen`, each opens on a click. */\nexport function FileChips({\n files,\n onOpen,\n}: {\n files: readonly Attachment[];\n onOpen?: ((file: Attachment) => void) | undefined;\n}) {\n const part = useParts();\n return (\n <ul className={part(\"sc-attachments\")}>\n {files.map((file) => (\n <li key={file.id}>\n <FileChip\n name={file.name}\n size={file.size}\n type={file.media_type}\n onOpen={onOpen && (() => onOpen(file))}\n />\n </li>\n ))}\n </ul>\n );\n}\n\n// --- Files on their way -------------------------------------------------------------------\n\n/** A file picked here, on its way or in: what its chip draws. */\nexport interface Upload {\n /** Tells it from the others here. */\n key: number;\n name: string;\n size: number | undefined;\n type: string;\n /**\n * uploading: on its way (`progress`, 0 to 1); done: stored as `id`; failed: its upload failed,\n * to be tried again; refused: never sent, a kind not taken or too heavy (`problem` says which).\n */\n state: \"uploading\" | \"done\" | \"failed\" | \"refused\";\n progress: number;\n id: string | null;\n problem: string | null;\n /** The bytes, kept to try again. */\n file: File | null;\n}\n\n/** What files may be picked: their kinds, their most in MB, one or many, how many at most. */\nexport interface UploadRules {\n accept?: readonly string[] | undefined;\n maxMb?: number | undefined;\n /** False: one file, a new pick replacing it. */\n multiple?: boolean | undefined;\n max?: number | undefined;\n}\n\n/** Files picked and how each goes, and what can be done with them. */\nexport interface Uploads {\n items: readonly Upload[];\n /** The ids of the files in, in the order they were picked. */\n ids: string[];\n /** What the files still wait on: one on its way, or one that failed or was refused; null once all are in. */\n waiting: \"uploading\" | \"failed\" | null;\n add: (files: readonly File[]) => void;\n remove: (key: number) => void;\n retry: (key: number) => void;\n /** Takes them all away, letting go of any on its way. */\n clear: () => void;\n}\n\nlet picks = 0;\n\n/** A file already in, by its id: what `useUploads` starts from. */\nexport function uploaded(id: string, known: Attachment | undefined): Upload {\n return {\n key: ++picks,\n name: known?.name ?? \"\",\n size: known?.size,\n type: known?.media_type ?? \"\",\n state: \"done\",\n progress: 1,\n id,\n problem: null,\n file: null,\n };\n}\n\n/**\n * Files picked and sent at once through `host`: each is refused before it goes when it is not a\n * kind taken, is too heavy, or is one too many; then it is on its way, then in (its id) or failed\n * (to be tried again). With `multiple` false a new pick replaces what was there. Whatever is on\n * its way when its file goes (taken away, cleared, the component gone) is let go.\n */\nexport function useUploads(\n host: FileHost | undefined,\n { accept, maxMb, multiple = true, max = Infinity }: UploadRules,\n start: () => Upload[] = () => [],\n): Uploads {\n const { code, messages } = useKit();\n const [items, setItems] = useState<Upload[]>(start);\n const running = useRef(new Map<number, AbortController>());\n\n useEffect(() => {\n const now = running.current;\n return () => {\n for (const controller of now.values()) controller.abort();\n now.clear();\n };\n }, []);\n\n const change = (key: number, patch: Partial<Upload>) => {\n setItems((now) => now.map((item) => (item.key === key ? { ...item, ...patch } : item)));\n };\n\n const letGo = (key: number) => {\n running.current.get(key)?.abort();\n running.current.delete(key);\n };\n\n const send = (key: number, file: File) => {\n if (!host) return;\n const controller = new AbortController();\n running.current.set(key, controller);\n host\n .upload(file, (progress) => change(key, { progress }), controller.signal)\n .then(\n (stored) => {\n change(key, { state: \"done\", id: stored.id, progress: 1, file: null });\n },\n (error: unknown) => {\n if (isAbort(error)) return;\n change(key, { state: \"failed\", problem: failureOf(error, maxMb, code, messages) });\n },\n )\n .finally(() => {\n if (running.current.get(key) === controller) running.current.delete(key);\n });\n };\n\n const add = (files: readonly File[]) => {\n if (!host || files.length === 0) return;\n const picked = multiple ? files : files.slice(0, 1);\n const kept = multiple ? items.filter((item) => item.state !== \"refused\").length : 0;\n const fresh = picked.map((file, index): Upload => {\n const problem =\n kept + index >= max\n ? messages.tooMany(max)\n : refusalOf(file, accept, maxMb, code, messages);\n return {\n key: ++picks,\n name: file.name || messages.file,\n size: file.size,\n type: file.type,\n state: problem === null ? \"uploading\" : \"refused\",\n progress: 0,\n id: null,\n problem,\n file: problem === null ? file : null,\n };\n });\n if (!multiple) for (const key of running.current.keys()) letGo(key);\n setItems((now) => (multiple ? [...now, ...fresh] : fresh));\n for (const item of fresh) if (item.file) send(item.key, item.file);\n };\n\n const remove = (key: number) => {\n letGo(key);\n setItems((now) => now.filter((item) => item.key !== key));\n };\n\n const retry = (key: number) => {\n const item = items.find((each) => each.key === key);\n if (item?.state !== \"failed\" || !item.file) return;\n change(key, { state: \"uploading\", progress: 0, problem: null });\n send(key, item.file);\n };\n\n const clear = () => {\n for (const key of [...running.current.keys()]) letGo(key);\n setItems([]);\n };\n\n const ids = items.flatMap((item) => (item.state === \"done\" && item.id ? [item.id] : []));\n const waiting = items.some((item) => item.state === \"uploading\")\n ? \"uploading\"\n : items.some((item) => item.state === \"failed\" || item.state === \"refused\")\n ? \"failed\"\n : null;\n return { items, ids, waiting, add, remove, retry, clear };\n}\n\n/**\n * The files picked, as chips: each with how it goes; taken away while they can be, the failed\n * tried again; once in, a name not known here is read from the host's files, and opens there.\n */\nexport function UploadChips({\n uploads,\n host,\n closed = false,\n}: {\n uploads: Uploads;\n host: FileHost | undefined;\n closed?: boolean | undefined;\n}) {\n const { messages } = useKit();\n const part = useParts();\n return (\n <ul className={part(\"sc-attachments\")}>\n {uploads.items.map((item) => {\n const stored = item.id !== null ? host?.known.get(item.id) : undefined;\n const { open } = host ?? {};\n return (\n <li key={item.key}>\n <FileChip\n name={stored?.name ?? (item.name || messages.file)}\n size={stored?.size ?? item.size}\n type={stored?.media_type ?? item.type}\n progress={item.state === \"uploading\" ? item.progress : undefined}\n problem={item.problem}\n onOpen={stored && open && (() => open(stored))}\n onRetry={\n !closed && item.state === \"failed\" ? () => uploads.retry(item.key) : undefined\n }\n onRemove={closed ? undefined : () => uploads.remove(item.key)}\n />\n </li>\n );\n })}\n </ul>\n );\n}\n\n/** Whether what is dragged carries files (not words, not a link). */\nexport function carriesFiles(event: DragEvent): boolean {\n return [...event.dataTransfer.types].includes(\"Files\");\n}\n\n// --- The field ----------------------------------------------------------------------------\n\nexport interface FileFieldProps extends ControlBase {\n /** The ids of the files in. */\n value: string[];\n onChange: (ids: string[]) => void;\n /** Where its files go and are found; none: it takes none (closed). */\n files?: FileHost | undefined;\n /** The kinds it takes: types, families (\"image/*\"), extensions (\".xlsx\"); none: any. */\n accept?: readonly string[] | undefined;\n multiple?: boolean | undefined;\n /** The most a file may weigh, in MB (50 at most). */\n maxMb?: number | undefined;\n /**\n * Hears what the field still waits on before its form may go, in words (a file on its way,\n * one that failed), and null once nothing.\n */\n onWait?: ((problem: string | null) => void) | undefined;\n}\n\n/**\n * Files to give: a zone to drop them on or press to choose them, saying what it takes; each file\n * uploads at once (a line fills under it), then sits as a chip to take away; what is wrong with\n * one (too heavy, a kind not taken, an upload that failed, to try again) says so on its chip.\n * The value is the ids of the files in. One file unless `multiple`: once it is in, the zone\n * steps aside until it is taken away. Closed, the chips are read, and open where the host shows\n * files.\n */\nexport function FileField({\n value,\n onChange,\n files,\n accept,\n multiple = false,\n maxMb,\n onWait,\n ...control\n}: FileFieldProps) {\n const { code, messages } = useKit();\n const part = useParts();\n const picker = useRef<HTMLInputElement>(null);\n const [over, setOver] = useState(false);\n const uploads = useUploads(files, { accept, maxMb, multiple }, () =>\n value.map((id) => uploaded(id, files?.known.get(id))),\n );\n const closed = control.disabled === true || files === undefined;\n\n // The ids go up whenever the files in change.\n const sent = useRef(value.join(\" \"));\n const ids = uploads.ids;\n useEffect(() => {\n const now = ids.join(\" \");\n if (now === sent.current) return;\n sent.current = now;\n onChange(ids);\n }, [ids, onChange]);\n\n const wait =\n uploads.waiting === \"uploading\"\n ? messages.stillUploading\n : uploads.waiting === \"failed\"\n ? messages.fixFiles\n : null;\n useEffect(() => {\n onWait?.(wait);\n }, [wait, onWait]);\n\n // Files in whose names are not known here are asked for, once.\n const missing = ids.filter((id) => !files?.known.has(id)).join(\" \");\n useEffect(() => {\n if (missing !== \"\") files?.find?.(missing.split(\" \"));\n }, [missing, files]);\n\n const held = uploads.items.some((item) => item.state !== \"refused\" && item.state !== \"failed\");\n const zone = closed ? uploads.items.length === 0 : multiple || !held;\n const { id, labelledBy } = control;\n\n return (\n <div className={part(\"sc-upload\")}>\n {zone && (\n <button\n type=\"button\"\n id={id}\n disabled={closed}\n data-drop\n data-over={over || undefined}\n data-invalid={control.invalid || undefined}\n {...ariaOf(control)}\n // Its name is its label and what it says.\n aria-labelledby={\n labelledBy === undefined || id === undefined ? labelledBy : `${labelledBy} ${id}`\n }\n aria-required={undefined}\n onClick={() => picker.current?.click()}\n onDragOver={(event) => {\n if (closed || !carriesFiles(event)) return;\n event.preventDefault();\n event.dataTransfer.dropEffect = \"copy\";\n setOver(true);\n }}\n onDragLeave={() => {\n setOver(false);\n }}\n onDrop={(event) => {\n if (closed) return;\n event.preventDefault();\n setOver(false);\n uploads.add([...event.dataTransfer.files]);\n }}\n className={part(\"sc-upload__zone\")}\n >\n <span aria-hidden className={part(\"sc-upload__icon\")}>\n <UploadSimpleIcon weight=\"bold\" />\n </span>\n <span className={part(\"sc-upload__text\")}>\n <strong>{messages.upload(multiple)}</strong>\n <small>\n {messages.drop}. {limitsOf(accept, maxMb, code, messages)}\n </small>\n </span>\n </button>\n )}\n <input\n ref={picker}\n type=\"file\"\n hidden\n tabIndex={-1}\n accept={accept?.join(\",\")}\n multiple={multiple}\n onChange={(event) => {\n uploads.add([...(event.target.files ?? [])]);\n event.target.value = \"\";\n }}\n />\n {uploads.items.length > 0 && <UploadChips uploads={uploads} host={files} closed={closed} />}\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
//#region src/kit/FileMark.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* A file's mark: the glyph of its family, bare, by its name's extension (then its type), the
|
|
4
|
+
* common formats in their own tint (a PDF rose, a sheet green, a document blue, slides amber, a
|
|
5
|
+
* picture sand), the rest in the muted ink. It keeps `Mark`'s square.
|
|
6
|
+
*/
|
|
7
|
+
export declare function FileMark({ name, type, size, className }: {
|
|
8
|
+
name: string;
|
|
9
|
+
/** Its media type, when the name says nothing. */
|
|
10
|
+
type?: string | undefined;
|
|
11
|
+
size?: number | undefined;
|
|
12
|
+
className?: string | undefined;
|
|
13
|
+
}): import("react").JSX.Element;
|
|
14
|
+
//#endregion
|
|
15
|
+
//# sourceMappingURL=FileMark.d.ts.map
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { Mark } from "./Mark.js";
|
|
2
|
+
import { familyOf } from "./uploads.js";
|
|
3
|
+
import { FileAudioIcon, FileDocIcon, FileIcon, FileImageIcon, FilePdfIcon, FilePptIcon, FileTextIcon, FileVideoIcon, FileXlsIcon, FileZipIcon } from "@phosphor-icons/react";
|
|
4
|
+
import { jsx } from "react/jsx-runtime";
|
|
5
|
+
//#region src/kit/FileMark.tsx
|
|
6
|
+
/** Each family's glyph: the format's own sheet (PDF, Word, Excel, PowerPoint), a picture, a clip. */
|
|
7
|
+
const GLYPHS = {
|
|
8
|
+
image: FileImageIcon,
|
|
9
|
+
pdf: FilePdfIcon,
|
|
10
|
+
sheet: FileXlsIcon,
|
|
11
|
+
doc: FileDocIcon,
|
|
12
|
+
slides: FilePptIcon,
|
|
13
|
+
text: FileTextIcon,
|
|
14
|
+
archive: FileZipIcon,
|
|
15
|
+
audio: FileAudioIcon,
|
|
16
|
+
video: FileVideoIcon,
|
|
17
|
+
other: FileIcon
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* A file's mark: the glyph of its family, bare, by its name's extension (then its type), the
|
|
21
|
+
* common formats in their own tint (a PDF rose, a sheet green, a document blue, slides amber, a
|
|
22
|
+
* picture sand), the rest in the muted ink. It keeps `Mark`'s square.
|
|
23
|
+
*/
|
|
24
|
+
function FileMark({ name, type = "", size, className }) {
|
|
25
|
+
const family = familyOf(name, type);
|
|
26
|
+
const Glyph = GLYPHS[family];
|
|
27
|
+
return /* @__PURE__ */ jsx(Mark, {
|
|
28
|
+
size,
|
|
29
|
+
className,
|
|
30
|
+
children: /* @__PURE__ */ jsx(Glyph, {
|
|
31
|
+
weight: "regular",
|
|
32
|
+
"data-family": family
|
|
33
|
+
})
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
//#endregion
|
|
37
|
+
export { FileMark };
|
|
38
|
+
|
|
39
|
+
//# sourceMappingURL=FileMark.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FileMark.js","names":[],"sources":["../../src/kit/FileMark.tsx"],"sourcesContent":["import {\n FileAudioIcon,\n FileDocIcon,\n FileIcon,\n FileImageIcon,\n FilePdfIcon,\n FilePptIcon,\n FileTextIcon,\n FileVideoIcon,\n FileXlsIcon,\n FileZipIcon,\n type Icon,\n} from \"@phosphor-icons/react\";\n\nimport { Mark } from \"./Mark\";\nimport { familyOf, type FileFamily } from \"./uploads\";\n\n/** Each family's glyph: the format's own sheet (PDF, Word, Excel, PowerPoint), a picture, a clip. */\nconst GLYPHS: Readonly<Record<FileFamily, Icon>> = {\n image: FileImageIcon,\n pdf: FilePdfIcon,\n sheet: FileXlsIcon,\n doc: FileDocIcon,\n slides: FilePptIcon,\n text: FileTextIcon,\n archive: FileZipIcon,\n audio: FileAudioIcon,\n video: FileVideoIcon,\n other: FileIcon,\n};\n\n/**\n * A file's mark: the glyph of its family, bare, by its name's extension (then its type), the\n * common formats in their own tint (a PDF rose, a sheet green, a document blue, slides amber, a\n * picture sand), the rest in the muted ink. It keeps `Mark`'s square.\n */\nexport function FileMark({\n name,\n type = \"\",\n size,\n className,\n}: {\n name: string;\n /** Its media type, when the name says nothing. */\n type?: string | undefined;\n size?: number | undefined;\n className?: string | undefined;\n}) {\n const family = familyOf(name, type);\n const Glyph = GLYPHS[family];\n return (\n <Mark size={size} className={className}>\n <Glyph weight=\"regular\" data-family={family} />\n </Mark>\n );\n}\n"],"mappings":";;;;;;AAkBA,MAAM,SAA6C;CACjD,OAAO;CACP,KAAK;CACL,OAAO;CACP,KAAK;CACL,QAAQ;CACR,MAAM;CACN,SAAS;CACT,OAAO;CACP,OAAO;CACP,OAAO;AACT;;;;;;AAOA,SAAgB,SAAS,EACvB,MACA,OAAO,IACP,MACA,aAOC;CACD,MAAM,SAAS,SAAS,MAAM,IAAI;CAClC,MAAM,QAAQ,OAAO;CACrB,OACE,oBAAC,MAAD;EAAY;EAAiB;EAC3B,UAAA,oBAAC,OAAD;GAAO,QAAO;GAAU,eAAa;EAAS,CAAA;CAC1C,CAAA;AAEV"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { NumberBounds } from "./numbers.js";
|
|
2
|
+
import { ControlBase } from "./Field.js";
|
|
3
|
+
import { ReactNode } from "react";
|
|
4
|
+
//#region src/kit/Inputs.d.ts
|
|
5
|
+
interface WordsProps extends ControlBase {
|
|
6
|
+
value: string;
|
|
7
|
+
onChange: (value: string) => void;
|
|
8
|
+
placeholder?: string | undefined;
|
|
9
|
+
}
|
|
10
|
+
declare const SHAPES: {
|
|
11
|
+
readonly text: {
|
|
12
|
+
readonly type: "text";
|
|
13
|
+
readonly inputMode: "text";
|
|
14
|
+
readonly autoComplete: undefined;
|
|
15
|
+
readonly icon: undefined;
|
|
16
|
+
};
|
|
17
|
+
readonly email: {
|
|
18
|
+
readonly type: "email";
|
|
19
|
+
readonly inputMode: "email";
|
|
20
|
+
readonly autoComplete: "email";
|
|
21
|
+
readonly icon: import("@phosphor-icons/react").Icon;
|
|
22
|
+
};
|
|
23
|
+
readonly phone: {
|
|
24
|
+
readonly type: "tel";
|
|
25
|
+
readonly inputMode: "tel";
|
|
26
|
+
readonly autoComplete: "tel";
|
|
27
|
+
readonly icon: import("@phosphor-icons/react").Icon;
|
|
28
|
+
};
|
|
29
|
+
readonly url: {
|
|
30
|
+
readonly type: "url";
|
|
31
|
+
readonly inputMode: "url";
|
|
32
|
+
readonly autoComplete: "url";
|
|
33
|
+
readonly icon: import("@phosphor-icons/react").Icon;
|
|
34
|
+
};
|
|
35
|
+
};
|
|
36
|
+
/** Words on one line; an email, a phone or an address with its icon and the right keyboard. */
|
|
37
|
+
export declare function TextInput({ kind, value, onChange, placeholder, ...control }: WordsProps & {
|
|
38
|
+
kind?: keyof typeof SHAPES | undefined;
|
|
39
|
+
}): import("react").JSX.Element;
|
|
40
|
+
/** Words over a few lines: the box grows with them up to a height, then scrolls. */
|
|
41
|
+
export declare function TextArea({ value, onChange, placeholder, ...control }: WordsProps): import("react").JSX.Element;
|
|
42
|
+
/** A number: typed, or a step at a time with − and + (or the arrows), its unit after it. */
|
|
43
|
+
export declare function NumberInput({ value, onChange, placeholder, min, max, step, unit, ...control }: ControlBase & NumberBounds & {
|
|
44
|
+
value: number | null;
|
|
45
|
+
onChange: (value: number | null) => void;
|
|
46
|
+
placeholder?: string | undefined;
|
|
47
|
+
unit?: string | undefined;
|
|
48
|
+
}): import("react").JSX.Element;
|
|
49
|
+
/** A value typed once and never shown again: hidden as it is typed, unless the person asks. */
|
|
50
|
+
export declare function SecretInput({ value, onChange, placeholder, ...control }: WordsProps): import("react").JSX.Element;
|
|
51
|
+
/** A box to tick, the sentence beside it its label; drawn in the accent once ticked. */
|
|
52
|
+
export declare function Checkbox({ value, onChange, children, ...control }: Omit<ControlBase, "labelledBy" | "label"> & {
|
|
53
|
+
value: boolean;
|
|
54
|
+
onChange: (value: boolean) => void;
|
|
55
|
+
children: ReactNode;
|
|
56
|
+
}): import("react").JSX.Element;
|
|
57
|
+
//#endregion
|
|
58
|
+
export {};
|
|
59
|
+
//# sourceMappingURL=Inputs.d.ts.map
|