@seamapi/react 2.13.0 → 2.15.0

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.
Files changed (78) hide show
  1. package/README.md +2 -2
  2. package/dist/elements.js +22690 -16027
  3. package/dist/elements.js.map +1 -1
  4. package/dist/index.css +49 -1
  5. package/dist/index.css.map +1 -1
  6. package/dist/index.min.css +1 -1
  7. package/dist/index.min.css.map +1 -1
  8. package/lib/dates.d.ts +1 -0
  9. package/lib/dates.js +4 -0
  10. package/lib/dates.js.map +1 -1
  11. package/lib/icons/NoiseLevels.d.ts +2 -0
  12. package/lib/icons/NoiseLevels.js +5 -0
  13. package/lib/icons/NoiseLevels.js.map +1 -0
  14. package/lib/seam/components/AccessCodeDetails/AccessCodeDetails.d.ts +1 -1
  15. package/lib/seam/components/AccessCodeDetails/AccessCodeDetails.js +2 -2
  16. package/lib/seam/components/AccessCodeDetails/AccessCodeDetails.js.map +1 -1
  17. package/lib/seam/components/AccessCodeTable/AccessCodeTable.d.ts +1 -1
  18. package/lib/seam/components/AccessCodeTable/AccessCodeTable.js +4 -4
  19. package/lib/seam/components/AccessCodeTable/AccessCodeTable.js.map +1 -1
  20. package/lib/seam/components/ClimateSettingScheduleDetails/ClimateSettingScheduleDetails.d.ts +1 -1
  21. package/lib/seam/components/ClimateSettingScheduleDetails/ClimateSettingScheduleDetails.js +2 -2
  22. package/lib/seam/components/ClimateSettingScheduleDetails/ClimateSettingScheduleDetails.js.map +1 -1
  23. package/lib/seam/components/ClimateSettingScheduleTable/ClimateSettingScheduleTable.d.ts +1 -1
  24. package/lib/seam/components/ClimateSettingScheduleTable/ClimateSettingScheduleTable.js +2 -2
  25. package/lib/seam/components/ClimateSettingScheduleTable/ClimateSettingScheduleTable.js.map +1 -1
  26. package/lib/seam/components/DeviceDetails/DeviceDetails.d.ts +5 -1
  27. package/lib/seam/components/DeviceDetails/DeviceDetails.js +9 -2
  28. package/lib/seam/components/DeviceDetails/DeviceDetails.js.map +1 -1
  29. package/lib/seam/components/DeviceDetails/DeviceInfo.d.ts +8 -0
  30. package/lib/seam/components/DeviceDetails/DeviceInfo.js +17 -0
  31. package/lib/seam/components/DeviceDetails/DeviceInfo.js.map +1 -0
  32. package/lib/seam/components/DeviceDetails/LockDeviceDetails.d.ts +3 -3
  33. package/lib/seam/components/DeviceDetails/LockDeviceDetails.js +5 -5
  34. package/lib/seam/components/DeviceDetails/LockDeviceDetails.js.map +1 -1
  35. package/lib/seam/components/DeviceDetails/NoiseSensorDeviceDetails.d.ts +8 -0
  36. package/lib/seam/components/DeviceDetails/NoiseSensorDeviceDetails.js +15 -0
  37. package/lib/seam/components/DeviceDetails/NoiseSensorDeviceDetails.js.map +1 -0
  38. package/lib/seam/components/DeviceDetails/ThermostatDeviceDetails.d.ts +3 -3
  39. package/lib/seam/components/DeviceDetails/ThermostatDeviceDetails.js +4 -11
  40. package/lib/seam/components/DeviceDetails/ThermostatDeviceDetails.js.map +1 -1
  41. package/lib/seam/components/DeviceTable/DeviceTable.d.ts +1 -1
  42. package/lib/seam/components/DeviceTable/DeviceTable.js +2 -2
  43. package/lib/seam/components/DeviceTable/DeviceTable.js.map +1 -1
  44. package/lib/seam/components/common-props.d.ts +1 -0
  45. package/lib/seam/components/common-props.js.map +1 -1
  46. package/lib/seam/noise-sensors/use-noise-thresholds.d.ts +5 -0
  47. package/lib/seam/noise-sensors/use-noise-thresholds.js +26 -0
  48. package/lib/seam/noise-sensors/use-noise-thresholds.js.map +1 -0
  49. package/lib/ui/layout/DetailRow.d.ts +1 -1
  50. package/lib/ui/layout/DetailSection.d.ts +1 -1
  51. package/lib/ui/noise-sensor/NoiseThresholdsList.d.ts +7 -0
  52. package/lib/ui/noise-sensor/NoiseThresholdsList.js +45 -0
  53. package/lib/ui/noise-sensor/NoiseThresholdsList.js.map +1 -0
  54. package/lib/version.d.ts +1 -1
  55. package/lib/version.js +1 -1
  56. package/package.json +3 -2
  57. package/src/lib/dates.ts +5 -0
  58. package/src/lib/element.tsx +1 -0
  59. package/src/lib/icons/NoiseLevels.tsx +31 -0
  60. package/src/lib/seam/components/AccessCodeDetails/AccessCodeDetails.tsx +2 -0
  61. package/src/lib/seam/components/AccessCodeTable/AccessCodeTable.tsx +6 -0
  62. package/src/lib/seam/components/ClimateSettingScheduleDetails/ClimateSettingScheduleDetails.tsx +2 -0
  63. package/src/lib/seam/components/ClimateSettingScheduleTable/ClimateSettingScheduleTable.tsx +2 -0
  64. package/src/lib/seam/components/DeviceDetails/DeviceDetails.tsx +19 -2
  65. package/src/lib/seam/components/DeviceDetails/DeviceInfo.tsx +54 -0
  66. package/src/lib/seam/components/DeviceDetails/LockDeviceDetails.tsx +26 -20
  67. package/src/lib/seam/components/DeviceDetails/NoiseSensorDeviceDetails.tsx +58 -0
  68. package/src/lib/seam/components/DeviceDetails/ThermostatDeviceDetails.tsx +19 -35
  69. package/src/lib/seam/components/DeviceTable/DeviceTable.tsx +2 -0
  70. package/src/lib/seam/components/common-props.tsx +1 -0
  71. package/src/lib/seam/noise-sensors/use-noise-thresholds.ts +46 -0
  72. package/src/lib/ui/layout/DetailRow.tsx +1 -1
  73. package/src/lib/ui/layout/DetailSection.tsx +1 -1
  74. package/src/lib/ui/noise-sensor/NoiseThresholdsList.tsx +141 -0
  75. package/src/lib/version.ts +1 -1
  76. package/src/styles/_device-details.scss +1 -0
  77. package/src/styles/_layout.scss +55 -0
  78. package/src/styles/_thermostat.scss +1 -1
