@mulmoclaude/collection-plugin 0.5.6 → 0.5.7

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.
package/dist/style.css CHANGED
@@ -614,6 +614,10 @@
614
614
  margin-top: calc(var(--spacing) * 4);
615
615
  }
616
616
 
617
+ .mt-5 {
618
+ margin-top: calc(var(--spacing) * 5);
619
+ }
620
+
617
621
  .mr-1 {
618
622
  margin-right: var(--spacing);
619
623
  }
@@ -626,6 +630,10 @@
626
630
  margin-bottom: var(--spacing);
627
631
  }
628
632
 
633
+ .mb-1\.5 {
634
+ margin-bottom: calc(var(--spacing) * 1.5);
635
+ }
636
+
629
637
  .mb-2 {
630
638
  margin-bottom: calc(var(--spacing) * 2);
631
639
  }
@@ -909,6 +917,10 @@
909
917
  align-items: center;
910
918
  }
911
919
 
920
+ .items-end {
921
+ align-items: flex-end;
922
+ }
923
+
912
924
  .items-start {
913
925
  align-items: flex-start;
914
926
  }
@@ -1662,6 +1674,10 @@
1662
1674
  padding-top: var(--spacing);
1663
1675
  }
1664
1676
 
1677
+ .pt-4 {
1678
+ padding-top: calc(var(--spacing) * 4);
1679
+ }
1680
+
1665
1681
  .pr-1 {
1666
1682
  padding-right: var(--spacing);
1667
1683
  }
@@ -31,6 +31,7 @@ declare const __VLS_export: import("vue").DefineComponent<__VLS_PublicProps, {},
31
31
  submit: () => any;
32
32
  cancel: () => any;
33
33
  runAction: (action: CollectionAction) => any;
34
+ itemChat: (message: string) => any;
34
35
  "update:editing": (value: EditState | null) => any;
35
36
  }, string, import("vue").PublicProps, Readonly<__VLS_PublicProps> & Readonly<{
36
37
  onEdit?: (() => any) | undefined;
@@ -39,6 +40,7 @@ declare const __VLS_export: import("vue").DefineComponent<__VLS_PublicProps, {},
39
40
  onSubmit?: (() => any) | undefined;
40
41
  onCancel?: (() => any) | undefined;
41
42
  onRunAction?: ((action: CollectionAction) => any) | undefined;
43
+ onItemChat?: ((message: string) => any) | undefined;
42
44
  "onUpdate:editing"?: ((value: EditState | null) => any) | undefined;
43
45
  }>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
44
46
  declare const _default: typeof __VLS_export;
