@synopackageland/ui 0.19.10 → 0.20.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/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.20.0 (2026-11-04)
4
+
5
+ - `PageContent height="fill"` gives its height to a `SectionTabs fill` or a `SettingsPage` however deeply the App wraps it: every element between the page body and that component becomes a flex column that takes the room its siblings leave, so an App needs no CSS of its own to pass the height through its page wrappers. A hidden wrapper (`v-show`, `hidden`) stays hidden.
6
+ - In such a page, a `SectionTabs fill` tab that is not a `SettingsPage` scrolls under the fixed strip instead of running past the page's bottom; a `SettingsPage` tab still scrolls only its own body over its footer.
7
+ - [Layout rules](docs/layout-rules.md) describe the current page layout: no page title under a sidebar that names the page, the page's buttons in a bar above it, and only the content scrolling. A migration section lists the CSS an App can drop.
8
+ - Fix long `Select` and `Combobox` lists showing no scrollbar, so a list that scrolls no longer looked cut off. Reka hides the native bar inside its list viewports; the DSM scrollbar is drawn there again, in light and dark, while `ScrollArea` keeps hiding its own bar.
9
+
10
+ ## 0.19.11 (2026-11-03)
11
+
12
+ - `Progress` draws its track as a faint tint of its own tone (`--ui-primary-soft`, `--ui-success-soft`, `--ui-warning-soft`, `--ui-danger-soft`) instead of the grey border colour, so a bar never sits on a grey track.
13
+ - `Progress` takes `indeterminate` for a total that is not known yet, such as a download whose size the server has not sent: a segment slides along the track, `aria-valuenow` is left out and no percentage is shown. With reduced motion the segment rests across the track, dimmed.
14
+
3
15
  ## 0.19.10 (2026-11-03)
4
16
 
5
17
  - `ConnectionTopology` takes `cards` and `layout`. With `cards`, every lane is a card of one height (the tallest sets it) with node boxes of one size, each link word is centred on its own segment (one word on the middle of a lane with no relay), and the lines are solid or dashed instead of flowing dots. `layout="columns"` sets the cards side by side from 560px of container width. Without `cards` nothing changes. The real-browser check measures card heights, node boxes and word centres.
package/README.md CHANGED
@@ -437,6 +437,12 @@ under its sticky header, with the pager always in view. Pages that are not
437
437
  `fill` in the same layout scroll as before. In the SDK's `AppShell`, the same
438
438
  is a page's `fill: true`.
439
439
 
440
+ A settings page fills the same way: `PageContent height="fill"` gives the
441
+ height to a `SectionTabs fill` or a `SettingsPage` through the App's own
442
+ wrapper elements, with no CSS of their own. The tab strip and the footer stay,
443
+ only the sections scroll, and a tab that is not a `SettingsPage` scrolls under
444
+ the strip. The SDK's `AppShell` fills such a page by itself.
445
+
440
446
  ```vue
441
447
  <AppLayout height="fill" min-height="0">
442
448
  <template #sidebar>…</template>
@@ -964,8 +970,8 @@ Use the pnpm version specified in `package.json`.
964
970
  ```bash
965
971
  pnpm story # component workbench
966
972
  pnpm dev # rebuild dist when library source changes
967
- pnpm check # production build, then lint, typecheck and tests in parallel, then the package audit
968
- pnpm check:fast # as check, but only the tests the changes since origin/master reach (vitest --changed)
973
+ npm run gates # basic build, lint, typecheck, unit tests, notices and package audit
974
+ npm run gates:full # optional browser/workbench/registry integrations, only when requested
969
975
  pnpm story:build # build the component workbench
970
976
  pnpm check:host # after pnpm build: DSM host simulation screenshots (Chrome)
971
977
  pnpm check:date-picker # after pnpm build: app-local calendars, Dialog Escape and full-bleed pages (ego-browser)
@@ -973,8 +979,9 @@ pnpm check:switch # after pnpm build: Switch knob geometry and click toggling (C
973
979
  pnpm check:topology # after pnpm build: ConnectionTopology motion, keyboard and narrow layout (Chrome)
