@fuaran-ui/ops 0.2.0 → 0.4.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
@@ -937,6 +937,25 @@ var formFieldKind = (autoBind, k) => {
937
937
  if (k.constraints.step !== void 0) fields.push(["step", num(k.constraints.step)]);
938
938
  return caseObj("Date", fields);
939
939
  }
940
+ case "DateRange": {
941
+ const staticPair = (p) => jObject([
942
+ ["from", str(p[0])],
943
+ ["to", str(p[1])]
944
+ ]);
945
+ const fields = [
946
+ ...handlerField("onChange", k.onChange),
947
+ ...valueField(
948
+ k.value,
949
+ schema.controlValueDefaults.dateRange,
950
+ (v) => v.kind === "Static" ? staticPair(v.value) : binding(v, staticPair)
951
+ ),
952
+ ["variant", str(k.variant)]
953
+ ];
954
+ if (k.constraints.min !== void 0) fields.push(["min", str(k.constraints.min)]);
955
+ if (k.constraints.max !== void 0) fields.push(["max", str(k.constraints.max)]);
956
+ if (k.constraints.step !== void 0) fields.push(["step", num(k.constraints.step)]);
957
+ return caseObj("DateRange", fields);
958
+ }
940
959
  default:
941
960
  return assertNever(k);
942
961
  }
@@ -1073,6 +1092,16 @@ var cellKindErased = (k) => {
1073
1092
  ["labelFn", CLOSURE],
1074
1093
  ["toneFn", CLOSURE]
1075
1094
  ]);
1095
+ // Phase 750 — the declarative pill. `default` is omitted-when-`Default` (the Phase
1096
+ // 460 discipline); `jObject` Ordinal-sorts, so push order is irrelevant.
1097
+ case "TonedPill": {
1098
+ const fields = [
1099
+ ["field", str(k.field)],
1100
+ ["map", jObject(Object.entries(k.map).map(([v, t]) => [v, str(t)]))]
1101
+ ];
1102
+ if (k.defaultTone !== "Default") fields.push(["default", str(k.defaultTone)]);
1103
+ return caseObj("TonedPill", fields);
1104
+ }
1076
1105
  case "Progress":
1077
1106
  return caseObj("Progress", [
1078
1107
  ["fractionFn", CLOSURE],
@@ -2997,14 +3026,18 @@ var EMPHASIS_ALIASES = {
2997
3026
  Subtle: "Quiet",
2998
3027
  Muted: "Quiet"
2999
3028
  };
3029
+ var TONE_NAMES = [
3030
+ "Default",
3031
+ "Subdued",
3032
+ "Brand",
3033
+ "Success",
3034
+ "Warning",
3035
+ "Critical",
3036
+ "Info"
3037
+ ];
3000
3038
  var decodeTone = (p, j) => {
3001
3039
  if (j.kind === "JString" && j.value in TONE_ALIASES) return ok(TONE_ALIASES[j.value]);
3002
- return bareEnum(
3003
- p,
3004
- j,
3005
- ["Default", "Subdued", "Brand", "Success", "Warning", "Critical", "Info"],
3006
- "ToneVariant"
3007
- );
3040
+ return bareEnum(p, j, TONE_NAMES, "ToneVariant");
3008
3041
  };
3009
3042
  var decodeWeight = (p, j) => (
3010
3043
  // StyleWeight deliberately not aliased — `Bold`/`Heavy` is font-weight intent, but
@@ -4339,6 +4372,41 @@ var decodeBindingFloatPair = (p, j) => {
4339
4372
  }
4340
4373
  return decodeBinding(p, j, parseStaticFloatPair, [0, 0]);
4341
4374
  };
4375
+ var parseStaticStringPair = (p, v) => {
4376
+ const ordered = (a, b) => a > b ? makeError(
4377
+ "WRONG_TYPE",
4378
+ p,
4379
+ `date-range start '${a}' is after end '${b}' \u2014 a DateRange pair is ordered (from <= to); ISO-8601 strings of one variant compare lexicographically, so swap the two values`,
4380
+ 'ordered ISO-8601 pair ({"from": <iso>, "to": <iso>} with from <= to)'
4381
+ ) : ok([a, b]);
4382
+ if (v.kind === "JObject") {
4383
+ const from = v.fields.get("from");
4384
+ const to = v.fields.get("to");
4385
+ if (from !== void 0 && to !== void 0) {
4386
+ const a = requireString(`${p}.from`, from);
4387
+ if (!a.ok) return a;
4388
+ const b = requireString(`${p}.to`, to);
4389
+ if (!b.ok) return b;
4390
+ return ordered(a.value, b.value);
4391
+ }
4392
+ return wrongType(p, "object with from and to ISO-8601 strings");
4393
+ }
4394
+ if (v.kind === "JArray" && v.items.length === 2) {
4395
+ const a = requireString(`${p}[0]`, v.items[0]);
4396
+ if (!a.ok) return a;
4397
+ const b = requireString(`${p}[1]`, v.items[1]);
4398
+ if (!b.ok) return b;
4399
+ return ordered(a.value, b.value);
4400
+ }
4401
+ return wrongType(p, "date-range pair ({from, to} object or [from, to] array)");
4402
+ };
4403
+ var decodeBindingStringPair = (p, j) => {
4404
+ if (j.kind === "JObject" && j.fields.get("$type") === void 0 && j.fields.get("from") !== void 0 && j.fields.get("to") !== void 0) {
4405
+ const parsed = parseStaticStringPair(p, j);
4406
+ return parsed.ok ? ok({ kind: "Static", value: parsed.value }) : parsed;
4407
+ }
4408
+ return decodeBinding(p, j, parseStaticStringPair, ["", ""]);
4409
+ };
4342
4410
  var parseStaticStringList = (p, v) => {
4343
4411
  if (v.kind === "JNull") return ok([]);
4344
4412
  if (v.kind === "JString" && v.value === OPAQUE2) return ok([OPAQUE2]);
@@ -5186,6 +5254,7 @@ var decodeDisplayKind = (path, j) => {
5186
5254
  );
5187
5255
  }
5188
5256
  };
5257
+ var WRONG_FORM_FIELD_KIND_HINT = schema.FORM_FIELD_KIND_NAMES.join(" | ");
5189
5258
  var decodeFormFieldKind = (autoBind, path, j) => {
5190
5259
  const fo = requireObject(path, j);
5191
5260
  if (!fo.ok) return fo;
@@ -5335,12 +5404,35 @@ var decodeFormFieldKind = (autoBind, path, j) => {
5335
5404
  }
5336
5405
  });
