@seamapi/react 0.24.0 → 0.25.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 (41) hide show
  1. package/index.css +41 -0
  2. package/index.css.map +1 -1
  3. package/index.min.css +1 -1
  4. package/index.min.css.map +1 -1
  5. package/lib/icons/ArrowRestart.d.ts +2 -0
  6. package/lib/icons/ArrowRestart.js +5 -0
  7. package/lib/icons/ArrowRestart.js.map +1 -0
  8. package/lib/icons/Check.d.ts +2 -0
  9. package/lib/icons/Check.js +3 -0
  10. package/lib/icons/Check.js.map +1 -0
  11. package/lib/icons/ExclamationCircleOutline.d.ts +2 -0
  12. package/lib/icons/ExclamationCircleOutline.js +5 -0
  13. package/lib/icons/ExclamationCircleOutline.js.map +1 -0
  14. package/lib/ui/DeviceTable/DeviceHealthBar.d.ts +9 -0
  15. package/lib/ui/DeviceTable/DeviceHealthBar.js +29 -0
  16. package/lib/ui/DeviceTable/DeviceHealthBar.js.map +1 -0
  17. package/lib/ui/DeviceTable/DeviceRow.d.ts +11 -0
  18. package/lib/ui/DeviceTable/DeviceRow.js +24 -0
  19. package/lib/ui/DeviceTable/DeviceRow.js.map +1 -0
  20. package/lib/ui/DeviceTable/DeviceTable.js +15 -20
  21. package/lib/ui/DeviceTable/DeviceTable.js.map +1 -1
  22. package/lib/ui/IconButton.d.ts +1 -1
  23. package/lib/ui/IconButton.js +3 -2
  24. package/lib/ui/IconButton.js.map +1 -1
  25. package/lib/ui/Table/TableFilterBar/TableFilterBar.d.ts +6 -0
  26. package/lib/ui/Table/TableFilterBar/TableFilterBar.js +11 -0
  27. package/lib/ui/Table/TableFilterBar/TableFilterBar.js.map +1 -0
  28. package/lib/ui/Table/TableFilterBar/TableFilterItem.d.ts +5 -0
  29. package/lib/ui/Table/TableFilterBar/TableFilterItem.js +9 -0
  30. package/lib/ui/Table/TableFilterBar/TableFilterItem.js.map +1 -0
  31. package/package.json +1 -1
  32. package/src/lib/icons/ArrowRestart.tsx +32 -0
  33. package/src/lib/icons/Check.tsx +15 -0
  34. package/src/lib/icons/ExclamationCircleOutline.tsx +32 -0
  35. package/src/lib/ui/DeviceTable/DeviceHealthBar.tsx +66 -0
  36. package/src/lib/ui/DeviceTable/DeviceRow.tsx +60 -0
  37. package/src/lib/ui/DeviceTable/DeviceTable.tsx +24 -42
  38. package/src/lib/ui/IconButton.tsx +6 -2
  39. package/src/lib/ui/Table/TableFilterBar/TableFilterBar.tsx +31 -0
  40. package/src/lib/ui/Table/TableFilterBar/TableFilterItem.tsx +24 -0
  41. package/src/styles/_tables.scss +53 -0
package/index.css CHANGED
@@ -163,6 +163,47 @@
163
163
  align-items: center;
164
164
  justify-content: center;
165
165
  }