974
980
  ```
975
981
 
976
- Use `pnpm check:fast` while developing (`SYNOPKGLAND_GATE_BASE` sets the base),
977
- and `pnpm check` once before a release: the full run is the release gate.
982
+ Use `npm run gates` for development and release. Extended checks require an
983
+ explicit `npm run gates:full`; full is optional. `pnpm check` and `check:fast`
984
+ are basic aliases. See [release checks](docs/release-checks.md).
978
985
  `check` prints one line per passing task and a failing task's whole log.
979
986
 
980
987
  With `SYNOPKGLAND_DOCKER_SSH=<ssh host>`, `pnpm check`, `check:fast` and
@@ -1044,12 +1051,11 @@ See the [documentation](https://www.varvis.me/docs/) for usage.
1044
1051
 
1045
1052
  ### CI and tag releases
1046
1053
 
1047
- GitHub Actions runs on Ubuntu for pushes to `master` and `ci/**`, pull requests,
1048
- and manual dispatch. Both workflows share `.github/actions/verify`: a frozen
1049
- pnpm install from npmjs, `pnpm check` (build, lint, typecheck, unit tests and the
1050
- package-content audit), `notices:check`, responsive/host/switch/layout/motion
1051
- browser checks, and the Histoire workbench build. pnpm and Playwright Chromium
1052
- are cached. Browser screenshots and measurements are retained for seven days.
1054
+ Automatic CI runs basic checks. The disabled CI/release workflow templates
1055
+ share `.github/actions/verify`: frozen dependency installation and
1056
+ `npm run gates` (build, lint, typecheck, unit tests, notices and package audit).
1057
+ Browser integrations, workbench builds and registry consumer smoke require
1058
+ `npm run gates:full` only when explicitly requested.
1053
1059
 
1054
1060
  To release the package:
1055
1061
 
@@ -1066,8 +1072,8 @@ To release the package:
1066
1072
  ```
1067
1073
 
1068
1074
  The release workflow checks the exact tag/version, default-branch ancestry,
1069
- nonempty changelog section and npm version availability. It runs the same full
1070
- CI gates, stages the package into an empty directory, packs it, and audits
1075
+ nonempty changelog section and npm version availability. It runs the same basic
1076
+ checks, stages the package into an empty directory, packs it, and audits
1071
1077
  the actual tarball (every exported dist file, MIT license, notices, bundled Reka,
1072
1078
  package name and no `publishConfig`). A separate job rechecks the artifact and
1073
1079
  registry before publishing with `NPM_TOKEN`, then creates a GitHub Release from
@@ -1077,7 +1083,7 @@ If npm publication succeeds but GitHub Release creation fails, create the Releas
1077
1083
  from the changelog separately; rerunning publishing intentionally refuses the
1078
1084
  already published version.
1079
1085
 
1080
- On branches and PRs, the release workflow performs the full pipeline through
1086
+ On branches and PRs, the release workflow performs basic validation through
1081
1087
  `npm publish <tgz> --dry-run --access public --ignore-scripts`, without npm
1082
1088
  credentials or creating a GitHub Release. An existing npm version is allowed only
1083
1089
  in dry-run mode and is reported explicitly; npm 11 also rejects duplicate versions
@@ -8,11 +8,14 @@ type __VLS_Props = {
8
8
  tone?: 'primary' | 'success' | 'warning' | 'danger';
9
9
  /** `sm` is a 4px line that fits under a label in a dense table row. */
10
10
  size?: 'md' | 'sm';
11
+ /** The total is not known yet: a segment moves along the track and no value is shown. */
12
+ indeterminate?: boolean;
11
13
  };
12
14
  declare const __VLS_export: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {
13
15
  size: "md" | "sm";
14
16
  value: number;
15
17
  max: number;
18
+ indeterminate: boolean;
16
19
  tone: "primary" | "success" | "warning" | "danger";
17
20
  }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
18
21
  declare const _default: typeof __VLS_export;
package/dist/index.js CHANGED
@@ -21017,9 +21017,10 @@ const Zc = "z-[1450] max-w-72 rounded-[var(--ui-radius-sm)] bg-[var(--ui-tooltip
21017
21017
  key: 0,
21018
21018
  class: "mb-1.5 flex justify-between gap-3 text-[12px] text-[var(--ui-text-secondary)]"
