@protobase/schema 0.58.8 → 0.59.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.
@@ -61,7 +61,7 @@ export declare const displays: {
61
61
  * `approximate` field is true, or its `exact` field false: its marker is drawn hollow and says so, and close enough in
62
62
  * an area is drawn around it, the GeoJSON polygon or line its `area` field holds, else a circle of its `radius` field
63
63
  * in metres, else one of `defaultRadius`. Named `map` unless `name` says otherwise. See
64
- * [Approximate positions](website/src/content/docs/reference/ui-config.mdx#approximate-positions).
64
+ * [Approximate positions](docs/website/src/content/docs/reference/ui-config.mdx#approximate-positions).
65
65
  */
66
66
  map: (fields: {
67
67
  latitude: Ref;
@@ -85,7 +85,7 @@ export declare const displays: {
85
85
  * puts the card back and says why; with `drag: { board: 'name' }` only between the columns the UI config's board drop
86
86
  * of that name lists, each running its own write; with `drag: { rank: true }` a card moves within its column too. `by` must be
87
87
  * a filterable enum field. Named `board` unless `name` says otherwise. See
88
- * [Boards](website/src/content/docs/reference/ui-config.mdx#boards).
88
+ * [Boards](docs/website/src/content/docs/reference/ui-config.mdx#boards).
89
89
  */
90
90
  board: (fields: {
91
91
  by: Ref;
@@ -102,7 +102,7 @@ export declare const displays: {
102
102
  * the arrow keys, saves the record with `start` and `end` moved by the same days, as one update with its ETag, so the
103
103
  * resource's access rules and `validate` decide, and a refusal puts the event back and says why. `start` must be a
104
104
  * filterable date or timestamp field and `end` a filterable field of the same type. Named `calendar` unless `name`
105
- * says otherwise. See [Calendars](website/src/content/docs/reference/ui-config.mdx#calendars).
105
+ * says otherwise. See [Calendars](docs/website/src/content/docs/reference/ui-config.mdx#calendars).
106
106
  */
107
107
  calendar: (fields: {
108
108
  start: Ref;
@@ -117,7 +117,7 @@ export declare const displays: {
117
117
  * moving it with the arrow keys, saves the record with `start` and `end` moved by the same days, as one update with
118
118
  * its ETag, so the resource's access rules and `validate` decide, and a refusal puts the bar back and says why.
119
119
  * `start` must be a filterable date or timestamp field and `end` a filterable field of the same type. Named
120
- * `timeline` unless `name` says otherwise. See [Timelines](website/src/content/docs/reference/ui-config.mdx#timelines).
120
+ * `timeline` unless `name` says otherwise. See [Timelines](docs/website/src/content/docs/reference/ui-config.mdx#timelines).
121
121
  */
122
122
  timeline: (fields: {
123
123
  start: Ref;
@@ -55,7 +55,7 @@ const displays = {
55
55
  * `approximate` field is true, or its `exact` field false: its marker is drawn hollow and says so, and close enough in
56
56
  * an area is drawn around it, the GeoJSON polygon or line its `area` field holds, else a circle of its `radius` field
57
57
  * in metres, else one of `defaultRadius`. Named `map` unless `name` says otherwise. See
58
- * [Approximate positions](website/src/content/docs/reference/ui-config.mdx#approximate-positions).
58
+ * [Approximate positions](docs/website/src/content/docs/reference/ui-config.mdx#approximate-positions).
59
59
  */
60
60
  map: (fields, o = {}) => ({
61
61
  kind: "map",
@@ -81,7 +81,7 @@ const displays = {
81
81
  * puts the card back and says why; with `drag: { board: 'name' }` only between the columns the UI config's board drop
82
82
  * of that name lists, each running its own write; with `drag: { rank: true }` a card moves within its column too. `by` must be
83
83
  * a filterable enum field. Named `board` unless `name` says otherwise. See
84
- * [Boards](website/src/content/docs/reference/ui-config.mdx#boards).
84
+ * [Boards](docs/website/src/content/docs/reference/ui-config.mdx#boards).
85
85
  */
86
86
  board: (fields, o = {}) => ({
87
87
  kind: "board",
@@ -101,7 +101,7 @@ const displays = {
101
101
  * the arrow keys, saves the record with `start` and `end` moved by the same days, as one update with its ETag, so the
102
102
  * resource's access rules and `validate` decide, and a refusal puts the event back and says why. `start` must be a
103
103
  * filterable date or timestamp field and `end` a filterable field of the same type. Named `calendar` unless `name`
104
- * says otherwise. See [Calendars](website/src/content/docs/reference/ui-config.mdx#calendars).
104
+ * says otherwise. See [Calendars](docs/website/src/content/docs/reference/ui-config.mdx#calendars).
105
105
  */
106
106
  calendar: (fields, o = {}) => ({
107
107
  kind: "calendar",
@@ -119,7 +119,7 @@ const displays = {
119
119
  * moving it with the arrow keys, saves the record with `start` and `end` moved by the same days, as one update with
120
120
  * its ETag, so the resource's access rules and `validate` decide, and a refusal puts the bar back and says why.
121
121
  * `start` must be a filterable date or timestamp field and `end` a filterable field of the same type. Named
122
- * `timeline` unless `name` says otherwise. See [Timelines](website/src/content/docs/reference/ui-config.mdx#timelines).
122
+ * `timeline` unless `name` says otherwise. See [Timelines](docs/website/src/content/docs/reference/ui-config.mdx#timelines).
123
123
  */
124
124
  timeline: (fields, o = {}) => ({
125
125
  kind: "timeline",
@@ -29,7 +29,7 @@ export declare class FieldView<N extends string = string, V = unknown> {
29
29
  /**
30
30
  * Asks `question` before a person changes the value in a form or a list cell, such as a flag that is easy to set by
31
31
  * mistake: once as the value first moves away from the saved one, not on every key. Cancelling keeps the value. See
32
- * [Confirming a change](website/src/content/docs/reference/ui-config.mdx#confirming-a-change).
32
+ * [Confirming a change](docs/website/src/content/docs/reference/ui-config.mdx#confirming-a-change).
33
33
  */
34
34
  confirm(question: string): FieldView<N, V>;
35
35
  /**
@@ -69,7 +69,7 @@ export declare class FieldView<N extends string = string, V = unknown> {
69
69
  * Shows and edits the field with the field type a plugin registers under `name` (`definePlugin({ fields })`), given
70
70
  * `props`, such as `r.score.widget('rating', { max: 5 })`, or with the built-in `members`, which picks an
71
71
  * organization's members into a JSON array of user ids (see
72
- * [Members](website/src/content/docs/reference/plugins.md#members)). Without that field type, or when it does not show
72
+ * [Members](docs/website/src/content/docs/reference/plugins.md#members)). Without that field type, or when it does not show
73
73
  * this field's storage type, the field shows as it would without it.
74
74
  */
75
75
  widget(name: string, props?: Record<string, JsonValue>): FieldView<N, V>;
@@ -33,7 +33,7 @@ var FieldView = class FieldView {
33
33
  /**
34
34
  * Asks `question` before a person changes the value in a form or a list cell, such as a flag that is easy to set by
35
35
  * mistake: once as the value first moves away from the saved one, not on every key. Cancelling keeps the value. See
36
- * [Confirming a change](website/src/content/docs/reference/ui-config.mdx#confirming-a-change).
36
+ * [Confirming a change](docs/website/src/content/docs/reference/ui-config.mdx#confirming-a-change).
37
37
  */
38
38
  confirm(question) {
39
39
  if (question.trim() === "") throw new Error(`Field "${this.name}": .confirm() needs the question to ask`);
@@ -105,7 +105,7 @@ var FieldView = class FieldView {
105
105
  * Shows and edits the field with the field type a plugin registers under `name` (`definePlugin({ fields })`), given
106
106
  * `props`, such as `r.score.widget('rating', { max: 5 })`, or with the built-in `members`, which picks an
107
107
  * organization's members into a JSON array of user ids (see
108
- * [Members](website/src/content/docs/reference/plugins.md#members)). Without that field type, or when it does not show
108
+ * [Members](docs/website/src/content/docs/reference/plugins.md#members)). Without that field type, or when it does not show
109
109
  * this field's storage type, the field shows as it would without it.
110
110
  */
111
111
  widget(name, props) {
package/dist/view.d.ts CHANGED
@@ -34,7 +34,7 @@ export type FieldViews<R extends {
34
34
  }> = { readonly [K in keyof FieldRefs<FieldsOf<R>> & string]: FieldView<K, NonNullable<FieldRefs<FieldsOf<R>>[K]['$value']>>; };
35
35
  /**
36
36
  * A view of a resource, as `view(...)` starts it: how the admin shows it. Each method returns a new view, so one view
37
- * can build on another. See [UI config](website/src/content/docs/reference/ui-config.mdx).
37
+ * can build on another. See [UI config](docs/website/src/content/docs/reference/ui-config.mdx).
38
38
  */
39
39
  export declare class ViewBuilder<R extends {
40
40
  /** The resource's fields, as `resource(...)` declares them. */
@@ -73,9 +73,9 @@ export declare class ViewBuilder<R extends {
73
73
  }): ViewBuilder<R>;
74
74
  /**
75
75
  * Where the resource sits in the sidebar; `recent` lists a few of its records under the entry (see
76
- * [Sidebar](website/src/content/docs/reference/sidebar.md#recent-records)), and `tenant: 'current'` opens it on the
77
- * caller's own tenant (see [The current organization](website/src/content/docs/reference/sidebar.md#the-current-organization)),
78
- * and `create` links to the create form under it (see [Create link](website/src/content/docs/reference/sidebar.md#create-link)).
76
+ * [Sidebar](docs/website/src/content/docs/reference/sidebar.md#recent-records)), and `tenant: 'current'` opens it on the
77
+ * caller's own tenant (see [The current organization](docs/website/src/content/docs/reference/sidebar.md#the-current-organization)),
78
+ * and `create` links to the create form under it (see [Create link](docs/website/src/content/docs/reference/sidebar.md#create-link)).
79
79
  */
80
80
  nav(nav: NavInput<R>): ViewBuilder<R>;
81
81
  /** A line under the list's title. */
@@ -87,7 +87,7 @@ export declare class ViewBuilder<R extends {
87
87
  * columns that are `editable` in their cell, and other `displays` to switch to (`d.cards`, `d.map`, `d.board`, `d.calendar`, `d.timeline`, `d.custom`), one of which
88
88
  * may be the `default` the list opens in, and what `drag` lets a user change by dragging, nothing unless it says.
89
89
  * Throws when display or column names collide, `default` names none or an editable field is not among the columns. See
90
- * [Editing in the list](website/src/content/docs/reference/ui-config.mdx#editing-in-the-list).
90
+ * [Editing in the list](docs/website/src/content/docs/reference/ui-config.mdx#editing-in-the-list).
91
91
  */
92
92
  list(build: (r: FieldRefs<FieldsOf<R>>, d: typeof displays, c: typeof columns) => {
93
93
  columns: Array<Ref | ListColumn>;
@@ -109,7 +109,7 @@ export declare class ViewBuilder<R extends {
109
109
  * fresh view and sets its `names` (the sidebar entry, required), `nav`, `help`, `list`, `filters` and `chart`, none of
110
110
  * which come from the view's own list. Its records open at the resource's own address. Throws on a name that does not
111
111
  * fit an address or repeats, on anything else set, on `nav.recent`, and in `toModel` when the view has `listOf` or
112
- * `searchesOf`. See [More than one list](website/src/content/docs/reference/ui-config.mdx#more-than-one-list).
112
+ * `searchesOf`. See [More than one list](docs/website/src/content/docs/reference/ui-config.mdx#more-than-one-list).
113
113
  */
114
114
  namedList(name: string, build: (v: ViewBuilder<R>) => ViewBuilder<R>): ViewBuilder<R>;
115
115
  /**
@@ -128,14 +128,14 @@ export declare class ViewBuilder<R extends {
128
128
  * `fields` a visitor fills in, the `thanks` shown once it is sent, a `title` (the view's singular name by default) and
129
129
  * how many submissions one client may send `perMinute` (default 5). The `anonymous` role must grant `create` of those
130
130
  * fields; the form is the only way it creates. Each call adds a form. Throws on a name that does not fit an address, no
131
- * or repeated fields, or an empty `thanks`. See [Public forms](website/src/content/docs/reference/forms.mdx).
131
+ * or repeated fields, or an empty `thanks`. See [Public forms](docs/website/src/content/docs/reference/forms.mdx).
132
132
  */
133
133
  form(build: (r: FieldRefs<FieldsOf<R>>) => FormInput): ViewBuilder<R>;
134
134
  /**
135
135
  * How the record page opens to a user who may change the record: `edit`, the default, as its form; `read` as a read
136
136
  * view, its sections as tables of labels and values, with an Edit button to the form; `locked` as the form, locked
137
137
  * until Edit is pressed. A user who may not change it gets the read view in every mode. The form has its own address
138
- * (`edit: true`), so it opens in a new tab and Back leaves it. See [The record page](website/src/content/docs/reference/ui-config.mdx#read-view-and-edit).
138
+ * (`edit: true`), so it opens in a new tab and Back leaves it. See [The record page](docs/website/src/content/docs/reference/ui-config.mdx#read-view-and-edit).
139
139
  */
140
140
  recordMode(recordMode: RecordMode): ViewBuilder<R>;
141
141
  /**
@@ -148,7 +148,7 @@ export declare class ViewBuilder<R extends {
148
148
  /**
149
149
  * Whether the list page offers Import, which creates or updates records from an .xlsx or CSV file the user picks
150
150
  * (`true`, the default, to users who may create records); `.import(false)` turns it off. See
151
- * [Importing records](website/src/content/docs/reference/ui-config.mdx#importing-records).
151
+ * [Importing records](docs/website/src/content/docs/reference/ui-config.mdx#importing-records).
152
152
  */
153
153
  import(enabled: boolean): ViewBuilder<R>;
154
154
  /**
@@ -166,23 +166,23 @@ export declare class ViewBuilder<R extends {
166
166
  * What a visitor who is not signed in is told about this resource, which they could use once signed in: on its list
167
167
  * page, in place of the list, and in the dialog of a card's favorite button or a list's "Save search" button that
168
168
  * saves here. The page offers "Sign in", and a way to make an account: the page `signUp` names, or the app's own sign-up
169
- * when the server has [open sign-up](website/src/content/docs/reference/auth.md#open-sign-up). With it, the resource keeps its place in the bottom
169
+ * when the server has [open sign-up](docs/website/src/content/docs/reference/auth.md#open-sign-up). With it, the resource keeps its place in the bottom
170
170
  * bar and the sidebar of visitors. Throws when `signUp.href` is not `https:`, `http:` or `mailto:`. See
171
- * [Sign-in prompts](website/src/content/docs/reference/ui-config.mdx#sign-in-prompts).
171
+ * [Sign-in prompts](docs/website/src/content/docs/reference/ui-config.mdx#sign-in-prompts).
172
172
  */
173
173
  signIn(prompt: SignInPromptModel): ViewBuilder<R>;
174
174
  /**
175
175
  * A "Save search" button on the list page while its filter narrows it: it saves the filter as a record of `resource`,
176
176
  * the signed-in user's own, whose view lists them with `.searchesOf(...)`, and takes it off again while pressed. A
177
177
  * visitor is told what signing in gives, when that view has `.signIn(...)`. See
178
- * [Saved searches](website/src/content/docs/reference/ui-config.mdx#saved-searches).
178
+ * [Saved searches](docs/website/src/content/docs/reference/ui-config.mdx#saved-searches).
179
179
  */
180
180
  saveSearch(search: SaveSearchModel): ViewBuilder<R>;
181
181
  /**
182
182
  * Whether the list page offers Export, which saves its rows as an Excel or CSV file built in the browser: `false`
183
183
  * takes it away, `{ maxRows }` limits how many rows a file holds. A list offers it by default. It only shapes the
184
184
  * page: the rows and fields a file holds are those the list API gives the user. Throws when `maxRows` is not a
185
- * positive whole number. See [Exports](website/src/content/docs/reference/ui-config.mdx#exports).
185
+ * positive whole number. See [Exports](docs/website/src/content/docs/reference/ui-config.mdx#exports).
186
186
  */
187
187
  export(options: false | ExportModel): ViewBuilder<R>;
188
188
  /**
@@ -190,7 +190,7 @@ export declare class ViewBuilder<R extends {
190
190
  * shows it with the address's `values`, and the list's New button opens it for whoever may open the page, whatever the
191
191
  * resource's `create` access. So the resource's API can refuse creates (`create: never`) while the page creates
192
192
  * through an API function. The server refuses a page that does not exist when it starts. See
193
- * [Create pages](website/src/content/docs/reference/ui-config.mdx#create-pages).
193
+ * [Create pages](docs/website/src/content/docs/reference/ui-config.mdx#create-pages).
194
194
  */
195
195
  create(options: CreateModel): ViewBuilder<R>;
196
196
  /**
@@ -199,7 +199,7 @@ export declare class ViewBuilder<R extends {
199
199
  * page does not scroll. It reads the record with `useLayoutRecord()`. The standard record page stays at the record's
200
200
  * address with `standard: true`, which the component links to; it shows instead while the component is missing or
201
201
  * when it throws. Throws when `component` is a built-in block. See
202
- * [Full-area record pages](website/src/content/docs/reference/ui-config.mdx#full-area-record-pages).
202
+ * [Full-area record pages](docs/website/src/content/docs/reference/ui-config.mdx#full-area-record-pages).
203
203
  */
204
204
  record(options: {
205
205
  component: ComponentRef<never>;
@@ -210,7 +210,7 @@ export declare class ViewBuilder<R extends {
210
210
  * `unseen`, newest first, those new since the user last opened its results marked) and a link to all of them. Throws in
211
211
  * `toModel` when `filter` or `name` is not a text field, `unseen.seenAt` not a timestamp or a control not an enum or
212
212
  * boolean field.
213
- * See [Saved searches](website/src/content/docs/reference/ui-config.mdx#saved-searches).
213
+ * See [Saved searches](docs/website/src/content/docs/reference/ui-config.mdx#saved-searches).
214
214
  */
215
215
  searchesOf(pick: (r: FieldRefs<FieldsOf<R>>) => {
216
216
  resource: string;
@@ -230,7 +230,7 @@ export declare class ViewBuilder<R extends {
230
230
  }
231
231
  /**
232
232
  * Starts the view of a resource: how the admin shows it. Pass the resource's type, so every field reference (`r.status`)
233
- * is checked against it. See [UI config](website/src/content/docs/reference/ui-config.mdx).
233
+ * is checked against it. See [UI config](docs/website/src/content/docs/reference/ui-config.mdx).
234
234
  *
235
235
  * @example
236
236
  * ```ts
package/dist/view.js CHANGED
@@ -33,7 +33,7 @@ const searchesOfErrors = (searches, resource) => {
33
33
  };
34
34
  /**
35
35
  * A view of a resource, as `view(...)` starts it: how the admin shows it. Each method returns a new view, so one view
36
- * can build on another. See [UI config](website/src/content/docs/reference/ui-config.mdx).
36
+ * can build on another. See [UI config](docs/website/src/content/docs/reference/ui-config.mdx).
37
37
  */
38
38
  var ViewBuilder = class ViewBuilder {
39
39
  state;
@@ -85,9 +85,9 @@ var ViewBuilder = class ViewBuilder {
85
85
  }
86
86
  /**
87
87
  * Where the resource sits in the sidebar; `recent` lists a few of its records under the entry (see
88
- * [Sidebar](website/src/content/docs/reference/sidebar.md#recent-records)), and `tenant: 'current'` opens it on the
89
- * caller's own tenant (see [The current organization](website/src/content/docs/reference/sidebar.md#the-current-organization)),
90
- * and `create` links to the create form under it (see [Create link](website/src/content/docs/reference/sidebar.md#create-link)).
88
+ * [Sidebar](docs/website/src/content/docs/reference/sidebar.md#recent-records)), and `tenant: 'current'` opens it on the
89
+ * caller's own tenant (see [The current organization](docs/website/src/content/docs/reference/sidebar.md#the-current-organization)),
90
+ * and `create` links to the create form under it (see [Create link](docs/website/src/content/docs/reference/sidebar.md#create-link)).
91
91
  */
92
92
  nav(nav) {
93
93
  return this.next({ nav });
@@ -110,7 +110,7 @@ var ViewBuilder = class ViewBuilder {
110
110
  * columns that are `editable` in their cell, and other `displays` to switch to (`d.cards`, `d.map`, `d.board`, `d.calendar`, `d.timeline`, `d.custom`), one of which
111
111
  * may be the `default` the list opens in, and what `drag` lets a user change by dragging, nothing unless it says.
112
112
  * Throws when display or column names collide, `default` names none or an editable field is not among the columns. See
113
- * [Editing in the list](website/src/content/docs/reference/ui-config.mdx#editing-in-the-list).
113
+ * [Editing in the list](docs/website/src/content/docs/reference/ui-config.mdx#editing-in-the-list).
114
114
  */
115
115
  list(build) {
116
116
  const { columns: columns$1, sort, search, filter, editable, displays: shown = [], default: opens, drag } = build(this.refs(), displays, columns);
@@ -147,7 +147,7 @@ var ViewBuilder = class ViewBuilder {
147
147
  * fresh view and sets its `names` (the sidebar entry, required), `nav`, `help`, `list`, `filters` and `chart`, none of
148
148
  * which come from the view's own list. Its records open at the resource's own address. Throws on a name that does not
149
149
  * fit an address or repeats, on anything else set, on `nav.recent`, and in `toModel` when the view has `listOf` or
150
- * `searchesOf`. See [More than one list](website/src/content/docs/reference/ui-config.mdx#more-than-one-list).
150
+ * `searchesOf`. See [More than one list](docs/website/src/content/docs/reference/ui-config.mdx#more-than-one-list).
151
151
  */
152
152
  namedList(name, build) {
153
153
  const where = `View "${this.state.resource}": named list "${name}"`;
@@ -190,7 +190,7 @@ var ViewBuilder = class ViewBuilder {
190
190
  * `fields` a visitor fills in, the `thanks` shown once it is sent, a `title` (the view's singular name by default) and
191
191
  * how many submissions one client may send `perMinute` (default 5). The `anonymous` role must grant `create` of those
192
192
  * fields; the form is the only way it creates. Each call adds a form. Throws on a name that does not fit an address, no
193
- * or repeated fields, or an empty `thanks`. See [Public forms](website/src/content/docs/reference/forms.mdx).
193
+ * or repeated fields, or an empty `thanks`. See [Public forms](docs/website/src/content/docs/reference/forms.mdx).
194
194
  */
195
195
  form(build) {
196
196
  return this.next({ forms: [...this.state.forms ?? [], formModel(build(this.refs()))] });
@@ -199,7 +199,7 @@ var ViewBuilder = class ViewBuilder {
199
199
  * How the record page opens to a user who may change the record: `edit`, the default, as its form; `read` as a read
200
200
  * view, its sections as tables of labels and values, with an Edit button to the form; `locked` as the form, locked
201
201
  * until Edit is pressed. A user who may not change it gets the read view in every mode. The form has its own address
202
- * (`edit: true`), so it opens in a new tab and Back leaves it. See [The record page](website/src/content/docs/reference/ui-config.mdx#read-view-and-edit).
202
+ * (`edit: true`), so it opens in a new tab and Back leaves it. See [The record page](docs/website/src/content/docs/reference/ui-config.mdx#read-view-and-edit).
203
203
  */
204
204
  recordMode(recordMode) {
205
205
  return this.next({ recordMode });
@@ -218,7 +218,7 @@ var ViewBuilder = class ViewBuilder {
218
218
  /**
219
219
  * Whether the list page offers Import, which creates or updates records from an .xlsx or CSV file the user picks
220
220
  * (`true`, the default, to users who may create records); `.import(false)` turns it off. See
221
- * [Importing records](website/src/content/docs/reference/ui-config.mdx#importing-records).
221
+ * [Importing records](docs/website/src/content/docs/reference/ui-config.mdx#importing-records).
222
222
  */
223
223
  import(enabled) {
224
224
  return this.next({ import: enabled });
@@ -242,9 +242,9 @@ var ViewBuilder = class ViewBuilder {
242
242
  * What a visitor who is not signed in is told about this resource, which they could use once signed in: on its list
243
243
  * page, in place of the list, and in the dialog of a card's favorite button or a list's "Save search" button that
244
244
  * saves here. The page offers "Sign in", and a way to make an account: the page `signUp` names, or the app's own sign-up
245
- * when the server has [open sign-up](website/src/content/docs/reference/auth.md#open-sign-up). With it, the resource keeps its place in the bottom
245
+ * when the server has [open sign-up](docs/website/src/content/docs/reference/auth.md#open-sign-up). With it, the resource keeps its place in the bottom
246
246
  * bar and the sidebar of visitors. Throws when `signUp.href` is not `https:`, `http:` or `mailto:`. See
247
- * [Sign-in prompts](website/src/content/docs/reference/ui-config.mdx#sign-in-prompts).
247
+ * [Sign-in prompts](docs/website/src/content/docs/reference/ui-config.mdx#sign-in-prompts).
248
248
  */
249
249
  signIn(prompt) {
250
250
  if (prompt.signUp && !isMenuHref(prompt.signUp.href)) throw new Error(`View "${this.state.resource}": signIn signUp.href must start with https://, http:// or mailto:`);
@@ -254,7 +254,7 @@ var ViewBuilder = class ViewBuilder {
254
254
  * A "Save search" button on the list page while its filter narrows it: it saves the filter as a record of `resource`,
255
255
  * the signed-in user's own, whose view lists them with `.searchesOf(...)`, and takes it off again while pressed. A
256
256
  * visitor is told what signing in gives, when that view has `.signIn(...)`. See
257
- * [Saved searches](website/src/content/docs/reference/ui-config.mdx#saved-searches).
257
+ * [Saved searches](docs/website/src/content/docs/reference/ui-config.mdx#saved-searches).
258
258
  */
259
259
  saveSearch(search) {
260
260
  return this.next({ saveSearch: { ...search } });
@@ -263,7 +263,7 @@ var ViewBuilder = class ViewBuilder {
263
263
  * Whether the list page offers Export, which saves its rows as an Excel or CSV file built in the browser: `false`
264
264
  * takes it away, `{ maxRows }` limits how many rows a file holds. A list offers it by default. It only shapes the
265
265
  * page: the rows and fields a file holds are those the list API gives the user. Throws when `maxRows` is not a
266
- * positive whole number. See [Exports](website/src/content/docs/reference/ui-config.mdx#exports).
266
+ * positive whole number. See [Exports](docs/website/src/content/docs/reference/ui-config.mdx#exports).
267
267
  */
268
268
  export(options) {
269
269
  if (options && options.maxRows !== void 0 && !(Number.isInteger(options.maxRows) && options.maxRows > 0)) throw new Error(`View "${this.state.resource}": export maxRows must be a positive whole number`);
@@ -274,7 +274,7 @@ var ViewBuilder = class ViewBuilder {
274
274
  * shows it with the address's `values`, and the list's New button opens it for whoever may open the page, whatever the
275
275
  * resource's `create` access. So the resource's API can refuse creates (`create: never`) while the page creates
276
276
  * through an API function. The server refuses a page that does not exist when it starts. See
277
- * [Create pages](website/src/content/docs/reference/ui-config.mdx#create-pages).
277
+ * [Create pages](docs/website/src/content/docs/reference/ui-config.mdx#create-pages).
278
278
  */
279
279
  create(options) {
280
280
  return this.next({ create: { ...options } });
@@ -285,7 +285,7 @@ var ViewBuilder = class ViewBuilder {
285
285
  * page does not scroll. It reads the record with `useLayoutRecord()`. The standard record page stays at the record's
286
286
  * address with `standard: true`, which the component links to; it shows instead while the component is missing or
287
287
  * when it throws. Throws when `component` is a built-in block. See
288
- * [Full-area record pages](website/src/content/docs/reference/ui-config.mdx#full-area-record-pages).
288
+ * [Full-area record pages](docs/website/src/content/docs/reference/ui-config.mdx#full-area-record-pages).
289
289
  */
290
290
  record(options) {
291
291
  const record = { component: customComponent(options.component, "record component") };
@@ -297,7 +297,7 @@ var ViewBuilder = class ViewBuilder {
297
297
  * `unseen`, newest first, those new since the user last opened its results marked) and a link to all of them. Throws in
298
298
  * `toModel` when `filter` or `name` is not a text field, `unseen.seenAt` not a timestamp or a control not an enum or
299
299
  * boolean field.
300
- * See [Saved searches](website/src/content/docs/reference/ui-config.mdx#saved-searches).
300
+ * See [Saved searches](docs/website/src/content/docs/reference/ui-config.mdx#saved-searches).
301
301
  */
302
302
  searchesOf(pick) {
303
303
  const { resource, filter, name, controls, unseen, limit } = pick(this.refs());
@@ -386,7 +386,7 @@ var ViewBuilder = class ViewBuilder {
386
386
  };
387
387
  /**
388
388
  * Starts the view of a resource: how the admin shows it. Pass the resource's type, so every field reference (`r.status`)
389
- * is checked against it. See [UI config](website/src/content/docs/reference/ui-config.mdx).
389
+ * is checked against it. See [UI config](docs/website/src/content/docs/reference/ui-config.mdx).
390
390
  *
391
391
  * @example
392
392
  * ```ts
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@protobase/schema",
3
- "version": "0.58.8",
3
+ "version": "0.59.0",
4
4
  "description": "Resource, field, view and access definitions for Protobase configs.",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {