@imperosoft/cris-webui-components 1.1.2 → 1.1.3-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -22,12 +22,14 @@ var index_exports = {};
22
22
  __export(index_exports, {
23
23
  CrisButton: () => CrisButton,
24
24
  CrisCoDebug: () => CrisCoDebug,
25
+ CrisCoList: () => CrisCoList,
25
26
  CrisCoMatrixListsTie: () => CrisCoMatrixListsTie,
26
27
  CrisGauge: () => CrisGauge,
27
28
  CrisOfflinePage: () => CrisOfflinePage,
28
29
  CrisSlider: () => CrisSlider,
29
30
  CrisSpinner: () => CrisSpinner,
30
31
  CrisText: () => CrisText,
32
+ CrisTextInput: () => CrisTextInput,
31
33
  configureIcons: () => configureIcons,
32
34
  getIconConfig: () => getIconConfig,
33
35
  getIconFilter: () => getIconFilter,
@@ -1159,9 +1161,149 @@ function CrisOfflinePage({
1159
1161
  ] }) });
1160
1162
  }
1161
1163
 
1162
- // src/components/CrisCoDebug.tsx
1164
+ // src/components/CrisTextInput.tsx
1165
+ var import_react4 = require("react");
1163
1166
  var import_cris_webui_ch5_core7 = require("@imperosoft/cris-webui-ch5-core");
1164
1167
  var import_jsx_runtime7 = require("react/jsx-runtime");