21019
21019
  }, OC = {
21020
+ key: 0,
21020
21021
  "data-ui-progress-value": "",
21021
21022
  class: "tabular-nums"
21022
- }, IC = ["aria-valuenow", "aria-valuemax", "aria-label", "data-tone"], Jc = /* @__PURE__ */ O({
21023
+ }, IC = ["aria-valuenow", "aria-valuemax", "aria-label", "data-tone", "data-indeterminate"], Jc = /* @__PURE__ */ O({
21023
21024
  inheritAttrs: !1,
21024
21025
  __name: "Progress",
21025
21026
  props: {
@@ -21028,37 +21029,48 @@ const Zc = "z-[1450] max-w-72 rounded-[var(--ui-radius-sm)] bg-[var(--ui-tooltip
21028
21029
  label: {},
21029
21030
  valueLabel: {},
21030
21031
  tone: { default: "primary" },
21031
- size: { default: "md" }
21032
+ size: { default: "md" },
21033
+ indeterminate: { type: Boolean, default: !1 }
21032
21034
  },
21033
21035
  setup(e) {
21034
- const a = In(), t = () => Object.fromEntries(Object.entries(a).filter(([l]) => l !== "class" && l !== "style")), n = e, o = {
21036
+ const a = In(), t = () => Object.fromEntries(Object.entries(a).filter(([s]) => s !== "class" && s !== "style")), n = e, o = {
21035
21037
  primary: "bg-[var(--ui-primary)]",
21036
21038
  success: "bg-[var(--ui-success)]",
21037
21039
  warning: "bg-[var(--ui-warning)]",
21038
21040
  danger: "bg-[var(--ui-danger)]"
21039
- }, r = y(() => n.max <= 0 ? 0 : Math.min(100, Math.max(0, n.value / n.max * 100)));
21040
- return (l, s) => (d(), g("div", {
21041
+ }, r = {
21042
+ primary: "bg-[var(--ui-primary-soft)]",
21043
+ success: "bg-[var(--ui-success-soft)]",
21044
+ warning: "bg-[var(--ui-warning-soft)]",
21045
+ danger: "bg-[var(--ui-danger-soft)]"
21046
+ }, l = y(() => n.max <= 0 ? 0 : Math.min(100, Math.max(0, n.value / n.max * 100)));
21047
+ return (s, u) => (d(), g("div", {
21041
21048
  class: Q(i(a).class),
21042
21049
  style: Ce(i(a).style),
21043
21050
  "data-syno-pkg-land-ui": ""
21044
21051
  }, [
21045
21052
  e.label || e.valueLabel ? (d(), g("div", qC, [
21046
21053
  B("span", null, K(e.label), 1),
21047
- B("span", OC, K(e.valueLabel ?? `${Math.round(r.value)}%`), 1)
21054
+ e.valueLabel !== void 0 || !e.indeterminate ? (d(), g("span", OC, K(e.valueLabel ?? `${Math.round(l.value)}%`), 1)) : A("", !0)
21048
21055
  ])) : A("", !0),
21049
21056
  B("div", ie({
21050
- class: ["overflow-hidden rounded-full bg-[var(--ui-border-subtle)]", e.size === "sm" ? "h-1" : "h-1.5"],
21057
+ class: ["overflow-hidden rounded-full", r[e.tone], e.size === "sm" ? "h-1" : "h-1.5"],
21051
21058
  role: "progressbar",
21052
- "aria-valuenow": n.value,
21059
+ "aria-valuenow": e.indeterminate ? void 0 : n.value,
21053
21060
  "aria-valuemin": 0,
21054
21061
  "aria-valuemax": n.max,
21055
21062
  "aria-label": e.label,
21056
- "data-tone": e.tone
21063
+ "data-tone": e.tone,
21064
+ "data-indeterminate": e.indeterminate ? "" : void 0
21057
21065
  }, t()), [
21058
- B("div", {
21066
+ e.indeterminate ? (d(), g("div", {
21067
+ key: 0,
21068
+ class: Q(["ui-progress-indeterminate h-full rounded-full", o[e.tone]])
21069
+ }, null, 2)) : (d(), g("div", {
21070
+ key: 1,
21059
21071
  class: Q(["h-full rounded-full transition-[width] duration-[var(--ui-motion-normal)]", o[e.tone]]),
21060
- style: Ce({ width: `${r.value}%` })
21061
- }, null, 6)
21072
+ style: Ce({ width: `${l.value}%` })
21073
+ }, null, 6))
21062
21074
  ], 16, IC)
21063
21075
  ], 6));
21064
21076
  }
@@ -375,6 +375,7 @@ export declare const synoJsonComponentDefinitions: {
375
375
  success: "success";
376
376
  warning: "warning";
377
377
  }>>;
378
+ indeterminate: z.ZodOptional<z.ZodBoolean>;
378
379
  }, z.core.$strip>;
379
380
  description: string;
380
381
  };
@@ -917,6 +918,7 @@ export declare const synoJsonCatalog: import('@json-render/core').Catalog<{
917
918
  success: "success";
918
919
  warning: "warning";
919
920
  }>>;
921
+ indeterminate: z.ZodOptional<z.ZodBoolean>;
920
922
  }, z.core.$strip>;
921
923
  description: string;
922
924
  };
@@ -395,6 +395,7 @@ export declare const synoJsonRenderers: {
395
395
  success: "success";
396
396
  warning: "warning";
397
397
  }>>;
398
+ indeterminate: import('zod').ZodOptional<import('zod').ZodBoolean>;
398
399
  }, import('zod/v4/core').$strip>;
399
400
  description: string;
400
401
  };
