@stonecrop/stonecrop 0.10.11 → 0.10.13

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 (58) hide show
  1. package/dist/composables/stonecrop.js +26 -110
  2. package/dist/field-triggers.js +5 -6
  3. package/dist/index.js +9 -6
  4. package/dist/plugins/index.js +4 -1
  5. package/dist/registry.js +62 -61
  6. package/dist/schema-validator.js +1 -13
  7. package/dist/src/composables/stonecrop.d.ts +2 -74
  8. package/dist/src/composables/stonecrop.d.ts.map +1 -1
  9. package/dist/src/doctype.d.ts +1 -27
  10. package/dist/src/doctype.d.ts.map +1 -1
  11. package/dist/src/field-triggers.d.ts.map +1 -1
  12. package/dist/src/index.d.ts +6 -9
  13. package/dist/src/index.d.ts.map +1 -1
  14. package/dist/src/plugins/index.d.ts.map +1 -1
  15. package/dist/src/registry.d.ts +13 -10
  16. package/dist/src/registry.d.ts.map +1 -1
  17. package/dist/src/schema-validator.d.ts +1 -62
  18. package/dist/src/schema-validator.d.ts.map +1 -1
  19. package/dist/src/stonecrop.d.ts +38 -17
  20. package/dist/src/stonecrop.d.ts.map +1 -1
  21. package/dist/src/stores/operation-log.d.ts +1 -1
  22. package/dist/src/types/composable.d.ts +230 -0
  23. package/dist/src/types/composable.d.ts.map +1 -0
  24. package/dist/src/types/doctype.d.ts +57 -0
  25. package/dist/src/types/doctype.d.ts.map +1 -0
  26. package/dist/src/types/index.d.ts +6 -67
  27. package/dist/src/types/index.d.ts.map +1 -1
  28. package/dist/src/types/plugin.d.ts +37 -0
  29. package/dist/src/types/plugin.d.ts.map +1 -0
  30. package/dist/src/types/schema-validator.d.ts +64 -0
  31. package/dist/src/types/schema-validator.d.ts.map +1 -0
  32. package/dist/src/types/stonecrop.d.ts +17 -0
  33. package/dist/src/types/stonecrop.d.ts.map +1 -0
  34. package/dist/stonecrop.css +1 -0
  35. package/dist/stonecrop.d.ts +206 -14
  36. package/dist/stonecrop.js +1751 -1631
  37. package/dist/stonecrop.js.map +1 -1
  38. package/dist/types/composable.js +0 -0
  39. package/dist/types/doctype.js +0 -0
  40. package/dist/types/index.js +7 -2
  41. package/dist/types/plugin.js +0 -0
  42. package/dist/types/schema-validator.js +13 -0
  43. package/dist/types/stonecrop.js +0 -0
  44. package/package.json +4 -4
  45. package/src/composables/stonecrop.ts +34 -218
  46. package/src/doctype.ts +2 -29
  47. package/src/field-triggers.ts +5 -6
  48. package/src/index.ts +12 -19
  49. package/src/plugins/index.ts +4 -1
  50. package/src/registry.ts +61 -66
  51. package/src/schema-validator.ts +3 -66
  52. package/src/stonecrop.ts +148 -17
  53. package/src/types/composable.ts +245 -0
  54. package/src/types/doctype.ts +60 -0
  55. package/src/types/index.ts +7 -74
  56. package/src/types/plugin.ts +38 -0
  57. package/src/types/schema-validator.ts +67 -0
  58. package/src/types/stonecrop.ts +17 -0
@@ -1,70 +1,9 @@
1
- import type { DataClient, WorkflowMeta } from '@stonecrop/schema';
2
- import type { SchemaTypes } from '@stonecrop/aform';
3
- import { List, Map } from 'immutable';
4
- import type { Component } from 'vue';
5
- import type { Router } from 'vue-router';
6
- import type { AnyStateNodeConfig, UnknownMachineConfig } from 'xstate';
7
- import type Doctype from '../doctype';
8
- import Registry from '../registry';
9
- import { Stonecrop } from '../stonecrop';
10
- import type { RouteContext } from './registry';
11
- /**
12
- * Immutable Doctype type for Stonecrop instances
13
- * @public
14
- */
15
- export type ImmutableDoctype = {
16
- readonly schema?: List<SchemaTypes>;
17
- readonly workflow?: UnknownMachineConfig | AnyStateNodeConfig | WorkflowMeta;
18
- readonly actions?: Map<string, string[]>;
19
- };
20
- /**
21
- * Mutable Doctype type for Stonecrop instances
22
- * @public
23
- */
24
- export type MutableDoctype = {
25
- doctype?: string;
26
- schema?: SchemaTypes[];
27
- workflow?: UnknownMachineConfig | AnyStateNodeConfig | WorkflowMeta;
28
- actions?: Record<string, string[]>;
29
- };
30
- /**
31
- * Schema type for Stonecrop instances
32
- * @public
33
- */
34
- export type Schema = {
35
- doctype: string;
36
- schema: List<SchemaTypes>;
37
- };
38
- /**
39
- * Install options for Stonecrop Vue plugin
40
- * @public
41
- */
42
- export type InstallOptions = {
43
- router?: Router;
44
- components?: Record<string, Component>;
45
- getMeta?: (routeContext: RouteContext) => Doctype | Promise<Doctype>;
46
- /**
47
- * Data client for fetching doctype metadata and records.
48
- * Use \@stonecrop/graphql-client's StonecropClient for GraphQL backends,
49
- * or implement DataClient for custom data sources.
50
- *
51
- * Can be set later via `useStonecropRegistry().setClient()` for deferred configuration.
52
- *
53
- * @example
54
- * ```ts
55
- * import { StonecropClient } from '@stonecrop/graphql-client'
56
- *
57
- * const client = new StonecropClient({ endpoint: '/graphql' })
58
- * app.use(StonecropPlugin, { client })
59
- * ```
60
- */
61
- client?: DataClient;
62
- /** Automatically run initialization callback after app mounting (default: false) */
63
- autoInitializeRouter?: boolean;
64
- /** Callback function called after plugin is ready and mounted */
65
- onRouterInitialized?: (registry: Registry, stonecrop: Stonecrop) => void | Promise<void>;
66
- };
1
+ export * from './composable';
2
+ export * from './doctype';
67
3
  export * from './field-triggers';
68
- export * from './registry';
69
4
  export * from './operation-log';
