@saltcorn/markup 0.6.2-beta.2 → 0.6.2

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 (60) hide show
  1. package/dist/builder.d.ts +18 -0
  2. package/dist/builder.d.ts.map +1 -0
  3. package/dist/builder.js +57 -0
  4. package/dist/builder.js.map +1 -0
  5. package/dist/emergency_layout.d.ts +6 -0
  6. package/dist/emergency_layout.d.ts.map +1 -0
  7. package/dist/emergency_layout.js +38 -0
  8. package/dist/emergency_layout.js.map +1 -0
  9. package/dist/form.d.ts +12 -0
  10. package/dist/form.d.ts.map +1 -0
  11. package/dist/form.js +372 -0
  12. package/dist/form.js.map +1 -0
  13. package/dist/helpers.d.ts +58 -0
  14. package/dist/helpers.d.ts.map +1 -0
  15. package/dist/helpers.js +169 -0
  16. package/dist/helpers.js.map +1 -0
  17. package/dist/index.d.ts +21 -0
  18. package/dist/index.d.ts.map +1 -0
  19. package/dist/index.js +158 -0
  20. package/dist/index.js.map +1 -0
  21. package/dist/layout.d.ts +22 -0
  22. package/dist/layout.d.ts.map +1 -0
  23. package/dist/layout.js +338 -0
  24. package/dist/layout.js.map +1 -0
  25. package/dist/layout_utils.d.ts +21 -0
  26. package/dist/layout_utils.d.ts.map +1 -0
  27. package/dist/layout_utils.js +272 -0
  28. package/dist/layout_utils.js.map +1 -0
  29. package/dist/mktag.d.ts +12 -0
  30. package/dist/mktag.d.ts.map +1 -0
  31. package/dist/mktag.js +100 -0
  32. package/dist/mktag.js.map +1 -0
  33. package/dist/table.d.ts +22 -0
  34. package/dist/table.d.ts.map +1 -0
  35. package/dist/table.js +51 -0
  36. package/dist/table.js.map +1 -0
  37. package/dist/tabs.d.ts +7 -0
  38. package/dist/tabs.d.ts.map +1 -0
  39. package/dist/tabs.js +34 -0
  40. package/dist/tabs.js.map +1 -0
  41. package/dist/tags.d.ts +17 -0
  42. package/dist/tags.d.ts.map +1 -0
  43. package/dist/tags.js +71 -0
  44. package/dist/tags.js.map +1 -0
  45. package/dist/tsconfig.ref.tsbuildinfo +1 -0
  46. package/package.json +25 -6
  47. package/builder.js +0 -101
  48. package/emergency_layout.js +0 -54
  49. package/form.js +0 -603
  50. package/form.test.js +0 -98
  51. package/helpers.js +0 -268
  52. package/index.js +0 -226
  53. package/layout.js +0 -590
  54. package/layout.test.js +0 -39
  55. package/layout_utils.js +0 -394
  56. package/markup.test.js +0 -104
  57. package/mktag.js +0 -105
  58. package/table.js +0 -115
  59. package/tabs.js +0 -54
  60. package/tags.js +0 -56
