@happyvertical/smrt-svelte 0.55.7 → 0.55.9

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 (197) hide show
  1. package/AGENTS.md +7 -44
  2. package/README.md +112 -1
  3. package/agents/browser-ai.md +47 -0
  4. package/agents/command-palette.md +85 -0
  5. package/agents/import-export.md +62 -0
  6. package/agents/overview-surfaces.md +255 -0
  7. package/agents/screens.md +57 -0
  8. package/dist/browser-ai/adapters/tts/browser-synthesis.d.ts +5 -0
  9. package/dist/browser-ai/adapters/tts/browser-synthesis.d.ts.map +1 -1
  10. package/dist/browser-ai/adapters/tts/browser-synthesis.js +83 -55
  11. package/dist/components/command-palette/CommandPalette.svelte +75 -0
  12. package/dist/components/command-palette/CommandPalette.svelte.d.ts +22 -0
  13. package/dist/components/command-palette/CommandPalette.svelte.d.ts.map +1 -0
  14. package/dist/components/command-palette/CommandPaletteDialog.svelte +406 -0
  15. package/dist/components/command-palette/CommandPaletteDialog.svelte.d.ts +18 -0
  16. package/dist/components/command-palette/CommandPaletteDialog.svelte.d.ts.map +1 -0
  17. package/dist/components/command-palette/CommandPaletteTrigger.svelte +91 -0
  18. package/dist/components/command-palette/CommandPaletteTrigger.svelte.d.ts +17 -0
  19. package/dist/components/command-palette/CommandPaletteTrigger.svelte.d.ts.map +1 -0
  20. package/dist/components/command-palette/context.d.ts +18 -0
  21. package/dist/components/command-palette/context.d.ts.map +1 -0
  22. package/dist/components/command-palette/context.js +38 -0
  23. package/dist/components/command-palette/controller.svelte.d.ts +70 -0
  24. package/dist/components/command-palette/controller.svelte.d.ts.map +1 -0
  25. package/dist/components/command-palette/controller.svelte.js +379 -0
  26. package/dist/components/command-palette/hotkeys.d.ts +30 -0
  27. package/dist/components/command-palette/hotkeys.d.ts.map +1 -0
  28. package/dist/components/command-palette/hotkeys.js +161 -0
  29. package/dist/components/command-palette/index.d.ts +19 -0
  30. package/dist/components/command-palette/index.d.ts.map +1 -0
  31. package/dist/components/command-palette/index.js +17 -0
  32. package/dist/components/command-palette/match.d.ts +38 -0
  33. package/dist/components/command-palette/match.d.ts.map +1 -0
  34. package/dist/components/command-palette/match.js +172 -0
  35. package/dist/components/command-palette/providers.d.ts +159 -0
  36. package/dist/components/command-palette/providers.d.ts.map +1 -0
  37. package/dist/components/command-palette/providers.js +345 -0
  38. package/dist/components/command-palette/rank.d.ts +20 -0
  39. package/dist/components/command-palette/rank.d.ts.map +1 -0
  40. package/dist/components/command-palette/rank.js +74 -0
  41. package/dist/components/command-palette/types.d.ts +119 -0
  42. package/dist/components/command-palette/types.d.ts.map +1 -0
  43. package/dist/components/command-palette/types.js +10 -0
  44. package/dist/components/command-palette/use-provider.svelte.d.ts +14 -0
  45. package/dist/components/command-palette/use-provider.svelte.d.ts.map +1 -0
  46. package/dist/components/command-palette/use-provider.svelte.js +23 -0
  47. package/dist/components/import-export/ImportExport.svelte +678 -0
  48. package/dist/components/import-export/ImportExport.svelte.d.ts +5 -0
  49. package/dist/components/import-export/ImportExport.svelte.d.ts.map +1 -0
  50. package/dist/components/import-export/collection-adapter.d.ts +35 -0
  51. package/dist/components/import-export/collection-adapter.d.ts.map +1 -0
  52. package/dist/components/import-export/collection-adapter.js +42 -0
  53. package/dist/components/import-export/csv.d.ts +60 -0
  54. package/dist/components/import-export/csv.d.ts.map +1 -0
  55. package/dist/components/import-export/csv.js +192 -0
  56. package/dist/components/import-export/download.d.ts +4 -0
  57. package/dist/components/import-export/download.d.ts.map +1 -0
  58. package/dist/components/import-export/download.js +17 -0
  59. package/dist/components/import-export/export.d.ts +25 -0
  60. package/dist/components/import-export/export.d.ts.map +1 -0
  61. package/dist/components/import-export/export.js +68 -0
  62. package/dist/components/import-export/fields.d.ts +48 -0
  63. package/dist/components/import-export/fields.d.ts.map +1 -0
  64. package/dist/components/import-export/fields.js +103 -0
  65. package/dist/components/import-export/index.d.ts +12 -0
  66. package/dist/components/import-export/index.d.ts.map +1 -0
  67. package/dist/components/import-export/index.js +9 -0
  68. package/dist/components/import-export/mapping.d.ts +12 -0
  69. package/dist/components/import-export/mapping.d.ts.map +1 -0
  70. package/dist/components/import-export/mapping.js +38 -0
  71. package/dist/components/import-export/props.d.ts +34 -0
  72. package/dist/components/import-export/props.d.ts.map +1 -0
  73. package/dist/components/import-export/props.js +1 -0
  74. package/dist/components/import-export/report.d.ts +13 -0
  75. package/dist/components/import-export/report.d.ts.map +1 -0
  76. package/dist/components/import-export/report.js +50 -0
  77. package/dist/components/import-export/runner.d.ts +17 -0
  78. package/dist/components/import-export/runner.d.ts.map +1 -0
  79. package/dist/components/import-export/runner.js +39 -0
  80. package/dist/components/import-export/types.d.ts +100 -0
  81. package/dist/components/import-export/types.d.ts.map +1 -0
  82. package/dist/components/import-export/types.js +6 -0
  83. package/dist/components/import-export/validate.d.ts +39 -0
  84. package/dist/components/import-export/validate.d.ts.map +1 -0
  85. package/dist/components/import-export/validate.js +268 -0
  86. package/dist/components/overview/OverviewGrid.svelte +579 -0
  87. package/dist/components/overview/OverviewGrid.svelte.d.ts +5 -0
  88. package/dist/components/overview/OverviewGrid.svelte.d.ts.map +1 -0
  89. package/dist/components/overview/WidgetOptionsForm.svelte +193 -0
  90. package/dist/components/overview/WidgetOptionsForm.svelte.d.ts +5 -0
  91. package/dist/components/overview/WidgetOptionsForm.svelte.d.ts.map +1 -0
  92. package/dist/components/overview/controller.svelte.d.ts +92 -0
  93. package/dist/components/overview/controller.svelte.d.ts.map +1 -0
  94. package/dist/components/overview/controller.svelte.js +336 -0
  95. package/dist/components/overview/format.d.ts +13 -0
  96. package/dist/components/overview/format.d.ts.map +1 -0
  97. package/dist/components/overview/format.js +45 -0
  98. package/dist/components/overview/grid-types.d.ts +52 -0
  99. package/dist/components/overview/grid-types.d.ts.map +1 -0
  100. package/dist/components/overview/grid-types.js +1 -0
  101. package/dist/components/overview/index.d.ts +24 -0
  102. package/dist/components/overview/index.d.ts.map +1 -0
  103. package/dist/components/overview/index.js +22 -0
  104. package/dist/components/overview/load.d.ts +30 -0
  105. package/dist/components/overview/load.d.ts.map +1 -0
  106. package/dist/components/overview/load.js +92 -0
  107. package/dist/components/overview/markdown.d.ts +53 -0
  108. package/dist/components/overview/markdown.d.ts.map +1 -0
  109. package/dist/components/overview/markdown.js +203 -0
  110. package/dist/components/overview/model.d.ts +100 -0
  111. package/dist/components/overview/model.d.ts.map +1 -0
  112. package/dist/components/overview/model.js +460 -0
  113. package/dist/components/overview/recipe-widgets.d.ts +77 -0
  114. package/dist/components/overview/recipe-widgets.d.ts.map +1 -0
  115. package/dist/components/overview/recipe-widgets.js +151 -0
  116. package/dist/components/overview/registry.d.ts +45 -0
  117. package/dist/components/overview/registry.d.ts.map +1 -0
  118. package/dist/components/overview/registry.js +112 -0
  119. package/dist/components/overview/resize.d.ts +25 -0
  120. package/dist/components/overview/resize.d.ts.map +1 -0
  121. package/dist/components/overview/resize.js +41 -0
  122. package/dist/components/overview/schema.d.ts +34 -0
  123. package/dist/components/overview/schema.d.ts.map +1 -0
  124. package/dist/components/overview/schema.js +180 -0
  125. package/dist/components/overview/server.d.ts +14 -0
  126. package/dist/components/overview/server.d.ts.map +1 -0
  127. package/dist/components/overview/server.js +13 -0
  128. package/dist/components/overview/types.d.ts +235 -0
  129. package/dist/components/overview/types.d.ts.map +1 -0
  130. package/dist/components/overview/types.js +17 -0
  131. package/dist/components/overview/widgets/ChartWidget.svelte +111 -0
  132. package/dist/components/overview/widgets/ChartWidget.svelte.d.ts +6 -0
  133. package/dist/components/overview/widgets/ChartWidget.svelte.d.ts.map +1 -0
  134. package/dist/components/overview/widgets/MetricWidget.svelte +86 -0
  135. package/dist/components/overview/widgets/MetricWidget.svelte.d.ts +6 -0
  136. package/dist/components/overview/widgets/MetricWidget.svelte.d.ts.map +1 -0
  137. package/dist/components/overview/widgets/NoteWidget.svelte +61 -0
  138. package/dist/components/overview/widgets/NoteWidget.svelte.d.ts +5 -0
  139. package/dist/components/overview/widgets/NoteWidget.svelte.d.ts.map +1 -0
  140. package/dist/components/overview/widgets/RecordListWidget.svelte +91 -0
  141. package/dist/components/overview/widgets/RecordListWidget.svelte.d.ts +6 -0
  142. package/dist/components/overview/widgets/RecordListWidget.svelte.d.ts.map +1 -0
  143. package/dist/components/overview/widgets/ShortcutsWidget.svelte +80 -0
  144. package/dist/components/overview/widgets/ShortcutsWidget.svelte.d.ts +6 -0
  145. package/dist/components/overview/widgets/ShortcutsWidget.svelte.d.ts.map +1 -0
  146. package/dist/components/overview/widgets/core.d.ts +44 -0
  147. package/dist/components/overview/widgets/core.d.ts.map +1 -0
  148. package/dist/components/overview/widgets/core.js +222 -0
  149. package/dist/components/overview/widgets/data.d.ts +76 -0
  150. package/dist/components/overview/widgets/data.d.ts.map +1 -0
  151. package/dist/components/overview/widgets/data.js +40 -0
  152. package/dist/components/screens/DetailScreen.svelte +220 -0
  153. package/dist/components/screens/DetailScreen.svelte.d.ts +5 -0
  154. package/dist/components/screens/DetailScreen.svelte.d.ts.map +1 -0
  155. package/dist/components/screens/EditForm.svelte +313 -0
  156. package/dist/components/screens/EditForm.svelte.d.ts +5 -0
  157. package/dist/components/screens/EditForm.svelte.d.ts.map +1 -0
  158. package/dist/components/screens/ListScreen.svelte +191 -0
  159. package/dist/components/screens/ListScreen.svelte.d.ts +5 -0
  160. package/dist/components/screens/ListScreen.svelte.d.ts.map +1 -0
  161. package/dist/components/screens/RecipeScreens.svelte +237 -0
  162. package/dist/components/screens/RecipeScreens.svelte.d.ts +5 -0
  163. package/dist/components/screens/RecipeScreens.svelte.d.ts.map +1 -0
  164. package/dist/components/screens/fields.d.ts +54 -0
  165. package/dist/components/screens/fields.d.ts.map +1 -0
  166. package/dist/components/screens/fields.js +229 -0
  167. package/dist/components/screens/index.d.ts +8 -0
  168. package/dist/components/screens/index.d.ts.map +1 -0
  169. package/dist/components/screens/index.js +6 -0
  170. package/dist/components/screens/types.d.ts +215 -0
  171. package/dist/components/screens/types.d.ts.map +1 -0
  172. package/dist/components/screens/types.js +1 -0
  173. package/dist/components/screens/values.d.ts +62 -0
  174. package/dist/components/screens/values.d.ts.map +1 -0
  175. package/dist/components/screens/values.js +289 -0
  176. package/dist/components/sortable/controller.svelte.d.ts +10 -0
  177. package/dist/components/sortable/controller.svelte.d.ts.map +1 -1
  178. package/dist/components/sortable/controller.svelte.js +29 -7
  179. package/dist/components/workspace/manifest-nav.d.ts +20 -0
  180. package/dist/components/workspace/manifest-nav.d.ts.map +1 -1
  181. package/dist/components/workspace/manifest-nav.js +42 -13
  182. package/dist/i18n/server.d.ts +6 -0
  183. package/dist/i18n/server.d.ts.map +1 -1
  184. package/dist/i18n/server.js +6 -0
  185. package/dist/i18n/strings.import-export.d.ts +88 -0
  186. package/dist/i18n/strings.import-export.d.ts.map +1 -0
  187. package/dist/i18n/strings.import-export.js +88 -0
  188. package/dist/i18n/strings.overview.d.ts +100 -0
  189. package/dist/i18n/strings.overview.d.ts.map +1 -0
  190. package/dist/i18n/strings.overview.js +107 -0
  191. package/dist/i18n/strings.palette.d.ts +18 -0
  192. package/dist/i18n/strings.palette.d.ts.map +1 -0
  193. package/dist/i18n/strings.palette.js +18 -0
  194. package/dist/i18n/strings.screens.d.ts +31 -0
  195. package/dist/i18n/strings.screens.d.ts.map +1 -0
  196. package/dist/i18n/strings.screens.js +31 -0
  197. package/package.json +45 -16
