pict-section-formeditor 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (178) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +118 -0
  3. package/docs/.nojekyll +0 -0
  4. package/docs/README.md +162 -0
  5. package/docs/_sidebar.md +23 -0
  6. package/docs/_topbar.md +5 -0
  7. package/docs/cover.md +12 -0
  8. package/docs/css/docuserve.css +73 -0
  9. package/docs/index.html +39 -0
  10. package/docs/retold-catalog.json +224 -0
  11. package/docs/retold-keyword-index.json +46846 -0
  12. package/example_applications/form_editor/.quackage.json +10 -0
  13. package/example_applications/form_editor/FormEditor-Example-Application.js +226 -0
  14. package/example_applications/form_editor/html/icon-chooser.html +375 -0
  15. package/example_applications/form_editor/html/index.html +54 -0
  16. package/example_applications/form_editor/package.json +50 -0
  17. package/package.json +55 -0
  18. package/sample_manifests/Complex-Table.json +974 -0
  19. package/sample_manifests/Distill-Example.json +200 -0
  20. package/sample_manifests/Gradebook-Assignment.json +38 -0
  21. package/sample_manifests/Gradebook-Student.json +40 -0
  22. package/sample_manifests/Manyfest-Editor.json +347 -0
  23. package/sample_manifests/Simple-Form.json +232 -0
  24. package/sample_manifests/Simple-Table.json +79 -0
  25. package/source/Pict-Section-FormEditor-DefaultConfiguration.js +3321 -0
  26. package/source/Pict-Section-FormEditor.js +35 -0
  27. package/source/providers/Pict-Provider-ChildPictManager-Application.js +40 -0
  28. package/source/providers/Pict-Provider-ChildPictManager.js +238 -0
  29. package/source/providers/Pict-Provider-FormEditorDocumentation.js +356 -0
  30. package/source/providers/Pict-Provider-FormEditorDragDrop.js +535 -0
  31. package/source/providers/Pict-Provider-FormEditorIconography.js +1002 -0
  32. package/source/providers/Pict-Provider-FormEditorManifestOps.js +1443 -0
  33. package/source/providers/Pict-Provider-FormEditorRendering.js +730 -0
  34. package/source/providers/Pict-Provider-FormEditorUtilities.js +862 -0
  35. package/source/providers/Pict-Provider-PreviewCSS.js +42 -0
  36. package/source/views/PictView-FormEditor-InlineEditing.js +309 -0
  37. package/source/views/PictView-FormEditor-InputTypePicker.js +532 -0
  38. package/source/views/PictView-FormEditor-PropertiesPanel.js +7730 -0
  39. package/source/views/PictView-FormEditor.js +681 -0
  40. package/test/Pict-Section-FormEditor_tests.js +4102 -0
  41. package/user-documentation/.pict_documentation_topics.json +695 -0
  42. package/user-documentation/Getting-Started.md +32 -0
  43. package/user-documentation/Groups.md +52 -0
  44. package/user-documentation/Inputs.md +98 -0
  45. package/user-documentation/Sections.md +36 -0
  46. package/user-documentation/Shortcuts.md +44 -0
  47. package/user-documentation/Solver-Expression-Walkthrough.md +176 -0
  48. package/user-documentation/Solver-Expressions-Advanced.md +344 -0
  49. package/user-documentation/Solver-Functions.md +213 -0
  50. package/user-documentation/Solvers.md +81 -0
  51. package/user-documentation/ToC.md +18 -0
  52. package/user-documentation/solverfunctions/abs.md +84 -0
  53. package/user-documentation/solverfunctions/aggregationhistogram.md +83 -0
  54. package/user-documentation/solverfunctions/aggregationhistogrambyobject.md +64 -0
  55. package/user-documentation/solverfunctions/arrayconcat.md +64 -0
  56. package/user-documentation/solverfunctions/avg.md +81 -0
  57. package/user-documentation/solverfunctions/bucketset.md +69 -0
  58. package/user-documentation/solverfunctions/ceil.md +70 -0
  59. package/user-documentation/solverfunctions/cleanvaluearray.md +66 -0
  60. package/user-documentation/solverfunctions/cleanvalueobject.md +68 -0
  61. package/user-documentation/solverfunctions/colorgroupbackground.md +60 -0
  62. package/user-documentation/solverfunctions/colorinputbackground.md +62 -0
  63. package/user-documentation/solverfunctions/colorinputbackgroundtabular.md +64 -0
  64. package/user-documentation/solverfunctions/colorsectionbackground.md +59 -0
  65. package/user-documentation/solverfunctions/compare.md +72 -0
  66. package/user-documentation/solverfunctions/concat.md +73 -0
  67. package/user-documentation/solverfunctions/concatraw.md +73 -0
  68. package/user-documentation/solverfunctions/cos.md +75 -0
  69. package/user-documentation/solverfunctions/count.md +73 -0
  70. package/user-documentation/solverfunctions/countset.md +65 -0
  71. package/user-documentation/solverfunctions/countsetelements.md +63 -0
  72. package/user-documentation/solverfunctions/createarrayfromabsolutevalues.md +63 -0
  73. package/user-documentation/solverfunctions/createvalueobjectbyhashes.md +69 -0
  74. package/user-documentation/solverfunctions/cumulativesummation.md +96 -0
  75. package/user-documentation/solverfunctions/dateadddays.md +79 -0
  76. package/user-documentation/solverfunctions/dateaddhours.md +74 -0
  77. package/user-documentation/solverfunctions/dateaddmilliseconds.md +65 -0
  78. package/user-documentation/solverfunctions/dateaddminutes.md +72 -0
  79. package/user-documentation/solverfunctions/dateaddmonths.md +74 -0
  80. package/user-documentation/solverfunctions/dateaddseconds.md +66 -0
  81. package/user-documentation/solverfunctions/dateaddweeks.md +73 -0
  82. package/user-documentation/solverfunctions/dateaddyears.md +74 -0
  83. package/user-documentation/solverfunctions/datedaydifference.md +84 -0
  84. package/user-documentation/solverfunctions/datefromparts.md +81 -0
  85. package/user-documentation/solverfunctions/datehourdifference.md +64 -0
  86. package/user-documentation/solverfunctions/datemathadd.md +72 -0
  87. package/user-documentation/solverfunctions/datemilliseconddifference.md +64 -0
  88. package/user-documentation/solverfunctions/dateminutedifference.md +64 -0
  89. package/user-documentation/solverfunctions/datemonthdifference.md +66 -0
  90. package/user-documentation/solverfunctions/dateseconddifference.md +64 -0
  91. package/user-documentation/solverfunctions/dateweekdifference.md +65 -0
  92. package/user-documentation/solverfunctions/dateyeardifference.md +64 -0
  93. package/user-documentation/solverfunctions/differencearrays.md +59 -0
  94. package/user-documentation/solverfunctions/disablesolverordinal.md +58 -0
  95. package/user-documentation/solverfunctions/distributionhistogram.md +96 -0
  96. package/user-documentation/solverfunctions/distributionhistogrambyobject.md +64 -0
  97. package/user-documentation/solverfunctions/enablesolverordinal.md +57 -0
  98. package/user-documentation/solverfunctions/entryinset.md +72 -0
  99. package/user-documentation/solverfunctions/euler.md +77 -0
  100. package/user-documentation/solverfunctions/exp.md +74 -0
  101. package/user-documentation/solverfunctions/findfirstvaluebyexactmatch.md +67 -0
  102. package/user-documentation/solverfunctions/findfirstvaluebystringincludes.md +67 -0
  103. package/user-documentation/solverfunctions/flatten.md +76 -0
  104. package/user-documentation/solverfunctions/floor.md +70 -0
  105. package/user-documentation/solverfunctions/gaussianelimination.md +75 -0
  106. package/user-documentation/solverfunctions/generatearrayofobjectsfromsets.md +70 -0
  107. package/user-documentation/solverfunctions/generatehtmlhexcolor.md +67 -0
  108. package/user-documentation/solverfunctions/getvalue.md +90 -0
  109. package/user-documentation/solverfunctions/getvaluearray.md +64 -0
  110. package/user-documentation/solverfunctions/getvalueobject.md +67 -0
  111. package/user-documentation/solverfunctions/hidesections.md +58 -0
  112. package/user-documentation/solverfunctions/if.md +109 -0
  113. package/user-documentation/solverfunctions/iterativeseries.md +107 -0
  114. package/user-documentation/solverfunctions/join.md +75 -0
  115. package/user-documentation/solverfunctions/joinraw.md +64 -0
  116. package/user-documentation/solverfunctions/largestinset.md +63 -0
  117. package/user-documentation/solverfunctions/leastsquares.md +66 -0
  118. package/user-documentation/solverfunctions/linest.md +58 -0
  119. package/user-documentation/solverfunctions/log.md +74 -0
  120. package/user-documentation/solverfunctions/logvalues.md +65 -0
  121. package/user-documentation/solverfunctions/match.md +71 -0
  122. package/user-documentation/solverfunctions/matrixinverse.md +67 -0
  123. package/user-documentation/solverfunctions/matrixmultiply.md +71 -0
  124. package/user-documentation/solverfunctions/matrixtranspose.md +72 -0
  125. package/user-documentation/solverfunctions/matrixvectormultiply.md +69 -0
  126. package/user-documentation/solverfunctions/max.md +73 -0
  127. package/user-documentation/solverfunctions/mean.md +63 -0
  128. package/user-documentation/solverfunctions/median.md +79 -0
  129. package/user-documentation/solverfunctions/min.md +73 -0
  130. package/user-documentation/solverfunctions/mode.md +66 -0
  131. package/user-documentation/solverfunctions/objectkeystoarray.md +66 -0
  132. package/user-documentation/solverfunctions/objectvaluessortbyexternalobjectarray.md +65 -0
  133. package/user-documentation/solverfunctions/objectvaluestoarray.md +67 -0
  134. package/user-documentation/solverfunctions/percent.md +75 -0
  135. package/user-documentation/solverfunctions/pi.md +77 -0
  136. package/user-documentation/solverfunctions/polynomialregression.md +69 -0
  137. package/user-documentation/solverfunctions/predict.md +71 -0
  138. package/user-documentation/solverfunctions/rad.md +85 -0
  139. package/user-documentation/solverfunctions/randomfloat.md +63 -0
  140. package/user-documentation/solverfunctions/randomfloatbetween.md +72 -0
  141. package/user-documentation/solverfunctions/randomfloatupto.md +65 -0
  142. package/user-documentation/solverfunctions/randominteger.md +56 -0
  143. package/user-documentation/solverfunctions/randomintegerbetween.md +72 -0
  144. package/user-documentation/solverfunctions/randomintegerupto.md +64 -0
  145. package/user-documentation/solverfunctions/refreshtabularsection.md +57 -0
  146. package/user-documentation/solverfunctions/resolvehtmlentities.md +64 -0
  147. package/user-documentation/solverfunctions/round.md +111 -0
  148. package/user-documentation/solverfunctions/runsolvers.md +49 -0
  149. package/user-documentation/solverfunctions/setconcatenate.md +64 -0
  150. package/user-documentation/solverfunctions/setgroupvisibility.md +60 -0
  151. package/user-documentation/solverfunctions/setsectionvisibility.md +59 -0
  152. package/user-documentation/solverfunctions/setsolverordinalenabled.md +59 -0
  153. package/user-documentation/solverfunctions/settabularrowlength.md +57 -0
  154. package/user-documentation/solverfunctions/setvalue.md +65 -0
  155. package/user-documentation/solverfunctions/showsections.md +58 -0
  156. package/user-documentation/solverfunctions/sin.md +83 -0
  157. package/user-documentation/solverfunctions/slice.md +80 -0
  158. package/user-documentation/solverfunctions/smallestinset.md +63 -0
  159. package/user-documentation/solverfunctions/sortarray.md +58 -0
  160. package/user-documentation/solverfunctions/sorthistogram.md +70 -0
  161. package/user-documentation/solverfunctions/sorthistogrambykeys.md +69 -0
  162. package/user-documentation/solverfunctions/sortset.md +75 -0
  163. package/user-documentation/solverfunctions/sqrt.md +85 -0
  164. package/user-documentation/solverfunctions/stdev.md +81 -0
  165. package/user-documentation/solverfunctions/stdeva.md +58 -0
  166. package/user-documentation/solverfunctions/stdevp.md +83 -0
  167. package/user-documentation/solverfunctions/stringcountsegments.md +66 -0
  168. package/user-documentation/solverfunctions/stringgetsegments.md +74 -0
  169. package/user-documentation/solverfunctions/subtractingsummation.md +66 -0
  170. package/user-documentation/solverfunctions/sum.md +78 -0
  171. package/user-documentation/solverfunctions/tan.md +78 -0
  172. package/user-documentation/solverfunctions/tofixed.md +75 -0
  173. package/user-documentation/solverfunctions/unionarrays.md +59 -0
  174. package/user-documentation/solverfunctions/uniquearray.md +58 -0
  175. package/user-documentation/solverfunctions/var.md +67 -0
  176. package/user-documentation/solverfunctions/vara.md +58 -0
  177. package/user-documentation/solverfunctions/varp.md +66 -0
  178. package/user-documentation/solverfunctions/when.md +98 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Steven Velozo
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,118 @@
1
+ # pict-section-formeditor
2
+
3
+ A visual editor for [pict-section-form](https://github.com/stevenvelozo/pict-section-form) configuration manifests. Build, edit, and preview form layouts in the browser with a drag-and-drop interface, inline property editing, solver expression authoring, and live form preview.
4
+
5
+ ## Features
6
+
7
+ - **Visual Editor** -- Drag-and-drop sections, groups, rows, and inputs in a structured layout
8
+ - **JSON Editor** -- Edit the raw manifest JSON with syntax highlighting via CodeJar
9
+ - **Properties Panel** -- Inline editing of section, group, row, and input properties
10
+ - **Solver Editor** -- Author solver expressions with a built-in expression linter and token inspector
11
+ - **Live Preview** -- Render the form as it will appear to end users using a child pict instance
12
+ - **Embedded Help** -- Context-sensitive documentation for all 127+ solver functions, input types, and editor features
13
+ - **Input Type Picker** -- Browse all available pict-section-form input types organized by category
14
+ - **Display Modes** -- Toggle between human-readable names and manifest hash identifiers
15
+
16
+ ## Installation
17
+
18
+ ```bash
19
+ npm install pict-section-formeditor
20
+ ```
21
+
22
+ ## Quick Start
23
+
24
+ Add the form editor view to any pict application:
25
+
26
+ ```javascript
27
+ const libPict = require('pict');
28
+ const libPictApplication = require('pict-application');
29
+ const libPictSectionFormEditor = require('pict-section-formeditor');
30
+
31
+ class MyApp extends libPictApplication
32
+ {
33
+ onAfterInitializeAsync(fCallback)
34
+ {
35
+ // Provide a manifest object at a known AppData address
36
+ this.pict.AppData.FormConfig =
37
+ {
38
+ Scope: 'MyForm',
39
+ Sections: [],
40
+ Descriptors: {}
41
+ };
42
+
43
+ // Add the form editor view
44
+ this.pict.addView('FormEditor',
45
+ {
46
+ ViewIdentifier: 'FormEditor',
47
+ ManifestDataAddress: 'AppData.FormConfig',
48
+ DefaultDestinationAddress: '#FormEditor-Container',
49
+ ActiveTab: 'visual'
50
+ }, libPictSectionFormEditor);
51
+
52
+ // Initialize and render
53
+ this.pict.views.FormEditor.initialize();
54
+ this.pict.views.FormEditor.render();
55
+
56
+ return super.onAfterInitializeAsync(fCallback);
57
+ }
58
+ }
59
+ ```
60
+
61
+ In your HTML, provide a container element and the Pict CSS style block:
62
+
63
+ ```html
64
+ <style id="PICT-CSS"></style>
65
+ <div id="FormEditor-Container"></div>
66
+ ```
67
+
68
+ ## Configuration Options
69
+
70
+ | Option | Type | Default | Description |
71
+ |---|---|---|---|
72
+ | `ManifestDataAddress` | String | `'FormEditor.Manifest'` | AppData address where the manifest object lives |
73
+ | `DefaultDestinationAddress` | String | -- | CSS selector for the editor container element |
74
+ | `ActiveTab` | String | `'visual'` | Initial tab: `'visual'`, `'json'`, or `'preview'` |
75
+
76
+ ## Manifest Format
77
+
78
+ The editor works with standard pict-section-form manifests:
79
+
80
+ ```json
81
+ {
82
+ "Scope": "MyForm",
83
+ "Sections": [
84
+ {
85
+ "Hash": "Details",
86
+ "Name": "Contact Details"
87
+ }
88
+ ],
89
+ "Descriptors": {
90
+ "Name": {
91
+ "Name": "Full Name",
92
+ "Hash": "Name",
93
+ "DataType": "String",
94
+ "PictForm": { "Section": "Details", "Row": 1, "Width": 1 }
95
+ }
96
+ }
97
+ }
98
+ ```
99
+
100
+ ## Running the Example Application
101
+
102
+ ```bash
103
+ cd example_applications/form_editor
104
+ npm install
105
+ npx quack build
106
+ # Open html/index.html in a browser
107
+ ```
108
+
109
+ ## Building
110
+
111
+ ```bash
112
+ npm test # Run tests
113
+ npx quack build # Bundle the library
114
+ ```
115
+
116
+ ## License
117
+
118
+ MIT
package/docs/.nojekyll ADDED
File without changes
package/docs/README.md ADDED
@@ -0,0 +1,162 @@
1
+ # pict-section-formeditor
2
+
3
+ A visual editor for pict-section-form configuration manifests.
4
+
5
+ The form editor lets you build and modify pict-section-form manifests through a browser-based interface. Sections, groups, rows, and inputs can be created, rearranged, and configured without hand-editing JSON.
6
+
7
+ ## Getting Started
8
+
9
+ ### Install
10
+
11
+ ```bash
12
+ npm install pict-section-formeditor
13
+ ```
14
+
15
+ ### Add the Editor to Your Application
16
+
17
+ The form editor is a pict view. Register it with your pict application and point it at a manifest object in `AppData`:
18
+
19
+ ```javascript
20
+ const libPictSectionFormEditor = require('pict-section-formeditor');
21
+
22
+ // In your PictApplication subclass:
23
+ onAfterInitializeAsync(fCallback)
24
+ {
25
+ // Seed an empty manifest (or load one from your API)
26
+ this.pict.AppData.FormConfig =
27
+ {
28
+ Scope: 'MyForm',
29
+ Sections: [],
30
+ Descriptors: {}
31
+ };
32
+
33
+ // Create the editor view
34
+ this.pict.addView('FormEditor',
35
+ {
36
+ ViewIdentifier: 'FormEditor',
37
+ ManifestDataAddress: 'AppData.FormConfig',
38
+ DefaultDestinationAddress: '#FormEditor-Container',
39
+ ActiveTab: 'visual'
40
+ }, libPictSectionFormEditor);
41
+
42
+ this.pict.views.FormEditor.initialize();
43
+ this.pict.views.FormEditor.render();
44
+
45
+ return super.onAfterInitializeAsync(fCallback);
46
+ }
47
+ ```
48
+
49
+ ### HTML Setup
50
+
51
+ Your page needs two things: the Pict CSS injection target and a container element.
52
+
53
+ ```html
54
+ <style id="PICT-CSS"></style>
55
+ <div id="FormEditor-Container"></div>
56
+ ```
57
+
58
+ The editor injects all of its CSS into `#PICT-CSS` at runtime, so no external stylesheet is required beyond whatever your application already provides.
59
+
60
+ ## Editor Tabs
61
+
62
+ The editor provides several tabs along the top:
63
+
64
+ | Tab | Purpose |
65
+ |---|---|
66
+ | **Visual Editor** | Drag-and-drop form layout with inline property editing |
67
+ | **JSON** | Raw manifest JSON editing with syntax highlighting (CodeJar) |
68
+ | **Preview** | Live rendered form using a child pict instance |
69
+ | **Help** | Context-sensitive documentation browser |
70
+
71
+ ### Visual Editor
72
+
73
+ The visual editor displays the manifest as a hierarchy of sections, groups, rows, and inputs. Each element can be selected to open its properties in the right-hand panel.
74
+
75
+ - **Sections** are the top-level containers. Add new sections with the toolbar button.
76
+ - **Groups** organize inputs within a section. Each section has a default group.
77
+ - **Rows** are horizontal containers inside groups. Inputs in the same row appear side by side.
78
+ - **Inputs** are the individual form fields. Each input maps to a Descriptor in the manifest.
79
+
80
+ ### JSON Editor
81
+
82
+ Switches to a code editor where you can modify the manifest JSON directly. Changes are parsed and applied when you switch back to the visual editor.
83
+
84
+ ### Preview
85
+
86
+ Click **Load Preview** to render the current manifest as a live pict-section-form. The preview uses a sandboxed child pict instance so it does not interfere with the editor's own state or CSS.
87
+
88
+ ### Solver Editor
89
+
90
+ When editing a section's solvers, a dedicated panel opens with a code editor and two bottom tabs:
91
+
92
+ - **Expression Linter** -- Tokenizes the solver expression in real time and reports errors or warnings
93
+ - **Input Reference** -- Browse available data addresses from the manifest to use in expressions
94
+
95
+ ## Configuration
96
+
97
+ Pass options when adding the view:
98
+
99
+ ```javascript
100
+ this.pict.addView('FormEditor',
101
+ {
102
+ ViewIdentifier: 'FormEditor',
103
+
104
+ // Where the manifest lives in AppData
105
+ ManifestDataAddress: 'AppData.FormConfig',
106
+
107
+ // CSS selector for the container element
108
+ DefaultDestinationAddress: '#FormEditor-Container',
109
+
110
+ // Which tab to show first: 'visual', 'json', or 'preview'
111
+ ActiveTab: 'visual'
112
+ }, libPictSectionFormEditor);
113
+ ```
114
+
115
+ ### Loading a Manifest
116
+
117
+ Set the manifest object at the configured `ManifestDataAddress` and re-render:
118
+
119
+ ```javascript
120
+ this.pict.AppData.FormConfig = myLoadedManifest;
121
+ this.pict.views.FormEditor.render();
122
+ ```
123
+
124
+ ### Reading the Manifest Back
125
+
126
+ The editor modifies the manifest in place. Read it back from the same address:
127
+
128
+ ```javascript
129
+ let tmpManifest = this.pict.AppData.FormConfig;
130
+ // POST it to your API, save to localStorage, etc.
131
+ ```
132
+
133
+ ## Architecture
134
+
135
+ The editor is decomposed into a main view and several providers:
136
+
137
+ | Module | Role |
138
+ |---|---|
139
+ | `PictView-FormEditor` | Main view -- tab switching, lifecycle, coordination |
140
+ | `PictView-FormEditor-PropertiesPanel` | Right-hand property editing, solver editor, preview |
141
+ | `PictView-FormEditor-InlineEditing` | Click-to-edit labels and values in the visual layout |
142
+ | `PictView-FormEditor-InputTypePicker` | Modal for selecting input types by category |
143
+ | `Pict-Provider-FormEditorRendering` | HTML generation for all visual editor elements |
144
+ | `Pict-Provider-FormEditorManifestOps` | CRUD operations on the manifest (add/move/delete) |
145
+ | `Pict-Provider-FormEditorDragDrop` | Drag-and-drop reordering of sections, groups, rows, inputs |
146
+ | `Pict-Provider-FormEditorUtilities` | String helpers, input type definitions, stats |
147
+ | `Pict-Provider-FormEditorIconography` | SVG icon set for the editor UI |
148
+ | `Pict-Provider-FormEditorDocumentation` | Embedded help content and topic index |
149
+ | `Pict-Provider-ChildPictManager` | Manages child pict instances for preview and solver linting |
150
+ | `Pict-Provider-PreviewCSS` | CSS isolation for child pict form previews |
151
+
152
+ ## Example Application
153
+
154
+ A complete working example lives in `example_applications/form_editor/`. To run it:
155
+
156
+ ```bash
157
+ cd example_applications/form_editor
158
+ npm install
159
+ npx quack build
160
+ ```
161
+
162
+ Then open `html/index.html` in a browser. The example includes a manifest selector with several sample forms.
@@ -0,0 +1,23 @@
1
+ - Getting Started
2
+ - [Overview](#/README)
3
+ - [Installation](#/README?id=install)
4
+ - [Quick Start](#/README?id=add-the-editor-to-your-application)
5
+ - [HTML Setup](#/README?id=html-setup)
6
+
7
+ - Using the Editor
8
+ - [Editor Tabs](#/README?id=editor-tabs)
9
+ - [Visual Editor](#/README?id=visual-editor)
10
+ - [JSON Editor](#/README?id=json-editor)
11
+ - [Preview](#/README?id=preview)
12
+ - [Solver Editor](#/README?id=solver-editor)
13
+
14
+ - Developer Guide
15
+ - [Configuration](#/README?id=configuration)
16
+ - [Loading a Manifest](#/README?id=loading-a-manifest)
17
+ - [Reading the Manifest](#/README?id=reading-the-manifest-back)
18
+ - [Architecture](#/README?id=architecture)
19
+
20
+ - Resources
21
+ - [Example Application](#/README?id=example-application)
22
+ - [GitHub](https://github.com/stevenvelozo/pict-section-formeditor)
23
+ - [pict-section-form](https://github.com/stevenvelozo/pict-section-form)
@@ -0,0 +1,5 @@
1
+ # pict-section-formeditor
2
+
3
+ - [Documentation](#/README)
4
+ - [GitHub](https://github.com/stevenvelozo/pict-section-formeditor)
5
+ - [pict-section-form](https://github.com/stevenvelozo/pict-section-form)
package/docs/cover.md ADDED
@@ -0,0 +1,12 @@
1
+ # pict-section-formeditor
2
+
3
+ > A visual editor for pict-section-form configuration manifests.
4
+
5
+ - Drag-and-drop form layout builder
6
+ - Inline property editing
7
+ - Solver expression authoring with real-time linting
8
+ - Live form preview
9
+ - Embedded help for 127+ solver functions
10
+
11
+ [Get Started](#/README)
12
+ [View on GitHub](https://github.com/stevenvelozo/pict-section-formeditor)
@@ -0,0 +1,73 @@
1
+ /* ============================================================================
2
+ Pict Docuserve - Base Styles
3
+ ============================================================================ */
4
+
5
+ /* Reset and base */
6
+ *, *::before, *::after {
7
+ box-sizing: border-box;
8
+ }
9
+
10
+ html, body {
11
+ margin: 0;
12
+ padding: 0;
13
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
14
+ font-size: 16px;
15
+ line-height: 1.5;
16
+ color: #423D37;
17
+ background-color: #fff;
18
+ -webkit-font-smoothing: antialiased;
19
+ -moz-osx-font-smoothing: grayscale;
20
+ }
21
+
22
+ /* Typography */
23
+ h1, h2, h3, h4, h5, h6 {
24
+ margin-top: 0;
25
+ line-height: 1.3;
26
+ }
27
+
28
+ a {
29
+ color: #2E7D74;
30
+ text-decoration: none;
31
+ }
32
+
33
+ a:hover {
34
+ color: #256861;
35
+ }
36
+
37
+ /* Application container */
38
+ #Docuserve-Application-Container {
39
+ min-height: 100vh;
40
+ }
41
+
42
+ /* Utility: scrollbar styling */
43
+ ::-webkit-scrollbar {
44
+ width: 8px;
45
+ }
46
+
47
+ ::-webkit-scrollbar-track {
48
+ background: #F5F0E8;
49
+ }
50
+
51
+ ::-webkit-scrollbar-thumb {
52
+ background: #D4CCBE;
53
+ border-radius: 4px;
54
+ }
55
+
56
+ ::-webkit-scrollbar-thumb:hover {
57
+ background: #B5AA9A;
58
+ }
59
+
60
+ /* Responsive adjustments */
61
+ @media (max-width: 768px) {
62
+ html {
63
+ font-size: 14px;
64
+ }
65
+
66
+ #Docuserve-Sidebar-Container {
67
+ display: none;
68
+ }
69
+
70
+ .docuserve-body {
71
+ flex-direction: column;
72
+ }
73
+ }
@@ -0,0 +1,39 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
6
+ <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
7
+ <meta name="description" content="Documentation powered by pict-docuserve">
8
+
9
+ <title>Documentation</title>
10
+
11
+ <!-- Application Stylesheet -->
12
+ <link href="css/docuserve.css" rel="stylesheet">
13
+ <!-- KaTeX stylesheet for LaTeX equation rendering -->
14
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.16.21/dist/katex.min.css">
15
+ <!-- PICT Dynamic View CSS Container -->
16
+ <style id="PICT-CSS"></style>
17
+
18
+ <!-- Load the PICT library from jsDelivr CDN -->
19
+ <script src="https://cdn.jsdelivr.net/npm/pict@1/dist/pict.min.js" type="text/javascript"></script>
20
+ <!-- Bootstrap the Application -->
21
+ <script type="text/javascript">
22
+ //<![CDATA[
23
+ Pict.safeOnDocumentReady(() => { Pict.safeLoadPictApplication(PictDocuserve, 2)});
24
+ //]]>
25
+ </script>
26
+ </head>
27
+ <body>
28
+ <!-- The root container for the Pict application -->
29
+ <div id="Docuserve-Application-Container"></div>
30
+
31
+ <!-- Mermaid diagram rendering -->
32
+ <script src="https://cdn.jsdelivr.net/npm/mermaid@11/dist/mermaid.min.js"></script>
33
+ <script>mermaid.initialize({ startOnLoad: false, theme: 'default' });</script>
34
+ <!-- KaTeX for LaTeX equation rendering -->
35
+ <script defer src="https://cdn.jsdelivr.net/npm/katex@0.16.21/dist/katex.min.js"></script>
36
+ <!-- Load the Docuserve PICT Application Bundle from jsDelivr CDN -->
37
+ <script src="https://cdn.jsdelivr.net/npm/pict-docuserve@0/dist/pict-docuserve.min.js" type="text/javascript"></script>
38
+ </body>
39
+ </html>
@@ -0,0 +1,224 @@
1
+ {
2
+ "Generated": "2026-02-22T22:01:46.339Z",
3
+ "GitHubOrg": "stevenvelozo",
4
+ "DefaultBranch": "master",
5
+ "Groups": [
6
+ {
7
+ "Name": "Dist",
8
+ "Key": "dist",
9
+ "Description": "",
10
+ "Modules": [
11
+ {
12
+ "Name": "indoctrinate_content_staging",
13
+ "Repo": "indoctrinate_content_staging",
14
+ "Group": "dist",
15
+ "Branch": "master",
16
+ "HasDocs": false,
17
+ "HasCover": false,
18
+ "Sidebar": [],
19
+ "DocFiles": []
20
+ }
21
+ ]
22
+ },
23
+ {
24
+ "Name": "Example_applications",
25
+ "Key": "example_applications",
26
+ "Description": "",
27
+ "Modules": [
28
+ {
29
+ "Name": "form_editor",
30
+ "Repo": "form_editor",
31
+ "Group": "example_applications",
32
+ "Branch": "master",
33
+ "HasDocs": true,
34
+ "HasCover": false,
35
+ "Sidebar": [],
36
+ "DocFiles": [
37
+ ".pict_documentation_topics.json",
38
+ "Getting-Started.md",
39
+ "Groups.md",
40
+ "Inputs.md",
41
+ "Sections.md",
42
+ "Shortcuts.md",
43
+ "Solver-Expression-Walkthrough.md",
44
+ "Solver-Expressions-Advanced.md",
45
+ "Solver-Functions.md",
46
+ "Solvers.md",
47
+ "ToC.md",
48
+ "solverfunctions/abs.md",
49
+ "solverfunctions/aggregationhistogram.md",
50
+ "solverfunctions/aggregationhistogrambyobject.md",
51
+ "solverfunctions/arrayconcat.md",
52
+ "solverfunctions/avg.md",
53
+ "solverfunctions/bucketset.md",
54
+ "solverfunctions/ceil.md",
55
+ "solverfunctions/cleanvaluearray.md",
56
+ "solverfunctions/cleanvalueobject.md",
57
+ "solverfunctions/colorgroupbackground.md",
58
+ "solverfunctions/colorinputbackground.md",
59
+ "solverfunctions/colorinputbackgroundtabular.md",
60
+ "solverfunctions/colorsectionbackground.md",
61
+ "solverfunctions/compare.md",
62
+ "solverfunctions/concat.md",
63
+ "solverfunctions/concatraw.md",
64
+ "solverfunctions/cos.md",
65
+ "solverfunctions/count.md",
66
+ "solverfunctions/countset.md",
67
+ "solverfunctions/countsetelements.md",
68
+ "solverfunctions/createarrayfromabsolutevalues.md",
69
+ "solverfunctions/createvalueobjectbyhashes.md",
70
+ "solverfunctions/cumulativesummation.md",
71
+ "solverfunctions/dateadddays.md",
72
+ "solverfunctions/dateaddhours.md",
73
+ "solverfunctions/dateaddmilliseconds.md",
74
+ "solverfunctions/dateaddminutes.md",
75
+ "solverfunctions/dateaddmonths.md",
76
+ "solverfunctions/dateaddseconds.md",
77
+ "solverfunctions/dateaddweeks.md",
78
+ "solverfunctions/dateaddyears.md",
79
+ "solverfunctions/datedaydifference.md",
80
+ "solverfunctions/datefromparts.md",
81
+ "solverfunctions/datehourdifference.md",
82
+ "solverfunctions/datemathadd.md",
83
+ "solverfunctions/datemilliseconddifference.md",
84
+ "solverfunctions/dateminutedifference.md",
85
+ "solverfunctions/datemonthdifference.md",
86
+ "solverfunctions/dateseconddifference.md",
87
+ "solverfunctions/dateweekdifference.md",
88
+ "solverfunctions/dateyeardifference.md",
89
+ "solverfunctions/differencearrays.md",
90
+ "solverfunctions/disablesolverordinal.md",
91
+ "solverfunctions/distributionhistogram.md",
92
+ "solverfunctions/distributionhistogrambyobject.md",
93
+ "solverfunctions/enablesolverordinal.md",
94
+ "solverfunctions/entryinset.md",
95
+ "solverfunctions/euler.md",
96
+ "solverfunctions/exp.md",
97
+ "solverfunctions/findfirstvaluebyexactmatch.md",
98
+ "solverfunctions/findfirstvaluebystringincludes.md",
99
+ "solverfunctions/flatten.md",
100
+ "solverfunctions/floor.md",
101
+ "solverfunctions/gaussianelimination.md",
102
+ "solverfunctions/generatearrayofobjectsfromsets.md",
103
+ "solverfunctions/generatehtmlhexcolor.md",
104
+ "solverfunctions/getvalue.md",
105
+ "solverfunctions/getvaluearray.md",
106
+ "solverfunctions/getvalueobject.md",
107
+ "solverfunctions/hidesections.md",
108
+ "solverfunctions/if.md",
109
+ "solverfunctions/iterativeseries.md",
110
+ "solverfunctions/join.md",
111
+ "solverfunctions/joinraw.md",
112
+ "solverfunctions/largestinset.md",
113
+ "solverfunctions/leastsquares.md",
114
+ "solverfunctions/linest.md",
115
+ "solverfunctions/log.md",
116
+ "solverfunctions/logvalues.md",
117
+ "solverfunctions/match.md",
118
+ "solverfunctions/matrixinverse.md",
119
+ "solverfunctions/matrixmultiply.md",
120
+ "solverfunctions/matrixtranspose.md",
121
+ "solverfunctions/matrixvectormultiply.md",
122
+ "solverfunctions/max.md",
123
+ "solverfunctions/mean.md",
124
+ "solverfunctions/median.md",
125
+ "solverfunctions/min.md",
126
+ "solverfunctions/mode.md",
127
+ "solverfunctions/objectkeystoarray.md",
128
+ "solverfunctions/objectvaluessortbyexternalobjectarray.md",
129
+ "solverfunctions/objectvaluestoarray.md",
130
+ "solverfunctions/percent.md",
131
+ "solverfunctions/pi.md",
132
+ "solverfunctions/polynomialregression.md",
133
+ "solverfunctions/predict.md",
134
+ "solverfunctions/rad.md",
135
+ "solverfunctions/randomfloat.md",
136
+ "solverfunctions/randomfloatbetween.md",
137
+ "solverfunctions/randomfloatupto.md",
138
+ "solverfunctions/randominteger.md",
139
+ "solverfunctions/randomintegerbetween.md",
140
+ "solverfunctions/randomintegerupto.md",
141
+ "solverfunctions/refreshtabularsection.md",
142
+ "solverfunctions/resolvehtmlentities.md",
143
+ "solverfunctions/round.md",
144
+ "solverfunctions/runsolvers.md",
145
+ "solverfunctions/setconcatenate.md",
146
+ "solverfunctions/setgroupvisibility.md",
147
+ "solverfunctions/setsectionvisibility.md",
148
+ "solverfunctions/setsolverordinalenabled.md",
149
+ "solverfunctions/settabularrowlength.md",
150
+ "solverfunctions/setvalue.md",
151
+ "solverfunctions/showsections.md",
152
+ "solverfunctions/sin.md",
153
+ "solverfunctions/slice.md",
154
+ "solverfunctions/smallestinset.md",
155
+ "solverfunctions/sortarray.md",
156
+ "solverfunctions/sorthistogram.md",
157
+ "solverfunctions/sorthistogrambykeys.md",
158
+ "solverfunctions/sortset.md",
159
+ "solverfunctions/sqrt.md",
160
+ "solverfunctions/stdev.md",
161
+ "solverfunctions/stdeva.md",
162
+ "solverfunctions/stdevp.md",
163
+ "solverfunctions/stringcountsegments.md",
164
+ "solverfunctions/stringgetsegments.md",
165
+ "solverfunctions/subtractingsummation.md",
166
+ "solverfunctions/sum.md",
167
+ "solverfunctions/tan.md",
168
+ "solverfunctions/tofixed.md",
169
+ "solverfunctions/unionarrays.md",
170
+ "solverfunctions/uniquearray.md",
171
+ "solverfunctions/var.md",
172
+ "solverfunctions/vara.md",
173
+ "solverfunctions/varp.md",
174
+ "solverfunctions/when.md"
175
+ ]
176
+ }
177
+ ]
178
+ },
179
+ {
180
+ "Name": "Source",
181
+ "Key": "source",
182
+ "Description": "",
183
+ "Modules": [
184
+ {
185
+ "Name": "providers",
186
+ "Repo": "providers",
187
+ "Group": "source",
188
+ "Branch": "master",
189
+ "HasDocs": false,
190
+ "HasCover": false,
191
+ "Sidebar": [],
192
+ "DocFiles": []
193
+ },
194
+ {
195
+ "Name": "views",
196
+ "Repo": "views",
197
+ "Group": "source",
198
+ "Branch": "master",
199
+ "HasDocs": false,
200
+ "HasCover": false,
201
+ "Sidebar": [],
202
+ "DocFiles": []
203
+ }
204
+ ]
205
+ },
206
+ {
207
+ "Name": "User-documentation",
208
+ "Key": "user-documentation",
209
+ "Description": "",
210
+ "Modules": [
211
+ {
212
+ "Name": "solverfunctions",
213
+ "Repo": "solverfunctions",
214
+ "Group": "user-documentation",
215
+ "Branch": "master",
216
+ "HasDocs": false,
217
+ "HasCover": false,
218
+ "Sidebar": [],
219
+ "DocFiles": []
220
+ }
221
+ ]
222
+ }
223
+ ]
224
+ }