@atscript/ui 0.1.58

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.
@@ -0,0 +1,515 @@
1
+ let _atscript_core = require("@atscript/core");
2
+ //#region src/plugin/annotations.ts
3
+ const BUILTIN_TYPES = [
4
+ "text",
5
+ "password",
6
+ "number",
7
+ "decimal",
8
+ "select",
9
+ "textarea",
10
+ "checkbox",
11
+ "radio",
12
+ "date",
13
+ "datetime",
14
+ "time",
15
+ "paragraph",
16
+ "action"
17
+ ];
18
+ const COL_SPAN_VALUES = [
19
+ "1",
20
+ "2",
21
+ "3",
22
+ "4",
23
+ "5",
24
+ "6",
25
+ "7",
26
+ "8",
27
+ "9",
28
+ "10",
29
+ "11",
30
+ "12",
31
+ "full",
32
+ "half",
33
+ "third"
34
+ ];
35
+ const ROW_SPAN_VALUES = [
36
+ "1",
37
+ "2",
38
+ "3",
39
+ "4",
40
+ "5",
41
+ "6"
42
+ ];
43
+ /**
44
+ * Static `@ui.*` annotation specs registered by the `@atscript/ui` plugin.
45
+ *
46
+ * Namespace contract (see Decision 1 in design.md):
47
+ * - `ui.<key>` — explicit cross-surface shared (`type`)
48
+ * - `ui.form.<key>` — form-only static
49
+ * - `ui.table.<key>` — table-only static
50
+ * - `ui.dict.<key>` — value-help annotations
51
+ * - `ui.array.<key>` — array control annotations
52
+ *
53
+ * The dynamic `ui.form.fn.*` / `ui.table.fn.*` and `ui.form.validate` specs
54
+ * are declared by `@atscript/ui-fns`.
55
+ */
56
+ const uiAnnotations = { ui: {
57
+ type: new _atscript_core.AnnotationSpec({
58
+ description: "Cell + input renderer type override applied to whichever surface lacks its own override (`ui.form.type` / `ui.table.type`). Built-in types: " + BUILTIN_TYPES.join(", ") + ". Consumers may dispatch additional custom types via the renderer registry — the argument is intentionally open-ended.\n\n**Example:**\n```atscript\n@ui.type \"currency\"\namount: number\n```\n",
59
+ nodeType: ["prop", "type"],
60
+ argument: {
61
+ name: "type",
62
+ type: "string",
63
+ description: "The renderer type used by both form input and table cell unless overridden."
64
+ }
65
+ }),
66
+ form: {
67
+ placeholder: new _atscript_core.AnnotationSpec({
68
+ description: "Defines **placeholder text** for UI input fields.\n\n**Example:**\n```atscript\n@ui.form.placeholder \"Enter your name\"\nname: string\n```\n",
69
+ nodeType: ["prop", "type"],
70
+ argument: {
71
+ name: "text",
72
+ type: "string",
73
+ description: "The placeholder text to display in UI input fields."
74
+ }
75
+ }),
76
+ hint: new _atscript_core.AnnotationSpec({
77
+ description: "Provides **help text or tooltip** displayed near the field in UI forms.\n\n**Example:**\n```atscript\n@ui.form.hint \"Must be a valid business email\"\nemail: string.email\n```\n",
78
+ nodeType: ["prop", "type"],
79
+ argument: {
80
+ name: "text",
81
+ type: "string",
82
+ description: "Help text or tooltip content."
83
+ }
84
+ }),
85
+ classes: new _atscript_core.AnnotationSpec({
86
+ description: "Adds **CSS class names** to the rendered field. Multiple `@ui.form.classes` annotations are appended.\n\n**Example:**\n```atscript\n@ui.form.classes \"text-bold\"\n@ui.form.classes \"mt-4\"\ntitle: string\n```\n",
87
+ nodeType: [
88
+ "prop",
89
+ "type",
90
+ "interface"
91
+ ],
92
+ multiple: true,
93
+ mergeStrategy: "append",
94
+ argument: {
95
+ name: "names",
96
+ type: "string",
97
+ description: "One or more CSS class names (space-separated)."
98
+ }
99
+ }),
100
+ styles: new _atscript_core.AnnotationSpec({
101
+ description: "Adds **inline CSS styles** to the rendered field. Multiple `@ui.form.styles` annotations are appended.\n\n**Example:**\n```atscript\n@ui.form.styles \"color: red\"\n@ui.form.styles \"font-weight: bold\"\nwarning: string\n```\n",
102
+ nodeType: [
103
+ "prop",
104
+ "type",
105
+ "interface"
106
+ ],
107
+ multiple: true,
108
+ mergeStrategy: "append",
109
+ argument: {
110
+ name: "css",
111
+ type: "string",
112
+ description: "CSS style declarations (semicolon-separated)."
113
+ }
114
+ }),
115
+ autocomplete: new _atscript_core.AnnotationSpec({
116
+ description: "Provides an **autocomplete hint** for the rendered input field.\n\n**Example:**\n```atscript\n@ui.form.autocomplete \"email\"\nemail: string.email\n```\n",
117
+ nodeType: ["prop", "type"],
118
+ argument: {
119
+ name: "value",
120
+ type: "string",
121
+ description: "HTML autocomplete attribute value."
122
+ }
123
+ }),
124
+ disabled: new _atscript_core.AnnotationSpec({
125
+ description: "Statically mark this field as disabled in the form.",
126
+ nodeType: ["prop", "type"]
127
+ }),
128
+ options: new _atscript_core.AnnotationSpec({
129
+ description: "Static option for select/radio fields. Repeat for each option. Label is the display text, value is the key (defaults to label).",
130
+ nodeType: ["prop", "type"],
131
+ multiple: true,
132
+ mergeStrategy: "replace",
133
+ argument: [{
134
+ name: "label",
135
+ type: "string",
136
+ description: "Display label for the option"
137
+ }, {
138
+ name: "value",
139
+ type: "string",
140
+ optional: true,
141
+ description: "Value/key for the option (defaults to label if omitted)"
142
+ }]
143
+ }),
144
+ order: new _atscript_core.AnnotationSpec({
145
+ description: "Explicit form-field ordering (lower values render first).",
146
+ nodeType: ["prop", "type"],
147
+ argument: {
148
+ name: "order",
149
+ type: "number",
150
+ description: "Numeric order (lower = earlier)"
151
+ }
152
+ }),
153
+ type: new _atscript_core.AnnotationSpec({
154
+ description: "Form input type override. Wins over the shared `@ui.type` for this prop's form input. Built-in types: " + BUILTIN_TYPES.join(", ") + ". Consumers may register additional types in the form types map; the argument is intentionally open-ended.",
155
+ nodeType: ["prop", "type"],
156
+ argument: {
157
+ name: "type",
158
+ type: "string",
159
+ description: "The input type used by `<as-field>` for this prop."
160
+ }
161
+ }),
162
+ component: new _atscript_core.AnnotationSpec({
163
+ description: "Named component override for the form-side renderer.",
164
+ nodeType: [
165
+ "prop",
166
+ "interface",
167
+ "type"
168
+ ],
169
+ argument: {
170
+ name: "name",
171
+ type: "string",
172
+ description: "Component name from the form components registry"
173
+ }
174
+ }),
175
+ hidden: new _atscript_core.AnnotationSpec({
176
+ description: "Statically hide this field in the form.",
177
+ nodeType: ["prop", "type"]
178
+ }),
179
+ attr: new _atscript_core.AnnotationSpec({
180
+ description: "Custom attribute or component prop applied to the form input. Repeat for each attr. Passed via v-bind.",
181
+ nodeType: ["prop", "type"],
182
+ multiple: true,
183
+ mergeStrategy: "replace",
184
+ argument: [{
185
+ name: "name",
186
+ type: "string",
187
+ description: "Attribute/prop name (e.g., \"data-testid\", \"variant\", \"size\")"
188
+ }, {
189
+ name: "value",
190
+ type: "string",
191
+ description: "Static value (string, number, boolean, or undefined)"
192
+ }]
193
+ }),
194
+ grid: {
195
+ colSpan: new _atscript_core.AnnotationSpec({
196
+ description: "Grid column span for the field in auto-generated forms. Accepts numeric strings `\"1\"` to `\"12\"` or aliases `\"full\"` (12), `\"half\"` (6), `\"third\"` (4). Optional second argument applies inside narrow containers (≤480px); defaults to `\"full\"` when omitted.\n\n**Example:**\n```atscript\n@ui.form.grid.colSpan \"6\", \"12\" // half-width desktop, full-width narrow\nfirstName: string\n```\n",
197
+ nodeType: ["prop", "type"],
198
+ argument: [{
199
+ name: "desktop",
200
+ type: "string",
201
+ description: "Column span for non-narrow containers. \"1\"-\"12\", \"full\", \"half\", or \"third\".",
202
+ values: COL_SPAN_VALUES
203
+ }, {
204
+ name: "narrow",
205
+ type: "string",
206
+ optional: true,
207
+ description: "Column span for containers ≤480px wide. Defaults to \"full\".",
208
+ values: COL_SPAN_VALUES
209
+ }]
210
+ }),
211
+ rowSpan: new _atscript_core.AnnotationSpec({
212
+ description: "Grid row span for the field. Accepts numeric strings `\"1\"` to `\"6\"`. Optional second argument applies inside narrow containers (≤480px); defaults to `\"1\"` when omitted.\n\n**Example:**\n```atscript\n@ui.form.grid.rowSpan \"2\"\nbio: string\n```\n",
213
+ nodeType: ["prop", "type"],
214
+ argument: [{
215
+ name: "desktop",
216
+ type: "string",
217
+ description: "Row span for non-narrow containers. \"1\"-\"6\".",
218
+ values: ROW_SPAN_VALUES
219
+ }, {
220
+ name: "narrow",
221
+ type: "string",
222
+ optional: true,
223
+ description: "Row span for containers ≤480px wide. Defaults to \"1\".",
224
+ values: ROW_SPAN_VALUES
225
+ }]
226
+ })
227
+ },
228
+ submit: { text: new _atscript_core.AnnotationSpec({
229
+ description: "Static submit button text.",
230
+ nodeType: ["interface", "type"],
231
+ argument: {
232
+ name: "text",
233
+ type: "string",
234
+ description: "Submit button label"
235
+ }
236
+ }) },
237
+ label: { singular: new _atscript_core.AnnotationSpec({
238
+ description: "Singular label form for an array field. Used by AsArray to render \"Add <singular>\" / \"Remove <singular>\" / per-item \"#N\"-suffixed labels. When omitted, the array falls back to `'item'`.\n\n**Example:**\n```atscript\n@meta.label 'Phone numbers'\n@ui.form.label.singular 'phone number'\nphones: string[]\n```\n",
239
+ nodeType: ["prop", "type"],
240
+ argument: {
241
+ name: "singular",
242
+ type: "string",
243
+ description: "Singular label, e.g. \"phone number\" for a `phones` field."
244
+ }
245
+ }) },
246
+ action: new _atscript_core.AnnotationSpec({
247
+ description: "Form action button for this field.",
248
+ nodeType: ["prop", "type"],
249
+ argument: [{
250
+ name: "id",
251
+ type: "string",
252
+ description: "The action name emitted on trigger"
253
+ }, {
254
+ name: "label",
255
+ type: "string",
256
+ optional: true,
257
+ description: "Display label for the action (falls back to @meta.label)"
258
+ }]
259
+ }),
260
+ prefix: {
261
+ $self: new _atscript_core.AnnotationSpec({
262
+ description: "Literal **prefix adornment** rendered before the input value. Works on all default inputs (`AsInput`, `AsNumber`, `AsDecimal`). When set on a field that also carries `@db.amount.currency*`, the explicit prefix wins — currency only contributes a prefix when no explicit one is present.\n\n**Example:**\n```atscript\n@ui.form.prefix \"+1\"\nphone: string\n```\n",
263
+ nodeType: ["prop", "type"],
264
+ argument: {
265
+ name: "value",
266
+ type: "string",
267
+ description: "Literal text to display before the input value."
268
+ }
269
+ }),
270
+ ref: new _atscript_core.AnnotationSpec({
271
+ description: "**Sibling-field reference** for the prefix adornment. The string argument is the name of another field on the same parent whose value will be displayed as the prefix at runtime. `@ui.form.prefix` wins over `@ui.form.prefix.ref` when both are present.\n\n**Example:**\n```atscript\ncountryCode: string\n@ui.form.prefix.ref \"countryCode\"\nphone: string\n```\n",
272
+ nodeType: ["prop", "type"],
273
+ argument: {
274
+ name: "field",
275
+ type: "string",
276
+ description: "Name of a sibling field whose value drives the prefix."
277
+ }
278
+ }),
279
+ icon: new _atscript_core.AnnotationSpec({
280
+ description: "**Icon adornment** rendered to the left of the input (further out than `@ui.form.prefix` text). The argument is a CSS class that paints the glyph — typically a UnoCSS preset-icons utility like `i-mdi-mail` or a custom registry alias. The consumer is responsible for ensuring the class is reachable (safelist / preset / shortcut). Combined order: `[prefix-icon][prefix-text][input]`.\n\n**Example:**\n```atscript\n@ui.form.prefix.icon \"i-mdi-mail\"\nemail: string.email\n```\n",
281
+ nodeType: ["prop", "type"],
282
+ argument: {
283
+ name: "class",
284
+ type: "string",
285
+ description: "CSS class painting the icon glyph. Consumer manages safelist / preset coverage."
286
+ }
287
+ })
288
+ },
289
+ suffix: {
290
+ $self: new _atscript_core.AnnotationSpec({
291
+ description: "Literal **suffix adornment** rendered after the input value. Works on all default inputs. When set on a field that also carries `@db.unit*`, the explicit suffix wins — unit code only contributes a suffix when no explicit one is present.\n\n**Example:**\n```atscript\n@ui.form.suffix \"/hr\"\nrate: number\n```\n",
292
+ nodeType: ["prop", "type"],
293
+ argument: {
294
+ name: "value",
295
+ type: "string",
296
+ description: "Literal text to display after the input value."
297
+ }
298
+ }),
299
+ ref: new _atscript_core.AnnotationSpec({
300
+ description: "**Sibling-field reference** for the suffix adornment. The string argument is the name of another field on the same parent whose value will be displayed as the suffix at runtime. `@ui.form.suffix` wins over `@ui.form.suffix.ref` when both are present.\n\n**Example:**\n```atscript\nunit: 'kg' | 'lb'\n@ui.form.suffix.ref \"unit\"\nweight: number\n```\n",
301
+ nodeType: ["prop", "type"],
302
+ argument: {
303
+ name: "field",
304
+ type: "string",
305
+ description: "Name of a sibling field whose value drives the suffix."
306
+ }
307
+ }),
308
+ icon: new _atscript_core.AnnotationSpec({
309
+ description: "**Icon adornment** rendered to the right of the input (further out than `@ui.form.suffix` text). The argument is a CSS class that paints the glyph — typically a UnoCSS preset-icons utility like `i-mdi-mail` or a custom registry alias. The consumer is responsible for ensuring the class is reachable (safelist / preset / shortcut). Combined order: `[input][suffix-text][suffix-icon]`.\n\n**Example:**\n```atscript\n@ui.form.suffix.icon \"i-mdi-check\"\ncode: string\n```\n",
310
+ nodeType: ["prop", "type"],
311
+ argument: {
312
+ name: "class",
313
+ type: "string",
314
+ description: "CSS class painting the icon glyph. Consumer manages safelist / preset coverage."
315
+ }
316
+ })
317
+ }
318
+ },
319
+ table: {
320
+ width: new _atscript_core.AnnotationSpec({
321
+ description: "Sets the **default column width** for this field when rendered in a table. Accepts any CSS width string (e.g. `120px`, `12em`, `20ch`). The user can still resize the column manually; double-click on the resize handle auto-fits to content; the column-menu Reset entry returns to this value.\n\n**Example:**\n```atscript\n@ui.table.width \"240px\"\ndescription: string\n```\n",
322
+ nodeType: ["prop", "type"],
323
+ argument: {
324
+ name: "width",
325
+ type: "string",
326
+ description: "CSS width for the column (e.g. '120px', '15em', '20ch')."
327
+ }
328
+ }),
329
+ component: new _atscript_core.AnnotationSpec({
330
+ description: "Named component override for the table-cell renderer.",
331
+ nodeType: [
332
+ "prop",
333
+ "interface",
334
+ "type"
335
+ ],
336
+ argument: {
337
+ name: "name",
338
+ type: "string",
339
+ description: "Component name from the table components registry"
340
+ }
341
+ }),
342
+ hidden: new _atscript_core.AnnotationSpec({
343
+ description: "Hide this column by default in the table.",
344
+ nodeType: ["prop", "type"]
345
+ }),
346
+ attr: new _atscript_core.AnnotationSpec({
347
+ description: "Custom attribute or component prop applied to the rendered `<td>`. Repeat for each attr. Passed via v-bind.",
348
+ nodeType: ["prop", "type"],
349
+ multiple: true,
350
+ mergeStrategy: "replace",
351
+ argument: [{
352
+ name: "name",
353
+ type: "string",
354
+ description: "Attribute/prop name (e.g., \"title\", \"data-row\", \"aria-label\")"
355
+ }, {
356
+ name: "value",
357
+ type: "string",
358
+ description: "Static value applied to the cell."
359
+ }]
360
+ }),
361
+ classes: new _atscript_core.AnnotationSpec({
362
+ description: "CSS classes applied to the rendered `<td>` for this column's cells. Multiple `@ui.table.classes` annotations are appended.\n\n**Example:**\n```atscript\n@ui.table.classes \"font-bold\"\n@ui.table.classes \"text-right\"\namount: number\n```\n",
363
+ nodeType: [
364
+ "prop",
365
+ "type",
366
+ "interface"
367
+ ],
368
+ multiple: true,
369
+ mergeStrategy: "append",
370
+ argument: {
371
+ name: "names",
372
+ type: "string",
373
+ description: "One or more CSS class names (space-separated)."
374
+ }
375
+ }),
376
+ styles: new _atscript_core.AnnotationSpec({
377
+ description: "Inline CSS styles applied to the rendered `<td>` for this column's cells. Multiple `@ui.table.styles` annotations are appended.\n\n**Example:**\n```atscript\n@ui.table.styles \"padding-left: 12px\"\ndescription: string\n```\n",
378
+ nodeType: [
379
+ "prop",
380
+ "type",
381
+ "interface"
382
+ ],
383
+ multiple: true,
384
+ mergeStrategy: "append",
385
+ argument: {
386
+ name: "css",
387
+ type: "string",
388
+ description: "CSS style declarations (semicolon-separated)."
389
+ }
390
+ }),
391
+ type: new _atscript_core.AnnotationSpec({
392
+ description: "Cell renderer type override. Wins over the shared `@ui.type` for this prop's table cell. Built-in types: " + BUILTIN_TYPES.join(", ") + ". Consumers may register additional types in the table types map; the argument is intentionally open-ended.",
393
+ nodeType: ["prop", "type"],
394
+ argument: {
395
+ name: "type",
396
+ type: "string",
397
+ description: "The cell renderer type dispatched via the table types map."
398
+ }
399
+ }),
400
+ order: new _atscript_core.AnnotationSpec({
401
+ description: "Initial column ordering — lower values appear first; user-driven runtime reorder still mutates table state's `columnNames`.",
402
+ nodeType: ["prop", "type"],
403
+ argument: {
404
+ name: "order",
405
+ type: "number",
406
+ description: "Numeric order (lower = earlier)"
407
+ }
408
+ })
409
+ },
410
+ dict: {
411
+ label: new _atscript_core.AnnotationSpec({
412
+ description: "Marks this field as the primary display label when the table is used as a value-help dictionary",
413
+ nodeType: ["prop"]
414
+ }),
415
+ descr: new _atscript_core.AnnotationSpec({
416
+ description: "Marks this field as the secondary description in value-help display",
417
+ nodeType: ["prop"]
418
+ }),
419
+ attr: new _atscript_core.AnnotationSpec({
420
+ description: "Marks this field as an additional attribute column in table-mode value help",
421
+ nodeType: ["prop"],
422
+ multiple: true,
423
+ mergeStrategy: "append"
424
+ }),
425
+ filterable: new _atscript_core.AnnotationSpec({
426
+ description: "Marks this field as filterable in the value-help picker UI. Surfaced via `meta.fields[name].filterable` on value-help `/meta` responses.",
427
+ nodeType: ["prop"]
428
+ }),
429
+ sortable: new _atscript_core.AnnotationSpec({
430
+ description: "Marks this field as sortable in the value-help picker UI. Surfaced via `meta.fields[name].sortable` on value-help `/meta` responses.",
431
+ nodeType: ["prop"]
432
+ }),
433
+ searchable: new _atscript_core.AnnotationSpec({
434
+ description: "Marks a prop as participating in `$search`, or — on an interface — marks every `string` prop on the target as searchable. Surfaced via `meta.searchable` on value-help `/meta` responses.",
435
+ nodeType: ["prop", "interface"]
436
+ })
437
+ },
438
+ array: {
439
+ add: { label: new _atscript_core.AnnotationSpec({
440
+ description: "Label for the add-item button (default: \"Add item\")",
441
+ nodeType: ["prop"],
442
+ argument: {
443
+ name: "label",
444
+ type: "string",
445
+ description: "Button label text"
446
+ }
447
+ }) },
448
+ remove: { label: new _atscript_core.AnnotationSpec({
449
+ description: "Label for the remove-item button (default: \"Remove\")",
450
+ nodeType: ["prop"],
451
+ argument: {
452
+ name: "label",
453
+ type: "string",
454
+ description: "Button label text"
455
+ }
456
+ }) }
457
+ }
458
+ } };
459
+ //#endregion
460
+ //#region src/plugin/primitives.ts
461
+ /**
462
+ * UI primitive types for atscript `.as` files.
463
+ *
464
+ * These register `ui.paragraph`, `ui.action`, `ui.select`, `ui.radio`, and `ui.checkbox`
465
+ * as first-class types usable in interface property definitions.
466
+ */
467
+ const uiPrimitives = { ui: {
468
+ type: "phantom",
469
+ isContainer: true,
470
+ documentation: "Non-data UI elements for form rendering",
471
+ extensions: {
472
+ action: { documentation: "Form action button — not a data field, excluded from form data. Use with @ui.form.action to define alternate submit actions." },
473
+ paragraph: { documentation: "Read-only paragraph text — rendered as static content, not an input field. Use @meta.default for static text or @ui.form.fn.value for computed text." },
474
+ select: {
475
+ type: "string",
476
+ documentation: "Dropdown select field. Use @ui.form.options to define static choices or @ui.form.fn.options for computed choices."
477
+ },
478
+ radio: {
479
+ type: "string",
480
+ documentation: "Radio button group. Use @ui.form.options to define static choices or @ui.form.fn.options for computed choices."
481
+ },
482
+ checkbox: {
483
+ type: "boolean",
484
+ documentation: "Single boolean checkbox toggle."
485
+ }
486
+ }
487
+ } };
488
+ //#endregion
489
+ //#region src/plugin.ts
490
+ /**
491
+ * ATScript plugin that registers static UI annotations (`@ui.*`)
492
+ * and UI primitive types (`ui.select`, `ui.radio`, etc.).
493
+ *
494
+ * Install in your `atscript.config.ts`:
495
+ * ```ts
496
+ * import uiPlugin from '@atscript/ui/plugin'
497
+ *
498
+ * export default {
499
+ * plugins: [uiPlugin()],
500
+ * }
501
+ * ```
502
+ */
503
+ function uiPlugin() {
504
+ return {
505
+ name: "ui",
506
+ config() {
507
+ return {
508
+ primitives: uiPrimitives,
509
+ annotations: uiAnnotations
510
+ };
511
+ }
512
+ };
513
+ }
514
+ //#endregion
515
+ module.exports = uiPlugin;
@@ -0,0 +1,18 @@
1
+ import { TAtscriptPlugin } from "@atscript/core";
2
+
3
+ //#region src/plugin.d.ts
4
+ /**
5
+ * ATScript plugin that registers static UI annotations (`@ui.*`)
6
+ * and UI primitive types (`ui.select`, `ui.radio`, etc.).
7
+ *
8
+ * Install in your `atscript.config.ts`:
9
+ * ```ts
10
+ * import uiPlugin from '@atscript/ui/plugin'
11
+ *
12
+ * export default {
13
+ * plugins: [uiPlugin()],
14
+ * }
15
+ * ```
16
+ */
17
+ declare function uiPlugin(): TAtscriptPlugin;
18
+ export = uiPlugin;
@@ -0,0 +1,19 @@
1
+ import { TAtscriptPlugin } from "@atscript/core";
2
+
3
+ //#region src/plugin.d.ts
4
+ /**
5
+ * ATScript plugin that registers static UI annotations (`@ui.*`)
6
+ * and UI primitive types (`ui.select`, `ui.radio`, etc.).
7
+ *
8
+ * Install in your `atscript.config.ts`:
9
+ * ```ts
10
+ * import uiPlugin from '@atscript/ui/plugin'
11
+ *
12
+ * export default {
13
+ * plugins: [uiPlugin()],
14
+ * }
15
+ * ```
16
+ */
17
+ declare function uiPlugin(): TAtscriptPlugin;
18
+ //#endregion
19
+ export { uiPlugin as default };