@@ -0,0 +1,229 @@
1
+ /** Managed by the platform; never editable and never a default column. */
2
+ const SYSTEM_FIELDS = new Set([
3
+ 'id',
4
+ 'tenantId',
5
+ 'createdAt',
6
+ 'updatedAt',
7
+ 'createdBy',
8
+ 'updatedBy',
9
+ ]);
10
+ /** System timestamps that are informative (read-only) on a record view. */
11
+ const META_TIMESTAMP_FIELDS = ['createdAt', 'updatedAt'];
12
+ /** Columns shown by default on a list when the policy marks many basic. */
13
+ export const DEFAULT_MAX_LIST_COLUMNS = 6;
14
+ /** `dueDate` -> `Due date`; reference fields drop a trailing `Id`. */
15
+ export function humanizeFieldName(name) {
16
+ const spaced = name
17
+ .replace(/([a-z0-9])([A-Z])/g, '$1 $2')
18
+ .replace(/([A-Z]+)([A-Z][a-z])/g, '$1 $2')
19
+ .replace(/[_-]+/g, ' ')
20
+ .trim();
21
+ if (spaced === '')
22
+ return name;
23
+ const lower = spaced.toLowerCase();
24
+ return lower.charAt(0).toUpperCase() + lower.slice(1);
25
+ }
26
+ function humanizeLabel(name, definition) {
27
+ if ((definition.type === 'foreignKey' ||
28
+ definition.type === 'crossPackageRef') &&
29
+ /.[a-z]Id$/.test(name)) {
30
+ return humanizeFieldName(name.slice(0, -2));
31
+ }
32
+ return humanizeFieldName(name);
33
+ }
34
+ /** Singular and plural display names derived from the class name. */
35
+ export function screenTitles(definition) {
36
+ const singular = humanizeFieldName(definition.className);
37
+ const last = singular.slice(-1);
38
+ const plural = /(s|x|z|ch|sh)$/i.test(singular)
39
+ ? `${singular}es`
40
+ : /[^aeiou]y$/i.test(singular)
41
+ ? `${singular.slice(0, -1)}ies`
42
+ : last === ''
43
+ ? singular
44
+ : `${singular}s`;
45
+ return { singular, plural };
46
+ }
47
+ /** Which control renders a field, from its widget hint and wire type. */
48
+ export function inputKindFor(definition) {
49
+ const widget = definition.ui?.widget;
50
+ if (definition.type === 'text') {
51
+ if (widget === 'textarea')
52
+ return 'textarea';
53
+ if (widget === 'email')
54
+ return 'email';
55
+ if (widget === 'url')
56
+ return 'url';
57
+ if (widget === 'phone')
58
+ return 'tel';
59
+ return 'text';
60
+ }
61
+ // Money is integer minor units only; a currency hint on a decimal is a
62
+ // plain decimal (rates and confidences are the only decimals).
63
+ if (definition.type === 'integer') {
64
+ return widget === 'currency' ? 'money' : 'integer';
65
+ }
66
+ switch (definition.type) {
67
+ case 'decimal':
68
+ return 'decimal';
69
+ case 'boolean':
70
+ return 'boolean';
71
+ case 'datetime':
72
+ return 'datetime';
73
+ case 'json':
74
+ return 'json';
75
+ default:
76
+ return 'reference';
77
+ }
78
+ }
79
+ function isRequired(definition, policyRequired) {
80
+ if (policyRequired !== undefined)
81
+ return policyRequired;
82
+ return definition.required === true && definition.nullable !== true;
83
+ }
84
+ /**
85
+ * Mismatch between a definition and a policy, or `null` when they belong
86
+ * together. Components surface this instead of rendering the wrong object.
87
+ */
88
+ export function screenSourceError(definition, policy) {
89
+ if (policy && policy.objectRef !== definition.objectRef) {
90
+ return `Field policy is for '${policy.objectRef}', not '${definition.objectRef}'.`;
91
+ }
92
+ return null;
93
+ }
94
+ function isDeclaredName(name) {
95
+ return !name.startsWith('_') && !name.startsWith('$');
96
+ }
97
+ function seedBasicSet(candidates) {
98
+ const hasMarkers = candidates.some((c) => c.definition.ui?.basic === true);
99
+ const basic = new Set();
100
+ for (const c of candidates) {
101
+ if (c.definition.ui?.basic === true)
102
+ basic.add(c.name);
103
+ else if (c.definition.ui?.basic !== false && !hasMarkers)
104
+ basic.add(c.name);
105
+ }
106
+ return basic;
107
+ }
108
+ /** Order by explicit `order` (nulls last), then declaration order. */
109
+ function byOrder(a, b) {
110
+ return ((a.order ?? Number.MAX_SAFE_INTEGER) -
111
+ (b.order ?? Number.MAX_SAFE_INTEGER) || a.index - b.index);
112
+ }
113
+ /**
114
+ * Select and decorate the fields one screen shows.
115
+ *
116
+ * - `edit`: basic and advanced tiers, system fields never.
117
+ * - `view`: basic and advanced tiers, then `createdAt`/`updatedAt` as
118
+ * read-only advanced meta when the definition has them.
119
+ * - `list`: basic tier only, without long text, JSON or raw reference columns,
120
+ * capped at {@link DEFAULT_MAX_LIST_COLUMNS}; `include` overrides all of it.
121
+ */
122
+ export function deriveScreenFields(definition, policy, options) {
123
+ const { mode, include, exclude } = options;
124
+ const excluded = new Set(exclude ?? []);
125
+ const candidates = Object.entries(definition.fields)
126
+ .map(([name, fieldDefinition], index) => ({
127
+ name,
128
+ definition: fieldDefinition,
129
+ index,
130
+ }))
131
+ .filter((c) => isDeclaredName(c.name) &&
132
+ !SYSTEM_FIELDS.has(c.name) &&
133
+ c.name !== definition.idField);
134
+ const seedBasic = policy ? null : seedBasicSet(candidates);
135
+ const decorate = (c) => {
136
+ const policyField = policy?.fields[c.name];
137
+ if (policy && !policyField)
138
+ return null;
139
+ const tier = policyField
140
+ ? policyField.visibility
141
+ : seedBasic?.has(c.name)
142
+ ? 'basic'
143
+ : 'advanced';
144
+ if (tier === 'hidden')
145
+ return null;
146
+ const label = policyField?.label?.trim();
147
+ const help = policyField?.help ?? c.definition.description ?? null;
148
+ return {
149
+ name: c.name,
150
+ label: label || humanizeLabel(c.name, c.definition),
151
+ help: help && help.trim() !== '' ? help : null,
152
+ type: c.definition.type,
153
+ kind: inputKindFor(c.definition),
154
+ required: isRequired(c.definition, policyField?.required),
155
+ tier,
156
+ group: policyField?.group ?? c.definition.ui?.group ?? null,
157
+ order: policyField?.order ?? c.definition.ui?.order ?? null,
158
+ definition: c.definition,
159
+ };
160
+ };
161
+ const decorated = candidates
162
+ .map((c) => ({ c, field: decorate(c) }))
163
+ .filter((e) => e.field !== null)
164
+ .filter((e) => !excluded.has(e.c.name));
165
+ const meta = (name) => {
166
+ const fieldDefinition = definition.fields[name];
167
+ if (!fieldDefinition || excluded.has(name))
168
+ return null;
169
+ return {
170
+ name,
171
+ label: humanizeFieldName(name),
172
+ help: null,
173
+ type: fieldDefinition.type,
174
+ kind: 'datetime',
175
+ required: false,
176
+ tier: 'advanced',
177
+ group: null,
178
+ order: null,
179
+ definition: fieldDefinition,
180
+ };
181
+ };
182
+ if (include) {
183
+ const byName = new Map(decorated.map((e) => [e.c.name, e.field]));
184
+ const picked = [];
185
+ for (const name of include) {
186
+ if (excluded.has(name))
187
+ continue;
188
+ if (mode !== 'edit' && META_TIMESTAMP_FIELDS.includes(name)) {
189
+ const metaField = meta(name);
190
+ if (metaField)
191
+ picked.push(metaField);
192
+ continue;
193
+ }
194
+ const field = byName.get(name);
195
+ if (field)
196
+ picked.push(field);
197
+ }
198
+ return picked;
199
+ }
200
+ const ordered = decorated
201
+ .map((e) => e.field)
202
+ .map((field, position) => ({ field, order: field.order, index: position }))
203
+ .sort(byOrder)
204
+ .map((e) => e.field);
205
+ if (mode === 'list') {
206
+ const cap = options.maxListColumns ?? DEFAULT_MAX_LIST_COLUMNS;
207
+ return ordered
208
+ .filter((f) => f.tier === 'basic' &&
209
+ f.kind !== 'json' &&
210
+ f.kind !== 'textarea' &&
211
+ f.kind !== 'reference')
212
+ .slice(0, Math.max(0, cap));
213
+ }
214
+ if (mode === 'view') {
215
+ const metas = META_TIMESTAMP_FIELDS.map(meta).filter((f) => f !== null);
216
+ return [...ordered, ...metas];
217
+ }
218
+ return ordered;
219
+ }
220
+ /** Group fields preserving first-seen group order; ungrouped is `null`. */
221
+ export function groupScreenFields(fields) {
222
+ const groups = new Map();
223
+ for (const field of fields) {
224
+ const bucket = groups.get(field.group) ?? [];
225
+ bucket.push(field);
226
+ groups.set(field.group, bucket);
227
+ }
228
+ return [...groups.entries()];
229
+ }
@@ -0,0 +1,8 @@
1
+ export { default as DetailScreen } from './DetailScreen.svelte';
2
+ export { default as EditForm } from './EditForm.svelte';
3
+ export { DEFAULT_MAX_LIST_COLUMNS, type DeriveScreenFieldsOptions, deriveScreenFields, groupScreenFields, humanizeFieldName, inputKindFor, screenSourceError, screenTitles, } from './fields.js';
4
+ export { default as ListScreen } from './ListScreen.svelte';
5
+ export { default as RecipeScreens } from './RecipeScreens.svelte';
6
+ export type { DetailScreenProps, EditFormProps, EditFormSubmitResult, ListScreenProps, RecipeScreensProps, RecipeScreensSource, RecipeScreenView, ScreenCollectionDefinition, ScreenDraft, ScreenDraftValue, ScreenField, ScreenFieldDefinition, ScreenFieldErrorCode, ScreenFieldPolicy, ScreenFieldType, ScreenFieldUIHints, ScreenFieldVisibility, ScreenInputKind, ScreenMode, ScreenPolicy, ScreenRecord, } from './types.js';
7
+ export { compareScreenValues, currencyMinorDigits, DEFAULT_SCREEN_CURRENCY, draftForCreate, draftFromRecord, type FormatValueContext, formatScreenValue, majorStringToMinorUnits, minorUnitsToMajorString, type ParsedDraft, parseDraft, toDatetimeLocal, toDraftValue, } from './values.js';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/screens/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EACL,wBAAwB,EACxB,KAAK,yBAAyB,EAC9B,kBAAkB,EAClB,iBAAiB,EACjB,iBAAiB,EACjB,YAAY,EACZ,iBAAiB,EACjB,YAAY,GACb,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAClE,YAAY,EACV,iBAAiB,EACjB,aAAa,EACb,oBAAoB,EACpB,eAAe,EACf,kBAAkB,EAClB,mBAAmB,EACnB,gBAAgB,EAChB,0BAA0B,EAC1B,WAAW,EACX,gBAAgB,EAChB,WAAW,EACX,qBAAqB,EACrB,oBAAoB,EACpB,iBAAiB,EACjB,eAAe,EACf,kBAAkB,EAClB,qBAAqB,EACrB,eAAe,EACf,UAAU,EACV,YAAY,EACZ,YAAY,GACb,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,uBAAuB,EACvB,cAAc,EACd,eAAe,EACf,KAAK,kBAAkB,EACvB,iBAAiB,EACjB,uBAAuB,EACvB,uBAAuB,EACvB,KAAK,WAAW,EAChB,UAAU,EACV,eAAe,EACf,YAAY,GACb,MAAM,aAAa,CAAC"}
@@ -0,0 +1,6 @@
1
+ export { default as DetailScreen } from './DetailScreen.svelte';
2
+ export { default as EditForm } from './EditForm.svelte';
3
+ export { DEFAULT_MAX_LIST_COLUMNS, deriveScreenFields, groupScreenFields, humanizeFieldName, inputKindFor, screenSourceError, screenTitles, } from './fields.js';
4
+ export { default as ListScreen } from './ListScreen.svelte';
5
+ export { default as RecipeScreens } from './RecipeScreens.svelte';
6
+ export { compareScreenValues, currencyMinorDigits, DEFAULT_SCREEN_CURRENCY, draftForCreate, draftFromRecord, formatScreenValue, majorStringToMinorUnits, minorUnitsToMajorString, parseDraft, toDatetimeLocal, toDraftValue, } from './values.js';
@@ -0,0 +1,215 @@
1
+ import type { Snippet } from 'svelte';
2
+ /**
3
+ * Structural types for the manifest-derived record screens (#3718).
4
+ *
5
+ * These mirror the browser-safe `SmrtWebCollectionDefinition` that the SMRT
6
+ * build emits and the `ResolvedObjectFieldPolicy` that `@happyvertical/smrt-fields`
7
+ * resolves, without importing either package: smrt-svelte stays below the
8
+ * domain layer in the dependency graph, and an app passes the generated
9
+ * definition and resolved policy straight in as props.
10
+ */
11
+ /** Persisted public wire types emitted by generated web collections. */
12
+ export type ScreenFieldType = 'text' | 'integer' | 'decimal' | 'boolean' | 'datetime' | 'json' | 'foreignKey' | 'crossPackageRef';
13
+ /** Static `@field({ ui })` presentation hints from the manifest. */
14
+ export interface ScreenFieldUIHints {
15
+ basic?: boolean;
16
+ group?: string;
17
+ order?: number;
18
+ locked?: boolean;
19
+ widget?: 'textarea' | 'currency' | 'email' | 'url' | 'phone';
20
+ }
21
+ /** Browser-safe subset of one generated web field definition. */
22
+ export interface ScreenFieldDefinition {
23
+ type: ScreenFieldType;
24
+ required?: boolean;
25
+ nullable?: boolean;
26
+ default?: unknown;
27
+ /** Developer-authored `@field({ description })`; the code-seed help text. */
28
+ description?: string;
29
+ ui?: ScreenFieldUIHints;
30
+ }
31
+ /** Structural subset of a generated `SmrtWebCollectionDefinition`. */
32
+ export interface ScreenCollectionDefinition {
33
+ /** Canonical qualified model identity (`@package/name:ClassName`). */
34
+ objectRef: string;
35
+ /** Simple class name, used to derive default titles. */
36
+ className: string;
37
+ /** Primary-key field name. Defaults to `id`. */
38
+ idField?: string;
39
+ fields: Readonly<Record<string, ScreenFieldDefinition>>;
40
+ }
41
+ export type ScreenFieldVisibility = 'basic' | 'advanced' | 'hidden';
42
+ /**
43
+ * One field's resolved policy. Structurally satisfied by smrt-fields'
44
+ * `ResolvedFieldPolicy`, so a resolved policy can be passed unchanged.
45
+ */
46
+ export interface ScreenFieldPolicy {
47
+ visibility: ScreenFieldVisibility;
48
+ label?: string | null;
49
+ help?: string | null;
50
+ order?: number | null;
51
+ group?: string | null;
52
+ required?: boolean;
53
+ hasDefault?: boolean;
54
+ defaultValue?: unknown;
55
+ locked?: boolean;
56
+ }
57
+ /** Structurally satisfied by smrt-fields' `ResolvedObjectFieldPolicy`. */
58
+ export interface ScreenPolicy {
59
+ objectRef: string;
60
+ fields: Readonly<Record<string, ScreenFieldPolicy>>;
61
+ }
62
+ export type ScreenMode = 'list' | 'view' | 'edit';
63
+ /** How a field is rendered and edited. */
64
+ export type ScreenInputKind = 'text' | 'textarea' | 'email' | 'url' | 'tel' | 'integer' | 'decimal' | 'money' | 'boolean' | 'datetime' | 'json' | 'reference';
65
+ /** A field selected and decorated for one screen. */
66
+ export interface ScreenField {
67
+ name: string;
68
+ label: string;
69
+ /** Help text (policy help, else the manifest description). */
70
+ help: string | null;
71
+ type: ScreenFieldType;
72
+ kind: ScreenInputKind;
73
+ required: boolean;
74
+ /** `basic` fields show first; `advanced` ones sit behind a disclosure. */
75
+ tier: 'basic' | 'advanced';
76
+ group: string | null;
77
+ order: number | null;
78
+ definition: ScreenFieldDefinition;
79
+ }
80
+ /** Why a draft value could not become a payload value. */
81
+ export type ScreenFieldErrorCode = 'required' | 'invalid_integer' | 'invalid_decimal' | 'invalid_money' | 'invalid_datetime' | 'invalid_json';
82
+ /** A row from the backing collection. */
83
+ export type ScreenRecord = Readonly<Record<string, unknown>>;
84
+ /** Draft value held by an edit form: booleans stay booleans, the rest text. */
85
+ export type ScreenDraftValue = string | boolean;
86
+ export type ScreenDraft = Record<string, ScreenDraftValue>;
87
+ /** Data access a {@link RecipeScreens} instance drives. Transport-neutral. */
88
+ export interface RecipeScreensSource {
89
+ list(): Promise<readonly ScreenRecord[]>;
90
+ /** Optional: when absent the record is looked up in the loaded list. */
91
+ get?(id: string): Promise<ScreenRecord | undefined>;
92
+ create?(values: Record<string, unknown>): Promise<ScreenRecord | undefined>;
93
+ update?(id: string, values: Record<string, unknown>): Promise<ScreenRecord | undefined>;
94
+ delete?(id: string): Promise<void>;
95
+ }
96
+ export type RecipeScreenView = 'list' | 'view' | 'create' | 'edit';
97
+ export interface ListScreenProps {
98
+ /** Generated browser-safe collection definition. */
99
+ definition: ScreenCollectionDefinition;
100
+ /** Resolved field policy for the same object; omit for the code seed. */
101
+ policy?: ScreenPolicy | null;
102
+ /** Rows to show. */
103
+ rows: readonly ScreenRecord[];
104
+ /** Page title. Defaults to the pluralized class name. */
105
+ title?: string;
106
+ /** Subtitle under the title. */
107
+ description?: string;
108
+ /** Explicit column field names, in order (overrides the derived set). */
109
+ columns?: readonly string[];
110
+ /** Cap on derived columns. */
111
+ maxColumns?: number;
112
+ /** Rows per page. */
113
+ pageSize?: number;
114
+ /** Show the search box. */
115
+ searchable?: boolean;
116
+ loading?: boolean;
117
+ /** Load failure message; rows already present stay visible. */
118
+ error?: string | null;
119
+ /** ISO 4217 code used by money fields. */
120
+ currency?: string;
121
+ /** BCP-47 locale for number and date formatting. */
122
+ locale?: string;
123
+ /** Render the page header (title and create action). */
124
+ showHeader?: boolean;
125
+ /** Row activation (click or Enter). */
126
+ onselect?: (row: ScreenRecord) => void;
127
+ /** When set, a create action is offered. */
128
+ oncreate?: () => void;
129
+ onretry?: () => void;
130
+ /** Extra header actions, rendered before the create action. */
131
+ extraActions?: Snippet;
132
+ }
133
+ export interface DetailScreenProps {
134
+ definition: ScreenCollectionDefinition;
135
+ /** Resolved field policy for the same object; omit for the code seed. */
136
+ policy?: ScreenPolicy | null;
137
+ record: ScreenRecord;
138
+ /** Page title. Defaults to the first basic text field, else the class name. */
139
+ title?: string;
140
+ /** Explicit field names, in order (overrides the derived set). */
141
+ fields?: readonly string[];
142
+ /** ISO 4217 code used by money fields. */
143
+ currency?: string;
144
+ /** BCP-47 locale for number and date formatting. */
145
+ locale?: string;
146
+ showHeader?: boolean;
147
+ /** Label for the back action; defaults to the pluralized class name. */
148
+ backLabel?: string;
149
+ /** Mutation in flight; locks the delete confirmation. */
150
+ deleting?: boolean;
151
+ onback?: () => void;
152
+ onedit?: () => void;
153
+ /** When set, a Delete action with a confirmation is offered. */
154
+ ondelete?: () => void | Promise<void>;
155
+ /** Extra header actions, rendered before Edit and Delete. */
156
+ extraActions?: Snippet;
157
+ /** Extra content under the fields. */
158
+ children?: Snippet;
159
+ }
160
+ /** What a submit handler may return to report server-side field problems. */
161
+ export interface EditFormSubmitResult {
162
+ fieldErrors?: Readonly<Record<string, string>>;
163
+ }
164
+ export interface EditFormProps {
165
+ definition: ScreenCollectionDefinition;
166
+ /** Resolved field policy for the same object; omit for the code seed. */
167
+ policy?: ScreenPolicy | null;
168
+ /** The record being edited; omit to create a new one. */
169
+ record?: ScreenRecord;
170
+ /** Page title. Defaults to "New x" / "Edit x" from the class name. */
171
+ title?: string;
172
+ /** Explicit field names, in order (overrides the derived set). */
173
+ fields?: readonly string[];
174
+ /** ISO 4217 code used by money fields. */
175
+ currency?: string;
176
+ showHeader?: boolean;
177
+ /** True while the host is persisting; locks the form. */
178
+ submitting?: boolean;
179
+ /** Server-reported field messages, keyed by field name. */
180
+ fieldErrors?: Readonly<Record<string, string>>;
181
+ /** A form-level failure message from the host. */
182
+ error?: string | null;
183
+ /** Receives wire-ready values for the displayed fields. */
184
+ onsubmit: (values: Record<string, unknown>, context: {
185
+ isNew: boolean;
186
+ }) => void | EditFormSubmitResult | Promise<void | EditFormSubmitResult>;
187
+ oncancel?: () => void;
188
+ }
189
+ export interface RecipeScreensProps {
190
+ definition: ScreenCollectionDefinition;
191
+ /** Resolved field policy for the same object; omit for the code seed. */
192
+ policy?: ScreenPolicy | null;
193
+ source: RecipeScreensSource;
194
+ /** Current screen (bindable). */
195
+ view?: RecipeScreenView;
196
+ /** Record shown by `view` and `edit` (bindable). */
197
+ recordId?: string | null;
198
+ /** List title. Defaults to the pluralized class name. */
199
+ title?: string;
200
+ /** Explicit list columns, in order. */
201
+ columns?: readonly string[];
202
+ /** Explicit view / edit field names, in order. */
203
+ fields?: readonly string[];
204
+ currency?: string;
205
+ locale?: string;
206
+ /** Turn operations off even when the source supports them. */
207
+ can?: {
208
+ create?: boolean;
209
+ update?: boolean;
210
+ delete?: boolean;
211
+ };
212
+ /** Called on every user navigation, for router synchronization. */
213
+ onnavigate?: (view: RecipeScreenView, recordId: string | null) => void;
214
+ }
215
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/components/screens/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,62 @@
1
+ import type { ScreenDraft, ScreenDraftValue, ScreenField, ScreenFieldErrorCode, ScreenPolicy, ScreenRecord } from './types.js';
2
+ /** Currency used for money fields when the screen is not told otherwise. */
3
+ export declare const DEFAULT_SCREEN_CURRENCY = "USD";
4
+ /** Decimal places of a currency's minor unit (2 for an unknown code). */
5
+ export declare function currencyMinorDigits(currency: string): number;
6
+ /** `1999`, 2 digits -> `19.99`. Exact; `null` for a non-safe integer. */
7
+ export declare function minorUnitsToMajorString(minor: unknown, digits: number): string | null;
8
+ /**
9
+ * `19.99`, 2 digits -> `1999`. Accepts a leading sign and `,` grouping;
10
+ * rejects more fraction digits than the currency has and non-safe integers.
11
+ */
12
+ export declare function majorStringToMinorUnits(text: string, digits: number): number | null;
13
+ /** A record datetime as a `datetime-local` input value (local time). */
14
+ export declare function toDatetimeLocal(value: unknown): string;
15
+ export interface ScreenValueContext {
16
+ /** ISO 4217 code used by money fields. */
17
+ currency?: string;
18
+ }
19
+ /** One field's value as the draft representation its control edits. */
20
+ export declare function toDraftValue(field: Pick<ScreenField, 'kind'>, value: unknown, context?: ScreenValueContext): ScreenDraftValue;
21
+ /** Draft for editing an existing record. */
22
+ export declare function draftFromRecord(fields: readonly ScreenField[], record: ScreenRecord, context?: ScreenValueContext): ScreenDraft;
23
+ /**
24
+ * Draft for a new record: the resolved policy default when one resolved
25
+ * (an explicit `null` default included), else the manifest default.
26
+ */
27
+ export declare function draftForCreate(fields: readonly ScreenField[], policy?: ScreenPolicy | null, context?: ScreenValueContext): ScreenDraft;
28
+ export interface ParseDraftContext extends ScreenValueContext {
29
+ /**
30
+ * The loaded record being edited. A datetime control shows minute
31
+ * precision only, so a datetime whose draft text still equals what the
32
+ * record rendered is submitted as the record's own value, keeping seconds
33
+ * and milliseconds. A genuinely edited datetime saves the new value.
34
+ */
35
+ record?: ScreenRecord | null;
36
+ }
37
+ export interface ParsedDraft {
38
+ /** Payload values, keyed by field name. */
39
+ values: Record<string, unknown>;
40
+ errors: Record<string, ScreenFieldErrorCode>;
41
+ }
42
+ /**
43
+ * Convert a draft into a write payload. An empty optional text field becomes
44
+ * `null` when the field is nullable and `''` otherwise; every other empty
45
+ * optional field becomes `null`. A required empty field is an error.
46
+ */
47
+ export declare function parseDraft(fields: readonly ScreenField[], draft: ScreenDraft, context?: ParseDraftContext): ParsedDraft;
48
+ export interface FormatValueContext extends ScreenValueContext {
49
+ locale?: string;
50
+ timeZone?: string;
51
+ /** Labels for boolean values (the component supplies localized ones). */
52
+ yes?: string;
53
+ no?: string;
54
+ }
55
+ /** A record value as display text for a list cell or a view row. */
56
+ export declare function formatScreenValue(field: Pick<ScreenField, 'kind'>, value: unknown, context?: FormatValueContext): string;
57
+ /**
58
+ * Order two record values for a list column: empty values last (whichever
59
+ * way the column sorts), numbers numerically, everything else as text.
60
+ */
61
+ export declare function compareScreenValues(left: unknown, right: unknown, direction: 'asc' | 'desc' | null): number;
62
+ //# sourceMappingURL=values.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"values.d.ts","sourceRoot":"","sources":["../../../src/components/screens/values.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EACV,WAAW,EACX,gBAAgB,EAChB,WAAW,EACX,oBAAoB,EACpB,YAAY,EACZ,YAAY,EACb,MAAM,YAAY,CAAC;AAEpB,4EAA4E;AAC5E,eAAO,MAAM,uBAAuB,QAAQ,CAAC;AAE7C,yEAAyE;AACzE,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED,yEAAyE;AACzE,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,OAAO,EACd,MAAM,EAAE,MAAM,GACb,MAAM,GAAG,IAAI,CAYf;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,GACb,MAAM,GAAG,IAAI,CAUf;AAMD,wEAAwE;AACxE,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAMtD;AAED,MAAM,WAAW,kBAAkB;IACjC,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,uEAAuE;AACvE,wBAAgB,YAAY,CAC1B,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,EAChC,KAAK,EAAE,OAAO,EACd,OAAO,GAAE,kBAAuB,GAC/B,gBAAgB,CAkBlB;AAED,4CAA4C;AAC5C,wBAAgB,eAAe,CAC7B,MAAM,EAAE,SAAS,WAAW,EAAE,EAC9B,MAAM,EAAE,YAAY,EACpB,OAAO,GAAE,kBAAuB,GAC/B,WAAW,CAMb;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,SAAS,WAAW,EAAE,EAC9B,MAAM,CAAC,EAAE,YAAY,GAAG,IAAI,EAC5B,OAAO,GAAE,kBAAuB,GAC/B,WAAW,CAWb;AAED,MAAM,WAAW,iBAAkB,SAAQ,kBAAkB;IAC3D;;;;;OAKG;IACH,MAAM,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;CAC9B;AAED,MAAM,WAAW,WAAW;IAC1B,2CAA2C;IAC3C,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC;CAC9C;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CACxB,MAAM,EAAE,SAAS,WAAW,EAAE,EAC9B,KAAK,EAAE,WAAW,EAClB,OAAO,GAAE,iBAAsB,GAC9B,WAAW,CA8Fb;AAED,MAAM,WAAW,kBAAmB,SAAQ,kBAAkB;IAC5D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yEAAyE;IACzE,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,EAAE,CAAC,EAAE,MAAM,CAAC;CACb;AAED,oEAAoE;AACpE,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,EAChC,KAAK,EAAE,OAAO,EACd,OAAO,GAAE,kBAAuB,GAC/B,MAAM,CAsDR;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,OAAO,EACb,KAAK,EAAE,OAAO,EACd,SAAS,EAAE,KAAK,GAAG,MAAM,GAAG,IAAI,GAC/B,MAAM,CAgBR"}