package/dist/layout.js ADDED
@@ -0,0 +1,338 @@
1
+ "use strict";
2
+ const tags = require("./tags");
3
+ const { div, a, span, text, img, p, h1, h2, h3, h4, h5, h6, label, ul, button, li, i, genericElement, } = tags;
4
+ const { alert, breadcrumbs } = require("./layout_utils");
5
+ const helpers = require("./helpers");
6
+ const { search_bar } = helpers;
7
+ /**
8
+ * @param {any|any[]} [alerts]
9
+ * @returns {boolean}
10
+ */
11
+ const couldHaveAlerts = (alerts) => alerts || Array.isArray(alerts);
12
+ /**
13
+ * @param {string|any} body
14
+ * @param {object[]} [alerts]
15
+ * @returns {object}
16
+ */
17
+ const makeSegments = (body, alerts) => {
18
+ const alertsSegments = couldHaveAlerts(alerts)
19
+ ? [
20
+ {
21
+ type: "blank",
22
+ contents: div({ id: "alerts-area" }, (alerts || []).map((a) => alert(a.type, a.msg))),
23
+ },
24
+ ]
25
+ : [];
26
+ if (typeof body === "string")
27
+ return {
28
+ above: [...alertsSegments, { type: "blank", contents: body }],
29
+ };
30
+ else if (body.above) {
31
+ if (couldHaveAlerts(alerts))
32
+ body.above.unshift(alertsSegments[0]);
33
+ return body;
34
+ }
35
+ else
36
+ return { above: [...alertsSegments, body] };
37
+ };
38
+ /**
39
+ *
40
+ * @param {any} segment
41
+ * @param {string} inner
42
+ * @returns {div|span|string}
43
+ */
44
+ const applyTextStyle = (segment, inner) => {
45
+ let style = segment.font ? { fontFamily: segment.font } : {};
46
+ switch (segment.textStyle) {
47
+ case "h1":
48
+ return h1(style, inner);
49
+ case "h2":
50
+ return h2(style, inner);
51
+ case "h3":
52
+ return h3(style, inner);
53
+ case "h4":
54
+ return h4(style, inner);
55
+ case "h5":
56
+ return h5(style, inner);
57
+ case "h6":
58
+ return h6(style, inner);
59
+ default:
60
+ return segment.block
61
+ ? div({ class: segment.textStyle || "", style }, inner)
62
+ : segment.textStyle || segment.font
63
+ ? span({ class: segment.textStyle || "", style }, inner)
64
+ : inner;
65
+ }
66
+ };
67
+ /**
68
+ * @param {object} opts
69
+ * @param {object[]} opts.contents
70
+ * @param {string[]} opts.titles
71
+ * @param {string} opts.tabsStyle
72
+ * @param {*} opts.ntabs
73
+ * @param {independent} boolean
74
+ * @param {function} go
75
+ * @returns {ul_div}
76
+ */
77
+ const renderTabs = ({ contents, titles, tabsStyle, ntabs, independent }, go) => {
78
+ const rndid = `tab${Math.floor(Math.random() * 16777215).toString(16)}`;
79
+ if (tabsStyle === "Accordion")
80
+ return div({ class: "accordion", id: `${rndid}top` }, contents.map((t, ix) => div({ class: "card" }, div({ class: "card-header", id: `${rndid}head${ix}` }, h2({ class: "mb-0" }, button({
81
+ class: "btn btn-link btn-block text-left",
82
+ type: "button",
83
+ "data-toggle": "collapse",
84
+ "data-target": `#${rndid}tab${ix}`,
85
+ "aria-expanded": ix === 0 ? "true" : "false",
86
+ "aria-controls": `${rndid}tab${ix}`,
87
+ }, titles[ix]))), div({
88
+ class: ["collapse", ix === 0 && "show"],
89
+ id: `${rndid}tab${ix}`,
90
+ "aria-labelledby": `${rndid}head${ix}`,
91
+ "data-parent": independent ? undefined : `#${rndid}top`,
92
+ }, div({ class: "card-body" }, go(t, false, ix))))));
93
+ else
94
+ return (ul({
95
+ role: "tablist",
96
+ id: `${rndid}`,
97
+ class: `nav ${tabsStyle === "Tabs" ? "nav-tabs" : "nav-pills"}`,
98
+ }, contents.map((t, ix) => li({ class: "nav-item", role: "presentation" }, a({
99
+ class: ["nav-link", ix === 0 && "active"],
100
+ id: `${rndid}link${ix}`,
101
+ "data-toggle": "tab",
102
+ href: `#${rndid}tab${ix}`,
103
+ role: "tab",
104
+ "aria-controls": `${rndid}tab${ix}`,
105
+ "aria-selected": ix === 0 ? "true" : "false",
106
+ }, titles[ix])))) +
107
+ div({ class: "tab-content", id: `${rndid}content` }, contents.map((t, ix) => div({
108
+ class: ["tab-pane fade", ix === 0 && "show active"],
109
+ role: "tabpanel",
110
+ id: `${rndid}tab${ix}`,
111
+ "aria-labelledby": `${rndid}link${ix}`,
112
+ }, go(t, false, ix)))));
113
+ };
114
+ /**
115
+ * @param {object} opts
116
+ * @param {object} opts.blockDispatch
117
+ * @param {object|string} opts.layout
118
+ * @param {object} [opts.role]
119
+ * @param {object[]} [opts.alerts]
120
+ * @param {boolean} opts.is_owner
121
+ * @returns {string}
122
+ */
123
+ const render = ({ blockDispatch, layout, role, alerts, is_owner, }) => {
124
+ //console.log(JSON.stringify(layout, null, 2));
125
+ function wrap(segment, isTop, ix, inner) {
126
+ const iconTag = segment.icon ? i({ class: segment.icon }) + " " : "";
127
+ if (isTop && blockDispatch && blockDispatch.wrapTop)
128
+ return blockDispatch.wrapTop(segment, ix, inner);
129
+ else
130
+ return segment.labelFor
131
+ ? label({ for: `input${text(segment.labelFor)}` }, applyTextStyle(segment, iconTag + inner))
132
+ : applyTextStyle(segment, iconTag + inner);
133
+ }
134
+ function go(segment, isTop, ix) {
135
+ if (!segment)
136
+ return "";
137
+ if (typeof segment === "object" &&
138
+ Object.keys(segment).length === 0 &&
139
+ segment.constructor === Object)
140
+ return "";
141
+ if (typeof segment === "string")
142
+ return wrap(segment, isTop, ix, segment);
143
+ if (Array.isArray(segment))
144
+ return wrap(segment, isTop, ix, segment.map((s, jx) => go(s, isTop, jx + ix)).join(""));
145
+ if (segment.minRole && role > segment.minRole)
146
+ return "";
147
+ if (segment.type && blockDispatch && blockDispatch[segment.type]) {
148
+ return wrap(segment, isTop, ix, blockDispatch[segment.type](segment, go));
149
+ }
150
+ if (segment.type === "blank") {
151
+ return wrap(segment, isTop, ix, segment.contents || "");
152
+ }
153
+ if (segment.type === "breadcrumbs") {
154
+ return wrap(segment, isTop, ix, breadcrumbs(segment.crumbs || [], segment.right));
155
+ }
156
+ if (segment.type === "view") {
157
+ return wrap(segment, isTop, ix, segment.contents || "");
158
+ }
159
+ if (segment.type === "pageHeader") {
160
+ return wrap(segment, isTop, ix, h1(segment.title) + p(segment.blurb || ""));
161
+ }
162
+ if (segment.type === "image") {
163
+ const srctype = segment.srctype || "File";
164
+ return wrap(segment, isTop, ix, img({
165
+ class: "w-100",
166
+ alt: segment.alt,
167
+ src: srctype === "File" ? `/files/serve/${segment.fileid}` : segment.url,
168
+ }));
169
+ }
170
+ if (segment.type === "link") {
171
+ let style = segment.link_style === "btn btn-custom-color"
172
+ ? `background-color: ${segment.link_bgcol || "#000000"};border-color: ${segment.link_bordercol || "#000000"}; color: ${segment.link_textcol || "#000000"}`
173
+ : null;
174
+ return wrap(segment, isTop, ix, a({
175
+ href: segment.url,
176
+ class: [segment.link_style || "", segment.link_size || ""],
177
+ target: segment.target_blank ? "_blank" : false,
178
+ rel: segment.nofollow ? "nofollow" : false,
179
+ style,
180
+ }, segment.link_icon ? i({ class: segment.link_icon }) + " " : "", segment.text));
181
+ }
182
+ if (segment.type === "card")
183
+ return wrap(segment, isTop, ix, div({
184
+ class: [
185
+ "card mt-4",
186
+ segment.shadow === false ? false : "shadow",
187
+ segment.class,
188
+ segment.url && "with-link",
189
+ ],
190
+ onclick: segment.url ? `location.href='${segment.url}'` : false,
191
+ style: segment.style,
192
+ }, segment.title &&
193
+ div({ class: "card-header" }, typeof segment.title === "string"
194
+ ? h6({ class: "m-0 font-weight-bold text-primary" }, segment.title)
195
+ : segment.title), segment.tabContents &&
196
+ div({ class: "card-header" }, ul({ class: "nav nav-tabs card-header-tabs" }, Object.keys(segment.tabContents).map((title, ix) => li({ class: "nav-item" }, a({
197
+ class: ["nav-link", ix === 0 && "active"],
198
+ href: `#tab-${title}`,
199
+ "data-toggle": "tab",
200
+ role: "tab",
201
+ }, title))))) +
202
+ div({
203
+ class: [
204
+ "card-body",
205
+ segment.bodyClass,
206
+ segment.noPadding && "p-0",
207
+ ],
208
+ }, div({ class: "tab-content", id: "myTabContent" }, Object.entries(segment.tabContents).map(([title, contents], ix) => div({
209
+ class: ["tab-pane", ix == 0 && "show active"],
210
+ id: `tab-${title}`,
211
+ }, contents)))), segment.contents &&
212
+ div({
213
+ class: [
214
+ "card-body",
215
+ segment.bodyClass,
216
+ segment.noPadding && "p-0",
217
+ ],
218
+ },
219
+ // @ts-ignore
220
+ go(segment.contents)),
221
+ // @ts-ignore
222
+ segment.footer && div({ class: "card-footer" }, go(segment.footer))));
223
+ if (segment.type === "tabs")
224
+ return wrap(segment, isTop, ix, renderTabs(segment, go));
225
+ if (segment.type === "container") {
226
+ const { bgFileId, bgType, bgColor, vAlign, hAlign, block, display, imageSize, borderWidth, borderStyle, setTextColor, textColor, showForRole, hide, customClass, customCSS, minScreenWidth, maxScreenWidth, showIfFormulaInputs, show_for_owner, borderDirection, borderRadius, borderRadiusUnit, borderColor, url, hoverColor, gradStartColor, gradEndColor, gradDirection, fullPageWidth, overflow, rotate, style, htmlElement, } = segment;
227
+ if (hide)
228
+ return "";
229
+ if (showForRole &&
230
+ showForRole[role] === false &&
231
+ !(show_for_owner && is_owner))
232
+ return "";
233
+ const renderBg = true;
234
+ const sizeProp = (segKey, cssNm, unit) => typeof segment[segKey] === "undefined"
235
+ ? ""
236
+ : `${cssNm}: ${segment[segKey]}${unit || segment[segKey + "Unit"] || "px"};`;
237
+ const ppCustomCSS = (s) => s ? s.split("\n").join("") + ";" : "";
238
+ const baseDisplayClass = block === false ? "inline-block" : display ? display : "block";
239
+ let displayClass = minScreenWidth
240
+ ? `d-none d-${minScreenWidth}-${baseDisplayClass}`
241
+ : baseDisplayClass === "block"
242
+ ? false // no need
243
+ : `d-${baseDisplayClass}`;
244
+ if (maxScreenWidth)
245
+ displayClass = `${displayClass} d-${maxScreenWidth}-none`;
246
+ const allZero = (xs) => xs.every((x) => +x === 0);
247
+ const ppBox = (what) => !segment[what] || allZero(segment[what])
248
+ ? ""
249
+ : `${what}: ${segment[what].map((p) => p + "px").join(" ")};`;
250
+ let flexStyles = "";
251
+ Object.keys(style || {}).forEach((k) => {
252
+ flexStyles += `${k}:${style[k]};`;
253
+ });
254
+ return wrap(segment, isTop, ix, genericElement(htmlElement || "div", {
255
+ class: [
256
+ customClass || false,
257
+ hAlign && `text-${hAlign}`,
258
+ vAlign === "middle" && "d-flex align-items-center",
259
+ vAlign === "bottom" && "d-flex align-items-end",
260
+ vAlign === "middle" &&
261
+ hAlign === "center" &&
262
+ "justify-content-center",
263
+ displayClass,
264
+ url && "with-link",
265
+ hoverColor && `hover-${hoverColor}`,
266
+ fullPageWidth && "full-page-width",
267
+ ],
268
+ onclick: segment.url ? `location.href='${segment.url}'` : false,
269
+ style: `${flexStyles}${ppCustomCSS(customCSS || "")}${sizeProp("minHeight", "min-height")}${sizeProp("height", "height")}${sizeProp("width", "width")}${sizeProp("widthPct", "width", "%")}border${borderDirection ? `-${borderDirection}` : ""}: ${borderWidth || 0}px ${borderStyle} ${borderColor || "black"};${sizeProp("borderRadius", "border-radius")}${ppBox("padding")}${ppBox("margin")}${overflow && overflow !== "visible"
270
+ ? ` overflow: ${overflow};`
271
+ : ""} ${renderBg && bgType === "Image" && bgFileId && +bgFileId
272
+ ? `background-image: url('/files/serve/${bgFileId}'); background-size: ${imageSize === "repeat" ? "auto" : imageSize || "contain"}; background-repeat: ${imageSize === "repeat" ? "repeat" : "no-repeat"};`
273
+ : ""} ${renderBg && bgType === "Color"
274
+ ? `background-color: ${bgColor};`
275
+ : ""} ${renderBg && bgType === "Gradient"
276
+ ? `background-image: linear-gradient(${gradDirection || 0}deg, ${gradStartColor}, ${gradEndColor});`
277
+ : ""} ${setTextColor ? `color: ${textColor};` : ""}${rotate ? `transform: rotate(${rotate}deg);` : ""}`,
278
+ ...(showIfFormulaInputs
279
+ ? {
280
+ "data-show-if": `showIfFormulaInputs(e, '${showIfFormulaInputs}')`,
281
+ }
282
+ : {}),
283
+ }, renderBg &&
284
+ bgType === "Image" &&
285
+ bgFileId &&
286
+ +bgFileId &&
287
+ div({ style: "display:none" }, img({
288
+ height: "1",
289
+ width: "1",
290
+ alt: "",
291
+ src: `/files/serve/${bgFileId}`,
292
+ })),
293
+ // @ts-ignore
294
+ go(segment.contents)));
295
+ }
296
+ if (segment.type === "line_break") {
297
+ return "<br />";
298
+ }
299
+ if (segment.type === "search_bar") {
300
+ return `<form action="/search" method="get">${search_bar("q", "", {
301
+ has_dropdown: segment.has_dropdown,
302
+ // @ts-ignore
303
+ contents: go(segment.contents),
304
+ })}</form>`;
305
+ }
306
+ if (segment.above) {
307
+ return segment.above
308
+ .map((s, ix) => go(s, isTop, ix))
309
+ .join("");
310
+ }
311
+ else if (segment.besides) {
312
+ const defwidth = Math.round(12 / segment.besides.length);
313
+ const cardDeck = segment.besides.every((s) => s && s.type === "card") &&
314
+ (!segment.widths || segment.widths.every((w) => w === defwidth));
315
+ let markup;
316
+ if (cardDeck)
317
+ markup = div({ class: "card-deck" }, segment.besides.map((t, ixb) => go(t, false, ixb)));
318
+ else
319
+ markup = div({ class: "row w-100" }, segment.besides.map((t, ixb) => div({
320
+ class: segment.widths === false
321
+ ? ""
322
+ : `col-${segment.breakpoint
323
+ ? segment.breakpoint + "-"
324
+ : segment.breakpoints && segment.breakpoints[ixb]
325
+ ? segment.breakpoints[ixb] + "-"
326
+ : ""}${segment.widths ? segment.widths[ixb] : defwidth}${segment.aligns ? " text-" + segment.aligns[ixb] : ""}`,
327
+ }, go(t, false, ixb))));
328
+ return isTop ? wrap(segment, isTop, ix, markup) : markup;
329
+ }
330
+ else
331
+ throw new Error("unknown layout segment" + JSON.stringify(segment));
332
+ }
333
+ return go(makeSegments(layout, alerts), true, 0);
334
+ };
335
+ // declaration merging
336
+ const LayoutExports = render;
337
+ module.exports = LayoutExports;
338
+ //# sourceMappingURL=layout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layout.js","sourceRoot":"","sources":["../layout.ts"],"names":[],"mappings":";AAAA,+BAAgC;AAChC,MAAM,EACJ,GAAG,EACH,CAAC,EACD,IAAI,EACJ,IAAI,EACJ,GAAG,EACH,CAAC,EACD,EAAE,EACF,EAAE,EACF,EAAE,EACF,EAAE,EACF,EAAE,EACF,EAAE,EACF,KAAK,EACL,EAAE,EACF,MAAM,EACN,EAAE,EACF,CAAC,EACD,cAAc,GACf,GAAG,IAAI,CAAC;AACT,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;AAEzD,qCAAsC;AACtC,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;AAG/B;;;GAGG;AACH,MAAM,eAAe,GAAG,CAAC,MAAoB,EAAW,EAAE,CACxD,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;AAElC;;;;GAIG;AACH,MAAM,YAAY,GAAG,CAAC,IAAkB,EAAE,MAAa,EAAO,EAAE;IAC9D,MAAM,cAAc,GAAG,eAAe,CAAC,MAAM,CAAC;QAC5C,CAAC,CAAC;YACE;gBACE,IAAI,EAAE,OAAO;gBACb,QAAQ,EAAE,GAAG,CACX,EAAE,EAAE,EAAE,aAAa,EAAE,EACrB,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CACrD;aACF;SACF;QACH,CAAC,CAAC,EAAE,CAAC;IAEP,IAAI,OAAO,IAAI,KAAK,QAAQ;QAC1B,OAAO;YACL,KAAK,EAAE,CAAC,GAAG,cAAc,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;SAC9D,CAAC;SACC,IAAI,IAAI,CAAC,KAAK,EAAE;QACnB,IAAI,eAAe,CAAC,MAAM,CAAC;YAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;QACnE,OAAO,IAAI,CAAC;KACb;;QAAM,OAAO,EAAE,KAAK,EAAE,CAAC,GAAG,cAAc,EAAE,IAAI,CAAC,EAAE,CAAC;AACrD,CAAC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,cAAc,GAAG,CAAC,OAAY,EAAE,KAAa,EAAU,EAAE;IAC7D,IAAI,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7D,QAAQ,OAAO,CAAC,SAAS,EAAE;QACzB,KAAK,IAAI;YACP,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAC1B,KAAK,IAAI;YACP,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAC1B,KAAK,IAAI;YACP,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAC1B,KAAK,IAAI;YACP,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAC1B,KAAK,IAAI;YACP,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAC1B,KAAK,IAAI;YACP,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAC1B;YACE,OAAO,OAAO,CAAC,KAAK;gBAClB,CAAC,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,SAAS,IAAI,EAAE,EAAE,KAAK,EAAE,EAAE,KAAK,CAAC;gBACvD,CAAC,CAAC,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,IAAI;oBACnC,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,SAAS,IAAI,EAAE,EAAE,KAAK,EAAE,EAAE,KAAK,CAAC;oBACxD,CAAC,CAAC,KAAK,CAAC;KACb;AACH,CAAC,CAAC;AAcF;;;;;;;;;GASG;AACH,MAAM,UAAU,GAAG,CACjB,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,WAAW,EAAkB,EACnE,EAAqD,EACrD,EAAE;IACF,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,QAAQ,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;IACxE,IAAI,SAAS,KAAK,WAAW;QAC3B,OAAO,GAAG,CACR,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,EAAE,GAAG,KAAK,KAAK,EAAE,EACzC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CACrB,GAAG,CACD,EAAE,KAAK,EAAE,MAAM,EAAE,EACjB,GAAG,CACD,EAAE,KAAK,EAAE,aAAa,EAAE,EAAE,EAAE,GAAG,KAAK,OAAO,EAAE,EAAE,EAAE,EACjD,EAAE,CACA,EAAE,KAAK,EAAE,MAAM,EAAE,EACjB,MAAM,CACJ;YACE,KAAK,EAAE,kCAAkC;YACzC,IAAI,EAAE,QAAQ;YACd,aAAa,EAAE,UAAU;YACzB,aAAa,EAAE,IAAI,KAAK,MAAM,EAAE,EAAE;YAClC,eAAe,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO;YAC5C,eAAe,EAAE,GAAG,KAAK,MAAM,EAAE,EAAE;SACpC,EACD,MAAM,CAAC,EAAE,CAAC,CACX,CACF,CACF,EACD,GAAG,CACD;YACE,KAAK,EAAE,CAAC,UAAU,EAAE,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC;YACvC,EAAE,EAAE,GAAG,KAAK,MAAM,EAAE,EAAE;YACtB,iBAAiB,EAAE,GAAG,KAAK,OAAO,EAAE,EAAE;YACtC,aAAa,EAAE,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK;SACxD,EACD,GAAG,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,CAC9C,CACF,CACF,CACF,CAAC;;QAEF,OAAO,CACL,EAAE,CACA;YACE,IAAI,EAAE,SAAS;YACf,EAAE,EAAE,GAAG,KAAK,EAAE;YACd,KAAK,EAAE,OAAO,SAAS,KAAK,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,WAAW,EAAE;SAChE,EACD,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CACrB,EAAE,CACA,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,cAAc,EAAE,EAC3C,CAAC,CACC;YACE,KAAK,EAAE,CAAC,UAAU,EAAE,EAAE,KAAK,CAAC,IAAI,QAAQ,CAAC;YACzC,EAAE,EAAE,GAAG,KAAK,OAAO,EAAE,EAAE;YACvB,aAAa,EAAE,KAAK;YACpB,IAAI,EAAE,IAAI,KAAK,MAAM,EAAE,EAAE;YACzB,IAAI,EAAE,KAAK;YACX,eAAe,EAAE,GAAG,KAAK,MAAM,EAAE,EAAE;YACnC,eAAe,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO;SAC7C,EACD,MAAM,CAAC,EAAE,CAAC,CACX,CACF,CACF,CACF;YACD,GAAG,CACD,EAAE,KAAK,EAAE,aAAa,EAAE,EAAE,EAAE,GAAG,KAAK,SAAS,EAAE,EAC/C,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CACrB,GAAG,CACD;gBACE,KAAK,EAAE,CAAC,eAAe,EAAE,EAAE,KAAK,CAAC,IAAI,aAAa,CAAC;gBACnD,IAAI,EAAE,UAAU;gBAChB,EAAE,EAAE,GAAG,KAAK,MAAM,EAAE,EAAE;gBACtB,iBAAiB,EAAE,GAAG,KAAK,OAAO,EAAE,EAAE;aACvC,EACD,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,CACjB,CACF,CACF,CACF,CAAC;AACN,CAAC,CAAC;AAcF;;;;;;;;GAQG;AACH,MAAM,MAAM,GAAG,CAAC,EACd,aAAa,EACb,MAAM,EACN,IAAI,EACJ,MAAM,EACN,QAAQ,GACG,EAAU,EAAE;IACvB,+CAA+C;IAC/C,SAAS,IAAI,CAAC,OAAY,EAAE,KAAc,EAAE,EAAO,EAAE,KAAa;QAChE,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1E,IAAI,KAAK,IAAI,aAAa,IAAI,aAAa,CAAC,OAAO;YACjD,OAAO,aAAa,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC;;YAEjD,OAAO,OAAO,CAAC,QAAQ;gBACrB,CAAC,CAAC,KAAK,CACH,EAAE,GAAG,EAAE,QAAQ,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,EACzC,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,KAAK,CAAC,CACzC;gBACH,CAAC,CAAC,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,KAAK,CAAC,CAAC;IACjD,CAAC;IACD,SAAS,EAAE,CAAC,OAAY,EAAE,KAAc,EAAE,EAAO;QAC/C,IAAI,CAAC,OAAO;YAAE,OAAO,EAAE,CAAC;QACxB,IACE,OAAO,OAAO,KAAK,QAAQ;YAC3B,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC;YACjC,OAAO,CAAC,WAAW,KAAK,MAAM;YAE9B,OAAO,EAAE,CAAC;QACZ,IAAI,OAAO,OAAO,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;QAC1E,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;YACxB,OAAO,IAAI,CACT,OAAO,EACP,KAAK,EACL,EAAE,EACF,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CACvD,CAAC;QACJ,IAAI,OAAO,CAAC,OAAO,IAAI,IAAI,GAAG,OAAO,CAAC,OAAO;YAAE,OAAO,EAAE,CAAC;QACzD,IAAI,OAAO,CAAC,IAAI,IAAI,aAAa,IAAI,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;YAChE,OAAO,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;SAC3E;QACD,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,EAAE;YAC5B,OAAO,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;SACzD;QACD,IAAI,OAAO,CAAC,IAAI,KAAK,aAAa,EAAE;YAClC,OAAO,IAAI,CACT,OAAO,EACP,KAAK,EACL,EAAE,EACF,WAAW,CAAC,OAAO,CAAC,MAAM,IAAI,EAAE,EAAE,OAAO,CAAC,KAAK,CAAC,CACjD,CAAC;SACH;QACD,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE;YAC3B,OAAO,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;SACzD;QACD,IAAI,OAAO,CAAC,IAAI,KAAK,YAAY,EAAE;YACjC,OAAO,IAAI,CACT,OAAO,EACP,KAAK,EACL,EAAE,EACF,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC,CAC3C,CAAC;SACH;QACD,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,EAAE;YAC5B,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,MAAM,CAAC;YAC1C,OAAO,IAAI,CACT,OAAO,EACP,KAAK,EACL,EAAE,EACF,GAAG,CAAC;gBACF,KAAK,EAAE,OAAO;gBACd,GAAG,EAAE,OAAO,CAAC,GAAG;gBAChB,GAAG,EACD,OAAO,KAAK,MAAM,CAAC,CAAC,CAAC,gBAAgB,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG;aACtE,CAAC,CACH,CAAC;SACH;QACD,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE;YAC3B,IAAI,KAAK,GACP,OAAO,CAAC,UAAU,KAAK,sBAAsB;gBAC3C,CAAC,CAAC,qBACE,OAAO,CAAC,UAAU,IAAI,SACxB,kBAAkB,OAAO,CAAC,cAAc,IAAI,SAAS,YACnD,OAAO,CAAC,YAAY,IAAI,SAC1B,EAAE;gBACJ,CAAC,CAAC,IAAI,CAAC;YACX,OAAO,IAAI,CACT,OAAO,EACP,KAAK,EACL,EAAE,EACF,CAAC,CACC;gBACE,IAAI,EAAE,OAAO,CAAC,GAAG;gBACjB,KAAK,EAAE,CAAC,OAAO,CAAC,UAAU,IAAI,EAAE,EAAE,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC;gBAC1D,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK;gBAC/C,GAAG,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK;gBAC1C,KAAK;aACN,EACD,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,EAAE,EACnE,OAAO,CAAC,IAAI,CACb,CACF,CAAC;SACH;QACD,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM;YACzB,OAAO,IAAI,CACT,OAAO,EACP,KAAK,EACL,EAAE,EACF,GAAG,CACD;gBACE,KAAK,EAAE;oBACL,WAAW;oBACX,OAAO,CAAC,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ;oBAC3C,OAAO,CAAC,KAAK;oBACb,OAAO,CAAC,GAAG,IAAI,WAAW;iBAC3B;gBACD,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,kBAAkB,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK;gBAC/D,KAAK,EAAE,OAAO,CAAC,KAAK;aACrB,EACD,OAAO,CAAC,KAAK;gBACX,GAAG,CACD,EAAE,KAAK,EAAE,aAAa,EAAE,EACxB,OAAO,OAAO,CAAC,KAAK,KAAK,QAAQ;oBAC/B,CAAC,CAAC,EAAE,CACA,EAAE,KAAK,EAAE,mCAAmC,EAAE,EAC9C,OAAO,CAAC,KAAK,CACd;oBACH,CAAC,CAAC,OAAO,CAAC,KAAK,CAClB,EACH,OAAO,CAAC,WAAW;gBACjB,GAAG,CACD,EAAE,KAAK,EAAE,aAAa,EAAE,EACxB,EAAE,CACA,EAAE,KAAK,EAAE,+BAA+B,EAAE,EAC1C,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,CACjD,EAAE,CACA,EAAE,KAAK,EAAE,UAAU,EAAE,EACrB,CAAC,CACC;oBACE,KAAK,EAAE,CAAC,UAAU,EAAE,EAAE,KAAK,CAAC,IAAI,QAAQ,CAAC;oBACzC,IAAI,EAAE,QAAQ,KAAK,EAAE;oBACrB,aAAa,EAAE,KAAK;oBACpB,IAAI,EAAE,KAAK;iBACZ,EACD,KAAK,CACN,CACF,CACF,CACF,CACF;oBACC,GAAG,CACD;wBACE,KAAK,EAAE;4BACL,WAAW;4BACX,OAAO,CAAC,SAAS;4BACjB,OAAO,CAAC,SAAS,IAAI,KAAK;yBAC3B;qBACF,EACD,GAAG,CACD,EAAE,KAAK,EAAE,aAAa,EAAE,EAAE,EAAE,cAAc,EAAE,EAC5C,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,GAAG,CACrC,CAAC,CAAC,KAAK,EAAE,QAAQ,CAAC,EAAE,EAAE,EAAE,EAAE,CACxB,GAAG,CACD;wBACE,KAAK,EAAE,CAAC,UAAU,EAAE,EAAE,IAAI,CAAC,IAAI,aAAa,CAAC;wBAC7C,EAAE,EAAE,OAAO,KAAK,EAAE;qBACnB,EACD,QAAQ,CACT,CACJ,CACF,CACF,EACL,OAAO,CAAC,QAAQ;gBACd,GAAG,CACD;oBACE,KAAK,EAAE;wBACL,WAAW;wBACX,OAAO,CAAC,SAAS;wBACjB,OAAO,CAAC,SAAS,IAAI,KAAK;qBAC3B;iBACF;gBACD,aAAa;gBACb,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CACrB;YACH,aAAa;YACb,OAAO,CAAC,MAAM,IAAI,GAAG,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CACpE,CACF,CAAC;QACJ,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM;YACzB,OAAO,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;QAC3D,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW,EAAE;YAChC,MAAM,EACJ,QAAQ,EACR,MAAM,EACN,OAAO,EACP,MAAM,EACN,MAAM,EACN,KAAK,EACL,OAAO,EACP,SAAS,EACT,WAAW,EACX,WAAW,EACX,YAAY,EACZ,SAAS,EACT,WAAW,EACX,IAAI,EACJ,WAAW,EACX,SAAS,EACT,cAAc,EACd,cAAc,EACd,mBAAmB,EACnB,cAAc,EACd,eAAe,EACf,YAAY,EACZ,gBAAgB,EAChB,WAAW,EACX,GAAG,EACH,UAAU,EACV,cAAc,EACd,YAAY,EACZ,aAAa,EACb,aAAa,EACb,QAAQ,EACR,MAAM,EACN,KAAK,EACL,WAAW,GACZ,GAAG,OAAO,CAAC;YACZ,IAAI,IAAI;gBAAE,OAAO,EAAE,CAAC;YACpB,IACE,WAAW;gBACX,WAAW,CAAC,IAAI,CAAC,KAAK,KAAK;gBAC3B,CAAC,CAAC,cAAc,IAAI,QAAQ,CAAC;gBAE7B,OAAO,EAAE,CAAC;YACZ,MAAM,QAAQ,GAAG,IAAI,CAAC;YACtB,MAAM,QAAQ,GAAG,CAAC,MAAc,EAAE,KAAa,EAAE,IAAa,EAAE,EAAE,CAChE,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,WAAW;gBACpC,CAAC,CAAC,EAAE;gBACJ,CAAC,CAAC,GAAG,KAAK,KAAK,OAAO,CAAC,MAAM,CAAC,GAC1B,IAAI,IAAI,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC,IAAI,IACtC,GAAG,CAAC;YACV,MAAM,WAAW,GAAG,CAAC,CAAU,EAAE,EAAE,CACjC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YACxC,MAAM,gBAAgB,GACpB,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;YACjE,IAAI,YAAY,GAAG,cAAc;gBAC/B,CAAC,CAAC,YAAY,cAAc,IAAI,gBAAgB,EAAE;gBAClD,CAAC,CAAC,gBAAgB,KAAK,OAAO;oBAC9B,CAAC,CAAC,KAAK,CAAC,UAAU;oBAClB,CAAC,CAAC,KAAK,gBAAgB,EAAE,CAAC;YAC5B,IAAI,cAAc;gBAChB,YAAY,GAAG,GAAG,YAAY,MAAM,cAAc,OAAO,CAAC;YAC5D,MAAM,OAAO,GAAG,CAAC,EAAO,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;YAC/D,MAAM,KAAK,GAAG,CAAC,IAAY,EAAE,EAAE,CAC7B,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;gBACtC,CAAC,CAAC,EAAE;gBACJ,CAAC,CAAC,GAAG,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;YAC1E,IAAI,UAAU,GAAG,EAAE,CAAC;YACpB,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;gBACrC,UAAU,IAAI,GAAG,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC;YACpC,CAAC,CAAC,CAAC;YACH,OAAO,IAAI,CACT,OAAO,EACP,KAAK,EACL,EAAE,EACF,cAAc,CACZ,WAAW,IAAI,KAAK,EACpB;gBACE,KAAK,EAAE;oBACL,WAAW,IAAI,KAAK;oBACpB,MAAM,IAAI,QAAQ,MAAM,EAAE;oBAC1B,MAAM,KAAK,QAAQ,IAAI,2BAA2B;oBAClD,MAAM,KAAK,QAAQ,IAAI,wBAAwB;oBAC/C,MAAM,KAAK,QAAQ;wBACjB,MAAM,KAAK,QAAQ;wBACnB,wBAAwB;oBAC1B,YAAY;oBACZ,GAAG,IAAI,WAAW;oBAClB,UAAU,IAAI,SAAS,UAAU,EAAE;oBACnC,aAAa,IAAI,iBAAiB;iBACnC;gBACD,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,kBAAkB,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK;gBAE/D,KAAK,EAAE,GAAG,UAAU,GAAG,WAAW,CAAC,SAAS,IAAI,EAAE,CAAC,GAAG,QAAQ,CAC5D,WAAW,EACX,YAAY,CACb,GAAG,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,GAAG,QAAQ,CACzC,OAAO,EACP,OAAO,CACR,GAAG,QAAQ,CAAC,UAAU,EAAE,OAAO,EAAE,GAAG,CAAC,SACpC,eAAe,CAAC,CAAC,CAAC,IAAI,eAAe,EAAE,CAAC,CAAC,CAAC,EAC5C,KAAK,WAAW,IAAI,CAAC,MAAM,WAAW,IACpC,WAAW,IAAI,OACjB,IAAI,QAAQ,CAAC,cAAc,EAAE,eAAe,CAAC,GAAG,KAAK,CACnD,SAAS,CACV,GAAG,KAAK,CAAC,QAAQ,CAAC,GACjB,QAAQ,IAAI,QAAQ,KAAK,SAAS;oBAChC,CAAC,CAAC,cAAc,QAAQ,GAAG;oBAC3B,CAAC,CAAC,EACN,IACE,QAAQ,IAAI,MAAM,KAAK,OAAO,IAAI,QAAQ,IAAI,CAAC,QAAQ;oBACrD,CAAC,CAAC,uCAAuC,QAAQ,wBAC7C,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,IAAI,SACjD,wBACE,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,WACtC,GAAG;oBACL,CAAC,CAAC,EACN,IACE,QAAQ,IAAI,MAAM,KAAK,OAAO;oBAC5B,CAAC,CAAC,qBAAqB,OAAO,GAAG;oBACjC,CAAC,CAAC,EACN,IACE,QAAQ,IAAI,MAAM,KAAK,UAAU;oBAC/B,CAAC,CAAC,qCACE,aAAa,IAAI,CACnB,QAAQ,cAAc,KAAK,YAAY,IAAI;oBAC7C,CAAC,CAAC,EACN,IAAI,YAAY,CAAC,CAAC,CAAC,UAAU,SAAS,GAAG,CAAC,CAAC,CAAC,EAAE,GAC5C,MAAM,CAAC,CAAC,CAAC,qBAAqB,MAAM,OAAO,CAAC,CAAC,CAAC,EAChD,EAAE;gBACF,GAAG,CAAC,mBAAmB;oBACrB,CAAC,CAAC;wBACE,cAAc,EAAE,2BAA2B,mBAAmB,IAAI;qBACnE;oBACH,CAAC,CAAC,EAAE,CAAC;aACR,EACD,QAAQ;gBACN,MAAM,KAAK,OAAO;gBAClB,QAAQ;gBACR,CAAC,QAAQ;gBACT,GAAG,CACD,EAAE,KAAK,EAAE,cAAc,EAAE,EACzB,GAAG,CAAC;oBACF,MAAM,EAAE,GAAG;oBACX,KAAK,EAAE,GAAG;oBACV,GAAG,EAAE,EAAE;oBACP,GAAG,EAAE,gBAAgB,QAAQ,EAAE;iBAChC,CAAC,CACH;YACH,aAAa;YACb,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CACrB,CACF,CAAC;SACH;QAED,IAAI,OAAO,CAAC,IAAI,KAAK,YAAY,EAAE;YACjC,OAAO,QAAQ,CAAC;SACjB;QACD,IAAI,OAAO,CAAC,IAAI,KAAK,YAAY,EAAE;YACjC,OAAO,uCAAuC,UAAU,CAAC,GAAG,EAAE,EAAE,EAAE;gBAChE,YAAY,EAAE,OAAO,CAAC,YAAY;gBAClC,aAAa;gBACb,QAAQ,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC;aAC/B,CAAC,SAAS,CAAC;SACb;QACD,IAAI,OAAO,CAAC,KAAK,EAAE;YACjB,OAAO,OAAO,CAAC,KAAK;iBACjB,GAAG,CAAC,CAAC,CAAM,EAAE,EAAU,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;iBAC7C,IAAI,CAAC,EAAE,CAAC,CAAC;SACb;aAAM,IAAI,OAAO,CAAC,OAAO,EAAE;YAC1B,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YACzD,MAAM,QAAQ,GACZ,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC;gBACzD,CAAC,CAAC,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC;YACxE,IAAI,MAAM,CAAC;YACX,IAAI,QAAQ;gBACV,MAAM,GAAG,GAAG,CACV,EAAE,KAAK,EAAE,WAAW,EAAE,EACtB,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,GAAW,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,CAChE,CAAC;;gBAEF,MAAM,GAAG,GAAG,CACV,EAAE,KAAK,EAAE,WAAW,EAAE,EACtB,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,GAAW,EAAE,EAAE,CAC1C,GAAG,CACD;oBACE,KAAK,EACH,OAAO,CAAC,MAAM,KAAK,KAAK;wBACtB,CAAC,CAAC,EAAE;wBACJ,CAAC,CAAC,OACE,OAAO,CAAC,UAAU;4BAChB,CAAC,CAAC,OAAO,CAAC,UAAU,GAAG,GAAG;4BAC1B,CAAC,CAAC,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC;gCACjD,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,GAAG;gCAChC,CAAC,CAAC,EACN,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,GAChD,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EACpD,EAAE;iBACT,EACD,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,CAClB,CACF,CACF,CAAC;YACJ,OAAO,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;SAC1D;;YAAM,MAAM,IAAI,KAAK,CAAC,wBAAwB,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;IAC7E,CAAC;IACD,OAAO,EAAE,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AACnD,CAAC,CAAC;AAEF,sBAAsB;AACtB,MAAM,aAAa,GAAG,MAAM,CAAC;AAC7B,iBAAS,aAAa,CAAC"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * @category saltcorn-markup
3
+ * @module layout_utils
4
+ */
5
+ declare type LeftNavBarOpts = {
6
+ name: string;
7
+ logo: string;
8
+ };
9
+ declare const _default: {
10
+ navbar: (brand: LeftNavBarOpts, sections: any[], currentUrl: string, opts?: any) => string;
11
+ alert: (type: string, s: string) => string;
12
+ logit: (x: any, s: any) => any;
13
+ navbarSolidOnScroll: string;
14
+ breadcrumbs: (crumbs: any[], right: any) => string;
15
+ headersInHead: (headers: any[]) => string;
16
+ headersInBody: (headers: any[]) => string;
17
+ cardHeaderTabs: (tabList: any) => string;
18
+ mobileBottomNavBar: (currentUrl: string, sections: any[], cls?: string, clsLink?: string) => string;
19
+ };
20
+ export = _default;
21
+ //# sourceMappingURL=layout_utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layout_utils.d.ts","sourceRoot":"","sources":["../layout_utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAqOH,aAAK,cAAc,GAAG;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;;;;;;;;;;;;AAqOF,kBAUE"}
@@ -0,0 +1,272 @@
1
+ "use strict";
2
+ /**
3
+ * @category saltcorn-markup
4
+ * @module layout_utils
5
+ */
6
+ const tags = require("./tags");
7
+ const { ul, li, ol, a, span, hr, div, text, img, button, nav, script, domReady, footer, i, small, br, form, input, } = tags;
8
+ /**
9
+ * @param {string} item
10
+ * @returns {string}
11
+ */
12
+ const labelToId = (item) => text(item.replace(" ", ""));
13
+ /**
14
+ * @param {string} currentUrl
15
+ * @param {object} item
16
+ * @returns {boolean}
17
+ */
18
+ const active = (currentUrl, item) => (item.link && currentUrl.startsWith(item.link)) ||
19
+ (item.subitems &&
20
+ item.subitems.some((si) => si.link && currentUrl.startsWith(si.link)));
21
+ /**
22
+ * @param {object[]} [sections]
23
+ * @returns {object[]}
24
+ */
25
+ const innerSections = (sections) => {
26
+ var items = new Array();
27
+ (sections || []).forEach((section) => {
28
+ (section.items || []).forEach((item) => {
29
+ items.push(item);
30
+ });
31
+ });
32
+ return items;
33
+ };
34
+ /**
35
+ * @param {object} opts
36
+ * @param {string} opts.label
37
+ * @param {object[]} opts.subitems
38
+ * @param {string} [opts.icon]
39
+ * @param {boolean} opts.isUser
40
+ * @returns {li}
41
+ */
42
+ const navSubitems = ({ label, subitems, icon, isUser, }) => li({ class: "nav-item dropdown" }, a({
43
+ class: "nav-link dropdown-toggle",
44
+ href: "#",
45
+ id: `dropdown${labelToId(label)}`,
46
+ role: "button",
47
+ "data-toggle": "dropdown",
48
+ "aria-haspopup": "true",
49
+ "aria-expanded": "false",
50
+ }, icon ? i({ class: `fa-fw mr-05 ${icon}` }) : "", label), div({
51
+ class: ["dropdown-menu", isUser && "dropdown-menu-right"],
52
+ "aria-labelledby": `dropdown${labelToId(label)}`,
53
+ }, subitems.map((si) => a({ class: ["dropdown-item", si.style || ""], href: si.link }, si.icon ? i({ class: `fa-fw mr-05 ${si.icon}` }) : "", si.label))));
54
+ /**
55
+ * @param {string} currentUrl
56
+ * @param {object[]} sections
57
+ * @returns {div}
58
+ */
59
+ const rightNavBar = (currentUrl, sections) => div({ class: "collapse navbar-collapse", id: "navbarResponsive" }, ul({ class: "navbar-nav ml-auto my-2 my-lg-0" }, innerSections(sections).map((s) => s.location === "Mobile Bottom"
60
+ ? ""
61
+ : s.subitems
62
+ ? navSubitems(s)
63
+ : s.link
64
+ ? li({
65
+ class: ["nav-item", active(currentUrl, s) && "active"],
66
+ }, a({
67
+ class: ["nav-link js-scroll-trigger", s.style || ""],
68
+ href: text(s.link),
69
+ }, s.icon ? i({ class: `fa-fw mr-05 ${s.icon}` }) : "", text(s.label)))
70
+ : s.type === "Search"
71
+ ? li(form({
72
+ action: "/search",
73
+ class: "menusearch",
74
+ method: "get",
75
+ }, div({ class: "input-group search-bar" }, input({
76
+ type: "search",
77
+ class: "form-control search-bar pl-2 hasbl",
78
+ placeholder: s.label,
79
+ id: "inputq",
80
+ name: "q",
81
+ "aria-label": "Search",
82
+ "aria-describedby": "button-search-submit",
83
+ }), div({ class: "input-group-append" }, button({
84
+ class: "btn btn-outline-secondary search-bar",
85
+ type: "submit",
86
+ }, i({ class: "fas fa-search" }))))))
87
+ : "")));
88
+ /**
89
+ * @param {object[]} sections
90
+ * @returns {boolean}
91
+ */
92
+ const hasMobileItems = (sections) => innerSections(sections).some((s) => s.location === "Mobile Bottom");
93
+ /**
94
+ * @param {string} currentUrl
95
+ * @param {object[]} sections
96
+ * @param {string} [cls = ""]
97
+ * @param {string} [clsLink = ""]
98
+ * @returns {footer|string}
99
+ */
100
+ const mobileBottomNavBar = (currentUrl, sections, cls = "", clsLink = "") => hasMobileItems(sections)
101
+ ? footer({
102
+ class: "bs-mobile-nav-footer d-flex justify-content-around d-sm-flex d-md-none " +
103
+ cls,
104
+ }, innerSections(sections).map((s) => s.location !== "Mobile Bottom"
105
+ ? ""
106
+ : //: s.subitems
107
+ //? navSubitems(s)
108
+ s.link
109
+ ? div({
110
+ class: [
111
+ "mt-2 text-center",
112
+ active(currentUrl, s) ? "active" : "opacity-50",
113
+ ],
114
+ }, a({
115
+ class: [s.style || "", clsLink],
116
+ href: text(s.link),
117
+ }, s.icon ? i({ class: `fa-lg ${s.icon}` }) : "", br(), small(text(s.label))))
118
+ : ""))
119
+ : "";
120
+ /**
121
+ * @param {object} opts
122
+ * @param {string} opts.name
123
+ * @param {string} opts.logo
124
+ * @returns {string[]}
125
+ */
126
+ const leftNavBar = ({ name, logo }) => [
127
+ a({ class: "navbar-brand js-scroll-trigger", href: "/" }, logo &&
128
+ img({
129
+ src: logo,
130
+ width: "30",
131
+ height: "30",
132
+ class: "mx-1 d-inline-block align-top",
133
+ alt: "Logo",
134
+ loading: "lazy",
135
+ }), name),
136
+ button({
137
+ class: "navbar-toggler navbar-toggler-right",
138
+ type: "button",
139
+ "data-toggle": "collapse",
140
+ "data-target": "#navbarResponsive",
141
+ "aria-controls": "navbarResponsive",
142
+ "aria-expanded": "false",
143
+ "aria-label": "Toggle navigation",
144
+ }, span({ class: "navbar-toggler-icon" })),
145
+ ];
146
+ /**
147
+ * @param {object} brand
148
+ * @param {object[]} sections
149
+ * @param {string} currentUrl
150
+ * @param {object} opts
151
+ * @param {boolean} [opts.fixedTop = true]
152
+ * @returns {string}
153
+ */
154
+ const navbar = (brand, sections, currentUrl, opts = { fixedTop: true }) => nav({
155
+ class: `navbar navbar-expand-md ${opts.class || ""} ${opts.colorscheme ? opts.colorscheme.toLowerCase() : "navbar-light"} ${opts.fixedTop ? "fixed-top" : ""}`,
156
+ id: "mainNav",
157
+ }, div({ class: opts.fluid ? "container-fluid" : "container" }, leftNavBar(brand), rightNavBar(currentUrl, sections)));
158
+ /**
159
+ * @param {string} type
160
+ * @param {string} s
161
+ * @returns {string}
162
+ */
163
+ const alert = (type, s) => {
164
+ //console.log("alert", type, s,s.length)
165
+ const realtype = type === "error" ? "danger" : type;
166
+ return s && s.length > 0
167
+ ? `<div class="alert alert-${realtype} alert-dismissible fade show" role="alert">
168
+ ${text(s)}
169
+ <button type="button" class="close" data-dismiss="alert" aria-label="Close">
170
+ <span aria-hidden="true">&times;</span>
171
+ </button>
172
+ </div>`
173
+ : "";
174
+ };
175
+ /**
176
+ * @type {string}
177
+ */
178
+ const navbarSolidOnScroll = script(domReady(`$(window).scroll(function () {
179
+ if ($(window).scrollTop() >= 10) {
180
+ $('.navbar').css('background','white');
181
+ } else {
182
+ $('.navbar').css('background','transparent');
183
+ }
184
+ });`));
185
+ /**
186
+ * @param {object} x
187
+ * @param {object} s
188
+ * @returns {object}
189
+ */
190
+ const logit = (x, s) => {
191
+ if (s)
192
+ console.log(s, x);
193
+ else
194
+ console.log(x);
195
+ return x;
196
+ };
197
+ /**
198
+ * @param {number} len
199
+ * @returns {function}
200
+ */
201
+ const standardBreadcrumbItem = (len) => ({ href, text }, ix) => li({
202
+ class: ["breadcrumb-item", ix == len - 1 && "active"],
203
+ "aria-current": ix == len - 1 && "page",
204
+ }, href ? a({ href }, text) : text);
205
+ /**
206
+ * @param {object} opts
207
+ * @param {Workflow} opts.workflow
208
+ * @param {object} opts.step
209
+ * @returns {string}
210
+ */
211
+ const workflowBreadcrumbItem = ({ workflow, step, }) => workflow.steps
212
+ .map((wfstep, ix) => li({
213
+ class: [
214
+ "breadcrumb-item breadcrumb-workflow",
215
+ step.currentStep - 1 === ix && "active-step font-weight-bold",
216
+ ],
217
+ }, span(wfstep.name)))
218
+ .join("");
219
+ /**
220
+ * @param {object[]} crumbs
221
+ * @returns {string}
222
+ */
223
+ const breadcrumbs = (crumbs, right) => nav({ "aria-label": "breadcrumb" }, ol({ class: "breadcrumb" }, crumbs.map((c, ix) => c.workflow
224
+ ? workflowBreadcrumbItem(c)
225
+ : standardBreadcrumbItem(crumbs.length)(c, ix)), right ? li({ class: "ml-auto" }, right) : ""));
226
+ /**
227
+ * @param {object[]} headers
228
+ * @returns {string}
229
+ */
230
+ const headersInHead = (headers) => headers
231
+ .filter((h) => h.css)
232
+ .map((h) => `<link href="${h.css}" rel="stylesheet">`)
233
+ .join("") +
234
+ headers
235
+ .filter((h) => h.style)
236
+ .map((h) => `<style>${h.style}</style>`)
237
+ .join("") +
238
+ headers
239
+ .filter((h) => h.headerTag)
240
+ .map((h) => h.headerTag)
241
+ .join("");
242
+ /**
243
+ * @param {object[]} headers
244
+ * @returns {string}
245
+ */
246
+ const headersInBody = (headers) => headers
247
+ .filter((h) => h.script)
248
+ .map((h) => `<script src="${h.script}" ${h.integrity
249
+ ? `integrity="${h.integrity}" crossorigin="anonymous"`
250
+ : ""}></script>`)
251
+ .join("") +
252
+ headers
253
+ .filter((h) => h.scriptBody)
254
+ .map((h) => `<script>${h.scriptBody}</script>`)
255
+ .join("");
256
+ /**
257
+ * @param {object[]} tabList
258
+ * @returns {ul}
259
+ */
260
+ const cardHeaderTabs = (tabList) => ul({ class: "nav nav-tabs card-header-tabs" }, tabList.map(({ href, label, active, }) => li({ class: "nav-item" }, a({ class: ["nav-link", active && "active"], href }, label))));
261
+ module.exports = {
262
+ navbar,
263
+ alert,
264
+ logit,
265
+ navbarSolidOnScroll,
266
+ breadcrumbs,
267
+ headersInHead,
268
+ headersInBody,
269
+ cardHeaderTabs,
270
+ mobileBottomNavBar,
271
+ };
272
+ //# sourceMappingURL=layout_utils.js.map