@camstack/ui-library 1.2.256 → 1.2.258
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/composites/accelerator-label.d.ts +9 -9
- package/dist/composites/adaptive-downlink.d.ts +141 -143
- package/dist/composites/addon-global-settings-form.d.ts +73 -60
- package/dist/composites/addon-page-props.d.ts +34 -10
- package/dist/composites/agent-step-editor.d.ts +48 -47
- package/dist/composites/app-shell/app-shell.d.ts +17 -17
- package/dist/composites/app-shell/index.d.ts +3 -3
- package/dist/composites/app-shell/sidebar-item.d.ts +9 -8
- package/dist/composites/app-shell/sidebar.d.ts +10 -10
- package/dist/composites/audio-classification-list.d.ts +16 -15
- package/dist/composites/audio-level-waveform.d.ts +31 -30
- package/dist/composites/audio-waveform.d.ts +18 -17
- package/dist/composites/battery-badge.d.ts +27 -13
- package/dist/composites/breadcrumb.d.ts +21 -21
- package/dist/composites/camera-stream-player.d.ts +309 -309
- package/dist/composites/cap-settings/AutotrackSection.d.ts +19 -2
- package/dist/composites/cap-settings/CameraGridLayoutEditor.d.ts +24 -2
- package/dist/composites/cap-settings/ConsumablesPanel.d.ts +21 -2
- package/dist/composites/cap-settings/CoverageTrack.d.ts +21 -20
- package/dist/composites/cap-settings/EventBucketStrip.d.ts +21 -20
- package/dist/composites/cap-settings/EventHeatmap.d.ts +8 -7
- package/dist/composites/cap-settings/HomePresetPicker.d.ts +2 -2
- package/dist/composites/cap-settings/MaskShapeCanvas.d.ts +143 -41
- package/dist/composites/cap-settings/MotionZonesSettings.d.ts +41 -2
- package/dist/composites/cap-settings/NavigationPanel.d.ts +14 -2
- package/dist/composites/cap-settings/PrivacyMaskSettings.d.ts +3 -2
- package/dist/composites/cap-settings/PtzPanel.d.ts +15 -2
- package/dist/composites/cap-settings/RecordingBandsEditor.d.ts +33 -32
- package/dist/composites/cap-settings/RecordingPanel.d.ts +3 -2
- package/dist/composites/cap-settings/RecordingSettings.d.ts +11 -10
- package/dist/composites/cap-settings/RecordingTimeline.d.ts +3 -2
- package/dist/composites/cap-settings/SceneMonitorEditor.d.ts +3 -51
- package/dist/composites/cap-settings/SceneReferenceGallery.d.ts +62 -23
- package/dist/composites/cap-settings/SceneSettingsForm.d.ts +52 -16
- package/dist/composites/cap-settings/TimelineControls.d.ts +21 -20
- package/dist/composites/cap-settings/camera-grid-layout.d.ts +95 -95
- package/dist/composites/cap-settings/event-thumb.d.ts +9 -8
- package/dist/composites/cap-settings/index.d.ts +20 -20
- package/dist/composites/cap-settings/privacy-mask-audio.d.ts +47 -47
- package/dist/composites/cap-settings/recording-config-form.d.ts +25 -25
- package/dist/composites/cap-settings/recording-spans.d.ts +14 -14
- package/dist/composites/cap-settings/recording-timeline-model.d.ts +57 -57
- package/dist/composites/cap-settings/scene-monitor-copy.d.ts +58 -49
- package/dist/composites/client-network-sample.d.ts +41 -41
- package/dist/composites/clips/ClipBandBar.d.ts +44 -14
- package/dist/composites/clips/ClipPanel.d.ts +30 -6
- package/dist/composites/clips/ClipTile.d.ts +26 -5
- package/dist/composites/clips/ClipsSection.d.ts +107 -2
- package/dist/composites/clips/clip-band.d.ts +72 -38
- package/dist/composites/clips/clip-day-window.d.ts +7 -30
- package/dist/composites/clips/clip-source-state.d.ts +55 -26
- package/dist/composites/clips/clip-still-retry.d.ts +39 -39
- package/dist/composites/clips/clip-thumbnail-fetch.d.ts +9 -9
- package/dist/composites/clips/clip-tile-media.d.ts +64 -32
- package/dist/composites/clips/clip-view-state.d.ts +76 -46
- package/dist/composites/code-block.d.ts +5 -4
- package/dist/composites/config-form-builder.d.ts +14 -13
- package/dist/composites/config-form-field.d.ts +63 -62
- package/dist/composites/config-icon-field.d.ts +10 -9
- package/dist/composites/config-secret-field.d.ts +51 -27
- package/dist/composites/confirm-action-button.d.ts +52 -39
- package/dist/composites/confirm-dialog.d.ts +110 -48
- package/dist/composites/copy-button.d.ts +25 -19
- package/dist/composites/data-table/data-table-header.d.ts +8 -7
- package/dist/composites/data-table/data-table-pagination.d.ts +7 -6
- package/dist/composites/data-table/data-table-row.d.ts +8 -7
- package/dist/composites/data-table/data-table.d.ts +3 -2
- package/dist/composites/data-table/index.d.ts +2 -2
- package/dist/composites/data-table/types.d.ts +29 -29
- package/dist/composites/data-table-filter-bar.d.ts +30 -29
- package/dist/composites/data-table-filter.d.ts +34 -34
- package/dist/composites/data-table-layout.d.ts +24 -24
- package/dist/composites/data-table-pager.d.ts +5 -5
- package/dist/composites/data-table-pagination.d.ts +23 -23
- package/dist/composites/data-table-selection.d.ts +10 -10
- package/dist/composites/data-table.d.ts +167 -118
- package/dist/composites/detection-canvas.d.ts +34 -25
- package/dist/composites/detection-colors.d.ts +9 -9
- package/dist/composites/detection-overlay.d.ts +33 -32
- package/dist/composites/detection-result-tree.d.ts +22 -9
- package/dist/composites/dev-shell.d.ts +15 -14
- package/dist/composites/device-activity-panel.d.ts +37 -31
- package/dist/composites/device-card.d.ts +32 -32
- package/dist/composites/device-controls/ac-panel.d.ts +2 -2
- package/dist/composites/device-controls/alarm-hero-card.d.ts +42 -42
- package/dist/composites/device-controls/atoms.d.ts +50 -50
- package/dist/composites/device-controls/brightness-panel.d.ts +3 -3
- package/dist/composites/device-controls/button-control.d.ts +14 -14
- package/dist/composites/device-controls/climate-panel.d.ts +12 -12
- package/dist/composites/device-controls/container-primary-hero.d.ts +33 -16
- package/dist/composites/device-controls/container-primary.d.ts +68 -39
- package/dist/composites/device-controls/control-panel.d.ts +4 -4
- package/dist/composites/device-controls/control-registry.d.ts +81 -70
- package/dist/composites/device-controls/cover-hero-card.d.ts +26 -26
- package/dist/composites/device-controls/cover-inline.d.ts +20 -20
- package/dist/composites/device-controls/cover-panel.d.ts +2 -2
- package/dist/composites/device-controls/dummy-hero-card.d.ts +2 -2
- package/dist/composites/device-controls/fan-hero-card.d.ts +20 -20
- package/dist/composites/device-controls/fan-panel.d.ts +3 -3
- package/dist/composites/device-controls/humidifier-control.d.ts +46 -29
- package/dist/composites/device-controls/image-control.d.ts +41 -27
- package/dist/composites/device-controls/index.d.ts +34 -34
- package/dist/composites/device-controls/lawn-mower-control.d.ts +30 -16
- package/dist/composites/device-controls/light-hero-card.d.ts +15 -15
- package/dist/composites/device-controls/lock-hero-card.d.ts +14 -14
- package/dist/composites/device-controls/lock-panel.d.ts +3 -3
- package/dist/composites/device-controls/media-player-hero-card.d.ts +16 -16
- package/dist/composites/device-controls/media-player-panel.d.ts +7 -7
- package/dist/composites/device-controls/offline-badge.d.ts +23 -8
- package/dist/composites/device-controls/panel-controls.d.ts +39 -20
- package/dist/composites/device-controls/pet-feeder-panel.d.ts +27 -9
- package/dist/composites/device-controls/popover-row-action.d.ts +18 -6
- package/dist/composites/device-controls/primary-child-picker.d.ts +31 -15
- package/dist/composites/device-controls/primary-child.d.ts +14 -25
- package/dist/composites/device-controls/radial-gauge.d.ts +17 -17
- package/dist/composites/device-controls/script-automation-controls.d.ts +9 -9
- package/dist/composites/device-controls/sensor-hero-card.d.ts +26 -8
- package/dist/composites/device-controls/sensor-inline-control.d.ts +21 -9
- package/dist/composites/device-controls/sensor-value-atom.d.ts +97 -76
- package/dist/composites/device-controls/switch-hero-card.d.ts +11 -11
- package/dist/composites/device-controls/switch-panel.d.ts +2 -2
- package/dist/composites/device-controls/tap-toggle.d.ts +13 -13
- package/dist/composites/device-controls/thermostat-hero-card.d.ts +16 -16
- package/dist/composites/device-controls/types.d.ts +11 -11
- package/dist/composites/device-controls/update-control.d.ts +20 -7
- package/dist/composites/device-controls/vacuum-control.d.ts +41 -25
- package/dist/composites/device-controls/valve-control.d.ts +51 -35
- package/dist/composites/device-controls/water-heater-control.d.ts +48 -31
- package/dist/composites/device-controls/weather-control.d.ts +46 -28
- package/dist/composites/device-export-panel.d.ts +34 -34
- package/dist/composites/device-grid.d.ts +10 -10
- package/dist/composites/device-item/actions.d.ts +40 -18
- package/dist/composites/device-item/admin-link-quick-action.d.ts +66 -26
- package/dist/composites/device-item/child-layout.d.ts +43 -26
- package/dist/composites/device-item/child-section-accordion.d.ts +20 -6
- package/dist/composites/device-item/children-accordion.d.ts +11 -11
- package/dist/composites/device-item/container-children-context.d.ts +28 -11
- package/dist/composites/device-item/device-delete-action.d.ts +23 -5
- package/dist/composites/device-item/features.d.ts +33 -15
- package/dist/composites/device-item/header.d.ts +53 -31
- package/dist/composites/device-item/helpers.d.ts +291 -274
- package/dist/composites/device-item/index.d.ts +18 -9
- package/dist/composites/device-item/preview.d.ts +41 -21
- package/dist/composites/device-item/quick-detail-action.d.ts +4 -4
- package/dist/composites/device-item/reboot-quick-action.d.ts +28 -7
- package/dist/composites/device-item/role-display-defaults-context.d.ts +28 -12
- package/dist/composites/device-item/status-dot.d.ts +24 -6
- package/dist/composites/device-list/batch-actions-bar.d.ts +23 -12
- package/dist/composites/device-list/batch-toolbar.d.ts +13 -13
- package/dist/composites/device-list/columns.d.ts +108 -108
- package/dist/composites/device-list/device-integration.d.ts +48 -58
- package/dist/composites/device-list/device-mode.d.ts +121 -121
- package/dist/composites/device-list/empty-state.d.ts +14 -3
- package/dist/composites/device-list/filter-chips.d.ts +42 -29
- package/dist/composites/device-list/fuzzy-match.d.ts +22 -22
- package/dist/composites/device-list/generic-mode.d.ts +88 -88
- package/dist/composites/device-list/group.d.ts +62 -35
- package/dist/composites/device-list/hardware-cell.d.ts +14 -3
- package/dist/composites/device-list/hardware.d.ts +29 -11
- package/dist/composites/device-list/icon-action.d.ts +27 -15
- package/dist/composites/device-list/index.d.ts +46 -23
- package/dist/composites/device-list/multi-select.d.ts +17 -17
- package/dist/composites/device-list/page-size-select.d.ts +13 -7
- package/dist/composites/device-list/pagination.d.ts +19 -12
- package/dist/composites/device-list/sort.d.ts +28 -15
- package/dist/composites/device-list/sortable-header.d.ts +20 -7
- package/dist/composites/device-list/table-layout.d.ts +44 -44
- package/dist/composites/device-list/type-filter.d.ts +16 -16
- package/dist/composites/device-list/url-state.d.ts +35 -35
- package/dist/composites/device-meta.d.ts +43 -43
- package/dist/composites/device-picker/DevicePicker.d.ts +72 -33
- package/dist/composites/device-picker/SelectedChip.d.ts +10 -9
- package/dist/composites/device-picker/device-filter-bar.d.ts +19 -18
- package/dist/composites/device-picker/device-fleet-view.d.ts +11 -3
- package/dist/composites/device-picker/device-parent.d.ts +27 -27
- package/dist/composites/device-picker/device-picker-grouping.d.ts +3 -3
- package/dist/composites/device-picker/device-picker-model.d.ts +140 -140
- package/dist/composites/device-picker/device-selection-rows.d.ts +31 -24
- package/dist/composites/device-picker/device-selection.d.ts +43 -43
- package/dist/composites/device-picker/index.d.ts +9 -9
- package/dist/composites/device-select-field.d.ts +17 -16
- package/dist/composites/device-select-filter.d.ts +78 -78
- package/dist/composites/device-selector-picker.d.ts +25 -25
- package/dist/composites/device-step-matrix.d.ts +54 -28
- package/dist/composites/discovery-panel.d.ts +22 -22
- package/dist/composites/doorbell-recent-panel.d.ts +9 -8
- package/dist/composites/empty-state.d.ts +8 -8
- package/dist/composites/error-box.d.ts +32 -17
- package/dist/composites/event-kind-visuals.d.ts +29 -18
- package/dist/composites/event-stream.d.ts +59 -42
- package/dist/composites/extensions/AssociationSlotCard.d.ts +45 -24
- package/dist/composites/extensions/ExtensionsPanel.d.ts +41 -18
- package/dist/composites/extensions/extensions-view-state.d.ts +71 -53
- package/dist/composites/filter-bar.d.ts +22 -21
- package/dist/composites/form-field.d.ts +9 -9
- package/dist/composites/format-state-value.d.ts +23 -51
- package/dist/composites/grouped-model-selector.d.ts +7 -6
- package/dist/composites/hls-quality.d.ts +26 -26
- package/dist/composites/hls-video.d.ts +62 -39
- package/dist/composites/hover-zoom-image.d.ts +35 -16
- package/dist/composites/icon-picker.d.ts +86 -50
- package/dist/composites/image-selector.d.ts +21 -20
- package/dist/composites/index.d.ts +204 -204
- package/dist/composites/inference-config-selector.d.ts +36 -35
- package/dist/composites/kebab-menu.d.ts +53 -35
- package/dist/composites/key-value-list.d.ts +14 -14
- package/dist/composites/log-stream-scroll.d.ts +24 -24
- package/dist/composites/log-stream.d.ts +81 -70
- package/dist/composites/login-form.d.ts +7 -6
- package/dist/composites/model-bound-slider.d.ts +46 -26
- package/dist/composites/model-picker.d.ts +20 -19
- package/dist/composites/mount-addon-page.d.ts +12 -12
- package/dist/composites/network-link-badge.d.ts +7 -6
- package/dist/composites/node-picker.d.ts +14 -13
- package/dist/composites/notification-targets-field.d.ts +76 -58
- package/dist/composites/notification-targets-options.d.ts +9 -6
- package/dist/composites/option-select/OptionSelect.d.ts +23 -22
- package/dist/composites/option-select/index.d.ts +4 -4
- package/dist/composites/option-select/option-select-model.d.ts +35 -35
- package/dist/composites/page-header.d.ts +6 -6
- package/dist/composites/peer-connection-config.d.ts +9 -9
- package/dist/composites/phase-icon.d.ts +10 -3
- package/dist/composites/pipeline-builder.d.ts +21 -13
- package/dist/composites/pipeline-matrix-shared.d.ts +159 -150
- package/dist/composites/pipeline-runtime-selector.d.ts +12 -11
- package/dist/composites/pipeline-step.d.ts +39 -31
- package/dist/composites/placeholder-field/PlaceholderChipField.d.ts +23 -22
- package/dist/composites/placeholder-field/index.d.ts +1 -1
- package/dist/composites/provider-badge.d.ts +6 -5
- package/dist/composites/ptz-overlay.d.ts +38 -18
- package/dist/composites/qr-code.d.ts +24 -10
- package/dist/composites/reconnect-schedule.d.ts +22 -22
- package/dist/composites/resolve-step-default-model.d.ts +94 -94
- package/dist/composites/response-log.d.ts +7 -6
- package/dist/composites/root-model-source.d.ts +21 -10
- package/dist/composites/scope-picker.d.ts +49 -25
- package/dist/composites/section-card.d.ts +19 -11
- package/dist/composites/setting-row.d.ts +39 -21
- package/dist/composites/snapshot-button.d.ts +23 -19
- package/dist/composites/sort-header-button.d.ts +25 -8
- package/dist/composites/stat-card.d.ts +20 -8
- package/dist/composites/state-values-stream.d.ts +49 -24
- package/dist/composites/status-badge.d.ts +10 -8
- package/dist/composites/step-inspector/gate-control.d.ts +13 -12
- package/dist/composites/step-inspector/index.d.ts +8 -8
- package/dist/composites/step-inspector/layered-settings-form.d.ts +41 -30
- package/dist/composites/step-inspector/segmented-choice.d.ts +8 -7
- package/dist/composites/step-inspector/setting-values.d.ts +13 -8
- package/dist/composites/step-inspector/step-detail-dock.d.ts +39 -23
- package/dist/composites/step-inspector/step-inspector-panel.d.ts +34 -28
- package/dist/composites/step-inspector/step-model-row.d.ts +29 -24
- package/dist/composites/step-inspector/step-search.d.ts +11 -11
- package/dist/composites/step-timings.d.ts +7 -6
- package/dist/composites/step-tree.d.ts +17 -12
- package/dist/composites/stream-broker-selector.d.ts +29 -8
- package/dist/composites/stream-debug/stream-debug-overlay.d.ts +40 -40
- package/dist/composites/stream-debug/webrtc-debug-stats.d.ts +144 -129
- package/dist/composites/stream-panel.d.ts +212 -201
- package/dist/composites/table-sort.d.ts +61 -61
- package/dist/composites/timezone-selector.d.ts +15 -13
- package/dist/composites/training/send-frame-to-training.d.ts +5 -4
- package/dist/composites/training/training-collection-picker.d.ts +4 -3
- package/dist/composites/training/training-refusal-text.d.ts +6 -6
- package/dist/composites/unit-picker/UnitPicker.d.ts +19 -14
- package/dist/composites/unit-picker/index.d.ts +1 -1
- package/dist/composites/use-data-table-filter.d.ts +19 -19
- package/dist/composites/version-badge.d.ts +19 -18
- package/dist/composites/webrtc-diagnostics/EndpointTestCard.d.ts +7 -7
- package/dist/composites/webrtc-diagnostics/HubSessionTestCard.d.ts +14 -14
- package/dist/composites/webrtc-diagnostics/RunReport.d.ts +10 -5
- package/dist/composites/webrtc-diagnostics/endpoint-probe.d.ts +41 -21
- package/dist/composites/webrtc-diagnostics/endpoint-test.d.ts +37 -32
- package/dist/composites/webrtc-diagnostics/format.d.ts +3 -3
- package/dist/composites/webrtc-diagnostics/ice-candidates.d.ts +49 -49
- package/dist/composites/webrtc-diagnostics/nat-mapping.d.ts +36 -36
- package/dist/composites/webrtc-diagnostics/session-run.d.ts +108 -95
- package/dist/composites/webrtc-diagnostics/session-verdict.d.ts +29 -20
- package/dist/composites/widget-panel.d.ts +23 -23
- package/dist/composites/widget-slot.d.ts +35 -17
- package/dist/contexts/custom-field-renderers.d.ts +53 -17
- package/dist/contexts/device-context.d.ts +32 -12
- package/dist/contexts/device-quick-detail.d.ts +13 -4
- package/dist/contexts/player-overlays.d.ts +82 -42
- package/dist/contexts/recorded-playback.d.ts +40 -18
- package/dist/contexts/system-context.d.ts +28 -13
- package/dist/contexts/vod-playback.d.ts +39 -22
- package/dist/contexts/widget-registry.d.ts +139 -102
- package/dist/contexts/zone-editing.d.ts +69 -46
- package/dist/generated/system-hooks.d.ts +17 -1
- package/dist/hooks/index.d.ts +43 -43
- package/dist/hooks/turn-server-cache.d.ts +69 -69
- package/dist/hooks/use-capability-presence.d.ts +65 -28
- package/dist/hooks/use-cluster-nodes.d.ts +54 -27
- package/dist/hooks/use-device-autotrack.d.ts +7 -7
- package/dist/hooks/use-device-battery.d.ts +24 -11
- package/dist/hooks/use-device-cap-slice.d.ts +15 -15
- package/dist/hooks/use-device-capability.d.ts +61 -27
- package/dist/hooks/use-device-detections.d.ts +32 -32
- package/dist/hooks/use-device-features.d.ts +18 -18
- package/dist/hooks/use-device-list-page-size.d.ts +19 -6
- package/dist/hooks/use-device-network-link.d.ts +15 -7
- package/dist/hooks/use-device-proxy.d.ts +98 -92
- package/dist/hooks/use-device-snapshot.d.ts +23 -23
- package/dist/hooks/use-device-webrtc.d.ts +211 -205
- package/dist/hooks/use-devices.d.ts +9 -9
- package/dist/hooks/use-doorbell-events.d.ts +13 -13
- package/dist/hooks/use-event-stream.d.ts +6 -3
- package/dist/hooks/use-is-mobile.d.ts +5 -5
- package/dist/hooks/use-live-buffer.d.ts +5 -5
- package/dist/hooks/use-live-event.d.ts +1 -1
- package/dist/hooks/use-navigation.d.ts +20 -20
- package/dist/hooks/use-optimistic-slice.d.ts +13 -13
- package/dist/hooks/use-persisted-page-size.d.ts +10 -10
- package/dist/hooks/use-ptz.d.ts +108 -108
- package/dist/hooks/use-stationary-overlay.d.ts +37 -37
- package/dist/hooks/use-system-query.d.ts +33 -10
- package/dist/hooks/use-url-query.d.ts +3 -3
- package/dist/icons/index.d.ts +2 -2
- package/dist/icons/provider-icons.d.ts +2 -2
- package/dist/icons/status-icons.d.ts +2 -2
- package/dist/index.cjs +123 -69
- package/dist/index.d.ts +31 -27
- package/dist/index.js +123 -69
- package/dist/lib/cap-error.d.ts +18 -39
- package/dist/lib/cn.d.ts +1 -1
- package/dist/lib/fleet-query-defaults.d.ts +68 -34
- package/dist/lib/format-control-datetime.d.ts +16 -16
- package/dist/lib/format-duration.d.ts +12 -12
- package/dist/lib/format-last-seen.d.ts +5 -18
- package/dist/lib/format-numeric.d.ts +7 -7
- package/dist/lib/hub-mount.d.ts +8 -42
- package/dist/lib/index.d.ts +21 -21
- package/dist/lib/phase-config.d.ts +24 -11
- package/dist/lib/pipeline-mirror.d.ts +16 -16
- package/dist/lib/recorded-control-protocol.d.ts +41 -43
- package/dist/lib/resolve-sensor-display.d.ts +36 -20
- package/dist/lib/responsive.d.ts +54 -54
- package/dist/lib/scrub-controller.d.ts +75 -78
- package/dist/lib/shared-context.d.ts +27 -2
- package/dist/lib/tailwind-variants.d.ts +20 -20
- package/dist/primitives/badge.d.ts +5 -10
- package/dist/primitives/bottom-sheet.d.ts +7 -7
- package/dist/primitives/button.d.ts +5 -9
- package/dist/primitives/card.d.ts +4 -8
- package/dist/primitives/checkbox.d.ts +3 -4
- package/dist/primitives/collapsible-card.d.ts +23 -13
- package/dist/primitives/dialog.d.ts +33 -59
- package/dist/primitives/dropdown.d.ts +13 -13
- package/dist/primitives/floating-panel.d.ts +41 -20
- package/dist/primitives/icon-button.d.ts +8 -12
- package/dist/primitives/index.d.ts +22 -22
- package/dist/primitives/input.d.ts +6 -16
- package/dist/primitives/label.d.ts +3 -4
- package/dist/primitives/mobile-drawer.d.ts +8 -8
- package/dist/primitives/password-input.d.ts +18 -18
- package/dist/primitives/popover.d.ts +7 -7
- package/dist/primitives/scroll-area.d.ts +3 -4
- package/dist/primitives/select.d.ts +20 -20
- package/dist/primitives/separator.d.ts +4 -8
- package/dist/primitives/skeleton.d.ts +3 -4
- package/dist/primitives/switch.d.ts +6 -6
- package/dist/primitives/tabs.d.ts +26 -26
- package/dist/primitives/tooltip.d.ts +12 -12
- package/dist/theme/create-theme.d.ts +1 -1
- package/dist/theme/defaults.d.ts +1 -1
- package/dist/theme/index.d.ts +6 -6
- package/dist/theme/theme-provider.d.ts +8 -7
- package/dist/theme/theme-to-css.d.ts +1 -1
- package/dist/theme/types.d.ts +98 -100
- package/dist/theme/use-theme-mode.d.ts +1 -1
- package/dist/trpc-react.d.ts +23 -3
- package/dist/widgets/host-widgets.d.ts +4 -4
- package/package.json +8 -4
- package/src/tailwind/camstack-theme.css +11 -0
- package/dist/composites/unit-picker/UnitPicker.spec.d.ts +0 -1
|
@@ -1,33 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DeviceActivityPanel — unified Logs / Events / State Values viewer.
|
|
3
|
+
*
|
|
4
|
+
* Three internal tabs:
|
|
5
|
+
* - Logs → LogStream (scoped to deviceId)
|
|
6
|
+
* - Events → EventStream (multiselect of EventCategory + free text)
|
|
7
|
+
* - State Values → StateValuesStream (DeviceStateChanged subscription)
|
|
8
|
+
*
|
|
9
|
+
* Only the active tab is rendered. tRPC subscriptions in the inactive
|
|
10
|
+
* tabs are torn down because the components are unmounted — keeps the
|
|
11
|
+
* websocket lean even when many devices have a panel open.
|
|
12
|
+
*
|
|
13
|
+
* The panel hosts three live buffers (`logs` / `events` / `state`) and
|
|
14
|
+
* passes them to the streams. Subscriptions still only fire while
|
|
15
|
+
* their stream is mounted, but the entries already received persist
|
|
16
|
+
* across tab switches — so reopening the State tab doesn't reset
|
|
17
|
+
* the visible list to empty just because the global event ring
|
|
18
|
+
* buffer evicted the older state-changed entries.
|
|
19
|
+
*/
|
|
20
|
+
import { type JSX } from "react";
|
|
1
21
|
export interface DeviceActivityPanelProps {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
22
|
+
readonly deviceId: number;
|
|
23
|
+
/** When this device is a Container, its own id — the Logs tab then shows the
|
|
24
|
+
* whole subtree (container + every child) by filtering `containerDeviceId`
|
|
25
|
+
* instead of `deviceId`. Omit/undefined for a non-container. */
|
|
26
|
+
readonly containerDeviceId?: number;
|
|
27
|
+
/** Initial event categories the user wants tracked. Defaults to "all". */
|
|
28
|
+
readonly defaultEventCategories?: readonly string[];
|
|
29
|
+
/** Initial state-cap whitelist. Empty = show every cap that fires. */
|
|
30
|
+
readonly defaultStateCaps?: readonly string[];
|
|
31
|
+
/** Tab to show first. */
|
|
32
|
+
readonly initialTab?: ActivityTabId;
|
|
33
|
+
/** CSS class for the panel root. */
|
|
34
|
+
readonly className?: string;
|
|
35
|
+
/** Max content height (passed to the active stream). */
|
|
36
|
+
readonly maxHeight?: string;
|
|
17
37
|
}
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
readonly label: "Logs";
|
|
21
|
-
readonly icon: import('react').ForwardRefExoticComponent<Omit<import('lucide-react').LucideProps, "ref"> & import('react').RefAttributes<SVGSVGElement>>;
|
|
22
|
-
}, {
|
|
23
|
-
readonly id: "events";
|
|
24
|
-
readonly label: "Events";
|
|
25
|
-
readonly icon: import('react').ForwardRefExoticComponent<Omit<import('lucide-react').LucideProps, "ref"> & import('react').RefAttributes<SVGSVGElement>>;
|
|
26
|
-
}, {
|
|
27
|
-
readonly id: "state";
|
|
28
|
-
readonly label: "State";
|
|
29
|
-
readonly icon: import('react').ForwardRefExoticComponent<Omit<import('lucide-react').LucideProps, "ref"> & import('react').RefAttributes<SVGSVGElement>>;
|
|
30
|
-
}];
|
|
31
|
-
export type ActivityTabId = (typeof TABS)[number]['id'];
|
|
32
|
-
export declare function DeviceActivityPanel({ deviceId, containerDeviceId, defaultEventCategories, defaultStateCaps, initialTab, className, maxHeight, }: DeviceActivityPanelProps): import("react").JSX.Element;
|
|
33
|
-
export {};
|
|
38
|
+
export type ActivityTabId = "logs" | "events" | "state";
|
|
39
|
+
export declare function DeviceActivityPanel({ deviceId, containerDeviceId, defaultEventCategories, defaultStateCaps, initialTab, className, maxHeight }: DeviceActivityPanelProps): JSX.Element;
|
|
@@ -1,38 +1,38 @@
|
|
|
1
|
-
import { ReactNode } from
|
|
1
|
+
import { type ReactNode, type JSX } from "react";
|
|
2
2
|
export interface DeviceCardBadge {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
3
|
+
/** Badge label text */
|
|
4
|
+
label: string;
|
|
5
|
+
/** Optional icon rendered before the label */
|
|
6
|
+
icon?: ReactNode;
|
|
7
|
+
/** Click handler — makes the badge interactive */
|
|
8
|
+
onClick?: () => void;
|
|
9
9
|
}
|
|
10
10
|
export interface DeviceCardAction {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
11
|
+
/** Icon to render */
|
|
12
|
+
icon: ReactNode;
|
|
13
|
+
/** Tooltip / aria-label */
|
|
14
|
+
label: string;
|
|
15
|
+
/** Click handler */
|
|
16
|
+
onClick: () => void;
|
|
17
17
|
}
|
|
18
18
|
export interface DeviceCardProps {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
19
|
+
/** Primary title (e.g., device name) */
|
|
20
|
+
title: string;
|
|
21
|
+
/** Secondary text (e.g., model, IP) */
|
|
22
|
+
subtitle?: string;
|
|
23
|
+
/** Status: determines the color of the status dot */
|
|
24
|
+
status?: "online" | "offline" | "warning" | "unknown";
|
|
25
|
+
/** Whether this card is currently selected */
|
|
26
|
+
selected?: boolean;
|
|
27
|
+
/** Click handler for the card body */
|
|
28
|
+
onClick?: () => void;
|
|
29
|
+
/** Clickable badges (e.g., stream profiles) */
|
|
30
|
+
badges?: DeviceCardBadge[];
|
|
31
|
+
/** Action icons shown at the bottom (e.g., PTZ, events) */
|
|
32
|
+
actions?: DeviceCardAction[];
|
|
33
|
+
/** Content rendered at the bottom when status is offline (e.g., Connect button) */
|
|
34
|
+
offlineAction?: ReactNode;
|
|
35
|
+
/** Additional CSS classes */
|
|
36
|
+
className?: string;
|
|
37
37
|
}
|
|
38
|
-
export declare function DeviceCard({ title, subtitle, status, selected, onClick, badges, actions, offlineAction, className
|
|
38
|
+
export declare function DeviceCard({ title, subtitle, status, selected, onClick, badges, actions, offlineAction, className }: DeviceCardProps): JSX.Element;
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { ReactNode } from
|
|
2
|
-
import { ControlPanelProps } from
|
|
1
|
+
import type { ReactNode } from "react";
|
|
2
|
+
import type { ControlPanelProps } from "./types.js";
|
|
3
3
|
export declare function AcPanel({ trpc, deviceId, layout, optimistic }: ControlPanelProps): ReactNode;
|
|
@@ -1,47 +1,47 @@
|
|
|
1
|
-
import { ReactNode } from
|
|
2
|
-
import { DeviceControlProps } from
|
|
1
|
+
import { type ReactNode } from "react";
|
|
2
|
+
import type { DeviceControlProps } from "./control-registry";
|
|
3
3
|
/**
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
4
|
+
* Row-sized alarm control: the shared Disarm + arm-mode segment strip only —
|
|
5
|
+
* no glyph, no state label, no card padding. Cap-gated on `alarm-panel`.
|
|
6
|
+
* Drops into a 200 px control column without towering over sibling rows.
|
|
7
|
+
*/
|
|
8
8
|
/**
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
9
|
+
* The row/card-sized alarm control — ONE LINE, always.
|
|
10
|
+
*
|
|
11
|
+
* Two earlier attempts were wrong in instructive ways. The first rendered only
|
|
12
|
+
* the segment strip, so the sole sign a panel was armed was which of four
|
|
13
|
+
* buttons happened to be highlighted — and in a grid card the strip overflowed
|
|
14
|
+
* and cut that button off. The second let the strip WRAP, which stopped the
|
|
15
|
+
* overflow by making the row two and three lines tall.
|
|
16
|
+
*
|
|
17
|
+
* A state badge plus four buttons does not fit a phone-width row, and no amount
|
|
18
|
+
* of sizing makes it. So the row shows what a row is for — **the state** — and
|
|
19
|
+
* offers the modes through a select, which is one line at any width. The four
|
|
20
|
+
* segments live in the hero, where there is room for them.
|
|
21
|
+
*
|
|
22
|
+
* A refusal (D630) still has to be visible here, one line or not — it is a
|
|
23
|
+
* small danger badge (icon only, `title` carries the full message, same
|
|
24
|
+
* pattern as `OfflineBadge`) appended after the select. It never grows the
|
|
25
|
+
* row past one line.
|
|
26
|
+
*/
|
|
27
27
|
export declare function AlarmInlineControl({ trpc, deviceId, optimistic }: DeviceControlProps): ReactNode;
|
|
28
28
|
/**
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
29
|
+
* AlarmHeroCard — segmented arm/disarm hero for AlarmPanel devices.
|
|
30
|
+
*
|
|
31
|
+
* Renders (Spec §3):
|
|
32
|
+
* - A shield glyph + state label tinted by lifecycle state (disarmed=muted,
|
|
33
|
+
* armed=green, arming/pending=amber, triggered=red).
|
|
34
|
+
* - The shared `AlarmSegments` strip: a Disarm button plus one arm button per
|
|
35
|
+
* `availableModes` entry (Home / Away / Night / …). The currently-active
|
|
36
|
+
* segment is highlighted; transitioning states highlight none.
|
|
37
|
+
*
|
|
38
|
+
* Cap-gated on `alarm-panel` — returns null when the device lacks the cap.
|
|
39
|
+
* PIN entry (when `requiresCode`) is deferred to a later task; the segments
|
|
40
|
+
* call arm/disarm without a code, and the provider rejects when a code is
|
|
41
|
+
* required — surfaced upstream.
|
|
42
|
+
*
|
|
43
|
+
* A refusal (D630: an open device, a required code, …) is never a swallowed
|
|
44
|
+
* promise — `useAlarmControl` rolls the optimistic state back and hands the
|
|
45
|
+
* rejection's message back as `error`, rendered below the segments.
|
|
46
|
+
*/
|
|
47
47
|
export declare function AlarmHeroCard({ trpc, deviceId, optimistic }: DeviceControlProps): ReactNode;
|
|
@@ -1,81 +1,81 @@
|
|
|
1
|
-
import { ComponentPropsWithoutRef, ReactNode } from
|
|
1
|
+
import type { ComponentPropsWithoutRef, ReactNode } from "react";
|
|
2
2
|
export declare const FILL: "fill";
|
|
3
3
|
export declare const RIGHT: "right";
|
|
4
4
|
export declare const CENTER: "center";
|
|
5
5
|
export declare const FIT: "fit";
|
|
6
6
|
export type ControlAlign = typeof FILL | typeof RIGHT | typeof CENTER | typeof FIT;
|
|
7
|
-
interface ControlColumnProps extends ComponentPropsWithoutRef<
|
|
8
|
-
|
|
9
|
-
|
|
7
|
+
interface ControlColumnProps extends ComponentPropsWithoutRef<"div"> {
|
|
8
|
+
readonly align: ControlAlign;
|
|
9
|
+
readonly children: ReactNode;
|
|
10
10
|
}
|
|
11
11
|
/** The one control column every device-row/hero control sits in.
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
12
|
+
* FILL → the child stretches to the full fixed column width (steppers, selects, buttons, cover triad).
|
|
13
|
+
* RIGHT → the child keeps its natural width, flush to the right edge of the fixed column (readouts, toggles — card view).
|
|
14
|
+
* CENTER → the child keeps its natural width, centered in the fixed column (readouts, toggles).
|
|
15
|
+
* FIT → the column DROPS its fixed width and sizes to its content (table view). The control takes
|
|
16
|
+
* its natural width and lays out in sequence with the trailing trash + status dot, so a wide
|
|
17
|
+
* control (climate stepper + mode select, cover triad + %) never overflows a fixed box and
|
|
18
|
+
* collides with the neighbours. FILL has no effect under FIT — a stretchy child in a
|
|
19
|
+
* content-width wrapper simply takes its natural width.
|
|
20
|
+
* FILL, RIGHT and CENTER share the fixed `w-[140px]` box (card / minimal / hero views). */
|
|
21
21
|
export declare function ControlColumn({ align, children, className, ...rest }: ControlColumnProps): ReactNode;
|
|
22
22
|
interface ValueReadoutProps {
|
|
23
|
-
|
|
24
|
-
|
|
23
|
+
readonly value: string;
|
|
24
|
+
readonly unit?: string;
|
|
25
25
|
}
|
|
26
26
|
/** A value + inline unit suffix (no separator). E.g. `60s`, `22%`. */
|
|
27
27
|
export declare function ValueReadout({ value, unit }: ValueReadoutProps): ReactNode;
|
|
28
28
|
interface StepperProps {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
29
|
+
readonly value: number | string;
|
|
30
|
+
readonly unit?: string;
|
|
31
|
+
readonly onDelta: (d: 1 | -1) => void;
|
|
32
32
|
}
|
|
33
33
|
/** Increment/decrement control with value + unit display. */
|
|
34
34
|
export declare function Stepper({ value, unit, onDelta }: StepperProps): ReactNode;
|
|
35
35
|
interface SlideToggleProps {
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
36
|
+
readonly on: boolean;
|
|
37
|
+
readonly targetLabel: string;
|
|
38
|
+
readonly onConfirm: () => void;
|
|
39
39
|
}
|
|
40
40
|
/** Safety slide: onConfirm fires only after the thumb is dragged past threshold, never on a plain tap. */
|
|
41
41
|
export declare function SlideToggle({ on, targetLabel, onConfirm }: SlideToggleProps): ReactNode;
|
|
42
42
|
interface ArcKnobProps {
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
43
|
+
readonly fraction: number;
|
|
44
|
+
readonly color: string;
|
|
45
|
+
/**
|
|
46
|
+
* Distance in px from the rotating container's top edge to the knob's top
|
|
47
|
+
* edge. The knob is 20px tall, so its CENTER sits at `knobTopPx + 10` px
|
|
48
|
+
* from the top. For the knob center to ride the ring's centre radius the
|
|
49
|
+
* caller passes `(containerCenter − ringRadius) − 10`. Defaults to the
|
|
50
|
+
* thermostat gauge value (176px container, radius 76 → 88 − 76 − 10 = 2).
|
|
51
|
+
*/
|
|
52
|
+
readonly knobTopPx?: number;
|
|
53
|
+
/**
|
|
54
|
+
* When provided, the knob becomes interactive: dragging it reports the new
|
|
55
|
+
* arc fraction (0..1) to the parent, which owns the value and re-renders the
|
|
56
|
+
* knob at the new `fraction`. When omitted the knob is a display-only
|
|
57
|
+
* indicator (no grab cursor, no pointer handlers).
|
|
58
|
+
*/
|
|
59
|
+
readonly onDragFraction?: (fraction: number) => void;
|
|
60
60
|
}
|
|
61
61
|
/** Half the ArcKnob's 20px (h-5) height. Callers seat the knob centre on a
|
|
62
|
-
|
|
62
|
+
* ring by computing `(containerCentre − ringRadius) − KNOB_HALF_PX`. */
|
|
63
63
|
export declare const KNOB_HALF_PX = 10;
|
|
64
64
|
/**
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
65
|
+
* White knob riding a circular arc at `fraction` (0..1). For thermostat/light/fan.
|
|
66
|
+
*
|
|
67
|
+
* Display-only by default. Pass `onDragFraction` to make the knob draggable:
|
|
68
|
+
* pointer capture is taken on the knob, and pointer moves are mapped to a new
|
|
69
|
+
* arc fraction reported back to the parent (the parent owns the value).
|
|
70
|
+
*/
|
|
71
71
|
export declare function ArcKnob({ fraction, color, knobTopPx, onDragFraction }: ArcKnobProps): ReactNode;
|
|
72
72
|
interface GripTrackProps {
|
|
73
|
-
|
|
74
|
-
|
|
73
|
+
readonly fraction: number;
|
|
74
|
+
readonly color?: string;
|
|
75
75
|
}
|
|
76
76
|
/**
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
77
|
+
* Horizontal track with a white grip thumb at `fraction` (0..1). For seek/volume/brightness.
|
|
78
|
+
* @remarks display-only indicator; interactive drag is deferred to a later task.
|
|
79
|
+
*/
|
|
80
80
|
export declare function GripTrack({ fraction, color }: GripTrackProps): ReactNode;
|
|
81
81
|
export {};
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { ReactNode } from
|
|
2
|
-
import { ControlPanelProps } from
|
|
3
|
-
export declare function BrightnessPanel({ trpc, deviceId, layout, optimistic
|
|
1
|
+
import type { ReactNode } from "react";
|
|
2
|
+
import type { ControlPanelProps } from "./types";
|
|
3
|
+
export declare function BrightnessPanel({ trpc, deviceId, layout, optimistic }: ControlPanelProps): ReactNode;
|
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
import { ReactNode } from
|
|
2
|
-
import { DeviceControlProps } from
|
|
1
|
+
import type { ReactNode } from "react";
|
|
2
|
+
import type { DeviceControlProps } from "./control-registry";
|
|
3
3
|
/**
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
4
|
+
* ButtonControl (inline) — compact "Press" trigger for a device-list row.
|
|
5
|
+
*
|
|
6
|
+
* The `button` cap is fire-only (no status / runtimeState), so we bypass
|
|
7
|
+
* `useDeviceCapability` (which requires a slice) and resolve the cap
|
|
8
|
+
* handle directly from the device proxy. We guard on `cap === undefined`
|
|
9
|
+
* (device has no button cap) and render nothing in that case.
|
|
10
|
+
*/
|
|
11
11
|
export declare function ButtonControl({ trpc, deviceId }: DeviceControlProps): ReactNode;
|
|
12
12
|
/**
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
13
|
+
* ButtonHeroCard — large press-actuator card for the device-detail hero area.
|
|
14
|
+
*
|
|
15
|
+
* Renders a centred "Press" button with real design-token classes. The cap is
|
|
16
|
+
* fire-only so no state display is needed — the affordance IS the control.
|
|
17
|
+
*/
|
|
18
18
|
export declare function ButtonHeroCard({ trpc, deviceId }: DeviceControlProps): ReactNode;
|
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
import { ReactNode } from
|
|
2
|
-
import { ControlPanelProps } from
|
|
3
|
-
import { HvacMode } from
|
|
1
|
+
import type { ReactNode } from "react";
|
|
2
|
+
import type { ControlPanelProps } from "./types.js";
|
|
3
|
+
import type { HvacMode } from "@camstack/types";
|
|
4
4
|
/**
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
5
|
+
* Exhaustive colour map — one entry per HvacMode. Build will fail if a
|
|
6
|
+
* mode is added to the enum and not reflected here (Record<HvacMode, ...>
|
|
7
|
+
* + `satisfies` means TypeScript enforces full coverage).
|
|
8
|
+
*/
|
|
9
9
|
export declare const MODE_COLOR: Record<HvacMode, string>;
|
|
10
10
|
/**
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
11
|
+
* Mode text-accent colour — applied to the compact (inline) temperature value
|
|
12
|
+
* as a subtle cue, replacing the old bordered/filled mode box so the control
|
|
13
|
+
* matches the borderless cover/lock inline visual language.
|
|
14
|
+
*/
|
|
15
15
|
export declare const MODE_TEXT_COLOR: Record<HvacMode, string>;
|
|
16
16
|
/** Active-mode button accent colour (applied to the pressed mode chip). */
|
|
17
17
|
export declare const MODE_CHIP_ACTIVE: Record<HvacMode, string>;
|
|
18
|
-
export declare function ClimatePanel({ trpc, deviceId, features: _features, layout, optimistic
|
|
18
|
+
export declare function ClimatePanel({ trpc, deviceId, features: _features, layout, optimistic }: ControlPanelProps): ReactNode;
|
|
@@ -1,21 +1,38 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
/**
|
|
2
|
+
* <ContainerPrimaryHero> — renders a CONTAINER device's detail hero AS its
|
|
3
|
+
* primary child.
|
|
4
|
+
*
|
|
5
|
+
* The container has no surface of its own: it resolves a primary child
|
|
6
|
+
* (priority default, or the operator's durable primary-child pick) and renders
|
|
7
|
+
* THAT child's `HeroCard` from the shared control registry, bound to the child's
|
|
8
|
+
* numeric id — identical to opening the child device directly.
|
|
9
|
+
*
|
|
10
|
+
* The override is persisted as the chosen child's re-sync/rename-stable
|
|
11
|
+
* `entityId` (`primaryChildEntityId`); resolution matches on it directly — see
|
|
12
|
+
* `container-primary.ts`. A legacy numeric `linkDeviceId` is still honored as a
|
|
13
|
+
* fallback. Other children remain as detail tabs (owned by the device-detail
|
|
14
|
+
* page); this component only owns the hero surface. The "primary child" picker
|
|
15
|
+
* that overrides the resolution lives in the device's primary config block (see
|
|
16
|
+
* admin-ui `PrimaryChildRow`), wired to `deviceManager.setPrimaryChildEntityId`.
|
|
17
|
+
*/
|
|
18
|
+
import type { ReactNode } from "react";
|
|
19
|
+
import type { UseDeviceProxyTrpc } from "../../hooks/use-device-proxy";
|
|
20
|
+
import { type ContainerChild } from "./container-primary";
|
|
4
21
|
/** A child row the hero can render. */
|
|
5
22
|
export interface ContainerHeroChild extends ContainerChild {
|
|
6
|
-
|
|
7
|
-
|
|
23
|
+
readonly name: string;
|
|
24
|
+
readonly features?: readonly string[];
|
|
8
25
|
}
|
|
9
26
|
export interface ContainerPrimaryHeroProps {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
27
|
+
readonly trpc: UseDeviceProxyTrpc;
|
|
28
|
+
/** The container's entity-children (from `deviceManager.getChildren`). */
|
|
29
|
+
readonly children: readonly ContainerHeroChild[];
|
|
30
|
+
/** Container's LEGACY persisted primary-child override (numeric child id) —
|
|
31
|
+
* consulted only when no durable `primaryChildEntityId` is set. */
|
|
32
|
+
readonly linkDeviceId: number | null | undefined;
|
|
33
|
+
/** Container's DURABLE primary-child override (chosen child's entityId) —
|
|
34
|
+
* null/undefined ⇒ no durable override (falls back to linkDeviceId, then
|
|
35
|
+
* priority default). */
|
|
36
|
+
readonly primaryChildEntityId?: string | null | undefined;
|
|
20
37
|
}
|
|
21
|
-
export declare function ContainerPrimaryHero({ trpc, children, linkDeviceId, primaryChildEntityId
|
|
38
|
+
export declare function ContainerPrimaryHero({ trpc, children, linkDeviceId, primaryChildEntityId }: ContainerPrimaryHeroProps): ReactNode;
|
|
@@ -1,50 +1,79 @@
|
|
|
1
|
-
import { ChildRef } from './primary-child';
|
|
2
1
|
/**
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
2
|
+
* Container → primary-child resolution glue.
|
|
3
|
+
*
|
|
4
|
+
* A CONTAINER device hosts N entity-children and renders AS its primary child
|
|
5
|
+
* (same row InlineControl, same detail HeroCard). The choice of primary child:
|
|
6
|
+
*
|
|
7
|
+
* - DEFAULT: the highest-priority child by type (lock > climate > light > …),
|
|
8
|
+
* via the pure {@link resolvePrimaryChild} resolver (Task 4.1).
|
|
9
|
+
* - OVERRIDE: an operator picks a child via the discreet primary-child picker.
|
|
10
|
+
* The override is persisted on the container's `linkDeviceId` field (the
|
|
11
|
+
* real, kernel-backed soft-link — see `device-manager.cap.ts` `setLinkDeviceId`).
|
|
12
|
+
*
|
|
13
|
+
* The source of truth for the override is the child's re-sync-stable `entityId`
|
|
14
|
+
* (its `sourceInfo.id`, falling back to `stableId`).
|
|
15
|
+
*
|
|
16
|
+
* DURABLE (preferred): the container persists the chosen child's `entityId`
|
|
17
|
+
* directly on its `primaryChildEntityId` meta field (see
|
|
18
|
+
* `device-manager.setPrimaryChildEntityId`). This survives a re-sync/rename
|
|
19
|
+
* that reallocates the child's numeric id — the resolver matches on entityId.
|
|
20
|
+
*
|
|
21
|
+
* LEGACY (fallback): older picks persist the numeric child id on `linkDeviceId`.
|
|
22
|
+
* At RENDER we re-derive the entityId from the live child set so a re-sync that
|
|
23
|
+
* KEEPS the numeric id still resolves; when the linked numeric id no longer
|
|
24
|
+
* matches any live child (stale link), we pass `undefined` to the resolver → it
|
|
25
|
+
* falls back to the priority default.
|
|
26
|
+
*
|
|
27
|
+
* Resolution prefers `primaryChildEntityId` and only consults `linkDeviceId`
|
|
28
|
+
* when no durable override is present, so existing persisted links keep working.
|
|
29
|
+
*/
|
|
30
|
+
import type { ChildRef } from "./primary-child";
|
|
31
|
+
/**
|
|
32
|
+
* Minimal shape this module needs from a child device row. Structurally
|
|
33
|
+
* compatible with `DeviceItemDevice` / `DeviceInfo` — callers pass the raw
|
|
34
|
+
* `getChildren` rows through.
|
|
35
|
+
*/
|
|
7
36
|
export interface ContainerChild {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
37
|
+
readonly id: number;
|
|
38
|
+
readonly stableId: string;
|
|
39
|
+
readonly type: string;
|
|
40
|
+
readonly sourceInfo?: {
|
|
41
|
+
readonly id: string;
|
|
42
|
+
} | undefined;
|
|
43
|
+
/** `DeviceRole`, ranked above `type` when picking a container's primary. */
|
|
44
|
+
readonly role?: string | null | undefined;
|
|
45
|
+
/** Operator-facing name — used for the namesake tiebreak. */
|
|
46
|
+
readonly name?: string | undefined;
|
|
18
47
|
}
|
|
19
48
|
/**
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
49
|
+
* Re-sync-stable identity of a child. Prefers the upstream-system dispatch key
|
|
50
|
+
* (`sourceInfo.id` — e.g. HA `entity_id`); falls back to `stableId` for
|
|
51
|
+
* providers that never populated SourceInfo. Both survive a re-sync that may
|
|
52
|
+
* reallocate the numeric `id`.
|
|
53
|
+
*/
|
|
25
54
|
export declare function childEntityId(child: ContainerChild): string;
|
|
26
55
|
/** Project a raw child row onto the pure resolver's {@link ChildRef} shape. */
|
|
27
56
|
export declare function containerChildToRef(child: ContainerChild): ChildRef;
|
|
28
57
|
/**
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
58
|
+
* Resolve the entityId override from the container's persisted `linkDeviceId`.
|
|
59
|
+
* Returns the linked child's stable entityId, or `undefined` when there is no
|
|
60
|
+
* link or the link is stale (points to a numeric id no longer present) — in
|
|
61
|
+
* which case the resolver falls back to the priority default.
|
|
62
|
+
*/
|
|
34
63
|
export declare function overrideEntityIdFromLink(children: readonly ContainerChild[], linkDeviceId: number | null | undefined): string | undefined;
|
|
35
64
|
/**
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
65
|
+
* Full container → primary-child resolution: project children to refs, resolve
|
|
66
|
+
* the override entityId, and delegate to the pure resolver. Returns `null` for a
|
|
67
|
+
* container with no children (caller degrades gracefully).
|
|
68
|
+
*
|
|
69
|
+
* Override precedence:
|
|
70
|
+
* 1. `primaryChildEntityId` — the DURABLE override (re-sync/rename-stable),
|
|
71
|
+
* passed straight to the resolver which matches on `entityId`. Wins when a
|
|
72
|
+
* non-empty string is supplied.
|
|
73
|
+
* 2. `linkDeviceId` — LEGACY numeric override, re-derived to an entityId from
|
|
74
|
+
* the live child set. Consulted only when there is no durable override.
|
|
75
|
+
*
|
|
76
|
+
* When neither resolves to a live child, the resolver falls back to the
|
|
77
|
+
* priority default.
|
|
78
|
+
*/
|
|
50
79
|
export declare function resolveContainerPrimary(children: readonly ContainerChild[], linkDeviceId: number | null | undefined, primaryChildEntityId?: string | null | undefined): ChildRef | null;
|