@cratis/scene.blueprint.default 4.38.0 → 4.40.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 (167) hide show
  1. package/ComponentName.ts +27 -0
  2. package/defaultBlueprintComponents.ts +10 -1
  3. package/dist/cjs/ComponentName.js +9 -0
  4. package/dist/cjs/ComponentName.js.map +1 -1
  5. package/dist/cjs/defaultBlueprintComponents.js +19 -1
  6. package/dist/cjs/defaultBlueprintComponents.js.map +1 -1
  7. package/dist/cjs/foundation/BulkBar.js +62 -0
  8. package/dist/cjs/foundation/BulkBar.js.map +1 -0
  9. package/dist/cjs/foundation/DataList.js +436 -0
  10. package/dist/cjs/foundation/DataList.js.map +1 -0
  11. package/dist/cjs/foundation/FormScreenBody.js +447 -0
  12. package/dist/cjs/foundation/FormScreenBody.js.map +1 -0
  13. package/dist/cjs/foundation/FoundationStates.js +2 -1
  14. package/dist/cjs/foundation/FoundationStates.js.map +1 -1
  15. package/dist/cjs/foundation/GlobalSearch.js +54 -0
  16. package/dist/cjs/foundation/GlobalSearch.js.map +1 -0
  17. package/dist/cjs/foundation/KanbanBoard.js +222 -0
  18. package/dist/cjs/foundation/KanbanBoard.js.map +1 -0
  19. package/dist/cjs/foundation/NotificationsButton.js +45 -0
  20. package/dist/cjs/foundation/NotificationsButton.js.map +1 -0
  21. package/dist/cjs/foundation/SubNavigation.js +72 -0
  22. package/dist/cjs/foundation/SubNavigation.js.map +1 -0
  23. package/dist/cjs/foundation/TabSet.js +101 -0
  24. package/dist/cjs/foundation/TabSet.js.map +1 -0
  25. package/dist/cjs/foundation/WizardProgress.js +185 -0
  26. package/dist/cjs/foundation/WizardProgress.js.map +1 -0
  27. package/dist/cjs/foundation/boardModel.js +67 -0
  28. package/dist/cjs/foundation/boardModel.js.map +1 -0
  29. package/dist/cjs/foundation/formModel.js +158 -0
  30. package/dist/cjs/foundation/formModel.js.map +1 -0
  31. package/dist/cjs/foundation/foundationComponentMetadata.js +54 -0
  32. package/dist/cjs/foundation/foundationComponentMetadata.js.map +1 -1
  33. package/dist/cjs/foundation/foundationDescriptors.js +400 -0
  34. package/dist/cjs/foundation/foundationDescriptors.js.map +1 -1
  35. package/dist/cjs/foundation/foundationSamples.js +303 -0
  36. package/dist/cjs/foundation/foundationSamples.js.map +1 -1
  37. package/dist/cjs/foundation/foundationStrings.js +72 -0
  38. package/dist/cjs/foundation/foundationStrings.js.map +1 -1
  39. package/dist/cjs/foundation/listModel.js +200 -0
  40. package/dist/cjs/foundation/listModel.js.map +1 -0
  41. package/dist/cjs/foundation/tabModel.js +41 -0
  42. package/dist/cjs/foundation/tabModel.js.map +1 -0
  43. package/dist/cjs/foundation/urlState.js +57 -0
  44. package/dist/cjs/foundation/urlState.js.map +1 -0
  45. package/dist/cjs/foundation/useCompactWidth.js +23 -0
  46. package/dist/cjs/foundation/useCompactWidth.js.map +1 -0
  47. package/dist/cjs/foundation/wizardModel.js +50 -0
  48. package/dist/cjs/foundation/wizardModel.js.map +1 -0
  49. package/dist/cjs/index.js +71 -0
  50. package/dist/cjs/index.js.map +1 -1
  51. package/dist/esm/ComponentName.d.ts +10 -1
  52. package/dist/esm/ComponentName.d.ts.map +1 -1
  53. package/dist/esm/ComponentName.js +9 -0
  54. package/dist/esm/ComponentName.js.map +1 -1
  55. package/dist/esm/defaultBlueprintComponents.d.ts.map +1 -1
  56. package/dist/esm/defaultBlueprintComponents.js +19 -1
  57. package/dist/esm/defaultBlueprintComponents.js.map +1 -1
  58. package/dist/esm/foundation/BulkBar.d.ts +4 -0
  59. package/dist/esm/foundation/BulkBar.d.ts.map +1 -0
  60. package/dist/esm/foundation/BulkBar.js +59 -0
  61. package/dist/esm/foundation/BulkBar.js.map +1 -0
  62. package/dist/esm/foundation/DataList.d.ts +3 -0
  63. package/dist/esm/foundation/DataList.d.ts.map +1 -0
  64. package/dist/esm/foundation/DataList.js +434 -0
  65. package/dist/esm/foundation/DataList.js.map +1 -0
  66. package/dist/esm/foundation/FormScreenBody.d.ts +3 -0
  67. package/dist/esm/foundation/FormScreenBody.d.ts.map +1 -0
  68. package/dist/esm/foundation/FormScreenBody.js +445 -0
  69. package/dist/esm/foundation/FormScreenBody.js.map +1 -0
  70. package/dist/esm/foundation/FoundationStates.js +2 -1
  71. package/dist/esm/foundation/FoundationStates.js.map +1 -1
  72. package/dist/esm/foundation/GlobalSearch.d.ts +3 -0
  73. package/dist/esm/foundation/GlobalSearch.d.ts.map +1 -0
  74. package/dist/esm/foundation/GlobalSearch.js +52 -0
  75. package/dist/esm/foundation/GlobalSearch.js.map +1 -0
  76. package/dist/esm/foundation/KanbanBoard.d.ts +3 -0
  77. package/dist/esm/foundation/KanbanBoard.d.ts.map +1 -0
  78. package/dist/esm/foundation/KanbanBoard.js +220 -0
  79. package/dist/esm/foundation/KanbanBoard.js.map +1 -0
  80. package/dist/esm/foundation/NotificationsButton.d.ts +3 -0
  81. package/dist/esm/foundation/NotificationsButton.d.ts.map +1 -0
  82. package/dist/esm/foundation/NotificationsButton.js +43 -0
  83. package/dist/esm/foundation/NotificationsButton.js.map +1 -0
  84. package/dist/esm/foundation/SubNavigation.d.ts +3 -0
  85. package/dist/esm/foundation/SubNavigation.d.ts.map +1 -0
  86. package/dist/esm/foundation/SubNavigation.js +70 -0
  87. package/dist/esm/foundation/SubNavigation.js.map +1 -0
  88. package/dist/esm/foundation/TabSet.d.ts +3 -0
  89. package/dist/esm/foundation/TabSet.d.ts.map +1 -0
  90. package/dist/esm/foundation/TabSet.js +99 -0
  91. package/dist/esm/foundation/TabSet.js.map +1 -0
  92. package/dist/esm/foundation/WizardProgress.d.ts +3 -0
  93. package/dist/esm/foundation/WizardProgress.d.ts.map +1 -0
  94. package/dist/esm/foundation/WizardProgress.js +183 -0
  95. package/dist/esm/foundation/WizardProgress.js.map +1 -0
  96. package/dist/esm/foundation/boardModel.d.ts +22 -0
  97. package/dist/esm/foundation/boardModel.d.ts.map +1 -0
  98. package/dist/esm/foundation/boardModel.js +61 -0
  99. package/dist/esm/foundation/boardModel.js.map +1 -0
  100. package/dist/esm/foundation/formModel.d.ts +48 -0
  101. package/dist/esm/foundation/formModel.d.ts.map +1 -0
  102. package/dist/esm/foundation/formModel.js +147 -0
  103. package/dist/esm/foundation/formModel.js.map +1 -0
  104. package/dist/esm/foundation/foundationComponentMetadata.d.ts.map +1 -1
  105. package/dist/esm/foundation/foundationComponentMetadata.js +54 -0
  106. package/dist/esm/foundation/foundationComponentMetadata.js.map +1 -1
  107. package/dist/esm/foundation/foundationDescriptors.d.ts.map +1 -1
  108. package/dist/esm/foundation/foundationDescriptors.js +400 -0
  109. package/dist/esm/foundation/foundationDescriptors.js.map +1 -1
  110. package/dist/esm/foundation/foundationSamples.d.ts.map +1 -1
  111. package/dist/esm/foundation/foundationSamples.js +303 -0
  112. package/dist/esm/foundation/foundationSamples.js.map +1 -1
  113. package/dist/esm/foundation/foundationStrings.d.ts +72 -0
  114. package/dist/esm/foundation/foundationStrings.d.ts.map +1 -1
  115. package/dist/esm/foundation/foundationStrings.js +72 -0
  116. package/dist/esm/foundation/foundationStrings.js.map +1 -1
  117. package/dist/esm/foundation/index.d.ts +16 -0
  118. package/dist/esm/foundation/index.d.ts.map +1 -1
  119. package/dist/esm/foundation/index.js +16 -0
  120. package/dist/esm/foundation/index.js.map +1 -1
  121. package/dist/esm/foundation/listModel.d.ts +49 -0
  122. package/dist/esm/foundation/listModel.d.ts.map +1 -0
  123. package/dist/esm/foundation/listModel.js +183 -0
  124. package/dist/esm/foundation/listModel.js.map +1 -0
  125. package/dist/esm/foundation/tabModel.d.ts +10 -0
  126. package/dist/esm/foundation/tabModel.d.ts.map +1 -0
  127. package/dist/esm/foundation/tabModel.js +37 -0
  128. package/dist/esm/foundation/tabModel.js.map +1 -0
  129. package/dist/esm/foundation/urlState.d.ts +4 -0
  130. package/dist/esm/foundation/urlState.d.ts.map +1 -0
  131. package/dist/esm/foundation/urlState.js +53 -0
  132. package/dist/esm/foundation/urlState.js.map +1 -0
  133. package/dist/esm/foundation/useCompactWidth.d.ts +3 -0
  134. package/dist/esm/foundation/useCompactWidth.d.ts.map +1 -0
  135. package/dist/esm/foundation/useCompactWidth.js +20 -0
  136. package/dist/esm/foundation/useCompactWidth.js.map +1 -0
  137. package/dist/esm/foundation/wizardModel.d.ts +16 -0
  138. package/dist/esm/foundation/wizardModel.d.ts.map +1 -0
  139. package/dist/esm/foundation/wizardModel.js +43 -0
  140. package/dist/esm/foundation/wizardModel.js.map +1 -0
  141. package/dist/esm/index.js +16 -0
  142. package/dist/esm/index.js.map +1 -1
  143. package/dist/esm/tsconfig.tsbuildinfo +1 -1
  144. package/foundation/BulkBar.tsx +38 -0
  145. package/foundation/DataList.tsx +208 -0
  146. package/foundation/FormScreenBody.tsx +196 -0
  147. package/foundation/FoundationStates.tsx +1 -1
  148. package/foundation/GlobalSearch.tsx +33 -0
  149. package/foundation/KanbanBoard.tsx +97 -0
  150. package/foundation/NotificationsButton.tsx +28 -0
  151. package/foundation/SubNavigation.tsx +49 -0
  152. package/foundation/TabSet.tsx +65 -0
  153. package/foundation/WizardProgress.tsx +109 -0
  154. package/foundation/boardModel.ts +64 -0
  155. package/foundation/formModel.ts +146 -0
  156. package/foundation/foundationComponentMetadata.ts +9 -0
  157. package/foundation/foundationDescriptors.ts +195 -0
  158. package/foundation/foundationSamples.ts +56 -0
  159. package/foundation/foundationStrings.ts +72 -0
  160. package/foundation/index.ts +16 -0
  161. package/foundation/listModel.ts +190 -0
  162. package/foundation/tabModel.ts +41 -0
  163. package/foundation/urlState.ts +52 -0
  164. package/foundation/useCompactWidth.ts +23 -0
  165. package/foundation/wizardModel.ts +54 -0
  166. package/package.json +8 -8
  167. package/shell/layout.css +513 -0
