@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,23 +1,43 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
/**
|
|
2
|
+
* <DeviceItemPreview> — type-dispatched preview slot.
|
|
3
|
+
*
|
|
4
|
+
* Renders, in order:
|
|
5
|
+
* 1. Status pills — battery %, charging plug, sleeping moon (when
|
|
6
|
+
* the device exposes a battery slice). These were previously in
|
|
7
|
+
* the Features cell; they belong here because they describe the
|
|
8
|
+
* preview-relevant state (a sleeping cam can't snapshot, a low
|
|
9
|
+
* battery cam may drop frames).
|
|
10
|
+
* 2. Snapshot thumbnail — a small camera snapshot that expands into a
|
|
11
|
+
* portal-positioned enlarged preview on hover/focus (shared
|
|
12
|
+
* `HoverZoomImage`). The portal + flip-on-collision keep the preview
|
|
13
|
+
* from being clipped by the device-grid's overflow ancestors. Gated
|
|
14
|
+
* on `enabled` (camera + showSnapshot flag) AND device.online for the
|
|
15
|
+
* live snapshot fetch; offline/unfetched shows a placeholder box so
|
|
16
|
+
* the cell stays compact.
|
|
17
|
+
*
|
|
18
|
+
* The status-pills section renders for ANY battery-operated device,
|
|
19
|
+
* camera or otherwise; the snapshot thumbnail stays gated on cameras.
|
|
20
|
+
*/
|
|
21
|
+
import { type ReactNode } from "react";
|
|
22
|
+
import type { UseDeviceProxyTrpc } from "../../hooks/use-device-proxy";
|
|
23
|
+
import type { DeviceItemDevice } from "./helpers";
|
|
4
24
|
export interface DeviceItemPreviewProps {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
25
|
+
readonly trpc: UseDeviceProxyTrpc;
|
|
26
|
+
readonly device: DeviceItemDevice;
|
|
27
|
+
readonly status: "online" | "offline" | "disabled";
|
|
28
|
+
/**
|
|
29
|
+
* Render gate for the snapshot thumbnail (typically
|
|
30
|
+
* `flags.showSnapshot && isCamera` from the orchestrator). Even when
|
|
31
|
+
* `false`, the component still renders the status-pills row when
|
|
32
|
+
* `showStatusPills` is on.
|
|
33
|
+
*/
|
|
34
|
+
readonly enabled: boolean;
|
|
35
|
+
/**
|
|
36
|
+
* When true, render the battery / charging / sleeping pills next to
|
|
37
|
+
* the snapshot thumbnail. Driven by table view (where the Preview cell
|
|
38
|
+
* is the natural home for status indicators); off in card view to keep
|
|
39
|
+
* the row narrow.
|
|
40
|
+
*/
|
|
41
|
+
readonly showStatusPills?: boolean;
|
|
22
42
|
}
|
|
23
|
-
export declare function DeviceItemPreview({ trpc, device, status, enabled, showStatusPills
|
|
43
|
+
export declare function DeviceItemPreview({ trpc, device, status, enabled, showStatusPills }: DeviceItemPreviewProps): ReactNode;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { ReactNode } from
|
|
1
|
+
import type { ReactNode } from "react";
|
|
2
2
|
export interface DeviceQuickDetailActionProps {
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
readonly deviceId: number;
|
|
4
|
+
readonly className?: string;
|
|
5
5
|
}
|
|
6
|
-
export declare function DeviceQuickDetailAction({ deviceId, className
|
|
6
|
+
export declare function DeviceQuickDetailAction({ deviceId, className }: DeviceQuickDetailActionProps): ReactNode;
|
|
@@ -1,9 +1,30 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
/**
|
|
2
|
+
* <RebootQuickAction> — a dedicated row-level reboot affordance.
|
|
3
|
+
*
|
|
4
|
+
* Replaces the old kebab-nested "Reboot device" item: reboot now has its
|
|
5
|
+
* own icon button in the row, alongside the PTZ quick-action. Because
|
|
6
|
+
* reboot is destructive and low-frequency, the button is NOT a one-click
|
|
7
|
+
* action — clicking it opens a confirm modal (the shared `Dialog`
|
|
8
|
+
* primitive, same surface `ConfirmActionButton` uses). The cap is only
|
|
9
|
+
* invoked once the operator confirms.
|
|
10
|
+
*
|
|
11
|
+
* Cap-gating mirrors the former MoreActionsMenu exactly: render only when
|
|
12
|
+
* the device proxy has resolved AND the `reboot` cap is bound. The caller
|
|
13
|
+
* pre-gates on the `rebootable` feature; this atom self-gates on the live
|
|
14
|
+
* cap binding, so a device that claims the feature without a bound
|
|
15
|
+
* provider still renders nothing.
|
|
16
|
+
*
|
|
17
|
+
* The reboot call shows a busy/disabled state while in flight, closes the
|
|
18
|
+
* modal on success, and surfaces errors inline at the dialog's bottom.
|
|
19
|
+
* `stopPropagation` on the trigger keeps the row's navigate-to-detail
|
|
20
|
+
* handler from firing.
|
|
21
|
+
*/
|
|
22
|
+
import { type ReactNode } from "react";
|
|
23
|
+
import type { UseDeviceProxyTrpc } from "../../hooks/use-device-proxy";
|
|
3
24
|
export interface RebootQuickActionProps {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
25
|
+
readonly trpc: UseDeviceProxyTrpc;
|
|
26
|
+
readonly deviceId: number;
|
|
27
|
+
/** Device display name — woven into the confirm-modal body. */
|
|
28
|
+
readonly deviceName: string;
|
|
8
29
|
}
|
|
9
|
-
export declare function RebootQuickAction({ trpc, deviceId, deviceName
|
|
30
|
+
export declare function RebootQuickAction({ trpc, deviceId, deviceName }: RebootQuickActionProps): ReactNode;
|
|
@@ -1,21 +1,37 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Role display defaults — the operator's per-ROLE icon/unit/precision
|
|
3
|
+
* (`deviceManager.getRoleDisplayDefaults`), published once at the top of a
|
|
4
|
+
* surface and read by every row that draws a device.
|
|
5
|
+
*
|
|
6
|
+
* Why a context and not a hook per row: `deviceLeadIcon` is called in the row
|
|
7
|
+
* header and in the accessory accordion, both of which render in tests and
|
|
8
|
+
* in surfaces with no tRPC provider (a standalone `<DeviceItem>`). A generated
|
|
9
|
+
* query hook throws outside its provider; a context degrades to "no defaults"
|
|
10
|
+
* and the icon falls through to the built-in role glyph — which is exactly
|
|
11
|
+
* what the resolution order says happens when there is no default.
|
|
12
|
+
*
|
|
13
|
+
* `RoleDisplayDefaultsFromServer` is the one component that calls the query
|
|
14
|
+
* hook; mount it once inside `<trpc.Provider>` (the admin app does, in
|
|
15
|
+
* `App.tsx`) and every list below it resolves the operator's role icon.
|
|
16
|
+
*/
|
|
17
|
+
import type { RoleDisplayDefault } from "@camstack/types";
|
|
18
|
+
import { type ReactNode } from "react";
|
|
3
19
|
/** `role string → default`. Absent role = no default. */
|
|
4
20
|
export type RoleDisplayDefaults = Readonly<Record<string, RoleDisplayDefault>>;
|
|
5
21
|
export interface RoleDisplayDefaultsProviderProps {
|
|
6
|
-
|
|
7
|
-
|
|
22
|
+
readonly value: RoleDisplayDefaults;
|
|
23
|
+
readonly children: ReactNode;
|
|
8
24
|
}
|
|
9
|
-
export declare function RoleDisplayDefaultsProvider({ value, children
|
|
25
|
+
export declare function RoleDisplayDefaultsProvider({ value, children }: RoleDisplayDefaultsProviderProps): ReactNode;
|
|
10
26
|
/** The defaults published by the nearest provider — an empty record outside
|
|
11
|
-
|
|
27
|
+
* one, never `undefined`, so a caller can index it without a guard. */
|
|
12
28
|
export declare function useRoleDisplayDefaults(): RoleDisplayDefaults;
|
|
13
29
|
export interface RoleDisplayDefaultsFromServerProps {
|
|
14
|
-
|
|
30
|
+
readonly children: ReactNode;
|
|
15
31
|
}
|
|
16
32
|
/**
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
export declare function RoleDisplayDefaultsFromServer({ children
|
|
33
|
+
* Reads the defaults from the hub and publishes them. Until the query lands
|
|
34
|
+
* the children see no defaults — the built-in role glyph, which is what they
|
|
35
|
+
* would see with no operator default at all, so nothing flashes wrong.
|
|
36
|
+
*/
|
|
37
|
+
export declare function RoleDisplayDefaultsFromServer({ children }: RoleDisplayDefaultsFromServerProps): ReactNode;
|
|
@@ -1,9 +1,27 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Status indicator dot — parity with the viewer's camera status dot.
|
|
3
|
+
* Pure-render atom; no fetches, no internal state (the row resolves the
|
|
4
|
+
* recording-aware status and passes it in).
|
|
5
|
+
*
|
|
6
|
+
* Colour by fixed priority (the row resolves which one applies):
|
|
7
|
+
* • disabled → black (+ ring so it stays visible) — soft-disabled.
|
|
8
|
+
* • offline → grey — not disabled, not reachable.
|
|
9
|
+
* • recording-continuous → red — online + always-on recording.
|
|
10
|
+
* • recording-events → blue — online + on-motion recording.
|
|
11
|
+
* • online → green — online, recording off.
|
|
12
|
+
*
|
|
13
|
+
* The "alive" states (online + recording) pulse; offline + disabled are static.
|
|
14
|
+
*
|
|
15
|
+
* When `status === 'offline'` and a `lastChangedAt` (ms epoch of the last
|
|
16
|
+
* online→offline transition) is supplied, the hover tooltip is enriched to
|
|
17
|
+
* "Offline · last seen Xm ago".
|
|
18
|
+
*/
|
|
19
|
+
import type { ReactNode } from "react";
|
|
20
|
+
export type StatusDotStatus = "online" | "offline" | "disabled" | "recording-continuous" | "recording-events";
|
|
3
21
|
export interface StatusDotProps {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
22
|
+
readonly status: StatusDotStatus;
|
|
23
|
+
/** Ms epoch of the last online→offline transition. Only used to enrich
|
|
24
|
+
* the tooltip when `status === 'offline'`. */
|
|
25
|
+
readonly lastChangedAt?: number | null;
|
|
8
26
|
}
|
|
9
27
|
export declare function StatusDot({ status, lastChangedAt }: StatusDotProps): ReactNode;
|
|
@@ -1,15 +1,26 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* <DeviceBatchActionsBar> — responsive wrapper around <DeviceBatchToolbar>.
|
|
3
|
+
*
|
|
4
|
+
* Surfaces the available bulk actions once devices are selected:
|
|
5
|
+
* - L2+ (`sm` and up): the toolbar renders inline as a row of buttons.
|
|
6
|
+
* - L1 (`< sm`): a compact "Actions · N" trigger opens a popover that
|
|
7
|
+
* hosts the SAME <DeviceBatchToolbar>, so the action logic (inline
|
|
8
|
+
* delete-confirm, clear) is reused verbatim — never forked.
|
|
9
|
+
*
|
|
10
|
+
* Renders nothing while the selection is empty (delegated to the toolbar).
|
|
11
|
+
*/
|
|
12
|
+
import { type ReactNode } from "react";
|
|
2
13
|
export interface DeviceBatchActionsBarProps {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
+
readonly selectedIds: ReadonlySet<number>;
|
|
15
|
+
readonly onClear: () => void;
|
|
16
|
+
readonly remove: (input: {
|
|
17
|
+
deviceId: number;
|
|
18
|
+
}) => void;
|
|
19
|
+
readonly disable: (input: {
|
|
20
|
+
deviceId: number;
|
|
21
|
+
}) => void;
|
|
22
|
+
readonly enable: (input: {
|
|
23
|
+
deviceId: number;
|
|
24
|
+
}) => void;
|
|
14
25
|
}
|
|
15
26
|
export declare function DeviceBatchActionsBar(props: DeviceBatchActionsBarProps): ReactNode;
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
import { ReactNode } from
|
|
1
|
+
import { type ReactNode } from "react";
|
|
2
2
|
export interface DeviceBatchToolbarProps {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
3
|
+
readonly selectedIds: ReadonlySet<number>;
|
|
4
|
+
readonly onClear: () => void;
|
|
5
|
+
readonly remove: (input: {
|
|
6
|
+
deviceId: number;
|
|
7
|
+
}) => void;
|
|
8
|
+
readonly disable: (input: {
|
|
9
|
+
deviceId: number;
|
|
10
|
+
}) => void;
|
|
11
|
+
readonly enable: (input: {
|
|
12
|
+
deviceId: number;
|
|
13
|
+
}) => void;
|
|
14
14
|
}
|
|
15
|
-
export declare function DeviceBatchToolbar({ selectedIds, onClear, remove, disable, enable
|
|
15
|
+
export declare function DeviceBatchToolbar({ selectedIds, onClear, remove, disable, enable }: DeviceBatchToolbarProps): ReactNode;
|
|
@@ -1,128 +1,128 @@
|
|
|
1
1
|
/**
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
2
|
+
* Device-mode column model: a fixed catalog, a per-context subset matrix,
|
|
3
|
+
* a responsive priority, and a priority-derived breakpoint mapping. Each
|
|
4
|
+
* consumer declares its `TableContext`; the table renders only the columns
|
|
5
|
+
* that context enables, in catalog order, hiding the optional ones as the
|
|
6
|
+
* viewport narrows.
|
|
7
|
+
*
|
|
8
|
+
* The catalog is intentionally device-mode only. Generic-mode (integration
|
|
9
|
+
* rows) keeps its own `DeviceListColumn[]` defs — reconciled in a later phase.
|
|
10
|
+
*
|
|
11
|
+
* ── Responsive convention (single source of truth) ────────────────────────
|
|
12
|
+
* LOWER priority number = MORE important = hidden at a NARROWER width (kept
|
|
13
|
+
* longest). So as the viewport shrinks the HIGHEST-priority-number column
|
|
14
|
+
* drops first.
|
|
15
|
+
*
|
|
16
|
+
* name (0) — never hidden; pinned left from `md` up (see
|
|
17
|
+
* `NAME_COLUMN_PIN_CLASS`), scrolls below it
|
|
18
|
+
* previewActions (1) — never hidden; carries the live control + status dot
|
|
19
|
+
* icon (2) — integration badge; rendered INSIDE the name cell,
|
|
20
|
+
* not a standalone column, so it has no breakpoint
|
|
21
|
+
* features (3) — optional; hidden below `md` (kept longer)
|
|
22
|
+
* type (4) — optional; hidden below `lg`
|
|
23
|
+
* manufacturer (5) — optional; hidden below `xl` (drops FIRST,
|
|
24
|
+
* wide-screen-only hardware/identity column)
|
|
25
|
+
*
|
|
26
|
+
* `COLUMN_BREAKPOINT_CLASS` derives ONE Tailwind visibility class per id and
|
|
27
|
+
* is the single source used by BOTH the `<th>` and the `<td>`, so a hidden
|
|
28
|
+
* column folds header + cell in lock-step. The drop order is therefore:
|
|
29
|
+
* `manufacturer` first (below `xl`), then `type` (below `lg`), then
|
|
30
|
+
* `features` (below `md`) — matching the priority numbers above.
|
|
31
|
+
*/
|
|
32
32
|
/** Fixed device-mode column catalog, in render order. `name` is always first.
|
|
33
|
-
|
|
34
|
-
|
|
33
|
+
* `manufacturer` sits after `type` — a wide-screen-only hardware/identity
|
|
34
|
+
* column (manufacturer · model, full metadata in a tooltip). */
|
|
35
35
|
export declare const DEVICE_COLUMNS: readonly ["name", "icon", "type", "manufacturer", "features", "previewActions"];
|
|
36
36
|
export type DeviceColumnId = (typeof DEVICE_COLUMNS)[number];
|
|
37
37
|
/**
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
export type TableContext =
|
|
38
|
+
* The places a device table is rendered; each declares its column subset.
|
|
39
|
+
*
|
|
40
|
+
* Device-detail CHILDREN are deliberately NOT a table context: they render as
|
|
41
|
+
* a stack of `<DeviceItem variant="minimal">` cards (see `ChildrenList`), not
|
|
42
|
+
* through this table, so no `device-children` context exists.
|
|
43
|
+
*/
|
|
44
|
+
export type TableContext = "devices" | "integration-detail";
|
|
45
45
|
export declare function columnsForContext(ctx: TableContext): readonly DeviceColumnId[];
|
|
46
46
|
/**
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
47
|
+
* Lower number = higher priority (kept longest as width shrinks). `name` = 0
|
|
48
|
+
* (never dropped); `previewActions` = 1 (always visible). The optional
|
|
49
|
+
* columns drop in REVERSE priority order as width shrinks — highest number
|
|
50
|
+
* (`type`) hides first, then `features`. `icon` is a name-cell badge, not a
|
|
51
|
+
* standalone column. See `COLUMN_BREAKPOINT_CLASS` for the derived classes.
|
|
52
|
+
*/
|
|
53
53
|
export declare const COLUMN_PRIORITY: Record<DeviceColumnId, number>;
|
|
54
54
|
/**
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
55
|
+
* Priority-derived Tailwind visibility class per column. Used by BOTH the
|
|
56
|
+
* `<th>` and the `<td>` (single source → header + cell stay in lock-step).
|
|
57
|
+
*
|
|
58
|
+
* - `name` / `previewActions`: empty string — never hidden (always visible).
|
|
59
|
+
* - `icon`: empty string — rendered inside the name cell, no standalone cell.
|
|
60
|
+
* - `features`: `hidden md:table-cell` — visible from `md` up (kept longer).
|
|
61
|
+
* - `type`: `hidden lg:table-cell` — visible only from `lg` up.
|
|
62
|
+
* - `manufacturer`: `hidden xl:table-cell` — visible only from `xl` up (drops
|
|
63
|
+
* first).
|
|
64
|
+
*
|
|
65
|
+
* Drop order as the viewport narrows therefore follows the priority numbers:
|
|
66
|
+
* `manufacturer` (5) disappears below `xl`, then `type` (4) below `lg`, then
|
|
67
|
+
* `features` (3) below `md`.
|
|
68
|
+
*/
|
|
69
69
|
export declare const COLUMN_BREAKPOINT_CLASS: Record<DeviceColumnId, string>;
|
|
70
70
|
/**
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
71
|
+
* ── The NAME column pin ───────────────────────────────────────────────────
|
|
72
|
+
*
|
|
73
|
+
* A sticky first column earns its keep only where the remaining columns still
|
|
74
|
+
* fit BESIDE it. Read the drop order above: below `md` every optional column
|
|
75
|
+
* is already folded away, so the table is NAME + Preview and there is nothing
|
|
76
|
+
* left to scroll under the pin — the pinned column simply holds its width
|
|
77
|
+
* permanently and pushes Preview off the right edge. On a phone the viewport
|
|
78
|
+
* is narrower than the pinned column alone, which is the reported defect:
|
|
79
|
+
* "il nome alla sinistra è fixed, dovrebbe scorrere naturalmente." [the name on the left is fixed, it should scroll naturally.]
|
|
80
|
+
*
|
|
81
|
+
* So the pin starts at `md`, the same width at which `features` returns and a
|
|
82
|
+
* column exists to scroll under it. Below `md` the name column scrolls with
|
|
83
|
+
* everything else.
|
|
84
|
+
*/
|
|
85
85
|
export declare const NAME_COLUMN_PIN_BREAKPOINT: "md";
|
|
86
86
|
/** Pin classes for the NAME `<th>`/`<td>` — never unconditional. */
|
|
87
87
|
export declare const NAME_COLUMN_PIN_CLASS: "md:sticky md:left-0 md:z-[1]";
|
|
88
88
|
/**
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
89
|
+
* ── The NAME never truncates below the pin breakpoint ─────────────────────
|
|
90
|
+
*
|
|
91
|
+
* Fitting NAME + Preview inside a phone viewport was the wrong trade: every
|
|
92
|
+
* camera collapsed to "Videocamera ve…" / "Videocamera co…", which is not a
|
|
93
|
+
* shortened name, it is NO name — the rows became indistinguishable and the
|
|
94
|
+
* one thing the operator opened the page to read was the part that got cut.
|
|
95
|
+
*
|
|
96
|
+
* So below `md` the name is rendered in FULL on one line and the table is
|
|
97
|
+
* allowed to grow past the viewport; the wrapper's existing `overflow-x-auto`
|
|
98
|
+
* (ONE scroll context for the whole body, so every column stays aligned with
|
|
99
|
+
* its header) carries the overflow. From `md` up nothing changes: the width
|
|
100
|
+
* cap, the ellipsis and the pin all return, because names already fit there.
|
|
101
|
+
*
|
|
102
|
+
* Same breakpoint as the pin, deliberately — the pin exists only where other
|
|
103
|
+
* columns still fit beside NAME, which is exactly the width at which NAME no
|
|
104
|
+
* longer needs the whole viewport.
|
|
105
|
+
*/
|
|
106
106
|
export declare const NAME_COLUMN_TRUNCATE_BREAKPOINT: "md";
|
|
107
107
|
/**
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
108
|
+
* NAME column width — a desktop concession, never unconditional ([D43]).
|
|
109
|
+
* Below `md` the column carries no width at all, so it sizes to the name and
|
|
110
|
+
* widens the table; the roomier capped desktop width returns with the pin.
|
|
111
|
+
*/
|
|
112
112
|
export declare const NAME_COLUMN_WIDTH_CLASS: "md:w-64 md:max-w-[16rem]";
|
|
113
113
|
/**
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
114
|
+
* The name TEXT inside a table row. `whitespace-nowrap` keeps it on one line
|
|
115
|
+
* at every width; `md:truncate` adds the overflow-hidden + ellipsis pair from
|
|
116
|
+
* `md` up. Below `md` there is no ellipsis and no clip — the full string is
|
|
117
|
+
* laid out, and it is the name that sizes the column.
|
|
118
|
+
*
|
|
119
|
+
* Measured (Chromium, 390px viewport, a 288px name in a 388px table): the two
|
|
120
|
+
* things that were cutting it are exactly this `truncate` and the width cap
|
|
121
|
+
* above. The `min-w-0` / `overflow-hidden` on the cell and on the header's
|
|
122
|
+
* flex chain are INERT below `md` — an uncapped table cell sizes to its
|
|
123
|
+
* content's min-content width regardless — so they are deliberately left
|
|
124
|
+
* unconditional: they cost nothing here and they keep clipping (rather than
|
|
125
|
+
* overlapping the Preview column) as the failure mode if anything ever does
|
|
126
|
+
* force this column narrow.
|
|
127
|
+
*/
|
|
128
128
|
export declare const NAME_TEXT_CLASS: "whitespace-nowrap md:truncate";
|
|
@@ -1,69 +1,59 @@
|
|
|
1
1
|
/**
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
2
|
+
* resolveDeviceIntegration — the ONE answer to "which integration does this
|
|
3
|
+
* device belong to".
|
|
4
|
+
*
|
|
5
|
+
* A device row carries two different ids:
|
|
6
|
+
* - `integrationId` — the integration that CREATED it (`IntegrationWithState.id`).
|
|
7
|
+
* - `addonId` — the addon that owns and SERVES it.
|
|
8
|
+
*
|
|
9
|
+
* They can differ. A composed device (D659) is created under the "Blocks"
|
|
10
|
+
* integration (`int_0024`, whose own `addonId` is `core-blocks`) but is
|
|
11
|
+
* served by the `composer` addon, so its row reads `addonId: 'composer'`.
|
|
12
|
+
* Resolving by `addonId` put it under no integration at all: the Devices
|
|
13
|
+
* filter, the Integration page's list, the device header and the orphan box
|
|
14
|
+
* each asked the question their own way, and every one of them got it wrong.
|
|
15
|
+
*
|
|
16
|
+
* The rule:
|
|
17
|
+
* 1. `integrationId` present ⇒ it is authoritative. The device belongs to
|
|
18
|
+
* the integration with that `id`, or — when no registered integration has
|
|
19
|
+
* it — to none (orphan), WHATEVER its `addonId` says.
|
|
20
|
+
* 2. No `integrationId` (legacy rows) ⇒ the `addonId` IS the integration
|
|
21
|
+
* link: the device belongs to the first integration whose `addonId`
|
|
22
|
+
* matches, or is orphan when none does.
|
|
23
|
+
* 3. A row that names neither is `unlinked` — it points at nothing, so it
|
|
24
|
+
* cannot be orphaned by a missing integration.
|
|
25
|
+
*
|
|
26
|
+
* And the load-bearing case: `integrations === null | undefined` means the
|
|
27
|
+
* integrations query has NOT ANSWERED. That is `unknown`, never `orphan` —
|
|
28
|
+
* an unanswered list is not an empty one (D315), and classifying against it
|
|
29
|
+
* branded every device orphan for seconds on a slow server (2026-08-18).
|
|
30
|
+
*/
|
|
31
31
|
/** The two fields of a device row the rule reads. */
|
|
32
32
|
export interface DeviceIntegrationLink {
|
|
33
|
-
|
|
34
|
-
|
|
33
|
+
readonly addonId?: string | null;
|
|
34
|
+
readonly integrationId?: string | null;
|
|
35
35
|
}
|
|
36
36
|
/** The two fields of an `integrations.list` row the rule reads. */
|
|
37
37
|
export interface DeviceIntegrationRef {
|
|
38
|
-
|
|
39
|
-
|
|
38
|
+
readonly id: string;
|
|
39
|
+
readonly addonId: string;
|
|
40
40
|
}
|
|
41
|
-
export type DeviceIntegrationResolution<I extends DeviceIntegrationRef = DeviceIntegrationRef> =
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
| {
|
|
49
|
-
|
|
50
|
-
}
|
|
51
|
-
/** The device names no link at all (no `integrationId`, empty `addonId`). */
|
|
52
|
-
| {
|
|
53
|
-
readonly kind: 'unlinked';
|
|
54
|
-
}
|
|
55
|
-
/** The integrations query has not answered yet — nothing can be said. */
|
|
56
|
-
| {
|
|
57
|
-
readonly kind: 'unknown';
|
|
41
|
+
export type DeviceIntegrationResolution<I extends DeviceIntegrationRef = DeviceIntegrationRef> = {
|
|
42
|
+
readonly kind: "resolved";
|
|
43
|
+
readonly integration: I;
|
|
44
|
+
} | {
|
|
45
|
+
readonly kind: "orphan";
|
|
46
|
+
} | {
|
|
47
|
+
readonly kind: "unlinked";
|
|
48
|
+
} | {
|
|
49
|
+
readonly kind: "unknown";
|
|
58
50
|
};
|
|
59
51
|
export type DeviceIntegrationResolver<I extends DeviceIntegrationRef = DeviceIntegrationRef> = (device: DeviceIntegrationLink) => DeviceIntegrationResolution<I>;
|
|
60
|
-
export declare function resolveDeviceIntegration<I extends DeviceIntegrationRef>(device: DeviceIntegrationLink,
|
|
61
|
-
/** The `integrations.list` answer, or `null`/`undefined` while unanswered. */
|
|
62
|
-
integrations: readonly I[] | null | undefined): DeviceIntegrationResolution<I>;
|
|
52
|
+
export declare function resolveDeviceIntegration<I extends DeviceIntegrationRef>(device: DeviceIntegrationLink, integrations: readonly I[] | null | undefined): DeviceIntegrationResolution<I>;
|
|
63
53
|
/**
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
54
|
+
* The rule itself, prepared once over a list for per-row use on a large
|
|
55
|
+
* fleet (two map lookups per row, not two scans). `resolveDeviceIntegration`
|
|
56
|
+
* is this, applied to one device; `<DeviceList integrationOf>` takes the
|
|
57
|
+
* returned resolver.
|
|
58
|
+
*/
|
|
69
59
|
export declare function deviceIntegrationResolver<I extends DeviceIntegrationRef>(integrations: readonly I[] | null | undefined): DeviceIntegrationResolver<I>;
|