166
+ .seam-components .seam-table-filter-bar {
167
+ display: flex;
168
+ align-items: center;
169
+ padding: 6px 16px;
170
+ background: #f1f3f4;
171
+ }
172
+ .seam-components .seam-table-filter-bar .seam-clear-filters-button {
173
+ margin-left: 6px;
174
+ border: 0;
175
+ background: transparent !important;
176
+ padding: 0;
177
+ }
178
+ .seam-components .seam-table-filter-bar .seam-clear-filters-button svg {
179
+ scale: 0.8333;
180
+ }
181
+ .seam-components .seam-table-filter-bar .seam-clear-filters-button svg * {
182
+ fill: #6e7179;
183
+ }
184
+ .seam-components .seam-table-filter-item {
185
+ display: flex;
186
+ align-items: center;
187
+ padding: 2px 8px 2px 5px;
188
+ border-radius: 5px;
189
+ border: 1px solid #f1f3f4;
190
+ font-size: 14px;
191
+ line-height: 134%;
192
+ }
193
+ .seam-components .seam-table-filter-item svg {
194
+ scale: 0.75;
195
+ }
196
+ .seam-components .seam-table-filter-item.seam-clickable {
197
+ cursor: pointer;
198
+ }
199
+ .seam-components .seam-table-filter-item.seam-clickable:hover {
200
+ background: rgba(255, 255, 255, 0.65);
201
+ border: 1px solid #d5d8dc;
202
+ }
203
+ .seam-components .seam-table-filter-item.seam-selected {
204
+ background: #fff;
205
+ border: 1px solid #d5d8dc;
206
+ }
166
207
  .seam-components .seam-text-field {
167
208
  padding: 0 8px;
168
209
  height: 40px;
package/index.css.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sourceRoot":"","sources":["src/styles/_reset.scss","src/styles/_main.scss","src/styles/_typography.scss","src/styles/_colors.scss","src/styles/_tables.scss","src/styles/_inputs.scss","src/styles/_buttons.scss","src/styles/_layout.scss","src/styles/_icons.scss","src/styles/_menus.scss","src/styles/_device-details.scss","src/styles/_device-table.scss","src/styles/_access-code-table.scss","src/styles/_access-code-details.scss","src/styles/_alert.scss","src/styles/_supported-devices.scss"],"names":[],"mappings":"AAAA;AAAA;AAAA;AAAA;ACgBA;ECbE;;AFGA;AAAA;AAAA;EAGE;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAmDE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;AAAA;AAAA;AAAA;AAAA;EAKE;;AAGF;EACE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;AAAA;AAAA;EAIE;EACA;;AAGF;EACE;EACA;;AAGF;EACE;EACA;;AEtGF;AAAA;AAAA;AAAA;AAAA;AAAA;EAME;;AAKF;EACE,OCTU;;ADcZ;EACE,OCPS;;ADYX;EACE,OCvBW;;ACPb;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;;AAEA;EACE;EACA;;AAMJ;EACE;EACA;EACA;EACA;;AAEA;EACE;;AAGF;EACE;EACA;EACA;;AAMJ;EACE;EACA;EACA;;AAKF;EACE;EACA;EACA;EACA;EACA;EACA;;ACrDF;EACE;EACA;EACA;EACA;;AC2GF;EJ/GA;EIoHE;EACA;;AAjFF;EACE;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;;AAKF;EACE,YH7DM;EG8DN;EACA;;AAEA;EACE,YH5DS;EG6DT,cH7DS;;AGgEX;EAEE,YHjEQ;EGkER,cHlEQ;;AGsEZ;EACE,OH9EM;EG+EN;EACA;;AAEA;EACE,YH9EM;;AGiFR;EAEE;EACA,OHxFO;;AG4FX;EACE,OHrFU;EGsFV;;AAEA;EACE,YHjFC;EGkFD,cHxFU;;AG2FZ;EAEE,OH7FU;EG8FV,cH7FQ;EG8FR;;AAcF;EAEE;;AAxHJ;EACE;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAMJ;EACE,OHlBM;EGmBN;EACA;EACA;EACA;;AAEA;EACE;;AAGF;EAEE;EACA;;AC9BJ;EACE;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA,OJXQ;;AKPV;EACE,MLMQ;;AMRZ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE,YNHQ;;AMQd;EACE;EACA;EACA;EACA;EACA;EACA;;ACvCA;EACE;EACA;EACA;EACA;;AAEA;EACE;EACA;;AAEA;EACE;;AAEA;EACE;EACA;EACA;EACA;EACA;;AAEA;EACE,YPIE;;AOAN;EACE;;AAGF;EACE;EACA;;AAEA;EACE;EACA;;AAIJ;EACE;EACA;EACA,OPnCE;;AOsCJ;EACE;EACA;EACA;EACA;;AAKN;EACE;EACA;EACA,YP1CD;;AO4CC;EACE;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;;AAEA;EACE;;AAKF;EACE,OPtEA;EOuEA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE,OP7FF;;AOgGA;EACE,OPlGF;;AOqGA;EACE;EACA;;AAGF;EACE;EACA;;AAOV;EACE;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;;AAIJ;EACE;;AAGF;EACE;EACA;EACA;EACA;;AClJJ;EACE;;AAEA;EACE;EACA;EACA;;AAEA;EACE;;AAIJ;EACE;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA,ORvBE;EQwBF;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA,ORjCE;EQkCF;EACA;;AAEA;EACE;EACA;EACA;;AAEA;EACE;;AClDZ;EACE;;AAEA;EACE;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;;AAIJ;EACE;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA,OTrBI;;ASuBJ;EACE;EACA,OTtBE;;AS2BR;EACE;EACA;EACA;EACA;;AAMJ;EACE;EACA;EACA;EACA;;ACnDF;EACE,YVcC;EUbD;EACA;;AAEA;EACE;;AAEA;EACE;EACA;EACA;EACA,OVLI;EUMJ;;AAGF;EACE;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE,OV5BI;EU6BJ;EACA;;AAEA;EACE;EACA,OVnCG;;AUwCT;EACE;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;;AAEA;EACE;EACA;;AAIJ;EACE;EACA;EACA;EACA;EACA;;AAKN;EACE;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;;AAEA;EACE;;AAGF;EACE;EACA;;AAEA;EACE;EACA;EACA;EACA;;AAEA;EACE,OV3FA;;AU+FA;EACE;;AAGF;EACE;;AC5Gd;EACE;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAKJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE,kBXbQ;;AWiBZ;EACE,kBXnBY;EWoBZ;;AAEA;EACE;EACA,OX1BU;;AW8Bd;EACE,kBXhCa;EWiCb;;AAEA;EACE;EACA,OXvCW;;AW2Cf;EACE;;AAGF;EACE;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAIA;EACE;EACA;EACA;EACA,OX9EO;;AWmFb;EACE;IACE;IACA;;EAEA;IACE;IACA;IACA;IACA;;EAGF;IACE;;EAEA;IACE;;;ACxGR;EACE;EACA,kBZYG;EYXH;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;;AAEA;AAAA;EAEE;EACA;;AAGF;EACE;EACA;EACA,YZZC;EYaD;;AAEA;EACE;;AAGF;EACE;EACA;EACA;EACA;;AAKF;EACE;EACA;;AAGF;EACE;;AAMF;AAAA;EAEE,cA3DM;;AA8DR;AAAA;EAEE,eAhEM;;AAoEV;EACE;EACA;EACA;EACA,kBZpDS;;AYsDT;EACE;EACA;EACA;EACA;;AAGF;EACE,kBZ9DO;;AYiET;EACE,kBZnEQ;;AYsEV;EACE,kBZxEK;;AY2EP;EACE,kBZ9FE;;AYiGJ;EACE,kBZpFD","file":"index.css"}
1
+ {"version":3,"sourceRoot":"","sources":["src/styles/_reset.scss","src/styles/_main.scss","src/styles/_typography.scss","src/styles/_colors.scss","src/styles/_tables.scss","src/styles/_inputs.scss","src/styles/_buttons.scss","src/styles/_layout.scss","src/styles/_icons.scss","src/styles/_menus.scss","src/styles/_device-details.scss","src/styles/_device-table.scss","src/styles/_access-code-table.scss","src/styles/_access-code-details.scss","src/styles/_alert.scss","src/styles/_supported-devices.scss"],"names":[],"mappings":"AAAA;AAAA;AAAA;AAAA;ACgBA;ECbE;;AFGA;AAAA;AAAA;EAGE;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAmDE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;AAAA;AAAA;AAAA;AAAA;EAKE;;AAGF;EACE;;AAGF;AAAA;EAEE;;AAGF;AAAA;EAEE;;AAGF;AAAA;AAAA;AAAA;EAIE;EACA;;AAGF;EACE;EACA;;AAGF;EACE;EACA;;AEtGF;AAAA;AAAA;AAAA;AAAA;AAAA;EAME;;AAKF;EACE,OCTU;;ADcZ;EACE,OCPS;;ADYX;EACE,OCvBW;;ACPb;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;;AAEA;EACE;EACA;;AAMJ;EACE;EACA;EACA;EACA;;AAEA;EACE;;AAGF;EACE;EACA;EACA;;AAMJ;EACE;EACA;EACA;;AAKF;EACE;EACA;EACA;EACA;EACA;EACA;;AAKF;EACE;EACA;EACA;EACA,YD9CG;;ACgDH;EACE;EACA;EACA;EACA;;AAEA;EACE;;AAEA;EACE,MDlEI;;ACwEZ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAGF;EACE;;AAEA;EACE;EACA;;AAIJ;EACE;EACA;;ACxGJ;EACE;EACA;EACA;EACA;;AC2GF;EJ/GA;EIoHE;EACA;;AAjFF;EACE;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;;AAKF;EACE,YH7DM;EG8DN;EACA;;AAEA;EACE,YH5DS;EG6DT,cH7DS;;AGgEX;EAEE,YHjEQ;EGkER,cHlEQ;;AGsEZ;EACE,OH9EM;EG+EN;EACA;;AAEA;EACE,YH9EM;;AGiFR;EAEE;EACA,OHxFO;;AG4FX;EACE,OHrFU;EGsFV;;AAEA;EACE,YHjFC;EGkFD,cHxFU;;AG2FZ;EAEE,OH7FU;EG8FV,cH7FQ;EG8FR;;AAcF;EAEE;;AAxHJ;EACE;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAMJ;EACE,OHlBM;EGmBN;EACA;EACA;EACA;;AAEA;EACE;;AAGF;EAEE;EACA;;AC9BJ;EACE;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA,OJXQ;;AKPV;EACE,MLMQ;;AMRZ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE,YNHQ;;AMQd;EACE;EACA;EACA;EACA;EACA;EACA;;ACvCA;EACE;EACA;EACA;EACA;;AAEA;EACE;EACA;;AAEA;EACE;;AAEA;EACE;EACA;EACA;EACA;EACA;;AAEA;EACE,YPIE;;AOAN;EACE;;AAGF;EACE;EACA;;AAEA;EACE;EACA;;AAIJ;EACE;EACA;EACA,OPnCE;;AOsCJ;EACE;EACA;EACA;EACA;;AAKN;EACE;EACA;EACA,YP1CD;;AO4CC;EACE;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;;AAEA;EACE;;AAKF;EACE,OPtEA;EOuEA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE,OP7FF;;AOgGA;EACE,OPlGF;;AOqGA;EACE;EACA;;AAGF;EACE;EACA;;AAOV;EACE;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;;AAIJ;EACE;;AAGF;EACE;EACA;EACA;EACA;;AClJJ;EACE;;AAEA;EACE;EACA;EACA;;AAEA;EACE;;AAIJ;EACE;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA,ORvBE;EQwBF;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA,ORjCE;EQkCF;EACA;;AAEA;EACE;EACA;EACA;;AAEA;EACE;;AClDZ;EACE;;AAEA;EACE;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;;AAIJ;EACE;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA,OTrBI;;ASuBJ;EACE;EACA,OTtBE;;AS2BR;EACE;EACA;EACA;EACA;;AAMJ;EACE;EACA;EACA;EACA;;ACnDF;EACE,YVcC;EUbD;EACA;;AAEA;EACE;;AAEA;EACE;EACA;EACA;EACA,OVLI;EUMJ;;AAGF;EACE;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE,OV5BI;EU6BJ;EACA;;AAEA;EACE;EACA,OVnCG;;AUwCT;EACE;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;;AAEA;EACE;EACA;;AAIJ;EACE;EACA;EACA;EACA;EACA;;AAKN;EACE;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;;AAEA;EACE;;AAGF;EACE;EACA;;AAEA;EACE;EACA;EACA;EACA;;AAEA;EACE,OV3FA;;AU+FA;EACE;;AAGF;EACE;;AC5Gd;EACE;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAKJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE,kBXbQ;;AWiBZ;EACE,kBXnBY;EWoBZ;;AAEA;EACE;EACA,OX1BU;;AW8Bd;EACE,kBXhCa;EWiCb;;AAEA;EACE;EACA,OXvCW;;AW2Cf;EACE;;AAGF;EACE;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAIA;EACE;EACA;EACA;EACA,OX9EO;;AWmFb;EACE;IACE;IACA;;EAEA;IACE;IACA;IACA;IACA;;EAGF;IACE;;EAEA;IACE;;;ACxGR;EACE;EACA,kBZYG;EYXH;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;;AAEA;AAAA;EAEE;EACA;;AAGF;EACE;EACA;EACA,YZZC;EYaD;;AAEA;EACE;;AAGF;EACE;EACA;EACA;EACA;;AAKF;EACE;EACA;;AAGF;EACE;;AAMF;AAAA;EAEE,cA3DM;;AA8DR;AAAA;EAEE,eAhEM;;AAoEV;EACE;EACA;EACA;EACA,kBZpDS;;AYsDT;EACE;EACA;EACA;EACA;;AAGF;EACE,kBZ9DO;;AYiET;EACE,kBZnEQ;;AYsEV;EACE,kBZxEK;;AY2EP;EACE,kBZ9FE;;AYiGJ;EACE,kBZpFD","file":"index.css"}
package/index.min.css CHANGED
@@ -1 +1 @@
1
- .seam-components{font-family:"Source Sans Pro",system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Open Sans","Helvetica Neue",sans-serif}.seam-components *,.seam-components *::before,.seam-components *::after{box-sizing:border-box}.seam-components html,.seam-components body,.seam-components div,.seam-components span,.seam-components object,.seam-components iframe,.seam-components figure,.seam-components h1,.seam-components h2,.seam-components h3,.seam-components h4,.seam-components h5,.seam-components h6,.seam-components p,.seam-components blockquote,.seam-components pre,.seam-components a,.seam-components code,.seam-components em,.seam-components img,.seam-components small,.seam-components strike,.seam-components strong,.seam-components sub,.seam-components sup,.seam-components tt,.seam-components b,.seam-components u,.seam-components i,.seam-components ol,.seam-components ul,.seam-components li,.seam-components fieldset,.seam-components form,.seam-components label,.seam-components table,.seam-components caption,.seam-components tbody,.seam-components tfoot,.seam-components thead,.seam-components tr,.seam-components th,.seam-components td,.seam-components main,.seam-components canvas,.seam-components embed,.seam-components footer,.seam-components header,.seam-components nav,.seam-components section,.seam-components video{margin:0;padding:0;border:0;font-size:100%;font-family:inherit;vertical-align:baseline;text-rendering:optimizelegibility;-webkit-font-smoothing:antialiased;text-size-adjust:none}.seam-components footer,.seam-components header,.seam-components nav,.seam-components section,.seam-components main{display:block}.seam-components body{line-height:1}.seam-components ol,.seam-components ul{list-style:none}.seam-components blockquote,.seam-components q{quotes:none}.seam-components blockquote::before,.seam-components blockquote::after,.seam-components q::before,.seam-components q::after{content:"";content:none}.seam-components table{border-collapse:collapse;border-spacing:0}.seam-components input{appearance:none;border-radius:0}.seam-components h1,.seam-components h2,.seam-components h3,.seam-components h4,.seam-components h5,.seam-components h6{font-weight:600}.seam-components .seam-caption{color:#9da1a9}.seam-components .seam-text-danger{color:#e36857}.seam-components html{color:#232b3a}.seam-components .seam-table-header{display:flex;justify-content:space-between;align-items:center;height:56px;padding:0 16px}.seam-components .seam-table-title{font-size:21px;line-height:132%}.seam-components .seam-table-title .seam-caption{font-size:16px;line-height:134%}.seam-components .seam-table-row{display:flex;padding:4px;height:72px;border-bottom:1px solid #eee}.seam-components .seam-table-row:hover{background:#f4f6f8}.seam-components .seam-table-row .seam-title{font-weight:600;font-size:18px;line-height:132%}.seam-components .seam-table-cell{display:flex;align-items:center;padding:4px}.seam-components .seam-table-empty-placeholder{height:300px;font-size:18px;line-height:132%;display:flex;align-items:center;justify-content:center}.seam-components .seam-text-field{padding:0 8px;height:40px;border:1px solid #d5d8dc;border-radius:8px}.seam-components .seam-btn{font-family:"Source Sans Pro",system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Open Sans","Helvetica Neue",sans-serif;font-weight:600;cursor:pointer}.seam-components .seam-btn.seam-btn-small{font-size:14px;line-height:22px;border-radius:6px;padding:4px 10px}.seam-components .seam-btn.seam-btn-medium{font-size:16px;line-height:26px;border-radius:7px;padding:6px 16px}.seam-components .seam-btn.seam-btn-large{font-size:19px;line-height:30px;border-radius:8px;padding:8px 22px}.seam-components .seam-btn.seam-btn-solid{background:#007afc;color:#fff;border:1px solid #007afc}.seam-components .seam-btn.seam-btn-solid:hover{background:#006ee3;border-color:#006ee3}.seam-components .seam-btn.seam-btn-solid.seam-btn-disabled,.seam-components .seam-btn.seam-btn-solid:disabled{background:#c1dfff;border-color:#c1dfff}.seam-components .seam-btn.seam-btn-outline{color:#007afc;border:1px solid #7ebcff;background:rgba(0,0,0,0)}.seam-components .seam-btn.seam-btn-outline:hover{background:#f2f8ff}.seam-components .seam-btn.seam-btn-outline.seam-btn-disabled,.seam-components .seam-btn.seam-btn-outline:disabled{background:rgba(0,0,0,0);color:#7ebcff}.seam-components .seam-btn.seam-btn-neutral{color:#6e7179;border:1px solid #b9bec5}.seam-components .seam-btn.seam-btn-neutral:hover{background:#f1f3f4;border-color:#b9bec5}.seam-components .seam-btn.seam-btn-neutral.seam-btn-disabled,.seam-components .seam-btn.seam-btn-neutral:disabled{color:#b9bec5;border-color:#d5d8dc;background:#fff}.seam-components .seam-btn.seam-btn-disabled,.seam-components .seam-btn:disabled{cursor:not-allowed}.seam-components .seam-icon-btn{border-radius:6px;border:1px solid rgba(0,122,252,.5);cursor:pointer;background:#fff;padding:6px;line-height:0}.seam-components .seam-icon-btn:hover{background:rgba(0,122,252,.08)}.seam-components .seam-text-btn{color:#007afc;padding:0;cursor:pointer;background:rgba(0,0,0,0);border:0}.seam-components .seam-text-btn:hover{text-decoration:underline}.seam-components .seam-text-btn.seam-btn-disabled,.seam-components .seam-text-btn:disabled{cursor:not-allowed;text-decoration:none}.seam-components .seam-content-header{height:56px;display:flex;align-items:center;position:relative;justify-content:center;margin:0 16px}.seam-components .seam-content-header .seam-back-icon{position:absolute;top:50%;transform:translate(4px, -25%);left:0;cursor:pointer}.seam-components .seam-content-header .seam-title{font-size:16px;line-height:134%;color:#6e7179}.seam-components .seam-lock-icon *{fill:#6e7179}.seam-components .seam-menu-bg{width:100vw;height:100vh;justify-content:center;align-items:center;position:fixed;inset:0;z-index:999999;display:none}.seam-components .seam-menu-content{width:250px;position:absolute;padding:8px 0;background:#fff;box-shadow:0 0 1px rgba(0,0,0,.3),0 2px 16px 2px rgba(15,22,28,.15);border-radius:8px}.seam-components .seam-menu-content .seam-menu-item{padding:0 16px;height:36px;display:flex;align-items:center;font-size:16px;line-height:134%;cursor:pointer}.seam-components .seam-menu-content .seam-menu-item:hover{background:#f4f6f8}.seam-components .seam-menu-shadow{z-index:-1;opacity:0;visibility:hidden;top:0;right:0;position:fixed}.seam-components .seam-device-details .seam-body{display:flex;flex-direction:column;gap:16px;margin:0 24px 24px}.seam-components .seam-device-details .seam-body .seam-box{border:1px solid #d5d8dc;border-radius:8px}.seam-components .seam-device-details .seam-body .seam-box .seam-content{padding:12px 12px 12px 16px}.seam-components .seam-device-details .seam-body .seam-box .seam-content.seam-access-codes{padding:12px 8px 12px 16px;display:flex;align-items:center;justify-content:space-between;cursor:pointer}.seam-components .seam-device-details .seam-body .seam-box .seam-content.seam-access-codes:hover{background:#f4f6f8}.seam-components .seam-device-details .seam-body .seam-box .seam-content.seam-access-code-length{border-top:1px solid #d5d8dc}.seam-components .seam-device-details .seam-body .seam-box .seam-content.seam-lock-status{display:flex;justify-content:space-between}.seam-components .seam-device-details .seam-body .seam-box .seam-content.seam-lock-status>.seam-right{display:flex;align-items:center}.seam-components .seam-device-details .seam-body .seam-box .seam-content .seam-label{font-size:14px;line-height:134%;color:#6e7179}.seam-components .seam-device-details .seam-body .seam-box .seam-content .seam-value{display:block;font-weight:600;font-size:16px;line-height:134%}.seam-components .seam-device-details .seam-body .seam-summary{padding:24px 16px;border-radius:16px;background:#f1f3f4}.seam-components .seam-device-details .seam-body .seam-summary .seam-content{display:flex;align-items:center;gap:20px}.seam-components .seam-device-details .seam-body .seam-summary .seam-content .seam-image{width:100px;height:100px;display:flex;align-items:center}.seam-components .seam-device-details .seam-body .seam-summary .seam-content .seam-image img{max-width:100%}.seam-components .seam-device-details .seam-body .seam-summary .seam-content .seam-info>.seam-label{color:#6e7179;font-weight:600;font-size:14px;line-height:134%;margin-bottom:4px}.seam-components .seam-device-details .seam-body .seam-summary .seam-content .seam-info .seam-device-name{margin-bottom:16px;font-weight:600;font-size:21px;line-height:132%}.seam-components .seam-device-details .seam-body .seam-summary .seam-content .seam-info .seam-properties{display:grid;grid-template-columns:min-content 1fr;grid-auto-rows:1fr;font-size:14px;line-height:134%;row-gap:4px;column-gap:28px}.seam-components .seam-device-details .seam-body .seam-summary .seam-content .seam-info .seam-properties .seam-label{color:#9da1a9}.seam-components .seam-device-details .seam-body .seam-summary .seam-content .seam-info .seam-properties .seam-status-text{color:#6e7179}.seam-components .seam-device-details .seam-body .seam-summary .seam-content .seam-info .seam-properties svg{scale:.75;margin-right:8px}.seam-components .seam-device-details .seam-body .seam-summary .seam-content .seam-info .seam-properties>*{display:flex;align-items:center}.seam-components .seam-device-details .seam-body .seam-icon-cell{flex:0;margin-left:8px;display:flex;align-items:center;justify-content:center}.seam-components .seam-device-details .seam-body .seam-icon-cell>div{width:40px;height:40px;display:flex;align-items:center;justify-content:center}.seam-components .seam-device-details .seam-body .seam-name-cell{flex:1}.seam-components .seam-device-details .seam-body .seam-action-cell{margin-right:12px;display:flex;align-items:center;justify-content:center}.seam-components .seam-device-table .seam-table-row{cursor:pointer}.seam-components .seam-device-table .seam-table-row .seam-image-cell{width:64px;height:64px;padding:4px}.seam-components .seam-device-table .seam-table-row .seam-image-cell img{width:100%}.seam-components .seam-device-table .seam-table-row .seam-body-cell{flex:1;flex-direction:column;justify-content:center;align-items:flex-start;gap:2px}.seam-components .seam-device-table .seam-table-row .seam-body-cell .seam-bottom{display:flex;justify-content:space-between;align-items:center;width:100%}.seam-components .seam-device-table .seam-table-row .seam-body-cell .seam-bottom .seam-device-model{font-weight:400;font-size:14px;line-height:134%;color:#6e7179;flex:0 1 190px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.seam-components .seam-device-table .seam-table-row .seam-body-cell .seam-bottom .seam-device-statuses{display:flex;align-items:center;color:#6e7179;font-size:14px;line-height:134%}.seam-components .seam-device-table .seam-table-row .seam-body-cell .seam-bottom .seam-device-statuses>div{display:flex;align-items:center;margin-right:16px}.seam-components .seam-device-table .seam-table-row .seam-body-cell .seam-bottom .seam-device-statuses>div svg{scale:.75}.seam-components .seam-access-code-table .seam-table-row{cursor:pointer}.seam-components .seam-access-code-table .seam-table-row .seam-icon-cell{flex:0;display:flex;align-items:center;justify-content:center}.seam-components .seam-access-code-table .seam-table-row .seam-icon-cell>div{width:40px;height:40px;display:flex;align-items:center;justify-content:center}.seam-components .seam-access-code-table .seam-table-row .seam-name-cell{flex:1;flex-direction:column;justify-content:center;align-items:flex-start;gap:2px}.seam-components .seam-access-code-table .seam-table-row .seam-name-cell .seam-code-details{font-size:14px;line-height:134%;color:#6e7179}.seam-components .seam-access-code-table .seam-table-row .seam-name-cell .seam-code-details .seam-dot-divider{margin:0 4px;color:#d5d8dc}.seam-components .seam-access-code-table .seam-table-row .seam-action-cell{margin-right:12px;display:flex;align-items:center;justify-content:center}.seam-components .seam-access-code-table-action-menu .menu-item-copy{display:flex;align-items:center;justify-content:space-between;flex:1}.seam-components .seam-access-code-details>.seam-summary{background:#f1f3f4;border-radius:16px;margin:0 24px 16px}.seam-components .seam-access-code-details>.seam-summary>.seam-top{padding:24px 16px}.seam-components .seam-access-code-details>.seam-summary>.seam-top>.seam-label{font-weight:600;font-size:14px;line-height:134%;color:#6e7179;margin-bottom:4px}.seam-components .seam-access-code-details>.seam-summary>.seam-top>.seam-access-code-name{font-weight:600;font-size:21px;line-height:132%;margin-bottom:8px}.seam-components .seam-access-code-details>.seam-summary>.seam-top>.seam-code{background:#fff;border:1px solid #9da1a9;border-radius:8px;padding:10px 16px;font-weight:600;font-size:24px;line-height:134%;margin-bottom:8px}.seam-components .seam-access-code-details>.seam-summary>.seam-top .seam-duration{color:#6e7179;font-size:14px;line-height:134%}.seam-components .seam-access-code-details>.seam-summary>.seam-top .seam-duration .seam-label{font-weight:600;color:#232b3a}.seam-components .seam-access-code-details>.seam-summary .seam-access-code-device{border-top:1px solid #dde0e2;padding:8px 16px 8px 8px;display:flex;align-items:center}.seam-components .seam-access-code-details>.seam-summary .seam-access-code-device .seam-device-image{width:72px;height:72px;margin-right:16px}.seam-components .seam-access-code-details>.seam-summary .seam-access-code-device .seam-device-image img{width:100%;max-height:100%}.seam-components .seam-access-code-details>.seam-summary .seam-access-code-device .seam-body{flex:1;font-weight:400;font-size:14px;line-height:134%;margin-right:8px}.seam-components .seam-access-code-details .seam-details{font-size:16px;line-height:134%;border-bottom:1px solid rgba(0,0,0,.12);padding:0 24px}.seam-components .seam-access-code-details .seam-details .seam-row{padding:16px;display:flex;border-top:1px solid rgba(0,0,0,.12)}.seam-components .seam-access-code-details .seam-details .seam-row .seam-heading{width:112px}.seam-components .seam-access-code-details .seam-details .seam-row .seam-content{display:flex;flex:1}.seam-components .seam-access-code-details .seam-details .seam-row .seam-content .seam-times{display:flex;flex:1;font-size:16px;line-height:134%}.seam-components .seam-access-code-details .seam-details .seam-row .seam-content .seam-times .seam-label{color:#9da1a9}.seam-components .seam-access-code-details .seam-details .seam-row .seam-content .seam-times>div div{margin-bottom:4px}.seam-components .seam-access-code-details .seam-details .seam-row .seam-content .seam-times>div:first-child{flex:0 1 160px}.seam-components .seam-alerts{width:100%;display:flex;justify-content:flex-start;align-items:flex-start;flex-direction:column;gap:8px}.seam-components .seam-alerts.seam-alerts-space-top{margin-top:16px}.seam-components .seam-alert{width:100%;min-height:70px;padding:8px 16px;border-radius:8px;display:flex;justify-content:space-between;align-items:center;flex-direction:row;gap:16px}.seam-components .seam-alert .seam-alert-action{appearance:none;height:32px;padding:0 10px;border-radius:6px;background-color:rgba(0,0,0,0);font-size:14px;line-height:1;font-weight:600;white-space:nowrap;cursor:pointer}.seam-components .seam-alert .seam-alert-action:hover{background-color:#f4f6f8}.seam-components .seam-alert.seam-warning-alert{background-color:#fff2e0;border:1px solid #f8d8be}.seam-components .seam-alert.seam-warning-alert .seam-alert-action{border:1px solid #ca8852;color:#ca8852}.seam-components .seam-alert.seam-error-alert{background-color:#ffefef;border:1px solid #f1d4d4}.seam-components .seam-alert.seam-error-alert .seam-alert-action{border:1px solid #cb7d7d;color:#cb7d7d}.seam-components .seam-alert.seam-alert-space-top{margin-top:16px}.seam-components .seam-alert .seam-alert-icon{width:24px;height:24px}.seam-components .seam-alert .seam-alert-content{display:flex;justify-content:flex-start;align-items:center;flex-direction:row;gap:8px}.seam-components .seam-alert .seam-alert-message-wrap .seam-alert-message{font-size:14px;font-weight:400;line-height:134%;color:#232b3a}@media only screen and (width <= 500px){.seam-components .seam-alert{justify-content:flex-start;flex-direction:column}.seam-components .seam-alert .seam-alert-content{width:100%;align-items:flex-start;flex-direction:column;gap:4px}.seam-components .seam-alert .seam-alert-action-wrap{width:100%}.seam-components .seam-alert .seam-alert-action-wrap .seam-alert-action{width:100%}}.seam-components .seam-supported-devices-table-state-block{width:100%;background-color:#f1f3f4;padding:32px 8px;display:flex;justify-content:center;align-items:center;flex-direction:column;gap:8px}.seam-components .seam-supported-devices-table{width:100%;overflow-x:auto;table-layout:auto;border-collapse:collapse}.seam-components .seam-supported-devices-table th,.seam-components .seam-supported-devices-table td{white-space:nowrap;padding:0 8px}.seam-components .seam-supported-devices-table thead{width:100%;height:50px;background:#f1f3f4;overflow:hidden}.seam-components .seam-supported-devices-table thead tr{border-radius:8px}.seam-components .seam-supported-devices-table thead th{vertical-align:middle;text-align:left;font-size:16px;font-weight:600}.seam-components .seam-supported-devices-table tbody tr{height:60px;border-bottom:1px solid #e9edef}.seam-components .seam-supported-devices-table tbody td{vertical-align:middle}.seam-components .seam-supported-devices-table tr th:first-of-type,.seam-components .seam-supported-devices-table tr td:first-of-type{padding-left:8px}.seam-components .seam-supported-devices-table tr th:last-of-type,.seam-components .seam-supported-devices-table tr td:last-of-type{padding-right:8px}.seam-components .seam-supported-devices-table .seam-status-pill{display:inline-flex;padding:4px 8px;border-radius:90px;background-color:#27ae60}.seam-components .seam-supported-devices-table .seam-status-pill span{color:#fff;font-size:14px;font-weight:600;line-height:1}.seam-components .seam-supported-devices-table .seam-status-pill.status-green{background-color:#27ae60}.seam-components .seam-supported-devices-table .seam-status-pill.status-orange{background-color:#f3980f}.seam-components .seam-supported-devices-table .seam-status-pill.status-red{background-color:#e36857}.seam-components .seam-supported-devices-table .seam-status-pill.status-blue{background-color:#007afc}.seam-components .seam-supported-devices-table .seam-status-pill.status-gray{background-color:#cbd0d3}/*# sourceMappingURL=index.min.css.map */
1
+ .seam-components{font-family:"Source Sans Pro",system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Open Sans","Helvetica Neue",sans-serif}.seam-components *,.seam-components *::before,.seam-components *::after{box-sizing:border-box}.seam-components html,.seam-components body,.seam-components div,.seam-components span,.seam-components object,.seam-components iframe,.seam-components figure,.seam-components h1,.seam-components h2,.seam-components h3,.seam-components h4,.seam-components h5,.seam-components h6,.seam-components p,.seam-components blockquote,.seam-components pre,.seam-components a,.seam-components code,.seam-components em,.seam-components img,.seam-components small,.seam-components strike,.seam-components strong,.seam-components sub,.seam-components sup,.seam-components tt,.seam-components b,.seam-components u,.seam-components i,.seam-components ol,.seam-components ul,.seam-components li,.seam-components fieldset,.seam-components form,.seam-components label,.seam-components table,.seam-components caption,.seam-components tbody,.seam-components tfoot,.seam-components thead,.seam-components tr,.seam-components th,.seam-components td,.seam-components main,.seam-components canvas,.seam-components embed,.seam-components footer,.seam-components header,.seam-components nav,.seam-components section,.seam-components video{margin:0;padding:0;border:0;font-size:100%;font-family:inherit;vertical-align:baseline;text-rendering:optimizelegibility;-webkit-font-smoothing:antialiased;text-size-adjust:none}.seam-components footer,.seam-components header,.seam-components nav,.seam-components section,.seam-components main{display:block}.seam-components body{line-height:1}.seam-components ol,.seam-components ul{list-style:none}.seam-components blockquote,.seam-components q{quotes:none}.seam-components blockquote::before,.seam-components blockquote::after,.seam-components q::before,.seam-components q::after{content:"";content:none}.seam-components table{border-collapse:collapse;border-spacing:0}.seam-components input{appearance:none;border-radius:0}.seam-components h1,.seam-components h2,.seam-components h3,.seam-components h4,.seam-components h5,.seam-components h6{font-weight:600}.seam-components .seam-caption{color:#9da1a9}.seam-components .seam-text-danger{color:#e36857}.seam-components html{color:#232b3a}.seam-components .seam-table-header{display:flex;justify-content:space-between;align-items:center;height:56px;padding:0 16px}.seam-components .seam-table-title{font-size:21px;line-height:132%}.seam-components .seam-table-title .seam-caption{font-size:16px;line-height:134%}.seam-components .seam-table-row{display:flex;padding:4px;height:72px;border-bottom:1px solid #eee}.seam-components .seam-table-row:hover{background:#f4f6f8}.seam-components .seam-table-row .seam-title{font-weight:600;font-size:18px;line-height:132%}.seam-components .seam-table-cell{display:flex;align-items:center;padding:4px}.seam-components .seam-table-empty-placeholder{height:300px;font-size:18px;line-height:132%;display:flex;align-items:center;justify-content:center}.seam-components .seam-table-filter-bar{display:flex;align-items:center;padding:6px 16px;background:#f1f3f4}.seam-components .seam-table-filter-bar .seam-clear-filters-button{margin-left:6px;border:0;background:rgba(0,0,0,0) !important;padding:0}.seam-components .seam-table-filter-bar .seam-clear-filters-button svg{scale:.8333}.seam-components .seam-table-filter-bar .seam-clear-filters-button svg *{fill:#6e7179}.seam-components .seam-table-filter-item{display:flex;align-items:center;padding:2px 8px 2px 5px;border-radius:5px;border:1px solid #f1f3f4;font-size:14px;line-height:134%}.seam-components .seam-table-filter-item svg{scale:.75}.seam-components .seam-table-filter-item.seam-clickable{cursor:pointer}.seam-components .seam-table-filter-item.seam-clickable:hover{background:rgba(255,255,255,.65);border:1px solid #d5d8dc}.seam-components .seam-table-filter-item.seam-selected{background:#fff;border:1px solid #d5d8dc}.seam-components .seam-text-field{padding:0 8px;height:40px;border:1px solid #d5d8dc;border-radius:8px}.seam-components .seam-btn{font-family:"Source Sans Pro",system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Open Sans","Helvetica Neue",sans-serif;font-weight:600;cursor:pointer}.seam-components .seam-btn.seam-btn-small{font-size:14px;line-height:22px;border-radius:6px;padding:4px 10px}.seam-components .seam-btn.seam-btn-medium{font-size:16px;line-height:26px;border-radius:7px;padding:6px 16px}.seam-components .seam-btn.seam-btn-large{font-size:19px;line-height:30px;border-radius:8px;padding:8px 22px}.seam-components .seam-btn.seam-btn-solid{background:#007afc;color:#fff;border:1px solid #007afc}.seam-components .seam-btn.seam-btn-solid:hover{background:#006ee3;border-color:#006ee3}.seam-components .seam-btn.seam-btn-solid.seam-btn-disabled,.seam-components .seam-btn.seam-btn-solid:disabled{background:#c1dfff;border-color:#c1dfff}.seam-components .seam-btn.seam-btn-outline{color:#007afc;border:1px solid #7ebcff;background:rgba(0,0,0,0)}.seam-components .seam-btn.seam-btn-outline:hover{background:#f2f8ff}.seam-components .seam-btn.seam-btn-outline.seam-btn-disabled,.seam-components .seam-btn.seam-btn-outline:disabled{background:rgba(0,0,0,0);color:#7ebcff}.seam-components .seam-btn.seam-btn-neutral{color:#6e7179;border:1px solid #b9bec5}.seam-components .seam-btn.seam-btn-neutral:hover{background:#f1f3f4;border-color:#b9bec5}.seam-components .seam-btn.seam-btn-neutral.seam-btn-disabled,.seam-components .seam-btn.seam-btn-neutral:disabled{color:#b9bec5;border-color:#d5d8dc;background:#fff}.seam-components .seam-btn.seam-btn-disabled,.seam-components .seam-btn:disabled{cursor:not-allowed}.seam-components .seam-icon-btn{border-radius:6px;border:1px solid rgba(0,122,252,.5);cursor:pointer;background:#fff;padding:6px;line-height:0}.seam-components .seam-icon-btn:hover{background:rgba(0,122,252,.08)}.seam-components .seam-text-btn{color:#007afc;padding:0;cursor:pointer;background:rgba(0,0,0,0);border:0}.seam-components .seam-text-btn:hover{text-decoration:underline}.seam-components .seam-text-btn.seam-btn-disabled,.seam-components .seam-text-btn:disabled{cursor:not-allowed;text-decoration:none}.seam-components .seam-content-header{height:56px;display:flex;align-items:center;position:relative;justify-content:center;margin:0 16px}.seam-components .seam-content-header .seam-back-icon{position:absolute;top:50%;transform:translate(4px, -25%);left:0;cursor:pointer}.seam-components .seam-content-header .seam-title{font-size:16px;line-height:134%;color:#6e7179}.seam-components .seam-lock-icon *{fill:#6e7179}.seam-components .seam-menu-bg{width:100vw;height:100vh;justify-content:center;align-items:center;position:fixed;inset:0;z-index:999999;display:none}.seam-components .seam-menu-content{width:250px;position:absolute;padding:8px 0;background:#fff;box-shadow:0 0 1px rgba(0,0,0,.3),0 2px 16px 2px rgba(15,22,28,.15);border-radius:8px}.seam-components .seam-menu-content .seam-menu-item{padding:0 16px;height:36px;display:flex;align-items:center;font-size:16px;line-height:134%;cursor:pointer}.seam-components .seam-menu-content .seam-menu-item:hover{background:#f4f6f8}.seam-components .seam-menu-shadow{z-index:-1;opacity:0;visibility:hidden;top:0;right:0;position:fixed}.seam-components .seam-device-details .seam-body{display:flex;flex-direction:column;gap:16px;margin:0 24px 24px}.seam-components .seam-device-details .seam-body .seam-box{border:1px solid #d5d8dc;border-radius:8px}.seam-components .seam-device-details .seam-body .seam-box .seam-content{padding:12px 12px 12px 16px}.seam-components .seam-device-details .seam-body .seam-box .seam-content.seam-access-codes{padding:12px 8px 12px 16px;display:flex;align-items:center;justify-content:space-between;cursor:pointer}.seam-components .seam-device-details .seam-body .seam-box .seam-content.seam-access-codes:hover{background:#f4f6f8}.seam-components .seam-device-details .seam-body .seam-box .seam-content.seam-access-code-length{border-top:1px solid #d5d8dc}.seam-components .seam-device-details .seam-body .seam-box .seam-content.seam-lock-status{display:flex;justify-content:space-between}.seam-components .seam-device-details .seam-body .seam-box .seam-content.seam-lock-status>.seam-right{display:flex;align-items:center}.seam-components .seam-device-details .seam-body .seam-box .seam-content .seam-label{font-size:14px;line-height:134%;color:#6e7179}.seam-components .seam-device-details .seam-body .seam-box .seam-content .seam-value{display:block;font-weight:600;font-size:16px;line-height:134%}.seam-components .seam-device-details .seam-body .seam-summary{padding:24px 16px;border-radius:16px;background:#f1f3f4}.seam-components .seam-device-details .seam-body .seam-summary .seam-content{display:flex;align-items:center;gap:20px}.seam-components .seam-device-details .seam-body .seam-summary .seam-content .seam-image{width:100px;height:100px;display:flex;align-items:center}.seam-components .seam-device-details .seam-body .seam-summary .seam-content .seam-image img{max-width:100%}.seam-components .seam-device-details .seam-body .seam-summary .seam-content .seam-info>.seam-label{color:#6e7179;font-weight:600;font-size:14px;line-height:134%;margin-bottom:4px}.seam-components .seam-device-details .seam-body .seam-summary .seam-content .seam-info .seam-device-name{margin-bottom:16px;font-weight:600;font-size:21px;line-height:132%}.seam-components .seam-device-details .seam-body .seam-summary .seam-content .seam-info .seam-properties{display:grid;grid-template-columns:min-content 1fr;grid-auto-rows:1fr;font-size:14px;line-height:134%;row-gap:4px;column-gap:28px}.seam-components .seam-device-details .seam-body .seam-summary .seam-content .seam-info .seam-properties .seam-label{color:#9da1a9}.seam-components .seam-device-details .seam-body .seam-summary .seam-content .seam-info .seam-properties .seam-status-text{color:#6e7179}.seam-components .seam-device-details .seam-body .seam-summary .seam-content .seam-info .seam-properties svg{scale:.75;margin-right:8px}.seam-components .seam-device-details .seam-body .seam-summary .seam-content .seam-info .seam-properties>*{display:flex;align-items:center}.seam-components .seam-device-details .seam-body .seam-icon-cell{flex:0;margin-left:8px;display:flex;align-items:center;justify-content:center}.seam-components .seam-device-details .seam-body .seam-icon-cell>div{width:40px;height:40px;display:flex;align-items:center;justify-content:center}.seam-components .seam-device-details .seam-body .seam-name-cell{flex:1}.seam-components .seam-device-details .seam-body .seam-action-cell{margin-right:12px;display:flex;align-items:center;justify-content:center}.seam-components .seam-device-table .seam-table-row{cursor:pointer}.seam-components .seam-device-table .seam-table-row .seam-image-cell{width:64px;height:64px;padding:4px}.seam-components .seam-device-table .seam-table-row .seam-image-cell img{width:100%}.seam-components .seam-device-table .seam-table-row .seam-body-cell{flex:1;flex-direction:column;justify-content:center;align-items:flex-start;gap:2px}.seam-components .seam-device-table .seam-table-row .seam-body-cell .seam-bottom{display:flex;justify-content:space-between;align-items:center;width:100%}.seam-components .seam-device-table .seam-table-row .seam-body-cell .seam-bottom .seam-device-model{font-weight:400;font-size:14px;line-height:134%;color:#6e7179;flex:0 1 190px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.seam-components .seam-device-table .seam-table-row .seam-body-cell .seam-bottom .seam-device-statuses{display:flex;align-items:center;color:#6e7179;font-size:14px;line-height:134%}.seam-components .seam-device-table .seam-table-row .seam-body-cell .seam-bottom .seam-device-statuses>div{display:flex;align-items:center;margin-right:16px}.seam-components .seam-device-table .seam-table-row .seam-body-cell .seam-bottom .seam-device-statuses>div svg{scale:.75}.seam-components .seam-access-code-table .seam-table-row{cursor:pointer}.seam-components .seam-access-code-table .seam-table-row .seam-icon-cell{flex:0;display:flex;align-items:center;justify-content:center}.seam-components .seam-access-code-table .seam-table-row .seam-icon-cell>div{width:40px;height:40px;display:flex;align-items:center;justify-content:center}.seam-components .seam-access-code-table .seam-table-row .seam-name-cell{flex:1;flex-direction:column;justify-content:center;align-items:flex-start;gap:2px}.seam-components .seam-access-code-table .seam-table-row .seam-name-cell .seam-code-details{font-size:14px;line-height:134%;color:#6e7179}.seam-components .seam-access-code-table .seam-table-row .seam-name-cell .seam-code-details .seam-dot-divider{margin:0 4px;color:#d5d8dc}.seam-components .seam-access-code-table .seam-table-row .seam-action-cell{margin-right:12px;display:flex;align-items:center;justify-content:center}.seam-components .seam-access-code-table-action-menu .menu-item-copy{display:flex;align-items:center;justify-content:space-between;flex:1}.seam-components .seam-access-code-details>.seam-summary{background:#f1f3f4;border-radius:16px;margin:0 24px 16px}.seam-components .seam-access-code-details>.seam-summary>.seam-top{padding:24px 16px}.seam-components .seam-access-code-details>.seam-summary>.seam-top>.seam-label{font-weight:600;font-size:14px;line-height:134%;color:#6e7179;margin-bottom:4px}.seam-components .seam-access-code-details>.seam-summary>.seam-top>.seam-access-code-name{font-weight:600;font-size:21px;line-height:132%;margin-bottom:8px}.seam-components .seam-access-code-details>.seam-summary>.seam-top>.seam-code{background:#fff;border:1px solid #9da1a9;border-radius:8px;padding:10px 16px;font-weight:600;font-size:24px;line-height:134%;margin-bottom:8px}.seam-components .seam-access-code-details>.seam-summary>.seam-top .seam-duration{color:#6e7179;font-size:14px;line-height:134%}.seam-components .seam-access-code-details>.seam-summary>.seam-top .seam-duration .seam-label{font-weight:600;color:#232b3a}.seam-components .seam-access-code-details>.seam-summary .seam-access-code-device{border-top:1px solid #dde0e2;padding:8px 16px 8px 8px;display:flex;align-items:center}.seam-components .seam-access-code-details>.seam-summary .seam-access-code-device .seam-device-image{width:72px;height:72px;margin-right:16px}.seam-components .seam-access-code-details>.seam-summary .seam-access-code-device .seam-device-image img{width:100%;max-height:100%}.seam-components .seam-access-code-details>.seam-summary .seam-access-code-device .seam-body{flex:1;font-weight:400;font-size:14px;line-height:134%;margin-right:8px}.seam-components .seam-access-code-details .seam-details{font-size:16px;line-height:134%;border-bottom:1px solid rgba(0,0,0,.12);padding:0 24px}.seam-components .seam-access-code-details .seam-details .seam-row{padding:16px;display:flex;border-top:1px solid rgba(0,0,0,.12)}.seam-components .seam-access-code-details .seam-details .seam-row .seam-heading{width:112px}.seam-components .seam-access-code-details .seam-details .seam-row .seam-content{display:flex;flex:1}.seam-components .seam-access-code-details .seam-details .seam-row .seam-content .seam-times{display:flex;flex:1;font-size:16px;line-height:134%}.seam-components .seam-access-code-details .seam-details .seam-row .seam-content .seam-times .seam-label{color:#9da1a9}.seam-components .seam-access-code-details .seam-details .seam-row .seam-content .seam-times>div div{margin-bottom:4px}.seam-components .seam-access-code-details .seam-details .seam-row .seam-content .seam-times>div:first-child{flex:0 1 160px}.seam-components .seam-alerts{width:100%;display:flex;justify-content:flex-start;align-items:flex-start;flex-direction:column;gap:8px}.seam-components .seam-alerts.seam-alerts-space-top{margin-top:16px}.seam-components .seam-alert{width:100%;min-height:70px;padding:8px 16px;border-radius:8px;display:flex;justify-content:space-between;align-items:center;flex-direction:row;gap:16px}.seam-components .seam-alert .seam-alert-action{appearance:none;height:32px;padding:0 10px;border-radius:6px;background-color:rgba(0,0,0,0);font-size:14px;line-height:1;font-weight:600;white-space:nowrap;cursor:pointer}.seam-components .seam-alert .seam-alert-action:hover{background-color:#f4f6f8}.seam-components .seam-alert.seam-warning-alert{background-color:#fff2e0;border:1px solid #f8d8be}.seam-components .seam-alert.seam-warning-alert .seam-alert-action{border:1px solid #ca8852;color:#ca8852}.seam-components .seam-alert.seam-error-alert{background-color:#ffefef;border:1px solid #f1d4d4}.seam-components .seam-alert.seam-error-alert .seam-alert-action{border:1px solid #cb7d7d;color:#cb7d7d}.seam-components .seam-alert.seam-alert-space-top{margin-top:16px}.seam-components .seam-alert .seam-alert-icon{width:24px;height:24px}.seam-components .seam-alert .seam-alert-content{display:flex;justify-content:flex-start;align-items:center;flex-direction:row;gap:8px}.seam-components .seam-alert .seam-alert-message-wrap .seam-alert-message{font-size:14px;font-weight:400;line-height:134%;color:#232b3a}@media only screen and (width <= 500px){.seam-components .seam-alert{justify-content:flex-start;flex-direction:column}.seam-components .seam-alert .seam-alert-content{width:100%;align-items:flex-start;flex-direction:column;gap:4px}.seam-components .seam-alert .seam-alert-action-wrap{width:100%}.seam-components .seam-alert .seam-alert-action-wrap .seam-alert-action{width:100%}}.seam-components .seam-supported-devices-table-state-block{width:100%;background-color:#f1f3f4;padding:32px 8px;display:flex;justify-content:center;align-items:center;flex-direction:column;gap:8px}.seam-components .seam-supported-devices-table{width:100%;overflow-x:auto;table-layout:auto;border-collapse:collapse}.seam-components .seam-supported-devices-table th,.seam-components .seam-supported-devices-table td{white-space:nowrap;padding:0 8px}.seam-components .seam-supported-devices-table thead{width:100%;height:50px;background:#f1f3f4;overflow:hidden}.seam-components .seam-supported-devices-table thead tr{border-radius:8px}.seam-components .seam-supported-devices-table thead th{vertical-align:middle;text-align:left;font-size:16px;font-weight:600}.seam-components .seam-supported-devices-table tbody tr{height:60px;border-bottom:1px solid #e9edef}.seam-components .seam-supported-devices-table tbody td{vertical-align:middle}.seam-components .seam-supported-devices-table tr th:first-of-type,.seam-components .seam-supported-devices-table tr td:first-of-type{padding-left:8px}.seam-components .seam-supported-devices-table tr th:last-of-type,.seam-components .seam-supported-devices-table tr td:last-of-type{padding-right:8px}.seam-components .seam-supported-devices-table .seam-status-pill{display:inline-flex;padding:4px 8px;border-radius:90px;background-color:#27ae60}.seam-components .seam-supported-devices-table .seam-status-pill span{color:#fff;font-size:14px;font-weight:600;line-height:1}.seam-components .seam-supported-devices-table .seam-status-pill.status-green{background-color:#27ae60}.seam-components .seam-supported-devices-table .seam-status-pill.status-orange{background-color:#f3980f}.seam-components .seam-supported-devices-table .seam-status-pill.status-red{background-color:#e36857}.seam-components .seam-supported-devices-table .seam-status-pill.status-blue{background-color:#007afc}.seam-components .seam-supported-devices-table .seam-status-pill.status-gray{background-color:#cbd0d3}/*# sourceMappingURL=index.min.css.map */
package/index.min.css.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sourceRoot":"","sources":["src/styles/_main.scss","src/styles/_typography.scss","src/styles/_reset.scss","src/styles/_colors.scss","src/styles/_tables.scss","src/styles/_inputs.scss","src/styles/_buttons.scss","src/styles/_layout.scss","src/styles/_icons.scss","src/styles/_menus.scss","src/styles/_device-details.scss","src/styles/_device-table.scss","src/styles/_access-code-table.scss","src/styles/_access-code-details.scss","src/styles/_alert.scss","src/styles/_supported-devices.scss"],"names":[],"mappings":"AAgBA,iBCbE,2JCGA,wEAGE,sBAGF,ylCAmDE,SACA,UACA,SACA,eACA,oBACA,wBACA,kCACA,mCACA,sBAGF,oHAKE,cAGF,sBACE,cAGF,wCAEE,gBAGF,+CAEE,YAGF,4HAIE,WACA,aAGF,uBACE,yBACA,iBAGF,uBACE,gBACA,gBDtGF,wHAME,gBAKF,+BACE,METU,QFcZ,mCACE,MEPS,QFYX,sBACE,MEvBW,QCPb,oCACE,aACA,8BACA,mBACA,YACA,eAGF,mCACE,eACA,iBAEA,iDACE,eACA,iBAMJ,iCACE,aACA,YACA,YACA,6BAEA,uCACE,mBAGF,6CACE,gBACA,eACA,iBAMJ,kCACE,aACA,mBACA,YAKF,+CACE,aACA,eACA,iBACA,aACA,mBACA,uBCrDF,kCACE,cACA,YACA,yBACA,kBC2GF,2BL/GA,2JKoHE,gBACA,eAjFF,0CACE,eACA,iBACA,kBACA,iBAGF,2CACE,eACA,iBACA,kBACA,iBAGF,0CACE,eACA,iBACA,kBACA,iBAKF,0CACE,WH7DM,QG8DN,WACA,yBAEA,gDACE,WH5DS,QG6DT,aH7DS,QGgEX,+GAEE,WHjEQ,QGkER,aHlEQ,QGsEZ,4CACE,MH9EM,QG+EN,yBACA,yBAEA,kDACE,WH9EM,QGiFR,mHAEE,yBACA,MHxFO,QG4FX,4CACE,MHrFU,QGsFV,yBAEA,kDACE,WHjFC,QGkFD,aHxFU,QG2FZ,mHAEE,MH7FU,QG8FV,aH7FQ,QG8FR,gBAcF,iFAEE,mBAxHJ,gCACE,kBACA,oCACA,eACA,gBACA,YACA,cAEA,sCACE,+BAMJ,gCACE,MHlBM,QGmBN,UACA,eACA,yBACA,SAEA,sCACE,0BAGF,2FAEE,mBACA,qBC9BJ,sCACE,YACA,aACA,mBACA,kBACA,uBACA,cAEA,sDACE,kBACA,QACA,+BACA,OACA,eAGF,kDACE,eACA,iBACA,MJXQ,QKPV,mCACE,KLMQ,QMRZ,+BACE,YACA,aACA,uBACA,mBACA,eACA,QACA,eACA,aAGF,oCACE,YACA,kBACA,cACA,gBACA,oEACA,kBAEA,oDACE,eACA,YACA,aACA,mBACA,eACA,iBACA,eAEA,0DACE,WNHQ,QMQd,mCACE,WACA,UACA,kBACA,MACA,QACA,eCvCA,iDACE,aACA,sBACA,SACA,mBAEA,2DACE,yBACA,kBAEA,yEACE,4BAEA,2FACE,2BACA,aACA,mBACA,8BACA,eAEA,iGACE,WPIE,yGOCJ,6BAGF,0FACE,aACA,8BAEA,sGACE,aACA,mBAIJ,qFACE,eACA,iBACA,MPnCE,QOsCJ,qFACE,cACA,gBACA,eACA,iBAKN,+DACE,kBACA,mBACA,WP1CD,QO4CC,6EACE,aACA,mBACA,SAEA,yFACE,YACA,aACA,aACA,mBAEA,6FACE,eAKF,oGACE,MPtEA,QOuEA,gBACA,eACA,iBACA,kBAGF,0GACE,mBACA,gBACA,eACA,iBAGF,yGACE,aACA,sCACA,mBACA,eACA,iBACA,YACA,gBAEA,qHACE,MP7FF,QOgGA,2HACE,MPlGF,QOqGA,6GACE,UACA,iBAGF,2GACE,aACA,mBAOV,iEACE,OACA,gBACA,aACA,mBACA,uBAEA,qEACE,WACA,YACA,aACA,mBACA,uBAIJ,iEACE,OAGF,mEACE,kBACA,aACA,mBACA,uBClJJ,oDACE,eAEA,qEACE,WACA,YACA,YAEA,yEACE,WAIJ,oEACE,OACA,sBACA,uBACA,uBACA,QAEA,iFACE,aACA,8BACA,mBACA,WAEA,oGACE,gBACA,eACA,iBACA,MRvBE,QQwBF,eACA,mBACA,gBACA,uBAGF,uGACE,aACA,mBACA,MRjCE,QQkCF,eACA,iBAEA,2GACE,aACA,mBACA,kBAEA,+GACE,UClDZ,yDACE,eAEA,yEACE,OACA,aACA,mBACA,uBAEA,6EACE,WACA,YACA,aACA,mBACA,uBAIJ,yEACE,OACA,sBACA,uBACA,uBACA,QAEA,4FACE,eACA,iBACA,MTrBI,QSuBJ,8GACE,aACA,MTtBE,QS2BR,2EACE,kBACA,aACA,mBACA,uBAMJ,qEACE,aACA,mBACA,8BACA,OCnDF,yDACE,WVcC,QUbD,mBACA,mBAEA,mEACE,kBAEA,+EACE,gBACA,eACA,iBACA,MVLI,QUMJ,kBAGF,0FACE,gBACA,eACA,iBACA,kBAGF,8EACE,gBACA,yBACA,kBACA,kBACA,gBACA,eACA,iBACA,kBAGF,kFACE,MV5BI,QU6BJ,eACA,iBAEA,8FACE,gBACA,MVnCG,QUwCT,kFACE,6BACA,yBACA,aACA,mBAEA,qGACE,WACA,YACA,kBAEA,yGACE,WACA,gBAIJ,6FACE,OACA,gBACA,eACA,iBACA,iBAKN,yDACE,eACA,iBACA,wCACA,eAEA,mEACE,aACA,aACA,qCAEA,iFACE,YAGF,iFACE,aACA,OAEA,6FACE,aACA,OACA,eACA,iBAEA,yGACE,MV3FA,QU+FA,qGACE,kBAGF,6GACE,eC5Gd,8BACE,WACA,aACA,2BACA,uBACA,sBACA,QAEA,oDACE,gBAKJ,6BACE,WACA,gBACA,iBACA,kBACA,aACA,8BACA,mBACA,mBACA,SAEA,gDACE,gBACA,YACA,eACA,kBACA,+BACA,eACA,cACA,gBACA,mBACA,eAEA,sDACE,iBXbQ,QWiBZ,gDACE,iBXnBY,QWoBZ,yBAEA,mEACE,yBACA,MX1BU,QW8Bd,8CACE,iBXhCa,QWiCb,yBAEA,iEACE,yBACA,MXvCW,QW2Cf,kDACE,gBAGF,8CACE,WACA,YAGF,iDACE,aACA,2BACA,mBACA,mBACA,QAIA,0EACE,eACA,gBACA,iBACA,MX9EO,QWmFb,wCACE,6BACE,2BACA,sBAEA,iDACE,WACA,uBACA,sBACA,QAGF,qDACE,WAEA,wEACE,YCxGR,2DACE,WACA,iBZYG,QYXH,iBACA,aACA,uBACA,mBACA,sBACA,QAGF,+CACE,WACA,gBACA,kBACA,yBAEA,oGAEE,mBACA,cAGF,qDACE,WACA,YACA,WZZC,QYaD,gBAEA,wDACE,kBAGF,wDACE,sBACA,gBACA,eACA,gBAKF,wDACE,YACA,gCAGF,wDACE,sBAMF,sIAEE,aA3DM,IA8DR,oIAEE,cAhEM,IAoEV,iEACE,oBACA,gBACA,mBACA,iBZpDS,QYsDT,sEACE,WACA,eACA,gBACA,cAGF,8EACE,iBZ9DO,QYiET,+EACE,iBZnEQ,QYsEV,4EACE,iBZxEK,QY2EP,6EACE,iBZ9FE,QYiGJ,6EACE,iBZpFD","file":"index.min.css"}
1
+ {"version":3,"sourceRoot":"","sources":["src/styles/_main.scss","src/styles/_typography.scss","src/styles/_reset.scss","src/styles/_colors.scss","src/styles/_tables.scss","src/styles/_inputs.scss","src/styles/_buttons.scss","src/styles/_layout.scss","src/styles/_icons.scss","src/styles/_menus.scss","src/styles/_device-details.scss","src/styles/_device-table.scss","src/styles/_access-code-table.scss","src/styles/_access-code-details.scss","src/styles/_alert.scss","src/styles/_supported-devices.scss"],"names":[],"mappings":"AAgBA,iBCbE,2JCGA,wEAGE,sBAGF,ylCAmDE,SACA,UACA,SACA,eACA,oBACA,wBACA,kCACA,mCACA,sBAGF,oHAKE,cAGF,sBACE,cAGF,wCAEE,gBAGF,+CAEE,YAGF,4HAIE,WACA,aAGF,uBACE,yBACA,iBAGF,uBACE,gBACA,gBDtGF,wHAME,gBAKF,+BACE,METU,QFcZ,mCACE,MEPS,QFYX,sBACE,MEvBW,QCPb,oCACE,aACA,8BACA,mBACA,YACA,eAGF,mCACE,eACA,iBAEA,iDACE,eACA,iBAMJ,iCACE,aACA,YACA,YACA,6BAEA,uCACE,mBAGF,6CACE,gBACA,eACA,iBAMJ,kCACE,aACA,mBACA,YAKF,+CACE,aACA,eACA,iBACA,aACA,mBACA,uBAKF,wCACE,aACA,mBACA,iBACA,WD9CG,QCgDH,mEACE,gBACA,SACA,oCACA,UAEA,uEACE,YAEA,yEACE,KDlEI,QCwEZ,yCACE,aACA,mBACA,wBACA,kBACA,yBACA,eACA,iBAEA,6CACE,UAGF,wDACE,eAEA,8DACE,iCACA,yBAIJ,uDACE,gBACA,yBCxGJ,kCACE,cACA,YACA,yBACA,kBC2GF,2BL/GA,2JKoHE,gBACA,eAjFF,0CACE,eACA,iBACA,kBACA,iBAGF,2CACE,eACA,iBACA,kBACA,iBAGF,0CACE,eACA,iBACA,kBACA,iBAKF,0CACE,WH7DM,QG8DN,WACA,yBAEA,gDACE,WH5DS,QG6DT,aH7DS,QGgEX,+GAEE,WHjEQ,QGkER,aHlEQ,QGsEZ,4CACE,MH9EM,QG+EN,yBACA,yBAEA,kDACE,WH9EM,QGiFR,mHAEE,yBACA,MHxFO,QG4FX,4CACE,MHrFU,QGsFV,yBAEA,kDACE,WHjFC,QGkFD,aHxFU,QG2FZ,mHAEE,MH7FU,QG8FV,aH7FQ,QG8FR,gBAcF,iFAEE,mBAxHJ,gCACE,kBACA,oCACA,eACA,gBACA,YACA,cAEA,sCACE,+BAMJ,gCACE,MHlBM,QGmBN,UACA,eACA,yBACA,SAEA,sCACE,0BAGF,2FAEE,mBACA,qBC9BJ,sCACE,YACA,aACA,mBACA,kBACA,uBACA,cAEA,sDACE,kBACA,QACA,+BACA,OACA,eAGF,kDACE,eACA,iBACA,MJXQ,QKPV,mCACE,KLMQ,QMRZ,+BACE,YACA,aACA,uBACA,mBACA,eACA,QACA,eACA,aAGF,oCACE,YACA,kBACA,cACA,gBACA,oEACA,kBAEA,oDACE,eACA,YACA,aACA,mBACA,eACA,iBACA,eAEA,0DACE,WNHQ,QMQd,mCACE,WACA,UACA,kBACA,MACA,QACA,eCvCA,iDACE,aACA,sBACA,SACA,mBAEA,2DACE,yBACA,kBAEA,yEACE,4BAEA,2FACE,2BACA,aACA,mBACA,8BACA,eAEA,iGACE,WPIE,yGOCJ,6BAGF,0FACE,aACA,8BAEA,sGACE,aACA,mBAIJ,qFACE,eACA,iBACA,MPnCE,QOsCJ,qFACE,cACA,gBACA,eACA,iBAKN,+DACE,kBACA,mBACA,WP1CD,QO4CC,6EACE,aACA,mBACA,SAEA,yFACE,YACA,aACA,aACA,mBAEA,6FACE,eAKF,oGACE,MPtEA,QOuEA,gBACA,eACA,iBACA,kBAGF,0GACE,mBACA,gBACA,eACA,iBAGF,yGACE,aACA,sCACA,mBACA,eACA,iBACA,YACA,gBAEA,qHACE,MP7FF,QOgGA,2HACE,MPlGF,QOqGA,6GACE,UACA,iBAGF,2GACE,aACA,mBAOV,iEACE,OACA,gBACA,aACA,mBACA,uBAEA,qEACE,WACA,YACA,aACA,mBACA,uBAIJ,iEACE,OAGF,mEACE,kBACA,aACA,mBACA,uBClJJ,oDACE,eAEA,qEACE,WACA,YACA,YAEA,yEACE,WAIJ,oEACE,OACA,sBACA,uBACA,uBACA,QAEA,iFACE,aACA,8BACA,mBACA,WAEA,oGACE,gBACA,eACA,iBACA,MRvBE,QQwBF,eACA,mBACA,gBACA,uBAGF,uGACE,aACA,mBACA,MRjCE,QQkCF,eACA,iBAEA,2GACE,aACA,mBACA,kBAEA,+GACE,UClDZ,yDACE,eAEA,yEACE,OACA,aACA,mBACA,uBAEA,6EACE,WACA,YACA,aACA,mBACA,uBAIJ,yEACE,OACA,sBACA,uBACA,uBACA,QAEA,4FACE,eACA,iBACA,MTrBI,QSuBJ,8GACE,aACA,MTtBE,QS2BR,2EACE,kBACA,aACA,mBACA,uBAMJ,qEACE,aACA,mBACA,8BACA,OCnDF,yDACE,WVcC,QUbD,mBACA,mBAEA,mEACE,kBAEA,+EACE,gBACA,eACA,iBACA,MVLI,QUMJ,kBAGF,0FACE,gBACA,eACA,iBACA,kBAGF,8EACE,gBACA,yBACA,kBACA,kBACA,gBACA,eACA,iBACA,kBAGF,kFACE,MV5BI,QU6BJ,eACA,iBAEA,8FACE,gBACA,MVnCG,QUwCT,kFACE,6BACA,yBACA,aACA,mBAEA,qGACE,WACA,YACA,kBAEA,yGACE,WACA,gBAIJ,6FACE,OACA,gBACA,eACA,iBACA,iBAKN,yDACE,eACA,iBACA,wCACA,eAEA,mEACE,aACA,aACA,qCAEA,iFACE,YAGF,iFACE,aACA,OAEA,6FACE,aACA,OACA,eACA,iBAEA,yGACE,MV3FA,QU+FA,qGACE,kBAGF,6GACE,eC5Gd,8BACE,WACA,aACA,2BACA,uBACA,sBACA,QAEA,oDACE,gBAKJ,6BACE,WACA,gBACA,iBACA,kBACA,aACA,8BACA,mBACA,mBACA,SAEA,gDACE,gBACA,YACA,eACA,kBACA,+BACA,eACA,cACA,gBACA,mBACA,eAEA,sDACE,iBXbQ,QWiBZ,gDACE,iBXnBY,QWoBZ,yBAEA,mEACE,yBACA,MX1BU,QW8Bd,8CACE,iBXhCa,QWiCb,yBAEA,iEACE,yBACA,MXvCW,QW2Cf,kDACE,gBAGF,8CACE,WACA,YAGF,iDACE,aACA,2BACA,mBACA,mBACA,QAIA,0EACE,eACA,gBACA,iBACA,MX9EO,QWmFb,wCACE,6BACE,2BACA,sBAEA,iDACE,WACA,uBACA,sBACA,QAGF,qDACE,WAEA,wEACE,YCxGR,2DACE,WACA,iBZYG,QYXH,iBACA,aACA,uBACA,mBACA,sBACA,QAGF,+CACE,WACA,gBACA,kBACA,yBAEA,oGAEE,mBACA,cAGF,qDACE,WACA,YACA,WZZC,QYaD,gBAEA,wDACE,kBAGF,wDACE,sBACA,gBACA,eACA,gBAKF,wDACE,YACA,gCAGF,wDACE,sBAMF,sIAEE,aA3DM,IA8DR,oIAEE,cAhEM,IAoEV,iEACE,oBACA,gBACA,mBACA,iBZpDS,QYsDT,sEACE,WACA,eACA,gBACA,cAGF,8EACE,iBZ9DO,QYiET,+EACE,iBZnEQ,QYsEV,4EACE,iBZxEK,QY2EP,6EACE,iBZ9FE,QYiGJ,6EACE,iBZpFD","file":"index.min.css"}
@@ -0,0 +1,2 @@
1
+ import type { SVGProps } from 'react';
2
+ export declare const ArrowRestartIcon: (props: SVGProps<SVGSVGElement>) => JSX.Element;
@@ -0,0 +1,5 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ export const ArrowRestartIcon = (props) => (_jsxs("svg", { xmlns: 'http://www.w3.org/2000/svg', width: 24, height: 24, fill: 'none', ...props, children: [_jsx("mask", { id: 'arrow-restart_svg__a', width: 24, height: 24, x: 0, y: 0, maskUnits: 'userSpaceOnUse', style: {
3
+ maskType: 'alpha',
4
+ }, children: _jsx("path", { fill: '#D9D9D9', d: 'M0 0h24v24H0z' }) }), _jsx("g", { mask: 'url(#arrow-restart_svg__a)', children: _jsx("path", { fill: '#232B3A', d: 'M12 20c2.233 0 4.125-.775 5.675-2.325C19.225 16.125 20 14.233 20 12c0-2.233-.775-4.125-2.325-5.675C16.125 4.775 14.233 4 12 4c-1.15 0-2.25.238-3.3.713A7.617 7.617 0 0 0 6 6.75V4H4v7h7V9H6.8a5.838 5.838 0 0 1 2.187-2.2A5.93 5.93 0 0 1 12 6c1.667 0 3.083.583 4.25 1.75C17.417 8.917 18 10.333 18 12c0 1.667-.583 3.083-1.75 4.25C15.083 17.417 13.667 18 12 18a5.863 5.863 0 0 1-3.475-1.1A5.809 5.809 0 0 1 6.35 14h-2.1c.467 1.767 1.417 3.208 2.85 4.325S10.167 20 12 20Z' }) })] }));
5
+ //# sourceMappingURL=ArrowRestart.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ArrowRestart.js","sourceRoot":"","sources":["../../src/lib/icons/ArrowRestart.tsx"],"names":[],"mappings":";AACA,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAC9B,KAA8B,EACjB,EAAE,CAAC,CAChB,eACE,KAAK,EAAC,4BAA4B,EAClC,KAAK,EAAE,EAAE,EACT,MAAM,EAAE,EAAE,EACV,IAAI,EAAC,MAAM,KACP,KAAK,aAET,eACE,EAAE,EAAC,sBAAsB,EACzB,KAAK,EAAE,EAAE,EACT,MAAM,EAAE,EAAE,EACV,CAAC,EAAE,CAAC,EACJ,CAAC,EAAE,CAAC,EACJ,SAAS,EAAC,gBAAgB,EAC1B,KAAK,EAAE;gBACL,QAAQ,EAAE,OAAO;aAClB,YAED,eAAM,IAAI,EAAC,SAAS,EAAC,CAAC,EAAC,eAAe,GAAG,GACpC,EACP,YAAG,IAAI,EAAC,4BAA4B,YAClC,eACE,IAAI,EAAC,SAAS,EACd,CAAC,EAAC,kdAAkd,GACpd,GACA,IACA,CACP,CAAA"}
@@ -0,0 +1,2 @@
1
+ import type { SVGProps } from 'react';
2
+ export declare const CheckIcon: (props: SVGProps<SVGSVGElement>) => JSX.Element;
@@ -0,0 +1,3 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ export const CheckIcon = (props) => (_jsx("svg", { xmlns: 'http://www.w3.org/2000/svg', width: 25, height: 24, fill: 'none', ...props, children: _jsx("path", { fill: '#27AE60', d: 'm9.5 15.73-3.936-4.038-1.895 1.872L9.5 19.476l12.765-12.92-1.82-1.87L9.5 15.73Z' }) }));
3
+ //# sourceMappingURL=Check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Check.js","sourceRoot":"","sources":["../../src/lib/icons/Check.tsx"],"names":[],"mappings":";AACA,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,KAA8B,EAAe,EAAE,CAAC,CACxE,cACE,KAAK,EAAC,4BAA4B,EAClC,KAAK,EAAE,EAAE,EACT,MAAM,EAAE,EAAE,EACV,IAAI,EAAC,MAAM,KACP,KAAK,YAET,eACE,IAAI,EAAC,SAAS,EACd,CAAC,EAAC,iFAAiF,GACnF,GACE,CACP,CAAA"}
@@ -0,0 +1,2 @@
1
+ import type { SVGProps } from 'react';
2
+ export declare const ExclamationCircleOutlineIcon: (props: SVGProps<SVGSVGElement>) => JSX.Element;
@@ -0,0 +1,5 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ export const ExclamationCircleOutlineIcon = (props) => (_jsxs("svg", { xmlns: 'http://www.w3.org/2000/svg', width: 24, height: 25, fill: 'none', ...props, children: [_jsx("mask", { id: 'exclamation-circle-outline_svg__a', width: 24, height: 25, x: 0, y: 0, maskUnits: 'userSpaceOnUse', style: {
3
+ maskType: 'alpha',
4
+ }, children: _jsx("path", { fill: '#D9D9D9', d: 'M0 .018h24v24H0z' }) }), _jsx("g", { mask: 'url(#exclamation-circle-outline_svg__a)', children: _jsx("path", { fill: '#E36857', d: 'M12 17.018a.968.968 0 0 0 .713-.288.967.967 0 0 0 .287-.712.97.97 0 0 0-.287-.713.97.97 0 0 0-.713-.287.967.967 0 0 0-.712.287.968.968 0 0 0-.288.713c0 .283.096.52.288.712a.965.965 0 0 0 .712.288Zm-1-4h2v-6h-2v6Zm1 9a9.733 9.733 0 0 1-3.9-.788 10.092 10.092 0 0 1-3.175-2.137c-.9-.9-1.612-1.959-2.137-3.175a9.733 9.733 0 0 1-.788-3.9c0-1.384.263-2.684.788-3.9a10.092 10.092 0 0 1 2.137-3.175c.9-.9 1.958-1.613 3.175-2.138a9.743 9.743 0 0 1 3.9-.787c1.383 0 2.683.262 3.9.787a10.105 10.105 0 0 1 3.175 2.138c.9.9 1.612 1.958 2.137 3.175a9.733 9.733 0 0 1 .788 3.9 9.733 9.733 0 0 1-.788 3.9 10.093 10.093 0 0 1-2.137 3.175c-.9.9-1.958 1.612-3.175 2.137a9.733 9.733 0 0 1-3.9.788Zm0-2c2.233 0 4.125-.775 5.675-2.325C19.225 16.143 20 14.25 20 12.018c0-2.234-.775-4.125-2.325-5.675-1.55-1.55-3.442-2.325-5.675-2.325-2.233 0-4.125.775-5.675 2.325C4.775 7.893 4 9.784 4 12.018c0 2.233.775 4.125 2.325 5.675 1.55 1.55 3.442 2.325 5.675 2.325Z' }) })] }));
5
+ //# sourceMappingURL=ExclamationCircleOutline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExclamationCircleOutline.js","sourceRoot":"","sources":["../../src/lib/icons/ExclamationCircleOutline.tsx"],"names":[],"mappings":";AACA,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAC1C,KAA8B,EACjB,EAAE,CAAC,CAChB,eACE,KAAK,EAAC,4BAA4B,EAClC,KAAK,EAAE,EAAE,EACT,MAAM,EAAE,EAAE,EACV,IAAI,EAAC,MAAM,KACP,KAAK,aAET,eACE,EAAE,EAAC,mCAAmC,EACtC,KAAK,EAAE,EAAE,EACT,MAAM,EAAE,EAAE,EACV,CAAC,EAAE,CAAC,EACJ,CAAC,EAAE,CAAC,EACJ,SAAS,EAAC,gBAAgB,EAC1B,KAAK,EAAE;gBACL,QAAQ,EAAE,OAAO;aAClB,YAED,eAAM,IAAI,EAAC,SAAS,EAAC,CAAC,EAAC,kBAAkB,GAAG,GACvC,EACP,YAAG,IAAI,EAAC,yCAAyC,YAC/C,eACE,IAAI,EAAC,SAAS,EACd,CAAC,EAAC,y6BAAy6B,GAC36B,GACA,IACA,CACP,CAAA"}
@@ -0,0 +1,9 @@
1
+ import type { UseDevicesData } from '../../../lib/seam/devices/use-devices.js';
2
+ export type DeviceFilter = 'device_issues';
3
+ interface DeviceHealthBarProps {
4
+ devices: Array<UseDevicesData[number]>;
5
+ filter: DeviceFilter | null;
6
+ onFilterSelect: (filter: DeviceFilter | null) => void;
7
+ }
8
+ export declare function DeviceHealthBar({ devices, filter, onFilterSelect, }: DeviceHealthBarProps): import("react/jsx-runtime").JSX.Element;
9
+ export {};
@@ -0,0 +1,29 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { CheckIcon } from '../../../lib/icons/Check.js';
3
+ import { ExclamationCircleOutlineIcon } from '../../../lib/icons/ExclamationCircleOutline.js';
4
+ import { TableFilterBar } from '../../../lib/ui/Table/TableFilterBar/TableFilterBar.js';
5
+ import { TableFilterItem } from '../../../lib/ui/Table/TableFilterBar/TableFilterItem.js';
6
+ export function DeviceHealthBar({ devices, filter, onFilterSelect, }) {
7
+ const erroredDevices = devices.filter((device) => device.errors.length > 0);
8
+ const issueCount = erroredDevices.length;
9
+ const toggle = (target) => () => {
10
+ const newFilter = target === filter ? null : target;
11
+ onFilterSelect(newFilter);
12
+ };
13
+ const isPlural = issueCount === 0 || issueCount > 1;
14
+ const label = isPlural
15
+ ? `${issueCount} ${t.deviceIssues}`
16
+ : `${issueCount} ${t.deviceIssue}`;
17
+ if (issueCount === 0) {
18
+ return (_jsx(TableFilterBar, { children: _jsxs(TableFilterItem, { children: [_jsx(CheckIcon, {}), t.devicesOk] }) }));
19
+ }
20
+ return (_jsx(TableFilterBar, { isFilterCleared: filter == null, onFilterClear: () => {
21
+ onFilterSelect(null);
22
+ }, children: _jsxs(TableFilterItem, { onClick: toggle('device_issues'), selected: filter === 'device_issues', children: [_jsx(ExclamationCircleOutlineIcon, {}), label] }) }));
23
+ }
24
+ const t = {
25
+ devicesOk: 'Devices OK',
26
+ deviceIssue: 'device issue',
27
+ deviceIssues: 'device issues',
28
+ };
29
+ //# sourceMappingURL=DeviceHealthBar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DeviceHealthBar.js","sourceRoot":"","sources":["../../../src/lib/ui/DeviceTable/DeviceHealthBar.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAC9C,OAAO,EAAE,4BAA4B,EAAE,MAAM,uCAAuC,CAAA;AAEpF,OAAO,EAAE,cAAc,EAAE,MAAM,+CAA+C,CAAA;AAC9E,OAAO,EAAE,eAAe,EAAE,MAAM,gDAAgD,CAAA;AAUhF,MAAM,UAAU,eAAe,CAAC,EAC9B,OAAO,EACP,MAAM,EACN,cAAc,GACO;IACrB,MAAM,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;IAC3E,MAAM,UAAU,GAAG,cAAc,CAAC,MAAM,CAAA;IAExC,MAAM,MAAM,GAAG,CAAC,MAAoB,EAAE,EAAE,CAAC,GAAG,EAAE;QAC5C,MAAM,SAAS,GAAG,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAA;QACnD,cAAc,CAAC,SAAS,CAAC,CAAA;IAC3B,CAAC,CAAA;IAED,MAAM,QAAQ,GAAG,UAAU,KAAK,CAAC,IAAI,UAAU,GAAG,CAAC,CAAA;IACnD,MAAM,KAAK,GAAG,QAAQ;QACpB,CAAC,CAAC,GAAG,UAAU,IAAI,CAAC,CAAC,YAAY,EAAE;QACnC,CAAC,CAAC,GAAG,UAAU,IAAI,CAAC,CAAC,WAAW,EAAE,CAAA;IAEpC,IAAI,UAAU,KAAK,CAAC,EAAE;QACpB,OAAO,CACL,KAAC,cAAc,cACb,MAAC,eAAe,eACd,KAAC,SAAS,KAAG,EACZ,CAAC,CAAC,SAAS,IACI,GACH,CAClB,CAAA;KACF;IAED,OAAO,CACL,KAAC,cAAc,IACb,eAAe,EAAE,MAAM,IAAI,IAAI,EAC/B,aAAa,EAAE,GAAG,EAAE;YAClB,cAAc,CAAC,IAAI,CAAC,CAAA;QACtB,CAAC,YAED,MAAC,eAAe,IACd,OAAO,EAAE,MAAM,CAAC,eAAe,CAAC,EAChC,QAAQ,EAAE,MAAM,KAAK,eAAe,aAEpC,KAAC,4BAA4B,KAAG,EAC/B,KAAK,IACU,GACH,CAClB,CAAA;AACH,CAAC;AAED,MAAM,CAAC,GAAG;IACR,SAAS,EAAE,YAAY;IACvB,WAAW,EAAE,cAAc;IAC3B,YAAY,EAAE,eAAe;CAC9B,CAAA"}
@@ -0,0 +1,11 @@
1
+ import { type UseDevicesData, type UseDevicesParams } from '../../../lib/seam/devices/use-devices.js';
2
+ export type DeviceTableProps = Props & UseDevicesParams;
3
+ interface Props {
4
+ onBack?: () => void;
5
+ }
6
+ export interface DeviceRowProps {
7
+ device: UseDevicesData[number];
8
+ onClick: () => void;
9
+ }
10
+ export declare function DeviceRow({ device, onClick, }: DeviceRowProps): JSX.Element | null;
11
+ export {};
@@ -0,0 +1,24 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { isLockDevice } from '../../../lib/seam/devices/types.js';
3
+ import {} from '../../../lib/seam/devices/use-devices.js';
4
+ import { BatteryStatus } from '../../../lib/ui/device/BatteryStatus.js';
5
+ import { DeviceImage } from '../../../lib/ui/device/DeviceImage.js';
6
+ import { LockStatus } from '../../../lib/ui/device/LockStatus.js';
7
+ import { OnlineStatus } from '../../../lib/ui/device/OnlineStatus.js';
8
+ import { getDeviceModel } from '../../../lib/ui/DeviceDetails/DeviceModel.js';
9
+ import { TableCell } from '../../../lib/ui/Table/TableCell.js';
10
+ import { TableRow } from '../../../lib/ui/Table/TableRow.js';
11
+ import { Title } from '../../../lib/ui/typography/Title.js';
12
+ export function DeviceRow({ device, onClick, }) {
13
+ if (!isLockDevice(device)) {
14
+ return null;
15
+ }
16
+ const deviceModel = getDeviceModel(device) ?? t.unknownLock;
17
+ return (_jsxs(TableRow, { onClick: onClick, children: [_jsx(TableCell, { className: 'seam-image-cell', children: _jsx(DeviceImage, { device: device }) }), _jsxs(TableCell, { className: 'seam-body-cell', children: [_jsx(Title, { children: device.properties.name }), _jsxs("div", { className: 'seam-bottom', children: [_jsx("span", { className: 'seam-device-model', children: deviceModel }), _jsxs("div", { className: 'seam-device-statuses', children: [_jsx(OnlineStatus, { device: device }), _jsx(BatteryStatus, { device: device }), _jsx(LockStatus, { device: device })] })] })] })] }, device.device_id));
18
+ }
19
+ const t = {
20
+ devices: 'Devices',
21
+ unknownLock: 'Unknown Lock',
22
+ noDevicesMessage: 'Sorry, no devices were found',
23
+ };
24
+ //# sourceMappingURL=DeviceRow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DeviceRow.js","sourceRoot":"","sources":["../../../src/lib/ui/DeviceTable/DeviceRow.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AACxD,OAAO,EAGN,MAAM,iCAAiC,CAAA;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAA;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAA;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAA;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAA;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAA;AACpE,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAA;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAA;AACnD,OAAO,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAA;AAalD,MAAM,UAAU,SAAS,CAAC,EACxB,MAAM,EACN,OAAO,GACQ;IACf,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE;QACzB,OAAO,IAAI,CAAA;KACZ;IAED,MAAM,WAAW,GAAG,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,WAAW,CAAA;IAE3D,OAAO,CACL,MAAC,QAAQ,IAAwB,OAAO,EAAE,OAAO,aAC/C,KAAC,SAAS,IAAC,SAAS,EAAC,iBAAiB,YACpC,KAAC,WAAW,IAAC,MAAM,EAAE,MAAM,GAAI,GACrB,EACZ,MAAC,SAAS,IAAC,SAAS,EAAC,gBAAgB,aACnC,KAAC,KAAK,cAAE,MAAM,CAAC,UAAU,CAAC,IAAI,GAAS,EACvC,eAAK,SAAS,EAAC,aAAa,aAC1B,eAAM,SAAS,EAAC,mBAAmB,YAAE,WAAW,GAAQ,EACxD,eAAK,SAAS,EAAC,sBAAsB,aACnC,KAAC,YAAY,IAAC,MAAM,EAAE,MAAM,GAAI,EAChC,KAAC,aAAa,IAAC,MAAM,EAAE,MAAM,GAAI,EACjC,KAAC,UAAU,IAAC,MAAM,EAAE,MAAM,GAAI,IAC1B,IACF,IACI,KAdC,MAAM,CAAC,SAAS,CAepB,CACZ,CAAA;AACH,CAAC;AAED,MAAM,CAAC,GAAG;IACR,OAAO,EAAE,SAAS;IAClB,WAAW,EAAE,cAAc;IAC3B,gBAAgB,EAAE,8BAA8B;CACjD,CAAA"}
@@ -1,22 +1,15 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
2
  import { useState } from 'react';
3
- import { isLockDevice } from '../../../lib/seam/devices/types.js';
4
3
  import { useDevices, } from '../../../lib/seam/devices/use-devices.js';
5
- import { BatteryStatus } from '../../../lib/ui/device/BatteryStatus.js';
6
- import { DeviceImage } from '../../../lib/ui/device/DeviceImage.js';
7
- import { LockStatus } from '../../../lib/ui/device/LockStatus.js';
8
- import { OnlineStatus } from '../../../lib/ui/device/OnlineStatus.js';
9
4
  import { DeviceDetails } from '../../../lib/ui/DeviceDetails/DeviceDetails.js';
10
- import { getDeviceModel } from '../../../lib/ui/DeviceDetails/DeviceModel.js';
5
+ import { DeviceHealthBar, } from '../../../lib/ui/DeviceTable/DeviceHealthBar.js';
6
+ import { DeviceRow } from '../../../lib/ui/DeviceTable/DeviceRow.js';
11
7
  import { ContentHeader } from '../../../lib/ui/layout/ContentHeader.js';
12
8
  import { EmptyPlaceholder } from '../../../lib/ui/Table/EmptyPlaceholder.js';
13
9
  import { TableBody } from '../../../lib/ui/Table/TableBody.js';
14
- import { TableCell } from '../../../lib/ui/Table/TableCell.js';
15
10
  import { TableHeader } from '../../../lib/ui/Table/TableHeader.js';
16
- import { TableRow } from '../../../lib/ui/Table/TableRow.js';
17
11
  import { TableTitle } from '../../../lib/ui/Table/TableTitle.js';
18
12
  import { Caption } from '../../../lib/ui/typography/Caption.js';
19
- import { Title } from '../../../lib/ui/typography/Title.js';
20
13
  export function DeviceTable({ onBack, ...props }) {
21
14
  const { devices, isLoading, isError, error } = useDevices(props);
22
15
  const [selectedDeviceId, selectDevice] = useState(null);
@@ -39,20 +32,22 @@ export function DeviceTable({ onBack, ...props }) {
39
32
  }
40
33
  function Body(props) {
41
34
  const { devices, selectDevice } = props;
35
+ const [filter, setFilter] = useState(null);
42
36
  if (devices.length === 0) {
43
37
  return _jsx(EmptyPlaceholder, { children: t.noDevicesMessage });
44
38
  }
45
- return (_jsx(_Fragment, { children: devices.map((device) => (_jsx(DeviceRow, { device: device, onClick: () => {
46
- selectDevice(device.device_id);
47
- } }, device.device_id))) }));
48
- }
49
- function DeviceRow(props) {
50
- const { device, onClick } = props;
51
- if (!isLockDevice(device)) {
52
- return null;
53
- }
54
- const deviceModel = getDeviceModel(device) ?? t.unknownLock;
55
- return (_jsxs(TableRow, { onClick: onClick, children: [_jsx(TableCell, { className: 'seam-image-cell', children: _jsx(DeviceImage, { device: device }) }), _jsxs(TableCell, { className: 'seam-body-cell', children: [_jsx(Title, { children: device.properties.name }), _jsxs("div", { className: 'seam-bottom', children: [_jsx("span", { className: 'seam-device-model', children: deviceModel }), _jsxs("div", { className: 'seam-device-statuses', children: [_jsx(OnlineStatus, { device: device }), _jsx(BatteryStatus, { device: device }), _jsx(LockStatus, { device: device })] })] })] })] }, device.device_id));
39
+ const filteredDevices = devices.filter((device) => {
40
+ if (filter === null) {
41
+ return true;
42
+ }
43
+ if (filter === 'device_issues') {
44
+ return device.errors.length > 0;
45
+ }
46
+ return true;
47
+ });
48
+ return (_jsxs(_Fragment, { children: [_jsx(DeviceHealthBar, { devices: devices, filter: filter, onFilterSelect: setFilter }), filteredDevices.map((device) => (_jsx(DeviceRow, { device: device, onClick: () => {
49
+ selectDevice(device.device_id);
50
+ } }, device.device_id)))] }));
56
51
  }
57
52
  const t = {
58
53
  devices: 'Devices',
@@ -1 +1 @@
1
- {"version":3,"file":"DeviceTable.js","sourceRoot":"","sources":["../../../src/lib/ui/DeviceTable/DeviceTable.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"DeviceTable.js","sourceRoot":"","sources":["../../../src/lib/ui/DeviceTable/DeviceTable.tsx"],"names":[],"mappings":"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"}
@@ -1,2 +1,2 @@
1
1
  import type { ButtonProps } from '../../lib/ui/types.js';
2
- export declare function IconButton(props: ButtonProps): JSX.Element;
2
+ export declare function IconButton({ className, ...props }: ButtonProps): JSX.Element;
@@ -1,5 +1,6 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
- export function IconButton(props) {
3
- return _jsx("button", { ...props, className: 'seam-icon-btn' });
2
+ import classNames from 'classnames';
3
+ export function IconButton({ className, ...props }) {
4
+ return (_jsx("button", { ...props, className: classNames('seam-icon-btn', className) }));
4
5
  }
5
6
  //# sourceMappingURL=IconButton.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"IconButton.js","sourceRoot":"","sources":["../../src/lib/ui/IconButton.tsx"],"names":[],"mappings":";AAEA,MAAM,UAAU,UAAU,CAAC,KAAkB;IAC3C,OAAO,oBAAY,KAAK,EAAE,SAAS,EAAC,eAAe,GAAG,CAAA;AACxD,CAAC"}
1
+ {"version":3,"file":"IconButton.js","sourceRoot":"","sources":["../../src/lib/ui/IconButton.tsx"],"names":[],"mappings":";AAAA,OAAO,UAAU,MAAM,YAAY,CAAA;AAInC,MAAM,UAAU,UAAU,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAe;IAC7D,OAAO,CACL,oBAAY,KAAK,EAAE,SAAS,EAAE,UAAU,CAAC,eAAe,EAAE,SAAS,CAAC,GAAI,CACzE,CAAA;AACH,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { DivProps } from '../../../../lib/ui/types.js';
2
+ export interface TableFiltersProps extends DivProps {
3
+ isFilterCleared?: boolean;
4
+ onFilterClear?: () => void;
5
+ }
6
+ export declare function TableFilterBar({ isFilterCleared, onFilterClear, children, ...props }: TableFiltersProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,11 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { ArrowRestartIcon } from '../../../../lib/icons/ArrowRestart.js';
3
+ import { IconButton } from '../../../../lib/ui/IconButton.js';
4
+ export function TableFilterBar({ isFilterCleared, onFilterClear, children, ...props }) {
5
+ const showClearFilterButton = isFilterCleared === false;
6
+ return (_jsxs("div", { className: 'seam-table-filter-bar', ...props, children: [children, ' ', showClearFilterButton && _jsx(ClearFiltersButton, { onClick: onFilterClear })] }));
7
+ }
8
+ function ClearFiltersButton(props) {
9
+ return (_jsx(IconButton, { ...props, className: 'seam-clear-filters-button', children: _jsx(ArrowRestartIcon, {}) }));
10
+ }
11
+ //# sourceMappingURL=TableFilterBar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TableFilterBar.js","sourceRoot":"","sources":["../../../../src/lib/ui/Table/TableFilterBar/TableFilterBar.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAA;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAQjD,MAAM,UAAU,cAAc,CAAC,EAC7B,eAAe,EACf,aAAa,EACb,QAAQ,EACR,GAAG,KAAK,EACU;IAClB,MAAM,qBAAqB,GAAG,eAAe,KAAK,KAAK,CAAA;IACvD,OAAO,CACL,eAAK,SAAS,EAAC,uBAAuB,KAAK,KAAK,aAC7C,QAAQ,EAAE,GAAG,EACb,qBAAqB,IAAI,KAAC,kBAAkB,IAAC,OAAO,EAAE,aAAa,GAAI,IACpE,CACP,CAAA;AACH,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAkB;IAC5C,OAAO,CACL,KAAC,UAAU,OAAK,KAAK,EAAE,SAAS,EAAC,2BAA2B,YAC1D,KAAC,gBAAgB,KAAG,GACT,CACd,CAAA;AACH,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { DivProps } from '../../../../lib/ui/types.js';
2
+ export interface TableFilterItemProps extends DivProps {
3
+ selected?: boolean;
4
+ }
5
+ export declare function TableFilterItem({ onClick, selected, ...props }: TableFilterItemProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,9 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import classNames from 'classnames';
3
+ export function TableFilterItem({ onClick, selected, ...props }) {
4
+ return (_jsx("div", { onClick: onClick, className: classNames('seam-table-filter-item', {
5
+ 'seam-clickable': onClick !== undefined,
6
+ 'seam-selected': selected,
7
+ }), ...props }));
8
+ }
9
+ //# sourceMappingURL=TableFilterItem.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TableFilterItem.js","sourceRoot":"","sources":["../../../../src/lib/ui/Table/TableFilterBar/TableFilterItem.tsx"],"names":[],"mappings":";AAAA,OAAO,UAAU,MAAM,YAAY,CAAA;AAQnC,MAAM,UAAU,eAAe,CAAC,EAC9B,OAAO,EACP,QAAQ,EACR,GAAG,KAAK,EACa;IACrB,OAAO,CACL,cACE,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,UAAU,CAAC,wBAAwB,EAAE;YAC9C,gBAAgB,EAAE,OAAO,KAAK,SAAS;YACvC,eAAe,EAAE,QAAQ;SAC1B,CAAC,KACE,KAAK,GACT,CACH,CAAA;AACH,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@seamapi/react",
3
- "version": "0.24.0",
3
+ "version": "0.25.0",
4
4
  "description": "Seam React component library.",
5
5
  "type": "module",
6
6
  "main": "index.js",
@@ -0,0 +1,32 @@
1
+ import type { SVGProps } from 'react'
2
+ export const ArrowRestartIcon = (
3
+ props: SVGProps<SVGSVGElement>
4
+ ): JSX.Element => (
5
+ <svg
6
+ xmlns='http://www.w3.org/2000/svg'
7
+ width={24}
8
+ height={24}
9
+ fill='none'
10
+ {...props}
11
+ >
12
+ <mask
13
+ id='arrow-restart_svg__a'
14
+ width={24}
15
+ height={24}
16
+ x={0}
17
+ y={0}
18
+ maskUnits='userSpaceOnUse'
19
+ style={{
20
+ maskType: 'alpha',
21
+ }}
22
+ >
23
+ <path fill='#D9D9D9' d='M0 0h24v24H0z' />
24
+ </mask>
25
+ <g mask='url(#arrow-restart_svg__a)'>
26
+ <path
27
+ fill='#232B3A'
28
+ d='M12 20c2.233 0 4.125-.775 5.675-2.325C19.225 16.125 20 14.233 20 12c0-2.233-.775-4.125-2.325-5.675C16.125 4.775 14.233 4 12 4c-1.15 0-2.25.238-3.3.713A7.617 7.617 0 0 0 6 6.75V4H4v7h7V9H6.8a5.838 5.838 0 0 1 2.187-2.2A5.93 5.93 0 0 1 12 6c1.667 0 3.083.583 4.25 1.75C17.417 8.917 18 10.333 18 12c0 1.667-.583 3.083-1.75 4.25C15.083 17.417 13.667 18 12 18a5.863 5.863 0 0 1-3.475-1.1A5.809 5.809 0 0 1 6.35 14h-2.1c.467 1.767 1.417 3.208 2.85 4.325S10.167 20 12 20Z'
29
+ />
30
+ </g>
31
+ </svg>
32
+ )
@@ -0,0 +1,15 @@
1
+ import type { SVGProps } from 'react'
2
+ export const CheckIcon = (props: SVGProps<SVGSVGElement>): JSX.Element => (
3
+ <svg
4
+ xmlns='http://www.w3.org/2000/svg'
5
+ width={25}
6
+ height={24}
7
+ fill='none'
8
+ {...props}
9
+ >
10
+ <path
11
+ fill='#27AE60'
12
+ d='m9.5 15.73-3.936-4.038-1.895 1.872L9.5 19.476l12.765-12.92-1.82-1.87L9.5 15.73Z'
13
+ />
14
+ </svg>
15
+ )
@@ -0,0 +1,32 @@
1
+ import type { SVGProps } from 'react'
2
+ export const ExclamationCircleOutlineIcon = (
3
+ props: SVGProps<SVGSVGElement>
4
+ ): JSX.Element => (
5
+ <svg
6
+ xmlns='http://www.w3.org/2000/svg'
7
+ width={24}
8
+ height={25}
9
+ fill='none'
10
+ {...props}
11
+ >
12
+ <mask
13
+ id='exclamation-circle-outline_svg__a'
14
+ width={24}
15
+ height={25}
16
+ x={0}
17
+ y={0}
18
+ maskUnits='userSpaceOnUse'
19
+ style={{
20
+ maskType: 'alpha',
21
+ }}
22
+ >
23
+ <path fill='#D9D9D9' d='M0 .018h24v24H0z' />
24
+ </mask>
25
+ <g mask='url(#exclamation-circle-outline_svg__a)'>
26
+ <path
27
+ fill='#E36857'
28
+ d='M12 17.018a.968.968 0 0 0 .713-.288.967.967 0 0 0 .287-.712.97.97 0 0 0-.287-.713.97.97 0 0 0-.713-.287.967.967 0 0 0-.712.287.968.968 0 0 0-.288.713c0 .283.096.52.288.712a.965.965 0 0 0 .712.288Zm-1-4h2v-6h-2v6Zm1 9a9.733 9.733 0 0 1-3.9-.788 10.092 10.092 0 0 1-3.175-2.137c-.9-.9-1.612-1.959-2.137-3.175a9.733 9.733 0 0 1-.788-3.9c0-1.384.263-2.684.788-3.9a10.092 10.092 0 0 1 2.137-3.175c.9-.9 1.958-1.613 3.175-2.138a9.743 9.743 0 0 1 3.9-.787c1.383 0 2.683.262 3.9.787a10.105 10.105 0 0 1 3.175 2.138c.9.9 1.612 1.958 2.137 3.175a9.733 9.733 0 0 1 .788 3.9 9.733 9.733 0 0 1-.788 3.9 10.093 10.093 0 0 1-2.137 3.175c-.9.9-1.958 1.612-3.175 2.137a9.733 9.733 0 0 1-3.9.788Zm0-2c2.233 0 4.125-.775 5.675-2.325C19.225 16.143 20 14.25 20 12.018c0-2.234-.775-4.125-2.325-5.675-1.55-1.55-3.442-2.325-5.675-2.325-2.233 0-4.125.775-5.675 2.325C4.775 7.893 4 9.784 4 12.018c0 2.233.775 4.125 2.325 5.675 1.55 1.55 3.442 2.325 5.675 2.325Z'
29
+ />
30
+ </g>
31
+ </svg>
32
+ )
@@ -0,0 +1,66 @@
1
+ import { CheckIcon } from 'lib/icons/Check.js'
2
+ import { ExclamationCircleOutlineIcon } from 'lib/icons/ExclamationCircleOutline.js'
3
+ import type { UseDevicesData } from 'lib/seam/devices/use-devices.js'
4
+ import { TableFilterBar } from 'lib/ui/Table/TableFilterBar/TableFilterBar.js'
5
+ import { TableFilterItem } from 'lib/ui/Table/TableFilterBar/TableFilterItem.js'
6
+
7
+ export type DeviceFilter = 'device_issues'
8
+
9
+ interface DeviceHealthBarProps {
10
+ devices: Array<UseDevicesData[number]>
11
+ filter: DeviceFilter | null
12
+ onFilterSelect: (filter: DeviceFilter | null) => void
13
+ }
14
+
15
+ export function DeviceHealthBar({
16
+ devices,
17
+ filter,
18
+ onFilterSelect,
19
+ }: DeviceHealthBarProps) {
20
+ const erroredDevices = devices.filter((device) => device.errors.length > 0)
21
+ const issueCount = erroredDevices.length
22
+
23
+ const toggle = (target: DeviceFilter) => () => {
24
+ const newFilter = target === filter ? null : target
25
+ onFilterSelect(newFilter)
26
+ }
27
+
28
+ const isPlural = issueCount === 0 || issueCount > 1
29
+ const label = isPlural
30
+ ? `${issueCount} ${t.deviceIssues}`
31
+ : `${issueCount} ${t.deviceIssue}`
32
+
33
+ if (issueCount === 0) {
34
+ return (
35
+ <TableFilterBar>
36
+ <TableFilterItem>
37
+ <CheckIcon />
38
+ {t.devicesOk}
39
+ </TableFilterItem>
40
+ </TableFilterBar>
41
+ )
42
+ }
43
+
44
+ return (
45
+ <TableFilterBar
46
+ isFilterCleared={filter == null}
47
+ onFilterClear={() => {
48
+ onFilterSelect(null)
49
+ }}
50
+ >
51
+ <TableFilterItem
52
+ onClick={toggle('device_issues')}
53
+ selected={filter === 'device_issues'}
54
+ >
55
+ <ExclamationCircleOutlineIcon />
56
+ {label}
57
+ </TableFilterItem>
58
+ </TableFilterBar>
59
+ )
60
+ }
61
+
62
+ const t = {
63
+ devicesOk: 'Devices OK',
64
+ deviceIssue: 'device issue',
65
+ deviceIssues: 'device issues',
66
+ }
@@ -0,0 +1,60 @@
1
+ import { isLockDevice } from 'lib/seam/devices/types.js'
2
+ import {
3
+ type UseDevicesData,
4
+ type UseDevicesParams,
5
+ } from 'lib/seam/devices/use-devices.js'
6
+ import { BatteryStatus } from 'lib/ui/device/BatteryStatus.js'
7
+ import { DeviceImage } from 'lib/ui/device/DeviceImage.js'
8
+ import { LockStatus } from 'lib/ui/device/LockStatus.js'
9
+ import { OnlineStatus } from 'lib/ui/device/OnlineStatus.js'
10
+ import { getDeviceModel } from 'lib/ui/DeviceDetails/DeviceModel.js'
11
+ import { TableCell } from 'lib/ui/Table/TableCell.js'
12
+ import { TableRow } from 'lib/ui/Table/TableRow.js'
13
+ import { Title } from 'lib/ui/typography/Title.js'
14
+
15
+ export type DeviceTableProps = Props & UseDevicesParams
16
+
17
+ interface Props {
18
+ onBack?: () => void
19
+ }
20
+
21
+ export interface DeviceRowProps {
22
+ device: UseDevicesData[number]
23
+ onClick: () => void
24
+ }
25
+
26
+ export function DeviceRow({
27
+ device,
28
+ onClick,
29
+ }: DeviceRowProps): JSX.Element | null {
30
+ if (!isLockDevice(device)) {
31
+ return null
32
+ }
33
+
34
+ const deviceModel = getDeviceModel(device) ?? t.unknownLock
35
+
36
+ return (
37
+ <TableRow key={device.device_id} onClick={onClick}>
38
+ <TableCell className='seam-image-cell'>
39
+ <DeviceImage device={device} />
40
+ </TableCell>
41
+ <TableCell className='seam-body-cell'>
42
+ <Title>{device.properties.name}</Title>
43
+ <div className='seam-bottom'>
44
+ <span className='seam-device-model'>{deviceModel}</span>
45
+ <div className='seam-device-statuses'>
46
+ <OnlineStatus device={device} />
47
+ <BatteryStatus device={device} />
48
+ <LockStatus device={device} />
49
+ </div>
50
+ </div>
51
+ </TableCell>
52
+ </TableRow>
53
+ )
54
+ }
55
+
56
+ const t = {
57
+ devices: 'Devices',
58
+ unknownLock: 'Unknown Lock',
59
+ noDevicesMessage: 'Sorry, no devices were found',
60
+ }
@@ -1,26 +1,22 @@
1
1
  import { useState } from 'react'
2
2
 
3
- import { isLockDevice } from 'lib/seam/devices/types.js'
4
3
  import {
5
4
  useDevices,
6
5
  type UseDevicesData,
7
6
  type UseDevicesParams,
8
7
  } from 'lib/seam/devices/use-devices.js'
9
- import { BatteryStatus } from 'lib/ui/device/BatteryStatus.js'
10
- import { DeviceImage } from 'lib/ui/device/DeviceImage.js'
11
- import { LockStatus } from 'lib/ui/device/LockStatus.js'
12
- import { OnlineStatus } from 'lib/ui/device/OnlineStatus.js'
13
8
  import { DeviceDetails } from 'lib/ui/DeviceDetails/DeviceDetails.js'
14
- import { getDeviceModel } from 'lib/ui/DeviceDetails/DeviceModel.js'
9
+ import {
10
+ type DeviceFilter,
11
+ DeviceHealthBar,
12
+ } from 'lib/ui/DeviceTable/DeviceHealthBar.js'
13
+ import { DeviceRow } from 'lib/ui/DeviceTable/DeviceRow.js'
15
14
  import { ContentHeader } from 'lib/ui/layout/ContentHeader.js'
16
15
  import { EmptyPlaceholder } from 'lib/ui/Table/EmptyPlaceholder.js'
17
16
  import { TableBody } from 'lib/ui/Table/TableBody.js'
18
- import { TableCell } from 'lib/ui/Table/TableCell.js'
19
17
  import { TableHeader } from 'lib/ui/Table/TableHeader.js'
20
- import { TableRow } from 'lib/ui/Table/TableRow.js'
21
18
  import { TableTitle } from 'lib/ui/Table/TableTitle.js'
22
19
  import { Caption } from 'lib/ui/typography/Caption.js'
23
- import { Title } from 'lib/ui/typography/Title.js'
24
20
 
25
21
  export type DeviceTableProps = Props & UseDevicesParams
26
22
 
@@ -81,14 +77,32 @@ function Body(props: {
81
77
  selectDevice: (id: string) => void
82
78
  }) {
83
79
  const { devices, selectDevice } = props
80
+ const [filter, setFilter] = useState<DeviceFilter | null>(null)
84
81
 
85
82
  if (devices.length === 0) {
86
83
  return <EmptyPlaceholder>{t.noDevicesMessage}</EmptyPlaceholder>
87
84
  }
88
85
 
86
+ const filteredDevices = devices.filter((device) => {
87
+ if (filter === null) {
88
+ return true
89
+ }
90
+
91
+ if (filter === 'device_issues') {
92
+ return device.errors.length > 0
93
+ }
94
+
95
+ return true
96
+ })
97
+
89
98
  return (
90
99
  <>
91
- {devices.map((device) => (
100
+ <DeviceHealthBar
101
+ devices={devices}
102
+ filter={filter}
103
+ onFilterSelect={setFilter}
104
+ />
105
+ {filteredDevices.map((device) => (
92
106
  <DeviceRow
93
107
  device={device}
94
108
  key={device.device_id}
@@ -101,38 +115,6 @@ function Body(props: {
101
115
  )
102
116
  }
103
117
 
104
- function DeviceRow(props: {
105
- device: UseDevicesData[number]
106
- onClick: () => void
107
- }): JSX.Element | null {
108
- const { device, onClick } = props
109
-
110
- if (!isLockDevice(device)) {
111
- return null
112
- }
113
-
114
- const deviceModel = getDeviceModel(device) ?? t.unknownLock
115
-
116
- return (
117
- <TableRow key={device.device_id} onClick={onClick}>
118
- <TableCell className='seam-image-cell'>
119
- <DeviceImage device={device} />
120
- </TableCell>
121
- <TableCell className='seam-body-cell'>
122
- <Title>{device.properties.name}</Title>
123
- <div className='seam-bottom'>
124
- <span className='seam-device-model'>{deviceModel}</span>
125
- <div className='seam-device-statuses'>
126
- <OnlineStatus device={device} />
127
- <BatteryStatus device={device} />
128
- <LockStatus device={device} />
129
- </div>
130
- </div>
131
- </TableCell>
132
- </TableRow>
133
- )
134
- }
135
-
136
118
  const t = {
137
119
  devices: 'Devices',
138
120
  unknownLock: 'Unknown Lock',
@@ -1,5 +1,9 @@
1
+ import classNames from 'classnames'
2
+
1
3
  import type { ButtonProps } from 'lib/ui/types.js'
2
4
 
3
- export function IconButton(props: ButtonProps): JSX.Element {
4
- return <button {...props} className='seam-icon-btn' />
5
+ export function IconButton({ className, ...props }: ButtonProps): JSX.Element {
6
+ return (
7
+ <button {...props} className={classNames('seam-icon-btn', className)} />
8
+ )
5
9
  }
@@ -0,0 +1,31 @@
1
+ import { ArrowRestartIcon } from 'lib/icons/ArrowRestart.js'
2
+ import { IconButton } from 'lib/ui/IconButton.js'
3
+ import type { ButtonProps, DivProps } from 'lib/ui/types.js'
4
+
5
+ export interface TableFiltersProps extends DivProps {
6
+ isFilterCleared?: boolean
7
+ onFilterClear?: () => void
8
+ }
9
+
10
+ export function TableFilterBar({
11
+ isFilterCleared,
12
+ onFilterClear,
13
+ children,
14
+ ...props
15
+ }: TableFiltersProps) {
16
+ const showClearFilterButton = isFilterCleared === false
17
+ return (
18
+ <div className='seam-table-filter-bar' {...props}>
19
+ {children}{' '}
20
+ {showClearFilterButton && <ClearFiltersButton onClick={onFilterClear} />}
21
+ </div>
22
+ )
23
+ }
24
+
25
+ function ClearFiltersButton(props: ButtonProps) {
26
+ return (
27
+ <IconButton {...props} className='seam-clear-filters-button'>
28
+ <ArrowRestartIcon />
29
+ </IconButton>
30
+ )
31
+ }
@@ -0,0 +1,24 @@
1
+ import classNames from 'classnames'
2
+
3
+ import type { DivProps } from 'lib/ui/types.js'
4
+
5
+ export interface TableFilterItemProps extends DivProps {
6
+ selected?: boolean
7
+ }
8
+
9
+ export function TableFilterItem({
10
+ onClick,
11
+ selected,
12
+ ...props
13
+ }: TableFilterItemProps) {
14
+ return (
15
+ <div
16
+ onClick={onClick}
17
+ className={classNames('seam-table-filter-item', {
18
+ 'seam-clickable': onClick !== undefined,
19
+ 'seam-selected': selected,
20
+ })}
21
+ {...props}
22
+ />
23
+ )
24
+ }
@@ -58,9 +58,62 @@
58
58
  }
59
59
  }
60
60
 
61
+ @mixin table-filters {
62
+ .seam-table-filter-bar {
63
+ display: flex;
64
+ align-items: center;
65
+ padding: 6px 16px;
66
+ background: colors.$bg-a;
67
+
68
+ .seam-clear-filters-button {
69
+ margin-left: 6px;
70
+ border: 0;
71
+ background: transparent !important;
72
+ padding: 0;
73
+
74
+ svg {
75
+ scale: 0.8333;
76
+
77
+ * {
78
+ fill: colors.$text-gray-1;
79
+ }
80
+ }
81
+ }
82
+ }
83
+
84
+ .seam-table-filter-item {
85
+ display: flex;
86
+ align-items: center;
87
+ padding: 2px 8px 2px 5px;
88
+ border-radius: 5px;
89
+ border: 1px solid colors.$bg-a;
90
+ font-size: 14px;
91
+ line-height: 134%;
92
+
93
+ svg {
94
+ scale: 0.75;
95
+ }
96
+
97
+ &.seam-clickable {
98
+ cursor: pointer;
99
+
100
+ &:hover {
101
+ background: rgb(255 255 255 / 65%);
102
+ border: 1px solid colors.$text-gray-3;
103
+ }
104
+ }
105
+
106
+ &.seam-selected {
107
+ background: #fff;
108
+ border: 1px solid colors.$text-gray-3;
109
+ }
110
+ }
111
+ }
112
+
61
113
  @mixin all {
62
114
  @include header;
63
115
  @include row;
64
116
  @include cell;
65
117
  @include empty-placeholder;
118
+ @include table-filters;
66
119
  }