@shamar/core 0.1.5 → 0.2.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 (71) hide show
  1. package/README.md +35 -5
  2. package/dist/actions.d.ts +9 -2
  3. package/dist/actions.d.ts.map +1 -1
  4. package/dist/actions.js +21 -8
  5. package/dist/actions.js.map +1 -1
  6. package/dist/content-max-width.d.ts +11 -4
  7. package/dist/content-max-width.d.ts.map +1 -1
  8. package/dist/content-max-width.js +27 -7
  9. package/dist/content-max-width.js.map +1 -1
  10. package/dist/default-per-page.d.ts +16 -0
  11. package/dist/default-per-page.d.ts.map +1 -0
  12. package/dist/default-per-page.js +31 -0
  13. package/dist/default-per-page.js.map +1 -0
  14. package/dist/field-registry.d.ts +55 -0
  15. package/dist/field-registry.d.ts.map +1 -0
  16. package/dist/field-registry.js +393 -0
  17. package/dist/field-registry.js.map +1 -0
  18. package/dist/field-values.d.ts +28 -0
  19. package/dist/field-values.d.ts.map +1 -0
  20. package/dist/field-values.js +193 -0
  21. package/dist/field-values.js.map +1 -0
  22. package/dist/fields.d.ts +112 -0
  23. package/dist/fields.d.ts.map +1 -0
  24. package/dist/fields.js +251 -0
  25. package/dist/fields.js.map +1 -0
  26. package/dist/form.d.ts +57 -9
  27. package/dist/form.d.ts.map +1 -1
  28. package/dist/form.js +122 -2
  29. package/dist/form.js.map +1 -1
  30. package/dist/index.d.ts +8 -0
  31. package/dist/index.d.ts.map +1 -1
  32. package/dist/index.js +8 -0
  33. package/dist/index.js.map +1 -1
  34. package/dist/infolist.d.ts +3 -1
  35. package/dist/infolist.d.ts.map +1 -1
  36. package/dist/infolist.js +44 -0
  37. package/dist/infolist.js.map +1 -1
  38. package/dist/media.d.ts +110 -0
  39. package/dist/media.d.ts.map +1 -0
  40. package/dist/media.js +6 -0
  41. package/dist/media.js.map +1 -0
  42. package/dist/page-content.d.ts +92 -0
  43. package/dist/page-content.d.ts.map +1 -0
  44. package/dist/page-content.js +128 -0
  45. package/dist/page-content.js.map +1 -0
  46. package/dist/page-registry.d.ts +16 -0
  47. package/dist/page-registry.d.ts.map +1 -0
  48. package/dist/page-registry.js +45 -0
  49. package/dist/page-registry.js.map +1 -0
  50. package/dist/page.d.ts +132 -0
  51. package/dist/page.d.ts.map +1 -0
  52. package/dist/page.js +222 -0
  53. package/dist/page.js.map +1 -0
  54. package/dist/panel.d.ts +46 -2
  55. package/dist/panel.d.ts.map +1 -1
  56. package/dist/panel.js +65 -2
  57. package/dist/panel.js.map +1 -1
  58. package/dist/registry.d.ts.map +1 -1
  59. package/dist/registry.js +2 -0
  60. package/dist/registry.js.map +1 -1
  61. package/dist/resource.d.ts +8 -1
  62. package/dist/resource.d.ts.map +1 -1
  63. package/dist/resource.js +10 -1
  64. package/dist/resource.js.map +1 -1
  65. package/dist/types.d.ts +77 -8
  66. package/dist/types.d.ts.map +1 -1
  67. package/dist/validation.d.ts +5 -0
  68. package/dist/validation.d.ts.map +1 -1
  69. package/dist/validation.js +91 -10
  70. package/dist/validation.js.map +1 -1
  71. package/package.json +1 -1
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # @shamar/core
2
2
 
3
- Filament-inspired **Resource DSL** for Shamar — forms, tables, infolists, actions, navigation, and auth contracts. ORM-agnostic: persistence lives in adapters (`@shamar/lucid`, `@shamar/mongoose`) or your own `DataAdapter`.
3
+ Filament-inspired **Resource DSL** for Shamar — forms, tables, infolists, panel pages, actions, navigation, and auth contracts. ORM-agnostic: persistence lives in adapters (`@shamar/lucid`, `@shamar/mongoose`) or your own `DataAdapter`.
4
4
 