1168
+ var colors = {
1169
+ bg: "#4f5152",
1170
+ bgFocused: "#3a3c3d",
1171
+ text: "#ffffff",
1172
+ placeholder: "#9ca3af",
1173
+ border: "#6b7280",
1174
+ borderFocused: "#007ca0"
1175
+ };
1176
+ var defaults = {
1177
+ container: {
1178
+ display: "inline-flex",
1179
+ alignItems: "center",
1180
+ borderRadius: "0.5rem",
1181
+ background: colors.bg,
1182
+ border: `1px solid ${colors.border}`,
1183
+ transition: "border-color 0.15s, background 0.15s",
1184
+ overflow: "hidden"
1185
+ },
1186
+ containerFocused: {
1187
+ borderColor: colors.borderFocused,
1188
+ background: colors.bgFocused
1189
+ },
1190
+ input: {
1191
+ flex: 1,
1192
+ background: "transparent",
1193
+ border: "none",
1194
+ outline: "none",
1195
+ color: colors.text,
1196
+ fontSize: "1em",
1197
+ fontWeight: 500,
1198
+ padding: "0.6rem 0.9rem",
1199
+ width: "100%",
1200
+ fontFamily: "inherit"
1201
+ }
1202
+ };
1203
+ function CrisTextInput({
1204
+ join,
1205
+ joinFeedback,
1206
+ joinEnable,
1207
+ joinVisible,
1208
+ placeholder = "",
1209
+ maxLength,
1210
+ type = "text",
1211
+ submitOnEnter = true,
1212
+ submitOnBlur = false,
1213
+ submitOnChange = false,
1214
+ clearOnSubmit = false,
1215
+ className,
1216
+ style,
1217
+ inputClassName,
1218
+ inputStyle,
1219
+ classDisabled,
1220
+ classFocused: classFocusedProp
1221
+ }) {
1222
+ const feedbackJoin = joinFeedback ?? join;
1223
+ const feedback = (0, import_cris_webui_ch5_core7.useSerial)(feedbackJoin);
1224
+ const enabled = (0, import_cris_webui_ch5_core7.useDigital)(joinEnable ?? 0);
1225
+ const visible = (0, import_cris_webui_ch5_core7.useDigital)(joinVisible ?? 0);
1226
+ const sSet = (0, import_cris_webui_ch5_core7.useJoinsStore)((state) => state.sSet);
1227
+ const isEnabled = joinEnable == null ? true : enabled;
1228
+ const isVisible = joinVisible == null ? true : visible;
1229
+ const [localValue, setLocalValue] = (0, import_react4.useState)("");
1230
+ const [isFocused, setIsFocused] = (0, import_react4.useState)(false);
1231
+ const inputRef = (0, import_react4.useRef)(null);
1232
+ (0, import_react4.useEffect)(() => {
1233
+ if (!isFocused) {
1234
+ setLocalValue(feedback);
1235
+ }
1236
+ }, [feedback, isFocused]);
1237
+ if (!isVisible) return null;
1238
+ const submit = (value) => {
1239
+ sSet(join, value);
1240
+ if (clearOnSubmit) {
1241
+ setLocalValue("");
1242
+ }
1243
+ };
1244
+ const handleChange = (e) => {
1245
+ const val = e.target.value;
1246
+ setLocalValue(val);
1247
+ if (submitOnChange) {
1248
+ submit(val);
1249
+ }
1250
+ };
1251
+ const handleKeyDown = (e) => {
1252
+ if (submitOnEnter && e.key === "Enter") {
1253
+ submit(localValue);
1254
+ inputRef.current?.blur();
1255
+ }
1256
+ };
1257
+ const handleFocus = () => {
1258
+ setIsFocused(true);
1259
+ };
1260
+ const handleBlur = () => {
1261
+ setIsFocused(false);
1262
+ if (submitOnBlur) {
1263
+ submit(localValue);
1264
+ }
1265
+ };
1266
+ const useDefaults = !className;
1267
+ const containerClasses = [
1268
+ "cris-text-input",
1269
+ className,
1270
+ !isEnabled && (classDisabled || "disabled"),
1271
+ isFocused && (classFocusedProp || "focused")
1272
+ ].filter(Boolean).join(" ");
1273
+ const containerStyle = useDefaults ? {
1274
+ ...defaults.container,
1275
+ ...isFocused ? defaults.containerFocused : void 0,
1276
+ ...style,
1277
+ opacity: isEnabled ? 1 : 0.4,
1278
+ pointerEvents: isEnabled ? "auto" : "none"
1279
+ } : {
1280
+ ...style,
1281
+ opacity: isEnabled ? 1 : 0.4,
1282
+ pointerEvents: isEnabled ? "auto" : "none"
1283
+ };
1284
+ const computedInputStyle = inputClassName ? { ...inputStyle } : { ...defaults.input, ...inputStyle };
1285
+ return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { className: containerClasses, style: containerStyle, children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
1286
+ "input",
1287
+ {
1288
+ ref: inputRef,
1289
+ type,
1290
+ value: localValue,
1291
+ placeholder,
1292
+ maxLength,
1293
+ disabled: !isEnabled,
1294
+ className: inputClassName,
1295
+ style: computedInputStyle,
1296
+ onChange: handleChange,
1297
+ onKeyDown: handleKeyDown,
1298
+ onFocus: handleFocus,
1299
+ onBlur: handleBlur
1300
+ }
1301
+ ) });
1302
+ }
1303
+
1304
+ // src/components/CrisCoDebug.tsx
1305
+ var import_cris_webui_ch5_core8 = require("@imperosoft/cris-webui-ch5-core");
1306
+ var import_jsx_runtime8 = require("react/jsx-runtime");
1165
1307
  var defaultStyles = {
1166
1308
  container: {
1167
1309
  display: "flex",
@@ -1221,7 +1363,7 @@ var defaultStyles = {
1221
1363
  };
1222
1364
  function ConnectionIcon({ on, type }) {
1223
1365
  const label = type === "eth" ? "ETH" : "RS";
1224
- return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
1366
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
1225
1367
  "div",
1226
1368
  {
1227
1369
  style: {
@@ -1229,12 +1371,12 @@ function ConnectionIcon({ on, type }) {
1229
1371
  opacity: on ? 1 : 0.4
1230
1372
  },
1231
1373
  title: `${type === "eth" ? "Ethernet" : "RS232"}: ${on ? "Connected" : "Disconnected"}`,
1232
- children: /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("svg", { width: "20", height: "20", viewBox: "0 0 20 20", children: [
1233
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("rect", { x: "1", y: "4", width: "18", height: "12", rx: "2", fill: "none", stroke: "currentColor", strokeWidth: "1.5" }),
1234
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("text", { x: "10", y: "12.5", textAnchor: "middle", fontSize: "7", fontWeight: "bold", fill: "currentColor", children: label }),
1235
- on ? /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("circle", { cx: "16", cy: "5", r: "3.5", fill: "#4caf50", stroke: "none" }) : /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(import_jsx_runtime7.Fragment, { children: [
1236
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("circle", { cx: "16", cy: "5", r: "3.5", fill: "#f44336", stroke: "none" }),
1237
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("line", { x1: "14", y1: "3", x2: "18", y2: "7", stroke: "white", strokeWidth: "1.5" })
1374
+ children: /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("svg", { width: "20", height: "20", viewBox: "0 0 20 20", children: [
1375
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("rect", { x: "1", y: "4", width: "18", height: "12", rx: "2", fill: "none", stroke: "currentColor", strokeWidth: "1.5" }),
1376
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("text", { x: "10", y: "12.5", textAnchor: "middle", fontSize: "7", fontWeight: "bold", fill: "currentColor", children: label }),
1377
+ on ? /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("circle", { cx: "16", cy: "5", r: "3.5", fill: "#4caf50", stroke: "none" }) : /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(import_jsx_runtime8.Fragment, { children: [
1378
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("circle", { cx: "16", cy: "5", r: "3.5", fill: "#f44336", stroke: "none" }),
1379
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("line", { x1: "14", y1: "3", x2: "18", y2: "7", stroke: "white", strokeWidth: "1.5" })
1238
1380
  ] })
1239
1381
  ] })
1240
1382
  }
@@ -1253,22 +1395,22 @@ function DebugModuleItem({
1253
1395
  iconRs232Off
1254
1396
  }) {
1255
1397
  const name = module2.lb ? `${module2.id} (${module2.lb})` : module2.id;
1256
- return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(
1398
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(
1257
1399
  "div",
1258
1400
  {
1259
1401
  className: itemClassName,
1260
1402
  style: itemClassName ? itemStyle : { ...defaultStyles.item, ...itemStyle },
1261
1403
  children: [
1262
- /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { style: defaultStyles.info, children: [
1263
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { style: defaultStyles.moduleName, children: name }),
1264
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { style: defaultStyles.moduleType, children: module2.tp })
1404
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { style: defaultStyles.info, children: [
1405
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { style: defaultStyles.moduleName, children: name }),
1406
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { style: defaultStyles.moduleType, children: module2.tp })
1265
1407
  ] }),
1266
- /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { style: defaultStyles.icons, children: [
1267
- module2.et.vs && (iconEthOn && iconEthOff ? module2.et.on ? iconEthOn : iconEthOff : /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(ConnectionIcon, { on: module2.et.on, type: "eth" })),
1268
- module2.rs.vs && (iconRs232On && iconRs232Off ? module2.rs.on ? iconRs232On : iconRs232Off : /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(ConnectionIcon, { on: module2.rs.on, type: "rs232" }))
1408
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { style: defaultStyles.icons, children: [
1409
+ module2.et.vs && (iconEthOn && iconEthOff ? module2.et.on ? iconEthOn : iconEthOff : /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(ConnectionIcon, { on: module2.et.on, type: "eth" })),
1410
+ module2.rs.vs && (iconRs232On && iconRs232Off ? module2.rs.on ? iconRs232On : iconRs232Off : /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(ConnectionIcon, { on: module2.rs.on, type: "rs232" }))
1269
1411
  ] }),
1270
- /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { style: defaultStyles.buttons, children: [
1271
- module2.md.vs && /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
1412
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { style: defaultStyles.buttons, children: [
1413
+ module2.md.vs && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
1272
1414
  CrisButton,
1273
1415
  {
1274
1416
  selected: module2.md.on,
@@ -1278,7 +1420,7 @@ function DebugModuleItem({
1278
1420
  onPress: () => onAction("toggleMod", module2.id)
1279
1421
  }
1280
1422
  ),
1281
- module2.cm.vs && /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
1423
+ module2.cm.vs && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
1282
1424
  CrisButton,
1283
1425
  {
1284
1426
  selected: module2.cm.on,
@@ -1307,8 +1449,8 @@ function CrisCoDebug({
1307
1449
  iconRs232On,
1308
1450
  iconRs232Off
1309
1451
  }) {
1310
- const modules = (0, import_cris_webui_ch5_core7.useCustomObject)(oid);
1311
- const send = (0, import_cris_webui_ch5_core7.useCustomObjectSend)();
1452
+ const modules = (0, import_cris_webui_ch5_core8.useCustomObject)(oid);
1453
+ const send = (0, import_cris_webui_ch5_core8.useCustomObjectSend)();
1312
1454
  const handleAction = (action, id) => {
1313
1455
  send(oid, { action, id });
1314
1456
  };
@@ -1316,14 +1458,14 @@ function CrisCoDebug({
1316
1458
  return null;
1317
1459
  }
1318
1460
  const visibleModules = modules.filter((m) => m.vs);
1319
- return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(
1461
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(
1320
1462
  "div",
1321
1463
  {
1322
1464
  className,
1323
1465
  style: className ? style : { ...defaultStyles.container, ...style },
1324
1466
  children: [
1325
- title && /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { style: defaultStyles.title, children: title }),
1326
- visibleModules.map((module2) => /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
1467
+ title && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { style: defaultStyles.title, children: title }),
1468
+ visibleModules.map((module2) => /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
1327
1469
  DebugModuleItem,
1328
1470
  {
1329
1471
  module: module2,
@@ -1344,10 +1486,250 @@ function CrisCoDebug({
1344
1486
  );
1345
1487
  }
1346
1488
 
1489
+ // src/components/CrisCoList.tsx
1490
+ var import_cris_webui_ch5_core9 = require("@imperosoft/cris-webui-ch5-core");
1491
+ var import_jsx_runtime9 = require("react/jsx-runtime");
1492
+ var colors2 = {
1493
+ itemBg: "#4f5152",
1494
+ itemActiveBg: "#007ca0",
1495
+ text: "#ffffff",
1496
+ headerText: "#6b7280"
1497
+ };
1498
+ var defaults2 = {
1499
+ container: {
1500
+ display: "flex",
1501
+ flexDirection: "column",
1502
+ overflow: "hidden",
1503
+ height: "100%",
1504
+ width: "100%",
1505
+ padding: "1rem 2rem",
1506
+ minHeight: 0
1507
+ },
1508
+ header: {
1509
+ fontSize: "1.5em",
1510
+ fontWeight: 700,
1511
+ padding: "0.5rem 0.75rem",
1512
+ textTransform: "uppercase",
1513
+ letterSpacing: "0.05em",
1514
+ color: colors2.headerText,
1515
+ flexShrink: 0,
1516
+ textAlign: "center"
1517
+ },
1518
+ scroll: {
1519
+ flex: 1,
1520
+ minHeight: 0,
1521
+ overflow: "auto",
1522
+ scrollbarWidth: "none",
1523
+ WebkitOverflowScrolling: "touch",
1524
+ display: "flex",
1525
+ flexDirection: "column",
1526
+ gap: "0.15rem"
1527
+ },
1528
+ item: {
1529
+ display: "flex",
1530
+ alignItems: "stretch",
1531
+ minHeight: "3.7rem",
1532
+ cursor: "pointer",
1533
+ userSelect: "none",
1534
+ background: colors2.itemBg,
1535
+ borderRadius: "0.5rem",
1536
+ transition: "background 0.15s"
1537
+ },
1538
+ itemActive: {
1539
+ background: colors2.itemActiveBg
1540
+ },
1541
+ itemBtn: {
1542
+ flex: 1,
1543
+ minWidth: 0,
1544
+ display: "flex",
1545
+ alignItems: "stretch",
1546
+ background: "transparent",
1547
+ border: "none",
1548
+ textAlign: "left",
1549
+ color: colors2.text,
1550
+ height: "100%",
1551
+ borderRadius: "0.5rem",
1552
+ cursor: "pointer"
1553
+ },
1554
+ itemBtnInner: {
1555
+ display: "flex",
1556
+ alignItems: "center",
1557
+ gap: "0.4rem",
1558
+ width: "100%",
1559
+ flex: 1,
1560
+ padding: "0.5rem 0.9rem"
1561
+ },
1562
+ idNum: {
1563
+ flexShrink: 0,
1564
+ opacity: 0.6,
1565
+ minWidth: "1.7em",
1566
+ textAlign: "right",
1567
+ fontWeight: 400,
1568
+ marginRight: "0.4em"
1569
+ },
1570
+ itemLabel: {
1571
+ flex: 1,
1572
+ fontSize: "1.4em",
1573
+ fontWeight: 700,
1574
+ whiteSpace: "nowrap",
1575
+ overflow: "hidden",
1576
+ textOverflow: "ellipsis",
1577
+ color: colors2.text
1578
+ }
1579
+ };
1580
+ var INJECTED_CSS = `
1581
+ .cris-co-list-scroll::-webkit-scrollbar { display: none; }
1582
+ .cris-co-list-item > div:first-child > .cris-button { width: 100%; height: 100%; }
1583
+ `;
1584
+ var styleInjected = false;
1585
+ function injectStyle() {
1586
+ if (styleInjected) return;
1587
+ styleInjected = true;
1588
+ const style = document.createElement("style");
1589
+ style.textContent = INJECTED_CSS;
1590
+ document.head.appendChild(style);
1591
+ }
1592
+ function ListItemRow({
1593
+ item,
1594
+ selected,
1595
+ showIds,
1596
+ settings,
1597
+ onSelect,
1598
+ renderItem,
1599
+ itemClassName,
1600
+ itemStyle: itemStyleProp,
1601
+ itemActiveClassName,
1602
+ itemActiveStyle,
1603
+ itemDisabledClassName
1604
+ }) {
1605
+ const isEnabled = item.en !== false;
1606
+ const useDefaults = !itemClassName;
1607
+ const classes = [
1608
+ "cris-co-list-item",
1609
+ itemClassName,
1610
+ selected && (itemActiveClassName || "active"),
1611
+ !isEnabled && (itemDisabledClassName || "disabled")
1612
+ ].filter(Boolean).join(" ");
1613
+ const computedStyle = useDefaults ? {
1614
+ ...defaults2.item,
1615
+ ...itemStyleProp,
1616
+ ...selected ? { ...defaults2.itemActive, ...itemActiveStyle } : void 0,
1617
+ opacity: isEnabled ? 1 : 0.4
1618
+ } : { ...itemStyleProp };
1619
+ if (renderItem) {
1620
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { className: classes, style: computedStyle, children: useDefaults ? /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { style: defaults2.itemBtn, children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
1621
+ CrisButton,
1622
+ {
1623
+ selected,
1624
+ enabled: isEnabled,
1625
+ onPress: onSelect,
1626
+ showLocalFeedback: false,
1627
+ children: renderItem(item, selected, settings)
1628
+ }
1629
+ ) }) : /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
1630
+ CrisButton,
1631
+ {
1632
+ selected,
1633
+ enabled: isEnabled,
1634
+ onPress: onSelect,
1635
+ className: `cris-co-list-item-btn ${itemActiveClassName ?? ""}`,
1636
+ classActive: itemActiveClassName,
1637
+ children: renderItem(item, selected, settings)
1638
+ }
1639
+ ) });
1640
+ }
1641
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { className: classes, style: computedStyle, children: useDefaults ? /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { style: defaults2.itemBtn, children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
1642
+ CrisButton,
1643
+ {
1644
+ selected,
1645
+ enabled: isEnabled,
1646
+ onPress: onSelect,
1647
+ showLocalFeedback: false,
1648
+ children: /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { style: defaults2.itemBtnInner, children: [
1649
+ showIds && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { className: "cris-co-list-id", style: defaults2.idNum, children: item.id }),
1650
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { style: defaults2.itemLabel, children: item.lb || `Item ${item.id}` })
1651
+ ] })
1652
+ }
1653
+ ) }) : /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
1654
+ CrisButton,
1655
+ {
1656
+ selected,
1657
+ enabled: isEnabled,
1658
+ onPress: onSelect,
1659
+ className: `cris-co-list-item-btn ${itemActiveClassName ?? ""}`,
1660
+ classActive: itemActiveClassName,
1661
+ children: /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: "0.4rem", width: "100%" }, children: [
1662
+ showIds && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { className: "cris-co-list-id", style: { flexShrink: 0, opacity: 0.6 }, children: item.id }),
1663
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { style: { flex: 1, whiteSpace: "nowrap", overflow: "hidden", textOverflow: "ellipsis" }, children: item.lb || `Item ${item.id}` })
1664
+ ] })
1665
+ }
1666
+ ) });
1667
+ }
1668
+ function CrisCoList({
1669
+ oid,
1670
+ title,
1671
+ showIds = true,
1672
+ selectAction = "select",
1673
+ renderItem,
1674
+ className,
1675
+ style,
1676
+ headerClassName,
1677
+ headerStyle,
1678
+ itemClassName,
1679
+ itemStyle,
1680
+ itemActiveClassName,
1681
+ itemActiveStyle,
1682
+ itemDisabledClassName
1683
+ }) {
1684
+ const list = (0, import_cris_webui_ch5_core9.useCustomObject)(oid);
1685
+ const send = (0, import_cris_webui_ch5_core9.useCustomObjectSend)();
1686
+ injectStyle();
1687
+ if (!list) return null;
1688
+ const { st: settings, si, it: items } = list;
1689
+ const visibleItems = items?.filter((item) => item.vs !== false);
1690
+ const handleSelect = (id) => {
1691
+ send(oid, { action: selectAction, id });
1692
+ };
1693
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(
1694
+ "div",
1695
+ {
1696
+ className,
1697
+ style: className ? style : { ...defaults2.container, ...style },
1698
+ children: [
1699
+ title && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
1700
+ "div",
1701
+ {
1702
+ className: headerClassName,
1703
+ style: headerClassName ? headerStyle : { ...defaults2.header, ...headerStyle },
1704
+ children: title
1705
+ }
1706
+ ),
1707
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { className: "cris-co-list-scroll", style: defaults2.scroll, children: visibleItems?.map((item) => /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
1708
+ ListItemRow,
1709
+ {
1710
+ item,
1711
+ selected: si === item.id,
1712
+ showIds,
1713
+ settings,
1714
+ onSelect: () => handleSelect(item.id),
1715
+ renderItem,
1716
+ itemClassName,
1717
+ itemStyle,
1718
+ itemActiveClassName,
1719
+ itemActiveStyle,
1720
+ itemDisabledClassName
1721
+ },
1722
+ item.id
1723
+ )) })
1724
+ ]
1725
+ }
1726
+ );
1727
+ }
1728
+
1347
1729
  // src/components/CrisCoMatrixListsTie.tsx
1348
- var import_cris_webui_ch5_core8 = require("@imperosoft/cris-webui-ch5-core");
1349
- var import_jsx_runtime8 = require("react/jsx-runtime");
1350
- var colors = {
1730
+ var import_cris_webui_ch5_core10 = require("@imperosoft/cris-webui-ch5-core");
1731
+ var import_jsx_runtime10 = require("react/jsx-runtime");
1732
+ var colors3 = {
1351
1733
  itemBg: "#4f5152",
1352
1734
  itemActiveBg: "#007ca0",
1353
1735
  vmActiveBg: "#dc2626",
@@ -1358,7 +1740,7 @@ var colors = {
1358
1740
  sgOn: "#2196f3",
1359
1741
  sgOff: "#666666"
1360
1742
  };
1361
- var defaults = {
1743
+ var defaults3 = {
1362
1744
  container: {
1363
1745
  display: "flex",
1364
1746
  flexDirection: "row",
@@ -1380,7 +1762,7 @@ var defaults = {
1380
1762
  padding: "0.5rem 0.75rem",
1381
1763
  textTransform: "uppercase",
1382
1764
  letterSpacing: "0.05em",
1383
- color: colors.headerText,
1765
+ color: colors3.headerText,
1384
1766
  flexShrink: 0,
1385
1767
  textAlign: "center"
1386
1768
  },
@@ -1402,12 +1784,12 @@ var defaults = {
1402
1784
  minHeight: "3.7rem",
1403
1785
  cursor: "pointer",
1404
1786
  userSelect: "none",
1405
- background: colors.itemBg,
1787
+ background: colors3.itemBg,
1406
1788
  borderRadius: "0.5rem",
1407
1789
  transition: "background 0.15s"
1408
1790
  },
1409
1791
  itemActive: {
1410
- background: colors.itemActiveBg
1792
+ background: colors3.itemActiveBg
1411
1793
  },
1412
1794
  itemBtn: {
1413
1795
  flex: 1,
@@ -1417,7 +1799,7 @@ var defaults = {
1417
1799
  background: "transparent",
1418
1800
  border: "none",
1419
1801
  textAlign: "left",
1420
- color: colors.text,
1802
+ color: colors3.text,
1421
1803
  height: "100%",
1422
1804
  borderRadius: "0.5rem",
1423
1805
  cursor: "pointer"
@@ -1445,7 +1827,7 @@ var defaults = {
1445
1827
  whiteSpace: "nowrap",
1446
1828
  overflow: "hidden",
1447
1829
  textOverflow: "ellipsis",
1448
- color: colors.text
1830
+ color: colors3.text
1449
1831
  },
1450
1832
  indicators: {
1451
1833
  display: "flex",
@@ -1463,8 +1845,8 @@ var defaults = {
1463
1845
  alignSelf: "stretch",
1464
1846
  display: "flex",
1465
1847
  alignItems: "center",
1466
- background: colors.itemBg,
1467
- color: colors.text,
1848
+ background: colors3.itemBg,
1849
+ color: colors3.text,
1468
1850
  border: "none",
1469
1851
  borderRadius: "0.4rem",
1470
1852
  padding: "0 0.6rem",
@@ -1475,11 +1857,11 @@ var defaults = {
1475
1857
  transition: "background 0.15s"
1476
1858
  },
1477
1859
  vmBtnActive: {
1478
- background: colors.vmActiveBg,
1479
- color: colors.text
1860
+ background: colors3.vmActiveBg,
1861
+ color: colors3.text
1480
1862
  }
1481
1863
  };
1482
- var INJECTED_CSS = `
1864
+ var INJECTED_CSS2 = `
1483
1865
  .cris-co-matrix-scroll::-webkit-scrollbar { display: none; }
1484
1866
  .cris-co-matrix-item > div:first-child > .cris-button { width: 100%; height: 100%; }
1485
1867
  `;
@@ -1488,28 +1870,28 @@ function injectScrollbarStyle() {
1488
1870
  if (scrollbarStyleInjected) return;
1489
1871
  scrollbarStyleInjected = true;
1490
1872
  const style = document.createElement("style");
1491
- style.textContent = INJECTED_CSS;
1873
+ style.textContent = INJECTED_CSS2;
1492
1874
  document.head.appendChild(style);
1493
1875
  }
1494
1876
  function DefaultIoIndicator({ on }) {
1495
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
1877
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1496
1878
  "div",
1497
1879
  {
1498
1880
  style: {
1499
- ...defaults.indicator,
1500
- backgroundColor: on ? colors.ioOn : colors.ioOff
1881
+ ...defaults3.indicator,
1882
+ backgroundColor: on ? colors3.ioOn : colors3.ioOff
1501
1883
  },
1502
1884
  title: on ? "Online" : "Offline"
1503
1885
  }
1504
1886
  );
1505
1887
  }
1506
1888
  function DefaultSignalIndicator({ on }) {
1507
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
1889
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1508
1890
  "div",
1509
1891
  {
1510
1892
  style: {
1511
- ...defaults.indicator,
1512
- backgroundColor: on ? colors.sgOn : colors.sgOff
1893
+ ...defaults3.indicator,
1894
+ backgroundColor: on ? colors3.sgOn : colors3.sgOff
1513
1895
  },
1514
1896
  title: on ? "Signal detected" : "No signal"
1515
1897
  }
@@ -1543,29 +1925,29 @@ function MatrixItemRow({
1543
1925
  !isEnabled && (itemDisabledClassName || "disabled")
1544
1926
  ].filter(Boolean).join(" ");
1545
1927
  const computedStyle = useDefaults ? {
1546
- ...defaults.item,
1928
+ ...defaults3.item,
1547
1929
  ...itemStyleProp,
1548
- ...isActive ? { ...defaults.itemActive, ...itemActiveStyle } : void 0,
1930
+ ...isActive ? { ...defaults3.itemActive, ...itemActiveStyle } : void 0,
1549
1931
  opacity: isEnabled ? 1 : 0.4
1550
1932
  } : { ...itemStyleProp };
1551
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { className: classes, style: computedStyle, children: [
1552
- useDefaults ? /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { style: defaults.itemBtn, children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
1933
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: classes, style: computedStyle, children: [
1934
+ useDefaults ? /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { style: defaults3.itemBtn, children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1553
1935
  CrisButton,
1554
1936
  {
1555
1937
  selected: isActive,
1556
1938
  enabled: isEnabled,
1557
1939
  onPress: onSelect,
1558
1940
  showLocalFeedback: false,
1559
- children: /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { style: defaults.itemBtnInner, children: [
1560
- showChannels && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { className: "cris-co-matrix-ch", style: defaults.channelNum, children: item.id }),
1561
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { style: defaults.itemLabel, children: item.lb || `${type === "input" ? "Input" : "Output"} ${item.id}` }),
1562
- /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { style: defaults.indicators, children: [
1563
- item.io.vs && (renderIoIndicator ? renderIoIndicator(item.io.on) : /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(DefaultIoIndicator, { on: item.io.on })),
1564
- item.sg.vs && (renderSignalIndicator ? renderSignalIndicator(item.sg.on) : /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(DefaultSignalIndicator, { on: item.sg.on }))
1941
+ children: /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { style: defaults3.itemBtnInner, children: [
1942
+ showChannels && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { className: "cris-co-matrix-ch", style: defaults3.channelNum, children: item.id }),
1943
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { style: defaults3.itemLabel, children: item.lb || `${type === "input" ? "Input" : "Output"} ${item.id}` }),
1944
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { style: defaults3.indicators, children: [
1945
+ item.io.vs && (renderIoIndicator ? renderIoIndicator(item.io.on) : /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(DefaultIoIndicator, { on: item.io.on })),
1946
+ item.sg.vs && (renderSignalIndicator ? renderSignalIndicator(item.sg.on) : /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(DefaultSignalIndicator, { on: item.sg.on }))
1565
1947
  ] })
1566
1948
  ] })
1567
1949
  }
1568
- ) }) : /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
1950
+ ) }) : /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1569
1951
  CrisButton,
1570
1952
  {
1571
1953
  selected: isActive,
@@ -1573,22 +1955,22 @@ function MatrixItemRow({
1573
1955
  onPress: onSelect,
1574
1956
  className: `cris-co-matrix-item-btn ${itemActiveClassName ?? ""}`,
1575
1957
  classActive: itemActiveClassName,
1576
- children: /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: "0.4rem", width: "100%" }, children: [
1577
- showChannels && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { className: "cris-co-matrix-ch", style: { flexShrink: 0, opacity: 0.6 }, children: item.id }),
1578
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { style: { flex: 1, whiteSpace: "nowrap", overflow: "hidden", textOverflow: "ellipsis" }, children: item.lb || `${type === "input" ? "Input" : "Output"} ${item.id}` }),
1579
- /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { style: defaults.indicators, children: [
1580
- item.io.vs && (renderIoIndicator ? renderIoIndicator(item.io.on) : /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(DefaultIoIndicator, { on: item.io.on })),
1581
- item.sg.vs && (renderSignalIndicator ? renderSignalIndicator(item.sg.on) : /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(DefaultSignalIndicator, { on: item.sg.on }))
1958
+ children: /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: "0.4rem", width: "100%" }, children: [
1959
+ showChannels && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { className: "cris-co-matrix-ch", style: { flexShrink: 0, opacity: 0.6 }, children: item.id }),
1960
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { style: { flex: 1, whiteSpace: "nowrap", overflow: "hidden", textOverflow: "ellipsis" }, children: item.lb || `${type === "input" ? "Input" : "Output"} ${item.id}` }),
1961
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { style: defaults3.indicators, children: [
1962
+ item.io.vs && (renderIoIndicator ? renderIoIndicator(item.io.on) : /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(DefaultIoIndicator, { on: item.io.on })),
1963
+ item.sg.vs && (renderSignalIndicator ? renderSignalIndicator(item.sg.on) : /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(DefaultSignalIndicator, { on: item.sg.on }))
1582
1964
  ] })
1583
1965
  ] })
1584
1966
  }
1585
1967
  ),
1586
- item.vm.vs && (useDefaults && !vmButtonClassName ? /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { style: {
1587
- ...defaults.vmBtn,
1588
- ...item.vm.on ? defaults.vmBtnActive : void 0,
1968
+ item.vm.vs && (useDefaults && !vmButtonClassName ? /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { style: {
1969
+ ...defaults3.vmBtn,
1970
+ ...item.vm.on ? defaults3.vmBtnActive : void 0,
1589
1971
  opacity: item.vm.en ? 1 : 0.4,
1590
1972
  pointerEvents: item.vm.en ? "auto" : "none"
1591
- }, children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
1973
+ }, children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1592
1974
  CrisButton,
1593
1975
  {
1594
1976
  selected: item.vm.on,
@@ -1597,7 +1979,7 @@ function MatrixItemRow({
1597
1979
  onPress: onToggleVideoMute,
1598
1980
  showLocalFeedback: false
1599
1981
  }
1600
- ) }) : /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
1982
+ ) }) : /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1601
1983
  CrisButton,
1602
1984
  {
1603
1985
  selected: item.vm.on,
@@ -1632,8 +2014,8 @@ function CrisCoMatrixListsTie({
1632
2014
  renderIoIndicator,
1633
2015
  renderSignalIndicator
1634
2016
  }) {
1635
- const matrix = (0, import_cris_webui_ch5_core8.useCustomObject)(oid);
1636
- const send = (0, import_cris_webui_ch5_core8.useCustomObjectSend)();
2017
+ const matrix = (0, import_cris_webui_ch5_core10.useCustomObject)(oid);
2018
+ const send = (0, import_cris_webui_ch5_core10.useCustomObjectSend)();
1637
2019
  injectScrollbarStyle();
1638
2020
  if (!matrix) return null;
1639
2021
  const { si, ip: inputs, op: outputs } = matrix;
@@ -1646,27 +2028,27 @@ function CrisCoMatrixListsTie({
1646
2028
  const handleToggleVideoMute = (type, id) => {
1647
2029
  send(oid, { action: "toggleVideoMute", type, id });
1648
2030
  };
1649
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(
2031
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(
1650
2032
  "div",
1651
2033
  {
1652
2034
  className,
1653
- style: className ? style : { ...defaults.container, ...style },
2035
+ style: className ? style : { ...defaults3.container, ...style },
1654
2036
  children: [
1655
- /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(
2037
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(
1656
2038
  "div",
1657
2039
  {
1658
2040
  className: listClassName,
1659
- style: listClassName ? listStyle : { ...defaults.list, ...listStyle },
2041
+ style: listClassName ? listStyle : { ...defaults3.list, ...listStyle },
1660
2042
  children: [
1661
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
2043
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1662
2044
  "div",
1663
2045
  {
1664
2046
  className: headerClassName,
1665
- style: headerClassName ? headerStyle : { ...defaults.header, ...headerStyle },
2047
+ style: headerClassName ? headerStyle : { ...defaults3.header, ...headerStyle },
1666
2048
  children: inputTitle
1667
2049
  }
1668
2050
  ),
1669
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { className: "cris-co-matrix-scroll", style: defaults.scroll, children: inputs?.map((item) => /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
2051
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { className: "cris-co-matrix-scroll", style: defaults3.scroll, children: inputs?.map((item) => /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1670
2052
  MatrixItemRow,
1671
2053
  {
1672
2054
  item,
@@ -1691,21 +2073,21 @@ function CrisCoMatrixListsTie({
1691
2073
  ]
1692
2074
  }
1693
2075
  ),
1694
- /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(
2076
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(
1695
2077
  "div",
1696
2078
  {
1697
2079
  className: listClassName,
1698
- style: listClassName ? listStyle : { ...defaults.list, ...listStyle },
2080
+ style: listClassName ? listStyle : { ...defaults3.list, ...listStyle },
1699
2081
  children: [
1700
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
2082
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1701
2083
  "div",
1702
2084
  {
1703
2085
  className: headerClassName,
1704
- style: headerClassName ? headerStyle : { ...defaults.header, ...headerStyle },
2086
+ style: headerClassName ? headerStyle : { ...defaults3.header, ...headerStyle },
1705
2087
  children: outputTitle
1706
2088
  }
1707
2089
  ),
1708
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { className: "cris-co-matrix-scroll", style: defaults.scroll, children: outputs?.map((item) => /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
2090
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { className: "cris-co-matrix-scroll", style: defaults3.scroll, children: outputs?.map((item) => /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1709
2091
  MatrixItemRow,
1710
2092
  {
1711
2093
  item,
@@ -1738,12 +2120,14 @@ function CrisCoMatrixListsTie({
1738
2120
  0 && (module.exports = {
1739
2121
  CrisButton,
1740
2122
  CrisCoDebug,
2123
+ CrisCoList,
1741
2124
  CrisCoMatrixListsTie,
1742
2125
  CrisGauge,
1743
2126
  CrisOfflinePage,
1744
2127
  CrisSlider,
1745
2128
  CrisSpinner,
1746
2129
  CrisText,
2130
+ CrisTextInput,
1747
2131
  configureIcons,
1748
2132
  getIconConfig,
1749
2133
  getIconFilter,