@@ -0,0 +1,445 @@
1
+ import { jsx, jsxs } from 'react/jsx-runtime';
2
+ import { useMemo, useState, useRef, useEffect, useId } from 'react';
3
+ import { useValueOutput } from '@cratis/scene.react';
4
+ import { ActionButton } from './ActionButton.js';
5
+ import { readComponentState, ComponentState } from './ComponentState.js';
6
+ import { readFormSections, readFormMode, FormMode, validate, mapServerErrors, sameValues, FormFieldType, addressLines } from './formModel.js';
7
+ import { readLocale } from './formatting.js';
8
+ import { readFoundationStrings, formatText } from './foundationStrings.js';
9
+ import { readPermissionRule } from './PermissionRule.js';
10
+ import { FoundationIcon } from './FoundationIcon.js';
11
+ import { FoundationFrame } from './StateFrame.js';
12
+
13
+ function FieldInput({ field, value, error, readOnly, locale, required, choose, set, blur }) {
14
+ const id = useId();
15
+ const describedBy = [
16
+ field.help ? `${id}-help` : undefined,
17
+ error ? `${id}-error` : undefined
18
+ ].filter(Boolean).join(' ') || undefined;
19
+ const common = {
20
+ id,
21
+ 'aria-invalid': error ? true : undefined,
22
+ 'aria-required': field.required || undefined,
23
+ 'aria-describedby': describedBy,
24
+ disabled: readOnly,
25
+ onBlur: blur
26
+ };
27
+ const text = typeof value === 'string' || typeof value === 'number' ? String(value) : '';
28
+ let input;
29
+ switch(field.type){
30
+ case FormFieldType.Toggle:
31
+ input = /*#__PURE__*/ jsx("input", {
32
+ ...common,
33
+ type: "checkbox",
34
+ role: "switch",
35
+ checked: value === true,
36
+ onChange: (event)=>set(event.target.checked)
37
+ });
38
+ break;
39
+ case FormFieldType.Select:
40
+ case FormFieldType.Lookup:
41
+ input = /*#__PURE__*/ jsxs("select", {
42
+ ...common,
43
+ value: text,
44
+ onChange: (event)=>set(event.target.value),
45
+ children: [
46
+ /*#__PURE__*/ jsx("option", {
47
+ value: "",
48
+ children: choose
49
+ }),
50
+ field.options.map((option)=>/*#__PURE__*/ jsx("option", {
51
+ value: option,
52
+ children: option
53
+ }, option))
54
+ ]
55
+ });
56
+ break;
57
+ case FormFieldType.MultiSelect:
58
+ input = /*#__PURE__*/ jsx("fieldset", {
59
+ className: "foundation-fieldset",
60
+ "aria-describedby": describedBy,
61
+ disabled: readOnly,
62
+ children: field.options.map((option)=>/*#__PURE__*/ jsxs("label", {
63
+ className: "foundation-check",
64
+ children: [
65
+ /*#__PURE__*/ jsx("input", {
66
+ type: "checkbox",
67
+ checked: Array.isArray(value) && value.includes(option),
68
+ onBlur: blur,
69
+ onChange: (event)=>set(event.target.checked ? [
70
+ ...Array.isArray(value) ? value : [],
71
+ option
72
+ ] : (Array.isArray(value) ? value : []).filter((candidate)=>candidate !== option))
73
+ }),
74
+ /*#__PURE__*/ jsx("span", {
75
+ children: option
76
+ })
77
+ ]
78
+ }, option))
79
+ });
80
+ break;
81
+ case FormFieldType.RichText:
82
+ input = /*#__PURE__*/ jsx("textarea", {
83
+ ...common,
84
+ rows: 5,
85
+ value: text,
86
+ placeholder: field.placeholder,
87
+ onChange: (event)=>set(event.target.value)
88
+ });
89
+ break;
90
+ case FormFieldType.File:
91
+ input = /*#__PURE__*/ jsx("input", {
92
+ ...common,
93
+ type: "file",
94
+ onChange: (event)=>set(Array.from(event.target.files ?? []).map((file)=>file.name))
95
+ });
96
+ break;
97
+ case FormFieldType.Address:
98
+ {
99
+ const lines = typeof value === 'object' && value !== null ? value : {};
100
+ input = /*#__PURE__*/ jsx("div", {
101
+ className: "foundation-address",
102
+ role: "group",
103
+ "aria-describedby": describedBy,
104
+ children: addressLines.map((line)=>/*#__PURE__*/ jsx("input", {
105
+ type: "text",
106
+ "aria-label": `${field.label}: ${line}`,
107
+ placeholder: line,
108
+ disabled: readOnly,
109
+ value: lines[line] ?? '',
110
+ onBlur: blur,
111
+ onChange: (event)=>set({
112
+ ...lines,
113
+ [line]: event.target.value
114
+ })
115
+ }, line))
116
+ });
117
+ break;
118
+ }
119
+ case FormFieldType.Number:
120
+ case FormFieldType.Currency:
121
+ input = /*#__PURE__*/ jsx("input", {
122
+ ...common,
123
+ type: "number",
124
+ inputMode: "decimal",
125
+ value: text,
126
+ placeholder: field.placeholder,
127
+ onChange: (event)=>set(event.target.value === '' ? '' : Number(event.target.value))
128
+ });
129
+ break;
130
+ case FormFieldType.Date:
131
+ input = /*#__PURE__*/ jsx("input", {
132
+ ...common,
133
+ type: "date",
134
+ lang: locale,
135
+ value: text,
136
+ onChange: (event)=>set(event.target.value)
137
+ });
138
+ break;
139
+ default:
140
+ input = /*#__PURE__*/ jsx("input", {
141
+ ...common,
142
+ type: "text",
143
+ value: text,
144
+ placeholder: field.placeholder,
145
+ onChange: (event)=>set(event.target.value)
146
+ });
147
+ }
148
+ const grouped = field.type === FormFieldType.MultiSelect || field.type === FormFieldType.Address;
149
+ return /*#__PURE__*/ jsxs("div", {
150
+ className: "foundation-field",
151
+ style: {
152
+ gridColumn: `span ${field.span}`
153
+ },
154
+ "data-invalid": error ? true : undefined,
155
+ children: [
156
+ grouped ? /*#__PURE__*/ jsxs("span", {
157
+ className: "foundation-field-label",
158
+ id: `${id}-label`,
159
+ children: [
160
+ field.label,
161
+ field.required && /*#__PURE__*/ jsxs("span", {
162
+ className: "foundation-required",
163
+ title: required,
164
+ children: [
165
+ " *",
166
+ /*#__PURE__*/ jsxs("span", {
167
+ className: "foundation-visually-hidden",
168
+ children: [
169
+ " (",
170
+ required,
171
+ ")"
172
+ ]
173
+ })
174
+ ]
175
+ })
176
+ ]
177
+ }) : /*#__PURE__*/ jsxs("label", {
178
+ htmlFor: id,
179
+ className: "foundation-field-label",
180
+ children: [
181
+ field.label,
182
+ field.required && /*#__PURE__*/ jsxs("span", {
183
+ className: "foundation-required",
184
+ title: required,
185
+ children: [
186
+ " *",
187
+ /*#__PURE__*/ jsxs("span", {
188
+ className: "foundation-visually-hidden",
189
+ children: [
190
+ " (",
191
+ required,
192
+ ")"
193
+ ]
194
+ })
195
+ ]
196
+ })
197
+ ]
198
+ }),
199
+ input,
200
+ field.help && /*#__PURE__*/ jsx("span", {
201
+ id: `${id}-help`,
202
+ className: "foundation-count",
203
+ children: field.help
204
+ }),
205
+ error && /*#__PURE__*/ jsx("span", {
206
+ id: `${id}-error`,
207
+ className: "foundation-field-error",
208
+ role: "alert",
209
+ children: error
210
+ })
211
+ ]
212
+ });
213
+ }
214
+ /**
215
+ * The `formScreenBody` component: titled sections of fields in a one-to-three column grid, validated, with the Save / Save and new / Cancel bar and the
216
+ * unsaved-changes guard.
217
+ *
218
+ * `sections` (`title`, `columns`, `fields`) and `values` come from the screen; a field is `text`, `number`, `currency`, `date`, `select`, `multiSelect`, `lookup`,
219
+ * `toggle`, `file`, `richText` or `address`. Validation is inline on blur and a summary on submit (an alert listing each field as a link back to it); a server's
220
+ * `errors` map onto the fields, and one for a field the form lacks is shown as a general error so it is never lost. Required fields are marked with an asterisk
221
+ * *and* the word. `mode` is `create`, `edit`, `readOnly` or `settings` - settings has one Save for each section. The edited values are the `value` output; Save
222
+ * runs the behaviors attached to the element. While values differ from the saved ones the form says so, warns the browser before the page is left, and offers
223
+ * "Discard changes". The action bar sticks to the bottom as the form scrolls.
224
+ */ function FormScreenBody({ element, interactions, bindingOutputs }) {
225
+ const sections = useMemo(()=>readFormSections(element.properties.sections), [
226
+ element.properties.sections
227
+ ]);
228
+ const mode = readFormMode(element.properties.mode);
229
+ const suppliedValues = typeof element.properties.values === 'object' && element.properties.values !== null && !Array.isArray(element.properties.values) ? element.properties.values : {};
230
+ const suppliedKey = JSON.stringify(suppliedValues);
231
+ const [saved, setSaved] = useState(suppliedValues);
232
+ const [values, setValues] = useState(suppliedValues);
233
+ const [touched, setTouched] = useState(new Set());
234
+ const [submitted, setSubmitted] = useState(false);
235
+ const [justSaved, setJustSaved] = useState(false);
236
+ const summary = useRef(null);
237
+ const strings = readFoundationStrings(element);
238
+ const locale = readLocale(element);
239
+ const state = readComponentState(element, sections.length > 0);
240
+ const readOnly = mode === FormMode.ReadOnly || readPermissionRule(element, 'editPermission') !== 'enabled';
241
+ const canSave = readPermissionRule(element, 'savePermission');
242
+ const problems = validate(sections, values);
243
+ const server = useMemo(()=>mapServerErrors(sections, element.properties.errors), [
244
+ sections,
245
+ element.properties.errors
246
+ ]);
247
+ const dirty = !sameValues(values, saved);
248
+ const labelOf = (name)=>sections.flatMap((section)=>section.fields).find((field)=>field.name === name)?.label ?? name;
249
+ const wording = (name, kind)=>formatText(kind === 'required' ? strings.formRequiredField : strings.formInvalidField, {
250
+ label: labelOf(name)
251
+ });
252
+ const errorOf = (name)=>server.byField[name] ?? ((touched.has(name) || submitted) && problems[name] ? wording(name, problems[name]) : undefined);
253
+ const invalid = Object.keys(problems);
254
+ useEffect(()=>{
255
+ setSaved(suppliedValues);
256
+ setValues(suppliedValues);
257
+ setTouched(new Set());
258
+ setSubmitted(false);
259
+ }, [
260
+ suppliedKey
261
+ ]);
262
+ useValueOutput(bindingOutputs, values);
263
+ useEffect(()=>{
264
+ if (!dirty || typeof window === 'undefined') return;
265
+ const guard = (event)=>{
266
+ event.preventDefault();
267
+ event.returnValue = '';
268
+ };
269
+ window.addEventListener('beforeunload', guard);
270
+ return ()=>window.removeEventListener('beforeunload', guard);
271
+ }, [
272
+ dirty
273
+ ]);
274
+ const submit = (scope)=>{
275
+ setSubmitted(true);
276
+ const scoped = scope ? scope.fields.filter((field)=>problems[field.name]) : invalid.map((name)=>({
277
+ name
278
+ }));
279
+ if (scoped.length > 0) {
280
+ requestAnimationFrame(()=>summary.current?.focus());
281
+ return;
282
+ }
283
+ setSaved(values);
284
+ setJustSaved(true);
285
+ interactions?.onClick?.({
286
+ stopPropagation: ()=>undefined
287
+ });
288
+ };
289
+ const edit = (name, value)=>{
290
+ setValues((current)=>({
291
+ ...current,
292
+ [name]: value
293
+ }));
294
+ setJustSaved(false);
295
+ interactions?.onChange?.();
296
+ };
297
+ return /*#__PURE__*/ jsx(FoundationFrame, {
298
+ element: element,
299
+ interactions: interactions,
300
+ name: "form-screen",
301
+ state: state,
302
+ skeleton: [
303
+ 40,
304
+ 100,
305
+ 100,
306
+ 70
307
+ ],
308
+ children: state !== ComponentState.Loading && /*#__PURE__*/ jsxs("form", {
309
+ noValidate: true,
310
+ onSubmit: (event)=>{
311
+ event.preventDefault();
312
+ if (mode !== FormMode.Settings) submit();
313
+ },
314
+ children: [
315
+ readOnly && mode === FormMode.ReadOnly && /*#__PURE__*/ jsx("p", {
316
+ className: "foundation-count",
317
+ role: "status",
318
+ children: strings.formReadOnly
319
+ }),
320
+ (submitted && invalid.length > 0 || server.general.length > 0) && /*#__PURE__*/ jsxs("div", {
321
+ ref: summary,
322
+ tabIndex: -1,
323
+ role: "alert",
324
+ className: "foundation-message",
325
+ "data-tone": "danger",
326
+ children: [
327
+ /*#__PURE__*/ jsx(FoundationIcon, {
328
+ name: "alert"
329
+ }),
330
+ /*#__PURE__*/ jsxs("div", {
331
+ className: "foundation-message-text",
332
+ children: [
333
+ /*#__PURE__*/ jsx("strong", {
334
+ children: invalid.length === 1 ? strings.formSummaryOne : formatText(strings.formSummary, {
335
+ count: invalid.length
336
+ })
337
+ }),
338
+ /*#__PURE__*/ jsxs("ul", {
339
+ children: [
340
+ invalid.map((name)=>/*#__PURE__*/ jsx("li", {
341
+ children: wording(name, problems[name])
342
+ }, name)),
343
+ server.general.map((message)=>/*#__PURE__*/ jsx("li", {
344
+ children: message
345
+ }, message))
346
+ ]
347
+ })
348
+ ]
349
+ })
350
+ ]
351
+ }),
352
+ sections.map((section)=>/*#__PURE__*/ jsxs("fieldset", {
353
+ className: "foundation-form-section",
354
+ disabled: false,
355
+ children: [
356
+ section.title && /*#__PURE__*/ jsx("legend", {
357
+ children: section.title
358
+ }),
359
+ /*#__PURE__*/ jsx("div", {
360
+ className: "foundation-form-grid",
361
+ style: {
362
+ gridTemplateColumns: `repeat(${section.columns}, minmax(0, 1fr))`
363
+ },
364
+ "data-columns": section.columns,
365
+ children: section.fields.map((field)=>/*#__PURE__*/ jsx(FieldInput, {
366
+ field: field,
367
+ value: values[field.name],
368
+ error: errorOf(field.name),
369
+ readOnly: readOnly,
370
+ locale: locale,
371
+ required: strings.formRequired,
372
+ choose: strings.formChoose,
373
+ set: (value)=>edit(field.name, value),
374
+ blur: ()=>setTouched((current)=>new Set(current).add(field.name))
375
+ }, field.name))
376
+ }),
377
+ mode === FormMode.Settings && !readOnly && /*#__PURE__*/ jsx("div", {
378
+ className: "foundation-form-section-actions",
379
+ children: /*#__PURE__*/ jsx(ActionButton, {
380
+ rule: canSave,
381
+ emphasis: "secondary",
382
+ disabledReason: strings.disabledNoPermission,
383
+ onClick: ()=>submit(section),
384
+ children: formatText(strings.formSectionSave, {
385
+ section: section.title
386
+ })
387
+ })
388
+ })
389
+ ]
390
+ }, section.id)),
391
+ mode !== FormMode.Settings && mode !== FormMode.ReadOnly && /*#__PURE__*/ jsxs("div", {
392
+ className: "foundation-form-actions",
393
+ role: "group",
394
+ "aria-label": strings.listActions,
395
+ children: [
396
+ /*#__PURE__*/ jsx("span", {
397
+ role: "status",
398
+ className: "foundation-count",
399
+ children: dirty ? strings.formUnsaved : justSaved ? strings.formSaved : ''
400
+ }),
401
+ /*#__PURE__*/ jsx("span", {
402
+ className: "foundation-wizard-spacer"
403
+ }),
404
+ dirty && /*#__PURE__*/ jsx(ActionButton, {
405
+ emphasis: "quiet",
406
+ disabledReason: strings.disabledNoPermission,
407
+ onClick: ()=>{
408
+ setValues(saved);
409
+ setTouched(new Set());
410
+ setSubmitted(false);
411
+ },
412
+ children: strings.formDiscard
413
+ }),
414
+ /*#__PURE__*/ jsx(ActionButton, {
415
+ emphasis: "secondary",
416
+ disabledReason: strings.disabledNoPermission,
417
+ onClick: ()=>interactions?.onClick?.({
418
+ stopPropagation: ()=>undefined
419
+ }),
420
+ children: strings.formCancel
421
+ }),
422
+ mode === FormMode.Create && /*#__PURE__*/ jsx(ActionButton, {
423
+ rule: canSave,
424
+ emphasis: "secondary",
425
+ disabledReason: strings.disabledNoPermission,
426
+ onClick: ()=>{
427
+ submit();
428
+ },
429
+ children: strings.formSaveAndNew
430
+ }),
431
+ /*#__PURE__*/ jsx(ActionButton, {
432
+ rule: canSave,
433
+ disabledReason: strings.disabledNoPermission,
434
+ onClick: ()=>submit(),
435
+ children: strings.formSave
436
+ })
437
+ ]
438
+ })
439
+ ]
440
+ })
441
+ });
442
+ }
443
+
444
+ export { FormScreenBody };
445
+ //# sourceMappingURL=FormScreenBody.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FormScreenBody.js","sources":["../../../foundation/FormScreenBody.tsx"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { useEffect, useId, useMemo, useRef, useState } from 'react';\nimport { RegisteredComponentProps, useValueOutput } from '@cratis/scene.react';\nimport { ActionButton } from './ActionButton';\nimport { ComponentState, readComponentState } from './ComponentState';\nimport { FormField, FormFieldType, FormMode, FormSection, FormValues, addressLines, mapServerErrors, readFormMode, readFormSections, sameValues, validate } from './formModel';\nimport { readLocale } from './formatting';\nimport { formatText, readFoundationStrings } from './foundationStrings';\nimport { readPermissionRule } from './PermissionRule';\nimport { FoundationIcon } from './FoundationIcon';\nimport { FoundationFrame } from './StateFrame';\n\ninterface FieldProps {\n field: FormField;\n value: unknown;\n error?: string;\n readOnly: boolean;\n locale: string;\n required: string;\n choose: string;\n set(value: unknown): void;\n blur(): void;\n}\n\nfunction FieldInput({ field, value, error, readOnly, locale, required, choose, set, blur }: FieldProps) {\n const id = useId();\n const describedBy = [field.help ? `${id}-help` : undefined, error ? `${id}-error` : undefined].filter(Boolean).join(' ') || undefined;\n const common = { id, 'aria-invalid': error ? true : undefined, 'aria-required': field.required || undefined, 'aria-describedby': describedBy, disabled: readOnly, onBlur: blur } as const;\n const text = typeof value === 'string' || typeof value === 'number' ? String(value) : '';\n let input;\n\n switch (field.type) {\n case FormFieldType.Toggle:\n input = <input {...common} type='checkbox' role='switch' checked={value === true} onChange={event => set(event.target.checked)} />;\n break;\n case FormFieldType.Select:\n case FormFieldType.Lookup:\n input = <select {...common} value={text} onChange={event => set(event.target.value)}><option value=''>{choose}</option>{field.options.map(option => <option key={option} value={option}>{option}</option>)}</select>;\n break;\n case FormFieldType.MultiSelect:\n input = (\n <fieldset className='foundation-fieldset' aria-describedby={describedBy} disabled={readOnly}>\n {field.options.map(option => (\n <label key={option} className='foundation-check'>\n <input type='checkbox' checked={Array.isArray(value) && value.includes(option)} onBlur={blur}\n onChange={event => set(event.target.checked ? [...(Array.isArray(value) ? value : []), option] : (Array.isArray(value) ? value : []).filter(candidate => candidate !== option))} />\n <span>{option}</span>\n </label>\n ))}\n </fieldset>\n );\n break;\n case FormFieldType.RichText:\n input = <textarea {...common} rows={5} value={text} placeholder={field.placeholder} onChange={event => set(event.target.value)} />;\n break;\n case FormFieldType.File:\n input = <input {...common} type='file' onChange={event => set(Array.from(event.target.files ?? []).map(file => file.name))} />;\n break;\n case FormFieldType.Address: {\n const lines = typeof value === 'object' && value !== null ? (value as Record<string, string>) : {};\n input = (\n <div className='foundation-address' role='group' aria-describedby={describedBy}>\n {addressLines.map(line => (\n <input key={line} type='text' aria-label={`${field.label}: ${line}`} placeholder={line} disabled={readOnly} value={lines[line] ?? ''} onBlur={blur} onChange={event => set({ ...lines, [line]: event.target.value })} />\n ))}\n </div>\n );\n break;\n }\n case FormFieldType.Number:\n case FormFieldType.Currency:\n input = <input {...common} type='number' inputMode='decimal' value={text} placeholder={field.placeholder} onChange={event => set(event.target.value === '' ? '' : Number(event.target.value))} />;\n break;\n case FormFieldType.Date:\n input = <input {...common} type='date' lang={locale} value={text} onChange={event => set(event.target.value)} />;\n break;\n default:\n input = <input {...common} type='text' value={text} placeholder={field.placeholder} onChange={event => set(event.target.value)} />;\n }\n\n const grouped = field.type === FormFieldType.MultiSelect || field.type === FormFieldType.Address;\n return (\n <div className='foundation-field' style={{ gridColumn: `span ${field.span}` }} data-invalid={error ? true : undefined}>\n {grouped ? <span className='foundation-field-label' id={`${id}-label`}>{field.label}{field.required && <span className='foundation-required' title={required}> *<span className='foundation-visually-hidden'> ({required})</span></span>}</span>\n : <label htmlFor={id} className='foundation-field-label'>{field.label}{field.required && <span className='foundation-required' title={required}> *<span className='foundation-visually-hidden'> ({required})</span></span>}</label>}\n {input}\n {field.help && <span id={`${id}-help`} className='foundation-count'>{field.help}</span>}\n {error && <span id={`${id}-error`} className='foundation-field-error' role='alert'>{error}</span>}\n </div>\n );\n}\n\n/**\n * The `formScreenBody` component: titled sections of fields in a one-to-three column grid, validated, with the Save / Save and new / Cancel bar and the\n * unsaved-changes guard.\n *\n * `sections` (`title`, `columns`, `fields`) and `values` come from the screen; a field is `text`, `number`, `currency`, `date`, `select`, `multiSelect`, `lookup`,\n * `toggle`, `file`, `richText` or `address`. Validation is inline on blur and a summary on submit (an alert listing each field as a link back to it); a server's\n * `errors` map onto the fields, and one for a field the form lacks is shown as a general error so it is never lost. Required fields are marked with an asterisk\n * *and* the word. `mode` is `create`, `edit`, `readOnly` or `settings` - settings has one Save for each section. The edited values are the `value` output; Save\n * runs the behaviors attached to the element. While values differ from the saved ones the form says so, warns the browser before the page is left, and offers\n * \"Discard changes\". The action bar sticks to the bottom as the form scrolls.\n */\nexport function FormScreenBody({ element, interactions, bindingOutputs }: RegisteredComponentProps) {\n const sections = useMemo(() => readFormSections(element.properties.sections), [element.properties.sections]);\n const mode = readFormMode(element.properties.mode);\n const suppliedValues = (typeof element.properties.values === 'object' && element.properties.values !== null && !Array.isArray(element.properties.values) ? element.properties.values : {}) as FormValues;\n const suppliedKey = JSON.stringify(suppliedValues);\n const [saved, setSaved] = useState<FormValues>(suppliedValues);\n const [values, setValues] = useState<FormValues>(suppliedValues);\n const [touched, setTouched] = useState<Set<string>>(new Set());\n const [submitted, setSubmitted] = useState(false);\n const [justSaved, setJustSaved] = useState(false);\n const summary = useRef<HTMLDivElement>(null);\n const strings = readFoundationStrings(element);\n const locale = readLocale(element);\n const state = readComponentState(element, sections.length > 0);\n const readOnly = mode === FormMode.ReadOnly || readPermissionRule(element, 'editPermission') !== 'enabled';\n const canSave = readPermissionRule(element, 'savePermission');\n const problems = validate(sections, values);\n const server = useMemo(() => mapServerErrors(sections, element.properties.errors), [sections, element.properties.errors]);\n const dirty = !sameValues(values, saved);\n const labelOf = (name: string) => sections.flatMap(section => section.fields).find(field => field.name === name)?.label ?? name;\n const wording = (name: string, kind: 'required' | 'invalid') => formatText(kind === 'required' ? strings.formRequiredField : strings.formInvalidField, { label: labelOf(name) });\n const errorOf = (name: string) => server.byField[name] ?? ((touched.has(name) || submitted) && problems[name] ? wording(name, problems[name]) : undefined);\n const invalid = Object.keys(problems);\n\n useEffect(() => { setSaved(suppliedValues); setValues(suppliedValues); setTouched(new Set()); setSubmitted(false); }, [suppliedKey]);\n useValueOutput(bindingOutputs, values);\n useEffect(() => {\n if (!dirty || typeof window === 'undefined') return;\n const guard = (event: BeforeUnloadEvent) => { event.preventDefault(); event.returnValue = ''; };\n window.addEventListener('beforeunload', guard);\n return () => window.removeEventListener('beforeunload', guard);\n }, [dirty]);\n\n const submit = (scope?: FormSection) => {\n setSubmitted(true);\n const scoped = scope ? scope.fields.filter(field => problems[field.name]) : invalid.map(name => ({ name }));\n if (scoped.length > 0) { requestAnimationFrame(() => summary.current?.focus()); return; }\n setSaved(values);\n setJustSaved(true);\n interactions?.onClick?.({ stopPropagation: () => undefined });\n };\n const edit = (name: string, value: unknown) => { setValues(current => ({ ...current, [name]: value })); setJustSaved(false); interactions?.onChange?.(); };\n\n return (\n <FoundationFrame element={element} interactions={interactions} name='form-screen' state={state} skeleton={[40, 100, 100, 70]}>\n {state !== ComponentState.Loading && (\n <form noValidate onSubmit={event => { event.preventDefault(); if (mode !== FormMode.Settings) submit(); }}>\n {readOnly && mode === FormMode.ReadOnly && <p className='foundation-count' role='status'>{strings.formReadOnly}</p>}\n {(submitted && invalid.length > 0 || server.general.length > 0) && (\n <div ref={summary} tabIndex={-1} role='alert' className='foundation-message' data-tone='danger'>\n <FoundationIcon name='alert' />\n <div className='foundation-message-text'>\n <strong>{invalid.length === 1 ? strings.formSummaryOne : formatText(strings.formSummary, { count: invalid.length })}</strong>\n <ul>\n {invalid.map(name => <li key={name}>{wording(name, problems[name])}</li>)}\n {server.general.map(message => <li key={message}>{message}</li>)}\n </ul>\n </div>\n </div>\n )}\n {sections.map(section => (\n <fieldset key={section.id} className='foundation-form-section' disabled={false}>\n {section.title && <legend>{section.title}</legend>}\n <div className='foundation-form-grid' style={{ gridTemplateColumns: `repeat(${section.columns}, minmax(0, 1fr))` }} data-columns={section.columns}>\n {section.fields.map(field => (\n <FieldInput key={field.name} field={field} value={values[field.name]} error={errorOf(field.name)} readOnly={readOnly} locale={locale} required={strings.formRequired} choose={strings.formChoose}\n set={value => edit(field.name, value)} blur={() => setTouched(current => new Set(current).add(field.name))} />\n ))}\n </div>\n {mode === FormMode.Settings && !readOnly && (\n <div className='foundation-form-section-actions'>\n <ActionButton rule={canSave} emphasis='secondary' disabledReason={strings.disabledNoPermission} onClick={() => submit(section)}>{formatText(strings.formSectionSave, { section: section.title })}</ActionButton>\n </div>\n )}\n </fieldset>\n ))}\n {mode !== FormMode.Settings && mode !== FormMode.ReadOnly && (\n <div className='foundation-form-actions' role='group' aria-label={strings.listActions}>\n <span role='status' className='foundation-count'>{dirty ? strings.formUnsaved : justSaved ? strings.formSaved : ''}</span>\n <span className='foundation-wizard-spacer' />\n {dirty && <ActionButton emphasis='quiet' disabledReason={strings.disabledNoPermission} onClick={() => { setValues(saved); setTouched(new Set()); setSubmitted(false); }}>{strings.formDiscard}</ActionButton>}\n <ActionButton emphasis='secondary' disabledReason={strings.disabledNoPermission} onClick={() => interactions?.onClick?.({ stopPropagation: () => undefined })}>{strings.formCancel}</ActionButton>\n {mode === FormMode.Create && <ActionButton rule={canSave} emphasis='secondary' disabledReason={strings.disabledNoPermission} onClick={() => { submit(); }}>{strings.formSaveAndNew}</ActionButton>}\n <ActionButton rule={canSave} disabledReason={strings.disabledNoPermission} onClick={() => submit()}>{strings.formSave}</ActionButton>\n </div>\n )}\n </form>\n )}\n </FoundationFrame>\n );\n}\n"],"names":["FieldInput","field","value","error","readOnly","locale","required","choose","set","blur","id","useId","describedBy","help","undefined","filter","Boolean","join","common","disabled","onBlur","text","String","input","type","FormFieldType","Toggle","_jsx","role","checked","onChange","event","target","Select","Lookup","_jsxs","select","option","options","map","MultiSelect","fieldset","className","aria-describedby","label","Array","isArray","includes","candidate","span","RichText","textarea","rows","placeholder","File","from","files","file","name","Address","lines","div","addressLines","line","aria-label","Number","Currency","inputMode","Date","lang","grouped","style","gridColumn","data-invalid","title","htmlFor","FormScreenBody","element","interactions","bindingOutputs","sections","useMemo","readFormSections","properties","mode","readFormMode","suppliedValues","values","suppliedKey","JSON","stringify","saved","setSaved","useState","setValues","touched","setTouched","Set","submitted","setSubmitted","justSaved","setJustSaved","summary","useRef","strings","readFoundationStrings","readLocale","state","readComponentState","length","FormMode","ReadOnly","readPermissionRule","canSave","problems","validate","server","mapServerErrors","errors","dirty","sameValues","labelOf","flatMap","section","fields","find","wording","kind","formatText","formRequiredField","formInvalidField","errorOf","byField","has","invalid","Object","keys","useEffect","useValueOutput","window","guard","preventDefault","returnValue","addEventListener","removeEventListener","submit","scope","scoped","requestAnimationFrame","current","focus","onClick","stopPropagation","edit","FoundationFrame","skeleton","ComponentState","Loading","form","noValidate","onSubmit","Settings","p","formReadOnly","general","ref","tabIndex","data-tone","FoundationIcon","strong","formSummaryOne","formSummary","count","ul","li","message","legend","gridTemplateColumns","columns","data-columns","formRequired","formChoose","add","ActionButton","rule","emphasis","disabledReason","disabledNoPermission","formSectionSave","listActions","formUnsaved","formSaved","formDiscard","formCancel","Create","formSaveAndNew","formSave"],"mappings":"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"}
@@ -32,7 +32,8 @@ import { foundationSamples, foundationElement } from './foundationSamples.js';
32
32
  },
