@fuaran-ui/ops 0.3.0 → 0.5.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.
package/dist/index.cjs CHANGED
@@ -1048,6 +1048,16 @@ var staticStringOpt = (v) => v === void 0 ? "null" : str(v);
1048
1048
  var staticStringList = (v) => jArray(v.map(str));
1049
1049
  var staticFloatSeq = (v) => jArray(v.map(num));
1050
1050
  var staticMarkerSeq = (v) => jArray(v.map(mapMarker));
1051
+ var rowValue = (row) => {
1052
+ if (row === null || typeof row !== "object") return "{}";
1053
+ const fields = [];
1054
+ for (const [k, v] of Object.entries(row)) {
1055
+ if (v === null || v === void 0) continue;
1056
+ fields.push([k, objValue(v)]);
1057
+ }
1058
+ return jObject(fields);
1059
+ };
1060
+ var staticRowSeq = (v) => jArray(v.map(rowValue));
1051
1061
  var cellKindErased = (k) => {
1052
1062
  switch (k.kind) {
1053
1063
  case "Text":
@@ -1092,6 +1102,16 @@ var cellKindErased = (k) => {
1092
1102
  ["labelFn", CLOSURE],
1093
1103
  ["toneFn", CLOSURE]
1094
1104
  ]);
1105
+ // Phase 750 — the declarative pill. `default` is omitted-when-`Default` (the Phase
1106
+ // 460 discipline); `jObject` Ordinal-sorts, so push order is irrelevant.
1107
+ case "TonedPill": {
1108
+ const fields = [
1109
+ ["field", str(k.field)],
1110
+ ["map", jObject(Object.entries(k.map).map(([v, t]) => [v, str(t)]))]
1111
+ ];
1112
+ if (k.defaultTone !== "Default") fields.push(["default", str(k.defaultTone)]);
1113
+ return caseObj("TonedPill", fields);
1114
+ }
1095
1115
  case "Progress":
1096
1116
  return caseObj("Progress", [
1097
1117
  ["fractionFn", CLOSURE],
@@ -1119,7 +1139,8 @@ var gridSpec = (s) => {
1119
1139
  ["columns", jArray(s.columns.map(columnErased))],
1120
1140
  // 0.2.0 omitted-when-false.
1121
1141
  ...s.editable ? [["editable", bool(true)]] : [],
1122
- ["source", binding(s.source)]
1142
+ // fuaran#665 — rows are a typed Static payload now, not the opaque residual.
1143
+ ["source", binding(s.source, staticRowSeq)]
1123
1144
  ];
1124
1145
  if (s.onRowClick !== void 0) fields.push(["onRowClick", CLOSURE]);
1125
1146
  if (s.rowKey !== void 0) fields.push(["rowKey", CLOSURE]);
@@ -1137,7 +1158,8 @@ var gridSpec = (s) => {
1137
1158
  var chartSpec = (s) => {
1138
1159
  const fields = [
1139
1160
  ["kind", str(s.kind)],
1140
- ["source", binding(s.source)],
1161
+ // fuaran#665 — rows are a typed Static payload now, not the opaque residual.
1162
+ ["source", binding(s.source, staticRowSeq)],
1141
1163
  ["stacked", bool(s.stacked)],
1142
1164
  ["xField", str(s.xField)],
1143
1165
  ["yFields", jArray(s.yFields.map(str))]
@@ -3016,14 +3038,18 @@ var EMPHASIS_ALIASES = {
3016
3038
  Subtle: "Quiet",
3017
3039
  Muted: "Quiet"
3018
3040
  };
3041
+ var TONE_NAMES = [
3042
+ "Default",
3043
+ "Subdued",
3044
+ "Brand",
3045
+ "Success",
3046
+ "Warning",
3047
+ "Critical",
3048
+ "Info"
3049
+ ];
3019
3050
  var decodeTone = (p, j) => {
3020
3051
  if (j.kind === "JString" && j.value in TONE_ALIASES) return ok(TONE_ALIASES[j.value]);
3021
- return bareEnum(
3022
- p,
3023
- j,
3024
- ["Default", "Subdued", "Brand", "Success", "Warning", "Critical", "Info"],
3025
- "ToneVariant"
3026
- );
3052
+ return bareEnum(p, j, TONE_NAMES, "ToneVariant");
3027
3053
  };
3028
3054
  var decodeWeight = (p, j) => (
3029
3055
  // StyleWeight deliberately not aliased — `Bold`/`Heavy` is font-weight intent, but
@@ -4409,6 +4435,17 @@ var parseStaticFloatSeq = (p, v) => {
4409
4435
  return traverseIndexed(arr.value, (i, el) => requireFloat(`${p}[${i}]`, el));
4410
4436
  };
4411
4437
  var decodeBindingFloatSeq = (p, j) => decodeBinding(p, j, parseStaticFloatSeq, []);
4438
+ var parseStaticRows = (p, v) => {
4439
+ if (v.kind === "JNull") return ok([]);
4440
+ if (v.kind === "JString" && v.value === OPAQUE2) return ok([]);
4441
+ const arr = requireArray(p, v);
4442
+ if (!arr.ok) return arr;
4443
+ return traverseIndexed(
4444
+ arr.value,
4445
+ (i, el) => el.kind === "JObject" ? ok(decodeAstValue(el)) : wrongType(`${p}[${i}]`, "row object")
4446
+ );
4447
+ };
4448
+ var decodeBindingRows = (p, j) => decodeBinding(p, j, parseStaticRows, []);
4412
4449
  var decodeMapMarker = (path, j) => {
4413
4450
  const fo = requireObject(path, j);
4414
4451
  if (!fo.ok) return fo;
@@ -5621,6 +5658,56 @@ var decodeInputKind = (path, j) => {
5621
5658
  return unknownDuCase(path, d.value, "Form | Filters | Button | FileUpload | Select");
5622
5659
  }
5623
5660
  };
5661
+ var decodeToneMap = (path, j) => {
5662
+ const fo = requireObject(path, j);
5663
+ if (!fo.ok) return fo;
5664
+ const out = {};
5665
+ for (const [k, v] of fo.value) {
5666
+ const entryPath = `${path}.${k}`;
5667
+ const t = decodeTone(entryPath, v);
5668
+ if (!t.ok) {
5669
+ if (t.error.code !== "UNKNOWN_DU_CASE") return t;
5670
+ const got = v.kind === "JString" ? v.value : "";
5671
+ return makeError(
5672
+ "UNKNOWN_DU_CASE",
5673
+ entryPath,
5674
+ `tone-map value '${got}' for '${k}' is not a ToneVariant`,
5675
+ TONE_NAMES.join(" | ")
5676
+ );
5677
+ }
5678
+ out[k] = t.value;
5679
+ }
5680
+ return ok(out);
5681
+ };
5682
+ var TONE_MAP_KEYS = ["map", "toneMap", "tones"];
5683
+ var decodeTonedPill = (path, f) => {
5684
+ const field2 = reqField(
5685
+ path,
5686
+ f,
5687
+ "field",
5688
+ "TonedPill row-field name (drives the label and the map key)",
5689
+ requireString
5690
+ );
5691
+ if (!field2.ok) return field2;
5692
+ const map = reqFieldAliased(
5693
+ path,
5694
+ f,
5695
+ "map",
5696
+ ["toneMap", "tones"],
5697
+ "TonedPill value\u2192ToneVariant map",
5698
+ decodeToneMap
5699
+ );
5700
+ if (!map.ok) return map;
5701
+ const defaultTone = optField(path, f, "default", decodeTone);
5702
+ if (!defaultTone.ok) return defaultTone;
5703
+ const k = {
5704
+ kind: "TonedPill",
5705
+ field: field2.value,
5706
+ map: map.value,
5707
+ defaultTone: defaultTone.value ?? "Default"
5708
+ };
5709
+ return ok(k);
5710
+ };
5624
5711
  var decodeCellKindErased = (path, j) => {
5625
5712
  const fo = requireObject(path, j);
5626
5713
  if (!fo.ok) return fo;
@@ -5673,6 +5760,8 @@ var decodeCellKindErased = (path, j) => {
5673
5760
  return ok(k);
5674
5761
  }
5675
5762
  case "Pill": {
5763
+ if (TONE_MAP_KEYS.some((key) => tryField(f, key) !== void 0))
5764
+ return decodeTonedPill(path, f);
5676
5765
  const k = {
5677
5766
  kind: "Pill",
5678
5767
  label: () => ({ kind: "Literal", value: CLOSURE2 }),
@@ -5680,6 +5769,8 @@ var decodeCellKindErased = (path, j) => {
5680
5769
  };
5681
5770
  return ok(k);
5682
5771
  }
5772
+ case "TonedPill":
5773
+ return decodeTonedPill(path, f);
5683
5774
  case "Progress": {
5684
5775
  const k = { kind: "Progress", fraction: () => 0 };
5685
5776
  return ok(k);
@@ -5695,7 +5786,7 @@ var decodeCellKindErased = (path, j) => {
5695
5786
  return unknownDuCase(
5696
5787
  path,
5697
5788
  d.value,
5698
- "Text | Numeric | Date | Editable | Checkbox | Button | ButtonGroup | Link | Pill | Progress | Custom"
5789
+ "Text | Numeric | Date | Editable | Checkbox | Button | ButtonGroup | Link | Pill | TonedPill | Progress | Custom"
5699
5790
  );
5700
5791
  }
5701
5792
  };
@@ -5784,7 +5875,7 @@ var decodeGridSpec = (path, j) => {
5784
5875
  "source",
5785
5876
  ["data", "rows"],
5786
5877
  "Grid source binding",
5787
- decodeBinding
5878
+ decodeBindingRows
5788
5879
  );
5789
5880
  if (!source.ok) return source;
5790
5881
  const hasRowClick = tryField(f, "onRowClick") !== void 0;
@@ -5825,7 +5916,7 @@ var decodeChartSpec = (path, j) => {
5825
5916
  "source",
5826
5917
  ["data"],
5827
5918
  "Chart source binding",
5828
- decodeBinding
5919
+ decodeBindingRows
5829
5920
  );
5830
5921
  if (!source.ok) return source;
5831
5922
  const xField = reqField(path, f, "xField", "xField string", requireString);