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