@@ -0,0 +1,58 @@
1
+ import type { NoiseSensorDevice } from 'seamapi'
2
+
3
+ import type { NestedSpecificDeviceDetailsProps } from 'lib/seam/components/DeviceDetails/DeviceDetails.js'
4
+ import { DeviceInfo } from 'lib/seam/components/DeviceDetails/DeviceInfo.js'
5
+ import { DeviceModel } from 'lib/seam/components/DeviceDetails/DeviceModel.js'
6
+ import { DeviceImage } from 'lib/ui/device/DeviceImage.js'
7
+ import { OnlineStatus } from 'lib/ui/device/OnlineStatus.js'
8
+ import { NoiseThresholdsList } from 'lib/ui/noise-sensor/NoiseThresholdsList.js'
9
+
10
+ interface NoiseSensorDeviceDetailsProps
11
+ extends NestedSpecificDeviceDetailsProps {
12
+ device: NoiseSensorDevice
13
+ }
14
+
15
+ export function NoiseSensorDeviceDetails({
16
+ device,
17
+ disableConnectedAccountInformation,
18
+ disableResourceIds,
19
+ }: NoiseSensorDeviceDetailsProps): JSX.Element | null {
20
+ return (
21
+ <div className='seam-device-details'>
22
+ <div className='seam-body'>
23
+ <div className='seam-summary'>
24
+ <div className='seam-content'>
25
+ <div className='seam-image'>
26
+ <DeviceImage device={device} />
27
+ </div>
28
+ <div className='seam-info'>
29
+ <span className='seam-label'>{t.noiseSensor}</span>
30
+ <h4 className='seam-device-name'>{device.properties.name}</h4>
31
+ <div className='seam-properties'>
32
+ <span className='seam-label'>{t.status}:</span>{' '}
33
+ <OnlineStatus device={device} />
34
+ <DeviceModel device={device} />
35
+ </div>
36
+ </div>
37
+ </div>
38
+ </div>
39
+
40
+ <NoiseThresholdsList device={device} />
41
+
42
+ <DeviceInfo
43
+ device={device}
44
+ disableConnectedAccountInformation={
45
+ disableConnectedAccountInformation
46
+ }
47
+ disableResourceIds={disableResourceIds}
48
+ />
49
+ </div>
50
+ </div>
51
+ )
52
+ }
53
+
54
+ const t = {
55
+ noiseSensor: 'Noise Sensor',
56
+ status: 'Status',
57
+ noiseLevel: 'Noise level',
58
+ }
@@ -3,12 +3,11 @@ import { useEffect, useState } from 'react'
3
3
  import type { HvacModeSetting, ThermostatDevice } from 'seamapi'