@@ -941,6 +942,7 @@ export declare const synoJsonRenderers: {
941
942
  success: "success";
942
943
  warning: "warning";
943
944
  }>>;
945
+ indeterminate: import('zod').ZodOptional<import('zod').ZodBoolean>;
944
946
  }, import('zod/v4/core').$strip>;
945
947
  description: string;
946
948
  };
@@ -1487,6 +1489,7 @@ export declare const synoJsonRenderers: {
1487
1489
  success: "success";
1488
1490
  warning: "warning";
1489
1491
  }>>;
1492
+ indeterminate: import('zod').ZodOptional<import('zod').ZodBoolean>;
1490
1493
  }, import('zod/v4/core').$strip>;
1491
1494
  description: string;
1492
1495
  };
@@ -2033,6 +2036,7 @@ export declare const synoJsonRenderers: {
2033
2036
  success: "success";
2034
2037
  warning: "warning";
2035
2038
  }>>;
2039
+ indeterminate: import('zod').ZodOptional<import('zod').ZodBoolean>;
2036
2040
  }, import('zod/v4/core').$strip>;
2037
2041
  description: string;
2038
2042
  };
@@ -2579,6 +2583,7 @@ export declare const synoJsonRenderers: {
2579
2583
  success: "success";
2580
2584
  warning: "warning";
2581
2585
  }>>;
2586
+ indeterminate: import('zod').ZodOptional<import('zod').ZodBoolean>;
2582
2587
  }, import('zod/v4/core').$strip>;
2583
2588
  description: string;
2584
2589
  };
@@ -3125,6 +3130,7 @@ export declare const synoJsonRenderers: {
3125
3130
  success: "success";
3126
3131
  warning: "warning";
3127
3132
  }>>;
3133
+ indeterminate: import('zod').ZodOptional<import('zod').ZodBoolean>;
3128
3134
  }, import('zod/v4/core').$strip>;
3129
3135
  description: string;
3130
3136
  };
@@ -3671,6 +3677,7 @@ export declare const synoJsonRenderers: {
3671
3677
  success: "success";
3672
3678
  warning: "warning";
3673
3679
  }>>;
3680
+ indeterminate: import('zod').ZodOptional<import('zod').ZodBoolean>;
3674
3681
  }, import('zod/v4/core').$strip>;
3675
3682
  description: string;
3676
3683
  };
@@ -4217,6 +4224,7 @@ export declare const synoJsonRenderers: {
4217
4224
  success: "success";
4218
4225
  warning: "warning";
4219
4226
  }>>;
4227
+ indeterminate: import('zod').ZodOptional<import('zod').ZodBoolean>;
4220
4228
  }, import('zod/v4/core').$strip>;
4221
4229
  description: string;
4222
4230
  };
@@ -4763,6 +4771,7 @@ export declare const synoJsonRenderers: {
4763
4771
  success: "success";
4764
4772
  warning: "warning";
4765
4773
  }>>;
4774
+ indeterminate: import('zod').ZodOptional<import('zod').ZodBoolean>;
4766
4775
  }, import('zod/v4/core').$strip>;
4767
4776
  description: string;
4768
4777
  };
@@ -5309,6 +5318,7 @@ export declare const synoJsonRenderers: {
5309
5318
  success: "success";
5310
5319
  warning: "warning";
5311
5320
  }>>;
5321
+ indeterminate: import('zod').ZodOptional<import('zod').ZodBoolean>;
5312
5322
  }, import('zod/v4/core').$strip>;
5313
5323
  description: string;
5314
5324
  };