5
5
  Most apps consume this transitively via [`@shamar/adonis`](../adonis). Use `@shamar/core` directly when building a custom host or adapter.
6
6
 
@@ -96,6 +96,7 @@ export default class UserResource extends Resource {
96
96
  | `form((f) => …)` | Create / edit schemas |
97
97
  | `table((t) => …)` | List columns, filters, group-by defaults |
98
98
  | `infolist((i) => …)` | Show / view schemas |
99
+ | `pageContent((p) => …)` | Composite `Page` sections (edge, form, table, infolist) |
99
100
  | `actions((a) => …)` | Create, view, edit, delete, bulk, header, and row actions |
100
101
  | `panel(id)` | Multi-panel registration (also re-exported from `@shamar/adonis`) |
101
102
 
@@ -107,7 +108,9 @@ Containers use `.schema([...])` for children. Layout width uses `.columns(n)` on
107
108
 
108
109
  ### Form fields
109
110
 
110
- `TextInput`, `Textarea`, `Select`, `Toggle`, `Checkbox`, `Radio`, `CheckboxList`, `Hidden`, `ColorPicker`, `TagsInput`, `DatePicker`, `DateTimePicker`, `FileUpload`, `RelationTable`, `PermissionsAssignment`, `AbilitiesAssignment`
111
+ `TextInput`, `Textarea`, `Select`, `Toggle`, `Checkbox`, `Radio`, `ToggleButtons`, `CheckboxList`, `Hidden`, `ColorPicker`, `TagsInput`, `DatePicker`, `DateTimePicker`, `TimePicker`, `WeekPicker`, `MonthPicker` (Flowbite calendar by default; `.native()` for browser inputs), `RichEditor` (`.simple()` / `.notion()` / `.document()` modes; simple default), `MarkdownEditor`, `CodeEditor`, `Repeater`, `KeyValue`, `Slider`, `Rating`, `FileUpload`, `FilePicker`, `RelationTable`, `PermissionsAssignment`, `AbilitiesAssignment`
112
+
113
+ Custom types: `registerFieldType({ type, valueKind, hydrate, dehydrate, empty })` in `@shamar/core`, then `registerFieldView(type, 'your::edge/view')` in `@shamar/adonis`. Field classes can extend `FormComponent` and store options on `.setWidget()` / `field.widget`. The admin host hydrates and dehydrates through the registry — adding a type does not require controller changes.
111
114
 
112
115
  ### Table / infolist
113
116
 
@@ -115,11 +118,38 @@ Containers use `.schema([...])` for children. Layout width uses `.columns(n)` on
115
118
 
116
119
  - `TextEntry.make('payload').textarea()` — scrollable, break-all block for long unbroken strings
117
120
  - Derived show schemas (no `infolist()`) wrap fields in a card `Section` by default
121
+ - `ListPage` without `infolist()` derives the record view from table columns
122
+
123
+ ## Pages
124
+
125
+ `Page`, `FormPage`, `SettingsPage`, and `ListPage` are panel screens discovered next to resources (see [`@shamar/adonis`](../adonis#pages-filament-style)).
126
+
127
+ ```ts
128
+ import { Page, pageContent, form, table, infolist } from '@shamar/core'
129
+
130
+ export default class OpsDashboardPage extends Page {
131
+ static override slug = 'ops-dashboard'
132
+ static override label = 'Ops dashboard'
133
+
134
+ static override content() {
135
+ return pageContent((p) => {
136
+ p.edge('banner', { view: 'pages/admin/ops_banner', data: { title: 'Hi' } })
137
+ p.form('settings', { form: () => form((f) => { /* … */ }), save: async () => ({}) })
138
+ p.table('items', { model: Product, table: () => table((t) => { /* … */ }) })
139
+ p.infolist('meta', { record: { env: 'test' }, infolist: () => infolist((i) => { /* … */ }) })
140
+ })
141
+ }
142
+ }
143
+ ```
144
+
145
+ `SettingsPage` / `FormPage` / `ListPage` remain shortcuts for a settings form, generic form, or table. List row clicks open `GET /:slug/:id` using `static infolist()` or columns.
146
+
147
+ ## Layout width
118
148
 
119
- ### Layout width
149
+ Default for form and detail pages: `screen-xl` (1280px) — fills the column up to that cap.
120
150
 
121
- - Panel: `panel('admin').contentMaxWidth('7xl')` (or `'80rem'`, `'full'`, …)
122
- - Resource: `static contentMaxWidth = '3xl'` (overrides the panel)
151
+ - Panel: `panel('admin').contentMaxWidth('screen-2xl')` (or `'screen-lg'`, `'7xl'`, `'full'`, …)
152
+ - Resource: `static contentMaxWidth = 'screen-lg'` (overrides the panel)
123
153
 
124
154
  ## Common modifiers
125
155
 
package/dist/actions.d.ts CHANGED
@@ -7,6 +7,13 @@ declare abstract class ActionBase<T extends ActionConfig> {
7
7
  icon(value: string): this;
8
8
  confirm(value: string): this;
9
9
  ability(value: string): this;
10
+ /**
11
+ * Row actions: include in the ⋮ menu (default) or show inline.
12
+ * Pass `false` (or use {@link ungrouped}) for a visible toolbar button.
13
+ */
14
+ grouped(value?: boolean): this;
15
+ /** Shorthand: show this row action outside the ⋮ menu. */
16
+ ungrouped(): this;
10
17
  build(): T;
11
18
  }
12
19
  declare class HeaderAction extends ActionBase<ActionConfig> {
@@ -22,11 +29,11 @@ declare class BulkAction extends ActionBase<ActionConfig> {
22
29
  export declare class ActionBuilder {
23
30
  private readonly actionInstances;
24
31
  private track;
25
- create(label?: string): HeaderAction;
26
- edit(label?: string): RowAction;
27
32
  view(label?: string): RowAction;
33
+ edit(label?: string): RowAction;
28
34
  delete(label?: string): RowAction;
29
35
  bulkDelete(label?: string): BulkAction;
36
+ create(label?: string): HeaderAction;
30
37
  header(name: string, label: string): HeaderAction;
31
38
  row(name: string, label: string): RowAction;
32
39
  bulk(name: string, label: string): BulkAction;
@@ -1 +1 @@
1
- {"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../src/actions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,uBAAe,UAAU,CAAC,CAAC,SAAS,YAAY;IAC9C,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC;IAEpB,SAAS,aAAa,MAAM,EAAE,CAAC;IAI/B,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAK1B,KAAK,CAAC,KAAK,EAAE,YAAY,CAAC,OAAO,CAAC,GAAG,IAAI;IAKzC,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAKzB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAK5B,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAK5B,KAAK,IAAI,CAAC;CAGX;AAED,cAAM,YAAa,SAAQ,UAAU,CAAC,YAAY,CAAC;gBACrC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;CAGxC;AAED,cAAM,SAAU,SAAQ,UAAU,CAAC,YAAY,CAAC;gBAClC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;CAGxC;AAED,cAAM,UAAW,SAAQ,UAAU,CAAC,YAAY,CAAC;gBACnC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;CAGxC;AAED,qDAAqD;AACrD,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAkC;IAElE,OAAO,CAAC,KAAK;IAKb,MAAM,CAAC,KAAK,SAAW,GAAG,YAAY;IAItC,IAAI,CAAC,KAAK,SAAS,GAAG,SAAS;IAI/B,IAAI,CAAC,KAAK,SAAS,GAAG,SAAS;IAI/B,MAAM,CAAC,KAAK,SAAW,GAAG,SAAS;IAInC,UAAU,CAAC,KAAK,SAAoB,GAAG,UAAU;IAQjD,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,YAAY;IAIjD,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS;IAI3C,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,UAAU;IAI7C,KAAK,IAAI,YAAY,EAAE;CAGxB;AAED,wBAAgB,OAAO,CACrB,QAAQ,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,aAAa,GAAG,IAAI,GACzD,YAAY,EAAE,CAIhB;AAED,gDAAgD;AAChD,wBAAgB,cAAc,IAAI,YAAY,EAAE,CAQ/C"}
1
+ {"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../src/actions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,uBAAe,UAAU,CAAC,CAAC,SAAS,YAAY;IAC9C,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC;IAEpB,SAAS,aAAa,MAAM,EAAE,CAAC;IAI/B,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAK1B,KAAK,CAAC,KAAK,EAAE,YAAY,CAAC,OAAO,CAAC,GAAG,IAAI;IAKzC,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAKzB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAK5B,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAK5B;;;OAGG;IACH,OAAO,CAAC,KAAK,UAAO,GAAG,IAAI;IAK3B,0DAA0D;IAC1D,SAAS,IAAI,IAAI;IAIjB,KAAK,IAAI,CAAC;CAGX;AAED,cAAM,YAAa,SAAQ,UAAU,CAAC,YAAY,CAAC;gBACrC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;CAGxC;AAED,cAAM,SAAU,SAAQ,UAAU,CAAC,YAAY,CAAC;gBAClC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;CAGxC;AAED,cAAM,UAAW,SAAQ,UAAU,CAAC,YAAY,CAAC;gBACnC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;CAGxC;AAED,qDAAqD;AACrD,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAkC;IAElE,OAAO,CAAC,KAAK;IAKb,IAAI,CAAC,KAAK,SAAS,GAAG,SAAS;IAI/B,IAAI,CAAC,KAAK,SAAS,GAAG,SAAS;IAI/B,MAAM,CAAC,KAAK,SAAW,GAAG,SAAS;IAInC,UAAU,CAAC,KAAK,SAAoB,GAAG,UAAU;IASjD,MAAM,CAAC,KAAK,SAAW,GAAG,YAAY;IAItC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,YAAY;IAIjD,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS;IAI3C,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,UAAU;IAI7C,KAAK,IAAI,YAAY,EAAE;CAGxB;AAED,wBAAgB,OAAO,CACrB,QAAQ,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,aAAa,GAAG,IAAI,GACzD,YAAY,EAAE,CAIhB;AAED,gDAAgD;AAChD,wBAAgB,cAAc,IAAI,YAAY,EAAE,CAQ/C"}
package/dist/actions.js CHANGED
@@ -23,6 +23,18 @@ class ActionBase {
23
23
  this.config.ability = value;
24
24
  return this;
25
25
  }
26
+ /**
27
+ * Row actions: include in the ⋮ menu (default) or show inline.
28
+ * Pass `false` (or use {@link ungrouped}) for a visible toolbar button.
29
+ */
30
+ grouped(value = true) {
31
+ this.config.grouped = value;
32
+ return this;
33
+ }
34
+ /** Shorthand: show this row action outside the ⋮ menu. */
35
+ ungrouped() {
36
+ return this.grouped(false);
37
+ }
26
38
  build() {
27
39
  return { ...this.config };
28
40
  }
@@ -49,23 +61,24 @@ export class ActionBuilder {
49
61
  this.actionInstances.push(action);
50
62
  return action;
51
63
  }
52
- create(label = 'Create') {
53
- return this.track(new HeaderAction('create', label));
64
+ view(label = 'View') {
65
+ return this.track(new RowAction('view', label).icon('eye'));
54
66
  }
55
67
  edit(label = 'Edit') {
56
- return this.track(new RowAction('edit', label));
57
- }
58
- view(label = 'View') {
59
- return this.track(new RowAction('view', label));
68
+ return this.track(new RowAction('edit', label).icon('pencil'));
60
69
  }
61
70
  delete(label = 'Delete') {
62
- return this.track(new RowAction('delete', label).color('danger'));
71
+ return this.track(new RowAction('delete', label).color('danger').icon('trash'));
63
72
  }
64
73
  bulkDelete(label = 'Delete selected') {
65
74
  return this.track(new BulkAction('delete', label)
66
75
  .color('danger')
76
+ .icon('trash')
67
77
  .confirm('Delete selected records?'));
68
78
  }
79
+ create(label = 'Create') {
80
+ return this.track(new HeaderAction('create', label).icon('plus'));
81
+ }
69
82
  header(name, label) {
70
83
  return this.track(new HeaderAction(name, label));
71
84
  }
@@ -88,8 +101,8 @@ export function actions(callback) {
88
101
  export function defaultActions() {
89
102
  return actions((a) => {
90
103
  a.create();
91
- a.edit();
92
104
  a.view();
105
+ a.edit();
93
106
  a.delete();
94
107
  a.bulkDelete();
95
108
  });
@@ -1 +1 @@
1
- {"version":3,"file":"actions.js","sourceRoot":"","sources":["../src/actions.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"actions.js","sourceRoot":"","sources":["../src/actions.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,10 @@
1
+ /**
2
+ * Default max width for form and show pages when panel/resource omit `contentMaxWidth`.
3
+ * Screen tokens map to breakpoint widths (container-like).
4
+ */
5
+ export declare const DEFAULT_CONTENT_MAX_WIDTH = "screen-xl";
1
6
  export interface ContentMaxWidthResolved {
2
- /** Tailwind class such as `max-w-5xl` or `max-w-none`. */
7
+ /** Tailwind class such as `w-full max-w-screen-xl` or `max-w-none`. */
3
8
  className: string;
4
9
  /** Inline `max-width: …` when a CSS length was provided. */
5
10
  style?: string;
@@ -8,11 +13,13 @@ export interface ContentMaxWidthResolved {
8
13
  * Resolve panel/resource `contentMaxWidth` for form + show layouts.
9
14
  *
10
15
  * Accepts:
11
- * - Tailwind token: `3xl`, `5xl`, `7xl`, `full`, `none`
12
- * - Full class: `max-w-5xl`
16
+ * - Screen (container) token: `screen-lg`, `screen-xl`, `screen-2xl`
17
+ * - Scale token: `3xl`, `5xl`, `7xl`, `full`, `none`
18
+ * - Full class: `max-w-screen-xl`
13
19
  * - CSS length: `80rem`, `1200px`, `90%`
14
20
  *
15
- * Default: `5xl` (64rem).
21
+ * Default: `screen-xl` (1280px). Override per panel with `.contentMaxWidth('…')`
22
+ * or per resource with `static contentMaxWidth = '…'`.
16
23
  */
17
24
  export declare function resolveContentMaxWidth(value?: string | null): ContentMaxWidthResolved;
18
25
  //# sourceMappingURL=content-max-width.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"content-max-width.d.ts","sourceRoot":"","sources":["../src/content-max-width.ts"],"names":[],"mappings":"AAmBA,MAAM,WAAW,uBAAuB;IACtC,0DAA0D;IAC1D,SAAS,EAAE,MAAM,CAAC;IAClB,4DAA4D;IAC5D,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,uBAAuB,CAarF"}
1
+ {"version":3,"file":"content-max-width.d.ts","sourceRoot":"","sources":["../src/content-max-width.ts"],"names":[],"mappings":"AAwBA;;;GAGG;AACH,eAAO,MAAM,yBAAyB,cAAc,CAAC;AAErD,MAAM,WAAW,uBAAuB;IACtC,uEAAuE;IACvE,SAAS,EAAE,MAAM,CAAC;IAClB,4DAA4D;IAC5D,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AASD;;;;;;;;;;;GAWG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,uBAAuB,CAarF"}
@@ -15,26 +15,46 @@ const TAILWIND_TOKENS = new Set([
15
15
  'none',
16
16
  'prose',
17
17
  'screen',
18
+ 'screen-sm',
19
+ 'screen-md',
20
+ 'screen-lg',
21
+ 'screen-xl',
22
+ 'screen-2xl',
18
23
  ]);
24
+ /**
25
+ * Default max width for form and show pages when panel/resource omit `contentMaxWidth`.
26
+ * Screen tokens map to breakpoint widths (container-like).
27
+ */
28
+ export const DEFAULT_CONTENT_MAX_WIDTH = 'screen-xl';
29
+ function classForToken(token) {
30
+ if (token === 'none')
31
+ return 'w-full max-w-none';
32
+ if (token === 'full')
33
+ return 'w-full max-w-full';
34
+ // Screen / scale tokens: fill the content column up to the cap.
35
+ return `w-full max-w-${token}`;
36
+ }
19
37
  /**
20
38
  * Resolve panel/resource `contentMaxWidth` for form + show layouts.
21
39
  *
22
40
  * Accepts:
23
- * - Tailwind token: `3xl`, `5xl`, `7xl`, `full`, `none`
24
- * - Full class: `max-w-5xl`
41
+ * - Screen (container) token: `screen-lg`, `screen-xl`, `screen-2xl`
42
+ * - Scale token: `3xl`, `5xl`, `7xl`, `full`, `none`
43
+ * - Full class: `max-w-screen-xl`
25
44
  * - CSS length: `80rem`, `1200px`, `90%`
26
45
  *
27
- * Default: `5xl` (64rem).
46
+ * Default: `screen-xl` (1280px). Override per panel with `.contentMaxWidth('…')`
47
+ * or per resource with `static contentMaxWidth = '…'`.
28
48
  */
29
49
  export function resolveContentMaxWidth(value) {
30
- const raw = (value ?? '5xl').trim();
50
+ const raw = (value ?? DEFAULT_CONTENT_MAX_WIDTH).trim();
31
51
  if (!raw)
32
- return { className: 'max-w-5xl' };
52
+ return { className: classForToken(DEFAULT_CONTENT_MAX_WIDTH) };
33
53
  if (raw.startsWith('max-w-')) {
34
- return { className: raw };
54
+ return { className: raw.includes('w-full') ? raw : `w-full ${raw}` };
35
55
  }
36
56
  if (TAILWIND_TOKENS.has(raw)) {
37
- return { className: raw === 'none' ? 'max-w-none' : `max-w-${raw}` };
57
+ return { className: classForToken(raw) };
38
58
  }
39
59
  return { className: 'w-full max-w-none', style: `max-width: ${raw}` };
40
60
  }
@@ -1 +1 @@
1
- {"version":3,"file":"content-max-width.js","sourceRoot":"","sources":["../src/content-max-width.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC;IAC9B,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,MAAM;IACN,MAAM;IACN,OAAO;IACP,QAAQ;CACT,CAAC,CAAC;AASH;;;;;;;;;GASG;AACH,MAAM,UAAU,sBAAsB,CAAC,KAAqB;IAC1D,MAAM,GAAG,GAAG,CAAC,KAAK,IAAI,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;IACpC,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC;IAE5C,IAAI,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC;IAC5B,CAAC;IAED,IAAI,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;QAC7B,OAAO,EAAE,SAAS,EAAE,GAAG,KAAK,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,GAAG,EAAE,EAAE,CAAC;IACvE,CAAC;IAED,OAAO,EAAE,SAAS,EAAE,mBAAmB,EAAE,KAAK,EAAE,cAAc,GAAG,EAAE,EAAE,CAAC;AACxE,CAAC"}
1
+ {"version":3,"file":"content-max-width.js","sourceRoot":"","sources":["../src/content-max-width.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC;IAC9B,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,MAAM;IACN,MAAM;IACN,OAAO;IACP,QAAQ;IACR,WAAW;IACX,WAAW;IACX,WAAW;IACX,WAAW;IACX,YAAY;CACb,CAAC,CAAC;AAEH;;;GAGG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,WAAW,CAAC;AASrD,SAAS,aAAa,CAAC,KAAa;IAClC,IAAI,KAAK,KAAK,MAAM;QAAE,OAAO,mBAAmB,CAAC;IACjD,IAAI,KAAK,KAAK,MAAM;QAAE,OAAO,mBAAmB,CAAC;IACjD,gEAAgE;IAChE,OAAO,gBAAgB,KAAK,EAAE,CAAC;AACjC,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,sBAAsB,CAAC,KAAqB;IAC1D,MAAM,GAAG,GAAG,CAAC,KAAK,IAAI,yBAAyB,CAAC,CAAC,IAAI,EAAE,CAAC;IACxD,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,SAAS,EAAE,aAAa,CAAC,yBAAyB,CAAC,EAAE,CAAC;IAEzE,IAAI,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,OAAO,EAAE,SAAS,EAAE,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,GAAG,EAAE,EAAE,CAAC;IACvE,CAAC;IAED,IAAI,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;QAC7B,OAAO,EAAE,SAAS,EAAE,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC;IAC3C,CAAC;IAED,OAAO,EAAE,SAAS,EAAE,mBAAmB,EAAE,KAAK,EAAE,cAAc,GAAG,EAAE,EAAE,CAAC;AACxE,CAAC"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Built-in default list page size when panel/resource omit `defaultPerPage`.
3
+ */
4
+ export declare const DEFAULT_LIST_PER_PAGE = 15;
5
+ /** Common row-count choices shown in the list toolbar. */
6
+ export declare const LIST_PER_PAGE_OPTIONS: readonly [10, 15, 20, 25, 50];
7
+ /**
8
+ * Resolve effective default page size: resource → panel → built-in `15`.
9
+ * Invalid / missing values fall through to the next level.
10
+ */
11
+ export declare function resolveDefaultPerPage(resourceDefault?: number | null, panelDefault?: number | null): number;
12
+ /**
13
+ * Toolbar select options, ensuring the active default is always present.
14
+ */
15
+ export declare function resolvePerPageOptions(defaultPerPage: number): number[];
16
+ //# sourceMappingURL=default-per-page.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"default-per-page.d.ts","sourceRoot":"","sources":["../src/default-per-page.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,eAAO,MAAM,qBAAqB,KAAK,CAAC;AAExC,0DAA0D;AAC1D,eAAO,MAAM,qBAAqB,+BAAgC,CAAC;AAEnE;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,EAC/B,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,GAC3B,MAAM,CAOR;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,EAAE,CAKtE"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Built-in default list page size when panel/resource omit `defaultPerPage`.
3
+ */
4
+ export const DEFAULT_LIST_PER_PAGE = 15;
5
+ /** Common row-count choices shown in the list toolbar. */
6
+ export const LIST_PER_PAGE_OPTIONS = [10, 15, 20, 25, 50];
7
+ /**
8
+ * Resolve effective default page size: resource → panel → built-in `15`.
9
+ * Invalid / missing values fall through to the next level.
10
+ */
11
+ export function resolveDefaultPerPage(resourceDefault, panelDefault) {
12
+ for (const candidate of [resourceDefault, panelDefault, DEFAULT_LIST_PER_PAGE]) {
13
+ if (candidate == null)
14
+ continue;
15
+ const n = Math.round(Number(candidate));
16
+ if (Number.isFinite(n) && n >= 1)
17
+ return n;
18
+ }
19
+ return DEFAULT_LIST_PER_PAGE;
20
+ }
21
+ /**
22
+ * Toolbar select options, ensuring the active default is always present.
23
+ */
24
+ export function resolvePerPageOptions(defaultPerPage) {
25
+ const options = new Set(LIST_PER_PAGE_OPTIONS);
26
+ const n = Math.round(Number(defaultPerPage));
27
+ if (Number.isFinite(n) && n >= 1)
28
+ options.add(n);
29
+ return [...options].sort((a, b) => a - b);
30
+ }
31
+ //# sourceMappingURL=default-per-page.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"default-per-page.js","sourceRoot":"","sources":["../src/default-per-page.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,EAAE,CAAC;AAExC,0DAA0D;AAC1D,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAU,CAAC;AAEnE;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CACnC,eAA+B,EAC/B,YAA4B;IAE5B,KAAK,MAAM,SAAS,IAAI,CAAC,eAAe,EAAE,YAAY,EAAE,qBAAqB,CAAC,EAAE,CAAC;QAC/E,IAAI,SAAS,IAAI,IAAI;YAAE,SAAS;QAChC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;QACxC,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,OAAO,CAAC,CAAC;IAC7C,CAAC;IACD,OAAO,qBAAqB,CAAC;AAC/B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CAAC,cAAsB;IAC1D,MAAM,OAAO,GAAG,IAAI,GAAG,CAAS,qBAAqB,CAAC,CAAC;IACvD,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC;IAC7C,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACjD,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAC5C,CAAC"}
@@ -0,0 +1,55 @@
1
+ import type { FieldConfig, FormSchema } from './types.js';
2
+ /**
3
+ * How a field dehydrates into form state / request payload.
4
+ * Hosts use this to parse POST bodies and seed Alpine state.
5
+ */
6
+ export type FieldValueKind = 'scalar' | 'number' | 'boolean' | 'array' | 'record' | 'nested' | 'html' | 'json';
7
+ /** Omit this key from the dehydrated payload (field was not in the request). */
8
+ export declare const FIELD_ABSENT: unique symbol;
9
+ /** Omit this key from Alpine form state (another widget owns it). */
10
+ export declare const FIELD_SKIP: unique symbol;
11
+ export type FieldValueHost = Pick<FieldConfig, 'type'> & Partial<FieldConfig>;
12
+ export interface FieldTypeDefinition {
13
+ type: string;
14
+ valueKind?: FieldValueKind;
15
+ /** Hint for native `<input type>` when no custom view is registered. */
16
+ inputType?: string;
17
+ /** Human label for docs / field galleries. */
18
+ label?: string;
19
+ /** Stored / adapter value → Alpine form state. */
20
+ hydrate?: (value: unknown, field: FieldValueHost) => unknown;
21
+ /**
22
+ * Request body → stored value.
23
+ * Return {@link FIELD_ABSENT} to leave the key off the payload.
24
+ */
25
+ dehydrate?: (field: FieldConfig, input: Record<string, unknown>) => unknown;
26
+ /**
27
+ * Empty form state when there is no record value or static default.
28
+ * Return {@link FIELD_SKIP} to omit the key (e.g. belongsTo combobox).
29
+ */
30
+ empty?: (field: FieldValueHost) => unknown;
31
+ }
32
+ /** Register or replace a field type (built-in or host-defined). Merges with any existing definition. */
33
+ export declare function registerFieldType(definition: FieldTypeDefinition): void;
34
+ export declare function getFieldType(type: string): FieldTypeDefinition | undefined;
35
+ export declare function listFieldTypes(): FieldTypeDefinition[];
36
+ export declare function fieldValueKind(type: string): FieldValueKind;
37
+ export declare function isArrayFieldType(type: string): boolean;
38
+ export declare function isJsonFieldType(type: string): boolean;
39
+ /** Stored / adapter value → Alpine form state. */
40
+ export declare function hydrateField(field: FieldValueHost, value: unknown): unknown;
41
+ /**
42
+ * Request body → stored value.
43
+ * Returns {@link FIELD_ABSENT} when the field should be omitted from the payload.
44
+ */
45
+ export declare function dehydrateField(field: FieldConfig, input: Record<string, unknown>): unknown;
46
+ /** Empty form state when there is no record value or static default. */
47
+ export declare function emptyFieldValue(field: FieldValueHost): unknown;
48
+ /**
49
+ * Seed Alpine state for one field from a record (or filled page data).
50
+ * Returns {@link FIELD_SKIP} when the field should not be written.
51
+ */
52
+ export declare function fieldFormState(field: FieldConfig, source: Record<string, unknown> | null | undefined): unknown;
53
+ export declare function assignFieldFormState(state: Record<string, unknown>, field: FieldConfig, source: Record<string, unknown> | null | undefined): void;
54
+ export declare function emptyRepeaterItem(schema: Pick<FormSchema, 'fields'>): Record<string, unknown>;
55
+ //# sourceMappingURL=field-registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"field-registry.d.ts","sourceRoot":"","sources":["../src/field-registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAa,UAAU,EAAE,MAAM,YAAY,CAAC;AAcrE;;;GAGG;AACH,MAAM,MAAM,cAAc,GACtB,QAAQ,GACR,QAAQ,GACR,SAAS,GACT,OAAO,GACP,QAAQ,GACR,QAAQ,GACR,MAAM,GACN,MAAM,CAAC;AAEX,gFAAgF;AAChF,eAAO,MAAM,YAAY,EAAE,OAAO,MAAqC,CAAC;AAExE,qEAAqE;AACrE,eAAO,MAAM,UAAU,EAAE,OAAO,MAAmC,CAAC;AAEpE,MAAM,MAAM,cAAc,GAAG,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;AAE9E,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,cAAc,CAAC;IAC3B,wEAAwE;IACxE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,8CAA8C;IAC9C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kDAAkD;IAClD,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,cAAc,KAAK,OAAO,CAAC;IAC7D;;;OAGG;IACH,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC;IAC5E;;;OAGG;IACH,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,OAAO,CAAC;CAC5C;AAID,wGAAwG;AACxG,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,mBAAmB,GAAG,IAAI,CAKvE;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,mBAAmB,GAAG,SAAS,CAE1E;AAED,wBAAgB,cAAc,IAAI,mBAAmB,EAAE,CAEtD;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,CAE3D;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAGtD;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAGrD;AA2ID,kDAAkD;AAClD,wBAAgB,YAAY,CAAC,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAI3E;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAS1F;AAED,wEAAwE;AACxE,wBAAgB,eAAe,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAI9D;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,WAAW,EAClB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,GAAG,SAAS,GACjD,OAAO,CAQT;AAED,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,KAAK,EAAE,WAAW,EAClB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,GAAG,SAAS,GACjD,IAAI,CAGN;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAO7F"}