@@ -1 +1 @@
1
- {"version":3,"file":"CollectionRecordPanel.vue.d.ts","sourceRoot":"","sources":["../../../src/vue/components/CollectionRecordPanel.vue"],"names":[],"mappings":"AAglBA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,KAAK,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,cAAc,EAAoC,MAAM,mBAAmB,CAAC;AAC9H,OAAO,KAAK,EAAE,SAAS,EAAiB,MAAM,oBAAoB,CAAC;AAQnE,KAAK,WAAW,GAAG;IACjB,UAAU,EAAE,gBAAgB,CAAC;IAC7B,8CAA8C;IAC9C,OAAO,EAAE,cAAc,GAAG,IAAI,CAAC;IAC/B,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,aAAa,EAAE,OAAO,CAAC;IACvB,cAAc,EAAE,gBAAgB,EAAE,CAAC;IACnC,qEAAqE;IACrE,UAAU,EAAE,cAAc,GAAG,IAAI,CAAC;IAClC,gDAAgD;IAChD,WAAW,EAAE,cAAc,GAAG,IAAI,CAAC;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,OAAO,CAAC;IACrB,8DAA8D;IAC9D,MAAM,EAAE,mBAAmB,CAAC;IAC5B,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AA4GF,KAAK,gBAAgB,GAAG;IACxB,SAAS,EAAE,SAAS,GAAG,IAAI,CAAC;CAC3B,CAAC;AAKF,KAAK,iBAAiB,GAAG,WAAW,GAAG,gBAAgB,CAAC;AAgxCxD,QAAA,MAAM,YAAY;;;;;;;;;;;;;;;;kFAGhB,CAAC;wBACkB,OAAO,YAAY;AAAxC,wBAAyC"}
1
+ {"version":3,"file":"CollectionRecordPanel.vue.d.ts","sourceRoot":"","sources":["../../../src/vue/components/CollectionRecordPanel.vue"],"names":[],"mappings":"AAsoBA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,KAAK,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,cAAc,EAAoC,MAAM,mBAAmB,CAAC;AAC9H,OAAO,KAAK,EAAE,SAAS,EAAiB,MAAM,oBAAoB,CAAC;AAQnE,KAAK,WAAW,GAAG;IACjB,UAAU,EAAE,gBAAgB,CAAC;IAC7B,8CAA8C;IAC9C,OAAO,EAAE,cAAc,GAAG,IAAI,CAAC;IAC/B,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,aAAa,EAAE,OAAO,CAAC;IACvB,cAAc,EAAE,gBAAgB,EAAE,CAAC;IACnC,qEAAqE;IACrE,UAAU,EAAE,cAAc,GAAG,IAAI,CAAC;IAClC,gDAAgD;IAChD,WAAW,EAAE,cAAc,GAAG,IAAI,CAAC;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,OAAO,CAAC;IACrB,8DAA8D;IAC9D,MAAM,EAAE,mBAAmB,CAAC;IAC5B,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAgIF,KAAK,gBAAgB,GAAG;IACxB,SAAS,EAAE,SAAS,GAAG,IAAI,CAAC;CAC3B,CAAC;AAKF,KAAK,iBAAiB,GAAG,WAAW,GAAG,gBAAgB,CAAC;AAy2CxD,QAAA,MAAM,YAAY;;;;;;;;;;;;;;;;;;kFAGhB,CAAC;wBACkB,OAAO,YAAY;AAAxC,wBAAyC"}
@@ -1 +1 @@
1
- {"version":3,"file":"CollectionView.vue.d.ts","sourceRoot":"","sources":["../../../src/vue/components/CollectionView.vue"],"names":[],"mappings":"AA6qEA,OAAO,EAML,KAAK,eAAe,EACrB,MAAM,uBAAuB,CAAC;AA8B/B;;;;;;;;;6CAS6C;AAC7C,KAAK,WAAW,GAAG;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C;;;uEAGmE;IACnE,WAAW,CAAC,EAAE,eAAe,CAAC;IAC9B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B,CAAC;AAkkHF,QAAA,MAAM,YAAY;;;cAvjHiB,eAAe;qBAAe,MAAM;oBAAc,MAAM;;;;;cAAxD,eAAe;qBAAe,MAAM;oBAAc,MAAM;;kFA0jHzF,CAAC;wBACkB,OAAO,YAAY;AAAxC,wBAAyC"}
1
+ {"version":3,"file":"CollectionView.vue.d.ts","sourceRoot":"","sources":["../../../src/vue/components/CollectionView.vue"],"names":[],"mappings":"AAmsEA,OAAO,EAML,KAAK,eAAe,EACrB,MAAM,uBAAuB,CAAC;AA8B/B;;;;;;;;;6CAS6C;AAC7C,KAAK,WAAW,GAAG;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C;;;uEAGmE;IACnE,WAAW,CAAC,EAAE,eAAe,CAAC;IAC9B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B,CAAC;AAmmHF,QAAA,MAAM,YAAY;;;cAxlHiB,eAAe;qBAAe,MAAM;oBAAc,MAAM;;;;;cAAxD,eAAe;qBAAe,MAAM;oBAAc,MAAM;;kFA2lHzF,CAAC;wBACkB,OAAO,YAAY;AAAxC,wBAAyC"}
@@ -1 +1 @@
1
- {"version":3,"file":"de.d.ts","sourceRoot":"","sources":["../../../src/vue/lang/de.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,MAAM,CAAC;AAE/C,QAAA,MAAM,UAAU,EAAE,kBAyGjB,CAAC;AAEF,eAAe,UAAU,CAAC"}
1
+ {"version":3,"file":"de.d.ts","sourceRoot":"","sources":["../../../src/vue/lang/de.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,MAAM,CAAC;AAE/C,QAAA,MAAM,UAAU,EAAE,kBA2GjB,CAAC;AAEF,eAAe,UAAU,CAAC"}
@@ -45,6 +45,8 @@ declare const enMessages: {
45
45
  chatTitle: string;
46
46
  chatPlaceholder: string;
47
47
  chatStart: string;
48
+ itemChatLabel: string;
49
+ itemChatPlaceholder: string;
48
50
  viewToggle: string;
49
51
  viewTable: string;
50
52
  viewCalendar: string;
@@ -1 +1 @@
1
- {"version":3,"file":"en.d.ts","sourceRoot":"","sources":["../../../src/vue/lang/en.ts"],"names":[],"mappings":"AAEA,QAAA,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyGf,CAAC;AAEF,eAAe,UAAU,CAAC;AAE1B,MAAM,MAAM,kBAAkB,GAAG,OAAO,UAAU,CAAC"}
1
+ {"version":3,"file":"en.d.ts","sourceRoot":"","sources":["../../../src/vue/lang/en.ts"],"names":[],"mappings":"AAEA,QAAA,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2Gf,CAAC;AAEF,eAAe,UAAU,CAAC;AAE1B,MAAM,MAAM,kBAAkB,GAAG,OAAO,UAAU,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"es.d.ts","sourceRoot":"","sources":["../../../src/vue/lang/es.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,MAAM,CAAC;AAE/C,QAAA,MAAM,UAAU,EAAE,kBAyGjB,CAAC;AAEF,eAAe,UAAU,CAAC"}
1
+ {"version":3,"file":"es.d.ts","sourceRoot":"","sources":["../../../src/vue/lang/es.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,MAAM,CAAC;AAE/C,QAAA,MAAM,UAAU,EAAE,kBA2GjB,CAAC;AAEF,eAAe,UAAU,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"fr.d.ts","sourceRoot":"","sources":["../../../src/vue/lang/fr.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,MAAM,CAAC;AAE/C,QAAA,MAAM,UAAU,EAAE,kBA0GjB,CAAC;AAEF,eAAe,UAAU,CAAC"}
1
+ {"version":3,"file":"fr.d.ts","sourceRoot":"","sources":["../../../src/vue/lang/fr.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,MAAM,CAAC;AAE/C,QAAA,MAAM,UAAU,EAAE,kBA4GjB,CAAC;AAEF,eAAe,UAAU,CAAC"}
@@ -46,6 +46,8 @@ declare const i18n: import("vue-i18n").I18n<{
46
46
  chatTitle: string;
47
47
  chatPlaceholder: string;
48
48
  chatStart: string;
49
+ itemChatLabel: string;
50
+ itemChatPlaceholder: string;
49
51
  viewToggle: string;
50
52
  viewTable: string;
51
53
  viewCalendar: string;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/vue/lang/index.ts"],"names":[],"mappings":"AAuBA,QAAA,MAAM,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAcR,CAAC;AAsBH;;;gEAGgE;AAChE,wBAAgB,iBAAiB,IAAI;IAAE,CAAC,EAAE,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC;IAAC,MAAM,EAAE,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAA;CAAE,CAG5G"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/vue/lang/index.ts"],"names":[],"mappings":"AAuBA,QAAA,MAAM,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAcR,CAAC;AAsBH;;;gEAGgE;AAChE,wBAAgB,iBAAiB,IAAI;IAAE,CAAC,EAAE,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC;IAAC,MAAM,EAAE,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAA;CAAE,CAG5G"}
@@ -1 +1 @@
1
- {"version":3,"file":"ja.d.ts","sourceRoot":"","sources":["../../../src/vue/lang/ja.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,MAAM,CAAC;AAE/C,QAAA,MAAM,UAAU,EAAE,kBAyGjB,CAAC;AAEF,eAAe,UAAU,CAAC"}
1
+ {"version":3,"file":"ja.d.ts","sourceRoot":"","sources":["../../../src/vue/lang/ja.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,MAAM,CAAC;AAE/C,QAAA,MAAM,UAAU,EAAE,kBA2GjB,CAAC;AAEF,eAAe,UAAU,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"ko.d.ts","sourceRoot":"","sources":["../../../src/vue/lang/ko.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,MAAM,CAAC;AAE/C,QAAA,MAAM,UAAU,EAAE,kBAyGjB,CAAC;AAEF,eAAe,UAAU,CAAC"}
1
+ {"version":3,"file":"ko.d.ts","sourceRoot":"","sources":["../../../src/vue/lang/ko.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,MAAM,CAAC;AAE/C,QAAA,MAAM,UAAU,EAAE,kBA2GjB,CAAC;AAEF,eAAe,UAAU,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"ptBR.d.ts","sourceRoot":"","sources":["../../../src/vue/lang/ptBR.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,MAAM,CAAC;AAE/C,QAAA,MAAM,YAAY,EAAE,kBAyGnB,CAAC;AAEF,eAAe,YAAY,CAAC"}
1
+ {"version":3,"file":"ptBR.d.ts","sourceRoot":"","sources":["../../../src/vue/lang/ptBR.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,MAAM,CAAC;AAE/C,QAAA,MAAM,YAAY,EAAE,kBA2GnB,CAAC;AAEF,eAAe,YAAY,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"zh.d.ts","sourceRoot":"","sources":["../../../src/vue/lang/zh.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,MAAM,CAAC;AAE/C,QAAA,MAAM,UAAU,EAAE,kBAyGjB,CAAC;AAEF,eAAe,UAAU,CAAC"}
1
+ {"version":3,"file":"zh.d.ts","sourceRoot":"","sources":["../../../src/vue/lang/zh.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,MAAM,CAAC;AAE/C,QAAA,MAAM,UAAU,EAAE,kBA2GjB,CAAC;AAEF,eAAe,UAAU,CAAC"}
@@ -22,9 +22,11 @@ export interface CollectionRendering {
22
22
  hasTableRows: (value: unknown) => boolean;
23
23
  formatSubCell: (subField: FieldSpec, value: unknown, record: CollectionItem | null) => string;
24
24
  inputTypeFor: (type: FieldType) => string;
25
+ stepFor: (type: FieldType) => string | undefined;
25
26
  deriveAll: (schema: CollectionSchema, base: CollectionItem, refRecords: RefRecordCache) => CollectionItem;
26
27
  evaluateDerivedAgainstItem: (field: FieldSpec, fieldKey: string, item: CollectionItem) => number | null;
27
28
  derivedDisplay: (field: FieldSpec, computedValue: unknown, record: CollectionItem | null) => string;
28
29
  }
30
+ export declare function stepForFieldType(type: FieldType): string | undefined;
29
31
  export declare function useCollectionRendering(collection: Ref<CollectionDetail | null>, locale: Ref<string>): CollectionRendering;
30
32
  //# sourceMappingURL=useCollectionRendering.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useCollectionRendering.d.ts","sourceRoot":"","sources":["../../src/vue/useCollectionRendering.ts"],"names":[],"mappings":"AASA,OAAO,EAAiB,KAAK,WAAW,EAAE,KAAK,GAAG,EAAE,MAAM,KAAK,CAAC;AAGhE,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,gBAAgB,EAAE,mBAAmB,IAAI,SAAS,EAAE,mBAAmB,IAAI,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC7J,OAAO,KAAK,EAEV,UAAU,EAEV,SAAS,EACT,QAAQ,EAER,SAAS,EACT,cAAc,EAEf,MAAM,iBAAiB,CAAC;AAEzB,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC;IACxB,cAAc,EAAE,GAAG,CAAC,cAAc,CAAC,CAAC;IACpC,UAAU,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC;IAC5B,iBAAiB,EAAE,MAAM,IAAI,CAAC;IAC9B,qBAAqB,EAAE,CAAC,MAAM,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACzF,UAAU,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,MAAM,CAAC;IAC7D,UAAU,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,SAAS,EAAE,CAAC;IAChD,UAAU,EAAE,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;IACnD,eAAe,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,cAAc,GAAG,IAAI,GAAG,SAAS,KAAK,MAAM,GAAG,SAAS,CAAC;IACrG,cAAc,EAAE,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,KAAK,MAAM,CAAC;IACzD,WAAW,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,EAAE,aAAa,EAAE,MAAM,KAAK,MAAM,CAAC;IAC7F,UAAU,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,KAAK,MAAM,CAAC;IACxD,UAAU,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,MAAM,CAAC;IACvC,aAAa,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC;IAC3C,WAAW,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,MAAM,GAAG,IAAI,CAAC;IAC/C,aAAa,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,MAAM,GAAG,IAAI,CAAC;IACjD,SAAS,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IACzD,YAAY,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC;IAC1C,aAAa,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,cAAc,GAAG,IAAI,KAAK,MAAM,CAAC;IAC9F,YAAY,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,MAAM,CAAC;IAC1C,SAAS,EAAE,CAAC,MAAM,EAAE,gBAAgB,EAAE,IAAI,EAAE,cAAc,EAAE,UAAU,EAAE,cAAc,KAAK,cAAc,CAAC;IAC1G,0BAA0B,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,KAAK,MAAM,GAAG,IAAI,CAAC;IACxG,cAAc,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,EAAE,cAAc,GAAG,IAAI,KAAK,MAAM,CAAC;CACrG;AAED,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,GAAG,CAAC,gBAAgB,GAAG,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,mBAAmB,CAiRzH"}
1
+ {"version":3,"file":"useCollectionRendering.d.ts","sourceRoot":"","sources":["../../src/vue/useCollectionRendering.ts"],"names":[],"mappings":"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"}
package/dist/vue.cjs CHANGED
@@ -70,6 +70,8 @@ var i18n = (0, vue_i18n.createI18n)({
70
70
  chatTitle: "Start a chat",
71
71
  chatPlaceholder: "Describe what you want to do with this collection…",
72
72
  chatStart: "Start chat",
73
+ itemChatLabel: "Chat about this record",
74
+ itemChatPlaceholder: "Ask or instruct about this record…",
73
75
  viewToggle: "View",
74
76
  viewTable: "Table",
75
77
  viewCalendar: "Calendar",
@@ -171,6 +173,8 @@ var i18n = (0, vue_i18n.createI18n)({
171
173
  chatTitle: "チャットを開始",
172
174
  chatPlaceholder: "このコレクションで行いたいことを入力してください…",
173
175
  chatStart: "チャットを開始",
176
+ itemChatLabel: "このレコードについてチャット",
177
+ itemChatPlaceholder: "このレコードについて質問・指示する…",
174
178
  viewToggle: "表示",
175
179
  viewTable: "テーブル",
176
180
  viewCalendar: "カレンダー",
@@ -272,6 +276,8 @@ var i18n = (0, vue_i18n.createI18n)({
272
276
  chatTitle: "开始对话",
273
277
  chatPlaceholder: "描述你想对这个集合做什么…",
274
278
  chatStart: "开始对话",
279
+ itemChatLabel: "就此记录对话",
280
+ itemChatPlaceholder: "询问或指示有关此记录的操作…",
275
281
  viewToggle: "视图",
276
282
  viewTable: "表格",
277
283
  viewCalendar: "日历",
@@ -373,6 +379,8 @@ var i18n = (0, vue_i18n.createI18n)({
373
379
  chatTitle: "채팅 시작",
374
380
  chatPlaceholder: "이 컬렉션으로 하고 싶은 작업을 설명하세요…",
375
381
  chatStart: "채팅 시작",
382
+ itemChatLabel: "이 레코드에 대해 채팅",
383
+ itemChatPlaceholder: "이 레코드에 대해 질문하거나 지시하세요…",
376
384
  viewToggle: "보기",
377
385
  viewTable: "표",
378
386
  viewCalendar: "캘린더",
@@ -474,6 +482,8 @@ var i18n = (0, vue_i18n.createI18n)({
474
482
  chatTitle: "Iniciar un chat",
475
483
  chatPlaceholder: "Describe qué quieres hacer con esta colección…",
476
484
  chatStart: "Iniciar chat",
485
+ itemChatLabel: "Chatear sobre este registro",
486
+ itemChatPlaceholder: "Pregunta o indica algo sobre este registro…",
477
487
  viewToggle: "Vista",
478
488
  viewTable: "Tabla",
479
489
  viewCalendar: "Calendario",
@@ -575,6 +585,8 @@ var i18n = (0, vue_i18n.createI18n)({
575
585
  chatTitle: "Iniciar um chat",
576
586
  chatPlaceholder: "Descreva o que você quer fazer com esta coleção…",
577
587
  chatStart: "Iniciar chat",
588
+ itemChatLabel: "Conversar sobre este registro",
589
+ itemChatPlaceholder: "Pergunte ou instrua sobre este registro…",
578
590
  viewToggle: "Visualização",
579
591
  viewTable: "Tabela",
580
592
  viewCalendar: "Calendário",
@@ -676,6 +688,8 @@ var i18n = (0, vue_i18n.createI18n)({
676
688
  chatTitle: "Démarrer une discussion",
677
689
  chatPlaceholder: "Décrivez ce que vous voulez faire avec cette collection…",
678
690
  chatStart: "Démarrer la discussion",
691
+ itemChatLabel: "Discuter de cet enregistrement",
692
+ itemChatPlaceholder: "Posez une question ou donnez une instruction sur cet enregistrement…",
679
693
  viewToggle: "Affichage",
680
694
  viewTable: "Tableau",
681
695
  viewCalendar: "Calendrier",
@@ -777,6 +791,8 @@ var i18n = (0, vue_i18n.createI18n)({
777
791
  chatTitle: "Chat starten",
778
792
  chatPlaceholder: "Beschreibe, was du mit dieser Sammlung tun möchtest…",
779
793
  chatStart: "Chat starten",
794
+ itemChatLabel: "Über diesen Eintrag chatten",
795
+ itemChatPlaceholder: "Stelle eine Frage oder gib eine Anweisung zu diesem Eintrag…",
780
796
  viewToggle: "Ansicht",
781
797
  viewTable: "Tabelle",
782
798
  viewCalendar: "Kalender",
@@ -1758,6 +1774,7 @@ var _hoisted_36$1 = ["onUpdate:modelValue", "required"];
1758
1774
  var _hoisted_37$1 = [
1759
1775
  "onUpdate:modelValue",
1760
1776
  "type",
1777
+ "step",
1761
1778
  "required"
1762
1779
  ];
1763
1780
  var _hoisted_38$1 = { class: "text-center px-1" };
@@ -1786,6 +1803,7 @@ var _hoisted_45$1 = [
1786
1803
  "id",
1787
1804
  "onUpdate:modelValue",
1788
1805
  "type",
1806
+ "step",
1789
1807
  "required",
1790
1808
  "disabled",
1791
1809
  "data-testid"
@@ -1876,6 +1894,18 @@ var _hoisted_69$1 = {
1876
1894
  key: 0,
1877
1895
  class: "col-span-full text-xs font-semibold text-red-600 bg-red-50 border border-red-100 p-2.5 rounded-xl"
1878
1896
  };
1897
+ var _hoisted_70$1 = {
1898
+ key: 1,
1899
+ class: "mt-5 pt-4 border-t border-slate-200/60",
1900
+ "data-testid": "collections-detail-chat"
1901
+ };
1902
+ var _hoisted_71$1 = {
1903
+ class: "block text-[10px] font-bold text-slate-400 uppercase tracking-wider mb-1.5",
1904
+ for: "collections-detail-chat-input"
1905
+ };
1906
+ var _hoisted_72$1 = { class: "flex items-end gap-2" };
1907
+ var _hoisted_73$1 = ["placeholder", "onKeydown"];
1908
+ var _hoisted_74$1 = ["disabled"];
1879
1909
  //#endregion
1880
1910
  //#region src/vue/components/CollectionRecordPanel.vue
1881
1911
  var CollectionRecordPanel_default = /* @__PURE__ */ (0, vue.defineComponent)({
@@ -1904,7 +1934,8 @@ var CollectionRecordPanel_default = /* @__PURE__ */ (0, vue.defineComponent)({
1904
1934
  "edit",
1905
1935
  "close",
1906
1936
  "delete",
1907
- "runAction"
1937
+ "runAction",
1938
+ "itemChat"
1908
1939
  ], ["update:editing"]),
1909
1940
  setup(__props, { emit: __emit }) {
1910
1941
  const cui = collectionUi();
@@ -1913,6 +1944,16 @@ var CollectionRecordPanel_default = /* @__PURE__ */ (0, vue.defineComponent)({
1913
1944
  const editing = (0, vue.useModel)(__props, "editing");
1914
1945
  const emit = __emit;
1915
1946
  const { t } = useCollectionI18n();
1947
+ const chatMessage = (0, vue.ref)("");
1948
+ (0, vue.watch)(() => props.viewing, () => {
1949
+ chatMessage.value = "";
1950
+ });
1951
+ function submitItemChat() {
1952
+ const message = chatMessage.value.trim();
1953
+ if (!message) return;
1954
+ emit("itemChat", message);
1955
+ chatMessage.value = "";
1956
+ }
1916
1957
  const embedViews = (0, vue.computed)(() => props.render.embedViews.value);
1917
1958
  /** The record the read-only displays render from: the live draft while
1918
1959
  * editing (so non-editable cells like derived/embed preview the in-flight
@@ -1991,7 +2032,7 @@ var CollectionRecordPanel_default = /* @__PURE__ */ (0, vue.defineComponent)({
1991
2032
  return (0, vue.openBlock)(), (0, vue.createBlock)((0, vue.resolveDynamicComponent)(editing.value ? "form" : "div"), {
1992
2033
  class: "px-6 py-5 max-h-[60vh] overflow-y-auto",
1993
2034
  "data-testid": rootTestid.value,
1994
- onSubmit: _cache[4] || (_cache[4] = (0, vue.withModifiers)(($event) => emit("submit"), ["prevent"]))
2035
+ onSubmit: _cache[5] || (_cache[5] = (0, vue.withModifiers)(($event) => emit("submit"), ["prevent"]))
1995
2036
  }, {
1996
2037
  default: (0, vue.withCtx)(() => [
1997
2038
  (0, vue.createElementVNode)("div", _hoisted_1$7, [(0, vue.createElementVNode)("div", _hoisted_2$6, [(0, vue.createElementVNode)("span", _hoisted_3$6, (0, vue.toDisplayString)(__props.collection.title), 1), (0, vue.createElementVNode)("h2", {
@@ -2023,20 +2064,20 @@ var CollectionRecordPanel_default = /* @__PURE__ */ (0, vue.defineComponent)({
2023
2064
  class: "h-8 px-2.5 rounded border border-slate-200 bg-white text-slate-700 hover:bg-slate-50 font-bold text-xs transition-all flex items-center gap-1",
2024
2065
  "data-testid": "collections-detail-edit",
2025
2066
  onClick: _cache[1] || (_cache[1] = ($event) => emit("edit"))
2026
- }, [_cache[5] || (_cache[5] = (0, vue.createElementVNode)("span", { class: "material-icons text-sm" }, "edit", -1)), (0, vue.createElementVNode)("span", null, (0, vue.toDisplayString)((0, vue.unref)(t)("collectionsView.editItem")), 1)]),
2067
+ }, [_cache[6] || (_cache[6] = (0, vue.createElementVNode)("span", { class: "material-icons text-sm" }, "edit", -1)), (0, vue.createElementVNode)("span", null, (0, vue.toDisplayString)((0, vue.unref)(t)("collectionsView.editItem")), 1)]),
2027
2068
  (0, vue.createElementVNode)("button", {
2028
2069
  type: "button",
2029
2070
  class: "h-8 px-2.5 rounded border border-rose-200 bg-white text-rose-600 hover:bg-rose-50 font-bold text-xs transition-all flex items-center gap-1",
2030
2071
  "data-testid": "collections-detail-remove",
2031
2072
  onClick: _cache[2] || (_cache[2] = ($event) => emit("delete"))
2032
- }, [_cache[6] || (_cache[6] = (0, vue.createElementVNode)("span", { class: "material-icons text-sm" }, "delete", -1)), (0, vue.createElementVNode)("span", null, (0, vue.toDisplayString)((0, vue.unref)(t)("common.remove")), 1)]),
2073
+ }, [_cache[7] || (_cache[7] = (0, vue.createElementVNode)("span", { class: "material-icons text-sm" }, "delete", -1)), (0, vue.createElementVNode)("span", null, (0, vue.toDisplayString)((0, vue.unref)(t)("common.remove")), 1)]),
2033
2074
  (0, vue.createElementVNode)("button", {
2034
2075
  type: "button",
2035
2076
  class: "h-8 w-8 flex items-center justify-center rounded text-slate-400 hover:bg-slate-100 hover:text-slate-600 transition-colors",
2036
2077
  "aria-label": (0, vue.unref)(t)("common.close"),
2037
2078
  "data-testid": "collections-detail-close",
2038
2079
  onClick: _cache[3] || (_cache[3] = ($event) => emit("close"))
2039
- }, [..._cache[7] || (_cache[7] = [(0, vue.createElementVNode)("span", { class: "material-icons text-lg" }, "close", -1)])], 8, _hoisted_9$4)
2080
+ }, [..._cache[8] || (_cache[8] = [(0, vue.createElementVNode)("span", { class: "material-icons text-lg" }, "close", -1)])], 8, _hoisted_9$4)
2040
2081
  ]))]),
2041
2082
  !editing.value && __props.actionError ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("p", _hoisted_10$4, (0, vue.toDisplayString)(__props.actionError), 1)) : (0, vue.createCommentVNode)("", true),
2042
2083
  (0, vue.createElementVNode)("div", _hoisted_11$4, [((0, vue.openBlock)(true), (0, vue.createElementBlock)(vue.Fragment, null, (0, vue.renderList)(__props.collection.schema.fields, (field, key) => {
@@ -2086,7 +2127,7 @@ var CollectionRecordPanel_default = /* @__PURE__ */ (0, vue.defineComponent)({
2086
2127
  key: subKey,
2087
2128
  class: "text-left px-3 py-2 font-bold"
2088
2129
  }, (0, vue.toDisplayString)(subField.label), 1);
2089
- }), 128)), _cache[8] || (_cache[8] = (0, vue.createElementVNode)("th", { class: "w-9" }, null, -1))])]), (0, vue.createElementVNode)("tbody", _hoisted_26$1, [((0, vue.openBlock)(true), (0, vue.createElementBlock)(vue.Fragment, null, (0, vue.renderList)(editing.value.table[key], (row, rowIdx) => {
2130
+ }), 128)), _cache[9] || (_cache[9] = (0, vue.createElementVNode)("th", { class: "w-9" }, null, -1))])]), (0, vue.createElementVNode)("tbody", _hoisted_26$1, [((0, vue.openBlock)(true), (0, vue.createElementBlock)(vue.Fragment, null, (0, vue.renderList)(editing.value.table[key], (row, rowIdx) => {
2090
2131
  return (0, vue.openBlock)(), (0, vue.createElementBlock)("tr", {
2091
2132
  key: rowIdx,
2092
2133
  class: "hover:bg-slate-50/50"
@@ -2130,6 +2171,7 @@ var CollectionRecordPanel_default = /* @__PURE__ */ (0, vue.defineComponent)({
2130
2171
  key: 4,
2131
2172
  "onUpdate:modelValue": ($event) => row.text[subKey] = $event,
2132
2173
  type: __props.render.inputTypeFor(subField.type),
2174
+ step: __props.render.stepFor(subField.type),
2133
2175
  required: subField.required,
2134
2176
  class: "w-full rounded-lg border border-slate-200 px-2 py-1 text-xs focus:border-indigo-500 focus:outline-none font-medium text-slate-700"
2135
2177
  }, null, 8, _hoisted_37$1)), [[vue.vModelDynamic, row.text[subKey]]])]);
@@ -2139,13 +2181,13 @@ var CollectionRecordPanel_default = /* @__PURE__ */ (0, vue.defineComponent)({
2139
2181
  "aria-label": (0, vue.unref)(t)("collectionsView.removeRow"),
2140
2182
  "data-testid": `collections-table-${key}-remove-${rowIdx}`,
2141
2183
  onClick: ($event) => removeTableRow(String(key), rowIdx)
2142
- }, [..._cache[9] || (_cache[9] = [(0, vue.createElementVNode)("span", { class: "material-icons text-base" }, "close", -1)])], 8, _hoisted_39$1)])]);
2184
+ }, [..._cache[10] || (_cache[10] = [(0, vue.createElementVNode)("span", { class: "material-icons text-base" }, "close", -1)])], 8, _hoisted_39$1)])]);
2143
2185
  }), 128))])])])) : ((0, vue.openBlock)(), (0, vue.createElementBlock)("p", _hoisted_40$1, (0, vue.toDisplayString)((0, vue.unref)(t)("collectionsView.noRows")), 1)), (0, vue.createElementVNode)("button", {
2144
2186
  type: "button",
2145
2187
  class: "inline-flex items-center gap-1 text-xs text-indigo-600 hover:text-indigo-800 font-bold hover:underline",
2146
2188
  "data-testid": `collections-table-${key}-add`,
2147
2189
  onClick: ($event) => addTableRow(String(key), field.of)
2148
- }, [_cache[10] || (_cache[10] = (0, vue.createElementVNode)("span", { class: "material-icons text-xs" }, "add", -1)), (0, vue.createElementVNode)("span", null, (0, vue.toDisplayString)((0, vue.unref)(t)("collectionsView.addRow")), 1)], 8, _hoisted_41$1)], 8, _hoisted_22$2)) : field.type === "money" ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_42$1, [(0, vue.createElementVNode)("div", _hoisted_43$1, (0, vue.toDisplayString)(__props.render.currencySymbol(__props.render.resolveCurrency(field, __props.liveRecord))), 1), (0, vue.withDirectives)((0, vue.createElementVNode)("input", {
2190
+ }, [_cache[11] || (_cache[11] = (0, vue.createElementVNode)("span", { class: "material-icons text-xs" }, "add", -1)), (0, vue.createElementVNode)("span", null, (0, vue.toDisplayString)((0, vue.unref)(t)("collectionsView.addRow")), 1)], 8, _hoisted_41$1)], 8, _hoisted_22$2)) : field.type === "money" ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_42$1, [(0, vue.createElementVNode)("div", _hoisted_43$1, (0, vue.toDisplayString)(__props.render.currencySymbol(__props.render.resolveCurrency(field, __props.liveRecord))), 1), (0, vue.withDirectives)((0, vue.createElementVNode)("input", {
2149
2191
  id: `collections-field-${key}`,
2150
2192
  "onUpdate:modelValue": ($event) => editing.value.text[key] = $event,
2151
2193
  type: "number",
@@ -2167,6 +2209,7 @@ var CollectionRecordPanel_default = /* @__PURE__ */ (0, vue.defineComponent)({
2167
2209
  id: `collections-field-${key}`,
2168
2210
  "onUpdate:modelValue": ($event) => editing.value.text[key] = $event,
2169
2211
  type: __props.render.inputTypeFor(field.type),
2212
+ step: __props.render.stepFor(field.type),
2170
2213
  required: isFieldRequiredInUi(field),
2171
2214
  disabled: field.primary === true && (editing.value.mode === "edit" || __props.isSingleton),
2172
2215
  class: "w-full rounded-xl border border-slate-200 px-3 py-2 text-xs focus:border-indigo-500 focus:ring-2 focus:ring-indigo-500/20 focus:outline-none disabled:bg-slate-100 disabled:text-slate-400 font-medium text-slate-700 transition-all",
@@ -2183,7 +2226,7 @@ var CollectionRecordPanel_default = /* @__PURE__ */ (0, vue.defineComponent)({
2183
2226
  key: 1,
2184
2227
  class: "text-xs font-medium text-slate-700 break-words",
2185
2228
  "data-testid": `collections-detail-value-${key}`
2186
- }, [field.type === "toggle" ? ((0, vue.openBlock)(), (0, vue.createElementBlock)(vue.Fragment, { key: 0 }, [field.field !== void 0 && String(detailRecord.value[field.field] ?? "") === field.onValue ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("span", _hoisted_48$1, [_cache[11] || (_cache[11] = (0, vue.createElementVNode)("span", { class: "h-1.5 w-1.5 rounded-full bg-emerald-500" }, null, -1)), (0, vue.createTextVNode)(" " + (0, vue.toDisplayString)((0, vue.unref)(t)("common.yes")), 1)])) : ((0, vue.openBlock)(), (0, vue.createElementBlock)("span", _hoisted_49$1, (0, vue.toDisplayString)((0, vue.unref)(t)("common.no")), 1))], 64)) : field.type === "boolean" ? ((0, vue.openBlock)(), (0, vue.createElementBlock)(vue.Fragment, { key: 1 }, [detailRecord.value[key] === true ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("span", _hoisted_50$1, [_cache[12] || (_cache[12] = (0, vue.createElementVNode)("span", { class: "h-1.5 w-1.5 rounded-full bg-emerald-500" }, null, -1)), (0, vue.createTextVNode)(" " + (0, vue.toDisplayString)((0, vue.unref)(t)("common.yes")), 1)])) : detailRecord.value[key] === false ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("span", _hoisted_51$1, (0, vue.toDisplayString)((0, vue.unref)(t)("common.no")), 1)) : ((0, vue.openBlock)(), (0, vue.createElementBlock)("span", _hoisted_52$1, "—"))], 64)) : field.type === "ref" && field.to && typeof detailRecord.value[key] === "string" && detailRecord.value[key] ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("a", {
2229
+ }, [field.type === "toggle" ? ((0, vue.openBlock)(), (0, vue.createElementBlock)(vue.Fragment, { key: 0 }, [field.field !== void 0 && String(detailRecord.value[field.field] ?? "") === field.onValue ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("span", _hoisted_48$1, [_cache[12] || (_cache[12] = (0, vue.createElementVNode)("span", { class: "h-1.5 w-1.5 rounded-full bg-emerald-500" }, null, -1)), (0, vue.createTextVNode)(" " + (0, vue.toDisplayString)((0, vue.unref)(t)("common.yes")), 1)])) : ((0, vue.openBlock)(), (0, vue.createElementBlock)("span", _hoisted_49$1, (0, vue.toDisplayString)((0, vue.unref)(t)("common.no")), 1))], 64)) : field.type === "boolean" ? ((0, vue.openBlock)(), (0, vue.createElementBlock)(vue.Fragment, { key: 1 }, [detailRecord.value[key] === true ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("span", _hoisted_50$1, [_cache[13] || (_cache[13] = (0, vue.createElementVNode)("span", { class: "h-1.5 w-1.5 rounded-full bg-emerald-500" }, null, -1)), (0, vue.createTextVNode)(" " + (0, vue.toDisplayString)((0, vue.unref)(t)("common.yes")), 1)])) : detailRecord.value[key] === false ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("span", _hoisted_51$1, (0, vue.toDisplayString)((0, vue.unref)(t)("common.no")), 1)) : ((0, vue.openBlock)(), (0, vue.createElementBlock)("span", _hoisted_52$1, "—"))], 64)) : field.type === "ref" && field.to && typeof detailRecord.value[key] === "string" && detailRecord.value[key] ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("a", {
2187
2230
  key: 2,
2188
2231
  href: (0, vue.unref)(cui).recordHref?.(field.to, String(detailRecord.value[key])),
2189
2232
  tabindex: (0, vue.unref)(cui).recordHref?.(field.to, String(detailRecord.value[key])) ? void 0 : 0,
@@ -2241,7 +2284,22 @@ var CollectionRecordPanel_default = /* @__PURE__ */ (0, vue.defineComponent)({
2241
2284
  "data-testid": `collections-detail-file-${key}`,
2242
2285
  onClick: ($event) => (0, vue.unref)(activatePathLink)($event, __props.render.fileRoutePath(detailRecord.value[key]) ?? "")
2243
2286
  }, (0, vue.toDisplayString)(String(detailRecord.value[key])), 9, _hoisted_67$1)) : ((0, vue.openBlock)(), (0, vue.createElementBlock)("span", _hoisted_68$1, (0, vue.toDisplayString)(__props.render.formatCell(detailRecord.value[key], field.type)), 1))], 8, _hoisted_47$1))], 2)) : (0, vue.createCommentVNode)("", true)], 64);
2244
- }), 128)), editing.value && __props.saveError ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("p", _hoisted_69$1, (0, vue.toDisplayString)(__props.saveError), 1)) : (0, vue.createCommentVNode)("", true)])
2287
+ }), 128)), editing.value && __props.saveError ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("p", _hoisted_69$1, (0, vue.toDisplayString)(__props.saveError), 1)) : (0, vue.createCommentVNode)("", true)]),
2288
+ !editing.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_70$1, [(0, vue.createElementVNode)("label", _hoisted_71$1, (0, vue.toDisplayString)((0, vue.unref)(t)("collectionsView.itemChatLabel")), 1), (0, vue.createElementVNode)("div", _hoisted_72$1, [(0, vue.withDirectives)((0, vue.createElementVNode)("textarea", {
2289
+ id: "collections-detail-chat-input",
2290
+ "onUpdate:modelValue": _cache[4] || (_cache[4] = ($event) => chatMessage.value = $event),
2291
+ rows: "2",
2292
+ placeholder: (0, vue.unref)(t)("collectionsView.itemChatPlaceholder"),
2293
+ class: "flex-1 bg-slate-50 border border-slate-200/80 rounded-xl px-3 py-2 text-xs placeholder-slate-400 focus:outline-none focus:ring-2 focus:ring-indigo-500/20 focus:border-indigo-500 focus:bg-white transition-all resize-none",
2294
+ "data-testid": "collections-detail-chat-input",
2295
+ onKeydown: [(0, vue.withKeys)((0, vue.withModifiers)(submitItemChat, ["meta"]), ["enter"]), (0, vue.withKeys)((0, vue.withModifiers)(submitItemChat, ["ctrl"]), ["enter"])]
2296
+ }, null, 40, _hoisted_73$1), [[vue.vModelText, chatMessage.value]]), (0, vue.createElementVNode)("button", {
2297
+ type: "button",
2298
+ class: "h-8 px-2.5 rounded bg-indigo-600 text-white font-bold text-xs hover:bg-indigo-700 disabled:opacity-50 transition-all shadow-sm shadow-indigo-600/10 flex items-center gap-1 shrink-0",
2299
+ disabled: !chatMessage.value.trim(),
2300
+ "data-testid": "collections-detail-chat-send",
2301
+ onClick: submitItemChat
2302
+ }, [_cache[14] || (_cache[14] = (0, vue.createElementVNode)("span", { class: "material-icons text-sm" }, "forum", -1)), (0, vue.createElementVNode)("span", null, (0, vue.toDisplayString)((0, vue.unref)(t)("collectionsView.chat")), 1)], 8, _hoisted_74$1)])])) : (0, vue.createCommentVNode)("", true)
2245
2303
  ]),