5337
5406
  }
5338
- default:
5339
- return unknownDuCase(
5340
- path,
5341
- d.value,
5342
- "Text | Number | Checkbox | Choice | Range | RangedNumber | SegmentedChoice | TextArea | Date"
5407
+ case "DateRange": {
5408
+ const value = valueOr(
5409
+ decodeBindingStringPair,
5410
+ schema.controlValueDefaults.dateRange,
5411
+ "Binding<[from, to]> ISO-8601 pair value"
5343
5412
  );
5413
+ if (!value.ok) return value;
5414
+ const variant = reqField(path, f, "variant", "DateVariant", decodeDateVariant);
5415
+ if (!variant.ok) return variant;
5416
+ const min = optField(path, f, "min", requireString);
5417
+ if (!min.ok) return min;
5418
+ const max = optField(path, f, "max", requireString);
5419
+ if (!max.ok) return max;
5420
+ const step = optField(path, f, "step", requireFloat);
5421
+ if (!step.ok) return step;
5422
+ return ok({
5423
+ kind: "DateRange",
5424
+ value: value.value,
5425
+ ...onChangeField,
5426
+ variant: variant.value,
5427
+ constraints: {
5428
+ ...min.value !== void 0 ? { min: min.value } : {},
5429
+ ...max.value !== void 0 ? { max: max.value } : {},
5430
+ ...step.value !== void 0 ? { step: step.value } : {}
5431
+ }
5432
+ });
5433
+ }
5434
+ default:
5435
+ return unknownDuCase(path, d.value, WRONG_FORM_FIELD_KIND_HINT);
5344
5436
  }
5345
5437
  };
5346
5438
  var decodeFormField = (path, j) => {
@@ -5543,6 +5635,56 @@ var decodeInputKind = (path, j) => {
5543
5635
  return unknownDuCase(path, d.value, "Form | Filters | Button | FileUpload | Select");
5544
5636
  }
5545
5637
  };