5
+ export * from './plugin';
6
+ export * from './registry';
7
+ export * from './schema-validator';
8
+ export * from './stonecrop';
70
9
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AACjE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AACnD,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,WAAW,CAAA;AACrC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,KAAK,CAAA;AACpC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AACxC,OAAO,KAAK,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,QAAQ,CAAA;AAEtE,OAAO,KAAK,OAAO,MAAM,YAAY,CAAA;AACrC,OAAO,QAAQ,MAAM,aAAa,CAAA;AAClC,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AACxC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAE9C;;;GAGG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAC9B,QAAQ,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,CAAA;IACnC,QAAQ,CAAC,QAAQ,CAAC,EAAE,oBAAoB,GAAG,kBAAkB,GAAG,YAAY,CAAA;IAC5E,QAAQ,CAAC,OAAO,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAA;CACxC,CAAA;AAED;;;GAGG;AACH,MAAM,MAAM,cAAc,GAAG;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,MAAM,CAAC,EAAE,WAAW,EAAE,CAAA;IACtB,QAAQ,CAAC,EAAE,oBAAoB,GAAG,kBAAkB,GAAG,YAAY,CAAA;IACnE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAA;CAClC,CAAA;AAED;;;GAGG;AACH,MAAM,MAAM,MAAM,GAAG;IACpB,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC,CAAA;CACzB,CAAA;AAED;;;GAGG;AACH,MAAM,MAAM,cAAc,GAAG;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;IACtC,OAAO,CAAC,EAAE,CAAC,YAAY,EAAE,YAAY,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IACpE;;;;;;;;;;;;;;OAcG;IACH,MAAM,CAAC,EAAE,UAAU,CAAA;IACnB,oFAAoF;IACpF,oBAAoB,CAAC,EAAE,OAAO,CAAA;IAC9B,iEAAiE;IACjE,mBAAmB,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CACxF,CAAA;AAGD,cAAc,kBAAkB,CAAA;AAChC,cAAc,YAAY,CAAA;AAC1B,cAAc,iBAAiB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":"AACA,cAAc,cAAc,CAAA;AAC5B,cAAc,WAAW,CAAA;AACzB,cAAc,kBAAkB,CAAA;AAChC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,UAAU,CAAA;AACxB,cAAc,YAAY,CAAA;AAC1B,cAAc,oBAAoB,CAAA;AAClC,cAAc,aAAa,CAAA"}
@@ -0,0 +1,37 @@
1
+ import type { DataClient } from '@stonecrop/schema';
2
+ import type { Component } from 'vue';
3
+ import type { Router } from 'vue-router';
4
+ import type Doctype from '../doctype';
5
+ import type Registry from '../registry';
6
+ import type { Stonecrop } from '../stonecrop';
7
+ import type { RouteContext } from './registry';
8
+ /**
9
+ * Install options for Stonecrop Vue plugin
10
+ * @public
11
+ */
12
+ export type InstallOptions = {
13
+ router?: Router;
14
+ components?: Record<string, Component>;
15
+ getMeta?: (routeContext: RouteContext) => Doctype | Promise<Doctype>;
16
+ /**
17
+ * Data client for fetching doctype metadata and records.
18
+ * Use \@stonecrop/graphql-client's StonecropClient for GraphQL backends,
19
+ * or implement DataClient for custom data sources.
20
+ *
21
+ * Can be set later via `useStonecropRegistry().setClient()` for deferred configuration.
22
+ *
23
+ * @example
24
+ * ```ts
25
+ * import { StonecropClient } from '@stonecrop/graphql-client'
26
+ *
27
+ * const client = new StonecropClient({ endpoint: '/graphql' })
28
+ * app.use(StonecropPlugin, { client })
29
+ * ```
30
+ */
31
+ client?: DataClient;
32
+ /** Automatically run initialization callback after app mounting (default: false) */
33
+ autoInitializeRouter?: boolean;
34
+ /** Callback function called after plugin is ready and mounted */
35
+ onRouterInitialized?: (registry: Registry, stonecrop: Stonecrop) => void | Promise<void>;
36
+ };
37
+ //# sourceMappingURL=plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../../src/types/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AACnD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,KAAK,CAAA;AACpC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AAExC,OAAO,KAAK,OAAO,MAAM,YAAY,CAAA;AACrC,OAAO,KAAK,QAAQ,MAAM,aAAa,CAAA;AACvC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAC7C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAE9C;;;GAGG;AACH,MAAM,MAAM,cAAc,GAAG;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;IACtC,OAAO,CAAC,EAAE,CAAC,YAAY,EAAE,YAAY,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IACpE;;;;;;;;;;;;;;OAcG;IACH,MAAM,CAAC,EAAE,UAAU,CAAA;IACnB,oFAAoF;IACpF,oBAAoB,CAAC,EAAE,OAAO,CAAA;IAC9B,iEAAiE;IACjE,mBAAmB,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CACxF,CAAA"}
@@ -0,0 +1,64 @@
1
+ import type Registry from '../registry';
2
+ /**
3
+ * Validation severity levels
4
+ * @public
5
+ */
6
+ export declare enum ValidationSeverity {
7
+ /** Blocking error that prevents save */
8
+ ERROR = "error",
9
+ /** Advisory warning that allows save */
10
+ WARNING = "warning",
11
+ /** Informational message */
12
+ INFO = "info"
13
+ }
14
+ /**
15
+ * Validation issue
16
+ * @public
17
+ */
18
+ export interface ValidationIssue {
19
+ /** Severity level */
20
+ severity: ValidationSeverity;
21
+ /** Validation rule that failed */
22
+ rule: string;
23
+ /** Human-readable message */
24
+ message: string;
25
+ /** Doctype name */
26
+ doctype?: string;
27
+ /** Field name if applicable */
28
+ fieldname?: string;
29
+ /** Additional context */
30
+ context?: Record<string, unknown>;
31
+ }
32
+ /**
33
+ * Validation result
34
+ * @public
35
+ */
36
+ export interface ValidationResult {
37
+ /** Whether validation passed (no blocking errors) */
38
+ valid: boolean;
39
+ /** List of validation issues */
40
+ issues: ValidationIssue[];
41
+ /** Count of errors */
42
+ errorCount: number;
43
+ /** Count of warnings */
44
+ warningCount: number;
45
+ /** Count of info messages */
46
+ infoCount: number;
47
+ }
48
+ /**
49
+ * Schema validator options
50
+ * @public
51
+ */
52
+ export interface ValidatorOptions {
53
+ /** Registry instance for doctype lookups */
54
+ registry?: Registry;
55
+ /** Whether to validate Link field targets */
56
+ validateLinkTargets?: boolean;
57
+ /** Whether to validate workflow reachability */
58
+ validateWorkflows?: boolean;
59
+ /** Whether to validate action registration */
60
+ validateActions?: boolean;
61
+ /** Whether to validate required schema properties */
62
+ validateRequiredProperties?: boolean;
63
+ }
64
+ //# sourceMappingURL=schema-validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-validator.d.ts","sourceRoot":"","sources":["../../../src/types/schema-validator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,aAAa,CAAA;AAEvC;;;GAGG;AACH,oBAAY,kBAAkB;IAC7B,wCAAwC;IACxC,KAAK,UAAU;IACf,wCAAwC;IACxC,OAAO,YAAY;IACnB,4BAA4B;IAC5B,IAAI,SAAS;CACb;AAED;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC/B,qBAAqB;IACrB,QAAQ,EAAE,kBAAkB,CAAA;IAC5B,kCAAkC;IAClC,IAAI,EAAE,MAAM,CAAA;IACZ,6BAA6B;IAC7B,OAAO,EAAE,MAAM,CAAA;IACf,mBAAmB;IACnB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,+BAA+B;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,yBAAyB;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACjC;AAED;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAChC,qDAAqD;IACrD,KAAK,EAAE,OAAO,CAAA;IACd,gCAAgC;IAChC,MAAM,EAAE,eAAe,EAAE,CAAA;IACzB,sBAAsB;IACtB,UAAU,EAAE,MAAM,CAAA;IAClB,wBAAwB;IACxB,YAAY,EAAE,MAAM,CAAA;IACpB,6BAA6B;IAC7B,SAAS,EAAE,MAAM,CAAA;CACjB;AAED;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAChC,4CAA4C;IAC5C,QAAQ,CAAC,EAAE,QAAQ,CAAA;IACnB,6CAA6C;IAC7C,mBAAmB,CAAC,EAAE,OAAO,CAAA;IAC7B,gDAAgD;IAChD,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B,8CAA8C;IAC9C,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,qDAAqD;IACrD,0BAA0B,CAAC,EAAE,OAAO,CAAA;CACpC"}
@@ -0,0 +1,17 @@
1
+ import type { DataClient } from '@stonecrop/schema';
2
+ /**
3
+ * Options for constructing a Stonecrop instance directly.
4
+ * When using the Vue plugin, pass these via `InstallOptions` instead.
5
+ * @public
6
+ */
7
+ export interface StonecropOptions {
8
+ /**
9
+ * Data client for fetching doctype metadata and records.
10
+ * Use \@stonecrop/graphql-client's StonecropClient for GraphQL backends,
11
+ * or implement DataClient for custom data sources.
12
+ *
13
+ * Can be set later via `setClient()` for deferred configuration.
14
+ */
15
+ client?: DataClient;
16
+ }
17
+ //# sourceMappingURL=stonecrop.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stonecrop.d.ts","sourceRoot":"","sources":["../../../src/types/stonecrop.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAEnD;;;;GAIG;AACH,MAAM,WAAW,gBAAgB;IAChC;;;;;;OAMG;IACH,MAAM,CAAC,EAAE,UAAU,CAAA;CACnB"}
@@ -0,0 +1 @@
1
+ @import"https://fonts.googleapis.com/css2?family=Arimo:ital,wght@0,400..700;1,400..700&display=swap";.atable-cell{border-radius:0;box-sizing:border-box;outline:none;box-shadow:none;color:var(--sc-cell-text-color);padding-left:.5ch!important;padding-right:.5ch;padding-top:var(--sc-atable-row-padding);padding-bottom:var(--sc-atable-row-padding);border-spacing:0px;border-collapse:collapse;overflow:hidden;text-overflow:ellipsis;order:1;white-space:nowrap;max-width:40ch;border-top:1px solid var(--sc-row-border-color);margin:0 0 0 1px}.atable-cell a{color:var(--sc-cell-text-color);text-decoration:none}.atable-cell:focus,.atable-cell:focus-within{background-color:var(--sc-focus-cell-background);outline-width:var(--sc-atable-cell-border-width);outline-style:solid;outline-offset:calc(var(--sc-atable-cell-border-width) * -1);outline-color:var(--sc-focus-cell-outline);box-shadow:none;overflow:hidden;text-wrap:nowrap;box-sizing:border-box}.cell-modified{font-weight:700;font-style:italic}.cell-modified-highlight{background-color:var(--sc-cell-changed-color)}.row-index{color:var(--sc-header-text-color);font-weight:700;text-align:center;-webkit-user-select:none;user-select:none;width:2ch;display:flex;align-items:center;justify-content:center}.expandable-row{border-top:1px solid var(--sc-row-border-color);height:var(--sc-atable-row-height)}.expandable-row>td:first-child{border-left:4px solid var(--sc-row-border-color)}.expanded-row{border-left:2px solid var(--sc-row-border-color)}.expandable-row:last-child{border-bottom:1px solid var(--sc-row-border-color)}.expanded-row-content{border-top:1px solid var(--sc-row-border-color);padding:1.5rem}.expandable-row.changed-row-gradient[data-v-a42297c7]:has(td.cell-modified){--cell-color-start: color-mix(in srgb, var(--sc-cell-changed-color), #fff 20%);--cell-color-end: color-mix(in srgb, var(--sc-cell-changed-color), #fff 60%);background:linear-gradient(90deg,var(--cell-color-start),var(--cell-color-end))}.aganttcell[data-v-8917a8a3]{background-color:#f9f9f9;width:100%;padding:0;height:100%}.gantt-container[data-v-8917a8a3]{position:relative;height:100%;background-color:#f0f0f0;border-radius:4px;overflow:visible}.gantt-bar[data-v-8917a8a3]{position:absolute;border-radius:4px;display:flex;align-items:center;justify-content:space-between;cursor:grab;box-sizing:border-box;border:1px solid rgba(0,0,0,.5);transition:left .1s ease-out,width .1s ease-out;height:80%;top:50%;z-index:2;transform:translateY(-50%)}.gantt-bar[data-v-8917a8a3]:active{cursor:grabbing}.gantt-bar.is-dragging[data-v-8917a8a3]{z-index:10}.gantt-label[data-v-8917a8a3]{flex:1;text-align:center;font-size:12px;color:#aaa;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;padding:0 8px;-webkit-user-select:none;user-select:none}.resize-handle[data-v-8917a8a3]{position:relative;width:12px;height:100%;cursor:ew-resize;display:flex;align-items:center;justify-content:center;z-index:0;background:#00000040}.left-resize-handle[data-v-8917a8a3]{border-right:1px solid rgba(0,0,0,.5)}.right-resize-handle[data-v-8917a8a3]{border-left:1px solid rgba(0,0,0,.5)}.handle-grip[data-v-8917a8a3]{width:4px;height:12px;border-radius:2px;background:#000c}.resize-handle[data-v-8917a8a3]:hover{background-color:#ffffff80}.vertical-indicator[data-v-8917a8a3]{position:absolute;width:2px;opacity:0;pointer-events:none;transition:opacity .2s ease;top:-100vh;height:100vh;z-index:5;background-color:var(--v6d722296)}.left-indicator[data-v-8917a8a3]{left:50%;transform:translate(-50%)}.right-indicator[data-v-8917a8a3]{right:50%;transform:translate(50%)}.resize-handle.is-dragging .vertical-indicator[data-v-8917a8a3]{opacity:.7}.gantt-container[data-v-8917a8a3]:after{content:"";position:absolute;inset:0;background-size:calc(100% / var(--v260b36f8)) 100%;background-image:linear-gradient(to right,rgba(0,0,0,.1) 1px,transparent 1px);pointer-events:none;z-index:1}.connection-handle[data-v-8917a8a3]{position:absolute;top:50%;transform:translateY(-50%);width:16px;height:16px;opacity:0;transition:opacity .2s ease;cursor:crosshair;z-index:15;display:flex;align-items:center;justify-content:center}.connection-handle.visible[data-v-8917a8a3]{opacity:1}.left-connection-handle[data-v-8917a8a3]{left:-16px}.right-connection-handle[data-v-8917a8a3]{right:-16px}.connection-dot[data-v-8917a8a3]{width:8px;height:8px;border-radius:50%;background-color:#2196f3;border:2px solid white;box-shadow:0 1px 3px #0000004d}.connection-handle:hover .connection-dot[data-v-8917a8a3]{background-color:#1976d2;transform:scale(1.2)}.connection-handle.is-dragging[data-v-8917a8a3]{opacity:1!important}.connection-handle.is-dragging .connection-dot[data-v-8917a8a3]{background-color:#1976d2;transform:scale(1.3);box-shadow:0 2px 8px #2196f366}.atable-row-actions{width:2rem;min-width:2rem;padding:0 .25rem;vertical-align:middle;white-space:nowrap;border-top:1px solid var(--sc-row-border-color);background:#fff;-webkit-user-select:none;user-select:none;position:relative}.atable-row-actions.dropdown-active{z-index:500}.row-actions-icons{display:flex;gap:.25rem;align-items:center;justify-content:center}.row-action-btn{display:inline-flex;align-items:center;justify-content:center;width:1.5rem;height:1.5rem;padding:.125rem;border:none;background:transparent;cursor:pointer;border-radius:.25rem;transition:background-color .15s ease}.row-action-btn:hover{background-color:var(--sc-gray-10, #e5e5e5)}.row-action-btn:focus{outline:2px solid var(--sc-focus-cell-outline, #3b82f6);outline-offset:1px}.row-action-btn .action-icon{display:flex;align-items:center;justify-content:center;width:1rem;height:1rem}.row-action-btn .action-icon :deep(svg){width:100%;height:100%}.row-actions-dropdown{position:relative;display:inline-block}.row-actions-dropdown:has(button:focus){outline:2px solid var(--sc-focus-cell-outline);outline-offset:-2px}.row-actions-toggle{display:inline-flex;align-items:center;justify-content:center;width:1.5rem;height:1.5rem;padding:0;border:none;background:transparent;cursor:pointer;border-radius:.25rem;font-size:1rem;font-weight:700;transition:background-color .15s ease}.row-actions-toggle:hover{background-color:var(--sc-gray-10, #e5e5e5)}.dropdown-icon{line-height:1}.row-actions-menu{position:fixed;z-index:9999;min-width:10rem;padding:.25rem 0;background:#fff;border:1px solid var(--sc-row-border-color);border-left:4px solid var(--sc-row-border-color);border-radius:0}.row-actions-menu.menu-flipped{box-shadow:0 -4px 6px -1px #0000001a,0 -2px 4px -2px #0000001a}.row-action-menu-item{display:flex;align-items:center;gap:.5rem;width:100%;padding:.5rem .75rem;border:none;background:transparent;cursor:pointer;text-align:left;font-size:.875rem;transition:background-color .15s ease}.row-action-menu-item:hover{background-color:var(--sc-gray-10, #f5f5f5)}.row-action-menu-item:focus{outline:none;background-color:var(--sc-gray-10, #f5f5f5)}.row-action-menu-item .action-icon{display:flex;align-items:center;justify-content:center;width:1rem;height:1rem;flex-shrink:0}.row-action-menu-item .action-icon :deep(svg){width:100%;height:100%}.row-action-menu-item .action-label{flex:1}.atable-row{background-color:#fff}.atable-row:last-child>td{border-bottom:1px solid var(--sc-row-border-color)}.atable-row>td:first-child{border-left:4px solid var(--sc-row-border-color)}.atable-row>td:last-child{border-right:1px solid var(--sc-row-border-color)}.list-index{color:var(--sc-header-text-color);font-weight:700;padding-left:var(--sc-atable-row-padding);padding-right:.5em;text-align:left;-webkit-user-select:none;user-select:none;border-top:1px solid var(--sc-row-border-color);text-overflow:ellipsis;overflow:hidden;box-sizing:border-box;padding-top:var(--sc-atable-row-padding);padding-bottom:var(--sc-atable-row-padding)}.tree-index{color:var(--sc-header-text-color);font-weight:700;text-align:center;-webkit-user-select:none;user-select:none;width:2ch;box-sizing:border-box;padding-top:var(--sc-atable-row-padding);padding-bottom:var(--sc-atable-row-padding)}.atable-row:has(td.cell-modified)>td.sticky-column,.atable-row:has(td.cell-modified)>th.sticky-column,.atable-row:has(td.cell-modified)>td.sticky-index,.atable-row:has(td.cell-modified)>th.sticky-index{background:var(--sc-cell-changed-color)}.atable-row.changed-row-gradient[data-v-2e038a9c]:has(td.cell-modified){--cell-color-start: color-mix(in srgb, var(--sc-cell-changed-color), #fff 20%);--cell-color-end: color-mix(in srgb, var(--sc-cell-changed-color), #fff 60%);background:linear-gradient(90deg,var(--cell-color-start),var(--cell-color-end))}.gantt-connection-overlay[data-v-71911260]{position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none;z-index:1}.connection-path[data-v-71911260]{transition:stroke-width .2s ease;pointer-events:auto;cursor:pointer;stroke-dasharray:5px;stroke:var(--sc-cell-text-color)}#arrowhead-marker polygon[data-v-71911260]{fill:var(--sc-cell-text-color)}.animated-path[data-v-71911260]{animation:animated-dash-71911260 infinite 1.5s linear}.connection-path[data-v-71911260]:hover{stroke-width:3px}.connection-hitbox[data-v-71911260]{pointer-events:auto;cursor:pointer}@keyframes animated-dash-71911260{0%{stroke-dashoffset:0px}to{stroke-dashoffset:-10px}}.column-filter[data-v-8487462d]{display:flex;align-items:center;gap:.25rem;width:100%}.filter-input[data-v-8487462d],.filter-select[data-v-8487462d]{background-color:var(--sc-form-background)!important;padding:.15rem .2rem;border:1px solid var(--sc-form-border);border-radius:3px;font-size:.875rem;color:var(--sc-text-color);width:100%;box-sizing:border-box}.filter-input[data-v-8487462d]:focus,.filter-select[data-v-8487462d]:focus{outline:none;border-color:var(--sc-input-active-border-color)}.checkbox-filter[data-v-8487462d]{display:flex;align-items:center;gap:.25rem;font-size:.875rem;color:var(--sc-text-color);cursor:pointer}.filter-checkbox[data-v-8487462d]{margin:0}.date-range-filter[data-v-8487462d]{display:flex;gap:.25rem;align-items:center;width:100%}.date-range-filter .filter-input[data-v-8487462d]{flex:1;min-width:0}.date-separator[data-v-8487462d]{color:var(--sc-gray-50);font-weight:500;padding:0 .25rem;flex-shrink:0}.clear-btn[data-v-8487462d]{background:var(--sc-gray-10, #f0f0f0);border:1px solid var(--sc-form-border);border-radius:3px;color:var(--sc-gray-70);cursor:pointer;font-size:1rem;padding:.15rem .4rem;line-height:1;flex-shrink:0}.atable-header-row th{padding-left:.5ch!important;font-weight:700;min-width:3ch;padding-top:var(--sc-atable-row-padding);padding-bottom:var(--sc-atable-row-padding);box-sizing:border-box;color:var(--sc-header-text-color);position:relative}#header-index{padding-left:var(--sc-atable-row-padding);box-sizing:border-box;border-top:none}.tree-index{padding-right:0}th{order:1}.list-expansion-index{width:2ch;margin-left:5px}.cursor-pointer{cursor:pointer}.atable-filters-row th{padding:.25rem .5ch;vertical-align:top}.row-actions-header{width:2rem;min-width:2rem;padding:0 .25rem}:root{--sc-primary-color: #0098c9;--sc-primary-text-color: #ffffff;--sc-brand-color: #202a44;--sc-gray-5: #f2f2f2;--sc-gray-10: #e6e6e6;--sc-gray-20: #cccccc;--sc-gray-50: #808080;--sc-gray-60: #666666;--sc-gray-80: #333333;--sc-brand-danger: #e63c28;--sc-brand-success: #155724;--sc-brand-warning: #b99d3e;--sc-active-cell-background: #ffffff;--sc-active-cell-outline: #e6a92d;--sc-cell-border-color: #ffffff;--sc-cell-text-color: #3a3c41;--sc-focus-cell-background: #ffffff;--sc-focus-cell-outline: #000000;--sc-header-border-color: #ffffff;--sc-header-text-color: var(--sc-gray-20);--sc-row-border-color: var(--sc-gray-20);--sc-row-color-zebra-dark: #dddddd;--sc-row-color-zebra-light: #eeeeee;--sc-row-number-background-color: #ffffff;--sc-input-active-border-color: #000000;--sc-input-active-label-color: #000000;--sc-input-border-color: var(--sc-gray-20);--sc-input-label-color: var(--sc-gray-60);--sc-required-border: #e63c28;--sc-cell-changed-color: #d8edff;--sc-form-border: var(--sc-gray-5);--sc-form-background: #ffffff;--sc-input-field-background: #ffffff;--sc-input-field-disabled-background: var(--sc-gray-5);--sc-font-size: 10px;--sc-font-family: Arimo, Arial, sans-serif;--sc-table-font-size: 16px;--sc-atable-font-family: "Arimo", sans-serif;--sc-atable-row-padding: .125rem;--sc-atable-row-height: 1.5em;--sc-atable-cell-border-width: 2px;--sc-table-loading-color: 204, 204, 204;--sc-btn-border: #cccccc;--sc-btn-color: white;--sc-btn-hover: #f2f2f2;--sc-btn-label-color: black}.amodal{position:absolute;background-color:var(--sc-row-color-zebra-dark);z-index:5}.atable-container{position:relative}.sticky-index{position:sticky;left:0;z-index:10;order:0}.sticky-column,th.sticky-column,td.sticky-column,th.sticky-index,td.sticky-index{position:sticky;z-index:10;order:0;background:#fff}.sticky-column-edge,.atable th.sticky-column-edge{border-right:1px solid var(--sc-row-border-color)}[data-v-3d00d51b]:root{--sc-primary-color: #0098c9;--sc-primary-text-color: #ffffff;--sc-brand-color: #202a44;--sc-gray-5: #f2f2f2;--sc-gray-10: #e6e6e6;--sc-gray-20: #cccccc;--sc-gray-50: #808080;--sc-gray-60: #666666;--sc-gray-80: #333333;--sc-brand-danger: #e63c28;--sc-brand-success: #155724;--sc-brand-warning: #b99d3e;--sc-active-cell-background: #ffffff;--sc-active-cell-outline: #e6a92d;--sc-cell-border-color: #ffffff;--sc-cell-text-color: #3a3c41;--sc-focus-cell-background: #ffffff;--sc-focus-cell-outline: #000000;--sc-header-border-color: #ffffff;--sc-header-text-color: var(--sc-gray-20);--sc-row-border-color: var(--sc-gray-20);--sc-row-color-zebra-dark: #dddddd;--sc-row-color-zebra-light: #eeeeee;--sc-row-number-background-color: #ffffff;--sc-input-active-border-color: #000000;--sc-input-active-label-color: #000000;--sc-input-border-color: var(--sc-gray-20);--sc-input-label-color: var(--sc-gray-60);--sc-required-border: #e63c28;--sc-cell-changed-color: #d8edff;--sc-form-border: var(--sc-gray-5);--sc-form-background: #ffffff;--sc-input-field-background: #ffffff;--sc-input-field-disabled-background: var(--sc-gray-5);--sc-font-size: 10px;--sc-font-family: Arimo, Arial, sans-serif;--sc-table-font-size: 16px;--sc-atable-font-family: "Arimo", sans-serif;--sc-atable-row-padding: .125rem;--sc-atable-row-height: 1.5em;--sc-atable-cell-border-width: 2px;--sc-table-loading-color: 204, 204, 204;--sc-btn-border: #cccccc;--sc-btn-color: white;--sc-btn-hover: #f2f2f2;--sc-btn-label-color: black}.atable[data-v-3d00d51b]{position:relative;font-family:var(--sc-atable-font-family);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-size:var(--sc-table-font-size);border-collapse:collapse;box-sizing:border-box;table-layout:auto;width:auto;overflow:clip;height:1px}.atable th[data-v-3d00d51b]{border-width:0px;border-style:solid;border-radius:0;padding-left:.5ch;padding-right:.5ch;padding-top:var(--sc-atable-row-padding);padding-bottom:var(--sc-atable-row-padding);color:var(--sc-gray-60);height:var(--sc-atable-row-height);font-weight:300;letter-spacing:.05rem;order:1;box-sizing:border-box}.atable th[data-v-3d00d51b]:focus{outline:none}.atable[data-v-3d00d51b]:tbody{overflow:hidden;position:relative}.atable[data-v-3d00d51b]:tbody:before{content:"";position:absolute;top:0;left:0;right:0;height:1px;background-color:transparent;z-index:100}.aloading[data-v-a930a25b]{width:100%;border-top:1px solid var(--sc-row-border-color);border-bottom:1px solid var(--sc-row-border-color);display:flex;background-color:#fff;border-left:4px solid var(--sc-row-border-color);padding-left:.5ch!important;padding-right:.5ch;padding-top:var(--sc-atable-row-padding);padding-bottom:var(--sc-atable-row-padding);align-items:center;box-sizing:border-box;background:var(--sc-focus-cell-background);overflow:hidden;position:relative}.aloading-bar[data-v-a930a25b]{width:100%;height:100%;position:absolute;left:-100%;top:0;background:linear-gradient(90deg,rgba(var(--sc-table-loading-color),0),rgba(var(--sc-table-loading-color),1),rgba(var(--sc-table-loading-color),0));animation:gradient-a930a25b infinite 2s;z-index:0}.aloading-header[data-v-a930a25b]{color:var(--sc-cell-text-color);font-family:var(--sc-atable-font-family);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-size:var(--sc-table-font-size);padding:0;margin:0;font-weight:400;z-index:1}.aloading-header[data-v-a930a25b]:after{content:"...";animation:ellipse-a930a25b 2s;animation-iteration-count:infinite}@keyframes gradient-a930a25b{0%{left:-100%}to{left:100%}}@keyframes ellipse-a930a25b{0%{content:""}20%{content:""}40%{content:"."}60%{content:".."}80%{content:"..."}}.aloading[data-v-e1165876]{width:100%;border-top:1px solid var(--sc-row-border-color);border-bottom:1px solid var(--sc-row-border-color);display:flex;background-color:#fff;border-left:4px solid var(--sc-row-border-color);padding-left:.5ch!important;padding-right:.5ch;padding-top:var(--sc-atable-row-padding);padding-bottom:var(--sc-atable-row-padding);align-items:center;box-sizing:border-box;background:var(--sc-focus-cell-background);overflow:hidden;position:relative}.aloading-bar[data-v-e1165876]{width:50%;height:3px;position:absolute;left:-100%;bottom:0;background:var(--sc-row-border-color);animation:bar-left-e1165876 infinite 2s;z-index:0}.aloading-header[data-v-e1165876]{color:var(--sc-cell-text-color);font-family:var(--sc-atable-font-family);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-size:var(--sc-table-font-size);padding:0;margin:0;font-weight:400;z-index:1}.aloading-header[data-v-e1165876]:after{content:"...";animation:ellipse-e1165876 2s;animation-iteration-count:infinite}@keyframes bar-left-e1165876{0%{left:-50%}to{left:100%}}@keyframes ellipse-e1165876{0%{content:""}20%{content:""}40%{content:"."}60%{content:".."}80%{content:"..."}}.aform_checkbox[data-v-cc185b72]{cursor:pointer;width:auto;margin-top:0;display:block}.aform_checkbox[data-v-cc185b72]:checked{accent-color:var(--sc-primary-color);border:1px solid black}.aform_checkbox-container[data-v-cc185b72]{width:100%;display:inline-block;text-align:left}.aform_checkbox-container input[data-v-cc185b72]{width:auto}.aform_checkbox-container:hover+.aform_field-label[data-v-cc185b72]{color:var(--sc-input-active-label-color)}div[data-v-425aef3c]{min-width:40ch;width:100%;box-sizing:border-box;border:1px solid transparent;padding:0rem;margin:0rem;margin-right:1ch}input[data-v-425aef3c]{width:calc(100% - 1ch);box-sizing:border-box;outline:1px solid transparent;border:1px solid var(--sc-input-border-color);padding:1ch .5ch .5ch 1ch;margin:.575rem 0 0;min-height:1.15rem;border-radius:.25rem}p[data-v-425aef3c],label[data-v-425aef3c]{color:var(--sc-input-label-color);display:block;min-height:1.15rem;padding:0rem;margin:0rem 0rem .25rem;border:1px solid transparent;box-sizing:border-box}p[data-v-425aef3c]{width:100%;color:red;font-size:85%;box-sizing:border-box}label[data-v-425aef3c]{z-index:2;font-size:80%;position:absolute;background:#fff;margin:-2.575rem 0 0 1ch;padding:0 .25ch;box-sizing:border-box}input[data-v-425aef3c]:focus{border:1px solid var(--sc-input-active-border-color)}input:focus+label[data-v-425aef3c]{color:var(--sc-input-active-label-color)}.autocomplete[data-v-e25d4181]{position:relative}.input-wrapper[data-v-e25d4181]{border:1px solid transparent;padding:0rem;margin:0rem;margin-right:1ch}input[data-v-e25d4181]{width:calc(100% - 1ch);outline:1px solid transparent;border:1px solid var(--sc-input-border-color);padding:1ch .5ch .5ch 1ch;margin:.575rem 0 0;min-height:1.15rem;border-radius:.25rem}input[data-v-e25d4181]:focus{border:1px solid var(--sc-input-active-border-color);border-radius:.25rem .25rem 0 0;border-bottom:none}label[data-v-e25d4181]{display:block;min-height:1.15rem;padding:0rem;margin:0rem 0rem .25rem;border:1px solid transparent;z-index:2;font-size:80%;position:absolute;background:#fff;margin:-2.575rem 0 0 1ch;padding:0 .25ch}.autocomplete-results[data-v-e25d4181]{position:absolute;width:calc(100% - 1ch + 1.5px);z-index:999;padding:0;margin:0;color:var(--sc-input-active-border-color);border:1px solid var(--sc-input-active-border-color);border-radius:0 0 .25rem .25rem;border-top:none;background-color:#fff}.autocomplete-result[data-v-e25d4181]{list-style:none;text-align:left;padding:4px 6px;cursor:pointer;border-bottom:.5px solid lightgray}.autocomplete-result.is-active[data-v-e25d4181],.autocomplete-result[data-v-e25d4181]:hover{background-color:var(--sc-row-color-zebra-light);color:var(--sc-input-active-border-color)}.adatepicker[data-v-9da05d06]{font-size:var(--sc-table-font-size);display:inline-table;color:var(--sc-cell-text-color);outline:none;border-collapse:collapse}.adatepicker tr[data-v-9da05d06]{height:1.15rem;text-align:center;vertical-align:middle}.adatepicker td[data-v-9da05d06]{border:2px solid transparent;outline:2px solid transparent;min-width:3ch;max-width:3ch}.adatepicker td[data-v-9da05d06]:focus,.adatepicker td[data-v-9da05d06]:focus-within{outline:1px dashed black;box-shadow:none;min-height:1.15em;max-height:1.15em;overflow:hidden}.adatepicker .selectedDate[data-v-9da05d06]{outline:1px solid black;background:var(--sc-gray-20);font-weight:bolder}.adatepicker .todaysDate[data-v-9da05d06]{font-weight:bolder;text-decoration:underline;color:#000}.days-header>td[data-v-9da05d06]{font-weight:700}.prev-date[data-v-9da05d06]{color:var(--sc-gray-20)}.collapse-button[data-v-6f1c1b45]{width:2ch;min-width:calc(66px - 4ch);background-color:transparent;font-size:150%;text-align:center;border:none;margin-top:-.5rem}.rotated[data-v-6f1c1b45]{transform:rotate(45deg);-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-ms-transform:rotate(45deg);-o-transform:rotate(45deg);transition:transform .25s;transform-origin:center center}.unrotated[data-v-6f1c1b45]{transform:rotate(0);-webkit-transform:rotate(0deg);-moz-transform:rotate(0deg);-ms-transform:rotate(0deg);-o-transform:rotate(0deg);transition:transform .25s}.aform_form-element{padding:0;margin:0;position:relative;box-sizing:border-box;flex-grow:1;min-width:20ch;margin-bottom:1rem}.aform_input-field{outline:1px solid var(--sc-input-border-color);outline-offset:-1px;font-size:1rem;padding:.5rem;margin:0;border-radius:0;box-sizing:border-box;width:100%;min-height:auto;position:relative;color:var(--sc-cell-text-color);background:var(--sc-input-field-background)}.aform_input-field:focus{outline:1px solid var(--sc-input-active-border-color)}.aform_display-value{display:block;padding:.5rem;min-height:2rem;color:var(--sc-cell-text-color);word-break:break-word}.aform_input-field:focus+.aform_field-label{color:var(--sc-input-active-label-color)}.aform_field-label{color:var(--sc-input-label-color);display:inline-block;position:absolute;padding:0 .25rem;margin:0rem;z-index:2;font-size:.7rem;font-weight:300;letter-spacing:.05rem;background:linear-gradient(var(--sc-form-background) 50%,var(--sc-input-field-background) 50%);width:auto;box-sizing:border-box;background:#fff;margin:0;grid-row:1;top:0;left:10px;border:none;line-height:0;transform:translateY(-50%)}.aform_input-field:disabled{background:var(--sc-input-field-disabled-background)}.aform_input-field:disabled+.aform_field-label{background:linear-gradient(var(--sc-form-background) 50%,var(--sc-input-field-disabled-background) 50%)}.aform_input-field:disabled~p.aform_error{background:linear-gradient(var(--sc-form-background) 50%,var(--sc-input-field-disabled-background) 50%)}.aform_field-label:after{margin:0;padding:0;box-sizing:border-box;content:"";line-height:normal}p.aform_error{display:block;display:inline-block;display:none;background:linear-gradient(var(--sc-form-background) 50%,var(--sc-input-field-background) 50%);padding:0 .25rem;margin:0rem;width:auto;color:var(--sc-brand-danger);font-size:.7rem;position:absolute;right:0;top:0;line-height:0;background:#fff;padding:.25rem;transform:translate(-1rem,-50%);margin:0}.aform[data-v-5c01cea5]{display:flex;flex-wrap:wrap;gap:1rem;padding:1rem;border:1px solid var(--sc-form-border);border-left:4px solid var(--sc-form-border);margin-bottom:1rem;max-width:100%}@media screen and (max-width:400px){.aform[data-v-5c01cea5]{flex-direction:column}}.aform-nested-section[data-v-5c01cea5]{width:100%;padding:.5rem 0}.aform-nested-label[data-v-5c01cea5]{font-size:.9rem;font-weight:600;margin:0 0 .5rem;color:var(--sc-input-label-color, #666)}.aform-nested-section .aform[data-v-5c01cea5]{border-left-width:2px;margin-left:.5rem}fieldset[data-v-a3606386]{max-width:100%;width:100%;margin-right:2ch;border:1px solid transparent;border-bottom:1px solid var(--sc-gray-50)}legend[data-v-a3606386]{width:100%;height:1.15rem;border:1px solid transparent;padding-bottom:.5rem;font-size:110%;font-weight:600;-webkit-user-select:none;user-select:none}.collapse-button[data-v-a3606386]{float:right}.aform_file-attach[data-v-6543d39a]{padding:1rem;display:flex;flex-wrap:wrap;gap:1rem;flex-direction:row;justify-content:center;align-items:center;border:1px dashed var(--sc-input-border-color);width:100%}@media screen and (max-width:400px){.aform_file-attach>.aform_form-btn[data-v-6543d39a]{width:100%}}.aform_file-attach-feedback[data-v-6543d39a]{color:var(--sc-input-label-color);width:100%;padding:.5rem;text-align:center;align-self:center}.aform_file-attach-feedback>li[data-v-6543d39a]{list-style:none;font-style:italic}.aform_file-attach-feedback>p[data-v-6543d39a]{margin-top:0}.aform_form-btn[data-v-6543d39a]{padding:.5rem 2rem;width:auto;border:1px solid var(--sc-input-border-color);color:var(--sc-input-label-color);cursor:pointer;background-color:#fff}.aform_form-btn[data-v-6543d39a]:disabled{background-color:var(--sc-gray-5)}.login-container[data-v-d9ffd0a7]{width:100%;position:relative;display:flex;flex-direction:column;align-items:center;justify-content:center;font-family:var(--sc-font-family)}.account-container[data-v-d9ffd0a7]{width:100%;margin-left:auto;margin-top:.5rem;margin-right:auto;display:flex;flex-direction:column;justify-content:center}.account-header[data-v-d9ffd0a7]{display:flex;flex-direction:column;text-align:center;margin-top:.5rem}#account-title[data-v-d9ffd0a7]{font-size:1.5rem;line-height:2rem;font-weight:600;letter-spacing:-.025em;margin:0}#account-subtitle[data-v-d9ffd0a7]{font-size:.875rem;line-height:1.25rem;margin:1rem}.login-form-container[data-v-d9ffd0a7]{display:grid;gap:.5rem}.login-form-element[data-v-d9ffd0a7]{display:grid;margin:.5rem 0;position:relative}.login-field[data-v-d9ffd0a7]{padding:.5rem .25rem .25rem .5rem;outline:1px solid transparent;border:1px solid var(--sc-input-border-color);border-radius:.25rem}.login-field[data-v-d9ffd0a7]:focus{border:1px solid black}.btn[data-v-d9ffd0a7]{background-color:var(--sc-btn-color);color:var(--sc-btn-label-color);border:1px solid var(--sc-btn-border);margin:.5rem 0;padding:.25rem;position:relative;cursor:pointer}.btn[data-v-d9ffd0a7]:hover{background-color:var(--sc-btn-hover)}.btn[data-v-d9ffd0a7]:disabled{background-color:var(--sc-input-field-disabled-background)}.disabled[data-v-d9ffd0a7]{opacity:.5}.loading-icon[data-v-d9ffd0a7]{animation:spin-d9ffd0a7 1s linear infinite forwards;display:inline-block;margin-right:.2rem;line-height:0;font-size:1rem;position:relative;top:.2rem}@keyframes spin-d9ffd0a7{0%{transform:rotate(0)}to{transform:rotate(360deg)}}
@@ -50,7 +50,16 @@ export declare interface ActionRegistry {
50
50
  * @public
51
51
  */
52
52
  export declare type BaseStonecropReturn = {
53
+ /**
54
+ * Reactive reference to the Stonecrop singleton instance.
55
+ * Use this to access class methods like `getRecord()`, `addRecord()`, `runAction()`.
56
+ */
53
57
  stonecrop: Ref<Stonecrop | undefined>;
58
+ /**
59
+ * Operation log API for undo/redo functionality.
60
+ * Use `operationLog.undo()` and `operationLog.redo()` for user-triggered operations.
61
+ * Use `operationLog.startBatch()` / `operationLog.commitBatch()` for grouping operations.
62
+ */
54
63
  operationLog: OperationLogAPI;
55
64
  };
56
65
 
@@ -71,6 +80,16 @@ export declare interface BatchOperation {
71
80
  reversible: boolean;
72
81
  }
73
82
 
83
+ /**
84
+ * Recursively collect nested data from HST using pre-resolved schemas
85
+ * @param resolvedSchema - The already-resolved schema (with nested schemas embedded)
86
+ * @param basePath - The base path in HST (e.g., "customer.123.address")
87
+ * @param hstStore - The HST store instance
88
+ * @returns The collected data object
89
+ * @public
90
+ */
91
+ export declare function collectNestedData(resolvedSchema: SchemaTypes[], basePath: string, hstStore: HSTNode): Record<string, any>;
92
+
74
93
  /**
75
94
  * Factory function for HST creation
76
95
  * Creates a new HSTNode proxy for hierarchical state tree navigation.
@@ -585,9 +604,13 @@ export declare class HST {
585
604
  * @public
586
605
  */
587
606
  export declare type HSTChangeData = {
607
+ /** Full HST path to the changed field */
588
608
  path: string;
609
+ /** New value for the field */
589
610
  value: any;
611
+ /** Field name that changed */
590
612
  fieldname: string;
613
+ /** Optional record ID */
591
614
  recordId?: string;
592
615
  };
593
616
 
@@ -735,19 +758,77 @@ export declare type HSTOperationType = 'set' | 'delete' | 'batch' | 'transition'
735
758
  * @public
736
759
  */
737
760
  export declare type HSTStonecropReturn = BaseStonecropReturn & {
761
+ /**
762
+ * Generates a fully-qualified HST path for a field.
763
+ * Use this in nested components to create paths like "customer.123.address".
764
+ * @param fieldname - The field name to append to the path
765
+ * @param recordId - Optional record ID (defaults to current record)
766
+ * @returns The full HST path string
767
+ */
738
768
  provideHSTPath: (fieldname: string, recordId?: string) => string;
769
+ /**
770
+ * Handles a field value change and updates HST.
771
+ * Call this from form input handlers to persist changes to the store.
772
+ * @param changeData - Object containing path, value, fieldname, and optional recordId
773
+ */
739
774
  handleHSTChange: (changeData: HSTChangeData) => void;
775
+ /**
776
+ * Reactive reference to the HST node for this doctype/record.
777
+ * Use this to read current form state or subscribe to changes.
778
+ */
740
779
  hstStore: Ref<HSTNode | undefined>;
780
+ /**
781
+ * Reactive form data bound to HST.
782
+ * Use this as the v-model target for form inputs. Changes sync to hstStore.
783
+ */
741
784
  formData: Ref<Record<string, any>>;
785
+ /**
786
+ * Resolved schema with nested Doctype fields expanded.
787
+ * Use this to iterate over fields for rendering, excluding nested doctypes handled separately.
788
+ */
742
789
  resolvedSchema: Ref<SchemaTypes[]>;
790
+ /**
791
+ * Loads or initializes nested doctype data.
792
+ * Use this when rendering a nested form component. Checks HST first, then initializes defaults.
793
+ * @param parentPath - The HST path to check for existing data
794
+ * @param childDoctype - The nested doctype metadata
795
+ * @param recordId - Optional record ID (reserved for future API fetch)
796
+ * @returns The loaded or initialized data object
797
+ */
743
798
  loadNestedData: (parentPath: string, childDoctype: Doctype, recordId?: string) => Record<string, any>;
744
- saveRecursive: (doctype: Doctype, recordId: string) => Promise<Record<string, any>>;
799
+ /**
800
+ * Collects a complete record payload with all nested data from HST.
801
+ * Use this before submitting to an API. Recursively includes 1:1 and 1:many nested records.
802
+ * @param doctype - The doctype metadata
803
+ * @param recordId - The record ID to collect
804
+ * @returns The complete record payload ready for API submission
805
+ */
806
+ collectRecordPayload: (doctype: Doctype, recordId: string) => Record<string, any>;
807
+ /**
808
+ * Creates a nested context for a child doctype component.
809
+ * Use this in parent components to pass scoped handlers to child components.
810
+ * @param basePath - The parent HST path prefix
811
+ * @param childDoctype - The child doctype metadata
812
+ * @returns Scoped provideHSTPath and handleHSTChange functions
813
+ */
745
814
  createNestedContext: (basePath: string, childDoctype: Doctype) => {
746
815
  provideHSTPath: (fieldname: string) => string;
747
816
  handleHSTChange: (changeData: HSTChangeData) => void;
748
817
  };
818
+ /**
819
+ * Loading state for async doctype resolution.
820
+ * True while fetching doctype by slug string from registry.
821
+ */
749
822
  isLoading: Ref<boolean>;
823
+ /**
824
+ * Error state for doctype resolution failures.
825
+ * Set when doctype slug lookup fails.
826
+ */
750
827
  error: Ref<Error | null>;
828
+ /**
829
+ * Resolved doctype instance.
830
+ * Available immediately if Doctype instance passed, after async resolution if slug string passed.
831
+ */
751
832
  resolvedDoctype: Ref<Doctype | undefined>;
752
833
  };
753
834
 
@@ -816,8 +897,20 @@ export declare type MutableDoctype = {
816
897
  * @public
817
898
  */
818
899
  export declare type OperationLogAPI = {
900
+ /**
901
+ * List of all recorded operations in the log.
902
+ * Each operation represents a state change that can be undone/redone.
903
+ */
819
904
  operations: Ref<HSTOperation[]>;
905
+ /**
906
+ * Current position in the operation log.
907
+ * -1 means no operations, 0 means at first operation, etc.
908
+ */
820
909
  currentIndex: Ref<number>;
910
+ /**
911
+ * Computed snapshot of undo/redo state.
912
+ * Use this for UI indicators (buttons, menu state).
913
+ */
821
914
  undoRedoState: ComputedRef<{
822
915
  canUndo: boolean;
823
916
  canRedo: boolean;
@@ -825,20 +918,92 @@ export declare type OperationLogAPI = {
825
918
  redoCount: number;
826
919
  currentIndex: number;
827
920
  }>;
921
+ /**
922
+ * Whether undo is currently available.
923
+ * True when there are operations that can be undone.
924
+ */
828
925
  canUndo: ComputedRef<boolean>;
926
+ /**
927
+ * Whether redo is currently available.
928
+ * True when there are undone operations that can be redone.
929
+ */
829
930
  canRedo: ComputedRef<boolean>;
931
+ /**
932
+ * Number of operations available to undo.
933
+ */
830
934
  undoCount: ComputedRef<number>;
935
+ /**
936
+ * Number of operations available to redo.
937
+ */
831
938
  redoCount: ComputedRef<number>;
939
+ /**
940
+ * Undo the last operation.
941
+ * @param hstStore - The HST node to apply the inverse operation to
942
+ * @returns True if undo succeeded, false if nothing to undo
943
+ */
832
944
  undo: (hstStore: HSTNode) => boolean;
945
+ /**
946
+ * Redo the last undone operation.
947
+ * @param hstStore - The HST node to apply the operation to
948
+ * @returns True if redo succeeded, false if nothing to redo
949
+ */
833
950
  redo: (hstStore: HSTNode) => boolean;
951
+ /**
952
+ * Start batching multiple operations together.
953
+ * Call before a series of changes that should be undone/redone as a unit.
954
+ */
834
955
  startBatch: () => void;
956
+ /**
957
+ * Commit the current batch of operations.
958
+ * @param description - Optional description for the batch
959
+ * @returns The batch operation ID, or null if no batch in progress
960
+ */
835
961
  commitBatch: (description?: string) => string | null;
962
+ /**
963
+ * Cancel the current batch without committing.
964
+ * Discards all operations added since startBatch().
965
+ */
836
966
  cancelBatch: () => void;
967
+ /**
968
+ * Clear all operations from the log.
969
+ * Resets the log to its initial empty state.
970
+ */
837
971
  clear: () => void;
972
+ /**
973
+ * Get all operations for a specific doctype.
974
+ * @param doctype - The doctype name to filter by
975
+ * @param recordId - Optional record ID to further filter
976
+ * @returns Array of matching operations
977
+ */
838
978
  getOperationsFor: (doctype: string, recordId?: string) => HSTOperation[];
979
+ /**
980
+ * Get a serializable snapshot of the operation log.
981
+ * Use for debugging, logging, or state persistence.
982
+ * @returns Snapshot containing operations and current index
983
+ */
839
984
  getSnapshot: () => OperationLogSnapshot;
985
+ /**
986
+ * Mark an operation as irreversible.
987
+ * Irreversible operations cannot be undone.
988
+ * @param operationId - The operation ID to mark
989
+ * @param reason - Human-readable reason why it cannot be undone
990
+ */
840
991
  markIrreversible: (operationId: string, reason: string) => void;
992
+ /**
993
+ * Log a custom action (non-HST operation).
994
+ * Use for tracking server calls, external side effects, etc.
995
+ * @param doctype - The doctype this action relates to
996
+ * @param actionName - Name of the action (e.g., 'save', 'submit')
997
+ * @param recordIds - Optional array of affected record IDs
998
+ * @param result - Optional result status
999
+ * @param error - Optional error message if result is 'failure'
1000
+ * @returns The logged operation ID
1001
+ */
841
1002
  logAction: (doctype: string, actionName: string, recordIds?: string[], result?: 'success' | 'failure' | 'pending', error?: string) => string;
1003
+ /**
1004
+ * Configure operation log options.
1005
+ * @param options - Partial configuration to merge with existing settings
1006
+ */
842
1007
  configure: (options: Partial<OperationLogConfig>) => void;
843
1008
  };
844
1009
 
@@ -995,17 +1160,18 @@ export declare class Registry {
995
1160
  */
996
1161
  addDoctype(doctype: Doctype): void;
997
1162
  /**
998
- * Resolve nested Doctype and Table fields in a schema by embedding child schemas inline.
1163
+ * Resolve nested Doctype fields in a schema by embedding child schemas inline.
999
1164
  *
1000
1165
  * @remarks
1001
1166
  * Walks the schema array and for each field with `fieldtype: 'Doctype'` and a string
1002
- * `options` value, looks up the referenced doctype in the registry and embeds its schema
1003
- * as the field's `schema` property. Recurses for deeply nested doctypes.
1167
+ * `options` value, looks up the referenced doctype in the registry and:
1168
+ *
1169
+ * - If `cardinality: 'many'`: auto-derives `columns` from the child doctype's schema,
1170
+ * sets `component: 'ATable'`, `config: { view: 'list' }`, and initializes `rows: []`.
1171
+ * - Otherwise (default/`cardinality: 'one'`): embeds the child schema as the field's
1172
+ * `schema` property for 1:1 nested forms.
1004
1173
  *
1005
- * For fields with `fieldtype: 'Table'`, looks up the referenced child doctype and
1006
- * auto-derives `columns` from its schema fields (unless columns are already provided).
1007
- * Also sets sensible defaults for `component` (`'ATable'`) and `config` (`{ view: 'list' }`).
1008
- * Row data is expected to come from the parent form's data model at `data[fieldname]`.
1174
+ * Recurses for deeply nested doctypes. Circular references are protected against.
1009
1175
  *
1010
1176
  * Returns a new array — does not mutate the original schema.
1011
1177
  *
@@ -1034,11 +1200,13 @@ export declare class Registry {
1034
1200
  * - Data, Text → `''`
1035
1201
  * - Check → `false`
1036
1202
  * - Int, Float, Decimal, Currency, Quantity → `0`
1037
- * - Table → `[]`
1038
- * - JSON, Doctype → `{}`
1203
+ * - JSON → `{}`
1204
+ * - Doctype with `cardinality: 'many'` → `[]`
1205
+ * - Doctype without `cardinality` or `cardinality: 'one'` → recursively initializes nested record
1039
1206
  * - All others → `null`
1040
1207
  *
1041
- * For Doctype fields with a resolved `schema` array, recursively initializes the nested record.
1208
+ * For Doctype fields with a resolved `schema` array (cardinality: 'one'), recursively
1209
+ * initializes the nested record.
1042
1210
  *
1043
1211
  * @param schema - The schema array to derive defaults from
1044
1212
  * @returns A plain object with default values for each field
@@ -1137,6 +1305,13 @@ export declare function setFieldRollback(doctype: string, fieldname: string, ena
1137
1305
  * @public
1138
1306
  */
1139
1307
  export declare class Stonecrop {
1308
+ /**
1309
+ * Singleton instance of Stonecrop. Only one Stonecrop instance can exist
1310
+ * per application, ensuring consistent HST state and registry access.
1311
+ * Subsequent constructor calls return this instance instead of creating new ones.
1312
+ * @internal
1313
+ */
1314
+ static _root: Stonecrop;
1140
1315
  private hstStore;
1141
1316
  private _operationLogStore?;
1142
1317
  private _operationLogConfig?;
@@ -1144,7 +1319,7 @@ export declare class Stonecrop {
1144
1319
  /** The registry instance containing all doctype definitions */
1145
1320
  readonly registry: Registry;
1146
1321
  /**
1147
- * Creates a new Stonecrop instance with HST integration
1322
+ * Creates a new Stonecrop instance with HST integration (singleton pattern)
1148
1323
  * @param registry - The Registry instance containing doctype definitions
1149
1324
  * @param operationLogConfig - Optional configuration for the operation log
1150
1325
  * @param options - Options including the data client (can be set later via setClient)
@@ -1259,7 +1434,7 @@ export declare class Stonecrop {
1259
1434
  getSnapshot: () => OperationLogSnapshot;
1260
1435
  markIrreversible: (operationId: string, reason: string) => void;
1261
1436
  logAction: (doctype: string, actionName: string, recordIds?: string[], result?: "success" | "failure" | "pending", error?: string) => string;
1262
- }, "operations" | "currentIndex" | "config" | "clientId">, Pick<{
1437
+ }, "operations" | "clientId" | "currentIndex" | "config">, Pick<{
1263
1438
  operations: Ref< {
1264
1439
  id: string;
1265
1440
  type: HSTOperationType;
@@ -1548,6 +1723,23 @@ export declare class Stonecrop {
1548
1723
  * @public
1549
1724
  */
1550
1725
  getRecordState(doctype: string | Doctype, recordId: string): string;
1726
+ /**
1727
+ * Collect a record payload with all nested doctype fields from HST
1728
+ * @param doctype - The doctype metadata
1729
+ * @param recordId - The record ID to collect
1730
+ * @returns The complete record payload ready for API submission
1731
+ * @public
1732
+ */
1733
+ collectRecordPayload(doctype: Doctype, recordId: string): Record<string, any>;
1734
+ /**
1735
+ * Load nested data from HST or initialize with defaults
1736
+ * @param parentPath - The HST path to check for existing data
1737
+ * @param childDoctype - The child doctype metadata
1738
+ * @param _recordId - Optional record ID to load
1739
+ * @returns The loaded or initialized data
1740
+ * @public
1741
+ */
1742
+ loadNestedData(parentPath: string, childDoctype: Doctype, _recordId?: string): Record<string, any>;
1551
1743
  }
1552
1744
 
1553
1745
  /**
@@ -1832,7 +2024,7 @@ getOperationsFor: (doctype: string, recordId?: string) => HSTOperation[];
1832
2024
  getSnapshot: () => OperationLogSnapshot;
1833
2025
  markIrreversible: (operationId: string, reason: string) => void;
1834
2026
  logAction: (doctype: string, actionName: string, recordIds?: string[], result?: "success" | "failure" | "pending", error?: string) => string;
1835
- }, "operations" | "currentIndex" | "config" | "clientId">, Pick<{
2027
+ }, "operations" | "clientId" | "currentIndex" | "config">, Pick<{
1836
2028
  operations: Ref< {
1837
2029
  id: string;
1838
2030
  type: HSTOperationType;