2246
2304
  _: 1
2247
2305
  }, 40, ["data-testid"]);
@@ -2505,6 +2563,10 @@ var _plugin_vue_export_helper_default = (sfc, props) => {
2505
2563
  var CollectionCustomView_default = /* @__PURE__ */ _plugin_vue_export_helper_default(CollectionCustomView_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-d5fb7ca6"]]);
2506
2564
  //#endregion
2507
2565
  //#region src/vue/useCollectionRendering.ts
2566
+ function stepForFieldType(type) {
2567
+ if (type === "money") return "0.01";
2568
+ if (type === "number") return "any";
2569
+ }
2508
2570
  function useCollectionRendering(collection, locale) {
2509
2571
  const refCache = (0, vue.ref)({});
2510
2572
  const refRecordCache = (0, vue.ref)({});
@@ -2719,6 +2781,7 @@ function useCollectionRendering(collection, locale) {
2719
2781
  if (type === "datetime") return "datetime-local";
2720
2782
  return "text";
2721
2783
  }
2784
+ const stepFor = stepForFieldType;
2722
2785
  function evaluateDerivedAgainstItem(field, fieldKey, item) {
2723
2786
  if (!field.formula || !collection.value) return null;
2724
2787
  const result = require_deriveAll.deriveAll(collection.value.schema, item, refRecordCache.value)[fieldKey];
@@ -2750,6 +2813,7 @@ function useCollectionRendering(collection, locale) {
2750
2813
  hasTableRows,
2751
2814
  formatSubCell,
2752
2815
  inputTypeFor,
2816
+ stepFor,
2753
2817
  deriveAll: require_deriveAll.deriveAll,
2754
2818
  evaluateDerivedAgainstItem,
2755
2819
  derivedDisplay
@@ -3365,13 +3429,13 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
3365
3429
  * nothing. Instead, point the agent at the feed's schema + records
3366
3430
  * (`feeds/<slug>/schema.json` and `<dataPath>/`) and let it act on the
3367
3431
  * request directly. */
3368
- function buildChatSeed(slug, message) {
3432
+ function buildChatSeed(slug, message, itemId) {
3369
3433
  const schema = collection.value?.schema;
3370
- if (!schema?.ingest) return `/${slug} ${message}`;
3434
+ if (!schema?.ingest) return itemId ? `/${slug} id=${itemId} ${message}` : `/${slug} ${message}`;
3371
3435
  return t("collectionsView.feedChatSeed", {
3372
3436
  slug,
3373
3437
  dataPath: schema.dataPath ?? `data/feeds/${slug}`,
3374
- message
3438
+ message: itemId ? `(for record \`${itemId}\`) ${message}` : message
3375
3439
  });
3376
3440
  }
3377
3441
  /** Start a new general-role chat seeded from the current view. */
@@ -3387,6 +3451,21 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
3387
3451
  }
3388
3452
  appApi.startNewChat(text, cui.generalRoleId);
3389
3453
  }
3454
+ /** The open record's chat box: start a chat scoped to that one record. Seeds
3455
+ * the collection's skill command with an `id=<itemId>` selector
3456
+ * (`/<slug> id=<itemId> <message>`) so the agent acts on this record. */
3457
+ function onItemChat(message) {
3458
+ if (!collection.value || !viewing.value) return;
3459
+ const text = message.trim();
3460
+ if (!text) return;
3461
+ const itemId = String(viewing.value[collection.value.schema.primaryKey] ?? "");
3462
+ const seed = buildChatSeed(collection.value.slug, text, itemId || void 0);
3463
+ if (props.sendTextMessage) {
3464
+ props.sendTextMessage(seed);
3465
+ return;
3466
+ }
3467
+ appApi.startNewChat(seed, cui.generalRoleId);
3468
+ }
3390
3469
  async function loadCollection(slug) {
3391
3470
  const requestedKind = !embedded.value && cui.isFeedRoute() ? "feed" : "collection";
3392
3471
  loading.value = true;
@@ -4336,7 +4415,8 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
4336
4415
  onEdit: editFromView,
4337
4416
  onClose: onDayClose,
4338
4417
  onDelete: _cache[9] || (_cache[9] = ($event) => viewing.value && confirmDelete(viewing.value)),
4339
- onRunAction: runAction
4418
+ onRunAction: runAction,
4419
+ onItemChat
4340
4420
  }, null, 8, [
4341
4421
  "editing",
4342
4422
  "collection",
@@ -4534,7 +4614,8 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
4534
4614
  onEdit: editFromView,
4535
4615
  onClose: closeView,
4536
4616
  onDelete: _cache[20] || (_cache[20] = ($event) => viewing.value && confirmDelete(viewing.value)),
4537
- onRunAction: runAction
4617
+ onRunAction: runAction,
4618
+ onItemChat
4538
4619
  }, null, 8, [
4539
4620
  "editing",
4540
4621
  "collection",