@@ -5855,6 +5865,7 @@ export declare const synoJsonRenderers: {
5855
5865
  success: "success";
5856
5866
  warning: "warning";
5857
5867
  }>>;
5868
+ indeterminate: import('zod').ZodOptional<import('zod').ZodBoolean>;
5858
5869
  }, import('zod/v4/core').$strip>;
5859
5870
  description: string;
5860
5871
  };
@@ -6401,6 +6412,7 @@ export declare const synoJsonRenderers: {
6401
6412
  success: "success";
6402
6413
  warning: "warning";
6403
6414
  }>>;
6415
+ indeterminate: import('zod').ZodOptional<import('zod').ZodBoolean>;
6404
6416
  }, import('zod/v4/core').$strip>;
6405
6417
  description: string;
6406
6418
  };
@@ -6947,6 +6959,7 @@ export declare const synoJsonRenderers: {
6947
6959
  success: "success";
6948
6960
  warning: "warning";
6949
6961
  }>>;
6962
+ indeterminate: import('zod').ZodOptional<import('zod').ZodBoolean>;
6950
6963
  }, import('zod/v4/core').$strip>;
6951
6964
  description: string;
6952
6965
  };
@@ -7493,6 +7506,7 @@ export declare const synoJsonRenderers: {
7493
7506
  success: "success";
7494
7507
  warning: "warning";
7495
7508
  }>>;
7509
+ indeterminate: import('zod').ZodOptional<import('zod').ZodBoolean>;
7496
7510
  }, import('zod/v4/core').$strip>;
7497
7511
  description: string;
7498
7512
  };
@@ -8039,6 +8053,7 @@ export declare const synoJsonRenderers: {
8039
8053
  success: "success";
8040
8054
  warning: "warning";
8041
8055
  }>>;
8056
+ indeterminate: import('zod').ZodOptional<import('zod').ZodBoolean>;
8042
8057
  }, import('zod/v4/core').$strip>;
8043
8058
  description: string;
8044
8059
  };
@@ -8585,6 +8600,7 @@ export declare const synoJsonRenderers: {
8585
8600
  success: "success";
8586
8601
  warning: "warning";
8587
8602
  }>>;
8603
+ indeterminate: import('zod').ZodOptional<import('zod').ZodBoolean>;
8588
8604
  }, import('zod/v4/core').$strip>;
8589
8605
  description: string;
8590
8606
  };
@@ -9131,6 +9147,7 @@ export declare const synoJsonRenderers: {
9131
9147
  success: "success";
9132
9148
  warning: "warning";
9133
9149
  }>>;
9150
+ indeterminate: import('zod').ZodOptional<import('zod').ZodBoolean>;
9134
9151
  }, import('zod/v4/core').$strip>;
9135
9152
  description: string;
9136
9153
  };
@@ -9677,6 +9694,7 @@ export declare const synoJsonRenderers: {
9677
9694
  success: "success";
9678
9695
  warning: "warning";
9679
9696
  }>>;
9697
+ indeterminate: import('zod').ZodOptional<import('zod').ZodBoolean>;
9680
9698
  }, import('zod/v4/core').$strip>;
9681
9699
  description: string;
9682
9700
  };
@@ -10223,6 +10241,7 @@ export declare const synoJsonRenderers: {
10223
10241
  success: "success";
10224
10242
  warning: "warning";
10225
10243
  }>>;
10244
+ indeterminate: import('zod').ZodOptional<import('zod').ZodBoolean>;
10226
10245
  }, import('zod/v4/core').$strip>;
10227
10246
  description: string;
10228
10247
  };
@@ -10769,6 +10788,7 @@ export declare const synoJsonRenderers: {
10769
10788
  success: "success";
10770
10789
  warning: "warning";
10771
10790
  }>>;
10791
+ indeterminate: import('zod').ZodOptional<import('zod').ZodBoolean>;
10772
10792
  }, import('zod/v4/core').$strip>;
10773
10793
  description: string;
10774
10794
  };
@@ -11315,6 +11335,7 @@ export declare const synoJsonRenderers: {
11315
11335
  success: "success";
11316
11336
  warning: "warning";
11317
11337
  }>>;
11338
+ indeterminate: import('zod').ZodOptional<import('zod').ZodBoolean>;
11318
11339
  }, import('zod/v4/core').$strip>;
11319
11340
  description: string;
11320
11341
  };