4
4
 
5
5
  import { debounce } from 'lib/debounce.js'
6
- import { BeeIcon } from 'lib/icons/Bee.js'
7
6
  import { CheckBlackIcon } from 'lib/icons/CheckBlack.js'
8
7
  import { ChevronWideIcon } from 'lib/icons/ChevronWide.js'
9
8
  import { NestedClimateSettingScheduleTable } from 'lib/seam/components/ClimateSettingScheduleTable/ClimateSettingScheduleTable.js'
10
- import type { CommonProps } from 'lib/seam/components/common-props.js'
11
- import { useConnectedAccount } from 'lib/seam/connected-accounts/use-connected-account.js'
9
+ import type { NestedSpecificDeviceDetailsProps } from 'lib/seam/components/DeviceDetails/DeviceDetails.js'
10
+ import { DeviceInfo } from 'lib/seam/components/DeviceDetails/DeviceInfo.js'
12
11
  import { useClimateSettingSchedules } from 'lib/seam/thermostats/climate-setting-schedules/use-climate-setting-schedules.js'
13
12
  import { useCoolThermostat } from 'lib/seam/thermostats/use-cool-thermostat.js'
14
13
  import { useHeatCoolThermostat } from 'lib/seam/thermostats/use-heat-cool-thermostat.js'
@@ -30,27 +29,27 @@ import { FanModeMenu } from 'lib/ui/thermostat/FanModeMenu.js'
30
29
  import { TemperatureControlGroup } from 'lib/ui/thermostat/TemperatureControlGroup.js'
31
30
  import { ThermostatCard } from 'lib/ui/thermostat/ThermostatCard.js'
32
31
 