33
33
  children: states.map((state)=>/*#__PURE__*/ jsxs("figure", {
34
34
  style: {
35
- margin: 0
35
+ margin: 0,
36
+ minInlineSize: 0
36
37
  },
37
38
  children: [
38
39
  /*#__PURE__*/ jsx("figcaption", {
@@ -1 +1 @@
1
- {"version":3,"file":"FoundationStates.js","sources":["../../../foundation/FoundationStates.tsx"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { componentRegistryKey, SceneThemeProvider } from '@cratis/scene.react';\nimport { defaultBlueprintComponents } from '../defaultBlueprintComponents';\nimport { defaultBlueprintName } from '../packageName';\nimport { darkTheme, lightTheme } from '../themes';\nimport { ComponentState, componentStates } from './ComponentState';\nimport { foundationElement, foundationSamples } from './foundationSamples';\n\nexport interface FoundationStatesProps {\n /** The bare name of the foundation component. */\n component: string;\n\n /** The theme the states are drawn in. */\n theme: 'light' | 'dark';\n\n /** Properties to lay over the sample, to show a variant. */\n properties?: Record<string, unknown>;\n\n /** Whether the page reads right to left. */\n rightToLeft?: boolean;\n}\n\n/**\n * Every standard state of one foundation component side by side in one theme: the preview of spec Part B 6 (\"all standard states\n * implemented and previewable\"), used by the stories and by the gallery.\n */\nexport function FoundationStates({ component, theme, properties, rightToLeft }: FoundationStatesProps) {\n const Component = defaultBlueprintComponents[componentRegistryKey(defaultBlueprintName, component)];\n const sample = foundationSamples[component];\n const states = sample?.stateful ? componentStates : [ComponentState.Ready];\n\n return (\n <SceneThemeProvider theme={theme === 'dark' ? darkTheme : lightTheme}>\n <div dir={rightToLeft ? 'rtl' : 'ltr'} className='foundation-states' style={{ display: 'grid', gap: '1rem', padding: '1rem', gridTemplateColumns: 'repeat(auto-fill, minmax(18rem, 1fr))', background: 'var(--scene-surface-background)', color: 'var(--scene-text-color)' }}>\n {states.map(state => (\n <figure key={state} style={{ margin: 0 }}>\n <figcaption style={{ fontSize: '0.75rem', textTransform: 'uppercase', marginBlockEnd: '0.5rem' }}>{state}</figcaption>\n <Component element={foundationElement(component, { ...sample?.properties, ...properties }, state === ComponentState.Ready ? undefined : state)} slots={{}} />\n </figure>\n ))}\n </div>\n </SceneThemeProvider>\n );\n}\n"],"names":["FoundationStates","component","theme","properties","rightToLeft","Component","defaultBlueprintComponents","componentRegistryKey","defaultBlueprintName","sample","foundationSamples","states","stateful","componentStates","ComponentState","Ready","_jsx","SceneThemeProvider","darkTheme","lightTheme","div","dir","className","style","display","gap","padding","gridTemplateColumns","background","color","map","state","_jsxs","figure","margin","figcaption","fontSize","textTransform","marginBlockEnd","element","foundationElement","undefined","slots"],"mappings":";;;;;;;;;;AAwBA;;;IAIO,SAASA,gBAAAA,CAAiB,EAAEC,SAAS,EAAEC,KAAK,EAAEC,UAAU,EAAEC,WAAW,EAAyB,EAAA;AACjG,IAAA,MAAMC,SAAAA,GAAYC,0BAA0B,CAACC,oBAAAA,CAAqBC,sBAAsBP,SAAAA,CAAAA,CAAW;IACnG,MAAMQ,MAAAA,GAASC,iBAAiB,CAACT,SAAAA,CAAU;IAC3C,MAAMU,MAAAA,GAASF,MAAAA,EAAQG,QAAAA,GAAWC,eAAAA,GAAkB;AAACC,QAAAA,cAAAA,CAAeC;AAAM,KAAA;AAE1E,IAAA,qBACIC,GAAA,CAACC,kBAAAA,EAAAA;QAAmBf,KAAAA,EAAOA,KAAAA,KAAU,SAASgB,SAAAA,GAAYC,UAAAA;AACtD,QAAA,QAAA,gBAAAH,GAAA,CAACI,KAAAA,EAAAA;AAAIC,YAAAA,GAAAA,EAAKjB,cAAc,KAAA,GAAQ,KAAA;YAAOkB,SAAAA,EAAU,mBAAA;YAAoBC,KAAAA,EAAO;gBAAEC,OAAAA,EAAS,MAAA;gBAAQC,GAAAA,EAAK,MAAA;gBAAQC,OAAAA,EAAS,MAAA;gBAAQC,mBAAAA,EAAqB,uCAAA;gBAAyCC,UAAAA,EAAY,iCAAA;gBAAmCC,KAAAA,EAAO;AAA0B,aAAA;AACtQlB,YAAAA,QAAAA,EAAAA,MAAAA,CAAOmB,GAAG,CAACC,CAAAA,KAAAA,iBACRC,IAAA,CAACC,QAAAA,EAAAA;oBAAmBV,KAAAA,EAAO;wBAAEW,MAAAA,EAAQ;AAAE,qBAAA;;sCACnClB,GAAA,CAACmB,YAAAA,EAAAA;4BAAWZ,KAAAA,EAAO;gCAAEa,QAAAA,EAAU,SAAA;gCAAWC,aAAAA,EAAe,WAAA;gCAAaC,cAAAA,EAAgB;AAAS,6BAAA;AAAIP,4BAAAA,QAAAA,EAAAA;;sCACnGf,GAAA,CAACX,SAAAA,EAAAA;AAAUkC,4BAAAA,OAAAA,EAASC,kBAAkBvC,SAAAA,EAAW;AAAE,gCAAA,GAAGQ,QAAQN,UAAU;AAAE,gCAAA,GAAGA;AAAW,6BAAA,EAAG4B,KAAAA,KAAUjB,cAAAA,CAAeC,KAAK,GAAG0B,SAAAA,GAAYV,KAAAA,CAAAA;AAAQW,4BAAAA,KAAAA,EAAO;;;AAF9IX,iBAAAA,EAAAA,KAAAA,CAAAA;;;AAQjC;;"}
1
+ {"version":3,"file":"FoundationStates.js","sources":["../../../foundation/FoundationStates.tsx"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { componentRegistryKey, SceneThemeProvider } from '@cratis/scene.react';\nimport { defaultBlueprintComponents } from '../defaultBlueprintComponents';\nimport { defaultBlueprintName } from '../packageName';\nimport { darkTheme, lightTheme } from '../themes';\nimport { ComponentState, componentStates } from './ComponentState';\nimport { foundationElement, foundationSamples } from './foundationSamples';\n\nexport interface FoundationStatesProps {\n /** The bare name of the foundation component. */\n component: string;\n\n /** The theme the states are drawn in. */\n theme: 'light' | 'dark';\n\n /** Properties to lay over the sample, to show a variant. */\n properties?: Record<string, unknown>;\n\n /** Whether the page reads right to left. */\n rightToLeft?: boolean;\n}\n\n/**\n * Every standard state of one foundation component side by side in one theme: the preview of spec Part B 6 (\"all standard states\n * implemented and previewable\"), used by the stories and by the gallery.\n */\nexport function FoundationStates({ component, theme, properties, rightToLeft }: FoundationStatesProps) {\n const Component = defaultBlueprintComponents[componentRegistryKey(defaultBlueprintName, component)];\n const sample = foundationSamples[component];\n const states = sample?.stateful ? componentStates : [ComponentState.Ready];\n\n return (\n <SceneThemeProvider theme={theme === 'dark' ? darkTheme : lightTheme}>\n <div dir={rightToLeft ? 'rtl' : 'ltr'} className='foundation-states' style={{ display: 'grid', gap: '1rem', padding: '1rem', gridTemplateColumns: 'repeat(auto-fill, minmax(18rem, 1fr))', background: 'var(--scene-surface-background)', color: 'var(--scene-text-color)' }}>\n {states.map(state => (\n <figure key={state} style={{ margin: 0, minInlineSize: 0 }}>\n <figcaption style={{ fontSize: '0.75rem', textTransform: 'uppercase', marginBlockEnd: '0.5rem' }}>{state}</figcaption>\n <Component element={foundationElement(component, { ...sample?.properties, ...properties }, state === ComponentState.Ready ? undefined : state)} slots={{}} />\n </figure>\n ))}\n </div>\n </SceneThemeProvider>\n );\n}\n"],"names":["FoundationStates","component","theme","properties","rightToLeft","Component","defaultBlueprintComponents","componentRegistryKey","defaultBlueprintName","sample","foundationSamples","states","stateful","componentStates","ComponentState","Ready","_jsx","SceneThemeProvider","darkTheme","lightTheme","div","dir","className","style","display","gap","padding","gridTemplateColumns","background","color","map","state","_jsxs","figure","margin","minInlineSize","figcaption","fontSize","textTransform","marginBlockEnd","element","foundationElement","undefined","slots"],"mappings":";;;;;;;;;;AAwBA;;;IAIO,SAASA,gBAAAA,CAAiB,EAAEC,SAAS,EAAEC,KAAK,EAAEC,UAAU,EAAEC,WAAW,EAAyB,EAAA;AACjG,IAAA,MAAMC,SAAAA,GAAYC,0BAA0B,CAACC,oBAAAA,CAAqBC,sBAAsBP,SAAAA,CAAAA,CAAW;IACnG,MAAMQ,MAAAA,GAASC,iBAAiB,CAACT,SAAAA,CAAU;IAC3C,MAAMU,MAAAA,GAASF,MAAAA,EAAQG,QAAAA,GAAWC,eAAAA,GAAkB;AAACC,QAAAA,cAAAA,CAAeC;AAAM,KAAA;AAE1E,IAAA,qBACIC,GAAA,CAACC,kBAAAA,EAAAA;QAAmBf,KAAAA,EAAOA,KAAAA,KAAU,SAASgB,SAAAA,GAAYC,UAAAA;AACtD,QAAA,QAAA,gBAAAH,GAAA,CAACI,KAAAA,EAAAA;AAAIC,YAAAA,GAAAA,EAAKjB,cAAc,KAAA,GAAQ,KAAA;YAAOkB,SAAAA,EAAU,mBAAA;YAAoBC,KAAAA,EAAO;gBAAEC,OAAAA,EAAS,MAAA;gBAAQC,GAAAA,EAAK,MAAA;gBAAQC,OAAAA,EAAS,MAAA;gBAAQC,mBAAAA,EAAqB,uCAAA;gBAAyCC,UAAAA,EAAY,iCAAA;gBAAmCC,KAAAA,EAAO;AAA0B,aAAA;AACtQlB,YAAAA,QAAAA,EAAAA,MAAAA,CAAOmB,GAAG,CAACC,CAAAA,KAAAA,iBACRC,IAAA,CAACC,QAAAA,EAAAA;oBAAmBV,KAAAA,EAAO;wBAAEW,MAAAA,EAAQ,CAAA;wBAAGC,aAAAA,EAAe;AAAE,qBAAA;;sCACrDnB,GAAA,CAACoB,YAAAA,EAAAA;4BAAWb,KAAAA,EAAO;gCAAEc,QAAAA,EAAU,SAAA;gCAAWC,aAAAA,EAAe,WAAA;gCAAaC,cAAAA,EAAgB;AAAS,6BAAA;AAAIR,4BAAAA,QAAAA,EAAAA;;sCACnGf,GAAA,CAACX,SAAAA,EAAAA;AAAUmC,4BAAAA,OAAAA,EAASC,kBAAkBxC,SAAAA,EAAW;AAAE,gCAAA,GAAGQ,QAAQN,UAAU;AAAE,gCAAA,GAAGA;AAAW,6BAAA,EAAG4B,KAAAA,KAAUjB,cAAAA,CAAeC,KAAK,GAAG2B,SAAAA,GAAYX,KAAAA,CAAAA;AAAQY,4BAAAA,KAAAA,EAAO;;;AAF9IZ,iBAAAA,EAAAA,KAAAA,CAAAA;;;AAQjC;;"}
@@ -0,0 +1,3 @@
1
+ import { RegisteredComponentProps } from '@cratis/scene.react';
2
+ export declare function GlobalSearch({ element, interactions, bindingOutputs }: RegisteredComponentProps): import("react").JSX.Element;
3
+ //# sourceMappingURL=GlobalSearch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GlobalSearch.d.ts","sourceRoot":"","sources":["../../../foundation/GlobalSearch.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAE,wBAAwB,EAAkB,MAAM,qBAAqB,CAAC;AAa/E,wBAAgB,YAAY,CAAC,EAAE,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,EAAE,wBAAwB,+BAe/F"}
@@ -0,0 +1,52 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+ import { useValueOutput } from '@cratis/scene.react';
3
+ import { readOptionalString } from '../shell/elementProperties.js';
4
+ import { FoundationIcon } from './FoundationIcon.js';
5
+ import { readFoundationStrings } from './foundationStrings.js';
6
+ import { useUrlState } from './urlState.js';
7
+
8
+ /**
9
+ * The `globalSearch` component: a search box for the topbar or a list's toolbar.
10
+ *
11
+ * It is a `search` landmark around a labelled field; the text is the `value` output and, with `urlKey`, is kept in the address so a search is
12
+ * a shareable link. Pressing Escape clears it. The placeholder and the accessible name come from `placeholder` and `label`, and from the
13
+ * strings table when absent, so nothing is hard-coded.
14
+ */ function GlobalSearch({ element, interactions, bindingOutputs }) {
15
+ const strings = readFoundationStrings(element);
16
+ const [text, setText] = useUrlState(readOptionalString(element, 'urlKey'), readOptionalString(element, 'text'));
17
+ const label = readOptionalString(element, 'label') ?? strings.searchLabel;
18
+ useValueOutput(bindingOutputs, text ?? '');
19
+ return /*#__PURE__*/ jsxs("form", {
20
+ role: "search",
21
+ className: "foundation foundation-search",
22
+ "data-scene-id": element.id,
23
+ onSubmit: (event)=>{
24
+ event.preventDefault();
25
+ interactions?.onChange?.();
26
+ },
27
+ children: [
28
+ /*#__PURE__*/ jsx(FoundationIcon, {
29
+ name: "filter"
30
+ }),
31
+ /*#__PURE__*/ jsx("input", {
32
+ type: "search",
33
+ "aria-label": label,
34
+ placeholder: readOptionalString(element, 'placeholder') ?? strings.searchPlaceholder,
35
+ value: text ?? '',
36
+ onChange: (event)=>{
37
+ setText(event.target.value);
38
+ interactions?.onChange?.();
39
+ },
40
+ onKeyDown: (event)=>{
41
+ if (event.key === 'Escape' && (text ?? '').length > 0) {
42
+ event.preventDefault();
43
+ setText(undefined);
44
+ }
45
+ }
46
+ })
47
+ ]
48
+ });
49
+ }
50
+
51
+ export { GlobalSearch };
52
+ //# sourceMappingURL=GlobalSearch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GlobalSearch.js","sources":["../../../foundation/GlobalSearch.tsx"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\n\nimport { RegisteredComponentProps, useValueOutput } from '@cratis/scene.react';\nimport { readOptionalString } from '../shell/elementProperties';\nimport { FoundationIcon } from './FoundationIcon';\nimport { readFoundationStrings } from './foundationStrings';\nimport { useUrlState } from './urlState';\n\n/**\n * The `globalSearch` component: a search box for the topbar or a list's toolbar.\n *\n * It is a `search` landmark around a labelled field; the text is the `value` output and, with `urlKey`, is kept in the address so a search is\n * a shareable link. Pressing Escape clears it. The placeholder and the accessible name come from `placeholder` and `label`, and from the\n * strings table when absent, so nothing is hard-coded.\n */\nexport function GlobalSearch({ element, interactions, bindingOutputs }: RegisteredComponentProps) {\n const strings = readFoundationStrings(element);\n const [text, setText] = useUrlState(readOptionalString(element, 'urlKey'), readOptionalString(element, 'text'));\n const label = readOptionalString(element, 'label') ?? strings.searchLabel;\n\n useValueOutput(bindingOutputs, text ?? '');\n\n return (\n <form role='search' className='foundation foundation-search' data-scene-id={element.id} onSubmit={event => { event.preventDefault(); interactions?.onChange?.(); }}>\n <FoundationIcon name='filter' />\n <input type='search' aria-label={label} placeholder={readOptionalString(element, 'placeholder') ?? strings.searchPlaceholder} value={text ?? ''}\n onChange={event => { setText(event.target.value); interactions?.onChange?.(); }}\n onKeyDown={event => { if (event.key === 'Escape' && (text ?? '').length > 0) { event.preventDefault(); setText(undefined); } }} />\n </form>\n );\n}\n"],"names":["GlobalSearch","element","interactions","bindingOutputs","strings","readFoundationStrings","text","setText","useUrlState","readOptionalString","label","searchLabel","useValueOutput","_jsxs","form","role","className","data-scene-id","id","onSubmit","event","preventDefault","onChange","_jsx","FoundationIcon","name","input","type","aria-label","placeholder","searchPlaceholder","value","target","onKeyDown","key","length","undefined"],"mappings":";;;;;;;AAUA;;;;;;IAOO,SAASA,YAAAA,CAAa,EAAEC,OAAO,EAAEC,YAAY,EAAEC,cAAc,EAA4B,EAAA;AAC5F,IAAA,MAAMC,UAAUC,qBAAAA,CAAsBJ,OAAAA,CAAAA;IACtC,MAAM,CAACK,MAAMC,OAAAA,CAAQ,GAAGC,YAAYC,kBAAAA,CAAmBR,OAAAA,EAAS,QAAA,CAAA,EAAWQ,kBAAAA,CAAmBR,OAAAA,EAAS,MAAA,CAAA,CAAA;AACvG,IAAA,MAAMS,KAAAA,GAAQD,kBAAAA,CAAmBR,OAAAA,EAAS,OAAA,CAAA,IAAYG,QAAQO,WAAW;AAEzEC,IAAAA,cAAAA,CAAeT,gBAAgBG,IAAAA,IAAQ,EAAA,CAAA;AAEvC,IAAA,qBACIO,IAAA,CAACC,MAAAA,EAAAA;QAAKC,IAAAA,EAAK,QAAA;QAASC,SAAAA,EAAU,8BAAA;AAA+BC,QAAAA,eAAAA,EAAehB,QAAQiB,EAAE;AAAEC,QAAAA,QAAAA,EAAUC,CAAAA,KAAAA,GAAAA;AAAWA,YAAAA,KAAAA,CAAMC,cAAc,EAAA;YAAInB,YAAAA,EAAcoB,QAAAA,IAAAA;AAAc,QAAA,CAAA;;0BAC7JC,GAAA,CAACC,cAAAA,EAAAA;gBAAeC,IAAAA,EAAK;;0BACrBF,GAAA,CAACG,OAAAA,EAAAA;gBAAMC,IAAAA,EAAK,QAAA;gBAASC,YAAAA,EAAYlB,KAAAA;AAAOmB,gBAAAA,WAAAA,EAAapB,kBAAAA,CAAmBR,OAAAA,EAAS,aAAA,CAAA,IAAkBG,OAAAA,CAAQ0B,iBAAiB;AAAEC,gBAAAA,KAAAA,EAAOzB,IAAAA,IAAQ,EAAA;AACzIgB,gBAAAA,QAAAA,EAAUF,CAAAA,KAAAA,GAAAA;oBAAWb,OAAAA,CAAQa,KAAAA,CAAMY,MAAM,CAACD,KAAK,CAAA;oBAAG7B,YAAAA,EAAcoB,QAAAA,IAAAA;AAAc,gBAAA,CAAA;AAC9EW,gBAAAA,SAAAA,EAAWb,CAAAA,KAAAA,GAAAA;oBAAW,IAAIA,KAAAA,CAAMc,GAAG,KAAK,QAAA,IAAa5B,CAAAA,IAAAA,IAAQ,EAAC,EAAG6B,MAAM,GAAG,CAAA,EAAG;AAAEf,wBAAAA,KAAAA,CAAMC,cAAc,EAAA;wBAAId,OAAAA,CAAQ6B,SAAAA,CAAAA;AAAY,oBAAA;AAAE,gBAAA;;;;AAG7I;;"}
@@ -0,0 +1,3 @@
1
+ import { RegisteredComponentProps } from '@cratis/scene.react';
2
+ export declare function KanbanBoard({ element, interactions, bindingOutputs }: RegisteredComponentProps): import("react").JSX.Element;
3
+ //# sourceMappingURL=KanbanBoard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KanbanBoard.d.ts","sourceRoot":"","sources":["../../../foundation/KanbanBoard.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAE,wBAAwB,EAAkB,MAAM,qBAAqB,CAAC;AAiB/E,wBAAgB,WAAW,CAAC,EAAE,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,EAAE,wBAAwB,+BA2E9F"}