@k2b/ui 0.43.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.
Files changed (128) hide show
  1. package/dist/browser/actions/Tabs.js +3 -4
  2. package/dist/browser/actions/Tabs.js.map +1 -1
  3. package/dist/browser/actions/menu-sheet.js +2 -3
  4. package/dist/browser/actions/menu-sheet.js.map +1 -1
  5. package/dist/browser/actions/phone-sheet.js +4 -0
  6. package/dist/browser/actions/phone-sheet.js.map +1 -0
  7. package/dist/browser/content/DataTable.js +47 -51
  8. package/dist/browser/content/DataTable.js.map +1 -1
  9. package/dist/browser/feedback/dialog-core.js +5 -1
  10. package/dist/browser/feedback/dialog-core.js.map +1 -1
  11. package/dist/browser/feedback/dialog-tone.js +26 -0
  12. package/dist/browser/feedback/dialog-tone.js.map +1 -0
  13. package/dist/browser/feedback/index.js.map +1 -1
  14. package/dist/browser/feedback/prompt-confirm.js +223 -0
  15. package/dist/browser/feedback/prompt-confirm.js.map +1 -0
  16. package/dist/browser/feedback/prompts.js +195 -343
  17. package/dist/browser/feedback/prompts.js.map +1 -1
  18. package/dist/browser/inputs/ChoiceList.js +45 -17
  19. package/dist/browser/inputs/ChoiceList.js.map +1 -1
  20. package/dist/browser/inputs/DatePicker.js +1647 -334
  21. package/dist/browser/inputs/DatePicker.js.map +1 -1
  22. package/dist/browser/inputs/TextInput.js +5 -4
  23. package/dist/browser/inputs/TextInput.js.map +1 -1
  24. package/dist/browser/inputs/date-input-messages.js +128 -0
  25. package/dist/browser/inputs/date-input-messages.js.map +1 -0
  26. package/dist/browser/inputs/date-input-status.js +132 -0
  27. package/dist/browser/inputs/date-input-status.js.map +1 -0
  28. package/dist/browser/inputs/date-input.js +334 -0
  29. package/dist/browser/inputs/date-input.js.map +1 -0
  30. package/dist/browser/inputs/date-sheet.js +49 -0
  31. package/dist/browser/inputs/date-sheet.js.map +1 -0
  32. package/dist/browser/internal/reveal-in-scroller.js +28 -0
  33. package/dist/browser/internal/reveal-in-scroller.js.map +1 -0
  34. package/dist/browser/intl/messages.js +6 -0
  35. package/dist/browser/intl/messages.js.map +1 -1
  36. package/dist/browser/layout/AppWorkspace.js +536 -512
  37. package/dist/browser/layout/AppWorkspace.js.map +1 -1
  38. package/dist/browser/layout/BottomSheet.js +3 -0
  39. package/dist/browser/layout/BottomSheet.js.map +1 -1
  40. package/dist/browser/layout/PanelDialog.js +167 -132
  41. package/dist/browser/layout/PanelDialog.js.map +1 -1
  42. package/dist/browser/layout/Settings.js +175 -139
  43. package/dist/browser/layout/Settings.js.map +1 -1
  44. package/dist/browser/layout/SettingsModal.js +2 -4
  45. package/dist/browser/layout/SettingsModal.js.map +1 -1
  46. package/dist/browser/layout/index.js.map +1 -1
  47. package/dist/browser/layout/navigation-model.js +12 -2
  48. package/dist/browser/layout/navigation-model.js.map +1 -1
  49. package/dist/browser/surfaces/StatusBadge.js +47 -14
  50. package/dist/browser/surfaces/StatusBadge.js.map +1 -1
  51. package/dist/browser/text-editor/TextEditor.js +7 -0
  52. package/dist/browser/text-editor/TextEditor.js.map +1 -1
  53. package/dist/ssr/actions/Tabs.js +3 -4
  54. package/dist/ssr/actions/Tabs.js.map +1 -1
  55. package/dist/ssr/actions/menu-sheet.js +2 -3
  56. package/dist/ssr/actions/menu-sheet.js.map +1 -1
  57. package/dist/ssr/actions/phone-sheet.js +4 -0
  58. package/dist/ssr/actions/phone-sheet.js.map +1 -0
  59. package/dist/ssr/content/DataTable.js +1 -2
  60. package/dist/ssr/content/DataTable.js.map +1 -1
  61. package/dist/ssr/feedback/dialog-core.js +5 -1
  62. package/dist/ssr/feedback/dialog-core.js.map +1 -1
  63. package/dist/ssr/feedback/dialog-tone.js +26 -0
  64. package/dist/ssr/feedback/dialog-tone.js.map +1 -0
  65. package/dist/ssr/feedback/index.js.map +1 -1
  66. package/dist/ssr/feedback/prompt-confirm.js +123 -0
  67. package/dist/ssr/feedback/prompt-confirm.js.map +1 -0
  68. package/dist/ssr/feedback/prompts.js +60 -132
  69. package/dist/ssr/feedback/prompts.js.map +1 -1
  70. package/dist/ssr/inputs/ChoiceList.js +29 -9
  71. package/dist/ssr/inputs/ChoiceList.js.map +1 -1
  72. package/dist/ssr/inputs/DatePicker.js +1183 -166
  73. package/dist/ssr/inputs/DatePicker.js.map +1 -1
  74. package/dist/ssr/inputs/TextInput.js +5 -4
  75. package/dist/ssr/inputs/TextInput.js.map +1 -1
  76. package/dist/ssr/inputs/date-input-messages.js +128 -0
  77. package/dist/ssr/inputs/date-input-messages.js.map +1 -0
  78. package/dist/ssr/inputs/date-input-status.js +132 -0
  79. package/dist/ssr/inputs/date-input-status.js.map +1 -0
  80. package/dist/ssr/inputs/date-input.js +334 -0
  81. package/dist/ssr/inputs/date-input.js.map +1 -0
  82. package/dist/ssr/inputs/date-sheet.js +44 -0
  83. package/dist/ssr/inputs/date-sheet.js.map +1 -0
  84. package/dist/ssr/internal/reveal-in-scroller.js +28 -0
  85. package/dist/ssr/internal/reveal-in-scroller.js.map +1 -0
  86. package/dist/ssr/intl/messages.js +6 -0
  87. package/dist/ssr/intl/messages.js.map +1 -1
  88. package/dist/ssr/layout/AppWorkspace.js +44 -23
  89. package/dist/ssr/layout/AppWorkspace.js.map +1 -1
  90. package/dist/ssr/layout/BottomSheet.js +3 -0
  91. package/dist/ssr/layout/BottomSheet.js.map +1 -1
  92. package/dist/ssr/layout/PanelDialog.js +48 -30
  93. package/dist/ssr/layout/PanelDialog.js.map +1 -1
  94. package/dist/ssr/layout/Settings.js +34 -18
  95. package/dist/ssr/layout/Settings.js.map +1 -1
  96. package/dist/ssr/layout/SettingsModal.js +2 -4
  97. package/dist/ssr/layout/SettingsModal.js.map +1 -1
  98. package/dist/ssr/layout/index.js.map +1 -1
  99. package/dist/ssr/layout/navigation-model.js +12 -2
  100. package/dist/ssr/layout/navigation-model.js.map +1 -1
  101. package/dist/ssr/surfaces/StatusBadge.js +26 -8
  102. package/dist/ssr/surfaces/StatusBadge.js.map +1 -1
  103. package/dist/ssr/text-editor/TextEditor.js +7 -0
  104. package/dist/ssr/text-editor/TextEditor.js.map +1 -1
  105. package/dist/styles.css +1 -1
  106. package/dist/types/actions/menu-sheet.d.ts +1 -3
  107. package/dist/types/actions/phone-sheet.d.ts +3 -0
  108. package/dist/types/feedback/dialog-tone.d.ts +10 -0
  109. package/dist/types/feedback/index.d.ts +1 -0
  110. package/dist/types/feedback/prompt-confirm.d.ts +19 -0
  111. package/dist/types/feedback/prompts.d.ts +4 -8
  112. package/dist/types/inputs/ChoiceList.d.ts +7 -3
  113. package/dist/types/inputs/DatePicker.d.ts +13 -3
  114. package/dist/types/inputs/TextInput.d.ts +1 -1
  115. package/dist/types/inputs/date-input-messages.d.ts +64 -0
  116. package/dist/types/inputs/date-input-status.d.ts +35 -0
  117. package/dist/types/inputs/date-input.d.ts +90 -0
  118. package/dist/types/inputs/date-sheet.d.ts +14 -0
  119. package/dist/types/internal/reveal-in-scroller.d.ts +6 -0
  120. package/dist/types/intl/messages.d.ts +3 -0
  121. package/dist/types/layout/AppWorkspace.d.ts +14 -0
  122. package/dist/types/layout/BottomSheet.d.ts +3 -0
  123. package/dist/types/layout/PanelDialog.d.ts +3 -0
  124. package/dist/types/layout/Settings.d.ts +17 -1
  125. package/dist/types/layout/index.d.ts +1 -1
  126. package/dist/types/layout/navigation-model.d.ts +1 -1
  127. package/dist/types/surfaces/StatusBadge.d.ts +5 -0
  128. 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><div class=k2b-settings-field__copy><div class=k2b-settings-field__heading><strong></strong><!$><!/></div><p></p></div><!$><!/><!$><!/>`),
24
- _tmpl$11 = /*#__PURE__*/_$template(`<p class=k2b-settings-field__error role=alert><i class="ti ti-alert-circle"aria-hidden=true></i> <!$><!/>`),
25
- _tmpl$12 = /*#__PURE__*/_$template(`<i class="ti ti-device-floppy"aria-hidden=true>`),
26
- _tmpl$13 = /*#__PURE__*/_$template(`<div class=k2b-settings-actions><!$><!/><!$><!/>`),
27
- _tmpl$14 = /*#__PURE__*/_$template(`<div><p role=status aria-live=polite><strong></strong> <!$><!/></p><!$><!/>`),
28
- _tmpl$15 = /*#__PURE__*/_$template(`<strong>`),
29
- _tmpl$16 = /*#__PURE__*/_$template(`<p class=k2b-settings-panel-footer__status role=status aria-live=polite>`),
30
- _tmpl$17 = /*#__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><!$><!/>`);
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. Dialogs keep using PanelDialog.Section.
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$26 = _el$19.firstChild,
132
- [_el$27, _co$7] = _$getNextMarker(_el$26.nextSibling),
133
- _el$20 = _el$27.nextSibling,
134
- _el$21 = _el$20.firstChild,
135
- _el$23 = _el$21.nextSibling,
136
- [_el$24, _co$6] = _$getNextMarker(_el$23.nextSibling),
137
- _el$28 = _el$20.nextSibling,
138
- [_el$29, _co$8] = _$getNextMarker(_el$28.nextSibling),
139
- _el$30 = _el$19.nextSibling;
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$19, _$createComponent(Show, {
144
+ _$insert(_el$20, _$createComponent(Show, {
142
145
  get when() {
143
146
  return props.icon;
144
147
  },
145
148
  children: icon => (() => {
146
- var _el$31 = _$getNextElement(_tmpl$6);
147
- _$effect(() => _$className(_el$31, icon()));
148
- return _el$31;
149
+ var _el$32 = _$getNextElement(_tmpl$6);
150
+ _$effect(() => _$className(_el$32, icon()));
151
+ return _el$32;
149
152
  })()
150
- }), _el$27, _co$7);
151
- _$setAttribute(_el$21, "id", headingId);
152
- _$insert(_el$21, () => props.title);
153
- _$insert(_el$20, _$createComponent(Show, {
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$22 = _$getNextElement(_tmpl$);
159
- _$insert(_el$22, () => props.subtitle);
160
- return _el$22;
161
+ var _el$23 = _$getNextElement(_tmpl$);
162
+ _$insert(_el$23, () => props.subtitle);
163
+ return _el$23;
161
164
  }
162
- }), _el$24, _co$6);
163
- _$insert(_el$19, _$createComponent(Show, {
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$25 = _$getNextElement(_tmpl$7);
169
- _$insert(_el$25, () => props.actions);
170
- return _el$25;
171
+ var _el$26 = _$getNextElement(_tmpl$7);
172
+ _$insert(_el$26, () => props.actions);
173
+ return _el$26;
171
174
  }
172
- }), _el$29, _co$8);
173
- _$insert(_el$30, () => props.children);
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$32 = _$getNextElement(_tmpl$9),
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$37 = _el$35.nextSibling,
202
- [_el$38, _co$9] = _$getNextMarker(_el$37.nextSibling),
203
- _el$39 = _el$34.nextSibling,
204
- [_el$40, _co$0] = _$getNextMarker(_el$39.nextSibling),
205
- _el$41 = _el$33.nextSibling;
206
- _$setAttribute(_el$32, "aria-labelledby", headingId);
207
- _$setAttribute(_el$35, "id", headingId);
208
- _$insert(_el$35, () => props.title);
209
- _$insert(_el$34, _$createComponent(Show, {
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$36 = _$getNextElement(_tmpl$);
215
- _$insert(_el$36, () => props.description);
216
- return _el$36;
217
+ var _el$37 = _$getNextElement(_tmpl$);
218
+ _$insert(_el$37, () => props.description);
219
+ return _el$37;
217
220
  }
218
- }), _el$38, _co$9);
219
- _$insert(_el$33, _$createComponent(Show, {
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$42 = _$getNextElement(_tmpl$0);
225
- _$insert(_el$42, () => slot().props.children);
226
- return _el$42;
227
+ var _el$43 = _$getNextElement(_tmpl$0);
228
+ _$insert(_el$43, () => slot().props.children);
229
+ return _el$43;
227
230
  })()
228
- }), _el$40, _co$0);
229
- _$insert(_el$41, content);
230
- _$effect(() => _$className(_el$32, `k2b-settings-group${props.class ? ` ${props.class}` : ""}`));
231
- return _el$32;
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$43 = _$getNextElement(_tmpl$10),
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$48 = _el$46.nextSibling,
258
- [_el$49, _co$1] = _$getNextMarker(_el$48.nextSibling),
259
- _el$50 = _el$45.nextSibling,
260
- _el$51 = _el$44.nextSibling,
261
- [_el$52, _co$10] = _$getNextMarker(_el$51.nextSibling),
262
- _el$53 = _el$52.nextSibling,
263
- [_el$54, _co$11] = _$getNextMarker(_el$53.nextSibling);
264
- _$insert(_el$46, () => props.label);
265
- _$insert(_el$45, _$createComponent(Show, {
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$47 = _$getNextElement(_tmpl$1);
271
- _$insert(_el$47, () => settingsMessages().unsaved);
272
- return _el$47;
284
+ var _el$49 = _$getNextElement(_tmpl$1);
285
+ _$insert(_el$49, () => settingsMessages().unsaved);
286
+ return _el$49;
273
287
  }
274
- }), _el$49, _co$1);
275
- _$setAttribute(_el$50, "id", descriptionId);
276
- _$insert(_el$50, () => props.description);
277
- _$insert(_el$43, control, _el$52, _co$10);
278
- _$insert(_el$43, _$createComponent(Show, {
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$55 = _$getNextElement(_tmpl$11),
284
- _el$56 = _el$55.firstChild,
285
- _el$57 = _el$56.nextSibling,
286
- _el$58 = _el$57.nextSibling,
287
- [_el$59, _co$12] = _$getNextMarker(_el$58.nextSibling);
288
- _$setAttribute(_el$55, "id", errorId);
289
- _$insert(_el$55, error, _el$59, _co$12);
290
- return _el$55;
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$54, _co$11);
293
- _$effect(() => _$className(_el$43, `k2b-settings-field ${props.class ?? ""}`));
294
- return _el$43;
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$60 = _$getNextElement(_tmpl$13),
306
- _el$62 = _el$60.firstChild,
307
- [_el$63, _co$13] = _$getNextMarker(_el$62.nextSibling),
308
- _el$64 = _el$63.nextSibling,
309
- [_el$65, _co$14] = _$getNextMarker(_el$64.nextSibling);
310
- _$insert(_el$60, _$createComponent(Button, {
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$63, _co$13);
322
- _$insert(_el$60, _$createComponent(Button, {
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$12), _$memo(() => props.saveLabel ?? settingsMessages().saveChanges)];
375
+ return [_$getNextElement(_tmpl$13), _$memo(() => props.saveLabel ?? settingsMessages().saveChanges)];
340
376
  }
341
- }), _el$65, _co$14);
342
- return _el$60;
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$66 = _$getNextElement(_tmpl$14),
354
- _el$67 = _el$66.firstChild,
355
- _el$68 = _el$67.firstChild,
356
- _el$69 = _el$68.nextSibling,
357
- _el$70 = _el$69.nextSibling,
358
- [_el$71, _co$15] = _$getNextMarker(_el$70.nextSibling),
359
- _el$72 = _el$67.nextSibling,
360
- [_el$73, _co$16] = _$getNextMarker(_el$72.nextSibling);
361
- _$insert(_el$68, changeCount);
362
- _$insert(_el$67, () => settingsMessages().unsavedChangeLabel({
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$71, _co$15);
365
- _$insert(_el$66, _$createComponent(SettingsActions, props), _el$73, _co$16);
366
- _$effect(() => _$className(_el$66, `k2b-settings-save-bar ${props.class ?? ""}`));
367
- return _el$66;
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$74 = _$getNextElement(_tmpl$16);
376
- _$insert(_el$74, _$createComponent(Show, {
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$75 = _$getNextElement(_tmpl$15);
386
- _$insert(_el$75, changeCount);
387
- return _el$75;
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$74;
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$76 = _$getNextElement(_tmpl$17),
445
- _el$77 = _el$76.firstChild,
446
- _el$78 = _el$77.firstChild,
447
- _el$79 = _el$78.firstChild,
448
- _el$80 = _el$79.nextSibling,
449
- [_el$81, _co$17] = _$getNextMarker(_el$80.nextSibling),
450
- _el$82 = _el$77.nextSibling,
451
- [_el$83, _co$18] = _$getNextMarker(_el$82.nextSibling);
452
- _$insert(_el$78, text, _el$81, _co$17);
453
- _$insert(_el$76, _$createComponent(Show, {
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$83, _co$18);
510
+ }), _el$89, _co$19);
475
511
  _$effect(_p$ => {
476
- var _v$5 = `k2b-save-status ${props.class ?? ""}`,
477
- _v$6 = state(),
478
- _v$7 = `${SAVE_STATUS_ICON[state()]}${state() === "saving" ? " k2b-spin" : ""}`;
479
- _v$5 !== _p$.e && _$className(_el$76, _p$.e = _v$5);
480
- _v$6 !== _p$.t && _$setAttribute(_el$78, "data-state", _p$.t = _v$6);
481
- _v$7 !== _p$.a && _$className(_el$79, _p$.a = _v$7);
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$76;
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)?.scrollIntoView?.({
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);