@k2b/ui 0.44.0 → 0.45.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/browser/actions/Tabs.js +3 -4
- package/dist/browser/actions/Tabs.js.map +1 -1
- package/dist/browser/actions/menu-sheet.js +2 -3
- package/dist/browser/actions/menu-sheet.js.map +1 -1
- package/dist/browser/actions/phone-sheet.js +4 -0
- package/dist/browser/actions/phone-sheet.js.map +1 -0
- package/dist/browser/content/DataTable.js +47 -51
- package/dist/browser/content/DataTable.js.map +1 -1
- package/dist/browser/feedback/dialog-core.js +5 -1
- package/dist/browser/feedback/dialog-core.js.map +1 -1
- package/dist/browser/feedback/dialog-tone.js +26 -0
- package/dist/browser/feedback/dialog-tone.js.map +1 -0
- package/dist/browser/feedback/index.js.map +1 -1
- package/dist/browser/feedback/prompt-confirm.js +223 -0
- package/dist/browser/feedback/prompt-confirm.js.map +1 -0
- package/dist/browser/feedback/prompts.js +195 -343
- package/dist/browser/feedback/prompts.js.map +1 -1
- package/dist/browser/inputs/ChoiceList.js +45 -17
- package/dist/browser/inputs/ChoiceList.js.map +1 -1
- package/dist/browser/inputs/DatePicker.js +1647 -334
- package/dist/browser/inputs/DatePicker.js.map +1 -1
- package/dist/browser/inputs/TextInput.js +5 -4
- package/dist/browser/inputs/TextInput.js.map +1 -1
- package/dist/browser/inputs/date-input-messages.js +128 -0
- package/dist/browser/inputs/date-input-messages.js.map +1 -0
- package/dist/browser/inputs/date-input-status.js +132 -0
- package/dist/browser/inputs/date-input-status.js.map +1 -0
- package/dist/browser/inputs/date-input.js +334 -0
- package/dist/browser/inputs/date-input.js.map +1 -0
- package/dist/browser/inputs/date-sheet.js +49 -0
- package/dist/browser/inputs/date-sheet.js.map +1 -0
- package/dist/browser/internal/reveal-in-scroller.js +28 -0
- package/dist/browser/internal/reveal-in-scroller.js.map +1 -0
- package/dist/browser/intl/messages.js +6 -0
- package/dist/browser/intl/messages.js.map +1 -1
- package/dist/browser/layout/AppWorkspace.js +536 -512
- package/dist/browser/layout/AppWorkspace.js.map +1 -1
- package/dist/browser/layout/BottomSheet.js +3 -0
- package/dist/browser/layout/BottomSheet.js.map +1 -1
- package/dist/browser/layout/PanelDialog.js +167 -132
- package/dist/browser/layout/PanelDialog.js.map +1 -1
- package/dist/browser/layout/Settings.js +175 -139
- package/dist/browser/layout/Settings.js.map +1 -1
- package/dist/browser/layout/SettingsModal.js +2 -4
- package/dist/browser/layout/SettingsModal.js.map +1 -1
- package/dist/browser/layout/index.js.map +1 -1
- package/dist/browser/surfaces/StatusBadge.js +47 -14
- package/dist/browser/surfaces/StatusBadge.js.map +1 -1
- package/dist/browser/text-editor/TextEditor.js +7 -0
- package/dist/browser/text-editor/TextEditor.js.map +1 -1
- package/dist/ssr/actions/Tabs.js +3 -4
- package/dist/ssr/actions/Tabs.js.map +1 -1
- package/dist/ssr/actions/menu-sheet.js +2 -3
- package/dist/ssr/actions/menu-sheet.js.map +1 -1
- package/dist/ssr/actions/phone-sheet.js +4 -0
- package/dist/ssr/actions/phone-sheet.js.map +1 -0
- package/dist/ssr/content/DataTable.js +1 -2
- package/dist/ssr/content/DataTable.js.map +1 -1
- package/dist/ssr/feedback/dialog-core.js +5 -1
- package/dist/ssr/feedback/dialog-core.js.map +1 -1
- package/dist/ssr/feedback/dialog-tone.js +26 -0
- package/dist/ssr/feedback/dialog-tone.js.map +1 -0
- package/dist/ssr/feedback/index.js.map +1 -1
- package/dist/ssr/feedback/prompt-confirm.js +123 -0
- package/dist/ssr/feedback/prompt-confirm.js.map +1 -0
- package/dist/ssr/feedback/prompts.js +60 -132
- package/dist/ssr/feedback/prompts.js.map +1 -1
- package/dist/ssr/inputs/ChoiceList.js +29 -9
- package/dist/ssr/inputs/ChoiceList.js.map +1 -1
- package/dist/ssr/inputs/DatePicker.js +1183 -166
- package/dist/ssr/inputs/DatePicker.js.map +1 -1
- package/dist/ssr/inputs/TextInput.js +5 -4
- package/dist/ssr/inputs/TextInput.js.map +1 -1
- package/dist/ssr/inputs/date-input-messages.js +128 -0
- package/dist/ssr/inputs/date-input-messages.js.map +1 -0
- package/dist/ssr/inputs/date-input-status.js +132 -0
- package/dist/ssr/inputs/date-input-status.js.map +1 -0
- package/dist/ssr/inputs/date-input.js +334 -0
- package/dist/ssr/inputs/date-input.js.map +1 -0
- package/dist/ssr/inputs/date-sheet.js +44 -0
- package/dist/ssr/inputs/date-sheet.js.map +1 -0
- package/dist/ssr/internal/reveal-in-scroller.js +28 -0
- package/dist/ssr/internal/reveal-in-scroller.js.map +1 -0
- package/dist/ssr/intl/messages.js +6 -0
- package/dist/ssr/intl/messages.js.map +1 -1
- package/dist/ssr/layout/AppWorkspace.js +44 -23
- package/dist/ssr/layout/AppWorkspace.js.map +1 -1
- package/dist/ssr/layout/BottomSheet.js +3 -0
- package/dist/ssr/layout/BottomSheet.js.map +1 -1
- package/dist/ssr/layout/PanelDialog.js +48 -30
- package/dist/ssr/layout/PanelDialog.js.map +1 -1
- package/dist/ssr/layout/Settings.js +34 -18
- package/dist/ssr/layout/Settings.js.map +1 -1
- package/dist/ssr/layout/SettingsModal.js +2 -4
- package/dist/ssr/layout/SettingsModal.js.map +1 -1
- package/dist/ssr/layout/index.js.map +1 -1
- package/dist/ssr/surfaces/StatusBadge.js +26 -8
- package/dist/ssr/surfaces/StatusBadge.js.map +1 -1
- package/dist/ssr/text-editor/TextEditor.js +7 -0
- package/dist/ssr/text-editor/TextEditor.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/types/actions/menu-sheet.d.ts +1 -3
- package/dist/types/actions/phone-sheet.d.ts +3 -0
- package/dist/types/feedback/dialog-tone.d.ts +10 -0
- package/dist/types/feedback/index.d.ts +1 -0
- package/dist/types/feedback/prompt-confirm.d.ts +19 -0
- package/dist/types/feedback/prompts.d.ts +4 -8
- package/dist/types/inputs/ChoiceList.d.ts +7 -3
- package/dist/types/inputs/DatePicker.d.ts +13 -3
- package/dist/types/inputs/TextInput.d.ts +1 -1
- package/dist/types/inputs/date-input-messages.d.ts +64 -0
- package/dist/types/inputs/date-input-status.d.ts +35 -0
- package/dist/types/inputs/date-input.d.ts +90 -0
- package/dist/types/inputs/date-sheet.d.ts +14 -0
- package/dist/types/internal/reveal-in-scroller.d.ts +6 -0
- package/dist/types/intl/messages.d.ts +3 -0
- package/dist/types/layout/AppWorkspace.d.ts +14 -0
- package/dist/types/layout/BottomSheet.d.ts +3 -0
- package/dist/types/layout/PanelDialog.d.ts +3 -0
- package/dist/types/layout/Settings.d.ts +17 -1
- package/dist/types/layout/index.d.ts +1 -1
- package/dist/types/surfaces/StatusBadge.d.ts +5 -0
- package/package.json +1 -1
|
@@ -16,18 +16,19 @@ var _tmpl$ = /*#__PURE__*/_$template(`<p>`),
|
|
|
16
16
|
_tmpl$5 = /*#__PURE__*/_$template(`<section><!$><!/><div class=k2b-settings-page__body></div><!$><!/>`),
|
|
17
17
|
_tmpl$6 = /*#__PURE__*/_$template(`<i aria-hidden=true>`),
|
|
18
18
|
_tmpl$7 = /*#__PURE__*/_$template(`<div class=k2b-settings-section__actions>`),
|
|
19
|
-
_tmpl$8 = /*#__PURE__*/_$template(`<section><header class=k2b-settings-section__header><!$><!/><div class=k2b-settings-section__heading><h2></h2><!$><!/></div><!$><!/></header><div class=k2b-settings-section__body>`),
|
|
19
|
+
_tmpl$8 = /*#__PURE__*/_$template(`<section><div class=k2b-settings-section__layout><header class=k2b-settings-section__header><!$><!/><div class=k2b-settings-section__heading><h2></h2><!$><!/></div><!$><!/></header><div class=k2b-settings-section__body>`),
|
|
20
20
|
_tmpl$9 = /*#__PURE__*/_$template(`<section><header class=k2b-settings-group__header><div class=k2b-settings-group__heading><h3></h3><!$><!/></div><!$><!/></header><div class=k2b-settings-group__body>`),
|
|
21
21
|
_tmpl$0 = /*#__PURE__*/_$template(`<div class=k2b-settings-group__action>`),
|
|
22
22
|
_tmpl$1 = /*#__PURE__*/_$template(`<span>`),
|
|
23
|
-
_tmpl$10 = /*#__PURE__*/_$template(`<div
|
|
24
|
-
_tmpl$11 = /*#__PURE__*/_$template(`<
|
|
25
|
-
_tmpl$12 = /*#__PURE__*/_$template(`<i class="ti ti-
|
|
26
|
-
_tmpl$13 = /*#__PURE__*/_$template(`<
|
|
27
|
-
_tmpl$14 = /*#__PURE__*/_$template(`<div
|
|
28
|
-
_tmpl$15 = /*#__PURE__*/_$template(`<strong
|
|
29
|
-
_tmpl$16 = /*#__PURE__*/_$template(`<
|
|
30
|
-
_tmpl$17 = /*#__PURE__*/_$template(`<
|
|
23
|
+
_tmpl$10 = /*#__PURE__*/_$template(`<div class=k2b-settings-field__source>`),
|
|
24
|
+
_tmpl$11 = /*#__PURE__*/_$template(`<div><div class=k2b-settings-field__row><div class=k2b-settings-field__copy><div class=k2b-settings-field__heading><strong></strong><!$><!/></div><p></p></div><div class=k2b-settings-field__control><!$><!/><!$><!/></div><!$><!/>`),
|
|
25
|
+
_tmpl$12 = /*#__PURE__*/_$template(`<p class=k2b-settings-field__error role=alert><i class="ti ti-alert-circle"aria-hidden=true></i> <!$><!/>`),
|
|
26
|
+
_tmpl$13 = /*#__PURE__*/_$template(`<i class="ti ti-device-floppy"aria-hidden=true>`),
|
|
27
|
+
_tmpl$14 = /*#__PURE__*/_$template(`<div class=k2b-settings-actions><!$><!/><!$><!/>`),
|
|
28
|
+
_tmpl$15 = /*#__PURE__*/_$template(`<div><p role=status aria-live=polite><strong></strong> <!$><!/></p><!$><!/>`),
|
|
29
|
+
_tmpl$16 = /*#__PURE__*/_$template(`<strong>`),
|
|
30
|
+
_tmpl$17 = /*#__PURE__*/_$template(`<p class=k2b-settings-panel-footer__status role=status aria-live=polite>`),
|
|
31
|
+
_tmpl$18 = /*#__PURE__*/_$template(`<div><span class=k2b-save-status__slot><span class=k2b-save-status__state role=status aria-live=polite><i aria-hidden=true></i><!$><!/></span></span><!$><!/>`);
|
|
31
32
|
import { children, createMemo, createUniqueId, Show } from "solid-js";
|
|
32
33
|
import { Button } from "../actions/Button";
|
|
33
34
|
import { usePromptMessages } from "../feedback/prompt-messages";
|
|
@@ -121,56 +122,58 @@ export function SettingsPage(props) {
|
|
|
121
122
|
}
|
|
122
123
|
/**
|
|
123
124
|
* A full-page settings group: a heading, optional actions and its fields on the
|
|
124
|
-
* page surface without a card.
|
|
125
|
+
* page surface without a card. From 860 px of its own width the heading takes a
|
|
126
|
+
* column beside the fields. Dialogs keep using PanelDialog.Section.
|
|
125
127
|
*/
|
|
126
128
|
export function SettingsSection(props) {
|
|
127
129
|
const headingId = `k2b-settings-section-${createUniqueId()}`;
|
|
128
130
|
return (() => {
|
|
129
131
|
var _el$18 = _$getNextElement(_tmpl$8),
|
|
130
132
|
_el$19 = _el$18.firstChild,
|
|
131
|
-
_el$
|
|
132
|
-
|
|
133
|
-
_el$
|
|
134
|
-
_el$21 = _el$
|
|
135
|
-
_el$
|
|
136
|
-
|
|
137
|
-
_el$
|
|
138
|
-
|
|
139
|
-
_el$30 = _el$
|
|
133
|
+
_el$20 = _el$19.firstChild,
|
|
134
|
+
_el$27 = _el$20.firstChild,
|
|
135
|
+
[_el$28, _co$7] = _$getNextMarker(_el$27.nextSibling),
|
|
136
|
+
_el$21 = _el$28.nextSibling,
|
|
137
|
+
_el$22 = _el$21.firstChild,
|
|
138
|
+
_el$24 = _el$22.nextSibling,
|
|
139
|
+
[_el$25, _co$6] = _$getNextMarker(_el$24.nextSibling),
|
|
140
|
+
_el$29 = _el$21.nextSibling,
|
|
141
|
+
[_el$30, _co$8] = _$getNextMarker(_el$29.nextSibling),
|
|
142
|
+
_el$31 = _el$20.nextSibling;
|
|
140
143
|
_$setAttribute(_el$18, "aria-labelledby", headingId);
|
|
141
|
-
_$insert(_el$
|
|
144
|
+
_$insert(_el$20, _$createComponent(Show, {
|
|
142
145
|
get when() {
|
|
143
146
|
return props.icon;
|
|
144
147
|
},
|
|
145
148
|
children: icon => (() => {
|
|
146
|
-
var _el$
|
|
147
|
-
_$effect(() => _$className(_el$
|
|
148
|
-
return _el$
|
|
149
|
+
var _el$32 = _$getNextElement(_tmpl$6);
|
|
150
|
+
_$effect(() => _$className(_el$32, icon()));
|
|
151
|
+
return _el$32;
|
|
149
152
|
})()
|
|
150
|
-
}), _el$
|
|
151
|
-
_$setAttribute(_el$
|
|
152
|
-
_$insert(_el$
|
|
153
|
-
_$insert(_el$
|
|
153
|
+
}), _el$28, _co$7);
|
|
154
|
+
_$setAttribute(_el$22, "id", headingId);
|
|
155
|
+
_$insert(_el$22, () => props.title);
|
|
156
|
+
_$insert(_el$21, _$createComponent(Show, {
|
|
154
157
|
get when() {
|
|
155
158
|
return props.subtitle;
|
|
156
159
|
},
|
|
157
160
|
get children() {
|
|
158
|
-
var _el$
|
|
159
|
-
_$insert(_el$
|
|
160
|
-
return _el$
|
|
161
|
+
var _el$23 = _$getNextElement(_tmpl$);
|
|
162
|
+
_$insert(_el$23, () => props.subtitle);
|
|
163
|
+
return _el$23;
|
|
161
164
|
}
|
|
162
|
-
}), _el$
|
|
163
|
-
_$insert(_el$
|
|
165
|
+
}), _el$25, _co$6);
|
|
166
|
+
_$insert(_el$20, _$createComponent(Show, {
|
|
164
167
|
get when() {
|
|
165
168
|
return props.actions;
|
|
166
169
|
},
|
|
167
170
|
get children() {
|
|
168
|
-
var _el$
|
|
169
|
-
_$insert(_el$
|
|
170
|
-
return _el$
|
|
171
|
+
var _el$26 = _$getNextElement(_tmpl$7);
|
|
172
|
+
_$insert(_el$26, () => props.actions);
|
|
173
|
+
return _el$26;
|
|
171
174
|
}
|
|
172
|
-
}), _el$
|
|
173
|
-
_$insert(_el$
|
|
175
|
+
}), _el$30, _co$8);
|
|
176
|
+
_$insert(_el$31, () => props.children);
|
|
174
177
|
_$effect(() => _$className(_el$18, `k2b-settings-section${props.class ? ` ${props.class}` : ""}`));
|
|
175
178
|
return _el$18;
|
|
176
179
|
})();
|
|
@@ -194,41 +197,41 @@ export const SettingsGroup = props => {
|
|
|
194
197
|
const content = createMemo(() => collectSettingsGroupContent(resolved()));
|
|
195
198
|
const headingId = `k2b-settings-group-${createUniqueId()}`;
|
|
196
199
|
return (() => {
|
|
197
|
-
var _el$
|
|
198
|
-
_el$33 = _el$32.firstChild,
|
|
200
|
+
var _el$33 = _$getNextElement(_tmpl$9),
|
|
199
201
|
_el$34 = _el$33.firstChild,
|
|
200
202
|
_el$35 = _el$34.firstChild,
|
|
201
|
-
_el$
|
|
202
|
-
|
|
203
|
-
_el$39 = _el$
|
|
204
|
-
|
|
205
|
-
_el$41 = _el$
|
|
206
|
-
|
|
207
|
-
_$setAttribute(_el$
|
|
208
|
-
_$
|
|
209
|
-
_$insert(_el$
|
|
203
|
+
_el$36 = _el$35.firstChild,
|
|
204
|
+
_el$38 = _el$36.nextSibling,
|
|
205
|
+
[_el$39, _co$9] = _$getNextMarker(_el$38.nextSibling),
|
|
206
|
+
_el$40 = _el$35.nextSibling,
|
|
207
|
+
[_el$41, _co$0] = _$getNextMarker(_el$40.nextSibling),
|
|
208
|
+
_el$42 = _el$34.nextSibling;
|
|
209
|
+
_$setAttribute(_el$33, "aria-labelledby", headingId);
|
|
210
|
+
_$setAttribute(_el$36, "id", headingId);
|
|
211
|
+
_$insert(_el$36, () => props.title);
|
|
212
|
+
_$insert(_el$35, _$createComponent(Show, {
|
|
210
213
|
get when() {
|
|
211
214
|
return props.description;
|
|
212
215
|
},
|
|
213
216
|
get children() {
|
|
214
|
-
var _el$
|
|
215
|
-
_$insert(_el$
|
|
216
|
-
return _el$
|
|
217
|
+
var _el$37 = _$getNextElement(_tmpl$);
|
|
218
|
+
_$insert(_el$37, () => props.description);
|
|
219
|
+
return _el$37;
|
|
217
220
|
}
|
|
218
|
-
}), _el$
|
|
219
|
-
_$insert(_el$
|
|
221
|
+
}), _el$39, _co$9);
|
|
222
|
+
_$insert(_el$34, _$createComponent(Show, {
|
|
220
223
|
get when() {
|
|
221
224
|
return action();
|
|
222
225
|
},
|
|
223
226
|
children: slot => (() => {
|
|
224
|
-
var _el$
|
|
225
|
-
_$insert(_el$
|
|
226
|
-
return _el$
|
|
227
|
+
var _el$43 = _$getNextElement(_tmpl$0);
|
|
228
|
+
_$insert(_el$43, () => slot().props.children);
|
|
229
|
+
return _el$43;
|
|
227
230
|
})()
|
|
228
|
-
}), _el$
|
|
229
|
-
_$insert(_el$
|
|
230
|
-
_$effect(() => _$className(_el$
|
|
231
|
-
return _el$
|
|
231
|
+
}), _el$41, _co$0);
|
|
232
|
+
_$insert(_el$42, content);
|
|
233
|
+
_$effect(() => _$className(_el$33, `k2b-settings-group${props.class ? ` ${props.class}` : ""}`));
|
|
234
|
+
return _el$33;
|
|
232
235
|
})();
|
|
233
236
|
};
|
|
234
237
|
SettingsGroup.Action = SettingsGroupAction;
|
|
@@ -240,6 +243,12 @@ export const readSettingsError = async (response, fallback) => {
|
|
|
240
243
|
fields: data?.errors ?? {}
|
|
241
244
|
};
|
|
242
245
|
};
|
|
246
|
+
|
|
247
|
+
/**
|
|
248
|
+
* The room a setting's control takes: `short` for a number, `medium` for a choice, `long` for text, and `full` for
|
|
249
|
+
* an editor, which keeps its name above it and takes the whole row.
|
|
250
|
+
*/
|
|
251
|
+
|
|
243
252
|
export function SettingsField(props) {
|
|
244
253
|
const settingsMessages = useSettingsMessages();
|
|
245
254
|
const id = createUniqueId();
|
|
@@ -249,49 +258,76 @@ export function SettingsField(props) {
|
|
|
249
258
|
const control = () => typeof props.children === "function" ? props.children({
|
|
250
259
|
describedBy
|
|
251
260
|
}) : props.children;
|
|
261
|
+
const source = children(() => props.source);
|
|
252
262
|
return (() => {
|
|
253
|
-
var _el$
|
|
254
|
-
_el$44 = _el$43.firstChild,
|
|
263
|
+
var _el$44 = _$getNextElement(_tmpl$11),
|
|
255
264
|
_el$45 = _el$44.firstChild,
|
|
256
265
|
_el$46 = _el$45.firstChild,
|
|
257
|
-
_el$
|
|
258
|
-
|
|
259
|
-
_el$50 = _el$
|
|
260
|
-
_el$51 = _el$
|
|
261
|
-
|
|
262
|
-
_el$53 = _el$
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
+
_el$47 = _el$46.firstChild,
|
|
267
|
+
_el$48 = _el$47.firstChild,
|
|
268
|
+
_el$50 = _el$48.nextSibling,
|
|
269
|
+
[_el$51, _co$1] = _$getNextMarker(_el$50.nextSibling),
|
|
270
|
+
_el$52 = _el$47.nextSibling,
|
|
271
|
+
_el$53 = _el$46.nextSibling,
|
|
272
|
+
_el$54 = _el$53.firstChild,
|
|
273
|
+
[_el$55, _co$10] = _$getNextMarker(_el$54.nextSibling),
|
|
274
|
+
_el$56 = _el$55.nextSibling,
|
|
275
|
+
[_el$57, _co$11] = _$getNextMarker(_el$56.nextSibling),
|
|
276
|
+
_el$59 = _el$53.nextSibling,
|
|
277
|
+
[_el$60, _co$12] = _$getNextMarker(_el$59.nextSibling);
|
|
278
|
+
_$insert(_el$48, () => props.label);
|
|
279
|
+
_$insert(_el$47, _$createComponent(Show, {
|
|
266
280
|
get when() {
|
|
267
281
|
return _$memo(() => props.changed !== undefined)() && read(props.changed);
|
|
268
282
|
},
|
|
269
283
|
get children() {
|
|
270
|
-
var _el$
|
|
271
|
-
_$insert(_el$
|
|
272
|
-
return _el$
|
|
284
|
+
var _el$49 = _$getNextElement(_tmpl$1);
|
|
285
|
+
_$insert(_el$49, () => settingsMessages().unsaved);
|
|
286
|
+
return _el$49;
|
|
273
287
|
}
|
|
274
|
-
}), _el$
|
|
275
|
-
_$setAttribute(_el$
|
|
276
|
-
_$insert(_el$
|
|
277
|
-
_$insert(_el$
|
|
278
|
-
_$insert(_el$
|
|
288
|
+
}), _el$51, _co$1);
|
|
289
|
+
_$setAttribute(_el$52, "id", descriptionId);
|
|
290
|
+
_$insert(_el$52, () => props.description);
|
|
291
|
+
_$insert(_el$53, control, _el$55, _co$10);
|
|
292
|
+
_$insert(_el$53, _$createComponent(Show, {
|
|
279
293
|
get when() {
|
|
280
294
|
return read(props.error);
|
|
281
295
|
},
|
|
282
296
|
children: error => (() => {
|
|
283
|
-
var _el$
|
|
284
|
-
_el$
|
|
285
|
-
_el$
|
|
286
|
-
_el$
|
|
287
|
-
[_el$
|
|
288
|
-
_$setAttribute(_el$
|
|
289
|
-
_$insert(_el$
|
|
290
|
-
return _el$
|
|
297
|
+
var _el$61 = _$getNextElement(_tmpl$12),
|
|
298
|
+
_el$62 = _el$61.firstChild,
|
|
299
|
+
_el$63 = _el$62.nextSibling,
|
|
300
|
+
_el$64 = _el$63.nextSibling,
|
|
301
|
+
[_el$65, _co$13] = _$getNextMarker(_el$64.nextSibling);
|
|
302
|
+
_$setAttribute(_el$61, "id", errorId);
|
|
303
|
+
_$insert(_el$61, error, _el$65, _co$13);
|
|
304
|
+
return _el$61;
|
|
291
305
|
})()
|
|
292
|
-
}), _el$
|
|
293
|
-
_$
|
|
294
|
-
|
|
306
|
+
}), _el$57, _co$11);
|
|
307
|
+
_$insert(_el$45, _$createComponent(Show, {
|
|
308
|
+
get when() {
|
|
309
|
+
return source();
|
|
310
|
+
},
|
|
311
|
+
get children() {
|
|
312
|
+
var _el$58 = _$getNextElement(_tmpl$10);
|
|
313
|
+
_$insert(_el$58, source);
|
|
314
|
+
return _el$58;
|
|
315
|
+
}
|
|
316
|
+
}), _el$60, _co$12);
|
|
317
|
+
_$effect(_p$ => {
|
|
318
|
+
var _v$5 = props.id,
|
|
319
|
+
_v$6 = `k2b-settings-field ${props.class ?? ""}`,
|
|
320
|
+
_v$7 = props.width ?? "long";
|
|
321
|
+
_v$5 !== _p$.e && _$setAttribute(_el$44, "id", _p$.e = _v$5);
|
|
322
|
+
_v$6 !== _p$.t && _$className(_el$44, _p$.t = _v$6);
|
|
323
|
+
_v$7 !== _p$.a && _$setAttribute(_el$44, "data-width", _p$.a = _v$7);
|
|
324
|
+
return _p$;
|
|
325
|
+
}, {
|
|
326
|
+
e: undefined,
|
|
327
|
+
t: undefined,
|
|
328
|
+
a: undefined
|
|
329
|
+
});
|
|
330
|
+
return _el$44;
|
|
295
331
|
})();
|
|
296
332
|
}
|
|
297
333
|
const SettingsActions = props => {
|
|
@@ -302,12 +338,12 @@ const SettingsActions = props => {
|
|
|
302
338
|
const disabled = () => loading() || Boolean(props.disableWithoutChanges && changeCount() === 0);
|
|
303
339
|
const saveDisabled = () => disabled() || Boolean(props.saveDisabled !== undefined && read(props.saveDisabled));
|
|
304
340
|
return (() => {
|
|
305
|
-
var _el$
|
|
306
|
-
_el$
|
|
307
|
-
[_el$
|
|
308
|
-
_el$
|
|
309
|
-
[_el$
|
|
310
|
-
_$insert(_el$
|
|
341
|
+
var _el$66 = _$getNextElement(_tmpl$14),
|
|
342
|
+
_el$68 = _el$66.firstChild,
|
|
343
|
+
[_el$69, _co$14] = _$getNextMarker(_el$68.nextSibling),
|
|
344
|
+
_el$70 = _el$69.nextSibling,
|
|
345
|
+
[_el$71, _co$15] = _$getNextMarker(_el$70.nextSibling);
|
|
346
|
+
_$insert(_el$66, _$createComponent(Button, {
|
|
311
347
|
variant: "secondary",
|
|
312
348
|
get disabled() {
|
|
313
349
|
return disabled();
|
|
@@ -318,8 +354,8 @@ const SettingsActions = props => {
|
|
|
318
354
|
get children() {
|
|
319
355
|
return promptMessages().discard;
|
|
320
356
|
}
|
|
321
|
-
}), _el$
|
|
322
|
-
_$insert(_el$
|
|
357
|
+
}), _el$69, _co$14);
|
|
358
|
+
_$insert(_el$66, _$createComponent(Button, {
|
|
323
359
|
get variant() {
|
|
324
360
|
return props.saveVariant ?? "primary";
|
|
325
361
|
},
|
|
@@ -336,10 +372,10 @@ const SettingsActions = props => {
|
|
|
336
372
|
return props.onSave;
|
|
337
373
|
},
|
|
338
374
|
get children() {
|
|
339
|
-
return [_$getNextElement(_tmpl$
|
|
375
|
+
return [_$getNextElement(_tmpl$13), _$memo(() => props.saveLabel ?? settingsMessages().saveChanges)];
|
|
340
376
|
}
|
|
341
|
-
}), _el$
|
|
342
|
-
return _el$
|
|
377
|
+
}), _el$71, _co$15);
|
|
378
|
+
return _el$66;
|
|
343
379
|
})();
|
|
344
380
|
};
|
|
345
381
|
export function SettingsSaveBar(props) {
|
|
@@ -350,21 +386,21 @@ export function SettingsSaveBar(props) {
|
|
|
350
386
|
return changeCount() > 0;
|
|
351
387
|
},
|
|
352
388
|
get children() {
|
|
353
|
-
var _el$
|
|
354
|
-
_el$
|
|
355
|
-
_el$
|
|
356
|
-
_el$
|
|
357
|
-
_el$
|
|
358
|
-
[_el$
|
|
359
|
-
_el$
|
|
360
|
-
[_el$
|
|
361
|
-
_$insert(_el$
|
|
362
|
-
_$insert(_el$
|
|
389
|
+
var _el$72 = _$getNextElement(_tmpl$15),
|
|
390
|
+
_el$73 = _el$72.firstChild,
|
|
391
|
+
_el$74 = _el$73.firstChild,
|
|
392
|
+
_el$75 = _el$74.nextSibling,
|
|
393
|
+
_el$76 = _el$75.nextSibling,
|
|
394
|
+
[_el$77, _co$16] = _$getNextMarker(_el$76.nextSibling),
|
|
395
|
+
_el$78 = _el$73.nextSibling,
|
|
396
|
+
[_el$79, _co$17] = _$getNextMarker(_el$78.nextSibling);
|
|
397
|
+
_$insert(_el$74, changeCount);
|
|
398
|
+
_$insert(_el$73, () => settingsMessages().unsavedChangeLabel({
|
|
363
399
|
count: changeCount()
|
|
364
|
-
}), _el$
|
|
365
|
-
_$insert(_el$
|
|
366
|
-
_$effect(() => _$className(_el$
|
|
367
|
-
return _el$
|
|
400
|
+
}), _el$77, _co$16);
|
|
401
|
+
_$insert(_el$72, _$createComponent(SettingsActions, props), _el$79, _co$17);
|
|
402
|
+
_$effect(() => _$className(_el$72, `k2b-settings-save-bar ${props.class ?? ""}`));
|
|
403
|
+
return _el$72;
|
|
368
404
|
}
|
|
369
405
|
});
|
|
370
406
|
}
|
|
@@ -372,8 +408,8 @@ export function SettingsPanelFooter(props) {
|
|
|
372
408
|
const settingsMessages = useSettingsMessages();
|
|
373
409
|
const changeCount = () => read(props.changeCount);
|
|
374
410
|
return [(() => {
|
|
375
|
-
var _el$
|
|
376
|
-
_$insert(_el$
|
|
411
|
+
var _el$80 = _$getNextElement(_tmpl$17);
|
|
412
|
+
_$insert(_el$80, _$createComponent(Show, {
|
|
377
413
|
get when() {
|
|
378
414
|
return changeCount() > 0;
|
|
379
415
|
},
|
|
@@ -382,15 +418,15 @@ export function SettingsPanelFooter(props) {
|
|
|
382
418
|
},
|
|
383
419
|
get children() {
|
|
384
420
|
return [(() => {
|
|
385
|
-
var _el$
|
|
386
|
-
_$insert(_el$
|
|
387
|
-
return _el$
|
|
421
|
+
var _el$81 = _$getNextElement(_tmpl$16);
|
|
422
|
+
_$insert(_el$81, changeCount);
|
|
423
|
+
return _el$81;
|
|
388
424
|
})(), " ", _$memo(() => settingsMessages().unsavedChangeLabel({
|
|
389
425
|
count: changeCount()
|
|
390
426
|
}))];
|
|
391
427
|
}
|
|
392
428
|
}));
|
|
393
|
-
return _el$
|
|
429
|
+
return _el$80;
|
|
394
430
|
})(), _$createComponent(SettingsActions, _$mergeProps(props, {
|
|
395
431
|
disableWithoutChanges: true
|
|
396
432
|
}))];
|
|
@@ -441,16 +477,16 @@ export function SaveStatus(props) {
|
|
|
441
477
|
const hasActions = () => Boolean(props.onSave && props.onDiscard) && state() !== "readonly";
|
|
442
478
|
const pending = () => state() === "draft" || state() === "failed" || state() === "invalid" || state() === "saving";
|
|
443
479
|
return (() => {
|
|
444
|
-
var _el$
|
|
445
|
-
_el$
|
|
446
|
-
_el$
|
|
447
|
-
_el$
|
|
448
|
-
_el$
|
|
449
|
-
[_el$
|
|
450
|
-
_el$
|
|
451
|
-
[_el$
|
|
452
|
-
_$insert(_el$
|
|
453
|
-
_$insert(_el$
|
|
480
|
+
var _el$82 = _$getNextElement(_tmpl$18),
|
|
481
|
+
_el$83 = _el$82.firstChild,
|
|
482
|
+
_el$84 = _el$83.firstChild,
|
|
483
|
+
_el$85 = _el$84.firstChild,
|
|
484
|
+
_el$86 = _el$85.nextSibling,
|
|
485
|
+
[_el$87, _co$18] = _$getNextMarker(_el$86.nextSibling),
|
|
486
|
+
_el$88 = _el$83.nextSibling,
|
|
487
|
+
[_el$89, _co$19] = _$getNextMarker(_el$88.nextSibling);
|
|
488
|
+
_$insert(_el$84, text, _el$87, _co$18);
|
|
489
|
+
_$insert(_el$82, _$createComponent(Show, {
|
|
454
490
|
get when() {
|
|
455
491
|
return hasActions();
|
|
456
492
|
},
|
|
@@ -471,21 +507,21 @@ export function SaveStatus(props) {
|
|
|
471
507
|
disableWithoutChanges: true
|
|
472
508
|
});
|
|
473
509
|
}
|
|
474
|
-
}), _el$
|
|
510
|
+
}), _el$89, _co$19);
|
|
475
511
|
_$effect(_p$ => {
|
|
476
|
-
var _v$
|
|
477
|
-
_v$
|
|
478
|
-
_v$
|
|
479
|
-
_v$
|
|
480
|
-
_v$
|
|
481
|
-
_v$
|
|
512
|
+
var _v$8 = `k2b-save-status ${props.class ?? ""}`,
|
|
513
|
+
_v$9 = state(),
|
|
514
|
+
_v$0 = `${SAVE_STATUS_ICON[state()]}${state() === "saving" ? " k2b-spin" : ""}`;
|
|
515
|
+
_v$8 !== _p$.e && _$className(_el$82, _p$.e = _v$8);
|
|
516
|
+
_v$9 !== _p$.t && _$setAttribute(_el$84, "data-state", _p$.t = _v$9);
|
|
517
|
+
_v$0 !== _p$.a && _$className(_el$85, _p$.a = _v$0);
|
|
482
518
|
return _p$;
|
|
483
519
|
}, {
|
|
484
520
|
e: undefined,
|
|
485
521
|
t: undefined,
|
|
486
522
|
a: undefined
|
|
487
523
|
});
|
|
488
|
-
return _el$
|
|
524
|
+
return _el$82;
|
|
489
525
|
})();
|
|
490
526
|
}
|
|
491
527
|
//# sourceMappingURL=Settings.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["layout/Settings.tsx"],"sourcesContent":["import { children, createMemo, createUniqueId, type JSX, Show } from \"solid-js\";\nimport { Button, type ButtonVariant } from \"../actions/Button\";\nimport { usePromptMessages } from \"../feedback/prompt-messages\";\nimport type { MaybeAccessor } from \"../inputs/field-contract\";\nimport { useSettingsMessages } from \"./settings-messages\";\n\nconst read = <T,>(value: MaybeAccessor<T>): T => (typeof value === \"function\" ? (value as () => T)() : value);\n\nexport type SettingsPageProps = {\n title: JSX.Element;\n /** False when a surrounding head already shows the title, such as a workspace level; the actions move to the footer. */\n header?: boolean;\n subtitle?: JSX.Element;\n icon?: string;\n actions?: JSX.Element;\n children: JSX.Element;\n footer?: JSX.Element;\n scrollPreserveKey?: string;\n class?: string;\n style?: JSX.CSSProperties | string;\n};\n\nexport function SettingsPage(props: SettingsPageProps): JSX.Element {\n return (\n <section\n class={`k2b-settings-page${props.class ? ` ${props.class}` : \"\"}`}\n style={props.style}\n aria-label={props.header === false && typeof props.title === \"string\" ? props.title : undefined}\n >\n <Show when={props.header !== false}>\n <header class=\"k2b-settings-page__header\">\n <Show when={props.icon}>{(icon) => <i class={icon()} aria-hidden=\"true\" />}</Show>\n <div class=\"k2b-settings-page__heading\">\n <h1>{props.title}</h1>\n <Show when={props.subtitle}>\n <p>{props.subtitle}</p>\n </Show>\n </div>\n <Show when={props.actions}>\n <div class=\"k2b-settings-page__actions\">{props.actions}</div>\n </Show>\n </header>\n </Show>\n <div class=\"k2b-settings-page__body\" data-scroll-preserve={props.scrollPreserveKey}>\n {props.children}\n </div>\n <Show when={props.footer}>\n <footer class=\"k2b-settings-page__footer\">{props.footer}</footer>\n </Show>\n </section>\n );\n}\n\nexport type SettingsSectionProps = {\n title: JSX.Element;\n subtitle?: JSX.Element;\n icon?: string;\n actions?: JSX.Element;\n children: JSX.Element;\n class?: string;\n};\n\n/**\n * A full-page settings group: a heading, optional actions and its fields on the\n * page surface without a card. Dialogs keep using PanelDialog.Section.\n */\nexport function SettingsSection(props: SettingsSectionProps): JSX.Element {\n const headingId = `k2b-settings-section-${createUniqueId()}`;\n return (\n <section class={`k2b-settings-section${props.class ? ` ${props.class}` : \"\"}`} aria-labelledby={headingId}>\n <header class=\"k2b-settings-section__header\">\n <Show when={props.icon}>{(icon) => <i class={icon()} aria-hidden=\"true\" />}</Show>\n <div class=\"k2b-settings-section__heading\">\n <h2 id={headingId}>{props.title}</h2>\n <Show when={props.subtitle}>\n <p>{props.subtitle}</p>\n </Show>\n </div>\n <Show when={props.actions}>\n <div class=\"k2b-settings-section__actions\">{props.actions}</div>\n </Show>\n </header>\n <div class=\"k2b-settings-section__body\">{props.children}</div>\n </section>\n );\n}\n\nconst SETTINGS_GROUP_ACTION = Symbol(\"SettingsGroup.Action\");\n\nexport type SettingsGroupProps = {\n title: JSX.Element;\n description?: JSX.Element;\n children: JSX.Element;\n class?: string;\n};\n\nexport type SettingsGroupActionProps = {\n children: JSX.Element;\n};\n\ntype SettingsGroupActionDefinition = {\n readonly kind: typeof SETTINGS_GROUP_ACTION;\n readonly props: SettingsGroupActionProps;\n};\n\ntype SettingsGroupComponent = ((props: SettingsGroupProps) => JSX.Element) & {\n Action: (props: SettingsGroupActionProps) => JSX.Element;\n};\n\nconst SettingsGroupAction = (props: SettingsGroupActionProps): JSX.Element =>\n ({ kind: SETTINGS_GROUP_ACTION, props }) satisfies SettingsGroupActionDefinition as unknown as JSX.Element;\n\nconst collectSettingsGroupActions = (value: unknown): SettingsGroupActionDefinition[] => {\n if (Array.isArray(value)) return value.flatMap(collectSettingsGroupActions);\n return value && typeof value === \"object\" && (value as { kind?: unknown }).kind === SETTINGS_GROUP_ACTION\n ? [value as SettingsGroupActionDefinition]\n : [];\n};\n\nconst collectSettingsGroupContent = (value: unknown): JSX.Element[] => {\n if (Array.isArray(value)) return value.flatMap(collectSettingsGroupContent);\n return value && typeof value === \"object\" && (value as { kind?: unknown }).kind === SETTINGS_GROUP_ACTION ? [] : [value as JSX.Element];\n};\n\nexport const SettingsGroup = ((props: SettingsGroupProps): JSX.Element => {\n const resolved = children(() => props.children);\n const action = createMemo(() => collectSettingsGroupActions(resolved())[0]);\n const content = createMemo(() => collectSettingsGroupContent(resolved()));\n const headingId = `k2b-settings-group-${createUniqueId()}`;\n return (\n <section class={`k2b-settings-group${props.class ? ` ${props.class}` : \"\"}`} aria-labelledby={headingId}>\n <header class=\"k2b-settings-group__header\">\n <div class=\"k2b-settings-group__heading\">\n <h3 id={headingId}>{props.title}</h3>\n <Show when={props.description}>\n <p>{props.description}</p>\n </Show>\n </div>\n <Show when={action()}>{(slot) => <div class=\"k2b-settings-group__action\">{slot().props.children}</div>}</Show>\n </header>\n <div class=\"k2b-settings-group__body\">{content()}</div>\n </section>\n );\n}) as SettingsGroupComponent;\n\nSettingsGroup.Action = SettingsGroupAction;\n\nexport const sameSettingValue = (left: unknown, right: unknown): boolean => JSON.stringify(left) === JSON.stringify(right);\n\nexport const readSettingsError = async (\n response: Pick<Response, \"json\">,\n fallback: string,\n): Promise<{ message: string; fields: Record<string, string> }> => {\n const data = (await response.json().catch(() => null)) as {\n message?: string;\n errors?: Record<string, string>;\n } | null;\n return { message: data?.message ?? fallback, fields: data?.errors ?? {} };\n};\n\nexport type SettingsFieldProps = {\n label: string;\n description: string;\n error: MaybeAccessor<string | undefined>;\n changed?: MaybeAccessor<boolean>;\n children: JSX.Element | ((control: SettingsFieldControlProps) => JSX.Element);\n class?: string;\n};\n\nexport type SettingsFieldControlProps = {\n describedBy: () => string;\n};\n\nexport function SettingsField(props: SettingsFieldProps): JSX.Element {\n const settingsMessages = useSettingsMessages();\n const id = createUniqueId();\n const descriptionId = `k2b-settings-field-${id}-description`;\n const errorId = `k2b-settings-field-${id}-error`;\n const describedBy = () => (read(props.error) ? `${descriptionId} ${errorId}` : descriptionId);\n const control = () =>\n typeof props.children === \"function\"\n ? (props.children as (control: SettingsFieldControlProps) => JSX.Element)({ describedBy })\n : props.children;\n return (\n <div class={`k2b-settings-field ${props.class ?? \"\"}`}>\n <div class=\"k2b-settings-field__copy\">\n <div class=\"k2b-settings-field__heading\">\n <strong>{props.label}</strong>\n <Show when={props.changed !== undefined && read(props.changed)}>\n <span>{settingsMessages().unsaved}</span>\n </Show>\n </div>\n <p id={descriptionId}>{props.description}</p>\n </div>\n {control()}\n <Show when={read(props.error)}>\n {(error) => (\n <p id={errorId} class=\"k2b-settings-field__error\" role=\"alert\">\n <i class=\"ti ti-alert-circle\" aria-hidden=\"true\" /> {error()}\n </p>\n )}\n </Show>\n </div>\n );\n}\n\nexport type SettingsSaveBarProps = {\n changeCount: MaybeAccessor<number>;\n loading: MaybeAccessor<boolean>;\n saveDisabled?: MaybeAccessor<boolean>;\n onDiscard: () => void;\n onSave: () => void;\n saveLabel?: string;\n saveVariant?: ButtonVariant;\n class?: string;\n};\n\nconst SettingsActions = (\n props: SettingsSaveBarProps & {\n disableWithoutChanges?: boolean;\n },\n): JSX.Element => {\n const promptMessages = usePromptMessages();\n const settingsMessages = useSettingsMessages();\n const changeCount = () => read(props.changeCount);\n const loading = () => read(props.loading);\n const disabled = () => loading() || Boolean(props.disableWithoutChanges && changeCount() === 0);\n const saveDisabled = () => disabled() || Boolean(props.saveDisabled !== undefined && read(props.saveDisabled));\n return (\n <div class=\"k2b-settings-actions\">\n <Button variant=\"secondary\" disabled={disabled()} onClick={props.onDiscard}>\n {promptMessages().discard}\n </Button>\n <Button\n variant={props.saveVariant ?? \"primary\"}\n loading={loading()}\n loadingLabel={settingsMessages().saving}\n disabled={saveDisabled()}\n onClick={props.onSave}\n >\n <i class=\"ti ti-device-floppy\" aria-hidden=\"true\" />\n {props.saveLabel ?? settingsMessages().saveChanges}\n </Button>\n </div>\n );\n};\n\nexport function SettingsSaveBar(props: SettingsSaveBarProps): JSX.Element {\n const settingsMessages = useSettingsMessages();\n const changeCount = () => read(props.changeCount);\n return (\n <Show when={changeCount() > 0}>\n <div class={`k2b-settings-save-bar ${props.class ?? \"\"}`}>\n <p role=\"status\" aria-live=\"polite\">\n <strong>{changeCount()}</strong> {settingsMessages().unsavedChangeLabel({ count: changeCount() })}\n </p>\n <SettingsActions {...props} />\n </div>\n </Show>\n );\n}\n\nexport type SettingsPanelFooterProps = SettingsSaveBarProps;\n\nexport function SettingsPanelFooter(props: SettingsPanelFooterProps): JSX.Element {\n const settingsMessages = useSettingsMessages();\n const changeCount = () => read(props.changeCount);\n return (\n <>\n <p class=\"k2b-settings-panel-footer__status\" role=\"status\" aria-live=\"polite\">\n <Show when={changeCount() > 0} fallback={settingsMessages().noUnsavedChanges}>\n <strong>{changeCount()}</strong> {settingsMessages().unsavedChangeLabel({ count: changeCount() })}\n </Show>\n </p>\n <SettingsActions {...props} disableWithoutChanges />\n </>\n );\n}\n\nexport type SaveStatusState = \"saved\" | \"draft\" | \"saving\" | \"failed\" | \"invalid\" | \"unknown\" | \"readonly\";\n\nexport type SaveStatusProps = {\n /** What the person's values are now: saved, a draft with changes, being saved, or a problem that kept them unsaved. */\n state: MaybeAccessor<SaveStatusState>;\n /** Formatted time of the last save, shown with `saved`. */\n savedAt?: MaybeAccessor<string | undefined>;\n /** Fields to check, shown with `invalid`. Default 1. */\n invalidCount?: MaybeAccessor<number>;\n /** With both handlers, Discard and Save follow the status while there is something to save. */\n onDiscard?: () => void;\n onSave?: () => void;\n saveLabel?: string;\n saveDisabled?: MaybeAccessor<boolean>;\n class?: string;\n};\n\nconst SAVE_STATUS_ICON: Record<SaveStatusState, string> = {\n saved: \"ti ti-check\",\n draft: \"ti ti-pencil\",\n saving: \"ti ti-loader-2\",\n failed: \"ti ti-alert-triangle\",\n invalid: \"ti ti-alert-triangle\",\n unknown: \"ti ti-help-circle\",\n readonly: \"ti ti-lock\",\n};\n\n/**\n * The save status of a settings form at one fixed place, usually the head of its column. It reserves its width, so\n * a change of state never moves the title or the buttons beside it. Problems with one field stay at that field.\n */\nexport function SaveStatus(props: SaveStatusProps): JSX.Element {\n const settingsMessages = useSettingsMessages();\n const state = () => read(props.state);\n const text = () => {\n const t = settingsMessages();\n switch (state()) {\n case \"saved\": {\n const at = props.savedAt === undefined ? undefined : read(props.savedAt);\n return at ? t.statusSavedAt({ time: at }) : t.statusSaved;\n }\n case \"draft\":\n return t.statusDraft;\n case \"saving\":\n return t.saving;\n case \"failed\":\n return t.statusFailed;\n case \"invalid\":\n return t.statusInvalid({ count: props.invalidCount === undefined ? 1 : read(props.invalidCount) });\n case \"unknown\":\n return t.statusUnknown;\n case \"readonly\":\n return t.statusReadOnly;\n }\n };\n const hasActions = () => Boolean(props.onSave && props.onDiscard) && state() !== \"readonly\";\n const pending = () => state() === \"draft\" || state() === \"failed\" || state() === \"invalid\" || state() === \"saving\";\n return (\n <div class={`k2b-save-status ${props.class ?? \"\"}`}>\n <span class=\"k2b-save-status__slot\">\n <span class=\"k2b-save-status__state\" data-state={state()} role=\"status\" aria-live=\"polite\">\n <i class={`${SAVE_STATUS_ICON[state()]}${state() === \"saving\" ? \" k2b-spin\" : \"\"}`} aria-hidden=\"true\" />\n {text()}\n </span>\n </span>\n <Show when={hasActions()}>\n <SettingsActions\n changeCount={() => (pending() ? 1 : 0)}\n loading={() => state() === \"saving\"}\n saveDisabled={() => state() === \"invalid\" || Boolean(props.saveDisabled !== undefined && read(props.saveDisabled))}\n onDiscard={props.onDiscard!}\n onSave={props.onSave!}\n saveLabel={props.saveLabel ?? settingsMessages().save}\n disableWithoutChanges\n />\n </Show>\n </div>\n );\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":[],"sources":["layout/Settings.tsx"],"sourcesContent":["import { children, createMemo, createUniqueId, type JSX, Show } from \"solid-js\";\nimport { Button, type ButtonVariant } from \"../actions/Button\";\nimport { usePromptMessages } from \"../feedback/prompt-messages\";\nimport type { MaybeAccessor } from \"../inputs/field-contract\";\nimport { useSettingsMessages } from \"./settings-messages\";\n\nconst read = <T,>(value: MaybeAccessor<T>): T => (typeof value === \"function\" ? (value as () => T)() : value);\n\nexport type SettingsPageProps = {\n title: JSX.Element;\n /** False when a surrounding head already shows the title, such as a workspace level; the actions move to the footer. */\n header?: boolean;\n subtitle?: JSX.Element;\n icon?: string;\n actions?: JSX.Element;\n children: JSX.Element;\n footer?: JSX.Element;\n scrollPreserveKey?: string;\n class?: string;\n style?: JSX.CSSProperties | string;\n};\n\nexport function SettingsPage(props: SettingsPageProps): JSX.Element {\n return (\n <section\n class={`k2b-settings-page${props.class ? ` ${props.class}` : \"\"}`}\n style={props.style}\n aria-label={props.header === false && typeof props.title === \"string\" ? props.title : undefined}\n >\n <Show when={props.header !== false}>\n <header class=\"k2b-settings-page__header\">\n <Show when={props.icon}>{(icon) => <i class={icon()} aria-hidden=\"true\" />}</Show>\n <div class=\"k2b-settings-page__heading\">\n <h1>{props.title}</h1>\n <Show when={props.subtitle}>\n <p>{props.subtitle}</p>\n </Show>\n </div>\n <Show when={props.actions}>\n <div class=\"k2b-settings-page__actions\">{props.actions}</div>\n </Show>\n </header>\n </Show>\n <div class=\"k2b-settings-page__body\" data-scroll-preserve={props.scrollPreserveKey}>\n {props.children}\n </div>\n <Show when={props.footer}>\n <footer class=\"k2b-settings-page__footer\">{props.footer}</footer>\n </Show>\n </section>\n );\n}\n\nexport type SettingsSectionProps = {\n title: JSX.Element;\n subtitle?: JSX.Element;\n icon?: string;\n actions?: JSX.Element;\n children: JSX.Element;\n class?: string;\n};\n\n/**\n * A full-page settings group: a heading, optional actions and its fields on the\n * page surface without a card. From 860 px of its own width the heading takes a\n * column beside the fields. Dialogs keep using PanelDialog.Section.\n */\nexport function SettingsSection(props: SettingsSectionProps): JSX.Element {\n const headingId = `k2b-settings-section-${createUniqueId()}`;\n return (\n <section class={`k2b-settings-section${props.class ? ` ${props.class}` : \"\"}`} aria-labelledby={headingId}>\n <div class=\"k2b-settings-section__layout\">\n <header class=\"k2b-settings-section__header\">\n <Show when={props.icon}>{(icon) => <i class={icon()} aria-hidden=\"true\" />}</Show>\n <div class=\"k2b-settings-section__heading\">\n <h2 id={headingId}>{props.title}</h2>\n <Show when={props.subtitle}>\n <p>{props.subtitle}</p>\n </Show>\n </div>\n <Show when={props.actions}>\n <div class=\"k2b-settings-section__actions\">{props.actions}</div>\n </Show>\n </header>\n <div class=\"k2b-settings-section__body\">{props.children}</div>\n </div>\n </section>\n );\n}\n\nconst SETTINGS_GROUP_ACTION = Symbol(\"SettingsGroup.Action\");\n\nexport type SettingsGroupProps = {\n title: JSX.Element;\n description?: JSX.Element;\n children: JSX.Element;\n class?: string;\n};\n\nexport type SettingsGroupActionProps = {\n children: JSX.Element;\n};\n\ntype SettingsGroupActionDefinition = {\n readonly kind: typeof SETTINGS_GROUP_ACTION;\n readonly props: SettingsGroupActionProps;\n};\n\ntype SettingsGroupComponent = ((props: SettingsGroupProps) => JSX.Element) & {\n Action: (props: SettingsGroupActionProps) => JSX.Element;\n};\n\nconst SettingsGroupAction = (props: SettingsGroupActionProps): JSX.Element =>\n ({ kind: SETTINGS_GROUP_ACTION, props }) satisfies SettingsGroupActionDefinition as unknown as JSX.Element;\n\nconst collectSettingsGroupActions = (value: unknown): SettingsGroupActionDefinition[] => {\n if (Array.isArray(value)) return value.flatMap(collectSettingsGroupActions);\n return value && typeof value === \"object\" && (value as { kind?: unknown }).kind === SETTINGS_GROUP_ACTION\n ? [value as SettingsGroupActionDefinition]\n : [];\n};\n\nconst collectSettingsGroupContent = (value: unknown): JSX.Element[] => {\n if (Array.isArray(value)) return value.flatMap(collectSettingsGroupContent);\n return value && typeof value === \"object\" && (value as { kind?: unknown }).kind === SETTINGS_GROUP_ACTION ? [] : [value as JSX.Element];\n};\n\nexport const SettingsGroup = ((props: SettingsGroupProps): JSX.Element => {\n const resolved = children(() => props.children);\n const action = createMemo(() => collectSettingsGroupActions(resolved())[0]);\n const content = createMemo(() => collectSettingsGroupContent(resolved()));\n const headingId = `k2b-settings-group-${createUniqueId()}`;\n return (\n <section class={`k2b-settings-group${props.class ? ` ${props.class}` : \"\"}`} aria-labelledby={headingId}>\n <header class=\"k2b-settings-group__header\">\n <div class=\"k2b-settings-group__heading\">\n <h3 id={headingId}>{props.title}</h3>\n <Show when={props.description}>\n <p>{props.description}</p>\n </Show>\n </div>\n <Show when={action()}>{(slot) => <div class=\"k2b-settings-group__action\">{slot().props.children}</div>}</Show>\n </header>\n <div class=\"k2b-settings-group__body\">{content()}</div>\n </section>\n );\n}) as SettingsGroupComponent;\n\nSettingsGroup.Action = SettingsGroupAction;\n\nexport const sameSettingValue = (left: unknown, right: unknown): boolean => JSON.stringify(left) === JSON.stringify(right);\n\nexport const readSettingsError = async (\n response: Pick<Response, \"json\">,\n fallback: string,\n): Promise<{ message: string; fields: Record<string, string> }> => {\n const data = (await response.json().catch(() => null)) as {\n message?: string;\n errors?: Record<string, string>;\n } | null;\n return { message: data?.message ?? fallback, fields: data?.errors ?? {} };\n};\n\n/**\n * The room a setting's control takes: `short` for a number, `medium` for a choice, `long` for text, and `full` for\n * an editor, which keeps its name above it and takes the whole row.\n */\nexport type SettingsFieldWidth = \"short\" | \"medium\" | \"long\" | \"full\";\n\nexport type SettingsFieldProps = {\n label: string;\n /** One sentence of help; longer guidance belongs in the page's guide. */\n description: string;\n error: MaybeAccessor<string | undefined>;\n changed?: MaybeAccessor<boolean>;\n /**\n * Where the value comes from, at a fixed place after the control: quiet text such as \"Default\", or the one way\n * back to it, such as a Reset button that only a value of its own shows.\n */\n source?: JSX.Element;\n /** The control's width by kind, so a number never stretches like a URL. Defaults to `long`, the full column. */\n width?: SettingsFieldWidth;\n /** The row's id, for a link that leads to this one setting. */\n id?: string;\n children: JSX.Element | ((control: SettingsFieldControlProps) => JSX.Element);\n class?: string;\n};\n\nexport type SettingsFieldControlProps = {\n describedBy: () => string;\n};\n\nexport function SettingsField(props: SettingsFieldProps): JSX.Element {\n const settingsMessages = useSettingsMessages();\n const id = createUniqueId();\n const descriptionId = `k2b-settings-field-${id}-description`;\n const errorId = `k2b-settings-field-${id}-error`;\n const describedBy = () => (read(props.error) ? `${descriptionId} ${errorId}` : descriptionId);\n const control = () =>\n typeof props.children === \"function\"\n ? (props.children as (control: SettingsFieldControlProps) => JSX.Element)({ describedBy })\n : props.children;\n const source = children(() => props.source);\n return (\n <div id={props.id} class={`k2b-settings-field ${props.class ?? \"\"}`} data-width={props.width ?? \"long\"}>\n <div class=\"k2b-settings-field__row\">\n <div class=\"k2b-settings-field__copy\">\n <div class=\"k2b-settings-field__heading\">\n <strong>{props.label}</strong>\n <Show when={props.changed !== undefined && read(props.changed)}>\n <span>{settingsMessages().unsaved}</span>\n </Show>\n </div>\n <p id={descriptionId}>{props.description}</p>\n </div>\n <div class=\"k2b-settings-field__control\">\n {control()}\n <Show when={read(props.error)}>\n {(error) => (\n <p id={errorId} class=\"k2b-settings-field__error\" role=\"alert\">\n <i class=\"ti ti-alert-circle\" aria-hidden=\"true\" /> {error()}\n </p>\n )}\n </Show>\n </div>\n <Show when={source()}>\n <div class=\"k2b-settings-field__source\">{source()}</div>\n </Show>\n </div>\n </div>\n );\n}\n\nexport type SettingsSaveBarProps = {\n changeCount: MaybeAccessor<number>;\n loading: MaybeAccessor<boolean>;\n saveDisabled?: MaybeAccessor<boolean>;\n onDiscard: () => void;\n onSave: () => void;\n saveLabel?: string;\n saveVariant?: ButtonVariant;\n class?: string;\n};\n\nconst SettingsActions = (\n props: SettingsSaveBarProps & {\n disableWithoutChanges?: boolean;\n },\n): JSX.Element => {\n const promptMessages = usePromptMessages();\n const settingsMessages = useSettingsMessages();\n const changeCount = () => read(props.changeCount);\n const loading = () => read(props.loading);\n const disabled = () => loading() || Boolean(props.disableWithoutChanges && changeCount() === 0);\n const saveDisabled = () => disabled() || Boolean(props.saveDisabled !== undefined && read(props.saveDisabled));\n return (\n <div class=\"k2b-settings-actions\">\n <Button variant=\"secondary\" disabled={disabled()} onClick={props.onDiscard}>\n {promptMessages().discard}\n </Button>\n <Button\n variant={props.saveVariant ?? \"primary\"}\n loading={loading()}\n loadingLabel={settingsMessages().saving}\n disabled={saveDisabled()}\n onClick={props.onSave}\n >\n <i class=\"ti ti-device-floppy\" aria-hidden=\"true\" />\n {props.saveLabel ?? settingsMessages().saveChanges}\n </Button>\n </div>\n );\n};\n\nexport function SettingsSaveBar(props: SettingsSaveBarProps): JSX.Element {\n const settingsMessages = useSettingsMessages();\n const changeCount = () => read(props.changeCount);\n return (\n <Show when={changeCount() > 0}>\n <div class={`k2b-settings-save-bar ${props.class ?? \"\"}`}>\n <p role=\"status\" aria-live=\"polite\">\n <strong>{changeCount()}</strong> {settingsMessages().unsavedChangeLabel({ count: changeCount() })}\n </p>\n <SettingsActions {...props} />\n </div>\n </Show>\n );\n}\n\nexport type SettingsPanelFooterProps = SettingsSaveBarProps;\n\nexport function SettingsPanelFooter(props: SettingsPanelFooterProps): JSX.Element {\n const settingsMessages = useSettingsMessages();\n const changeCount = () => read(props.changeCount);\n return (\n <>\n <p class=\"k2b-settings-panel-footer__status\" role=\"status\" aria-live=\"polite\">\n <Show when={changeCount() > 0} fallback={settingsMessages().noUnsavedChanges}>\n <strong>{changeCount()}</strong> {settingsMessages().unsavedChangeLabel({ count: changeCount() })}\n </Show>\n </p>\n <SettingsActions {...props} disableWithoutChanges />\n </>\n );\n}\n\nexport type SaveStatusState = \"saved\" | \"draft\" | \"saving\" | \"failed\" | \"invalid\" | \"unknown\" | \"readonly\";\n\nexport type SaveStatusProps = {\n /** What the person's values are now: saved, a draft with changes, being saved, or a problem that kept them unsaved. */\n state: MaybeAccessor<SaveStatusState>;\n /** Formatted time of the last save, shown with `saved`. */\n savedAt?: MaybeAccessor<string | undefined>;\n /** Fields to check, shown with `invalid`. Default 1. */\n invalidCount?: MaybeAccessor<number>;\n /** With both handlers, Discard and Save follow the status while there is something to save. */\n onDiscard?: () => void;\n onSave?: () => void;\n saveLabel?: string;\n saveDisabled?: MaybeAccessor<boolean>;\n class?: string;\n};\n\nconst SAVE_STATUS_ICON: Record<SaveStatusState, string> = {\n saved: \"ti ti-check\",\n draft: \"ti ti-pencil\",\n saving: \"ti ti-loader-2\",\n failed: \"ti ti-alert-triangle\",\n invalid: \"ti ti-alert-triangle\",\n unknown: \"ti ti-help-circle\",\n readonly: \"ti ti-lock\",\n};\n\n/**\n * The save status of a settings form at one fixed place, usually the head of its column. It reserves its width, so\n * a change of state never moves the title or the buttons beside it. Problems with one field stay at that field.\n */\nexport function SaveStatus(props: SaveStatusProps): JSX.Element {\n const settingsMessages = useSettingsMessages();\n const state = () => read(props.state);\n const text = () => {\n const t = settingsMessages();\n switch (state()) {\n case \"saved\": {\n const at = props.savedAt === undefined ? undefined : read(props.savedAt);\n return at ? t.statusSavedAt({ time: at }) : t.statusSaved;\n }\n case \"draft\":\n return t.statusDraft;\n case \"saving\":\n return t.saving;\n case \"failed\":\n return t.statusFailed;\n case \"invalid\":\n return t.statusInvalid({ count: props.invalidCount === undefined ? 1 : read(props.invalidCount) });\n case \"unknown\":\n return t.statusUnknown;\n case \"readonly\":\n return t.statusReadOnly;\n }\n };\n const hasActions = () => Boolean(props.onSave && props.onDiscard) && state() !== \"readonly\";\n const pending = () => state() === \"draft\" || state() === \"failed\" || state() === \"invalid\" || state() === \"saving\";\n return (\n <div class={`k2b-save-status ${props.class ?? \"\"}`}>\n <span class=\"k2b-save-status__slot\">\n <span class=\"k2b-save-status__state\" data-state={state()} role=\"status\" aria-live=\"polite\">\n <i class={`${SAVE_STATUS_ICON[state()]}${state() === \"saving\" ? \" k2b-spin\" : \"\"}`} aria-hidden=\"true\" />\n {text()}\n </span>\n </span>\n <Show when={hasActions()}>\n <SettingsActions\n changeCount={() => (pending() ? 1 : 0)}\n loading={() => state() === \"saving\"}\n saveDisabled={() => state() === \"invalid\" || Boolean(props.saveDisabled !== undefined && read(props.saveDisabled))}\n onDiscard={props.onDiscard!}\n onSave={props.onSave!}\n saveLabel={props.saveLabel ?? settingsMessages().save}\n disableWithoutChanges\n />\n </Show>\n </div>\n );\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -20,6 +20,7 @@ var _tmpl$ = /*#__PURE__*/_$template(`<button type=button role=tab><!$><!/><span
|
|
|
20
20
|
_tmpl$8 = /*#__PURE__*/_$template(`<footer class=k2b-settings__footer>`);
|
|
21
21
|
import { children, createEffect, createMemo, createSignal, createUniqueId, For, Show } from "solid-js";
|
|
22
22
|
import { IconButton } from "../actions/Button";
|
|
23
|
+
import { revealInScroller } from "../internal/reveal-in-scroller";
|
|
23
24
|
import { useUiMessages } from "../intl/messages";
|
|
24
25
|
import { createScrollFade } from "./scroll-fade";
|
|
25
26
|
import { useSettingsMessages } from "./settings-messages";
|
|
@@ -102,10 +103,7 @@ const SettingsModal = props => {
|
|
|
102
103
|
// `defaultTab`, `activeTab` and clicks can select a category past the edge of the scrolling row or rail.
|
|
103
104
|
createEffect(() => {
|
|
104
105
|
const id = resolvedActiveTabId();
|
|
105
|
-
queueMicrotask(() => tabRefs.get(id)
|
|
106
|
-
block: "nearest",
|
|
107
|
-
inline: "nearest"
|
|
108
|
-
}));
|
|
106
|
+
queueMicrotask(() => revealInScroller(tabList, tabRefs.get(id)));
|
|
109
107
|
});
|
|
110
108
|
// A memo, so a change elsewhere in the tab list does not create the open panel again.
|
|
111
109
|
const activeTab = createMemo(() => tabs().find(tab => tab.props.id === resolvedActiveTabId()) ?? null);
|