@@ -11861,6 +11882,7 @@ export declare const synoJsonRenderers: {
11861
11882
  success: "success";
11862
11883
  warning: "warning";
11863
11884
  }>>;
11885
+ indeterminate: import('zod').ZodOptional<import('zod').ZodBoolean>;
11864
11886
  }, import('zod/v4/core').$strip>;
11865
11887
  description: string;
11866
11888
  };
@@ -12407,6 +12429,7 @@ export declare const synoJsonRenderers: {
12407
12429
  success: "success";
12408
12430
  warning: "warning";
12409
12431
  }>>;
12432
+ indeterminate: import('zod').ZodOptional<import('zod').ZodBoolean>;
12410
12433
  }, import('zod/v4/core').$strip>;
12411
12434
  description: string;
12412
12435
  };
@@ -12953,6 +12976,7 @@ export declare const synoJsonRenderers: {
12953
12976
  success: "success";
12954
12977
  warning: "warning";
12955
12978
  }>>;
12979
+ indeterminate: import('zod').ZodOptional<import('zod').ZodBoolean>;
12956
12980
  }, import('zod/v4/core').$strip>;
12957
12981
  description: string;
12958
12982
  };
@@ -13499,6 +13523,7 @@ export declare const synoJsonRenderers: {
13499
13523
  success: "success";
13500
13524
  warning: "warning";
13501
13525
  }>>;
13526
+ indeterminate: import('zod').ZodOptional<import('zod').ZodBoolean>;
13502
13527
  }, import('zod/v4/core').$strip>;
13503
13528
  description: string;
13504
13529
  };
@@ -14045,6 +14070,7 @@ export declare const synoJsonRenderers: {
14045
14070
  success: "success";
14046
14071
  warning: "warning";
14047
14072
  }>>;
14073
+ indeterminate: import('zod').ZodOptional<import('zod').ZodBoolean>;
14048
14074
  }, import('zod/v4/core').$strip>;
14049
14075
  description: string;
14050
14076
  };
@@ -14591,6 +14617,7 @@ export declare const synoJsonRenderers: {
14591
14617
  success: "success";
14592
14618
  warning: "warning";
14593
14619
  }>>;
14620
+ indeterminate: import('zod').ZodOptional<import('zod').ZodBoolean>;
14594
14621
  }, import('zod/v4/core').$strip>;
14595
14622
  description: string;
14596
14623
  };
@@ -15137,6 +15164,7 @@ export declare const synoJsonRenderers: {
15137
15164
  success: "success";
15138
15165
  warning: "warning";
15139
15166
  }>>;
15167
+ indeterminate: import('zod').ZodOptional<import('zod').ZodBoolean>;
15140
15168
  }, import('zod/v4/core').$strip>;
15141
15169
  description: string;
15142
15170
  };
@@ -15683,6 +15711,7 @@ export declare const synoJsonRenderers: {
15683
15711
  success: "success";
15684
15712
  warning: "warning";
15685
15713
  }>>;
15714
+ indeterminate: import('zod').ZodOptional<import('zod').ZodBoolean>;
15686
15715
  }, import('zod/v4/core').$strip>;
15687
15716
  description: string;
15688
15717
  };
@@ -16229,6 +16258,7 @@ export declare const synoJsonRenderers: {
16229
16258
  success: "success";
16230
16259
  warning: "warning";
16231
16260
  }>>;
16261
+ indeterminate: import('zod').ZodOptional<import('zod').ZodBoolean>;
16232
16262
  }, import('zod/v4/core').$strip>;
16233
16263
  description: string;
16234
16264
  };
@@ -16775,6 +16805,7 @@ export declare const synoJsonRenderers: {
16775
16805
  success: "success";
16776
16806
  warning: "warning";
16777
16807
  }>>;
16808
+ indeterminate: import('zod').ZodOptional<import('zod').ZodBoolean>;
16778
16809
  }, import('zod/v4/core').$strip>;
16779
16810
  description: string;
16780
16811
  };
@@ -17321,6 +17352,7 @@ export declare const synoJsonRenderers: {
17321
17352
  success: "success";
17322
17353
  warning: "warning";
17323
17354
  }>>;
17355
+ indeterminate: import('zod').ZodOptional<import('zod').ZodBoolean>;
17324
17356
  }, import('zod/v4/core').$strip>;
17325
17357
  description: string;
17326
17358
  };
@@ -17867,6 +17899,7 @@ export declare const synoJsonRenderers: {
17867
17899
  success: "success";
17868
17900
  warning: "warning";
17869
17901
  }>>;
17902
+ indeterminate: import('zod').ZodOptional<import('zod').ZodBoolean>;
17870
17903
  }, import('zod/v4/core').$strip>;
17871
17904
  description: string;
17872
17905
  };
@@ -18413,6 +18446,7 @@ export declare const synoJsonRenderers: {
18413
18446
  success: "success";
18414
18447
  warning: "warning";
18415
18448
  }>>;
18449
+ indeterminate: import('zod').ZodOptional<import('zod').ZodBoolean>;
18416
18450
  }, import('zod/v4/core').$strip>;
18417
18451
  description: string;
18418
18452
  };
@@ -73,7 +73,7 @@ AVAILABLE COMPONENTS (34):
73
73
  - Card: { title?: string, layoutType?: "regular" | "compact", expandable?: boolean, expanded?: boolean, footerAlign?: "start" | "end" | "between" } - Grouped content with optional header/actions/footer. Do not use a Card just to add spacing. [accepts children; slots: header-actions, footer] [events: expandedChange]
74
74
  - Callout: { tone?: "info" | "success" | "warning" | "danger", variant?: "soft" | "inline", title?: string, dismissible?: boolean, dismissKey?: string, code?: string, fill?: boolean } - A message that stays until its cause goes away: something to act on (a one-line title, at most one line of text, one action in `actions`) or a short risk note (`variant: inline`, longer text in `details` behind Learn more). The reader can close it (default); it comes back when its text changes, and `dismissible: false` keeps only a blocking requirement in view. A passing result such as Saved is a toast, not a Callout. Callout text has no closing period. Put a machine error code in `code`, not in the text. [accepts children; slots: actions, details] [events: close]
75
75
  - EmptyState: { title: string, description?: string, icon?: string } - Empty/no-results state with optional recovery or create actions. [slots: actions]
76
- - Progress: { value?: number, max?: number, label?: string, valueLabel?: string, tone?: "primary" | "success" | "warning" | "danger" } - Linear determinate progress. Domain-specific progress visualizations should be custom components.
76
+ - Progress: { value?: number, max?: number, label?: string, valueLabel?: string, tone?: "primary" | "success" | "warning" | "danger", indeterminate?: boolean } - Linear progress on a track tinted in its tone. indeterminate shows a moving segment while the total is unknown. Domain-specific progress visualizations should be custom components.
77
77
  - Badge: { text: string, tone?: "neutral" | "info" | "success" | "warning" | "danger" } - Short status/category badge.
78
78
  - Dialog: { open?: boolean, title?: string, description?: string, size?: "sm" | "md" | "lg" | "xl", width?: string, showClose?: boolean } - Modal task/dialog. Bind open to state. Put confirmation or form actions in footer. Without size it sizes to its content; size picks a DSM dialog width: sm one field, md a form with a text area, lg a wide form, xl tabs of settings. [accepts children; slots: footer] [events: openChange]
79
79
  - DataTable: { columns: Array<{ key: string, label: string, width?: string, type?: "text" | "number" | "date" | "actions", align?: "left" | "center" | "right" }>, rows: Array<Record<string, unknown>>, rowKey?: string, emptyText?: string, compact?: boolean, mobileView?: "auto" | "cards" | "table" } - Simple resource table where cells display scalar row fields. Use an app extension component for rich/custom cells and row actions.
@@ -2255,7 +2255,7 @@
2255
2255
  }
2256
2256
  },
2257
2257
  "then": {
2258
- "description": "Linear determinate progress. Domain-specific progress visualizations should be custom components.",
2258
+ "description": "Linear progress on a track tinted in its tone. indeterminate shows a moving segment while the total is unknown. Domain-specific progress visualizations should be custom components.",
2259
2259
  "properties": {
2260
2260
  "props": {
2261
2261
  "type": "object",
@@ -2315,6 +2315,16 @@
2315
2315
  "$ref": "#/$defs/expression"
2316
2316
  }
2317
2317
  ]
2318
+ },
2319
+ "indeterminate": {
2320
+ "anyOf": [
2321
+ {
2322
+ "type": "boolean"
2323
+ },
2324
+ {
2325
+ "$ref": "#/$defs/expression"
2326
+ }
2327
+ ]
2318
2328
  }
2319
2329
  },
2320
2330
  "additionalProperties": false