33
- interface ThermostatDeviceDetailsProps extends CommonProps {
32
+ interface ThermostatDeviceDetailsProps
33
+ extends NestedSpecificDeviceDetailsProps {
34
34
  device: ThermostatDevice
35
35
  }
36
36
 
37
37
  export function ThermostatDeviceDetails({
38
38
  device,
39
- onBack,
40
- className,
41
- errorFilter = () => true,
42
- warningFilter = () => true,
39
+ errorFilter,
40
+ warningFilter,
43
41
  disableLockUnlock,
44
42
  disableCreateAccessCode,
45
43
  disableEditAccessCode,
46
44
  disableDeleteAccessCode,
47
- disableResourceIds = false,
48
- disableClimateSettingSchedules = false,
45
+ disableResourceIds,
46
+ disableConnectedAccountInformation,
47
+ disableClimateSettingSchedules,
48
+ onBack,
49
+ className,
49
50
  }: ThermostatDeviceDetailsProps): JSX.Element | null {
50
51
  const [climateSettingsOpen, setClimateSettingsOpen] = useState(false)
51
52
 
52
- const { connectedAccount } = useConnectedAccount(device.connected_account_id)
53
-
54
53
  const { climateSettingSchedules } = useClimateSettingSchedules({
55
54
  device_id: device.device_id,
56
55
  })
@@ -66,6 +65,7 @@ export function ThermostatDeviceDetails({
66
65
  disableEditAccessCode={disableEditAccessCode}
67
66
  disableDeleteAccessCode={disableDeleteAccessCode}
68
67
  disableResourceIds={disableResourceIds}
68
+ disableConnectedAccountInformation={disableConnectedAccountInformation}
69
69
  disableClimateSettingSchedules={disableClimateSettingSchedules}
70
70
  onBack={() => {
71
71
  setClimateSettingsOpen(false)
@@ -143,25 +143,13 @@ export function ThermostatDeviceDetails({
143
143
  <ManualOverrideRow device={device} />
144
144
  </DetailSection>
145
145
  )}
146
-
147
- <DetailSection label={t.deviceDetails}>
148
- <DetailRow label={t.manufacturer}>
149
- <div className='seam-detail-row-hstack'>
150
- {device.properties.model.manufacturer_display_name}
151
- {device.properties.manufacturer === 'ecobee' && <BeeIcon />}
152
- </div>
153
- </DetailRow>
154
- <DetailRow
155
- label={t.linkedAccount}
156
- sublabel={
157
- connectedAccount?.user_identifier?.email ??
158
- device.connected_account_id
159
- }
160
- />
161
- {!disableResourceIds && (
162
- <DetailRow label={t.deviceId} sublabel={device.device_id} />
163
- )}
164
- </DetailSection>
146
+ <DeviceInfo
147
+ device={device}
148
+ disableConnectedAccountInformation={
149
+ disableConnectedAccountInformation
150
+ }
151
+ disableResourceIds={disableResourceIds}
152
+ />
165
153
  </DetailSectionGroup>
166
154
  </div>
167
155
  </div>
@@ -455,10 +443,6 @@ const t = {
455
443
  'When a scheduled climate reaches its end time, the default settings will kick in.',
456
444
  defaultClimate: 'Default climate',
457
445
  allowManualOverride: 'Allow manual override',
458
- deviceDetails: 'Device details',
459
- manufacturer: 'Manufacturer',
460
- linkedAccount: 'Linked account',
461
- deviceId: 'Device ID',
462
446
  none: 'None',
463
447
  fanModeSuccess: 'Successfully updated fan mode!',
464
448
  fanModeError: 'Error updating fan mode. Please try again.',
@@ -69,6 +69,7 @@ export function DeviceTable({
69
69
  disableEditAccessCode = false,
70
70
  disableDeleteAccessCode = false,
71
71
  disableResourceIds = false,
72
+ disableConnectedAccountInformation = false,
72
73
  disableClimateSettingSchedules = false,
73
74
  onBack,
74
75
  className,
@@ -112,6 +113,7 @@ export function DeviceTable({
112
113
  disableEditAccessCode={disableEditAccessCode}
113
114
  disableDeleteAccessCode={disableDeleteAccessCode}
114
115
  disableResourceIds={disableResourceIds}
116
+ disableConnectedAccountInformation={disableConnectedAccountInformation}
115
117
  disableClimateSettingSchedules={disableClimateSettingSchedules}
116
118
  onBack={() => {
117
119
  setSelectedDeviceId(null)
@@ -18,6 +18,7 @@ export interface RequiredCommonProps {
18
18
  disableEditAccessCode: boolean | undefined
19
19
  disableLockUnlock: boolean | undefined
20
20
  disableResourceIds: boolean | undefined
21
+ disableConnectedAccountInformation: boolean | undefined
21
22
  disableClimateSettingSchedules: boolean | undefined
22
23
  }
23
24
 
@@ -0,0 +1,46 @@
1
+ import { useQuery, useQueryClient } from '@tanstack/react-query'
2
+ import type {
3
+ NoiseThresholds,
4
+ NoiseThresholdsListRequest,
5
+ NoiseThresholdsListResponse,
6
+ SeamError,
7
+ } from 'seamapi'
8
+
9
+ import { useSeamClient } from 'lib/seam/use-seam-client.js'
10
+ import type { UseSeamQueryResult } from 'lib/seam/use-seam-query-result.js'
11
+
12
+ export type UseNoiseThresholdsParams = NoiseThresholdsListRequest
13
+ export type UseNoiseThresholdsData = NoiseThresholds[]
14
+
15
+ export function useNoiseThresholds(
16
+ params: UseNoiseThresholdsParams
17
+ ): UseSeamQueryResult<'noiseThresholds', UseNoiseThresholdsData> {
18
+ const { client } = useSeamClient()
19
+ const queryClient = useQueryClient()
20
+
21
+ const { data, ...rest } = useQuery<
22
+ NoiseThresholdsListResponse['noise_thresholds'],
23
+ SeamError
24
+ >({
25
+ enabled: client != null,
26
+ queryKey: ['noise_thresholds', 'list', params],
27
+ queryFn: async () => {
28
+ if (client == null) return []
29
+ return await client.noiseThresholds.list(params)
30
+ },
31
+ onSuccess: (noiseThresholds) => {
32
+ for (const noiseThreshold of noiseThresholds) {
33
+ queryClient.setQueryData(
34
+ [
35
+ 'noise_thresholds',
36
+ 'get',
37
+ { noise_threshold_id: noiseThreshold.noise_threshold_id },
38
+ ],
39
+ noiseThreshold
40
+ )
41
+ }
42
+ },
43
+ })
44
+
45
+ return { ...rest, noiseThresholds: data }
46
+ }
@@ -2,7 +2,7 @@ import classNames from 'classnames'
2
2
  import type { PropsWithChildren } from 'react'
3
3
 
4
4
  interface DetailRowProps {
5
- label: string
5
+ label: JSX.Element | string
6
6
  sublabel?: string
7
7
  onClick?: () => void
8
8
  }
@@ -4,7 +4,7 @@ import { Tooltip } from 'lib/ui/Tooltip/Tooltip.js'
4
4
 
5
5
  interface DetailSectionProps {
6
6
  label?: string
7
- tooltipContent?: string
7
+ tooltipContent?: JSX.Element | string
8
8
  }
9
9
 
10
10
  export function DetailSection({
@@ -0,0 +1,141 @@
1
+ import type { NoiseSensorDevice, NoiseThresholds } from 'seamapi'
2
+ import { ZonedTime } from 'zoned-time'
3
+
4
+ import { formatTime, formatTimeZone } from 'lib/dates.js'
5
+ import { ArrowRightIcon } from 'lib/icons/ArrowRight.js'
6
+ import { useNoiseThresholds } from 'lib/seam/noise-sensors/use-noise-thresholds.js'
7
+ import { DetailRow } from 'lib/ui/layout/DetailRow.js'
8
+ import { DetailSection } from 'lib/ui/layout/DetailSection.js'
9
+ import { DetailSectionGroup } from 'lib/ui/layout/DetailSectionGroup.js'
10
+
11
+ interface NoiseThresholdsListProps {
12
+ device: NoiseSensorDevice
13
+ }
14
+
15
+ export function NoiseThresholdsList({
16
+ device,
17
+ }: NoiseThresholdsListProps): JSX.Element {
18
+ const { noiseThresholds, isInitialLoading } = useNoiseThresholds({
19
+ device_id: device.device_id,
20
+ })
21
+
22
+ return (
23
+ <DetailSectionGroup>
24
+ <div className='seam-detail-section-wrap'>
25
+ <DetailSection
26
+ label={t.noiseThresholds}
27
+ tooltipContent={
28
+ device.device_type === 'minut_sensor' ? (
29
+ <div className='seam-detail-section-tooltip-inner-content'>
30
+ <span className='seam-tooltip-content'>
31
+ {t.minutTooltipFirst}
32
+ </span>
33
+ <span className='seam-tooltip-content'>
34
+ {t.minutTooltipSecond}
35
+ </span>
36
+ </div>
37
+ ) : (
38
+ t.tooltip
39
+ )
40
+ }
41
+ >
42
+ <Content
43
+ isInitialLoading={isInitialLoading}
44
+ noiseThresholds={noiseThresholds}
45
+ />
46
+ </DetailSection>
47
+
48
+ <div className='seam-detail-section-footer'>
49
+ <div className='seam-empty-div' />
50
+ <div className='seam-detail-section-footer-content'>
51
+ <div className='seam-detail-section-footer-content-text'>
52
+ <p>{getTimeZoneCaption(device, noiseThresholds)}</p>
53
+ </div>
54
+ </div>
55
+ </div>
56
+ </div>
57
+ </DetailSectionGroup>
58
+ )
59
+ }
60
+
61
+ function Content({
62
+ isInitialLoading,
63
+ noiseThresholds,
64
+ }: {
65
+ isInitialLoading: boolean
66
+ noiseThresholds: NoiseThresholds[] | undefined
67
+ }): JSX.Element | JSX.Element[] {
68
+ if (isInitialLoading) {
69
+ return (
70
+ <DetailRow
71
+ label={<span className='seam-detail-row-empty-label'>{t.loading}</span>}
72
+ />
73
+ )
74
+ }
75
+
76
+ if (noiseThresholds == null || noiseThresholds.length === 0) {
77
+ return (
78
+ <DetailRow
79
+ label={<span className='seam-detail-row-empty-label'>{t.none}</span>}
80
+ />
81
+ )
82
+ }
83
+
84
+ return noiseThresholds?.map((noiseThreshold) => (
85
+ <DetailRow
86
+ key={noiseThreshold.noise_threshold_id}
87
+ label={
88
+ <div className='seam-detail-row-label-column'>
89
+ {noiseThreshold.name !== '' && (
90
+ <span className='seam-detail-row-label'>{noiseThreshold.name}</span>
91
+ )}
92
+ <div className='seam-detail-row-label-block'>
93
+ <span className='seam-row-sublabel seam-row-sublabel-text-default'>
94
+ {formatTime(noiseThreshold.starts_daily_at)}
95
+ </span>
96
+ <ArrowRightIcon />
97
+ <span className='seam-row-sublabel seam-row-sublabel-text-default'>
98
+ {formatTime(noiseThreshold.ends_daily_at)}
99
+ </span>
100
+ </div>
101
+ </div>
102
+ }
103
+ >
104
+ <p>
105
+ {noiseThreshold.noise_threshold_decibels} {t.decibel}
106
+ </p>
107
+ </DetailRow>
108
+ ))
109
+ }
110
+
111
+ const getTimeZoneCaption = (
112
+ device: NoiseSensorDevice,
113
+ thresholds: NoiseThresholds[] | undefined
114
+ ): string | null => {
115
+ if (device.location?.timezone != null) {
116
+ return `${t.allTimesIn} ${formatTimeZone(device.location.timezone)}`
117
+ }
118
+
119
+ const firstThreshold = thresholds?.[0]
120
+
121
+ if (firstThreshold != null) {
122
+ const zonedTime = ZonedTime.from(firstThreshold.starts_daily_at)
123
+ return `${t.allTimesIn} ${formatTimeZone(zonedTime.timeZone)}`
124
+ }
125
+
126
+ return null
127
+ }
128
+
129
+ const t = {
130
+ noiseThresholds: 'Noise thresholds',
131
+ tooltip:
132
+ 'A noise threshold is the highest noise level (in dB) you want to allow for a given time range in the day.',
133
+ minutTooltipFirst:
134
+ 'A noise threshold is the highest noise level (in dB) you want to allow.',
135
+ minutTooltipSecond:
136
+ 'Quiet hours is a separate threshold that takes effect only for a specified time range.',
137
+ none: 'None',
138
+ loading: 'Loading...',
139
+ decibel: 'dB',
140
+ allTimesIn: 'All times in',
141
+ }
@@ -1,3 +1,3 @@
1
- const seamapiReactVersion = '2.13.0'
1
+ const seamapiReactVersion = '2.15.0'
2
2
 
3
3
  export default seamapiReactVersion
@@ -103,6 +103,7 @@
103
103
 
104
104
  .seam-label {
105
105
  color: colors.$text-gray-2;
106
+ white-space: nowrap;
106
107
  }
107
108
 
108
109
  .seam-status-text {
@@ -40,6 +40,12 @@
40
40
  gap: 32px;
41
41
  }
42
42
 
43
+ .seam-detail-section-wrap {
44
+ display: flex;
45
+ flex-direction: column;
46
+ gap: 6px;
47
+ }
48
+
43
49
  .seam-detail-section {
44
50
  width: 100%;
45
51
  }
@@ -66,6 +72,27 @@
66
72
  border: 1px solid colors.$text-gray-3;
67
73
  overflow: hidden;
68
74
  }
75
+
76
+ .seam-detail-section-footer {
77
+ width: 100%;
78
+ display: flex;
79
+ justify-content: space-between;
80
+ align-items: center;
81
+ flex-direction: row;
82
+ }
83
+
84
+ .seam-detail-section-footer-content-text {
85
+ font-size: 12px;
86
+ color: colors.$text-gray-2-5;
87
+ }
88
+
89
+ .seam-detail-section-tooltip-inner-content {
90
+ display: flex;
91
+ justify-content: flex-start;
92
+ align-items: flex-start;
93
+ flex-direction: column;
94
+ gap: 8px;
95
+ }
69
96
  }
70
97
 
71
98
  @mixin detail-row-common {
@@ -105,17 +132,45 @@
105
132
  gap: 4px;
106
133
  }
107
134
 
135
+ .seam-detail-row-label-column {
136
+ display: flex;
137
+ justify-content: flex-start;
138
+ align-items: flex-start;
139
+ flex-direction: column;
140
+ gap: 4px;
141
+ }
142
+
143
+ .seam-detail-row-label-block {
144
+ display: flex;
145
+ justify-content: flex-start;
146
+ align-items: center;
147
+ flex-direction: row;
148
+ gap: 4px;
149
+ }
150
+
108
151
  .seam-row-label {
109
152
  font-size: 16px;
110
153
  font-weight: 600;
111
154
  line-height: 118%;
112
155
  }
113
156
 
157
+ .seam-detail-row-empty-label {
158
+ font-size: 16px;
159
+ font-style: italic;
160
+ font-weight: 400;
161
+ line-height: 118%;
162
+ color: colors.$text-gray-2;
163
+ }
164
+
114
165
  .seam-row-sublabel {
115
166
  color: colors.$text-gray-1;
116
167
  font-size: 14px;
117
168
  font-weight: 400;
118
169
  line-height: 118%;
170
+
171
+ &.seam-row-sublabel-text-default {
172
+ color: colors.$text-default;
173
+ }
119
174
  }
120
175
 
121
176
  .seam-detail-row-hstack {
@@ -146,7 +146,7 @@
146
146
  height: var(--track-height);
147
147
  border-radius: 0.5em 0 0 0.5em;
148
148
  margin: 0;
149
- border: none;
149
+ border-style: none;
150
150
  border-right-width: 0;
151
151
  }
152
152