5638
+ var decodeToneMap = (path, j) => {
5639
+ const fo = requireObject(path, j);
5640
+ if (!fo.ok) return fo;
5641
+ const out = {};
5642
+ for (const [k, v] of fo.value) {
5643
+ const entryPath = `${path}.${k}`;
5644
+ const t = decodeTone(entryPath, v);
5645
+ if (!t.ok) {
5646
+ if (t.error.code !== "UNKNOWN_DU_CASE") return t;
5647
+ const got = v.kind === "JString" ? v.value : "";
5648
+ return makeError(
5649
+ "UNKNOWN_DU_CASE",
5650
+ entryPath,
5651
+ `tone-map value '${got}' for '${k}' is not a ToneVariant`,
5652
+ TONE_NAMES.join(" | ")
5653
+ );
5654
+ }
5655
+ out[k] = t.value;
5656
+ }
5657
+ return ok(out);
5658
+ };
5659
+ var TONE_MAP_KEYS = ["map", "toneMap", "tones"];
5660
+ var decodeTonedPill = (path, f) => {
5661
+ const field2 = reqField(
5662
+ path,
5663
+ f,
5664
+ "field",
5665
+ "TonedPill row-field name (drives the label and the map key)",
5666
+ requireString
5667
+ );
5668
+ if (!field2.ok) return field2;
5669
+ const map = reqFieldAliased(
5670
+ path,
5671
+ f,
5672
+ "map",
5673
+ ["toneMap", "tones"],
5674
+ "TonedPill value\u2192ToneVariant map",
5675
+ decodeToneMap
5676
+ );
5677
+ if (!map.ok) return map;
5678
+ const defaultTone = optField(path, f, "default", decodeTone);
5679
+ if (!defaultTone.ok) return defaultTone;
5680
+ const k = {
5681
+ kind: "TonedPill",
5682
+ field: field2.value,
5683
+ map: map.value,
5684
+ defaultTone: defaultTone.value ?? "Default"
5685
+ };
5686
+ return ok(k);
5687
+ };
5546
5688
  var decodeCellKindErased = (path, j) => {
5547
5689
  const fo = requireObject(path, j);
5548
5690
  if (!fo.ok) return fo;
@@ -5595,6 +5737,8 @@ var decodeCellKindErased = (path, j) => {
5595
5737
  return ok(k);
5596
5738
  }
5597
5739
  case "Pill": {
5740
+ if (TONE_MAP_KEYS.some((key) => tryField(f, key) !== void 0))
5741
+ return decodeTonedPill(path, f);
5598
5742
  const k = {
5599
5743
  kind: "Pill",
5600
5744
  label: () => ({ kind: "Literal", value: CLOSURE2 }),
@@ -5602,6 +5746,8 @@ var decodeCellKindErased = (path, j) => {
5602
5746
  };
5603
5747
  return ok(k);
5604
5748
  }
5749
+ case "TonedPill":
5750
+ return decodeTonedPill(path, f);
5605
5751
  case "Progress": {
5606
5752
  const k = { kind: "Progress", fraction: () => 0 };
5607
5753
  return ok(k);
@@ -5617,7 +5763,7 @@ var decodeCellKindErased = (path, j) => {
5617
5763
  return unknownDuCase(
5618
5764
  path,
5619
5765
  d.value,
5620
- "Text | Numeric | Date | Editable | Checkbox | Button | ButtonGroup | Link | Pill | Progress | Custom"
5766
+ "Text | Numeric | Date | Editable | Checkbox | Button | ButtonGroup | Link | Pill | TonedPill | Progress | Custom"
5621
5767
  );
5622
5768
  }
5623
5769
  };
@@ -6302,6 +6448,13 @@ var decodeEffectClass = (path, j) => {
6302
6448
  );
6303
6449
  return ok({ hostEffect: host.value, determinism: det.value });
6304
6450
  };
6451
+ var WRONG_NODE_KIND_HINT = (() => {
6452
+ const primitives = schema.NODE_KIND_GROUPS.filter((g) => g.label !== "Structural").map(
6453
+ (g) => `${"AEIOU".includes(g.label[0]) ? "an" : "a"} ${g.label} primitive (${g.kinds.join(" | ")})`
6454
+ ).join(", ");
6455
+ const structural = schema.NODE_KIND_GROUPS.find((g) => g.label === "Structural")?.kinds ?? [];
6456
+ return `${primitives}, or ${structural.join(" | ")}`;
6457
+ })();
6305
6458
  var decodeNodeKind = (path, j) => {
6306
6459
  const fo = requireObject(path, j);
6307
6460
  if (!fo.ok) return fo;
@@ -6556,7 +6709,7 @@ var decodeNodeKind = (path, j) => {
6556
6709
  "WRONG_NODE_KIND",
6557
6710
  `${path}.$type`,
6558
6711
  `unknown NodeKind discriminator '${d.value}'`,
6559
- "a Layout primitive (Box | SplitPanel | Tabs | Stepper | SummaryList | Disclosure | Modal | ScrollArea), a Display primitive (Heading | Markdown | Metric | Badge | Sparkline | Callout | Progress | Skeleton | LabelValueRow | Link | Image | List | Toast), an Input primitive (Form | Filters | Button | FileUpload | Select), a Visualisation primitive (DataGrid | Chart | Map), or Custom | ErrorBoundary | FragmentDecl | FragmentRef | Mount"
6712
+ WRONG_NODE_KIND_HINT
6560
6713
  );
6561
6714
  }
6562
6715
  };